useThunderPhone フックを使用すると、ThunderPhone が音声セッション、音声ルーティング、接続状態を管理しながら、ユーザーインターフェースを完全に制御できます。独自のボタン、レイアウト、アニメーション、ブランディングを備えた完全にカスタムな UI が必要で、ThunderPhone にバックグラウンドの処理を任せたい場合に使用します。
ヘッドレスフックを使用する場合
ビルド済みのThunderPhoneWidget コンポーネントはほとんどのユースケースに対応していますが、次のような場合はヘッドレスフックを使用してください。
- アプリのデザインシステムに一致する完全にカスタムな通話 UI
- リアルタイムの音声レベルに基づいて動作する音声反応型ビジュアライゼーション(波形、オーブ、パルスインジケーター)
- 通話前フォーム、通話後アンケート、音声と併用するインラインチャットなどのカスタム通話フロー
- 既存のコンポーネントライブラリ(Material UI、Chakra、Radix など)への統合
インストール
独自の UI を提供するため、ヘッドレスフックでは
@thunderphone/widget/style.css をインポートする必要はありません。ただし、同じ @thunderphone/widget パッケージをインストールする必要があります。基本的な使用方法
オプション
UseThunderPhoneOptions を介して、これらのオプションを useThunderPhone に渡します。
このフックはヘッドレスです。
ThunderPhoneWidget の外観プロパティ(theme、primaryColor、title、position、className)は受け取りません。これらを渡すと TypeScript エラーになります。表示部分はすべて独自に実装します。戻り値
このフックは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 をユーザーに表示し、通話ボタンは有効なままにしてください。このフックは自動的に error 状態を終了しません。再度 connect() を呼び出すと、新しい試行が開始され、以前のエラーがクリアされます。副作用にはコールバックを使用する
副作用にはコールバックを使用する
onConnect、onDisconnect、onError コールバックは、状態をポーリングせずに分析、ログ記録、または他のアプリケーションロジックのトリガーを行うのに最適です。audioLevelRef からオーディオレベルを読み取る
audioLevelRef からオーディオレベルを読み取る
audioLevelRef は唯一のライブオーディオレベルソースです。波形などの滑らかなアニメーションでは requestAnimationFrame 内で audioLevelRef.current を読み取ってください(ref の読み取りでは再レンダリングは発生しません)。または、一定間隔でサンプリングし、結果を state に保存して React でレンダリングされる UI に使用できます。audioLevel 数値は非推奨で、常に 0 です。この値に基づくロジックは構築しないでください。