Skip to main content
L’hook useThunderPhone ti offre il controllo completo sull’interfaccia utente mentre ThunderPhone gestisce la sessione vocale, il routing audio e lo stato della connessione. Usalo quando vuoi una UI completamente personalizzata — con pulsanti, layout, animazioni e branding propri — mentre ThunderPhone gestisce tutto dietro le quinte.

Quando usare l’hook Headless

Il componente predefinito ThunderPhoneWidget copre la maggior parte dei casi d’uso, ma usa l’hook headless quando ti serve:
  • Un’interfaccia di chiamata completamente personalizzata che corrisponda al design system della tua app
  • Visualizzazioni reattive all’audio (forme d’onda, sfere, indicatori pulsanti) basate sui livelli audio in tempo reale
  • Flussi di chiamata personalizzati, come moduli prima della chiamata, sondaggi dopo la chiamata o chat inline accanto alla voce
  • Integrazione in una libreria di componenti esistente (Material UI, Chakra, Radix, ecc.)

Installazione

L’hook headless non richiede l’importazione di @thunderphone/widget/style.css, poiché fornisci la tua UI. Devi comunque installare lo stesso pacchetto @thunderphone/widget.

Utilizzo di base

Devi eseguire il rendering di phone.audio in un punto qualsiasi dell’albero dei componenti. È un elemento React invisibile che gestisce la connessione audio sottostante. Se lo ometti, l’audio non verrà riprodotto e la sessione non funzionerà.

Opzioni

Passa queste opzioni a useThunderPhone tramite UseThunderPhoneOptions:
L’hook è headless: non accetta le proprietà di aspetto di ThunderPhoneWidget (theme, primaryColor, title, position, className). Passarle genera un errore TypeScript — la presentazione è interamente tua da creare.

Valore restituito

L’hook restituisce un oggetto UseThunderPhoneReturn:

Interfaccia utente reattiva all’audio

La ref audioLevelRef fornisce livelli audio al frame rate senza attivare nuovi rendering di React, risultando ideale per visualizzazioni di forme d’onda fluide, sfere pulsanti o qualsiasi animazione collegata alla conversazione. Il livello riflette la sorgente più alta tra la voce dell’agente e il microfono del visitatore.

Esempio di forma d’onda

Esempio di sfera pulsante

Esempio di indicatore di conversazione

Per un’interfaccia utente renderizzata da React che cambia in base al volume — ad esempio un badge “sta parlando” basato su una soglia — campiona audioLevelRef.current a intervalli e salva il risultato nello stato:
Leggi sempre i livelli da audioLevelRef.current. Il numero audioLevel nell’oggetto restituito è deprecato e sempre 0 — qualsiasi logica basata su di esso leggerà silenziosamente zero.

Macchina a stati

La proprietà state segue questo ciclo di vita:

Esempi

Con controllo del microfono

Con suoneria

Riproduci un suono di squillo durante la connessione per simulare una chiamata telefonica:
La suoneria viene riprodotta in loop durante lo stato connecting e sfuma quando l’agente si connette. Passa true per usare la suoneria predefinita integrata oppure una stringa URL per usare il tuo file audio.

Con callback degli eventi

Interfaccia utente completamente personalizzata


Suggerimenti

L’elemento phone.audio è invisibile ma obbligatorio. Inseriscilo ovunque nel tuo JSX — non esegue il rendering di alcun DOM visibile, ma gestisce internamente la connessione audio WebRTC.
Lo stato connecting può durare 1-3 secondi. Disabilita il pulsante di chiamata durante questo stato per evitare tentativi di connessione duplicati.
Quando lo stato è error, mostra phone.error all’utente e mantieni abilitato il pulsante di chiamata. L’hook non esce autonomamente dallo stato error — chiamare di nuovo connect() avvia un nuovo tentativo e cancella l’errore precedente.
I callback onConnect, onDisconnect e onError sono ideali per analisi, registrazione dei log o per attivare altra logica dell’applicazione senza eseguire il polling dello stato.
audioLevelRef è l’unica fonte live dei livelli audio. Leggi audioLevelRef.current all’interno di requestAnimationFrame per animazioni fluide come le forme d’onda (la lettura di una ref non causa nuovi rendering), oppure campionalo a intervalli e memorizza il risultato nello stato per un’interfaccia utente renderizzata da React. Il numero audioLevel è deprecato ed è sempre 0 — non basare alcuna logica su di esso.