Skip to main content
Met de hook useThunderPhone heb je volledige controle over de gebruikersinterface, terwijl ThunderPhone de spraaksessie, audioroutering en verbindingsstatus beheert. Gebruik deze wanneer je een volledig aangepaste UI wilt — je eigen knoppen, lay-outs, animaties en branding — terwijl ThunderPhone alles achter de schermen afhandelt.

Wanneer gebruik je de headless-hook

De vooraf gebouwde component ThunderPhoneWidget dekt de meeste gebruiksscenario’s, maar gebruik de headless-hook wanneer je het volgende nodig hebt:
  • Een volledig aangepaste oproep-UI die aansluit bij het ontwerpsysteem van je app
  • Audio-reactieve visualisaties (golfvormen, bollen, pulserende indicatoren) aangestuurd door realtime audioniveaus
  • Aangepaste oproepflows, zoals formulieren vóór een oproep, enquêtes na een oproep of inline chat naast spraak
  • Integratie in een bestaande componentbibliotheek (Material UI, Chakra, Radix, enz.)

Installatie

De headless-hook vereist niet dat je @thunderphone/widget/style.css importeert, omdat je je eigen UI levert. Je moet echter wel hetzelfde pakket @thunderphone/widget installeren.

Basisgebruik

Je moet phone.audio ergens in je componentstructuur renderen. Dit is een onzichtbaar React-element dat de onderliggende audioverbinding beheert. Als je dit weglaat, wordt er geen audio afgespeeld en werkt de sessie niet.

Opties

Geef deze opties via UseThunderPhoneOptions door aan useThunderPhone:
De hook is headless: deze accepteert niet de weergaveprops van ThunderPhoneWidget (theme, primaryColor, title, position, className). Het doorgeven ervan veroorzaakt een TypeScript-fout — je bouwt de presentatie volledig zelf.

Retourwaarde

De hook retourneert een UseThunderPhoneReturn-object:

Audio-reactieve UI

De ref audioLevelRef geeft je audiolevels met framerate zonder React-herweergaven te activeren, waardoor deze ideaal is voor vloeiende golfvormvisualisaties, pulserende bollen of elke animatie die aan het gesprek is gekoppeld. Het level weerspiegelt wat het hardst is: de stem van de agent of de microfoon van de bezoeker.

Voorbeeld van een golfvorm

Voorbeeld van een pulserende bol

Voorbeeld van een spreekindicator

Voor een door React gerenderde UI die met het volume verandert — zoals een op drempelwaarde gebaseerd label voor “spreken” — lees je audioLevelRef.current periodiek uit en sla je het resultaat op in de state:
Lees levels altijd uit via audioLevelRef.current. Het getal audioLevel in het retourobject is verouderd en altijd 0 — alle logica die hierop is gebaseerd, leest stilzwijgend nul uit.

Toestandsmachine

De eigenschap state volgt deze levenscyclus:

Voorbeelden

Met dempbediening

Met beltoon

Speel een belgeluid af tijdens het verbinden om een telefoongesprek na te bootsen:
De beltoon wordt herhaald tijdens de status connecting en vervaagt wanneer de agent verbinding maakt. Geef true door voor de ingebouwde standaardbeltoon, of een URL-tekenreeks om je eigen audiobestand te gebruiken.

Met event-callbacks

Volledig aangepaste UI


Tips

Het element phone.audio is onzichtbaar maar vereist. Plaats het ergens in je JSX — het rendert geen zichtbare DOM, maar beheert intern de WebRTC-audioverbinding.
De status connecting kan 1-3 seconden duren. Schakel de oproepknop tijdens deze status uit om dubbele verbindingspogingen te voorkomen.
Wanneer de status error is, toon je phone.error aan de gebruiker en houd je oproepknop ingeschakeld. De hook verlaat de status error niet vanzelf — door connect() opnieuw aan te roepen start je een nieuwe poging en wordt de vorige fout gewist.
De callbacks onConnect, onDisconnect en onError zijn ideaal voor analytics, logging of het activeren van andere applicatielogica zonder de status te pollen.
audioLevelRef is de enige livebron voor audioniveaus. Lees audioLevelRef.current binnen requestAnimationFrame voor vloeiende animaties zoals golfvormen (het lezen van een ref veroorzaakt geen re-renders), of bemonster het met een interval en sla het resultaat op in state voor door React gerenderde UI. Het getal audioLevel is verouderd en altijd 0 — bouw er geen logica op.