Skip to main content
Hook-ul useThunderPhone vă oferă control complet asupra interfeței cu utilizatorul, în timp ce ThunderPhone gestionează sesiunea vocală, rutarea audio și starea conexiunii. Utilizați-l când doriți o interfață complet personalizată — propriile butoane, aspecte, animații și elemente de branding — în timp ce ThunderPhone gestionează totul în fundal.

Când să utilizați hook-ul Headless

Componenta predefinită ThunderPhoneWidget acoperă majoritatea cazurilor de utilizare, însă utilizați hook-ul headless când aveți nevoie de:
  • O interfață de apel complet personalizată, care se potrivește cu sistemul de design al aplicației dumneavoastră
  • Vizualizări reactive la audio (forme de undă, sfere, indicatori pulsați) bazate pe nivelurile audio în timp real
  • Fluxuri de apel personalizate, precum formulare înainte de apel, sondaje după apel sau chat integrat alături de voce
  • Integrare într-o bibliotecă de componente existentă (Material UI, Chakra, Radix etc.)

Instalare

Hook-ul headless nu necesită importarea @thunderphone/widget/style.css, deoarece furnizați propria interfață. Totuși, trebuie să instalați în continuare același pachet @thunderphone/widget.

Utilizare de bază

Trebuie să redați phone.audio undeva în arborele componentelor dumneavoastră. Este un element React invizibil care gestionează conexiunea audio subiacentă. Dacă îl omiteți, nu se va reda niciun sunet, iar sesiunea nu va funcționa.

Opțiuni

Transmiteți aceste opțiuni către useThunderPhone prin UseThunderPhoneOptions:
Hook-ul este headless: nu acceptă proprietățile de aspect ale ThunderPhoneWidget (theme, primaryColor, title, position, className). Transmiterea acestora produce o eroare TypeScript — prezentarea vă revine în întregime.

Valoare returnată

Hook-ul returnează un obiect UseThunderPhoneReturn:

Interfață reactivă la audio

Referința audioLevelRef vă oferă niveluri audio la rata cadrelor fără a declanșa re-randări React, ceea ce o face ideală pentru vizualizări fluide ale formei de undă, sfere pulsante sau orice animație legată de conversație. Nivelul reflectă sursa mai puternică: vocea agentului sau microfonul vizitatorului.

Exemplu de formă de undă

Exemplu de sferă pulsantă

Exemplu de indicator pentru vorbire

Pentru o interfață redată de React care se modifică în funcție de volum — precum o insignă „vorbește” bazată pe prag — eșantionați audioLevelRef.current la un interval și stocați rezultatul în stare:
Citiți întotdeauna nivelurile din audioLevelRef.current. Numărul audioLevel din obiectul returnat este învechit și este întotdeauna 0 — orice logică bazată pe acesta va citi în mod silențios zero.

Mașina de stări

Proprietatea state urmează acest ciclu de viață:

Exemple

Cu controlul dezactivării sunetului

Cu ton de apel

Redați un sunet de apel în timpul conectării pentru a simula un apel telefonic:
Tonul de apel se redă în buclă în starea connecting și se estompează când agentul se conectează. Transmiteți true pentru tonul de apel implicit integrat sau un șir URL pentru a utiliza propriul fișier audio.

Cu callback-uri de evenimente

Interfață UI complet personalizată


Sfaturi

Elementul phone.audio este invizibil, dar obligatoriu. Plasați-l oriunde în JSX — nu redă niciun DOM vizibil, dar gestionează intern conexiunea audio WebRTC.
Starea connecting poate dura 1-3 secunde. Dezactivați butonul de apel în această stare pentru a preveni încercările de conectare duplicate.
Când starea este error, afișați utilizatorului phone.error și păstrați activat butonul de apel. Hook-ul nu părăsește singur starea error — apelarea din nou a connect() începe o încercare nouă și șterge eroarea anterioară.
Callback-urile onConnect, onDisconnect și onError sunt ideale pentru analiză, jurnalizare sau declanșarea altor logici ale aplicației fără interogarea repetată a stării.
audioLevelRef este singura sursă live pentru nivelul audio. Citiți audioLevelRef.current în interiorul requestAnimationFrame pentru animații fluide, cum ar fi formele de undă (citirea unui ref nu provoacă rerandări), sau eșantionați-l la un interval și stocați rezultatul în stare pentru interfața redată de React. Numărul audioLevel este depreciat și este întotdeauna 0 — nu construiți logică bazată pe acesta.