Skip to main content
El hook useThunderPhone te brinda control total sobre la interfaz de usuario mientras ThunderPhone administra la sesión de voz, el enrutamiento de audio y el estado de conexión. Úsalo cuando quieras una interfaz totalmente personalizada — tus propios botones, diseños, animaciones e identidad de marca — mientras ThunderPhone se encarga de todo internamente.

Cuándo usar el hook sin interfaz

El componente predefinido ThunderPhoneWidget cubre la mayoría de los casos de uso, pero usa el hook sin interfaz cuando necesites:
  • Una interfaz de llamadas completamente personalizada que coincida con el sistema de diseño de tu app
  • Visualizaciones que reaccionen al audio (formas de onda, esferas, indicadores pulsantes) impulsadas por niveles de audio en tiempo real
  • Flujos de llamadas personalizados, como formularios previos a la llamada, encuestas posteriores a la llamada o chat integrado junto con la voz
  • Integración en una biblioteca de componentes existente (Material UI, Chakra, Radix, etc.)

Instalación

El hook sin interfaz no requiere importar @thunderphone/widget/style.css, ya que proporcionarás tu propia interfaz. Sin embargo, debes instalar el mismo paquete @thunderphone/widget.

Uso básico

Debes renderizar phone.audio en algún lugar de tu árbol de componentes. Es un elemento invisible de React que administra la conexión de audio subyacente. Si lo omites, no se reproducirá audio y la sesión no funcionará.

Opciones

Pasa estas opciones a useThunderPhone mediante UseThunderPhoneOptions:
El hook no tiene interfaz: no acepta las props de apariencia de ThunderPhoneWidget (theme, primaryColor, title, position, className). Pasarlas genera un error de TypeScript — la presentación depende completamente de ti.

Valor de retorno

El hook devuelve un objeto UseThunderPhoneReturn:

IU reactiva al audio

La referencia audioLevelRef te proporciona niveles de audio a velocidad de fotogramas sin activar nuevas renderizaciones de React, por lo que es ideal para controlar visualizaciones fluidas de formas de onda, orbes pulsantes o cualquier animación vinculada a la conversación. El nivel refleja cuál es más fuerte: la voz del agente o el micrófono del visitante.

Ejemplo de forma de onda

Ejemplo de orbe pulsante

Ejemplo de indicador de habla

Para una IU renderizada por React que cambie con el volumen —como una insignia de “hablando” basada en un umbral—, consulta audioLevelRef.current en un intervalo y guarda el resultado en el estado:
Lee siempre los niveles desde audioLevelRef.current. El número audioLevel del objeto de retorno está obsoleto y siempre es 0; cualquier lógica basada en él leerá cero de forma silenciosa.

Máquina de estados

La propiedad state sigue este ciclo de vida:

Ejemplos

Con control de silencio

Con tono de llamada

Reproduce un tono mientras se conecta para simular una llamada telefónica:
El tono de llamada se repite durante el estado connecting y se desvanece cuando el agente se conecta. Pasa true para usar el tono de llamada predeterminado integrado o una cadena de URL para usar tu propio archivo de audio.

Con callbacks de eventos

Interfaz de usuario totalmente personalizada


Consejos

El elemento phone.audio es invisible, pero obligatorio. Colócalo en cualquier lugar de tu JSX — no renderiza ningún DOM visible, pero administra internamente la conexión de audio WebRTC.
El estado connecting puede durar entre 1 y 3 segundos. Desactiva el botón de llamada durante este estado para evitar intentos de conexión duplicados.
Cuando el estado sea error, muestra phone.error a la persona usuaria y mantén habilitado el botón de llamada. El hook no sale del estado error por sí solo — volver a llamar a connect() inicia un intento nuevo y borra el error anterior.
Los callbacks onConnect, onDisconnect y onError son ideales para analítica, registros o para activar otra lógica de la aplicación sin consultar el estado constantemente.
audioLevelRef es la única fuente activa de niveles de audio. Lee audioLevelRef.current dentro de requestAnimationFrame para obtener animaciones fluidas, como formas de onda (leer una referencia no provoca nuevos renderizados), o toma muestras a intervalos y guarda el resultado en el estado para una interfaz renderizada por React. El número audioLevel está obsoleto y siempre es 0 — no construyas lógica basándote en él.