Skip to main content
Hook 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

Komponen ThunderPhoneWidget 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

Anda harus merender phone.audio di suatu tempat dalam pohon komponen Anda. Ini adalah elemen React tak terlihat yang mengelola koneksi audio yang mendasarinya. Jika Anda mengabaikannya, tidak ada audio yang akan diputar dan sesi tidak akan berfungsi.

Opsi

Teruskan opsi ini ke useThunderPhone 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 objek UseThunderPhoneReturn:

UI Reaktif Audio

Ref audioLevelRef 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 sampel audioLevelRef.current pada interval tertentu dan simpan hasilnya dalam state:
Selalu baca level dari audioLevelRef.current. Angka audioLevel pada objek pengembalian sudah tidak digunakan lagi dan selalu bernilai 0 — logika apa pun yang dibangun di atasnya akan secara diam-diam membaca nol.

Mesin Status

Properti state mengikuti siklus hidup ini:

Contoh

Dengan Kontrol Bisukan

Dengan Nada Dering

Putar suara dering saat menghubungkan untuk menyimulasikan panggilan telepon:
Nada dering berulang selama status 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

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.
Status connecting dapat berlangsung selama 1-3 detik. Nonaktifkan tombol panggilan selama status ini untuk mencegah upaya koneksi duplikat.
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.
Callback onConnect, onDisconnect, dan onError ideal untuk analitik, logging, atau memicu logika aplikasi lain tanpa melakukan polling pada status.
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.