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 komponentThunderPhoneWidget 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
Opcje
Przekaż te opcje douseThunderPhone 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 obiektUseThunderPhoneReturn:
Interfejs reagujący na dźwięk
ReferencjaaudioLevelRef 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 — odczytujaudioLevelRef.current w interwałach i zapisuj wynik w stanie:
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: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
Zawsze renderuj phone.audio
Zawsze renderuj phone.audio
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.Wyłącz przycisk podczas łączenia
Wyłącz przycisk podczas łączenia
Stan
connecting może trwać 1–3 sekundy. Wyłącz przycisk połączenia w tym stanie, aby zapobiec zduplikowanym próbom połączenia.Prawidłowo obsłuż stan błędu
Prawidłowo obsłuż stan błędu
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.Używaj callbacków do efektów ubocznych
Używaj callbacków do efektów ubocznych
Callbacki
onConnect, onDisconnect i onError są idealne do analityki, rejestrowania zdarzeń lub uruchamiania innej logiki aplikacji bez odpytywania stanu.Odczytuj poziomy dźwięku z audioLevelRef
Odczytuj poziomy dźwięku z audioLevelRef
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.