useThunderPhone предоставляет полный контроль над пользовательским интерфейсом, пока ThunderPhone управляет голосовым сеансом, маршрутизацией аудио и состоянием подключения. Используйте его, если нужен полностью кастомный UI — собственные кнопки, макеты, анимации и брендинг, — пока ThunderPhone берёт на себя всю внутреннюю работу.
Когда использовать Headless-хук
Готовый компонентThunderPhoneWidget покрывает большинство сценариев, но используйте headless-хук, если вам нужны:
- Полностью кастомный интерфейс звонка, соответствующий дизайн-системе вашего приложения
- Визуализации, реагирующие на аудио в реальном времени (волновые формы, сферы, пульсирующие индикаторы)
- Кастомные сценарии звонка, например формы перед звонком, опросы после звонка или встроенный чат рядом с голосовым взаимодействием
- Интеграция с существующей библиотекой компонентов (Material UI, Chakra, Radix и т. д.)
Установка
Headless-хук не требует импортировать
@thunderphone/widget/style.css, поскольку вы создаёте собственный UI. Однако всё равно необходимо установить тот же пакет @thunderphone/widget.Базовое использование
Параметры
Передавайте эти параметры вuseThunderPhone через UseThunderPhoneOptions:
Хук не имеет интерфейса: он не принимает свойства оформления
ThunderPhoneWidget (theme, primaryColor, title, position, className). Их передача вызывает ошибку TypeScript — всё представление вы реализуете самостоятельно.Возвращаемое значение
Хук возвращает объектUseThunderPhoneReturn:
Интерфейс, реагирующий на аудио
СсылкаaudioLevelRef предоставляет уровни аудио с частотой кадров без запуска повторного рендеринга React, поэтому она идеально подходит для плавной визуализации волновой формы, пульсирующих сфер или любой анимации, связанной с разговором. Уровень отражает более громкий источник: голос агента или микрофон посетителя.
Пример волновой формы
Пример пульсирующей сферы
Пример индикатора речи
Для интерфейса, рендерируемого React и меняющегося в зависимости от громкости — например, бейджа «говорит» на основе порогового значения — считывайтеaudioLevelRef.current через интервалы и сохраняйте результат в состоянии:
Конечный автомат
Свойствоstate проходит следующий жизненный цикл:
Примеры
С элементом управления отключением микрофона
С рингтоном
Воспроизводите звук звонка во время подключения, чтобы имитировать телефонный вызов:connecting и постепенно затихает, когда агент подключается. Передайте true, чтобы использовать встроенный рингтон по умолчанию, или строку URL, чтобы использовать собственный аудиофайл.
С обратными вызовами событий
Полностью пользовательский интерфейс
Советы
Всегда рендерьте phone.audio
Всегда рендерьте phone.audio
Элемент
phone.audio невидим, но обязателен. Разместите его в любом месте JSX — он не рендерит видимый DOM, но внутренне управляет аудиосоединением WebRTC.Отключайте кнопку во время подключения
Отключайте кнопку во время подключения
Состояние
connecting может длиться 1–3 секунды. Отключайте кнопку звонка в этом состоянии, чтобы предотвратить повторные попытки подключения.Корректно обрабатывайте состояние ошибки
Корректно обрабатывайте состояние ошибки
Когда состояние равно
error, покажите пользователю phone.error и оставьте кнопку звонка включённой. Хук не выходит из состояния error самостоятельно — повторный вызов connect() запускает новую попытку и очищает предыдущую ошибку.Используйте колбэки для побочных эффектов
Используйте колбэки для побочных эффектов
Колбэки
onConnect, onDisconnect и onError идеально подходят для аналитики, логирования или запуска другой логики приложения без опроса состояния.Считывайте уровни аудио из audioLevelRef
Считывайте уровни аудио из audioLevelRef
audioLevelRef — единственный источник уровня аудио в реальном времени. Считывайте audioLevelRef.current внутри requestAnimationFrame для плавных анимаций, таких как волновые формы (чтение ref не вызывает повторный рендеринг), или считывайте его с интервалом и сохраняйте результат в состоянии для интерфейса, рендеримого React. Число audioLevel устарело и всегда равно 0 — не стройте на нём логику.