Skip to main content
Hook useThunderPhone zapewnia pełną kontrolę nad interfejsem użytkownika, podczas gdy ThunderPhone zarządza sesją głosową, routingiem audio i stanem połączenia. Użyj go, gdy chcesz stworzyć w pełni niestandardowy interfejs — własne przyciski, układy, animacje i branding — a ThunderPhone zajmie się wszystkim w tle.

Kiedy używać hooka bez interfejsu

Gotowy komponent ThunderPhoneWidget obsługuje większość przypadków użycia, ale wybierz hook bez interfejsu, gdy potrzebujesz:
  • Całkowicie niestandardowego interfejsu połączeń zgodnego z systemem projektowym aplikacji
  • Wizualizacji reagujących na dźwięk (przebiegów fal, kul, pulsujących wskaźników) opartych na poziomach audio w czasie rzeczywistym
  • Niestandardowych przepływów połączeń, takich jak formularze przed połączeniem, ankiety po połączeniu lub czat wbudowany obok rozmowy głosowej
  • Integracji z istniejącą biblioteką komponentów (Material UI, Chakra, Radix itd.)

Instalacja

Hook bez interfejsu nie wymaga importowania @thunderphone/widget/style.css, ponieważ tworzysz własny interfejs. Musisz jednak nadal zainstalować ten sam pakiet @thunderphone/widget.

Podstawowe użycie

Musisz wyrenderować phone.audio w dowolnym miejscu drzewa komponentów. To niewidoczny element React, który zarządza bazowym połączeniem audio. Jeśli go pominiesz, dźwięk nie będzie odtwarzany, a sesja nie będzie działać.

Opcje

Przekaż te opcje do useThunderPhone za pomocą UseThunderPhoneOptions:
Hook jest bez interfejsu: nie akceptuje właściwości wyglądu ThunderPhoneWidget (theme, primaryColor, title, position, className). Przekazanie ich powoduje błąd TypeScript — prezentację tworzysz w całości samodzielnie.

Wartość zwracana

Hook zwraca obiekt UseThunderPhoneReturn:

Interfejs reagujący na dźwięk

Referencja audioLevelRef udostępnia poziomy dźwięku z częstotliwością odświeżania klatek bez wywoływania ponownych renderowań Reacta, dzięki czemu idealnie nadaje się do płynnych wizualizacji fali dźwiękowej, pulsujących kul lub dowolnych animacji powiązanych z rozmową. Poziom odzwierciedla głośniejsze źródło: głos agenta lub mikrofon rozmówcy.

Przykład fali dźwiękowej

Przykład pulsującej kuli

Przykład wskaźnika mówienia

W przypadku interfejsu renderowanego przez Reacta, który zmienia się wraz z głośnością — na przykład etykiety „mówienie” opartej na progu — odczytuj audioLevelRef.current w interwałach i zapisuj wynik w stanie:
Zawsze odczytuj poziomy z audioLevelRef.current. Liczba audioLevel w obiekcie zwracanym jest przestarzała i zawsze ma wartość 0 — każda logika oparta na niej będzie bezgłośnie odczytywać zero.

Maszyna stanów

Właściwość state ma następujący cykl życia:

Przykłady

Ze sterowaniem wyciszeniem

Z dzwonkiem

Odtwarzaj dźwięk dzwonienia podczas łączenia, aby symulować połączenie telefoniczne:
Dzwonek jest odtwarzany w pętli w stanie connecting i stopniowo cichnie, gdy agent się połączy. Przekaż true, aby użyć wbudowanego domyślnego dzwonka, lub ciąg URL, aby użyć własnego pliku audio.

Z wywołaniami zwrotnymi zdarzeń

W pełni niestandardowy interfejs


Wskazówki

Element phone.audio jest niewidoczny, ale wymagany. Umieść go w dowolnym miejscu w JSX — nie renderuje widocznego DOM, lecz wewnętrznie zarządza połączeniem audio WebRTC.
Stan connecting może trwać 1–3 sekundy. Wyłącz przycisk połączenia w tym stanie, aby zapobiec zduplikowanym próbom połączenia.
Gdy stan to error, wyświetl użytkownikowi phone.error i pozostaw włączony przycisk połączenia. Hook nie opuszcza samodzielnie stanu error — ponowne wywołanie connect() rozpoczyna nową próbę i usuwa poprzedni błąd.
Callbacki onConnect, onDisconnect i onError są idealne do analityki, rejestrowania zdarzeń lub uruchamiania innej logiki aplikacji bez odpytywania stanu.
audioLevelRef jest jedynym źródłem poziomu dźwięku na żywo. Odczytuj audioLevelRef.current wewnątrz requestAnimationFrame, aby uzyskać płynne animacje, takie jak przebiegi falowe (odczyt refa nie powoduje ponownego renderowania), lub próbkuj go w interwałach i zapisuj wynik w stanie dla interfejsu renderowanego przez React. Liczba audioLevel jest przestarzała i zawsze ma wartość 0 — nie opieraj na niej logiki.