useThunderPhone надає повний контроль над інтерфейсом користувача, тоді як ThunderPhone керує голосовим сеансом, маршрутизацією аудіо та станом підключення. Використовуйте його, коли вам потрібен повністю кастомний UI — власні кнопки, макети, анімації та брендинг — а ThunderPhone бере на себе всю внутрішню роботу.
Коли використовувати Headless-хук
Готовий компонентThunderPhoneWidget покриває більшість випадків використання, але використовуйте Headless-хук, коли вам потрібно:
- Повністю кастомний UI дзвінка, що відповідає дизайн-системі вашого застосунку
- Візуалізації, що реагують на аудіо (форми хвиль, сфери, пульсуючі індикатори) на основі аудіорівнів у реальному часі
- Кастомні сценарії дзвінків, як-от форми перед дзвінком, опитування після дзвінка або вбудований чат поруч із голосовим спілкуванням
- Інтеграція з наявною бібліотекою компонентів (Material UI, Chakra, Radix тощо)
Встановлення
Headless-хук не потребує імпорту
@thunderphone/widget/style.css, оскільки ви створюєте власний UI. Втім, вам усе одно потрібно встановити той самий пакет @thunderphone/widget.Базове використання
Параметри
Передайте ці параметри доuseThunderPhone через UseThunderPhoneOptions:
Хук не має інтерфейсу: він не приймає параметри зовнішнього вигляду
ThunderPhoneWidget (theme, primaryColor, title, position, className). Їх передавання спричиняє помилку TypeScript — ви повністю самостійно створюєте представлення.Значення, що повертається
Хук повертає об’єктUseThunderPhoneReturn:
Аудіореактивний UI
РефaudioLevelRef надає рівні звуку з частотою кадрів без запуску повторних рендерів React, тому він ідеально підходить для плавних візуалізацій хвильових форм, пульсуючих сфер або будь-якої анімації, пов’язаної з розмовою. Рівень відображає гучніший звук: голос агента або мікрофон відвідувача.
Приклад хвильової форми
Приклад пульсуючої сфери
Приклад індикатора мовлення
Для UI, що рендериться React і змінюється залежно від гучності — наприклад, бейджа «мовлення» на основі порогового значення — зчитуйтеaudioLevelRef.current через інтервали та зберігайте результат у стані:
Машина станів
Властивістьstate має такий життєвий цикл:
Приклади
З керуванням вимкненням звуку
З рингтоном
Відтворюйте звук дзвінка під час підключення, щоб імітувати телефонний виклик:connecting і поступово затихає, коли підключається агент. Передайте true, щоб використовувати вбудований рингтон за замовчуванням, або рядок URL, щоб використати власний аудіофайл.
Зі зворотними викликами подій
Повністю власний UI
Поради
Завжди рендерте 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 не спричиняє повторного рендерингу), або вимірюйте його через інтервали та зберігайте результат у стані для UI, який рендерить React. Число audioLevel застаріло й завжди дорівнює 0 — не будуйте на ньому логіку.