Skip to main content
Le hook 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éconstruit ThunderPhoneWidget 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

Vous devez afficher phone.audio quelque part dans l’arborescence de vos composants. Il s’agit d’un élément React invisible qui gère la connexion audio sous-jacente. Si vous l’omettez, aucun son ne sera lu et la session ne fonctionnera pas.

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 objet UseThunderPhoneReturn :

Interface réactive à l’audio

La ref audioLevelRef 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 — échantillonnez audioLevelRef.current à intervalles réguliers et stockez le résultat dans l’état :
Lisez toujours les niveaux depuis audioLevelRef.current. Le nombre audioLevel de l’objet retourné est obsolète et vaut toujours 0 : toute logique fondée sur celui-ci lira silencieusement zéro.

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 :
La sonnerie se répète pendant l’état 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

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.
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.
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.
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.
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.