useThunderPhone vous donne un contrôle total sur l’interface utilisateur tandis que ThunderPhone gère la session vocale, le routage audio et l’état de connexion. Utilisez-le lorsque vous souhaitez une UI entièrement personnalisée — vos propres boutons, mises en page, animations et identité visuelle — tandis que ThunderPhone gère tout en coulisses.
Quand utiliser le hook headless
Le composant préconstruitThunderPhoneWidget couvre la plupart des cas d’utilisation, mais utilisez le hook headless lorsque vous avez besoin de :
- Une UI d’appel entièrement personnalisée qui correspond au système de design de votre application
- Visualisations réactives à l’audio (formes d’onde, orbes, indicateurs pulsés) pilotées par les niveaux audio en temps réel
- Flux d’appel personnalisés, tels que des formulaires avant appel, des enquêtes après appel ou un chat intégré à côté de la voix
- Intégration dans une bibliothèque de composants existante (Material UI, Chakra, Radix, etc.)
Installation
Le hook headless ne nécessite pas d’importer
@thunderphone/widget/style.css, car vous fournissez votre propre UI. Vous devez toutefois installer le même package @thunderphone/widget.Utilisation de base
Options
Transmettez ces options àuseThunderPhone via UseThunderPhoneOptions :
Le hook est headless : il n’accepte pas les props d’apparence de
ThunderPhoneWidget (theme, primaryColor, title, position, className). Les transmettre provoque une erreur TypeScript — vous êtes entièrement responsable de créer la présentation.Valeur de retour
Le hook renvoie un objetUseThunderPhoneReturn :
Interface réactive à l’audio
La refaudioLevelRef vous fournit des niveaux audio à la fréquence d’images sans déclencher de nouveaux rendus React, ce qui la rend idéale pour piloter des visualisations de forme d’onde fluides, des orbes pulsantes ou toute animation liée à la conversation. Le niveau reflète la source la plus forte : la voix de l’agent vocal ou le microphone du visiteur.
Exemple de forme d’onde
Exemple d’orbe pulsante
Exemple d’indicateur de parole
Pour une interface rendue par React qui évolue avec le volume — par exemple un badge « speaking » basé sur un seuil — échantillonnezaudioLevelRef.current à intervalles réguliers et stockez le résultat dans l’état :
Machine à états
La propriétéstate suit ce cycle de vie :
Exemples
Avec contrôle du micro
Avec sonnerie
Jouez une sonnerie pendant la connexion afin de simuler un appel téléphonique :connecting et s’estompe lorsque l’agent se connecte. Transmettez true pour utiliser la sonnerie par défaut intégrée, ou une chaîne d’URL pour utiliser votre propre fichier audio.
Avec callbacks d’événements
Interface utilisateur entièrement personnalisée
Conseils
Toujours rendre phone.audio
Toujours rendre phone.audio
L’élément
phone.audio est invisible, mais requis. Placez-le n’importe où dans votre JSX — il ne rend aucun DOM visible, mais gère la connexion audio WebRTC en interne.Désactiver le bouton pendant la connexion
Désactiver le bouton pendant la connexion
L’état
connecting peut durer de 1 à 3 secondes. Désactivez le bouton d’appel pendant cet état afin d’éviter les tentatives de connexion en double.Gérer l’état d’erreur correctement
Gérer l’état d’erreur correctement
Lorsque l’état est
error, affichez phone.error à l’utilisateur et maintenez votre bouton d’appel activé. Le hook ne quitte pas seul l’état error — appeler à nouveau connect() lance une nouvelle tentative et efface l’erreur précédente.Utiliser des callbacks pour les effets secondaires
Utiliser des callbacks pour les effets secondaires
Les callbacks
onConnect, onDisconnect et onError sont idéaux pour l’analytique, la journalisation ou le déclenchement d’une autre logique applicative sans interroger l’état.Lire les niveaux audio depuis audioLevelRef
Lire les niveaux audio depuis audioLevelRef
audioLevelRef est la seule source de niveau audio en direct. Lisez audioLevelRef.current dans requestAnimationFrame pour des animations fluides telles que des formes d’onde (la lecture d’une ref ne provoque pas de nouveaux rendus), ou échantillonnez-le à intervalles réguliers et stockez le résultat dans l’état pour une interface rendue par React. Le nombre audioLevel est obsolète et vaut toujours 0 — ne construisez pas de logique dessus.