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

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

Bạn phải render phone.audio ở đâu đó trong cây component của mình. Đây là một phần tử React vô hình quản lý kết nối âm thanh nền tảng. Nếu bỏ qua, âm thanh sẽ không phát và phiên sẽ không hoạt động.

Tùy chọn

Truyền các tùy chọn này vào useThunderPhone 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ượng UseThunderPhoneReturn:

Giao diện phản hồi theo âm thanh

Ref audioLevelRef 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ẫu audioLevelRef.current theo một khoảng thời gian và lưu kết quả vào state:
Luôn đọc mức từ audioLevelRef.current. Số audioLevel trên đối tượng trả về đã không còn được dùng và luôn là 0 — mọi logic xây dựng dựa trên nó sẽ âm thầm đọc giá trị bằng không.

Máy trạng thái

Thuộc tính state 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:
Nhạc chuông sẽ lặp lại trong trạng thá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

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ộ.
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.
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 đó.
Các callback onConnect, onDisconnectonError 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.
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ó.