@werxt/livekit-components-react 2.9.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +36 -0
- package/dist/assets/icons/CameraDisabledIcon.d.ts +11 -0
- package/dist/assets/icons/CameraDisabledIcon.d.ts.map +1 -0
- package/dist/assets/icons/CameraIcon.d.ts +11 -0
- package/dist/assets/icons/CameraIcon.d.ts.map +1 -0
- package/dist/assets/icons/ChatCloseIcon.d.ts +11 -0
- package/dist/assets/icons/ChatCloseIcon.d.ts.map +1 -0
- package/dist/assets/icons/ChatIcon.d.ts +11 -0
- package/dist/assets/icons/ChatIcon.d.ts.map +1 -0
- package/dist/assets/icons/Chevron.d.ts +11 -0
- package/dist/assets/icons/Chevron.d.ts.map +1 -0
- package/dist/assets/icons/FocusToggleIcon.d.ts +11 -0
- package/dist/assets/icons/FocusToggleIcon.d.ts.map +1 -0
- package/dist/assets/icons/GearIcon.d.ts +11 -0
- package/dist/assets/icons/GearIcon.d.ts.map +1 -0
- package/dist/assets/icons/LeaveIcon.d.ts +11 -0
- package/dist/assets/icons/LeaveIcon.d.ts.map +1 -0
- package/dist/assets/icons/LockLockedIcon.d.ts +11 -0
- package/dist/assets/icons/LockLockedIcon.d.ts.map +1 -0
- package/dist/assets/icons/MicDisabledIcon.d.ts +11 -0
- package/dist/assets/icons/MicDisabledIcon.d.ts.map +1 -0
- package/dist/assets/icons/MicIcon.d.ts +11 -0
- package/dist/assets/icons/MicIcon.d.ts.map +1 -0
- package/dist/assets/icons/QualityExcellentIcon.d.ts +11 -0
- package/dist/assets/icons/QualityExcellentIcon.d.ts.map +1 -0
- package/dist/assets/icons/QualityGoodIcon.d.ts +11 -0
- package/dist/assets/icons/QualityGoodIcon.d.ts.map +1 -0
- package/dist/assets/icons/QualityPoorIcon.d.ts +11 -0
- package/dist/assets/icons/QualityPoorIcon.d.ts.map +1 -0
- package/dist/assets/icons/QualityUnknownIcon.d.ts +11 -0
- package/dist/assets/icons/QualityUnknownIcon.d.ts.map +1 -0
- package/dist/assets/icons/ScreenShareIcon.d.ts +11 -0
- package/dist/assets/icons/ScreenShareIcon.d.ts.map +1 -0
- package/dist/assets/icons/ScreenShareStopIcon.d.ts +11 -0
- package/dist/assets/icons/ScreenShareStopIcon.d.ts.map +1 -0
- package/dist/assets/icons/SpinnerIcon.d.ts +11 -0
- package/dist/assets/icons/SpinnerIcon.d.ts.map +1 -0
- package/dist/assets/icons/UnfocusToggleIcon.d.ts +11 -0
- package/dist/assets/icons/UnfocusToggleIcon.d.ts.map +1 -0
- package/dist/assets/icons/index.d.ts +20 -0
- package/dist/assets/icons/index.d.ts.map +1 -0
- package/dist/assets/icons/util.d.ts +11 -0
- package/dist/assets/icons/util.d.ts.map +1 -0
- package/dist/assets/images/ParticipantPlaceholder.d.ts +11 -0
- package/dist/assets/images/ParticipantPlaceholder.d.ts.map +1 -0
- package/dist/assets/images/index.d.ts +2 -0
- package/dist/assets/images/index.d.ts.map +1 -0
- package/dist/components/ChatEntry.d.ts +35 -0
- package/dist/components/ChatEntry.d.ts.map +1 -0
- package/dist/components/ConnectionState.d.ts +23 -0
- package/dist/components/ConnectionState.d.ts.map +1 -0
- package/dist/components/ConnectionStateToast.d.ts +13 -0
- package/dist/components/ConnectionStateToast.d.ts.map +1 -0
- package/dist/components/LiveKitRoom.d.ts +92 -0
- package/dist/components/LiveKitRoom.d.ts.map +1 -0
- package/dist/components/ParticipantLoop.d.ts +28 -0
- package/dist/components/ParticipantLoop.d.ts.map +1 -0
- package/dist/components/RoomAudioRenderer.d.ts +29 -0
- package/dist/components/RoomAudioRenderer.d.ts.map +1 -0
- package/dist/components/RoomName.d.ts +20 -0
- package/dist/components/RoomName.d.ts.map +1 -0
- package/dist/components/SessionProvider.d.ts +13 -0
- package/dist/components/SessionProvider.d.ts.map +1 -0
- package/dist/components/Toast.d.ts +14 -0
- package/dist/components/Toast.d.ts.map +1 -0
- package/dist/components/TrackLoop.d.ts +26 -0
- package/dist/components/TrackLoop.d.ts.map +1 -0
- package/dist/components/controls/ChatToggle.d.ts +19 -0
- package/dist/components/controls/ChatToggle.d.ts.map +1 -0
- package/dist/components/controls/ClearPinButton.d.ts +20 -0
- package/dist/components/controls/ClearPinButton.d.ts.map +1 -0
- package/dist/components/controls/DisconnectButton.d.ts +19 -0
- package/dist/components/controls/DisconnectButton.d.ts.map +1 -0
- package/dist/components/controls/FocusToggle.d.ts +21 -0
- package/dist/components/controls/FocusToggle.d.ts.map +1 -0
- package/dist/components/controls/MediaDeviceSelect.d.ts +40 -0
- package/dist/components/controls/MediaDeviceSelect.d.ts.map +1 -0
- package/dist/components/controls/PaginationControl.d.ts +9 -0
- package/dist/components/controls/PaginationControl.d.ts.map +1 -0
- package/dist/components/controls/PaginationIndicator.d.ts +7 -0
- package/dist/components/controls/PaginationIndicator.d.ts.map +1 -0
- package/dist/components/controls/SettingsMenuToggle.d.ts +13 -0
- package/dist/components/controls/SettingsMenuToggle.d.ts.map +1 -0
- package/dist/components/controls/StartAudio.d.ts +24 -0
- package/dist/components/controls/StartAudio.d.ts.map +1 -0
- package/dist/components/controls/StartMediaButton.d.ts +22 -0
- package/dist/components/controls/StartMediaButton.d.ts.map +1 -0
- package/dist/components/controls/TrackToggle.d.ts +32 -0
- package/dist/components/controls/TrackToggle.d.ts.map +1 -0
- package/dist/components/index.d.ts +30 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/layout/CarouselLayout.d.ts +27 -0
- package/dist/components/layout/CarouselLayout.d.ts.map +1 -0
- package/dist/components/layout/FocusLayout.d.ts +25 -0
- package/dist/components/layout/FocusLayout.d.ts.map +1 -0
- package/dist/components/layout/GridLayout.d.ts +26 -0
- package/dist/components/layout/GridLayout.d.ts.map +1 -0
- package/dist/components/layout/LayoutContextProvider.d.ts +12 -0
- package/dist/components/layout/LayoutContextProvider.d.ts.map +1 -0
- package/dist/components/layout/index.d.ts +4 -0
- package/dist/components/layout/index.d.ts.map +1 -0
- package/dist/components/participant/AudioTrack.d.ts +33 -0
- package/dist/components/participant/AudioTrack.d.ts.map +1 -0
- package/dist/components/participant/AudioVisualizer.d.ts +22 -0
- package/dist/components/participant/AudioVisualizer.d.ts.map +1 -0
- package/dist/components/participant/BarVisualizer.d.ts +77 -0
- package/dist/components/participant/BarVisualizer.d.ts.map +1 -0
- package/dist/components/participant/ConnectionQualityIndicator.d.ts +16 -0
- package/dist/components/participant/ConnectionQualityIndicator.d.ts.map +1 -0
- package/dist/components/participant/ParticipantAudioTile.d.ts +14 -0
- package/dist/components/participant/ParticipantAudioTile.d.ts.map +1 -0
- package/dist/components/participant/ParticipantName.d.ts +17 -0
- package/dist/components/participant/ParticipantName.d.ts.map +1 -0
- package/dist/components/participant/ParticipantTile.d.ts +49 -0
- package/dist/components/participant/ParticipantTile.d.ts.map +1 -0
- package/dist/components/participant/TrackMutedIndicator.d.ts +19 -0
- package/dist/components/participant/TrackMutedIndicator.d.ts.map +1 -0
- package/dist/components/participant/VideoTrack.d.ts +23 -0
- package/dist/components/participant/VideoTrack.d.ts.map +1 -0
- package/dist/components/participant/animationSequences/connectingSequence.d.ts +2 -0
- package/dist/components/participant/animationSequences/connectingSequence.d.ts.map +1 -0
- package/dist/components/participant/animationSequences/listeningSequence.d.ts +2 -0
- package/dist/components/participant/animationSequences/listeningSequence.d.ts.map +1 -0
- package/dist/components/participant/animationSequences/thinkingSequence.d.ts +2 -0
- package/dist/components/participant/animationSequences/thinkingSequence.d.ts.map +1 -0
- package/dist/components/participant/animators/useBarAnimator.d.ts +3 -0
- package/dist/components/participant/animators/useBarAnimator.d.ts.map +1 -0
- package/dist/components-lNrIMTWQ.mjs +1051 -0
- package/dist/components-lNrIMTWQ.mjs.map +1 -0
- package/dist/context/chat-context.d.ts +23 -0
- package/dist/context/chat-context.d.ts.map +1 -0
- package/dist/context/feature-context.d.ts +14 -0
- package/dist/context/feature-context.d.ts.map +1 -0
- package/dist/context/index.d.ts +10 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/layout-context.d.ts +32 -0
- package/dist/context/layout-context.d.ts.map +1 -0
- package/dist/context/participant-context.d.ts +22 -0
- package/dist/context/participant-context.d.ts.map +1 -0
- package/dist/context/pin-context.d.ts +17 -0
- package/dist/context/pin-context.d.ts.map +1 -0
- package/dist/context/room-context.d.ts +22 -0
- package/dist/context/room-context.d.ts.map +1 -0
- package/dist/context/session-context.d.ts +22 -0
- package/dist/context/session-context.d.ts.map +1 -0
- package/dist/context/track-reference-context.d.ts +25 -0
- package/dist/context/track-reference-context.d.ts.map +1 -0
- package/dist/contexts-D4V9wQRc.mjs +4026 -0
- package/dist/contexts-D4V9wQRc.mjs.map +1 -0
- package/dist/hooks/cloud/krisp/useKrispNoiseFilter.d.ts +42 -0
- package/dist/hooks/cloud/krisp/useKrispNoiseFilter.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +54 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/internal/index.d.ts +10 -0
- package/dist/hooks/internal/index.d.ts.map +1 -0
- package/dist/hooks/internal/useMediaQuery.d.ts +7 -0
- package/dist/hooks/internal/useMediaQuery.d.ts.map +1 -0
- package/dist/hooks/internal/useObservableState.d.ts +6 -0
- package/dist/hooks/internal/useObservableState.d.ts.map +1 -0
- package/dist/hooks/internal/useResizeObserver.d.ts +14 -0
- package/dist/hooks/internal/useResizeObserver.d.ts.map +1 -0
- package/dist/hooks/useAgent.d.ts +219 -0
- package/dist/hooks/useAgent.d.ts.map +1 -0
- package/dist/hooks/useAudioPlayback.d.ts +15 -0
- package/dist/hooks/useAudioPlayback.d.ts.map +1 -0
- package/dist/hooks/useChat.d.ts +43 -0
- package/dist/hooks/useChat.d.ts.map +1 -0
- package/dist/hooks/useChatToggle.d.ts +21 -0
- package/dist/hooks/useChatToggle.d.ts.map +1 -0
- package/dist/hooks/useClearPinButton.d.ts +15 -0
- package/dist/hooks/useClearPinButton.d.ts.map +1 -0
- package/dist/hooks/useConnectionQualityIndicator.d.ts +20 -0
- package/dist/hooks/useConnectionQualityIndicator.d.ts.map +1 -0
- package/dist/hooks/useConnectionStatus.d.ts +12 -0
- package/dist/hooks/useConnectionStatus.d.ts.map +1 -0
- package/dist/hooks/useDataChannel.d.ts +38 -0
- package/dist/hooks/useDataChannel.d.ts.map +1 -0
- package/dist/hooks/useDisconnectButton.d.ts +21 -0
- package/dist/hooks/useDisconnectButton.d.ts.map +1 -0
- package/dist/hooks/useEvents.d.ts +9 -0
- package/dist/hooks/useEvents.d.ts.map +1 -0
- package/dist/hooks/useFacingMode.d.ts +10 -0
- package/dist/hooks/useFacingMode.d.ts.map +1 -0
- package/dist/hooks/useFocusToggle.d.ts +26 -0
- package/dist/hooks/useFocusToggle.d.ts.map +1 -0
- package/dist/hooks/useGridLayout.d.ts +27 -0
- package/dist/hooks/useGridLayout.d.ts.map +1 -0
- package/dist/hooks/useIsEncrypted.d.ts +12 -0
- package/dist/hooks/useIsEncrypted.d.ts.map +1 -0
- package/dist/hooks/useIsMuted.d.ts +22 -0
- package/dist/hooks/useIsMuted.d.ts.map +1 -0
- package/dist/hooks/useIsRecording.d.ts +11 -0
- package/dist/hooks/useIsRecording.d.ts.map +1 -0
- package/dist/hooks/useIsSpeaking.d.ts +11 -0
- package/dist/hooks/useIsSpeaking.d.ts.map +1 -0
- package/dist/hooks/useLiveKitRoom.d.ts +19 -0
- package/dist/hooks/useLiveKitRoom.d.ts.map +1 -0
- package/dist/hooks/useLocalParticipant.d.ts +29 -0
- package/dist/hooks/useLocalParticipant.d.ts.map +1 -0
- package/dist/hooks/useLocalParticipantPermissions.d.ts +12 -0
- package/dist/hooks/useLocalParticipantPermissions.d.ts.map +1 -0
- package/dist/hooks/useMediaDeviceSelect.d.ts +41 -0
- package/dist/hooks/useMediaDeviceSelect.d.ts.map +1 -0
- package/dist/hooks/useMediaDevices.d.ts +15 -0
- package/dist/hooks/useMediaDevices.d.ts.map +1 -0
- package/dist/hooks/useMediaTrackBySourceOrName.d.ts +18 -0
- package/dist/hooks/useMediaTrackBySourceOrName.d.ts.map +1 -0
- package/dist/hooks/usePagination.d.ts +24 -0
- package/dist/hooks/usePagination.d.ts.map +1 -0
- package/dist/hooks/useParticipantAttributes.d.ts +30 -0
- package/dist/hooks/useParticipantAttributes.d.ts.map +1 -0
- package/dist/hooks/useParticipantInfo.d.ts +21 -0
- package/dist/hooks/useParticipantInfo.d.ts.map +1 -0
- package/dist/hooks/useParticipantPermissions.d.ts +17 -0
- package/dist/hooks/useParticipantPermissions.d.ts.map +1 -0
- package/dist/hooks/useParticipantTile.d.ts +22 -0
- package/dist/hooks/useParticipantTile.d.ts.map +1 -0
- package/dist/hooks/useParticipantTracks.d.ts +14 -0
- package/dist/hooks/useParticipantTracks.d.ts.map +1 -0
- package/dist/hooks/useParticipants.d.ts +30 -0
- package/dist/hooks/useParticipants.d.ts.map +1 -0
- package/dist/hooks/usePersistentUserChoices.d.ts +35 -0
- package/dist/hooks/usePersistentUserChoices.d.ts.map +1 -0
- package/dist/hooks/usePinnedTracks.d.ts +14 -0
- package/dist/hooks/usePinnedTracks.d.ts.map +1 -0
- package/dist/hooks/useRemoteParticipant.d.ts +35 -0
- package/dist/hooks/useRemoteParticipant.d.ts.map +1 -0
- package/dist/hooks/useRemoteParticipants.d.ts +30 -0
- package/dist/hooks/useRemoteParticipants.d.ts.map +1 -0
- package/dist/hooks/useRoomInfo.d.ts +21 -0
- package/dist/hooks/useRoomInfo.d.ts.map +1 -0
- package/dist/hooks/useSequentialRoomConnectDisconnect.d.ts +27 -0
- package/dist/hooks/useSequentialRoomConnectDisconnect.d.ts.map +1 -0
- package/dist/hooks/useSession.d.ts +130 -0
- package/dist/hooks/useSession.d.ts.map +1 -0
- package/dist/hooks/useSessionMessages.d.ts +29 -0
- package/dist/hooks/useSessionMessages.d.ts.map +1 -0
- package/dist/hooks/useSettingsToggle.d.ts +20 -0
- package/dist/hooks/useSettingsToggle.d.ts.map +1 -0
- package/dist/hooks/useSortedParticipants.d.ts +7 -0
- package/dist/hooks/useSortedParticipants.d.ts.map +1 -0
- package/dist/hooks/useSpeakingParticipants.d.ts +16 -0
- package/dist/hooks/useSpeakingParticipants.d.ts.map +1 -0
- package/dist/hooks/useStartAudio.d.ts +27 -0
- package/dist/hooks/useStartAudio.d.ts.map +1 -0
- package/dist/hooks/useStartVideo.d.ts +26 -0
- package/dist/hooks/useStartVideo.d.ts.map +1 -0
- package/dist/hooks/useSwipe.d.ts +24 -0
- package/dist/hooks/useSwipe.d.ts.map +1 -0
- package/dist/hooks/useTextStream.d.ts +20 -0
- package/dist/hooks/useTextStream.d.ts.map +1 -0
- package/dist/hooks/useToken.d.ts +20 -0
- package/dist/hooks/useToken.d.ts.map +1 -0
- package/dist/hooks/useTrack.d.ts +4 -0
- package/dist/hooks/useTrack.d.ts.map +1 -0
- package/dist/hooks/useTrackByName.d.ts +10 -0
- package/dist/hooks/useTrackByName.d.ts.map +1 -0
- package/dist/hooks/useTrackMutedIndicator.d.ts +18 -0
- package/dist/hooks/useTrackMutedIndicator.d.ts.map +1 -0
- package/dist/hooks/useTrackRefBySourceOrName.d.ts +7 -0
- package/dist/hooks/useTrackRefBySourceOrName.d.ts.map +1 -0
- package/dist/hooks/useTrackSyncTime.d.ts +10 -0
- package/dist/hooks/useTrackSyncTime.d.ts.map +1 -0
- package/dist/hooks/useTrackToggle.d.ts +27 -0
- package/dist/hooks/useTrackToggle.d.ts.map +1 -0
- package/dist/hooks/useTrackTranscription.d.ts +26 -0
- package/dist/hooks/useTrackTranscription.d.ts.map +1 -0
- package/dist/hooks/useTrackVolume.d.ts +49 -0
- package/dist/hooks/useTrackVolume.d.ts.map +1 -0
- package/dist/hooks/useTracks.d.ts +29 -0
- package/dist/hooks/useTracks.d.ts.map +1 -0
- package/dist/hooks/useTranscriptions.d.ts +21 -0
- package/dist/hooks/useTranscriptions.d.ts.map +1 -0
- package/dist/hooks/useVisualStableUpdate.d.ts +27 -0
- package/dist/hooks/useVisualStableUpdate.d.ts.map +1 -0
- package/dist/hooks/useVoiceAssistant.d.ts +43 -0
- package/dist/hooks/useVoiceAssistant.d.ts.map +1 -0
- package/dist/hooks/useWarnAboutMissingStyles.d.ts +5 -0
- package/dist/hooks/useWarnAboutMissingStyles.d.ts.map +1 -0
- package/dist/hooks-hQJmeINB.mjs +1992 -0
- package/dist/hooks-hQJmeINB.mjs.map +1 -0
- package/dist/hooks.d.ts +2 -0
- package/dist/hooks.js +2 -0
- package/dist/hooks.js.map +1 -0
- package/dist/hooks.mjs +64 -0
- package/dist/hooks.mjs.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.docs.d.ts +6 -0
- package/dist/index.docs.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +157 -0
- package/dist/index.mjs.map +1 -0
- package/dist/krisp.d.ts +2 -0
- package/dist/krisp.js +2 -0
- package/dist/krisp.js.map +1 -0
- package/dist/krisp.mjs +45 -0
- package/dist/krisp.mjs.map +1 -0
- package/dist/mergeProps.d.ts +25 -0
- package/dist/mergeProps.d.ts.map +1 -0
- package/dist/prefabs/AudioConference.d.ts +22 -0
- package/dist/prefabs/AudioConference.d.ts.map +1 -0
- package/dist/prefabs/Chat.d.ts +35 -0
- package/dist/prefabs/Chat.d.ts.map +1 -0
- package/dist/prefabs/ControlBar.d.ts +45 -0
- package/dist/prefabs/ControlBar.d.ts.map +1 -0
- package/dist/prefabs/MediaDeviceMenu.d.ts +36 -0
- package/dist/prefabs/MediaDeviceMenu.d.ts.map +1 -0
- package/dist/prefabs/PreJoin.d.ts +59 -0
- package/dist/prefabs/PreJoin.d.ts.map +1 -0
- package/dist/prefabs/VideoConference.d.ts +35 -0
- package/dist/prefabs/VideoConference.d.ts.map +1 -0
- package/dist/prefabs/VoiceAssistantControlBar.d.ts +32 -0
- package/dist/prefabs/VoiceAssistantControlBar.d.ts.map +1 -0
- package/dist/prefabs/index.d.ts +8 -0
- package/dist/prefabs/index.d.ts.map +1 -0
- package/dist/prefabs.d.ts +2 -0
- package/dist/prefabs.js +2 -0
- package/dist/prefabs.js.map +1 -0
- package/dist/prefabs.mjs +579 -0
- package/dist/prefabs.mjs.map +1 -0
- package/dist/room-BP3SCCCd.mjs +191 -0
- package/dist/room-BP3SCCCd.mjs.map +1 -0
- package/dist/shared-88J2fzv7.js +2 -0
- package/dist/shared-88J2fzv7.js.map +1 -0
- package/dist/shared-BDr0qLg4.js +4 -0
- package/dist/shared-BDr0qLg4.js.map +1 -0
- package/dist/shared-CjI_UuOX.js +2 -0
- package/dist/shared-CjI_UuOX.js.map +1 -0
- package/dist/shared-DTHOl3uJ.js +2 -0
- package/dist/shared-DTHOl3uJ.js.map +1 -0
- package/dist/utils.d.ts +19 -0
- package/dist/utils.d.ts.map +1 -0
- package/package.json +104 -0
- package/src/assets/icons/CameraDisabledIcon.tsx +15 -0
- package/src/assets/icons/CameraIcon.tsx +14 -0
- package/src/assets/icons/ChatCloseIcon.tsx +17 -0
- package/src/assets/icons/ChatIcon.tsx +25 -0
- package/src/assets/icons/Chevron.tsx +19 -0
- package/src/assets/icons/FocusToggleIcon.tsx +16 -0
- package/src/assets/icons/GearIcon.tsx +19 -0
- package/src/assets/icons/LeaveIcon.tsx +25 -0
- package/src/assets/icons/LockLockedIcon.tsx +19 -0
- package/src/assets/icons/MicDisabledIcon.tsx +15 -0
- package/src/assets/icons/MicIcon.tsx +19 -0
- package/src/assets/icons/QualityExcellentIcon.tsx +15 -0
- package/src/assets/icons/QualityGoodIcon.tsx +19 -0
- package/src/assets/icons/QualityPoorIcon.tsx +20 -0
- package/src/assets/icons/QualityUnknownIcon.tsx +17 -0
- package/src/assets/icons/ScreenShareIcon.tsx +25 -0
- package/src/assets/icons/ScreenShareStopIcon.tsx +21 -0
- package/src/assets/icons/SpinnerIcon.tsx +93 -0
- package/src/assets/icons/UnfocusToggleIcon.tsx +16 -0
- package/src/assets/icons/index.ts +19 -0
- package/src/assets/icons/util.tsx +47 -0
- package/src/assets/images/ParticipantPlaceholder.tsx +31 -0
- package/src/assets/images/index.ts +1 -0
- package/src/assets/template.js +21 -0
- package/src/components/ChatEntry.tsx +112 -0
- package/src/components/ConnectionState.tsx +36 -0
- package/src/components/ConnectionStateToast.tsx +47 -0
- package/src/components/LiveKitRoom.tsx +122 -0
- package/src/components/ParticipantLoop.tsx +41 -0
- package/src/components/RoomAudioRenderer.tsx +57 -0
- package/src/components/RoomName.tsx +36 -0
- package/src/components/SessionProvider.tsx +22 -0
- package/src/components/Toast.tsx +18 -0
- package/src/components/TrackLoop.tsx +45 -0
- package/src/components/controls/ChatToggle.tsx +32 -0
- package/src/components/controls/ClearPinButton.tsx +32 -0
- package/src/components/controls/DisconnectButton.tsx +32 -0
- package/src/components/controls/FocusToggle.tsx +54 -0
- package/src/components/controls/MediaDeviceSelect.tsx +144 -0
- package/src/components/controls/PaginationControl.tsx +51 -0
- package/src/components/controls/PaginationIndicator.tsx +26 -0
- package/src/components/controls/SettingsMenuToggle.tsx +26 -0
- package/src/components/controls/StartAudio.tsx +40 -0
- package/src/components/controls/StartMediaButton.tsx +41 -0
- package/src/components/controls/TrackToggle.tsx +54 -0
- package/src/components/index.ts +34 -0
- package/src/components/layout/CarouselLayout.tsx +80 -0
- package/src/components/layout/FocusLayout.tsx +37 -0
- package/src/components/layout/GridLayout.tsx +63 -0
- package/src/components/layout/LayoutContextProvider.tsx +36 -0
- package/src/components/layout/index.ts +3 -0
- package/src/components/participant/AudioTrack.tsx +89 -0
- package/src/components/participant/AudioVisualizer.tsx +67 -0
- package/src/components/participant/BarVisualizer.tsx +164 -0
- package/src/components/participant/ConnectionQualityIndicator.tsx +36 -0
- package/src/components/participant/ParticipantAudioTile.tsx +67 -0
- package/src/components/participant/ParticipantName.tsx +50 -0
- package/src/components/participant/ParticipantTile.tsx +192 -0
- package/src/components/participant/TrackMutedIndicator.tsx +53 -0
- package/src/components/participant/VideoTrack.tsx +92 -0
- package/src/components/participant/animationSequences/connectingSequence.ts +9 -0
- package/src/components/participant/animationSequences/listeningSequence.ts +6 -0
- package/src/components/participant/animationSequences/thinkingSequence.ts +12 -0
- package/src/components/participant/animators/useBarAnimator.ts +55 -0
- package/src/context/chat-context.ts +37 -0
- package/src/context/feature-context.ts +28 -0
- package/src/context/index.ts +27 -0
- package/src/context/layout-context.ts +72 -0
- package/src/context/participant-context.ts +44 -0
- package/src/context/pin-context.ts +27 -0
- package/src/context/room-context.ts +42 -0
- package/src/context/session-context.ts +43 -0
- package/src/context/track-reference-context.ts +47 -0
- package/src/hooks/cloud/krisp/useKrispNoiseFilter.ts +110 -0
- package/src/hooks/index.ts +72 -0
- package/src/hooks/internal/index.ts +10 -0
- package/src/hooks/internal/useMediaQuery.ts +46 -0
- package/src/hooks/internal/useObservableState.ts +24 -0
- package/src/hooks/internal/useResizeObserver.ts +124 -0
- package/src/hooks/useAgent.ts +945 -0
- package/src/hooks/useAudioPlayback.ts +34 -0
- package/src/hooks/useChat.ts +57 -0
- package/src/hooks/useChatToggle.ts +38 -0
- package/src/hooks/useClearPinButton.ts +29 -0
- package/src/hooks/useConnectionQualityIndicator.ts +33 -0
- package/src/hooks/useConnectionStatus.ts +22 -0
- package/src/hooks/useDataChannel.ts +73 -0
- package/src/hooks/useDisconnectButton.ts +36 -0
- package/src/hooks/useEvents.ts +39 -0
- package/src/hooks/useFacingMode.ts +22 -0
- package/src/hooks/useFocusToggle.ts +59 -0
- package/src/hooks/useGridLayout.ts +44 -0
- package/src/hooks/useIsEncrypted.ts +29 -0
- package/src/hooks/useIsMuted.ts +51 -0
- package/src/hooks/useIsRecording.ts +23 -0
- package/src/hooks/useIsSpeaking.ts +21 -0
- package/src/hooks/useLiveKitRoom.ts +186 -0
- package/src/hooks/useLocalParticipant.ts +73 -0
- package/src/hooks/useLocalParticipantPermissions.ts +24 -0
- package/src/hooks/useMediaDeviceSelect.ts +81 -0
- package/src/hooks/useMediaDevices.ts +28 -0
- package/src/hooks/useMediaTrackBySourceOrName.ts +97 -0
- package/src/hooks/usePagination.test.ts +77 -0
- package/src/hooks/usePagination.ts +67 -0
- package/src/hooks/useParticipantAttributes.ts +69 -0
- package/src/hooks/useParticipantInfo.ts +35 -0
- package/src/hooks/useParticipantPermissions.ts +29 -0
- package/src/hooks/useParticipantTile.ts +81 -0
- package/src/hooks/useParticipantTracks.ts +54 -0
- package/src/hooks/useParticipants.ts +42 -0
- package/src/hooks/usePersistentUserChoices.ts +64 -0
- package/src/hooks/usePinnedTracks.ts +24 -0
- package/src/hooks/useRemoteParticipant.ts +79 -0
- package/src/hooks/useRemoteParticipants.ts +45 -0
- package/src/hooks/useRoomInfo.ts +32 -0
- package/src/hooks/useSequentialRoomConnectDisconnect.ts +171 -0
- package/src/hooks/useSession.ts +642 -0
- package/src/hooks/useSessionMessages.ts +158 -0
- package/src/hooks/useSettingsToggle.ts +32 -0
- package/src/hooks/useSortedParticipants.ts +20 -0
- package/src/hooks/useSpeakingParticipants.ts +27 -0
- package/src/hooks/useStartAudio.ts +50 -0
- package/src/hooks/useStartVideo.ts +49 -0
- package/src/hooks/useSwipe.ts +68 -0
- package/src/hooks/useTextStream.ts +35 -0
- package/src/hooks/useToken.ts +54 -0
- package/src/hooks/useTrack.ts +11 -0
- package/src/hooks/useTrackByName.ts +15 -0
- package/src/hooks/useTrackMutedIndicator.ts +44 -0
- package/src/hooks/useTrackRefBySourceOrName.ts +30 -0
- package/src/hooks/useTrackSyncTime.ts +18 -0
- package/src/hooks/useTrackToggle.ts +93 -0
- package/src/hooks/useTrackTranscription.ts +75 -0
- package/src/hooks/useTrackVolume.ts +283 -0
- package/src/hooks/useTracks.test.ts +60 -0
- package/src/hooks/useTracks.ts +154 -0
- package/src/hooks/useTranscriptions.ts +48 -0
- package/src/hooks/useVisualStableUpdate.ts +63 -0
- package/src/hooks/useVoiceAssistant.ts +109 -0
- package/src/hooks/useWarnAboutMissingStyles.ts +11 -0
- package/src/index.docs.ts +12 -0
- package/src/index.ts +32 -0
- package/src/mergeProps.ts +87 -0
- package/src/prefabs/AudioConference.tsx +57 -0
- package/src/prefabs/Chat.tsx +153 -0
- package/src/prefabs/ControlBar.tsx +227 -0
- package/src/prefabs/MediaDeviceMenu.tsx +159 -0
- package/src/prefabs/PreJoin.tsx +439 -0
- package/src/prefabs/VideoConference.tsx +184 -0
- package/src/prefabs/VoiceAssistantControlBar.tsx +109 -0
- package/src/prefabs/index.ts +11 -0
- package/src/utils.ts +78 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { UseParticipantsOptions } from '../../hooks';
|
|
3
|
+
import { useGridLayout, usePagination, useSwipe } from '../../hooks';
|
|
4
|
+
import { mergeProps } from '../../utils';
|
|
5
|
+
import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';
|
|
6
|
+
import { TrackLoop } from '../TrackLoop';
|
|
7
|
+
import { PaginationControl } from '../controls/PaginationControl';
|
|
8
|
+
import { PaginationIndicator } from '../controls/PaginationIndicator';
|
|
9
|
+
|
|
10
|
+
/** @public */
|
|
11
|
+
export interface GridLayoutProps
|
|
12
|
+
extends React.HTMLAttributes<HTMLDivElement>,
|
|
13
|
+
Pick<UseParticipantsOptions, 'updateOnlyOn'> {
|
|
14
|
+
children: React.ReactNode;
|
|
15
|
+
tracks: TrackReferenceOrPlaceholder[];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The `GridLayout` component displays the nested participants in a grid where every participants has the same size.
|
|
20
|
+
* It also supports pagination if there are more participants than the grid can display.
|
|
21
|
+
* @remarks
|
|
22
|
+
* To ensure visual stability when tiles are reordered due to track updates,
|
|
23
|
+
* the component uses the `useVisualStableUpdate` hook.
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* <LiveKitRoom>
|
|
27
|
+
* <GridLayout tracks={tracks}>
|
|
28
|
+
* <ParticipantTile />
|
|
29
|
+
* </GridLayout>
|
|
30
|
+
* <LiveKitRoom>
|
|
31
|
+
* ```
|
|
32
|
+
* @public
|
|
33
|
+
*/
|
|
34
|
+
export function GridLayout({ tracks, ...props }: GridLayoutProps) {
|
|
35
|
+
const gridEl = React.createRef<HTMLDivElement>();
|
|
36
|
+
|
|
37
|
+
const elementProps = React.useMemo(
|
|
38
|
+
() => mergeProps(props, { className: 'lk-grid-layout' }),
|
|
39
|
+
[props],
|
|
40
|
+
);
|
|
41
|
+
const { layout } = useGridLayout(gridEl, tracks.length);
|
|
42
|
+
const pagination = usePagination(layout.maxTiles, tracks);
|
|
43
|
+
|
|
44
|
+
useSwipe(gridEl, {
|
|
45
|
+
onLeftSwipe: pagination.nextPage,
|
|
46
|
+
onRightSwipe: pagination.prevPage,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<div ref={gridEl} data-lk-pagination={pagination.totalPageCount > 1} {...elementProps}>
|
|
51
|
+
<TrackLoop tracks={pagination.tracks}>{props.children}</TrackLoop>
|
|
52
|
+
{tracks.length > layout.maxTiles && (
|
|
53
|
+
<>
|
|
54
|
+
<PaginationIndicator
|
|
55
|
+
totalPageCount={pagination.totalPageCount}
|
|
56
|
+
currentPage={pagination.currentPage}
|
|
57
|
+
/>
|
|
58
|
+
<PaginationControl pagesContainer={gridEl} {...pagination} />
|
|
59
|
+
</>
|
|
60
|
+
)}
|
|
61
|
+
</div>
|
|
62
|
+
);
|
|
63
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { PinState, WidgetState } from '@livekit/components-core';
|
|
2
|
+
import { log } from '@livekit/components-core';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import type { LayoutContextType } from '../../context';
|
|
5
|
+
import { LayoutContext, useEnsureCreateLayoutContext } from '../../context';
|
|
6
|
+
|
|
7
|
+
/** @alpha */
|
|
8
|
+
export interface LayoutContextProviderProps {
|
|
9
|
+
value?: LayoutContextType;
|
|
10
|
+
onPinChange?: (state: PinState) => void;
|
|
11
|
+
onWidgetChange?: (state: WidgetState) => void;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** @alpha */
|
|
15
|
+
export function LayoutContextProvider({
|
|
16
|
+
value,
|
|
17
|
+
onPinChange,
|
|
18
|
+
onWidgetChange,
|
|
19
|
+
children,
|
|
20
|
+
}: React.PropsWithChildren<LayoutContextProviderProps>) {
|
|
21
|
+
const layoutContextValue = useEnsureCreateLayoutContext(value);
|
|
22
|
+
|
|
23
|
+
React.useEffect(() => {
|
|
24
|
+
log.debug('PinState Updated', { state: layoutContextValue.pin.state });
|
|
25
|
+
if (onPinChange && layoutContextValue.pin.state) onPinChange(layoutContextValue.pin.state);
|
|
26
|
+
}, [layoutContextValue.pin.state, onPinChange]);
|
|
27
|
+
|
|
28
|
+
React.useEffect(() => {
|
|
29
|
+
log.debug('Widget Updated', { widgetState: layoutContextValue.widget.state });
|
|
30
|
+
if (onWidgetChange && layoutContextValue.widget.state) {
|
|
31
|
+
onWidgetChange(layoutContextValue.widget.state);
|
|
32
|
+
}
|
|
33
|
+
}, [onWidgetChange, layoutContextValue.widget.state]);
|
|
34
|
+
|
|
35
|
+
return <LayoutContext.Provider value={layoutContextValue}>{children}</LayoutContext.Provider>;
|
|
36
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { useMediaTrackBySourceOrName } from '../../hooks/useMediaTrackBySourceOrName';
|
|
3
|
+
import type { TrackReference } from '@livekit/components-core';
|
|
4
|
+
import { log } from '@livekit/components-core';
|
|
5
|
+
import { RemoteAudioTrack, RemoteTrackPublication } from 'livekit-client';
|
|
6
|
+
import { useEnsureTrackRef } from '../../context';
|
|
7
|
+
|
|
8
|
+
/** @public */
|
|
9
|
+
export interface AudioTrackProps extends React.AudioHTMLAttributes<HTMLAudioElement> {
|
|
10
|
+
/** The track reference of the track from which the audio is to be rendered. */
|
|
11
|
+
trackRef?: TrackReference;
|
|
12
|
+
|
|
13
|
+
onSubscriptionStatusChanged?: (subscribed: boolean) => void;
|
|
14
|
+
/** Sets the volume of the audio track. By default, the range is between `0.0` and `1.0`. */
|
|
15
|
+
volume?: number;
|
|
16
|
+
/**
|
|
17
|
+
* Mutes the audio track if set to `true`.
|
|
18
|
+
* @remarks
|
|
19
|
+
* If set to `true`, the server will stop sending audio track data to the client.
|
|
20
|
+
* @alpha
|
|
21
|
+
*/
|
|
22
|
+
muted?: boolean;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The AudioTrack component is responsible for rendering participant audio tracks.
|
|
27
|
+
* This component must have access to the participant's context, or alternatively pass it a `Participant` as a property.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```tsx
|
|
31
|
+
* <ParticipantTile>
|
|
32
|
+
* <AudioTrack trackRef={trackRef} />
|
|
33
|
+
* </ParticipantTile>
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @see `ParticipantTile` component
|
|
37
|
+
* @public
|
|
38
|
+
*/
|
|
39
|
+
export const AudioTrack: (
|
|
40
|
+
props: AudioTrackProps & React.RefAttributes<HTMLAudioElement>,
|
|
41
|
+
) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLAudioElement, AudioTrackProps>(
|
|
42
|
+
function AudioTrack(
|
|
43
|
+
{ trackRef, onSubscriptionStatusChanged, volume, ...props }: AudioTrackProps,
|
|
44
|
+
ref,
|
|
45
|
+
) {
|
|
46
|
+
const trackReference = useEnsureTrackRef(trackRef);
|
|
47
|
+
|
|
48
|
+
const mediaEl = React.useRef<HTMLAudioElement>(null);
|
|
49
|
+
React.useImperativeHandle(ref, () => mediaEl.current as HTMLAudioElement);
|
|
50
|
+
|
|
51
|
+
const {
|
|
52
|
+
elementProps,
|
|
53
|
+
isSubscribed,
|
|
54
|
+
track,
|
|
55
|
+
publication: pub,
|
|
56
|
+
} = useMediaTrackBySourceOrName(trackReference, {
|
|
57
|
+
element: mediaEl,
|
|
58
|
+
props,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
React.useEffect(() => {
|
|
62
|
+
onSubscriptionStatusChanged?.(!!isSubscribed);
|
|
63
|
+
}, [isSubscribed, onSubscriptionStatusChanged]);
|
|
64
|
+
|
|
65
|
+
React.useEffect(() => {
|
|
66
|
+
if (track === undefined || volume === undefined) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (track instanceof RemoteAudioTrack) {
|
|
70
|
+
track.setVolume(volume);
|
|
71
|
+
} else {
|
|
72
|
+
log.warn('Volume can only be set on remote audio tracks.');
|
|
73
|
+
}
|
|
74
|
+
}, [volume, track]);
|
|
75
|
+
|
|
76
|
+
React.useEffect(() => {
|
|
77
|
+
if (pub === undefined || props.muted === undefined) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (pub instanceof RemoteTrackPublication) {
|
|
81
|
+
pub.setEnabled(!props.muted);
|
|
82
|
+
} else {
|
|
83
|
+
log.warn('Can only call setEnabled on remote track publications.');
|
|
84
|
+
}
|
|
85
|
+
}, [props.muted, pub, track]);
|
|
86
|
+
|
|
87
|
+
return <audio ref={mediaEl} {...elementProps} />;
|
|
88
|
+
},
|
|
89
|
+
);
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { type TrackReference } from '@livekit/components-core';
|
|
3
|
+
import { useEnsureTrackRef } from '../../context';
|
|
4
|
+
import { useMultibandTrackVolume } from '../../hooks';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @public
|
|
8
|
+
* @deprecated Use BarVisualizer instead
|
|
9
|
+
*/
|
|
10
|
+
export interface AudioVisualizerProps extends React.HTMLAttributes<SVGElement> {
|
|
11
|
+
trackRef?: TrackReference;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The AudioVisualizer component is used to visualize the audio volume of a given audio track.
|
|
16
|
+
* @remarks
|
|
17
|
+
* Requires a `TrackReferenceOrPlaceholder` to be provided either as a property or via the `TrackRefContext`.
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* <AudioVisualizer />
|
|
21
|
+
* ```
|
|
22
|
+
* @public
|
|
23
|
+
* @deprecated Use BarVisualizer instead
|
|
24
|
+
*/
|
|
25
|
+
export const AudioVisualizer: (
|
|
26
|
+
props: AudioVisualizerProps & React.RefAttributes<SVGSVGElement>,
|
|
27
|
+
) => React.ReactNode = /* @__PURE__ */ React.forwardRef<SVGSVGElement, AudioVisualizerProps>(
|
|
28
|
+
function AudioVisualizer({ trackRef, ...props }: AudioVisualizerProps, ref) {
|
|
29
|
+
const svgWidth = 200;
|
|
30
|
+
const svgHeight = 90;
|
|
31
|
+
const barWidth = 6;
|
|
32
|
+
const barSpacing = 4;
|
|
33
|
+
const volMultiplier = 50;
|
|
34
|
+
const barCount = 7;
|
|
35
|
+
const trackReference = useEnsureTrackRef(trackRef);
|
|
36
|
+
|
|
37
|
+
const volumes = useMultibandTrackVolume(trackReference, { bands: 7, loPass: 300 });
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<svg
|
|
41
|
+
ref={ref}
|
|
42
|
+
width="100%"
|
|
43
|
+
height="100%"
|
|
44
|
+
viewBox={`0 0 ${svgWidth} ${svgHeight}`}
|
|
45
|
+
{...props}
|
|
46
|
+
className="lk-audio-visualizer"
|
|
47
|
+
>
|
|
48
|
+
<rect x="0" y="0" width="100%" height="100%" />
|
|
49
|
+
<g
|
|
50
|
+
style={{
|
|
51
|
+
transform: `translate(${(svgWidth - barCount * (barWidth + barSpacing)) / 2}px, 0)`,
|
|
52
|
+
}}
|
|
53
|
+
>
|
|
54
|
+
{volumes.map((vol, idx) => (
|
|
55
|
+
<rect
|
|
56
|
+
key={idx}
|
|
57
|
+
x={idx * (barWidth + barSpacing)}
|
|
58
|
+
y={svgHeight / 2 - (vol * volMultiplier) / 2}
|
|
59
|
+
width={barWidth}
|
|
60
|
+
height={vol * volMultiplier}
|
|
61
|
+
></rect>
|
|
62
|
+
))}
|
|
63
|
+
</g>
|
|
64
|
+
</svg>
|
|
65
|
+
);
|
|
66
|
+
},
|
|
67
|
+
);
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { useBarAnimator } from './animators/useBarAnimator';
|
|
3
|
+
import { useMultibandTrackVolume, type AgentState } from '../../hooks';
|
|
4
|
+
import { type TrackReferenceOrPlaceholder } from '@livekit/components-core';
|
|
5
|
+
import { useMaybeTrackRefContext } from '../../context';
|
|
6
|
+
import { cloneSingleChild, mergeProps } from '../../utils';
|
|
7
|
+
import { LocalAudioTrack, RemoteAudioTrack } from 'livekit-client';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @beta
|
|
11
|
+
*/
|
|
12
|
+
export type BarVisualizerOptions = {
|
|
13
|
+
/** in percentage */
|
|
14
|
+
maxHeight?: number;
|
|
15
|
+
/** in percentage */
|
|
16
|
+
minHeight?: number;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @beta
|
|
21
|
+
*/
|
|
22
|
+
export interface BarVisualizerProps extends React.HTMLProps<HTMLDivElement> {
|
|
23
|
+
/** If set, the visualizer will transition between different voice assistant states */
|
|
24
|
+
state?: AgentState;
|
|
25
|
+
/** Number of bars that show up in the visualizer */
|
|
26
|
+
barCount?: number;
|
|
27
|
+
/** @deprecated use `track` field instead */
|
|
28
|
+
trackRef?: TrackReferenceOrPlaceholder;
|
|
29
|
+
track?: TrackReferenceOrPlaceholder | LocalAudioTrack | RemoteAudioTrack;
|
|
30
|
+
options?: BarVisualizerOptions;
|
|
31
|
+
/** The template component to be used in the visualizer. */
|
|
32
|
+
children?: React.ReactNode;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const sequencerIntervals = new Map<AgentState, number>([
|
|
36
|
+
['connecting', 2000],
|
|
37
|
+
['initializing', 2000],
|
|
38
|
+
['listening', 500],
|
|
39
|
+
['thinking', 150],
|
|
40
|
+
]);
|
|
41
|
+
|
|
42
|
+
const getSequencerInterval = (
|
|
43
|
+
state: AgentState | undefined,
|
|
44
|
+
barCount: number,
|
|
45
|
+
): number | undefined => {
|
|
46
|
+
if (state === undefined) {
|
|
47
|
+
return 1000;
|
|
48
|
+
}
|
|
49
|
+
let interval = sequencerIntervals.get(state);
|
|
50
|
+
if (interval) {
|
|
51
|
+
switch (state) {
|
|
52
|
+
case 'connecting':
|
|
53
|
+
// case 'thinking':
|
|
54
|
+
interval /= barCount;
|
|
55
|
+
break;
|
|
56
|
+
|
|
57
|
+
default:
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return interval;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Visualizes audio signals from a TrackReference as bars.
|
|
65
|
+
* If the `state` prop is set, it automatically transitions between VoiceAssistant states.
|
|
66
|
+
* @beta
|
|
67
|
+
*
|
|
68
|
+
* @remarks For VoiceAssistant state transitions this component requires a voice assistant agent running with livekit-agents \>= 0.9.0
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```tsx
|
|
72
|
+
* function SimpleVoiceAssistant() {
|
|
73
|
+
* const { state, audioTrack } = useVoiceAssistant();
|
|
74
|
+
* return (
|
|
75
|
+
* <BarVisualizer
|
|
76
|
+
* state={state}
|
|
77
|
+
* trackRef={audioTrack}
|
|
78
|
+
* />
|
|
79
|
+
* );
|
|
80
|
+
* }
|
|
81
|
+
* ```
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* Styling the BarVisualizer using CSS classes
|
|
85
|
+
* ```css
|
|
86
|
+
* .lk-audio-bar {
|
|
87
|
+
* // Styles for "idle" bars
|
|
88
|
+
* }
|
|
89
|
+
* .lk-audio-bar.lk-highlighted {
|
|
90
|
+
* // Styles for "active" bars
|
|
91
|
+
* }
|
|
92
|
+
* ```
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* Styling the BarVisualizer using CSS custom properties
|
|
96
|
+
* ```css
|
|
97
|
+
* --lk-fg // for the "active" colour, note that this defines the main foreground colour for the whole "theme"
|
|
98
|
+
* --lk-va-bg // for "idle" colour
|
|
99
|
+
* ```
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* Using a custom bar template for the BarVisualizer
|
|
103
|
+
* ```tsx
|
|
104
|
+
* <BarVisualizer>
|
|
105
|
+
* <div className="all the classes" />
|
|
106
|
+
* </BarVisualizer>
|
|
107
|
+
* ```
|
|
108
|
+
* the highlighted children will get a data prop of data-lk-highlighted for them to switch between active and idle bars in their own template bar
|
|
109
|
+
*/
|
|
110
|
+
export const BarVisualizer = /* @__PURE__ */ React.forwardRef<HTMLDivElement, BarVisualizerProps>(
|
|
111
|
+
function BarVisualizer(
|
|
112
|
+
{ state, options, barCount = 15, trackRef, track, children, ...props }: BarVisualizerProps,
|
|
113
|
+
ref,
|
|
114
|
+
) {
|
|
115
|
+
const elementProps = mergeProps(props, { className: 'lk-audio-bar-visualizer' });
|
|
116
|
+
let targetTrack: TrackReferenceOrPlaceholder | LocalAudioTrack | RemoteAudioTrack | undefined =
|
|
117
|
+
useMaybeTrackRefContext();
|
|
118
|
+
|
|
119
|
+
if (trackRef || track) {
|
|
120
|
+
targetTrack = trackRef || track;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const volumeBands = useMultibandTrackVolume(targetTrack, {
|
|
124
|
+
bands: barCount,
|
|
125
|
+
loPass: 100,
|
|
126
|
+
hiPass: 200,
|
|
127
|
+
});
|
|
128
|
+
const minHeight = options?.minHeight ?? 20;
|
|
129
|
+
const maxHeight = options?.maxHeight ?? 100;
|
|
130
|
+
|
|
131
|
+
const highlightedIndices = useBarAnimator(
|
|
132
|
+
state,
|
|
133
|
+
barCount,
|
|
134
|
+
getSequencerInterval(state, barCount) ?? 100,
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
return (
|
|
138
|
+
<div ref={ref} {...elementProps} data-lk-va-state={state}>
|
|
139
|
+
{volumeBands.map((volume, idx) =>
|
|
140
|
+
children ? (
|
|
141
|
+
cloneSingleChild(children, {
|
|
142
|
+
'data-lk-highlighted': highlightedIndices.includes(idx),
|
|
143
|
+
'data-lk-bar-index': idx,
|
|
144
|
+
className: 'lk-audio-bar',
|
|
145
|
+
style: { height: `${Math.min(maxHeight, Math.max(minHeight, volume * 100 + 5))}%` },
|
|
146
|
+
})
|
|
147
|
+
) : (
|
|
148
|
+
<span
|
|
149
|
+
key={idx}
|
|
150
|
+
data-lk-highlighted={highlightedIndices.includes(idx)}
|
|
151
|
+
data-lk-bar-index={idx}
|
|
152
|
+
className={`lk-audio-bar ${highlightedIndices.includes(idx) && 'lk-highlighted'}`}
|
|
153
|
+
style={{
|
|
154
|
+
// TODO transform animations would be more performant, however the border-radius gets distorted when using scale transforms. a 9-slice approach (or 3 in this case) could work
|
|
155
|
+
// transform: `scale(1, ${Math.min(maxHeight, Math.max(minHeight, volume))}`,
|
|
156
|
+
height: `${Math.min(maxHeight, Math.max(minHeight, volume * 100 + 5))}%`,
|
|
157
|
+
}}
|
|
158
|
+
></span>
|
|
159
|
+
),
|
|
160
|
+
)}
|
|
161
|
+
</div>
|
|
162
|
+
);
|
|
163
|
+
},
|
|
164
|
+
);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { mergeProps } from '../../utils';
|
|
3
|
+
import { getConnectionQualityIcon } from '../../assets/icons/util';
|
|
4
|
+
import type { ConnectionQualityIndicatorOptions } from '../../hooks';
|
|
5
|
+
import { useConnectionQualityIndicator } from '../../hooks';
|
|
6
|
+
|
|
7
|
+
/** @public */
|
|
8
|
+
export interface ConnectionQualityIndicatorProps
|
|
9
|
+
extends React.HTMLAttributes<HTMLDivElement>,
|
|
10
|
+
ConnectionQualityIndicatorOptions {}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The `ConnectionQualityIndicator` shows the individual connection quality of a participant.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* <ConnectionQualityIndicator />
|
|
18
|
+
* ```
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
export const ConnectionQualityIndicator: (
|
|
22
|
+
props: ConnectionQualityIndicatorProps & React.RefAttributes<HTMLDivElement>,
|
|
23
|
+
) => React.ReactNode = /* @__PURE__ */ React.forwardRef<
|
|
24
|
+
HTMLDivElement,
|
|
25
|
+
ConnectionQualityIndicatorProps
|
|
26
|
+
>(function ConnectionQualityIndicator(props: ConnectionQualityIndicatorProps, ref) {
|
|
27
|
+
const { className, quality } = useConnectionQualityIndicator(props);
|
|
28
|
+
const elementProps = React.useMemo(() => {
|
|
29
|
+
return { ...mergeProps(props, { className: className as string }), 'data-lk-quality': quality };
|
|
30
|
+
}, [quality, props, className]);
|
|
31
|
+
return (
|
|
32
|
+
<div ref={ref} {...elementProps}>
|
|
33
|
+
{props.children ?? getConnectionQualityIcon(quality)}
|
|
34
|
+
</div>
|
|
35
|
+
);
|
|
36
|
+
});
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
import { ConnectionQualityIndicator } from './ConnectionQualityIndicator';
|
|
4
|
+
import { ParticipantName } from './ParticipantName';
|
|
5
|
+
import { TrackMutedIndicator } from './TrackMutedIndicator';
|
|
6
|
+
import { TrackRefContext, useEnsureTrackRef } from '../../context';
|
|
7
|
+
|
|
8
|
+
import type { ParticipantTileProps } from './ParticipantTile';
|
|
9
|
+
import { AudioTrack } from './AudioTrack';
|
|
10
|
+
import { useParticipantTile } from '../../hooks';
|
|
11
|
+
import { isTrackReference } from '@livekit/components-core';
|
|
12
|
+
import { BarVisualizer } from './BarVisualizer';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The `ParticipantAudioTile` component is the base utility wrapper for displaying a visual representation of a participant.
|
|
16
|
+
* This component can be used as a child of the `TileLoop` or independently if a participant is passed as a property.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* <ParticipantAudioTile />
|
|
21
|
+
* ```
|
|
22
|
+
* @public
|
|
23
|
+
*/
|
|
24
|
+
export const ParticipantAudioTile: (
|
|
25
|
+
props: ParticipantTileProps & React.RefAttributes<HTMLDivElement>,
|
|
26
|
+
) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLDivElement, ParticipantTileProps>(
|
|
27
|
+
function ParticipantAudioTile(
|
|
28
|
+
{
|
|
29
|
+
children,
|
|
30
|
+
disableSpeakingIndicator,
|
|
31
|
+
onParticipantClick,
|
|
32
|
+
trackRef,
|
|
33
|
+
...htmlProps
|
|
34
|
+
}: ParticipantTileProps,
|
|
35
|
+
ref,
|
|
36
|
+
) {
|
|
37
|
+
const trackReference = useEnsureTrackRef(trackRef);
|
|
38
|
+
const { elementProps } = useParticipantTile({
|
|
39
|
+
trackRef: trackReference,
|
|
40
|
+
htmlProps,
|
|
41
|
+
disableSpeakingIndicator,
|
|
42
|
+
onParticipantClick,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<div ref={ref} style={{ position: 'relative', minHeight: '160px' }} {...elementProps}>
|
|
47
|
+
<TrackRefContext.Provider value={trackReference}>
|
|
48
|
+
{children ?? (
|
|
49
|
+
<>
|
|
50
|
+
{isTrackReference(trackReference) && (
|
|
51
|
+
<AudioTrack trackRef={trackReference}></AudioTrack>
|
|
52
|
+
)}
|
|
53
|
+
<BarVisualizer barCount={7} options={{ minHeight: 8 }} />
|
|
54
|
+
<div className="lk-participant-metadata">
|
|
55
|
+
<div className="lk-participant-metadata-item">
|
|
56
|
+
<TrackMutedIndicator trackRef={trackReference}></TrackMutedIndicator>
|
|
57
|
+
<ParticipantName />
|
|
58
|
+
</div>
|
|
59
|
+
<ConnectionQualityIndicator className="lk-participant-metadata-item" />
|
|
60
|
+
</div>
|
|
61
|
+
</>
|
|
62
|
+
)}
|
|
63
|
+
</TrackRefContext.Provider>
|
|
64
|
+
</div>
|
|
65
|
+
);
|
|
66
|
+
},
|
|
67
|
+
);
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { setupParticipantName } from '@livekit/components-core';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { useEnsureParticipant } from '../../context';
|
|
4
|
+
import { useObservableState } from '../../hooks/internal/useObservableState';
|
|
5
|
+
import { mergeProps } from '../../utils';
|
|
6
|
+
import type { UseParticipantInfoOptions } from '../../hooks';
|
|
7
|
+
|
|
8
|
+
/** @public */
|
|
9
|
+
export interface ParticipantNameProps
|
|
10
|
+
extends React.HTMLAttributes<HTMLSpanElement>,
|
|
11
|
+
UseParticipantInfoOptions {}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The `ParticipantName` component displays the name of the participant as a string within an HTML span element.
|
|
15
|
+
* If no participant name is undefined the participant identity string is displayed.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* <ParticipantName />
|
|
20
|
+
* ```
|
|
21
|
+
* @public
|
|
22
|
+
*/
|
|
23
|
+
export const ParticipantName: (
|
|
24
|
+
props: ParticipantNameProps & React.RefAttributes<HTMLSpanElement>,
|
|
25
|
+
) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLSpanElement, ParticipantNameProps>(
|
|
26
|
+
function ParticipantName({ participant, ...props }: ParticipantNameProps, ref) {
|
|
27
|
+
const p = useEnsureParticipant(participant);
|
|
28
|
+
|
|
29
|
+
const { className, infoObserver } = React.useMemo(() => {
|
|
30
|
+
return setupParticipantName(p);
|
|
31
|
+
}, [p]);
|
|
32
|
+
|
|
33
|
+
const { identity, name } = useObservableState(infoObserver, {
|
|
34
|
+
name: p.name,
|
|
35
|
+
identity: p.identity,
|
|
36
|
+
metadata: p.metadata,
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const mergedProps = React.useMemo(() => {
|
|
40
|
+
return mergeProps(props, { className, 'data-lk-participant-name': name });
|
|
41
|
+
}, [props, className, name]);
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<span ref={ref} {...mergedProps}>
|
|
45
|
+
{name !== '' ? name : identity}
|
|
46
|
+
{props.children}
|
|
47
|
+
</span>
|
|
48
|
+
);
|
|
49
|
+
},
|
|
50
|
+
);
|