useThunderPhone oferece controle total sobre a interface do usuário enquanto o ThunderPhone gerencia a sessão de voz, o roteamento de áudio e o estado da conexão. Use-o quando quiser uma UI totalmente personalizada — com seus próprios botões, layouts, animações e identidade visual — enquanto o ThunderPhone cuida de tudo nos bastidores.
Quando usar o hook headless
O componente pré-criadoThunderPhoneWidget cobre a maioria dos casos de uso, mas use o hook headless quando precisar de:
- Uma UI de chamada totalmente personalizada que corresponda ao sistema de design do seu app
- Visualizações reativas ao áudio (formas de onda, orbes, indicadores pulsantes) orientadas por níveis de áudio em tempo real
- Fluxos de chamada personalizados, como formulários antes da chamada, pesquisas após a chamada ou chat integrado ao lado da voz
- Integração com uma biblioteca de componentes existente (Material UI, Chakra, Radix etc.)
Instalação
O hook headless não exige a importação de
@thunderphone/widget/style.css, pois você fornece sua própria UI. No entanto, você ainda deve instalar o mesmo pacote @thunderphone/widget.Uso básico
Opções
Passe estas opções parauseThunderPhone por meio de UseThunderPhoneOptions:
O hook é headless: ele não aceita as props de aparência do
ThunderPhoneWidget (theme, primaryColor, title, position, className). Passá-las causa um erro do TypeScript — a apresentação é inteiramente sua para criar.Valor de retorno
O hook retorna um objetoUseThunderPhoneReturn:
IU reativa a áudio
A refaudioLevelRef fornece níveis de áudio em taxa de quadros sem acionar novas renderizações do React, o que a torna ideal para controlar visualizações suaves de forma de onda, orbes pulsantes ou qualquer animação vinculada à conversa. O nível reflete o que estiver mais alto: a voz do agente ou o microfone do visitante.
Exemplo de forma de onda
Exemplo de orbe pulsante
Exemplo de indicador de fala
Para uma IU renderizada pelo React que muda conforme o volume — como um selo de “falando” baseado em limite — faça amostragens deaudioLevelRef.current em um intervalo e armazene o resultado no estado:
Máquina de Estados
A propriedadestate segue este ciclo de vida:
Exemplos
Com controle de silenciamento
Com toque
Reproduza um som de toque durante a conexão para simular uma chamada telefônica:connecting e diminui gradualmente quando o agente se conecta. Passe true para usar o toque padrão integrado ou uma string de URL para usar seu próprio arquivo de áudio.
Com callbacks de eventos
Interface personalizada completa
Dicas
Sempre renderize phone.audio
Sempre renderize phone.audio
O elemento
phone.audio é invisível, mas obrigatório. Coloque-o em qualquer lugar do seu JSX — ele não renderiza nenhum DOM visível, mas gerencia internamente a conexão de áudio WebRTC.Desabilite o botão durante a conexão
Desabilite o botão durante a conexão
O estado
connecting pode durar de 1 a 3 segundos. Desabilite o botão de chamada durante esse estado para evitar tentativas de conexão duplicadas.Trate o estado de erro adequadamente
Trate o estado de erro adequadamente
Quando o estado for
error, exiba phone.error para a pessoa usuária e mantenha o botão de chamada habilitado. O hook não sai do estado error por conta própria — chamar connect() novamente inicia uma nova tentativa e limpa o erro anterior.Use callbacks para efeitos colaterais
Use callbacks para efeitos colaterais
Os callbacks
onConnect, onDisconnect e onError são ideais para analytics, logs ou para acionar outra lógica da aplicação sem consultar o estado continuamente.Leia os níveis de áudio de audioLevelRef
Leia os níveis de áudio de audioLevelRef
audioLevelRef é a única fonte ativa de nível de áudio. Leia audioLevelRef.current dentro de requestAnimationFrame para animações suaves, como formas de onda (ler uma ref não causa novas renderizações), ou faça amostragens em intervalos e armazene o resultado no estado para uma UI renderizada pelo React. O número audioLevel está obsoleto e é sempre 0 — não crie lógica baseada nele.