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 predefinidoThunderPhoneWidget 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
Opciones
Pasa estas opciones auseThunderPhone 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 objetoUseThunderPhoneReturn:
IU reactiva al audio
La referenciaaudioLevelRef 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—, consultaaudioLevelRef.current en un intervalo y guarda el resultado en el estado:
Máquina de estados
La propiedadstate 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: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
Renderiza siempre phone.audio
Renderiza siempre phone.audio
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.Desactiva el botón mientras se conecta
Desactiva el botón mientras se conecta
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.Maneja el estado de error correctamente
Maneja el estado de error correctamente
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.Usa callbacks para efectos secundarios
Usa callbacks para efectos secundarios
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.Lee los niveles de audio desde audioLevelRef
Lee los niveles de audio desde audioLevelRef
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.