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 componentThunderPhoneWidget 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
Opties
Geef deze opties viaUseThunderPhoneOptions 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 eenUseThunderPhoneReturn-object:
Audio-reactieve UI
De refaudioLevelRef 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 jeaudioLevelRef.current periodiek uit en sla je het resultaat op in de state:
Toestandsmachine
De eigenschapstate volgt deze levenscyclus:
Voorbeelden
Met dempbediening
Met beltoon
Speel een belgeluid af tijdens het verbinden om een telefoongesprek na te bootsen: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
phone.audio altijd renderen
phone.audio altijd renderen
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 knop uitschakelen tijdens het verbinden
De knop uitschakelen tijdens het verbinden
De status
connecting kan 1-3 seconden duren. Schakel de oproepknop tijdens deze status uit om dubbele verbindingspogingen te voorkomen.De foutstatus zorgvuldig afhandelen
De foutstatus zorgvuldig afhandelen
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.Callbacks gebruiken voor neveneffecten
Callbacks gebruiken voor neveneffecten
De callbacks
onConnect, onDisconnect en onError zijn ideaal voor analytics, logging of het activeren van andere applicatielogica zonder de status te pollen.Audioniveaus lezen uit audioLevelRef
Audioniveaus lezen uit audioLevelRef
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.