useThunderPhone Hook 可讓你完整掌控使用者介面,同時由 ThunderPhone 管理語音工作階段、音訊路由和連線狀態。當你想要完全自訂的 UI——自行設計按鈕、版面配置、動畫和品牌風格——並由 ThunderPhone 在幕後處理一切時,請使用它。
何時使用無介面 Hook
預先建置的ThunderPhoneWidget 元件可涵蓋大多數使用情境,但在你需要以下功能時,請使用無介面 Hook:
- 完全自訂的通話 UI,以符合你的應用程式設計系統
- 由即時音訊音量驅動的音訊反應式視覺化效果(波形、光球、脈衝指示器)
- 自訂通話流程,例如通話前表單、通話後問卷,或與語音並列的內嵌聊天
- 整合至既有元件函式庫(Material UI、Chakra、Radix 等)
安裝
無介面 Hook 不需要匯入
@thunderphone/widget/style.css,因為你會自行提供 UI。不過,你仍必須安裝相同的 @thunderphone/widget 套件。基本用法
選項
透過UseThunderPhoneOptions 將以下選項傳遞給 useThunderPhone:
此 Hook 為無介面:它不接受
ThunderPhoneWidget 的外觀屬性(theme、primaryColor、title、position、className)。傳遞這些屬性會造成 TypeScript 錯誤——呈現方式完全由你自行建置。回傳值
此 Hook 會回傳一個UseThunderPhoneReturn 物件:
音訊反應式 UI
audioLevelRef ref 可讓你取得影格速率的音訊音量,而不會觸發 React 重新渲染,因此非常適合用於驅動流暢的波形視覺效果、脈動光球,或任何與對話連動的動畫。音量會反映較大聲的一方:語音智慧體的聲音或訪客的麥克風。
波形範例
脈動光球範例
說話指示器範例
對於會隨音量變化的 React 渲染 UI——例如以閾值為基礎的「說話中」標記——請定期讀取audioLevelRef.current,並將結果儲存在 state 中:
狀態機
state 屬性遵循以下生命週期:
範例
使用靜音控制
使用鈴聲
在連線時播放響鈴聲,模擬電話通話:connecting 狀態期間循環播放,並在智慧體接通時淡出。傳入 true 可使用內建預設鈴聲,或傳入 URL 字串以使用你自己的音訊檔案。
使用事件回呼
完全自訂 UI
提示
一律渲染 phone.audio
一律渲染 phone.audio
phone.audio 元素不可見,但不可或缺。將其放在 JSX 的任何位置——它不會渲染可見的 DOM,但會在內部管理 WebRTC 音訊連線。連線期間停用按鈕
連線期間停用按鈕
connecting 狀態可能持續 1 至 3 秒。在此狀態期間停用通話按鈕,以避免重複嘗試連線。妥善處理錯誤狀態
妥善處理錯誤狀態
當狀態為
error 時,向使用者顯示 phone.error,並保持通話按鈕啟用。此 Hook 不會自行離開 error 狀態——再次呼叫 connect() 會開始新的嘗試,並清除先前的錯誤。使用回呼處理副作用
使用回呼處理副作用
onConnect、onDisconnect 和 onError 回呼非常適合用於分析、記錄,或觸發其他應用程式邏輯,無須輪詢狀態。從 audioLevelRef 讀取音訊音量
從 audioLevelRef 讀取音訊音量
audioLevelRef 是唯一的即時音訊音量來源。若要實現波形等流暢動畫,請在 requestAnimationFrame 內讀取 audioLevelRef.current(讀取 ref 不會造成重新渲染);或者依固定間隔取樣,並將結果儲存在 state 中,供 React 渲染的 UI 使用。audioLevel 數值已淘汰,且一律為 0——請勿依此建立邏輯。