@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.
Files changed (488) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +36 -0
  3. package/dist/assets/icons/CameraDisabledIcon.d.ts +11 -0
  4. package/dist/assets/icons/CameraDisabledIcon.d.ts.map +1 -0
  5. package/dist/assets/icons/CameraIcon.d.ts +11 -0
  6. package/dist/assets/icons/CameraIcon.d.ts.map +1 -0
  7. package/dist/assets/icons/ChatCloseIcon.d.ts +11 -0
  8. package/dist/assets/icons/ChatCloseIcon.d.ts.map +1 -0
  9. package/dist/assets/icons/ChatIcon.d.ts +11 -0
  10. package/dist/assets/icons/ChatIcon.d.ts.map +1 -0
  11. package/dist/assets/icons/Chevron.d.ts +11 -0
  12. package/dist/assets/icons/Chevron.d.ts.map +1 -0
  13. package/dist/assets/icons/FocusToggleIcon.d.ts +11 -0
  14. package/dist/assets/icons/FocusToggleIcon.d.ts.map +1 -0
  15. package/dist/assets/icons/GearIcon.d.ts +11 -0
  16. package/dist/assets/icons/GearIcon.d.ts.map +1 -0
  17. package/dist/assets/icons/LeaveIcon.d.ts +11 -0
  18. package/dist/assets/icons/LeaveIcon.d.ts.map +1 -0
  19. package/dist/assets/icons/LockLockedIcon.d.ts +11 -0
  20. package/dist/assets/icons/LockLockedIcon.d.ts.map +1 -0
  21. package/dist/assets/icons/MicDisabledIcon.d.ts +11 -0
  22. package/dist/assets/icons/MicDisabledIcon.d.ts.map +1 -0
  23. package/dist/assets/icons/MicIcon.d.ts +11 -0
  24. package/dist/assets/icons/MicIcon.d.ts.map +1 -0
  25. package/dist/assets/icons/QualityExcellentIcon.d.ts +11 -0
  26. package/dist/assets/icons/QualityExcellentIcon.d.ts.map +1 -0
  27. package/dist/assets/icons/QualityGoodIcon.d.ts +11 -0
  28. package/dist/assets/icons/QualityGoodIcon.d.ts.map +1 -0
  29. package/dist/assets/icons/QualityPoorIcon.d.ts +11 -0
  30. package/dist/assets/icons/QualityPoorIcon.d.ts.map +1 -0
  31. package/dist/assets/icons/QualityUnknownIcon.d.ts +11 -0
  32. package/dist/assets/icons/QualityUnknownIcon.d.ts.map +1 -0
  33. package/dist/assets/icons/ScreenShareIcon.d.ts +11 -0
  34. package/dist/assets/icons/ScreenShareIcon.d.ts.map +1 -0
  35. package/dist/assets/icons/ScreenShareStopIcon.d.ts +11 -0
  36. package/dist/assets/icons/ScreenShareStopIcon.d.ts.map +1 -0
  37. package/dist/assets/icons/SpinnerIcon.d.ts +11 -0
  38. package/dist/assets/icons/SpinnerIcon.d.ts.map +1 -0
  39. package/dist/assets/icons/UnfocusToggleIcon.d.ts +11 -0
  40. package/dist/assets/icons/UnfocusToggleIcon.d.ts.map +1 -0
  41. package/dist/assets/icons/index.d.ts +20 -0
  42. package/dist/assets/icons/index.d.ts.map +1 -0
  43. package/dist/assets/icons/util.d.ts +11 -0
  44. package/dist/assets/icons/util.d.ts.map +1 -0
  45. package/dist/assets/images/ParticipantPlaceholder.d.ts +11 -0
  46. package/dist/assets/images/ParticipantPlaceholder.d.ts.map +1 -0
  47. package/dist/assets/images/index.d.ts +2 -0
  48. package/dist/assets/images/index.d.ts.map +1 -0
  49. package/dist/components/ChatEntry.d.ts +35 -0
  50. package/dist/components/ChatEntry.d.ts.map +1 -0
  51. package/dist/components/ConnectionState.d.ts +23 -0
  52. package/dist/components/ConnectionState.d.ts.map +1 -0
  53. package/dist/components/ConnectionStateToast.d.ts +13 -0
  54. package/dist/components/ConnectionStateToast.d.ts.map +1 -0
  55. package/dist/components/LiveKitRoom.d.ts +92 -0
  56. package/dist/components/LiveKitRoom.d.ts.map +1 -0
  57. package/dist/components/ParticipantLoop.d.ts +28 -0
  58. package/dist/components/ParticipantLoop.d.ts.map +1 -0
  59. package/dist/components/RoomAudioRenderer.d.ts +29 -0
  60. package/dist/components/RoomAudioRenderer.d.ts.map +1 -0
  61. package/dist/components/RoomName.d.ts +20 -0
  62. package/dist/components/RoomName.d.ts.map +1 -0
  63. package/dist/components/SessionProvider.d.ts +13 -0
  64. package/dist/components/SessionProvider.d.ts.map +1 -0
  65. package/dist/components/Toast.d.ts +14 -0
  66. package/dist/components/Toast.d.ts.map +1 -0
  67. package/dist/components/TrackLoop.d.ts +26 -0
  68. package/dist/components/TrackLoop.d.ts.map +1 -0
  69. package/dist/components/controls/ChatToggle.d.ts +19 -0
  70. package/dist/components/controls/ChatToggle.d.ts.map +1 -0
  71. package/dist/components/controls/ClearPinButton.d.ts +20 -0
  72. package/dist/components/controls/ClearPinButton.d.ts.map +1 -0
  73. package/dist/components/controls/DisconnectButton.d.ts +19 -0
  74. package/dist/components/controls/DisconnectButton.d.ts.map +1 -0
  75. package/dist/components/controls/FocusToggle.d.ts +21 -0
  76. package/dist/components/controls/FocusToggle.d.ts.map +1 -0
  77. package/dist/components/controls/MediaDeviceSelect.d.ts +40 -0
  78. package/dist/components/controls/MediaDeviceSelect.d.ts.map +1 -0
  79. package/dist/components/controls/PaginationControl.d.ts +9 -0
  80. package/dist/components/controls/PaginationControl.d.ts.map +1 -0
  81. package/dist/components/controls/PaginationIndicator.d.ts +7 -0
  82. package/dist/components/controls/PaginationIndicator.d.ts.map +1 -0
  83. package/dist/components/controls/SettingsMenuToggle.d.ts +13 -0
  84. package/dist/components/controls/SettingsMenuToggle.d.ts.map +1 -0
  85. package/dist/components/controls/StartAudio.d.ts +24 -0
  86. package/dist/components/controls/StartAudio.d.ts.map +1 -0
  87. package/dist/components/controls/StartMediaButton.d.ts +22 -0
  88. package/dist/components/controls/StartMediaButton.d.ts.map +1 -0
  89. package/dist/components/controls/TrackToggle.d.ts +32 -0
  90. package/dist/components/controls/TrackToggle.d.ts.map +1 -0
  91. package/dist/components/index.d.ts +30 -0
  92. package/dist/components/index.d.ts.map +1 -0
  93. package/dist/components/layout/CarouselLayout.d.ts +27 -0
  94. package/dist/components/layout/CarouselLayout.d.ts.map +1 -0
  95. package/dist/components/layout/FocusLayout.d.ts +25 -0
  96. package/dist/components/layout/FocusLayout.d.ts.map +1 -0
  97. package/dist/components/layout/GridLayout.d.ts +26 -0
  98. package/dist/components/layout/GridLayout.d.ts.map +1 -0
  99. package/dist/components/layout/LayoutContextProvider.d.ts +12 -0
  100. package/dist/components/layout/LayoutContextProvider.d.ts.map +1 -0
  101. package/dist/components/layout/index.d.ts +4 -0
  102. package/dist/components/layout/index.d.ts.map +1 -0
  103. package/dist/components/participant/AudioTrack.d.ts +33 -0
  104. package/dist/components/participant/AudioTrack.d.ts.map +1 -0
  105. package/dist/components/participant/AudioVisualizer.d.ts +22 -0
  106. package/dist/components/participant/AudioVisualizer.d.ts.map +1 -0
  107. package/dist/components/participant/BarVisualizer.d.ts +77 -0
  108. package/dist/components/participant/BarVisualizer.d.ts.map +1 -0
  109. package/dist/components/participant/ConnectionQualityIndicator.d.ts +16 -0
  110. package/dist/components/participant/ConnectionQualityIndicator.d.ts.map +1 -0
  111. package/dist/components/participant/ParticipantAudioTile.d.ts +14 -0
  112. package/dist/components/participant/ParticipantAudioTile.d.ts.map +1 -0
  113. package/dist/components/participant/ParticipantName.d.ts +17 -0
  114. package/dist/components/participant/ParticipantName.d.ts.map +1 -0
  115. package/dist/components/participant/ParticipantTile.d.ts +49 -0
  116. package/dist/components/participant/ParticipantTile.d.ts.map +1 -0
  117. package/dist/components/participant/TrackMutedIndicator.d.ts +19 -0
  118. package/dist/components/participant/TrackMutedIndicator.d.ts.map +1 -0
  119. package/dist/components/participant/VideoTrack.d.ts +23 -0
  120. package/dist/components/participant/VideoTrack.d.ts.map +1 -0
  121. package/dist/components/participant/animationSequences/connectingSequence.d.ts +2 -0
  122. package/dist/components/participant/animationSequences/connectingSequence.d.ts.map +1 -0
  123. package/dist/components/participant/animationSequences/listeningSequence.d.ts +2 -0
  124. package/dist/components/participant/animationSequences/listeningSequence.d.ts.map +1 -0
  125. package/dist/components/participant/animationSequences/thinkingSequence.d.ts +2 -0
  126. package/dist/components/participant/animationSequences/thinkingSequence.d.ts.map +1 -0
  127. package/dist/components/participant/animators/useBarAnimator.d.ts +3 -0
  128. package/dist/components/participant/animators/useBarAnimator.d.ts.map +1 -0
  129. package/dist/components-lNrIMTWQ.mjs +1051 -0
  130. package/dist/components-lNrIMTWQ.mjs.map +1 -0
  131. package/dist/context/chat-context.d.ts +23 -0
  132. package/dist/context/chat-context.d.ts.map +1 -0
  133. package/dist/context/feature-context.d.ts +14 -0
  134. package/dist/context/feature-context.d.ts.map +1 -0
  135. package/dist/context/index.d.ts +10 -0
  136. package/dist/context/index.d.ts.map +1 -0
  137. package/dist/context/layout-context.d.ts +32 -0
  138. package/dist/context/layout-context.d.ts.map +1 -0
  139. package/dist/context/participant-context.d.ts +22 -0
  140. package/dist/context/participant-context.d.ts.map +1 -0
  141. package/dist/context/pin-context.d.ts +17 -0
  142. package/dist/context/pin-context.d.ts.map +1 -0
  143. package/dist/context/room-context.d.ts +22 -0
  144. package/dist/context/room-context.d.ts.map +1 -0
  145. package/dist/context/session-context.d.ts +22 -0
  146. package/dist/context/session-context.d.ts.map +1 -0
  147. package/dist/context/track-reference-context.d.ts +25 -0
  148. package/dist/context/track-reference-context.d.ts.map +1 -0
  149. package/dist/contexts-D4V9wQRc.mjs +4026 -0
  150. package/dist/contexts-D4V9wQRc.mjs.map +1 -0
  151. package/dist/hooks/cloud/krisp/useKrispNoiseFilter.d.ts +42 -0
  152. package/dist/hooks/cloud/krisp/useKrispNoiseFilter.d.ts.map +1 -0
  153. package/dist/hooks/index.d.ts +54 -0
  154. package/dist/hooks/index.d.ts.map +1 -0
  155. package/dist/hooks/internal/index.d.ts +10 -0
  156. package/dist/hooks/internal/index.d.ts.map +1 -0
  157. package/dist/hooks/internal/useMediaQuery.d.ts +7 -0
  158. package/dist/hooks/internal/useMediaQuery.d.ts.map +1 -0
  159. package/dist/hooks/internal/useObservableState.d.ts +6 -0
  160. package/dist/hooks/internal/useObservableState.d.ts.map +1 -0
  161. package/dist/hooks/internal/useResizeObserver.d.ts +14 -0
  162. package/dist/hooks/internal/useResizeObserver.d.ts.map +1 -0
  163. package/dist/hooks/useAgent.d.ts +219 -0
  164. package/dist/hooks/useAgent.d.ts.map +1 -0
  165. package/dist/hooks/useAudioPlayback.d.ts +15 -0
  166. package/dist/hooks/useAudioPlayback.d.ts.map +1 -0
  167. package/dist/hooks/useChat.d.ts +43 -0
  168. package/dist/hooks/useChat.d.ts.map +1 -0
  169. package/dist/hooks/useChatToggle.d.ts +21 -0
  170. package/dist/hooks/useChatToggle.d.ts.map +1 -0
  171. package/dist/hooks/useClearPinButton.d.ts +15 -0
  172. package/dist/hooks/useClearPinButton.d.ts.map +1 -0
  173. package/dist/hooks/useConnectionQualityIndicator.d.ts +20 -0
  174. package/dist/hooks/useConnectionQualityIndicator.d.ts.map +1 -0
  175. package/dist/hooks/useConnectionStatus.d.ts +12 -0
  176. package/dist/hooks/useConnectionStatus.d.ts.map +1 -0
  177. package/dist/hooks/useDataChannel.d.ts +38 -0
  178. package/dist/hooks/useDataChannel.d.ts.map +1 -0
  179. package/dist/hooks/useDisconnectButton.d.ts +21 -0
  180. package/dist/hooks/useDisconnectButton.d.ts.map +1 -0
  181. package/dist/hooks/useEvents.d.ts +9 -0
  182. package/dist/hooks/useEvents.d.ts.map +1 -0
  183. package/dist/hooks/useFacingMode.d.ts +10 -0
  184. package/dist/hooks/useFacingMode.d.ts.map +1 -0
  185. package/dist/hooks/useFocusToggle.d.ts +26 -0
  186. package/dist/hooks/useFocusToggle.d.ts.map +1 -0
  187. package/dist/hooks/useGridLayout.d.ts +27 -0
  188. package/dist/hooks/useGridLayout.d.ts.map +1 -0
  189. package/dist/hooks/useIsEncrypted.d.ts +12 -0
  190. package/dist/hooks/useIsEncrypted.d.ts.map +1 -0
  191. package/dist/hooks/useIsMuted.d.ts +22 -0
  192. package/dist/hooks/useIsMuted.d.ts.map +1 -0
  193. package/dist/hooks/useIsRecording.d.ts +11 -0
  194. package/dist/hooks/useIsRecording.d.ts.map +1 -0
  195. package/dist/hooks/useIsSpeaking.d.ts +11 -0
  196. package/dist/hooks/useIsSpeaking.d.ts.map +1 -0
  197. package/dist/hooks/useLiveKitRoom.d.ts +19 -0
  198. package/dist/hooks/useLiveKitRoom.d.ts.map +1 -0
  199. package/dist/hooks/useLocalParticipant.d.ts +29 -0
  200. package/dist/hooks/useLocalParticipant.d.ts.map +1 -0
  201. package/dist/hooks/useLocalParticipantPermissions.d.ts +12 -0
  202. package/dist/hooks/useLocalParticipantPermissions.d.ts.map +1 -0
  203. package/dist/hooks/useMediaDeviceSelect.d.ts +41 -0
  204. package/dist/hooks/useMediaDeviceSelect.d.ts.map +1 -0
  205. package/dist/hooks/useMediaDevices.d.ts +15 -0
  206. package/dist/hooks/useMediaDevices.d.ts.map +1 -0
  207. package/dist/hooks/useMediaTrackBySourceOrName.d.ts +18 -0
  208. package/dist/hooks/useMediaTrackBySourceOrName.d.ts.map +1 -0
  209. package/dist/hooks/usePagination.d.ts +24 -0
  210. package/dist/hooks/usePagination.d.ts.map +1 -0
  211. package/dist/hooks/useParticipantAttributes.d.ts +30 -0
  212. package/dist/hooks/useParticipantAttributes.d.ts.map +1 -0
  213. package/dist/hooks/useParticipantInfo.d.ts +21 -0
  214. package/dist/hooks/useParticipantInfo.d.ts.map +1 -0
  215. package/dist/hooks/useParticipantPermissions.d.ts +17 -0
  216. package/dist/hooks/useParticipantPermissions.d.ts.map +1 -0
  217. package/dist/hooks/useParticipantTile.d.ts +22 -0
  218. package/dist/hooks/useParticipantTile.d.ts.map +1 -0
  219. package/dist/hooks/useParticipantTracks.d.ts +14 -0
  220. package/dist/hooks/useParticipantTracks.d.ts.map +1 -0
  221. package/dist/hooks/useParticipants.d.ts +30 -0
  222. package/dist/hooks/useParticipants.d.ts.map +1 -0
  223. package/dist/hooks/usePersistentUserChoices.d.ts +35 -0
  224. package/dist/hooks/usePersistentUserChoices.d.ts.map +1 -0
  225. package/dist/hooks/usePinnedTracks.d.ts +14 -0
  226. package/dist/hooks/usePinnedTracks.d.ts.map +1 -0
  227. package/dist/hooks/useRemoteParticipant.d.ts +35 -0
  228. package/dist/hooks/useRemoteParticipant.d.ts.map +1 -0
  229. package/dist/hooks/useRemoteParticipants.d.ts +30 -0
  230. package/dist/hooks/useRemoteParticipants.d.ts.map +1 -0
  231. package/dist/hooks/useRoomInfo.d.ts +21 -0
  232. package/dist/hooks/useRoomInfo.d.ts.map +1 -0
  233. package/dist/hooks/useSequentialRoomConnectDisconnect.d.ts +27 -0
  234. package/dist/hooks/useSequentialRoomConnectDisconnect.d.ts.map +1 -0
  235. package/dist/hooks/useSession.d.ts +130 -0
  236. package/dist/hooks/useSession.d.ts.map +1 -0
  237. package/dist/hooks/useSessionMessages.d.ts +29 -0
  238. package/dist/hooks/useSessionMessages.d.ts.map +1 -0
  239. package/dist/hooks/useSettingsToggle.d.ts +20 -0
  240. package/dist/hooks/useSettingsToggle.d.ts.map +1 -0
  241. package/dist/hooks/useSortedParticipants.d.ts +7 -0
  242. package/dist/hooks/useSortedParticipants.d.ts.map +1 -0
  243. package/dist/hooks/useSpeakingParticipants.d.ts +16 -0
  244. package/dist/hooks/useSpeakingParticipants.d.ts.map +1 -0
  245. package/dist/hooks/useStartAudio.d.ts +27 -0
  246. package/dist/hooks/useStartAudio.d.ts.map +1 -0
  247. package/dist/hooks/useStartVideo.d.ts +26 -0
  248. package/dist/hooks/useStartVideo.d.ts.map +1 -0
  249. package/dist/hooks/useSwipe.d.ts +24 -0
  250. package/dist/hooks/useSwipe.d.ts.map +1 -0
  251. package/dist/hooks/useTextStream.d.ts +20 -0
  252. package/dist/hooks/useTextStream.d.ts.map +1 -0
  253. package/dist/hooks/useToken.d.ts +20 -0
  254. package/dist/hooks/useToken.d.ts.map +1 -0
  255. package/dist/hooks/useTrack.d.ts +4 -0
  256. package/dist/hooks/useTrack.d.ts.map +1 -0
  257. package/dist/hooks/useTrackByName.d.ts +10 -0
  258. package/dist/hooks/useTrackByName.d.ts.map +1 -0
  259. package/dist/hooks/useTrackMutedIndicator.d.ts +18 -0
  260. package/dist/hooks/useTrackMutedIndicator.d.ts.map +1 -0
  261. package/dist/hooks/useTrackRefBySourceOrName.d.ts +7 -0
  262. package/dist/hooks/useTrackRefBySourceOrName.d.ts.map +1 -0
  263. package/dist/hooks/useTrackSyncTime.d.ts +10 -0
  264. package/dist/hooks/useTrackSyncTime.d.ts.map +1 -0
  265. package/dist/hooks/useTrackToggle.d.ts +27 -0
  266. package/dist/hooks/useTrackToggle.d.ts.map +1 -0
  267. package/dist/hooks/useTrackTranscription.d.ts +26 -0
  268. package/dist/hooks/useTrackTranscription.d.ts.map +1 -0
  269. package/dist/hooks/useTrackVolume.d.ts +49 -0
  270. package/dist/hooks/useTrackVolume.d.ts.map +1 -0
  271. package/dist/hooks/useTracks.d.ts +29 -0
  272. package/dist/hooks/useTracks.d.ts.map +1 -0
  273. package/dist/hooks/useTranscriptions.d.ts +21 -0
  274. package/dist/hooks/useTranscriptions.d.ts.map +1 -0
  275. package/dist/hooks/useVisualStableUpdate.d.ts +27 -0
  276. package/dist/hooks/useVisualStableUpdate.d.ts.map +1 -0
  277. package/dist/hooks/useVoiceAssistant.d.ts +43 -0
  278. package/dist/hooks/useVoiceAssistant.d.ts.map +1 -0
  279. package/dist/hooks/useWarnAboutMissingStyles.d.ts +5 -0
  280. package/dist/hooks/useWarnAboutMissingStyles.d.ts.map +1 -0
  281. package/dist/hooks-hQJmeINB.mjs +1992 -0
  282. package/dist/hooks-hQJmeINB.mjs.map +1 -0
  283. package/dist/hooks.d.ts +2 -0
  284. package/dist/hooks.js +2 -0
  285. package/dist/hooks.js.map +1 -0
  286. package/dist/hooks.mjs +64 -0
  287. package/dist/hooks.mjs.map +1 -0
  288. package/dist/index.d.ts +9 -0
  289. package/dist/index.d.ts.map +1 -0
  290. package/dist/index.docs.d.ts +6 -0
  291. package/dist/index.docs.d.ts.map +1 -0
  292. package/dist/index.js +2 -0
  293. package/dist/index.js.map +1 -0
  294. package/dist/index.mjs +157 -0
  295. package/dist/index.mjs.map +1 -0
  296. package/dist/krisp.d.ts +2 -0
  297. package/dist/krisp.js +2 -0
  298. package/dist/krisp.js.map +1 -0
  299. package/dist/krisp.mjs +45 -0
  300. package/dist/krisp.mjs.map +1 -0
  301. package/dist/mergeProps.d.ts +25 -0
  302. package/dist/mergeProps.d.ts.map +1 -0
  303. package/dist/prefabs/AudioConference.d.ts +22 -0
  304. package/dist/prefabs/AudioConference.d.ts.map +1 -0
  305. package/dist/prefabs/Chat.d.ts +35 -0
  306. package/dist/prefabs/Chat.d.ts.map +1 -0
  307. package/dist/prefabs/ControlBar.d.ts +45 -0
  308. package/dist/prefabs/ControlBar.d.ts.map +1 -0
  309. package/dist/prefabs/MediaDeviceMenu.d.ts +36 -0
  310. package/dist/prefabs/MediaDeviceMenu.d.ts.map +1 -0
  311. package/dist/prefabs/PreJoin.d.ts +59 -0
  312. package/dist/prefabs/PreJoin.d.ts.map +1 -0
  313. package/dist/prefabs/VideoConference.d.ts +35 -0
  314. package/dist/prefabs/VideoConference.d.ts.map +1 -0
  315. package/dist/prefabs/VoiceAssistantControlBar.d.ts +32 -0
  316. package/dist/prefabs/VoiceAssistantControlBar.d.ts.map +1 -0
  317. package/dist/prefabs/index.d.ts +8 -0
  318. package/dist/prefabs/index.d.ts.map +1 -0
  319. package/dist/prefabs.d.ts +2 -0
  320. package/dist/prefabs.js +2 -0
  321. package/dist/prefabs.js.map +1 -0
  322. package/dist/prefabs.mjs +579 -0
  323. package/dist/prefabs.mjs.map +1 -0
  324. package/dist/room-BP3SCCCd.mjs +191 -0
  325. package/dist/room-BP3SCCCd.mjs.map +1 -0
  326. package/dist/shared-88J2fzv7.js +2 -0
  327. package/dist/shared-88J2fzv7.js.map +1 -0
  328. package/dist/shared-BDr0qLg4.js +4 -0
  329. package/dist/shared-BDr0qLg4.js.map +1 -0
  330. package/dist/shared-CjI_UuOX.js +2 -0
  331. package/dist/shared-CjI_UuOX.js.map +1 -0
  332. package/dist/shared-DTHOl3uJ.js +2 -0
  333. package/dist/shared-DTHOl3uJ.js.map +1 -0
  334. package/dist/utils.d.ts +19 -0
  335. package/dist/utils.d.ts.map +1 -0
  336. package/package.json +104 -0
  337. package/src/assets/icons/CameraDisabledIcon.tsx +15 -0
  338. package/src/assets/icons/CameraIcon.tsx +14 -0
  339. package/src/assets/icons/ChatCloseIcon.tsx +17 -0
  340. package/src/assets/icons/ChatIcon.tsx +25 -0
  341. package/src/assets/icons/Chevron.tsx +19 -0
  342. package/src/assets/icons/FocusToggleIcon.tsx +16 -0
  343. package/src/assets/icons/GearIcon.tsx +19 -0
  344. package/src/assets/icons/LeaveIcon.tsx +25 -0
  345. package/src/assets/icons/LockLockedIcon.tsx +19 -0
  346. package/src/assets/icons/MicDisabledIcon.tsx +15 -0
  347. package/src/assets/icons/MicIcon.tsx +19 -0
  348. package/src/assets/icons/QualityExcellentIcon.tsx +15 -0
  349. package/src/assets/icons/QualityGoodIcon.tsx +19 -0
  350. package/src/assets/icons/QualityPoorIcon.tsx +20 -0
  351. package/src/assets/icons/QualityUnknownIcon.tsx +17 -0
  352. package/src/assets/icons/ScreenShareIcon.tsx +25 -0
  353. package/src/assets/icons/ScreenShareStopIcon.tsx +21 -0
  354. package/src/assets/icons/SpinnerIcon.tsx +93 -0
  355. package/src/assets/icons/UnfocusToggleIcon.tsx +16 -0
  356. package/src/assets/icons/index.ts +19 -0
  357. package/src/assets/icons/util.tsx +47 -0
  358. package/src/assets/images/ParticipantPlaceholder.tsx +31 -0
  359. package/src/assets/images/index.ts +1 -0
  360. package/src/assets/template.js +21 -0
  361. package/src/components/ChatEntry.tsx +112 -0
  362. package/src/components/ConnectionState.tsx +36 -0
  363. package/src/components/ConnectionStateToast.tsx +47 -0
  364. package/src/components/LiveKitRoom.tsx +122 -0
  365. package/src/components/ParticipantLoop.tsx +41 -0
  366. package/src/components/RoomAudioRenderer.tsx +57 -0
  367. package/src/components/RoomName.tsx +36 -0
  368. package/src/components/SessionProvider.tsx +22 -0
  369. package/src/components/Toast.tsx +18 -0
  370. package/src/components/TrackLoop.tsx +45 -0
  371. package/src/components/controls/ChatToggle.tsx +32 -0
  372. package/src/components/controls/ClearPinButton.tsx +32 -0
  373. package/src/components/controls/DisconnectButton.tsx +32 -0
  374. package/src/components/controls/FocusToggle.tsx +54 -0
  375. package/src/components/controls/MediaDeviceSelect.tsx +144 -0
  376. package/src/components/controls/PaginationControl.tsx +51 -0
  377. package/src/components/controls/PaginationIndicator.tsx +26 -0
  378. package/src/components/controls/SettingsMenuToggle.tsx +26 -0
  379. package/src/components/controls/StartAudio.tsx +40 -0
  380. package/src/components/controls/StartMediaButton.tsx +41 -0
  381. package/src/components/controls/TrackToggle.tsx +54 -0
  382. package/src/components/index.ts +34 -0
  383. package/src/components/layout/CarouselLayout.tsx +80 -0
  384. package/src/components/layout/FocusLayout.tsx +37 -0
  385. package/src/components/layout/GridLayout.tsx +63 -0
  386. package/src/components/layout/LayoutContextProvider.tsx +36 -0
  387. package/src/components/layout/index.ts +3 -0
  388. package/src/components/participant/AudioTrack.tsx +89 -0
  389. package/src/components/participant/AudioVisualizer.tsx +67 -0
  390. package/src/components/participant/BarVisualizer.tsx +164 -0
  391. package/src/components/participant/ConnectionQualityIndicator.tsx +36 -0
  392. package/src/components/participant/ParticipantAudioTile.tsx +67 -0
  393. package/src/components/participant/ParticipantName.tsx +50 -0
  394. package/src/components/participant/ParticipantTile.tsx +192 -0
  395. package/src/components/participant/TrackMutedIndicator.tsx +53 -0
  396. package/src/components/participant/VideoTrack.tsx +92 -0
  397. package/src/components/participant/animationSequences/connectingSequence.ts +9 -0
  398. package/src/components/participant/animationSequences/listeningSequence.ts +6 -0
  399. package/src/components/participant/animationSequences/thinkingSequence.ts +12 -0
  400. package/src/components/participant/animators/useBarAnimator.ts +55 -0
  401. package/src/context/chat-context.ts +37 -0
  402. package/src/context/feature-context.ts +28 -0
  403. package/src/context/index.ts +27 -0
  404. package/src/context/layout-context.ts +72 -0
  405. package/src/context/participant-context.ts +44 -0
  406. package/src/context/pin-context.ts +27 -0
  407. package/src/context/room-context.ts +42 -0
  408. package/src/context/session-context.ts +43 -0
  409. package/src/context/track-reference-context.ts +47 -0
  410. package/src/hooks/cloud/krisp/useKrispNoiseFilter.ts +110 -0
  411. package/src/hooks/index.ts +72 -0
  412. package/src/hooks/internal/index.ts +10 -0
  413. package/src/hooks/internal/useMediaQuery.ts +46 -0
  414. package/src/hooks/internal/useObservableState.ts +24 -0
  415. package/src/hooks/internal/useResizeObserver.ts +124 -0
  416. package/src/hooks/useAgent.ts +945 -0
  417. package/src/hooks/useAudioPlayback.ts +34 -0
  418. package/src/hooks/useChat.ts +57 -0
  419. package/src/hooks/useChatToggle.ts +38 -0
  420. package/src/hooks/useClearPinButton.ts +29 -0
  421. package/src/hooks/useConnectionQualityIndicator.ts +33 -0
  422. package/src/hooks/useConnectionStatus.ts +22 -0
  423. package/src/hooks/useDataChannel.ts +73 -0
  424. package/src/hooks/useDisconnectButton.ts +36 -0
  425. package/src/hooks/useEvents.ts +39 -0
  426. package/src/hooks/useFacingMode.ts +22 -0
  427. package/src/hooks/useFocusToggle.ts +59 -0
  428. package/src/hooks/useGridLayout.ts +44 -0
  429. package/src/hooks/useIsEncrypted.ts +29 -0
  430. package/src/hooks/useIsMuted.ts +51 -0
  431. package/src/hooks/useIsRecording.ts +23 -0
  432. package/src/hooks/useIsSpeaking.ts +21 -0
  433. package/src/hooks/useLiveKitRoom.ts +186 -0
  434. package/src/hooks/useLocalParticipant.ts +73 -0
  435. package/src/hooks/useLocalParticipantPermissions.ts +24 -0
  436. package/src/hooks/useMediaDeviceSelect.ts +81 -0
  437. package/src/hooks/useMediaDevices.ts +28 -0
  438. package/src/hooks/useMediaTrackBySourceOrName.ts +97 -0
  439. package/src/hooks/usePagination.test.ts +77 -0
  440. package/src/hooks/usePagination.ts +67 -0
  441. package/src/hooks/useParticipantAttributes.ts +69 -0
  442. package/src/hooks/useParticipantInfo.ts +35 -0
  443. package/src/hooks/useParticipantPermissions.ts +29 -0
  444. package/src/hooks/useParticipantTile.ts +81 -0
  445. package/src/hooks/useParticipantTracks.ts +54 -0
  446. package/src/hooks/useParticipants.ts +42 -0
  447. package/src/hooks/usePersistentUserChoices.ts +64 -0
  448. package/src/hooks/usePinnedTracks.ts +24 -0
  449. package/src/hooks/useRemoteParticipant.ts +79 -0
  450. package/src/hooks/useRemoteParticipants.ts +45 -0
  451. package/src/hooks/useRoomInfo.ts +32 -0
  452. package/src/hooks/useSequentialRoomConnectDisconnect.ts +171 -0
  453. package/src/hooks/useSession.ts +642 -0
  454. package/src/hooks/useSessionMessages.ts +158 -0
  455. package/src/hooks/useSettingsToggle.ts +32 -0
  456. package/src/hooks/useSortedParticipants.ts +20 -0
  457. package/src/hooks/useSpeakingParticipants.ts +27 -0
  458. package/src/hooks/useStartAudio.ts +50 -0
  459. package/src/hooks/useStartVideo.ts +49 -0
  460. package/src/hooks/useSwipe.ts +68 -0
  461. package/src/hooks/useTextStream.ts +35 -0
  462. package/src/hooks/useToken.ts +54 -0
  463. package/src/hooks/useTrack.ts +11 -0
  464. package/src/hooks/useTrackByName.ts +15 -0
  465. package/src/hooks/useTrackMutedIndicator.ts +44 -0
  466. package/src/hooks/useTrackRefBySourceOrName.ts +30 -0
  467. package/src/hooks/useTrackSyncTime.ts +18 -0
  468. package/src/hooks/useTrackToggle.ts +93 -0
  469. package/src/hooks/useTrackTranscription.ts +75 -0
  470. package/src/hooks/useTrackVolume.ts +283 -0
  471. package/src/hooks/useTracks.test.ts +60 -0
  472. package/src/hooks/useTracks.ts +154 -0
  473. package/src/hooks/useTranscriptions.ts +48 -0
  474. package/src/hooks/useVisualStableUpdate.ts +63 -0
  475. package/src/hooks/useVoiceAssistant.ts +109 -0
  476. package/src/hooks/useWarnAboutMissingStyles.ts +11 -0
  477. package/src/index.docs.ts +12 -0
  478. package/src/index.ts +32 -0
  479. package/src/mergeProps.ts +87 -0
  480. package/src/prefabs/AudioConference.tsx +57 -0
  481. package/src/prefabs/Chat.tsx +153 -0
  482. package/src/prefabs/ControlBar.tsx +227 -0
  483. package/src/prefabs/MediaDeviceMenu.tsx +159 -0
  484. package/src/prefabs/PreJoin.tsx +439 -0
  485. package/src/prefabs/VideoConference.tsx +184 -0
  486. package/src/prefabs/VoiceAssistantControlBar.tsx +109 -0
  487. package/src/prefabs/index.ts +11 -0
  488. package/src/utils.ts +78 -0
@@ -0,0 +1,158 @@
1
+ import * as React from 'react';
2
+ import type TypedEventEmitter from 'typed-emitter';
3
+ import { SendTextOptions } from 'livekit-client';
4
+ import { EventEmitter } from 'events';
5
+ import {
6
+ ReceivedMessage,
7
+ ReceivedChatMessage,
8
+ TextStreamData,
9
+ ReceivedUserTranscriptionMessage,
10
+ ReceivedAgentTranscriptionMessage,
11
+ } from '@livekit/components-core';
12
+
13
+ import { useAgent } from './useAgent';
14
+ import { useTranscriptions } from './useTranscriptions';
15
+ import { useChat } from './useChat';
16
+ import { UseSessionReturn } from './useSession';
17
+ import { useEnsureSession } from '../context';
18
+
19
+ /** @beta */
20
+ export type UseSessionMessagesReturn = {
21
+ messages: Array<ReceivedMessage>;
22
+
23
+ /** Is a send operation currently in progress? */
24
+ isSending: boolean;
25
+
26
+ send: (message: string, options?: SendTextOptions) => Promise<ReceivedChatMessage>;
27
+
28
+ internal: {
29
+ emitter: TypedEventEmitter<MessagesCallbacks>;
30
+ };
31
+ };
32
+
33
+ /** @beta */
34
+ export enum MessagesEvent {
35
+ /**
36
+ * Emits when a new message is received from a participant
37
+ * args: (message: ReceivedMessage)
38
+ */
39
+ MessageReceived = 'messageReceived',
40
+ }
41
+
42
+ /** @beta */
43
+ export type MessagesCallbacks = {
44
+ [MessagesEvent.MessageReceived]: (message: ReceivedMessage) => void;
45
+ };
46
+
47
+ /** @beta */
48
+ export function useSessionMessages(session?: UseSessionReturn): UseSessionMessagesReturn {
49
+ const { room } = useEnsureSession(session);
50
+
51
+ const emitter = React.useMemo(
52
+ () => new EventEmitter() as TypedEventEmitter<MessagesCallbacks>,
53
+ [],
54
+ );
55
+
56
+ const agent = useAgent(session);
57
+
58
+ const transcriptions: Array<TextStreamData> = useTranscriptions({ room });
59
+ const chatOptions = React.useMemo(() => ({ room }), [room]);
60
+ const chat = useChat(chatOptions);
61
+
62
+ const transcriptionMessages: Array<
63
+ ReceivedUserTranscriptionMessage | ReceivedAgentTranscriptionMessage
64
+ > = React.useMemo(() => {
65
+ return transcriptions.map((transcription) => {
66
+ switch (transcription.participantInfo.identity) {
67
+ case room.localParticipant.identity:
68
+ return {
69
+ type: 'userTranscript',
70
+ message: transcription.text,
71
+
72
+ id: transcription.streamInfo.id,
73
+ timestamp: transcription.streamInfo.timestamp,
74
+ from: room.localParticipant,
75
+ };
76
+
77
+ case agent.internal.agentParticipant?.identity:
78
+ case agent.internal.workerParticipant?.identity:
79
+ return {
80
+ type: 'agentTranscript',
81
+ message: transcription.text,
82
+
83
+ id: transcription.streamInfo.id,
84
+ timestamp: transcription.streamInfo.timestamp,
85
+ from:
86
+ agent.internal.agentParticipant?.identity === transcription.participantInfo.identity
87
+ ? agent.internal.agentParticipant
88
+ : agent.internal.workerParticipant!,
89
+ };
90
+
91
+ default:
92
+ // FIXME: what should happen if an associated participant is not found?
93
+ //
94
+ // For now, just assume it is an agent transcription, since maybe it is from an agent
95
+ // which disconencted from the room or something like that.
96
+ return {
97
+ type: 'agentTranscript',
98
+ message: transcription.text,
99
+
100
+ id: transcription.streamInfo.id,
101
+ timestamp: transcription.streamInfo.timestamp,
102
+ from: Array.from(room.remoteParticipants.values()).find(
103
+ (p) => p.identity === transcription.participantInfo.identity,
104
+ ),
105
+ };
106
+ }
107
+ });
108
+ }, [transcriptions, room]);
109
+
110
+ const receivedMessages = React.useMemo(() => {
111
+ const merged: Array<ReceivedMessage> = [...transcriptionMessages, ...chat.chatMessages];
112
+ return merged;
113
+ }, [transcriptionMessages, chat.chatMessages]);
114
+
115
+ const messageFirstReceivedTimeMapRef = React.useRef(new Map<ReceivedMessage['id'], Date>());
116
+ const sortedReceivedMessages = React.useMemo(() => {
117
+ const now = new Date();
118
+ for (const message of receivedMessages) {
119
+ if (messageFirstReceivedTimeMapRef.current.has(message.id)) {
120
+ continue;
121
+ }
122
+
123
+ messageFirstReceivedTimeMapRef.current.set(message.id, now);
124
+ }
125
+
126
+ return receivedMessages.sort((a, b) => {
127
+ const aFirstReceivedAt = messageFirstReceivedTimeMapRef.current.get(a.id);
128
+ const bFirstReceivedAt = messageFirstReceivedTimeMapRef.current.get(b.id);
129
+ if (typeof aFirstReceivedAt === 'undefined' || typeof bFirstReceivedAt === 'undefined') {
130
+ return 0;
131
+ }
132
+
133
+ return aFirstReceivedAt.getTime() - bFirstReceivedAt.getTime();
134
+ });
135
+ }, [receivedMessages]);
136
+
137
+ const previouslyReceivedMessageIdsRef = React.useRef(new Set());
138
+ React.useEffect(() => {
139
+ for (const message of sortedReceivedMessages) {
140
+ if (previouslyReceivedMessageIdsRef.current.has(message.id)) {
141
+ continue;
142
+ }
143
+
144
+ previouslyReceivedMessageIdsRef.current.add(message.id);
145
+ emitter.emit(MessagesEvent.MessageReceived, message);
146
+ }
147
+ }, [sortedReceivedMessages]);
148
+
149
+ return React.useMemo(
150
+ () => ({
151
+ messages: sortedReceivedMessages,
152
+ send: chat.send,
153
+ isSending: chat.isSending,
154
+ internal: { emitter },
155
+ }),
156
+ [sortedReceivedMessages, chat.send, chat.isSending],
157
+ );
158
+ }
@@ -0,0 +1,32 @@
1
+ import { useLayoutContext } from '../context';
2
+ import { mergeProps } from '../mergeProps';
3
+ import * as React from 'react';
4
+
5
+ /** @alpha */
6
+ export interface UseSettingsToggleProps {
7
+ props: React.ButtonHTMLAttributes<HTMLButtonElement>;
8
+ }
9
+
10
+ /**
11
+ * The `useSettingsToggle` hook provides state and functions for toggling the settings menu.
12
+ * @remarks
13
+ * Depends on the `LayoutContext` to work properly.
14
+ * @see {@link SettingsMenu}
15
+ * @alpha
16
+ */
17
+ export function useSettingsToggle({ props }: UseSettingsToggleProps) {
18
+ const { dispatch, state } = useLayoutContext().widget;
19
+ const className = 'lk-button lk-settings-toggle';
20
+
21
+ const mergedProps = React.useMemo(() => {
22
+ return mergeProps(props, {
23
+ className,
24
+ onClick: () => {
25
+ if (dispatch) dispatch({ msg: 'toggle_settings' });
26
+ },
27
+ 'aria-pressed': state?.showSettings ? 'true' : 'false',
28
+ });
29
+ }, [props, className, dispatch, state]);
30
+
31
+ return { mergedProps };
32
+ }
@@ -0,0 +1,20 @@
1
+ import { sortParticipants } from '@livekit/components-core';
2
+ import type { Participant } from 'livekit-client';
3
+ import * as React from 'react';
4
+ import { useSpeakingParticipants } from './useSpeakingParticipants';
5
+
6
+ /**
7
+ * The `useSortedParticipants` hook returns the participants sorted by importance.
8
+ * @public
9
+ */
10
+ export function useSortedParticipants(participants: Array<Participant>) {
11
+ const [sortedParticipants, setSortedParticipants] = React.useState(
12
+ sortParticipants(participants),
13
+ );
14
+ const activeSpeakers = useSpeakingParticipants();
15
+
16
+ React.useEffect(() => {
17
+ setSortedParticipants(sortParticipants(participants));
18
+ }, [activeSpeakers, participants]);
19
+ return sortedParticipants;
20
+ }
@@ -0,0 +1,27 @@
1
+ import { activeSpeakerObserver } from '@livekit/components-core';
2
+ import * as React from 'react';
3
+ import { useEnsureRoom } from '../context';
4
+ import { useObservableState } from './internal';
5
+ import { Room } from 'livekit-client';
6
+
7
+ /** @public */
8
+ export type UseSpeakingParticipantsOptions = {
9
+ room?: Room;
10
+ };
11
+
12
+ /**
13
+ * The `useSpeakingParticipants` hook returns only the active speakers of all participants.
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * const activeSpeakers = useSpeakingParticipants();
18
+ * ```
19
+ * @public
20
+ */
21
+ export function useSpeakingParticipants(options?: UseSpeakingParticipantsOptions) {
22
+ const ensuredRoom = useEnsureRoom(options?.room);
23
+
24
+ const speakerObserver = React.useMemo(() => activeSpeakerObserver(ensuredRoom), [ensuredRoom]);
25
+ const activeSpeakers = useObservableState(speakerObserver, ensuredRoom.activeSpeakers);
26
+ return activeSpeakers;
27
+ }
@@ -0,0 +1,50 @@
1
+ import { setupStartAudio } from '@livekit/components-core';
2
+ import type { Room } from 'livekit-client';
3
+ import * as React from 'react';
4
+ import { useEnsureRoom } from '../context';
5
+ import { mergeProps } from '../mergeProps';
6
+ import { useObservableState } from './internal';
7
+
8
+ /** @alpha */
9
+ export interface UseStartAudioProps {
10
+ room?: Room;
11
+ props: React.ButtonHTMLAttributes<HTMLButtonElement>;
12
+ }
13
+
14
+ /**
15
+ * In many browsers to start audio playback, the user must perform a user-initiated event such as clicking a button.
16
+ * The `useStatAudio` hook returns an object with a boolean `canPlayAudio` flag
17
+ * that indicates whether audio playback is allowed in the current context,
18
+ * as well as a `startAudio` function that can be called in a button `onClick` callback to start audio playback in the current context.
19
+ *
20
+ * @see Autoplay policy on MDN web docs for more info: {@link https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Best_practices#autoplay_policy}
21
+ * @alpha
22
+ */
23
+ export function useStartAudio({ room, props }: UseStartAudioProps) {
24
+ const roomEnsured = useEnsureRoom(room);
25
+ const { className, roomAudioPlaybackAllowedObservable, handleStartAudioPlayback } = React.useMemo(
26
+ () => setupStartAudio(),
27
+ [],
28
+ );
29
+ const observable = React.useMemo(
30
+ () => roomAudioPlaybackAllowedObservable(roomEnsured),
31
+ [roomEnsured, roomAudioPlaybackAllowedObservable],
32
+ );
33
+ const { canPlayAudio } = useObservableState(observable, {
34
+ canPlayAudio: roomEnsured.canPlaybackAudio,
35
+ });
36
+
37
+ const mergedProps = React.useMemo(
38
+ () =>
39
+ mergeProps(props, {
40
+ className,
41
+ onClick: () => {
42
+ handleStartAudioPlayback(roomEnsured);
43
+ },
44
+ style: { display: canPlayAudio ? 'none' : 'block' },
45
+ }),
46
+ [props, className, canPlayAudio, handleStartAudioPlayback, roomEnsured],
47
+ );
48
+
49
+ return { mergedProps, canPlayAudio };
50
+ }
@@ -0,0 +1,49 @@
1
+ import { setupStartVideo } from '@livekit/components-core';
2
+ import type { Room } from 'livekit-client';
3
+ import * as React from 'react';
4
+ import { useEnsureRoom } from '../context';
5
+ import { mergeProps } from '../mergeProps';
6
+ import { useObservableState } from './internal';
7
+
8
+ /** @alpha */
9
+ export interface UseStartVideoProps {
10
+ room?: Room;
11
+ props: React.ButtonHTMLAttributes<HTMLButtonElement>;
12
+ }
13
+
14
+ /**
15
+ * In some browsers to start video playback in low power mode, the user must perform a user-initiated event such as clicking a button.
16
+ * The `useStartVideo` hook returns an object with a boolean `canPlayVideo` flag
17
+ * that indicates whether video playback is allowed in the current context,
18
+ * as well as a `startVideo` function that can be called in a button `onClick` callback to start video playback in the current context.
19
+ *
20
+ * @alpha
21
+ */
22
+ export function useStartVideo({ room, props }: UseStartVideoProps) {
23
+ const roomEnsured = useEnsureRoom(room);
24
+ const { className, roomVideoPlaybackAllowedObservable, handleStartVideoPlayback } = React.useMemo(
25
+ () => setupStartVideo(),
26
+ [],
27
+ );
28
+ const observable = React.useMemo(
29
+ () => roomVideoPlaybackAllowedObservable(roomEnsured),
30
+ [roomEnsured, roomVideoPlaybackAllowedObservable],
31
+ );
32
+ const { canPlayVideo } = useObservableState(observable, {
33
+ canPlayVideo: roomEnsured.canPlaybackVideo,
34
+ });
35
+
36
+ const mergedProps = React.useMemo(
37
+ () =>
38
+ mergeProps(props, {
39
+ className,
40
+ onClick: () => {
41
+ handleStartVideoPlayback(roomEnsured);
42
+ },
43
+ style: { display: canPlayVideo ? 'none' : 'block' },
44
+ }),
45
+ [props, className, canPlayVideo, handleStartVideoPlayback, roomEnsured],
46
+ );
47
+
48
+ return { mergedProps, canPlayVideo };
49
+ }
@@ -0,0 +1,68 @@
1
+ import * as React from 'react';
2
+
3
+ /**
4
+ * @alpha
5
+ */
6
+ export type UseSwipeOptions = {
7
+ minSwipeDistance?: number;
8
+ onLeftSwipe?: () => void;
9
+ onRightSwipe?: () => void;
10
+ };
11
+
12
+ /**
13
+ * Simple implementation to detect horizontal swipe actions.
14
+ * Accepts callbacks for on right and left swipes.
15
+ * @example
16
+ * ```tsx
17
+ * <div
18
+ onTouchStart={onTouchStart}
19
+ onTouchMove={onTouchMove}
20
+ onTouchEnd={onTouchEnd}
21
+ >
22
+ * ```
23
+ * @alpha
24
+ */
25
+ export function useSwipe(element: React.RefObject<HTMLElement>, options: UseSwipeOptions = {}) {
26
+ const touchStart = React.useRef<number | null>(null);
27
+ const touchEnd = React.useRef<number | null>(null);
28
+
29
+ // The required distance between touchStart and touchEnd to be detected as a swipe.
30
+ const minSwipeDistance = options.minSwipeDistance ?? 50;
31
+
32
+ const onTouchStart = (event: TouchEvent) => {
33
+ touchEnd.current = null; // Otherwise the swipe is fired even with usual touch events.
34
+ touchStart.current = event.targetTouches[0].clientX;
35
+ };
36
+
37
+ const onTouchMove = (event: TouchEvent) => {
38
+ touchEnd.current = event.targetTouches[0].clientX;
39
+ };
40
+
41
+ const onTouchEnd = React.useCallback(() => {
42
+ if (!touchStart.current || !touchEnd.current) {
43
+ return;
44
+ }
45
+ const distance = touchStart.current - touchEnd.current;
46
+ const isLeftSwipe = distance > minSwipeDistance;
47
+ const isRightSwipe = distance < -minSwipeDistance;
48
+
49
+ if (isLeftSwipe && options.onLeftSwipe) options.onLeftSwipe();
50
+ if (isRightSwipe && options.onRightSwipe) options.onRightSwipe();
51
+ }, [minSwipeDistance, options]);
52
+
53
+ React.useEffect(() => {
54
+ const elementCopy = element.current;
55
+ if (elementCopy) {
56
+ elementCopy.addEventListener('touchstart', onTouchStart, { passive: true });
57
+ elementCopy.addEventListener('touchmove', onTouchMove, { passive: true });
58
+ elementCopy.addEventListener('touchend', onTouchEnd, { passive: true });
59
+ }
60
+ return () => {
61
+ if (elementCopy) {
62
+ elementCopy.removeEventListener('touchstart', onTouchStart);
63
+ elementCopy.removeEventListener('touchmove', onTouchMove);
64
+ elementCopy.removeEventListener('touchend', onTouchEnd);
65
+ }
66
+ };
67
+ }, [element, onTouchEnd]);
68
+ }
@@ -0,0 +1,35 @@
1
+ import * as React from 'react';
2
+ import { ConnectionState, Room } from 'livekit-client';
3
+ import { setupTextStream, type TextStreamData } from '@livekit/components-core';
4
+ import { useEnsureRoom } from '../context';
5
+ import { useConnectionState } from './useConnectionStatus';
6
+ import { useObservableState } from './internal';
7
+
8
+ /** @beta */
9
+ export type UseTextStreamOptions = {
10
+ room?: Room;
11
+ };
12
+
13
+ /**
14
+ * @beta
15
+ * @param topic - the topic to listen to
16
+ * @returns an array of TextStreamData that holds the text, participantInfo, and streamInfo
17
+ * @example
18
+ * ```tsx
19
+ * const { textStreams } = useTextStream('my-topic');
20
+ * return <div>{textStreams.map((textStream) => textStream.text)}</div>;
21
+ * ```
22
+ */
23
+ export function useTextStream(topic: string, options?: UseTextStreamOptions) {
24
+ const room = useEnsureRoom(options?.room);
25
+
26
+ const connectionState = useConnectionState(room);
27
+ const isDisconnected = connectionState === ConnectionState.Disconnected;
28
+
29
+ const textStreamData = React.useMemo(() => setupTextStream(room, topic), [room, topic]);
30
+ const textStreamObservable = isDisconnected ? undefined : textStreamData;
31
+
32
+ const textStreams = useObservableState<TextStreamData[]>(textStreamObservable, []);
33
+
34
+ return { textStreams };
35
+ }
@@ -0,0 +1,54 @@
1
+ import { log } from '@livekit/components-core';
2
+ import * as React from 'react';
3
+
4
+ /** @public */
5
+ export interface UserInfo {
6
+ identity?: string;
7
+ name?: string;
8
+ metadata?: string;
9
+ }
10
+
11
+ /** @public */
12
+ export interface UseTokenOptions {
13
+ userInfo?: UserInfo;
14
+ }
15
+
16
+ /**
17
+ * The `useToken` hook fetches a token from the given token endpoint with the given user info.
18
+ *
19
+ * @example
20
+ * ```tsx
21
+ * const token = useToken(<token-endpoint>, roomName, { userInfo: { identity, name }});
22
+ * ```
23
+ * @public */
24
+ export function useToken(
25
+ tokenEndpoint: string | undefined,
26
+ roomName: string,
27
+ options: UseTokenOptions = {},
28
+ ) {
29
+ const [token, setToken] = React.useState<string | undefined>(undefined);
30
+
31
+ React.useEffect(() => {
32
+ if (tokenEndpoint === undefined) {
33
+ throw Error('token endpoint needs to be defined');
34
+ }
35
+ if (options.userInfo?.identity === undefined) {
36
+ return;
37
+ }
38
+ const tokenFetcher = async () => {
39
+ log.debug('fetching token');
40
+ const params = new URLSearchParams({ ...options.userInfo, roomName });
41
+ const res = await fetch(`${tokenEndpoint}?${params.toString()}`);
42
+ if (!res.ok) {
43
+ log.error(
44
+ `Could not fetch token. Server responded with status ${res.status}: ${res.statusText}`,
45
+ );
46
+ return;
47
+ }
48
+ const { accessToken } = await res.json();
49
+ setToken(accessToken);
50
+ };
51
+ tokenFetcher();
52
+ }, [tokenEndpoint, roomName, JSON.stringify(options)]);
53
+ return token;
54
+ }
@@ -0,0 +1,11 @@
1
+ // import type { Participant, Track } from 'livekit-client';
2
+ // import { useTrackRefBySourceOrName } from './useTrackRefBySourceOrName';
3
+ // import { useEnsureParticipant } from '../context';
4
+
5
+ /**
6
+ * TODO decide whether we want to expose this
7
+ */
8
+ // function useTrack(source: Track.Source, participant?: Participant) {
9
+ // const p = useEnsureParticipant(participant);
10
+ // return useTrackRefBySourceOrName({ source, participant: p });
11
+ // }
@@ -0,0 +1,15 @@
1
+ import type { Participant } from 'livekit-client';
2
+ import { useEnsureParticipant } from '../context';
3
+ import { useTrackRefBySourceOrName } from './useTrackRefBySourceOrName';
4
+
5
+ /**
6
+ * This function `useTrackByName` allows you to access a track by referencing its track name.
7
+ * Inside the function, it ensures that the a valid `participant` reference is available by checking
8
+ * for both a passed participant argument and, if not available, a valid participant context.
9
+ *
10
+ * @public
11
+ */
12
+ export function useTrackByName(name: string, participant?: Participant) {
13
+ const p = useEnsureParticipant(participant);
14
+ return useTrackRefBySourceOrName({ name, participant: p });
15
+ }
@@ -0,0 +1,44 @@
1
+ import {
2
+ type TrackReferenceOrPlaceholder,
3
+ setupTrackMutedIndicator,
4
+ getTrackReferenceId,
5
+ } from '@livekit/components-core';
6
+ import * as React from 'react';
7
+ import { useEnsureTrackRef } from '../context';
8
+ import { useObservableState } from './internal';
9
+
10
+ interface TrackMutedIndicatorReturnType {
11
+ isMuted: boolean;
12
+ className: string;
13
+ }
14
+
15
+ /**
16
+ * The `useTrackMutedIndicator` hook is used to implement the `TrackMutedIndicator` component
17
+ * and returns the muted state of the given track.
18
+ *
19
+ * @example
20
+ * ```tsx
21
+ * const { isMuted } = useTrackMutedIndicator(trackRef);
22
+ * ```
23
+ * @public
24
+ */
25
+ export function useTrackMutedIndicator(
26
+ trackRef?: TrackReferenceOrPlaceholder,
27
+ ): TrackMutedIndicatorReturnType {
28
+ const trackReference = useEnsureTrackRef(trackRef);
29
+
30
+ const { className, mediaMutedObserver } = React.useMemo(
31
+ () => setupTrackMutedIndicator(trackReference),
32
+ [getTrackReferenceId(trackReference)],
33
+ );
34
+
35
+ const isMuted = useObservableState(
36
+ mediaMutedObserver,
37
+ !!(
38
+ trackReference.publication?.isMuted ||
39
+ trackReference.participant.getTrackPublication(trackReference.source)?.isMuted
40
+ ),
41
+ );
42
+
43
+ return { isMuted, className };
44
+ }
@@ -0,0 +1,30 @@
1
+ import type { TrackReferenceOrPlaceholder, TrackSource } from '@livekit/components-core';
2
+ import { setupMediaTrack, getTrackByIdentifier } from '@livekit/components-core';
3
+ import * as React from 'react';
4
+ import { Track } from 'livekit-client';
5
+
6
+ /**
7
+ * @internal
8
+ */
9
+ export function useTrackRefBySourceOrName(
10
+ source: TrackSource<Track.Source>,
11
+ ): TrackReferenceOrPlaceholder {
12
+ const [publication, setPublication] = React.useState(getTrackByIdentifier(source));
13
+
14
+ const { trackObserver } = React.useMemo(() => {
15
+ return setupMediaTrack(source);
16
+ }, [source.participant.sid ?? source.participant.identity, source.source]);
17
+
18
+ React.useEffect(() => {
19
+ const subscription = trackObserver.subscribe((publication) => {
20
+ setPublication(publication);
21
+ });
22
+ return () => subscription?.unsubscribe();
23
+ }, [trackObserver]);
24
+
25
+ return {
26
+ participant: source.participant,
27
+ source: source.source ?? Track.Source.Unknown,
28
+ publication,
29
+ };
30
+ }
@@ -0,0 +1,18 @@
1
+ import * as React from 'react';
2
+ import { type TrackReferenceOrPlaceholder, trackSyncTimeObserver } from '@livekit/components-core';
3
+ import { useObservableState } from './internal';
4
+
5
+ /**
6
+ * @internal
7
+ * @deprecated this is an internal hook that's only used by deprecated APIs
8
+ */
9
+ export function useTrackSyncTime(ref: TrackReferenceOrPlaceholder | undefined) {
10
+ const observable = React.useMemo(
11
+ () => (ref?.publication?.track ? trackSyncTimeObserver(ref?.publication.track) : undefined),
12
+ [ref?.publication?.track],
13
+ );
14
+ return useObservableState(observable, {
15
+ timestamp: Date.now(),
16
+ rtpTimestamp: ref?.publication?.track?.rtpTimestamp,
17
+ });
18
+ }