useThunderPhone memberi Anda kendali penuh atas antarmuka pengguna, sementara ThunderPhone mengelola sesi suara, perutean audio, dan status koneksi. Gunakan saat Anda menginginkan UI yang sepenuhnya kustom — tombol, tata letak, animasi, dan branding Anda sendiri — sementara ThunderPhone menangani semuanya di balik layar.
Kapan Menggunakan Hook Headless
KomponenThunderPhoneWidget bawaan mencakup sebagian besar kasus penggunaan, tetapi gunakan hook headless saat Anda memerlukan:
- UI panggilan yang sepenuhnya kustom dan sesuai dengan sistem desain aplikasi Anda
- Visualisasi yang responsif terhadap audio (bentuk gelombang, orb, indikator berdenyut) yang didorong oleh level audio real-time
- Alur panggilan kustom seperti formulir sebelum panggilan, survei setelah panggilan, atau chat inline bersama suara
- Integrasi ke dalam library komponen yang sudah ada (Material UI, Chakra, Radix, dll.)
Instalasi
Hook headless tidak memerlukan impor
@thunderphone/widget/style.css karena Anda menyediakan UI sendiri. Namun, Anda tetap harus menginstal paket @thunderphone/widget yang sama.Penggunaan Dasar
Opsi
Teruskan opsi ini keuseThunderPhone melalui UseThunderPhoneOptions:
Hook ini bersifat headless: hook ini tidak menerima prop tampilan
ThunderPhoneWidget (theme, primaryColor, title, position, className). Meneruskannya akan menghasilkan error TypeScript — tampilan sepenuhnya Anda yang membangunnya.Nilai Kembalian
Hook mengembalikan objekUseThunderPhoneReturn:
UI Reaktif Audio
RefaudioLevelRef memberi Anda level audio pada laju frame tanpa memicu render ulang React, sehingga ideal untuk menggerakkan visualisasi bentuk gelombang yang mulus, orb berdenyut, atau animasi apa pun yang terkait dengan percakapan. Level mencerminkan sumber yang lebih keras: suara agen atau mikrofon pengunjung.
Contoh Bentuk Gelombang
Contoh Orb Berdenyut
Contoh Indikator Berbicara
Untuk UI yang dirender React dan berubah sesuai volume — seperti lencana “berbicara” berbasis ambang batas — ambil sampelaudioLevelRef.current pada interval tertentu dan simpan hasilnya dalam state:
Mesin Status
Propertistate mengikuti siklus hidup ini:
Contoh
Dengan Kontrol Bisukan
Dengan Nada Dering
Putar suara dering saat menghubungkan untuk menyimulasikan panggilan telepon:connecting dan memudar saat agen terhubung. Berikan true untuk nada dering bawaan, atau string URL untuk menggunakan file audio Anda sendiri.
Dengan Callback Peristiwa
UI Kustom Penuh
Tips
Selalu render phone.audio
Selalu render phone.audio
Elemen
phone.audio tidak terlihat tetapi diperlukan. Tempatkan di mana saja dalam JSX Anda — elemen ini tidak merender DOM yang terlihat, tetapi mengelola koneksi audio WebRTC secara internal.Nonaktifkan tombol saat menghubungkan
Nonaktifkan tombol saat menghubungkan
Status
connecting dapat berlangsung selama 1-3 detik. Nonaktifkan tombol panggilan selama status ini untuk mencegah upaya koneksi duplikat.Tangani status error dengan baik
Tangani status error dengan baik
Saat statusnya
error, tampilkan phone.error kepada pengguna dan biarkan tombol panggilan Anda tetap aktif. Hook tidak keluar dari status error dengan sendirinya — memanggil connect() lagi memulai upaya baru dan menghapus error sebelumnya.Gunakan callback untuk efek samping
Gunakan callback untuk efek samping
Callback
onConnect, onDisconnect, dan onError ideal untuk analitik, logging, atau memicu logika aplikasi lain tanpa melakukan polling pada status.Baca level audio dari audioLevelRef
Baca level audio dari audioLevelRef
audioLevelRef adalah satu-satunya sumber level audio langsung. Baca audioLevelRef.current di dalam requestAnimationFrame untuk animasi mulus seperti bentuk gelombang (membaca ref tidak menyebabkan render ulang), atau ambil sampelnya pada interval tertentu dan simpan hasilnya dalam status untuk UI yang dirender React. Angka audioLevel sudah tidak digunakan lagi dan selalu 0 — jangan membangun logika berdasarkan angka tersebut.