useThunderPhone cho phép bạn kiểm soát hoàn toàn giao diện người dùng, trong khi ThunderPhone quản lý phiên thoại, định tuyến âm thanh và trạng thái kết nối. Sử dụng hook này khi bạn muốn có UI tùy chỉnh hoàn toàn — với các nút, bố cục, hiệu ứng động và thương hiệu riêng — trong khi ThunderPhone xử lý mọi thứ phía sau.
Khi nào nên sử dụng Hook không giao diện
ComponentThunderPhoneWidget dựng sẵn đáp ứng hầu hết trường hợp sử dụng, nhưng hãy dùng hook không giao diện khi bạn cần:
- UI cuộc gọi tùy chỉnh hoàn toàn, phù hợp với hệ thống thiết kế của ứng dụng
- Hình ảnh trực quan phản ứng theo âm thanh (dạng sóng, quả cầu, chỉ báo nhấp nháy) được điều khiển bởi mức âm thanh theo thời gian thực
- Luồng cuộc gọi tùy chỉnh như biểu mẫu trước cuộc gọi, khảo sát sau cuộc gọi hoặc chat nội tuyến cùng với thoại
- Tích hợp vào thư viện component hiện có (Material UI, Chakra, Radix, v.v.)
Cài đặt
Hook không giao diện không yêu cầu import
@thunderphone/widget/style.css vì bạn tự cung cấp UI. Tuy nhiên, bạn vẫn phải cài đặt cùng package @thunderphone/widget.Cách sử dụng cơ bản
Tùy chọn
Truyền các tùy chọn này vàouseThunderPhone thông qua UseThunderPhoneOptions:
Hook này không giao diện: nó không chấp nhận các prop về giao diện của
ThunderPhoneWidget (theme, primaryColor, title, position, className). Truyền các prop này sẽ gây lỗi TypeScript — phần trình bày hoàn toàn do bạn xây dựng.Giá trị trả về
Hook trả về một đối tượngUseThunderPhoneReturn:
Giao diện phản hồi theo âm thanh
RefaudioLevelRef cung cấp mức âm thanh theo tốc độ khung hình mà không kích hoạt React render lại, nên rất phù hợp để điều khiển trực quan hóa dạng sóng mượt mà, các quả cầu nhấp nhô hoặc bất kỳ hoạt ảnh nào gắn với cuộc trò chuyện. Mức này phản ánh âm thanh nào lớn hơn: giọng nói của tác nhân AI hoặc microphone của khách truy cập.
Ví dụ dạng sóng
Ví dụ quả cầu nhấp nhô
Ví dụ chỉ báo đang nói
Đối với giao diện được React render thay đổi theo âm lượng — chẳng hạn như nhãn “đang nói” dựa trên ngưỡng — hãy lấy mẫuaudioLevelRef.current theo một khoảng thời gian và lưu kết quả vào state:
Máy trạng thái
Thuộc tínhstate tuân theo vòng đời sau:
Ví dụ
Với điều khiển tắt tiếng
Với nhạc chuông
Phát âm thanh đổ chuông trong khi kết nối để mô phỏng cuộc gọi điện thoại:connecting và nhỏ dần khi tác nhân AI kết nối. Truyền true để dùng nhạc chuông mặc định tích hợp sẵn hoặc truyền chuỗi URL để dùng tệp âm thanh của riêng bạn.
Với callback sự kiện
Giao diện tùy chỉnh hoàn toàn
Mẹo
Luôn render phone.audio
Luôn render phone.audio
Phần tử
phone.audio không hiển thị nhưng bắt buộc. Đặt phần tử này ở bất kỳ đâu trong JSX của bạn — phần tử không render DOM hiển thị nhưng quản lý kết nối âm thanh WebRTC nội bộ.Vô hiệu hóa nút khi đang kết nối
Vô hiệu hóa nút khi đang kết nối
Trạng thái
connecting có thể kéo dài 1-3 giây. Vô hiệu hóa nút gọi trong trạng thái này để ngăn các lần thử kết nối trùng lặp.Xử lý trạng thái lỗi một cách hợp lý
Xử lý trạng thái lỗi một cách hợp lý
Khi trạng thái là
error, hãy hiển thị phone.error cho người dùng và giữ nút gọi của bạn ở trạng thái bật. Hook không tự thoát khỏi trạng thái error — việc gọi lại connect() sẽ bắt đầu một lần thử mới và xóa lỗi trước đó.Dùng callback cho các tác dụng phụ
Dùng callback cho các tác dụng phụ
Các callback
onConnect, onDisconnect và onError phù hợp cho phân tích, ghi log hoặc kích hoạt logic ứng dụng khác mà không cần thăm dò trạng thái.Đọc mức âm thanh từ audioLevelRef
Đọc mức âm thanh từ audioLevelRef
audioLevelRef là nguồn mức âm thanh trực tiếp duy nhất. Đọc audioLevelRef.current bên trong requestAnimationFrame để tạo hiệu ứng mượt mà như dạng sóng (đọc ref không gây render lại), hoặc lấy mẫu theo khoảng thời gian và lưu kết quả vào state cho UI do React render. Số audioLevel đã bị ngừng sử dụng và luôn là 0 — không xây dựng logic dựa trên nó.