Skip to main content
Хук useThunderPhone надає повний контроль над інтерфейсом користувача, тоді як ThunderPhone керує голосовим сеансом, маршрутизацією аудіо та станом підключення. Використовуйте його, коли вам потрібен повністю кастомний UI — власні кнопки, макети, анімації та брендинг — а ThunderPhone бере на себе всю внутрішню роботу.

Коли використовувати Headless-хук

Готовий компонент ThunderPhoneWidget покриває більшість випадків використання, але використовуйте Headless-хук, коли вам потрібно:
  • Повністю кастомний UI дзвінка, що відповідає дизайн-системі вашого застосунку
  • Візуалізації, що реагують на аудіо (форми хвиль, сфери, пульсуючі індикатори) на основі аудіорівнів у реальному часі
  • Кастомні сценарії дзвінків, як-от форми перед дзвінком, опитування після дзвінка або вбудований чат поруч із голосовим спілкуванням
  • Інтеграція з наявною бібліотекою компонентів (Material UI, Chakra, Radix тощо)

Встановлення

Headless-хук не потребує імпорту @thunderphone/widget/style.css, оскільки ви створюєте власний UI. Втім, вам усе одно потрібно встановити той самий пакет @thunderphone/widget.

Базове використання

Ви повинні відрендерити phone.audio десь у дереві компонентів. Це невидимий елемент React, який керує базовим аудіопідключенням. Якщо його пропустити, аудіо не відтворюватиметься, а сеанс не працюватиме.

Параметри

Передайте ці параметри до useThunderPhone через UseThunderPhoneOptions:
Хук не має інтерфейсу: він не приймає параметри зовнішнього вигляду ThunderPhoneWidget (theme, primaryColor, title, position, className). Їх передавання спричиняє помилку TypeScript — ви повністю самостійно створюєте представлення.

Значення, що повертається

Хук повертає об’єкт UseThunderPhoneReturn:

Аудіореактивний UI

Реф audioLevelRef надає рівні звуку з частотою кадрів без запуску повторних рендерів React, тому він ідеально підходить для плавних візуалізацій хвильових форм, пульсуючих сфер або будь-якої анімації, пов’язаної з розмовою. Рівень відображає гучніший звук: голос агента або мікрофон відвідувача.

Приклад хвильової форми

Приклад пульсуючої сфери

Приклад індикатора мовлення

Для UI, що рендериться React і змінюється залежно від гучності — наприклад, бейджа «мовлення» на основі порогового значення — зчитуйте audioLevelRef.current через інтервали та зберігайте результат у стані:
Завжди зчитуйте рівні з audioLevelRef.current. Число audioLevel у об’єкті, що повертається, застаріле й завжди дорівнює 0 — будь-яка логіка на його основі непомітно зчитуватиме нуль.

Машина станів

Властивість state має такий життєвий цикл:

Приклади

З керуванням вимкненням звуку

З рингтоном

Відтворюйте звук дзвінка під час підключення, щоб імітувати телефонний виклик:
Рингтон відтворюється по колу в стані connecting і поступово затихає, коли підключається агент. Передайте true, щоб використовувати вбудований рингтон за замовчуванням, або рядок URL, щоб використати власний аудіофайл.

Зі зворотними викликами подій

Повністю власний UI


Поради

Елемент phone.audio невидимий, але обов’язковий. Розмістіть його будь-де у своєму JSX — він не рендерить видимий DOM, але внутрішньо керує аудіоз’єднанням WebRTC.
Стан connecting може тривати 1–3 секунди. Вимикайте кнопку виклику в цьому стані, щоб запобігти повторним спробам підключення.
Коли стан має значення error, покажіть користувачу phone.error і залиште кнопку виклику активною. Хук не виходить зі стану error самостійно — повторний виклик connect() запускає нову спробу та очищає попередню помилку.
Колбеки onConnect, onDisconnect і onError ідеально підходять для аналітики, логування або запуску іншої логіки застосунку без опитування стану.
audioLevelRef — єдине джерело рівня аудіо в реальному часі. Зчитуйте audioLevelRef.current у requestAnimationFrame для плавних анімацій, таких як звукові хвилі (зчитування ref не спричиняє повторного рендерингу), або вимірюйте його через інтервали та зберігайте результат у стані для UI, який рендерить React. Число audioLevel застаріло й завжди дорівнює 0 — не будуйте на ньому логіку.