Skip to main content
O hook 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é-criado ThunderPhoneWidget 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

Você deve renderizar phone.audio em algum lugar da árvore de componentes. Ele é um elemento React invisível que gerencia a conexão de áudio subjacente. Se você o omitir, nenhum áudio será reproduzido e a sessão não funcionará.

Opções

Passe estas opções para useThunderPhone 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 objeto UseThunderPhoneReturn:

IU reativa a áudio

A ref audioLevelRef 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 de audioLevelRef.current em um intervalo e armazene o resultado no estado:
Sempre leia os níveis de audioLevelRef.current. O número audioLevel no objeto de retorno está obsoleto e é sempre 0 — qualquer lógica baseada nele lerá zero silenciosamente.

Máquina de Estados

A propriedade state 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:
O toque é repetido durante o estado 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

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.
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.
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.
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.
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.