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 predefinitoThunderPhoneWidget 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
Opzioni
Passa queste opzioni auseThunderPhone 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 oggettoUseThunderPhoneReturn:
Interfaccia utente reattiva all’audio
La refaudioLevelRef 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 — campionaaudioLevelRef.current a intervalli e salva il risultato nello stato:
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: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
Esegui sempre il rendering di phone.audio
Esegui sempre il rendering di phone.audio
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.Disabilita il pulsante durante la connessione
Disabilita il pulsante durante la connessione
Lo stato
connecting può durare 1-3 secondi. Disabilita il pulsante di chiamata durante questo stato per evitare tentativi di connessione duplicati.Gestisci correttamente lo stato di errore
Gestisci correttamente lo stato di errore
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.Usa i callback per gli effetti collaterali
Usa i callback per gli effetti collaterali
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.Leggi i livelli audio da audioLevelRef
Leggi i livelli audio da audioLevelRef
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.