useThunderPhone 훅은 ThunderPhone이 음성 세션, 오디오 라우팅 및 연결 상태를 관리하는 동안 사용자 인터페이스를 완전히 제어할 수 있게 해줍니다. ThunderPhone이 내부적으로 모든 작업을 처리하면서 자체 버튼, 레이아웃, 애니메이션, 브랜딩을 포함한 완전 맞춤형 UI가 필요할 때 사용합니다.
헤드리스 훅을 사용하는 경우
사전 구축된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 속성은 다음 수명 주기를 따릅니다.
예시
음소거 제어 사용
벨소리 사용
연결 중에 벨소리를 재생하여 전화 통화를 시뮬레이션합니다.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를 읽어도 다시 렌더링되지 않음). 또는 일정한 간격으로 값을 샘플링하고 결과를 상태에 저장하여 React로 렌더링되는 UI에 사용할 수 있습니다. audioLevel 숫자는 더 이상 사용되지 않으며 항상 0입니다. 이를 기반으로 로직을 구축하지 마십시오.