@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,439 @@
1
+ import type {
2
+ CreateLocalTracksOptions,
3
+ LocalAudioTrack,
4
+ LocalVideoTrack,
5
+ TrackProcessor,
6
+ } from 'livekit-client';
7
+ import {
8
+ createLocalAudioTrack,
9
+ createLocalTracks,
10
+ createLocalVideoTrack,
11
+ facingModeFromLocalTrack,
12
+ Track,
13
+ VideoPresets,
14
+ Mutex,
15
+ } from 'livekit-client';
16
+ import * as React from 'react';
17
+ import { MediaDeviceMenu } from './MediaDeviceMenu';
18
+ import { TrackToggle } from '../components/controls/TrackToggle';
19
+ import type { LocalUserChoices } from '@livekit/components-core';
20
+ import { log } from '@livekit/components-core';
21
+ import { ParticipantPlaceholder } from '../assets/images';
22
+ import { useMediaDevices, usePersistentUserChoices } from '../hooks';
23
+ import { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';
24
+ import { roomOptionsStringifyReplacer } from '../utils';
25
+
26
+ /**
27
+ * Props for the PreJoin component.
28
+ * @public
29
+ */
30
+ export interface PreJoinProps
31
+ extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit' | 'onError'> {
32
+ /** This function is called with the `LocalUserChoices` if validation is passed. */
33
+ onSubmit?: (values: LocalUserChoices) => void;
34
+ /**
35
+ * Provide your custom validation function. Only if validation is successful the user choices are past to the onSubmit callback.
36
+ */
37
+ onValidate?: (values: LocalUserChoices) => boolean;
38
+ onError?: (error: Error) => void;
39
+ /** Prefill the input form with initial values. */
40
+ defaults?: Partial<LocalUserChoices>;
41
+ /** Display a debug window for your convenience. */
42
+ debug?: boolean;
43
+ joinLabel?: string;
44
+ micLabel?: string;
45
+ camLabel?: string;
46
+ userLabel?: string;
47
+ /**
48
+ * If true, user choices are persisted across sessions.
49
+ * @defaultValue true
50
+ * @alpha
51
+ */
52
+ persistUserChoices?: boolean;
53
+ videoProcessor?: TrackProcessor<Track.Kind.Video>;
54
+ }
55
+
56
+ /** @public */
57
+ export function usePreviewTracks(
58
+ options: CreateLocalTracksOptions,
59
+ onError?: (err: Error) => void,
60
+ ) {
61
+ const [tracks, setTracks] = React.useState<Array<LocalAudioTrack | LocalVideoTrack>>();
62
+
63
+ const trackLock = React.useMemo(() => new Mutex(), []);
64
+
65
+ React.useEffect(() => {
66
+ let needsCleanup = false;
67
+ let localTracks: Array<LocalAudioTrack | LocalVideoTrack> = [];
68
+ trackLock.lock().then(async (unlock) => {
69
+ try {
70
+ if (options.audio || options.video) {
71
+ localTracks = (await createLocalTracks(options)) as Array<
72
+ LocalAudioTrack | LocalVideoTrack
73
+ >;
74
+
75
+ if (needsCleanup) {
76
+ localTracks.forEach((tr) => tr.stop());
77
+ } else {
78
+ setTracks(localTracks);
79
+ }
80
+ }
81
+ } catch (e: unknown) {
82
+ if (onError && e instanceof Error) {
83
+ onError(e);
84
+ } else {
85
+ log.error(e);
86
+ }
87
+ } finally {
88
+ unlock();
89
+ }
90
+ });
91
+
92
+ return () => {
93
+ needsCleanup = true;
94
+ localTracks.forEach((track) => {
95
+ track.stop();
96
+ });
97
+ };
98
+ }, [JSON.stringify(options, roomOptionsStringifyReplacer), onError, trackLock]);
99
+
100
+ return tracks;
101
+ }
102
+
103
+ /**
104
+ * @public
105
+ * @deprecated use `usePreviewTracks` instead
106
+ */
107
+ export function usePreviewDevice<T extends LocalVideoTrack | LocalAudioTrack>(
108
+ enabled: boolean,
109
+ deviceId: string,
110
+ kind: 'videoinput' | 'audioinput',
111
+ ) {
112
+ const [deviceError, setDeviceError] = React.useState<Error | null>(null);
113
+ const [isCreatingTrack, setIsCreatingTrack] = React.useState<boolean>(false);
114
+
115
+ const devices = useMediaDevices({ kind });
116
+ const [selectedDevice, setSelectedDevice] = React.useState<MediaDeviceInfo | undefined>(
117
+ undefined,
118
+ );
119
+
120
+ const [localTrack, setLocalTrack] = React.useState<T>();
121
+ const [localDeviceId, setLocalDeviceId] = React.useState<string>(deviceId);
122
+
123
+ React.useEffect(() => {
124
+ setLocalDeviceId(deviceId);
125
+ }, [deviceId]);
126
+
127
+ const createTrack = async (deviceId: string, kind: 'videoinput' | 'audioinput') => {
128
+ try {
129
+ const track =
130
+ kind === 'videoinput'
131
+ ? await createLocalVideoTrack({
132
+ deviceId,
133
+ resolution: VideoPresets.h720.resolution,
134
+ })
135
+ : await createLocalAudioTrack({ deviceId });
136
+
137
+ const newDeviceId = await track.getDeviceId(false);
138
+ if (newDeviceId && deviceId !== newDeviceId) {
139
+ prevDeviceId.current = newDeviceId;
140
+ setLocalDeviceId(newDeviceId);
141
+ }
142
+ setLocalTrack(track as T);
143
+ } catch (e) {
144
+ if (e instanceof Error) {
145
+ setDeviceError(e);
146
+ }
147
+ }
148
+ };
149
+
150
+ const switchDevice = async (track: LocalVideoTrack | LocalAudioTrack, id: string) => {
151
+ await track.setDeviceId(id);
152
+ prevDeviceId.current = id;
153
+ };
154
+
155
+ const prevDeviceId = React.useRef(localDeviceId);
156
+
157
+ React.useEffect(() => {
158
+ if (enabled && !localTrack && !deviceError && !isCreatingTrack) {
159
+ log.debug('creating track', kind);
160
+ setIsCreatingTrack(true);
161
+ createTrack(localDeviceId, kind).finally(() => {
162
+ setIsCreatingTrack(false);
163
+ });
164
+ }
165
+ }, [enabled, localTrack, deviceError, isCreatingTrack]);
166
+
167
+ // switch camera device
168
+ React.useEffect(() => {
169
+ if (!localTrack) {
170
+ return;
171
+ }
172
+ if (!enabled) {
173
+ log.debug(`muting ${kind} track`);
174
+ localTrack.mute().then(() => log.debug(localTrack.mediaStreamTrack));
175
+ } else if (selectedDevice?.deviceId && prevDeviceId.current !== selectedDevice?.deviceId) {
176
+ log.debug(`switching ${kind} device from`, prevDeviceId.current, selectedDevice.deviceId);
177
+ switchDevice(localTrack, selectedDevice.deviceId);
178
+ } else {
179
+ log.debug(`unmuting local ${kind} track`);
180
+ localTrack.unmute();
181
+ }
182
+ }, [localTrack, selectedDevice, enabled, kind]);
183
+
184
+ React.useEffect(() => {
185
+ return () => {
186
+ if (localTrack) {
187
+ log.debug(`stopping local ${kind} track`);
188
+ localTrack.stop();
189
+ localTrack.mute();
190
+ }
191
+ };
192
+ }, []);
193
+
194
+ React.useEffect(() => {
195
+ setSelectedDevice(devices?.find((dev) => dev.deviceId === localDeviceId));
196
+ }, [localDeviceId, devices]);
197
+
198
+ return {
199
+ selectedDevice,
200
+ localTrack,
201
+ deviceError,
202
+ };
203
+ }
204
+
205
+ /**
206
+ * The `PreJoin` prefab component is normally presented to the user before he enters a room.
207
+ * This component allows the user to check and select the preferred media device (camera und microphone).
208
+ * On submit the user decisions are returned, which can then be passed on to the `LiveKitRoom` so that the user enters the room with the correct media devices.
209
+ *
210
+ * @remarks
211
+ * This component is independent of the `LiveKitRoom` component and should not be nested within it.
212
+ * Because it only accesses the local media tracks this component is self-contained and works without connection to the LiveKit server.
213
+ *
214
+ * @example
215
+ * ```tsx
216
+ * <PreJoin />
217
+ * ```
218
+ * @public
219
+ */
220
+ export function PreJoin({
221
+ defaults = {},
222
+ onValidate,
223
+ onSubmit,
224
+ onError,
225
+ debug,
226
+ joinLabel = 'Join Room',
227
+ micLabel = 'Microphone',
228
+ camLabel = 'Camera',
229
+ userLabel = 'Username',
230
+ persistUserChoices = true,
231
+ videoProcessor,
232
+ ...htmlProps
233
+ }: PreJoinProps) {
234
+ const {
235
+ userChoices: initialUserChoices,
236
+ saveAudioInputDeviceId,
237
+ saveAudioInputEnabled,
238
+ saveVideoInputDeviceId,
239
+ saveVideoInputEnabled,
240
+ saveUsername,
241
+ } = usePersistentUserChoices({
242
+ defaults,
243
+ preventSave: !persistUserChoices,
244
+ preventLoad: !persistUserChoices,
245
+ });
246
+
247
+ const [userChoices, setUserChoices] = React.useState(initialUserChoices);
248
+
249
+ // Initialize device settings
250
+ const [audioEnabled, setAudioEnabled] = React.useState<boolean>(userChoices.audioEnabled);
251
+ const [videoEnabled, setVideoEnabled] = React.useState<boolean>(userChoices.videoEnabled);
252
+ const [audioDeviceId, setAudioDeviceId] = React.useState<string>(userChoices.audioDeviceId);
253
+ const [videoDeviceId, setVideoDeviceId] = React.useState<string>(userChoices.videoDeviceId);
254
+ const [username, setUsername] = React.useState(userChoices.username);
255
+
256
+ // Save user choices to persistent storage.
257
+ React.useEffect(() => {
258
+ saveAudioInputEnabled(audioEnabled);
259
+ }, [audioEnabled, saveAudioInputEnabled]);
260
+ React.useEffect(() => {
261
+ saveVideoInputEnabled(videoEnabled);
262
+ }, [videoEnabled, saveVideoInputEnabled]);
263
+ React.useEffect(() => {
264
+ saveAudioInputDeviceId(audioDeviceId);
265
+ }, [audioDeviceId, saveAudioInputDeviceId]);
266
+ React.useEffect(() => {
267
+ saveVideoInputDeviceId(videoDeviceId);
268
+ }, [videoDeviceId, saveVideoInputDeviceId]);
269
+ React.useEffect(() => {
270
+ saveUsername(username);
271
+ }, [username, saveUsername]);
272
+
273
+ const tracks = usePreviewTracks(
274
+ {
275
+ audio: audioEnabled ? { deviceId: initialUserChoices.audioDeviceId } : false,
276
+ video: videoEnabled
277
+ ? { deviceId: initialUserChoices.videoDeviceId, processor: videoProcessor }
278
+ : false,
279
+ },
280
+ onError,
281
+ );
282
+
283
+ const videoEl = React.useRef(null);
284
+
285
+ const videoTrack = React.useMemo(
286
+ () => tracks?.filter((track) => track.kind === Track.Kind.Video)[0] as LocalVideoTrack,
287
+ [tracks],
288
+ );
289
+
290
+ const facingMode = React.useMemo(() => {
291
+ if (videoTrack) {
292
+ const { facingMode } = facingModeFromLocalTrack(videoTrack);
293
+ return facingMode;
294
+ } else {
295
+ return 'undefined';
296
+ }
297
+ }, [videoTrack]);
298
+
299
+ const audioTrack = React.useMemo(
300
+ () => tracks?.filter((track) => track.kind === Track.Kind.Audio)[0] as LocalAudioTrack,
301
+ [tracks],
302
+ );
303
+
304
+ React.useEffect(() => {
305
+ if (videoEl.current && videoTrack) {
306
+ videoTrack.unmute();
307
+ videoTrack.attach(videoEl.current);
308
+ }
309
+
310
+ return () => {
311
+ videoTrack?.detach();
312
+ };
313
+ }, [videoTrack]);
314
+
315
+ const [isValid, setIsValid] = React.useState<boolean>();
316
+
317
+ const handleValidation = React.useCallback(
318
+ (values: LocalUserChoices) => {
319
+ if (typeof onValidate === 'function') {
320
+ return onValidate(values);
321
+ } else {
322
+ return values.username !== '';
323
+ }
324
+ },
325
+ [onValidate],
326
+ );
327
+
328
+ React.useEffect(() => {
329
+ const newUserChoices = {
330
+ username,
331
+ videoEnabled,
332
+ videoDeviceId,
333
+ audioEnabled,
334
+ audioDeviceId,
335
+ };
336
+ setUserChoices(newUserChoices);
337
+ setIsValid(handleValidation(newUserChoices));
338
+ }, [username, videoEnabled, handleValidation, audioEnabled, audioDeviceId, videoDeviceId]);
339
+
340
+ function handleSubmit(event: React.FormEvent) {
341
+ event.preventDefault();
342
+ if (handleValidation(userChoices)) {
343
+ if (typeof onSubmit === 'function') {
344
+ onSubmit(userChoices);
345
+ }
346
+ } else {
347
+ log.warn('Validation failed with: ', userChoices);
348
+ }
349
+ }
350
+
351
+ useWarnAboutMissingStyles();
352
+
353
+ return (
354
+ <div className="lk-prejoin" {...htmlProps}>
355
+ <div className="lk-video-container">
356
+ {videoTrack && (
357
+ <video ref={videoEl} width="1280" height="720" data-lk-facing-mode={facingMode} />
358
+ )}
359
+ {(!videoTrack || !videoEnabled) && (
360
+ <div className="lk-camera-off-note">
361
+ <ParticipantPlaceholder />
362
+ </div>
363
+ )}
364
+ </div>
365
+ <div className="lk-button-group-container">
366
+ <div className="lk-button-group audio">
367
+ <TrackToggle
368
+ initialState={audioEnabled}
369
+ source={Track.Source.Microphone}
370
+ onChange={(enabled) => setAudioEnabled(enabled)}
371
+ >
372
+ {micLabel}
373
+ </TrackToggle>
374
+ <div className="lk-button-group-menu">
375
+ <MediaDeviceMenu
376
+ initialSelection={audioDeviceId}
377
+ kind="audioinput"
378
+ disabled={!audioTrack}
379
+ tracks={{ audioinput: audioTrack }}
380
+ onActiveDeviceChange={(_, id) => setAudioDeviceId(id)}
381
+ />
382
+ </div>
383
+ </div>
384
+ <div className="lk-button-group video">
385
+ <TrackToggle
386
+ initialState={videoEnabled}
387
+ source={Track.Source.Camera}
388
+ onChange={(enabled) => setVideoEnabled(enabled)}
389
+ >
390
+ {camLabel}
391
+ </TrackToggle>
392
+ <div className="lk-button-group-menu">
393
+ <MediaDeviceMenu
394
+ initialSelection={videoDeviceId}
395
+ kind="videoinput"
396
+ disabled={!videoTrack}
397
+ tracks={{ videoinput: videoTrack }}
398
+ onActiveDeviceChange={(_, id) => setVideoDeviceId(id)}
399
+ />
400
+ </div>
401
+ </div>
402
+ </div>
403
+
404
+ <form className="lk-username-container">
405
+ <input
406
+ className="lk-form-control"
407
+ id="username"
408
+ name="username"
409
+ type="text"
410
+ defaultValue={username}
411
+ placeholder={userLabel}
412
+ onChange={(inputEl) => setUsername(inputEl.target.value)}
413
+ autoComplete="off"
414
+ />
415
+ <button
416
+ className="lk-button lk-join-button"
417
+ type="submit"
418
+ onClick={handleSubmit}
419
+ disabled={!isValid}
420
+ >
421
+ {joinLabel}
422
+ </button>
423
+ </form>
424
+
425
+ {debug && (
426
+ <>
427
+ <strong>User Choices:</strong>
428
+ <ul className="lk-list" style={{ overflow: 'hidden', maxWidth: '15rem' }}>
429
+ <li>Username: {`${userChoices.username}`}</li>
430
+ <li>Video Enabled: {`${userChoices.videoEnabled}`}</li>
431
+ <li>Audio Enabled: {`${userChoices.audioEnabled}`}</li>
432
+ <li>Video Device: {`${userChoices.videoDeviceId}`}</li>
433
+ <li>Audio Device: {`${userChoices.audioDeviceId}`}</li>
434
+ </ul>
435
+ </>
436
+ )}
437
+ </div>
438
+ );
439
+ }
@@ -0,0 +1,184 @@
1
+ import type {
2
+ MessageDecoder,
3
+ MessageEncoder,
4
+ TrackReferenceOrPlaceholder,
5
+ WidgetState,
6
+ } from '@livekit/components-core';
7
+ import { isEqualTrackRef, isTrackReference, isWeb, log } from '@livekit/components-core';
8
+ import { RoomEvent, Track } from 'livekit-client';
9
+ import * as React from 'react';
10
+ import type { MessageFormatter } from '../components';
11
+ import {
12
+ CarouselLayout,
13
+ ConnectionStateToast,
14
+ FocusLayout,
15
+ FocusLayoutContainer,
16
+ GridLayout,
17
+ LayoutContextProvider,
18
+ ParticipantTile,
19
+ RoomAudioRenderer,
20
+ } from '../components';
21
+ import { useCreateLayoutContext } from '../context';
22
+ import { usePinnedTracks, useTracks } from '../hooks';
23
+ import { Chat } from './Chat';
24
+ import { ControlBar, type ControlBarProps } from './ControlBar';
25
+ import { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';
26
+
27
+ /**
28
+ * @public
29
+ */
30
+ export interface VideoConferenceProps extends React.HTMLAttributes<HTMLDivElement> {
31
+ chatMessageFormatter?: MessageFormatter;
32
+ chatMessageEncoder?: MessageEncoder;
33
+ chatMessageDecoder?: MessageDecoder;
34
+ /** @alpha */
35
+ SettingsComponent?: React.ComponentType;
36
+ controlBarProops?: Partial<ControlBarProps>;
37
+ }
38
+
39
+ /**
40
+ * The `VideoConference` ready-made component is your drop-in solution for a classic video conferencing application.
41
+ * It provides functionality such as focusing on one participant, grid view with pagination to handle large numbers
42
+ * of participants, basic non-persistent chat, screen sharing, and more.
43
+ *
44
+ * @remarks
45
+ * The component is implemented with other LiveKit components like `FocusContextProvider`,
46
+ * `GridLayout`, `ControlBar`, `FocusLayoutContainer` and `FocusLayout`.
47
+ * You can use these components as a starting point for your own custom video conferencing application.
48
+ *
49
+ * @example
50
+ * ```tsx
51
+ * <LiveKitRoom>
52
+ * <VideoConference />
53
+ * <LiveKitRoom>
54
+ * ```
55
+ * @public
56
+ */
57
+ export function VideoConference({
58
+ chatMessageFormatter,
59
+ chatMessageDecoder,
60
+ chatMessageEncoder,
61
+ SettingsComponent,
62
+ controlBarProops = {},
63
+ ...props
64
+ }: VideoConferenceProps) {
65
+ const [widgetState, setWidgetState] = React.useState<WidgetState>({
66
+ showChat: false,
67
+ unreadMessages: 0,
68
+ showSettings: false,
69
+ });
70
+ const lastAutoFocusedScreenShareTrack = React.useRef<TrackReferenceOrPlaceholder | null>(null);
71
+
72
+ const tracks = useTracks(
73
+ [
74
+ { source: Track.Source.Camera, withPlaceholder: true },
75
+ { source: Track.Source.ScreenShare, withPlaceholder: false },
76
+ ],
77
+ { updateOnlyOn: [RoomEvent.ActiveSpeakersChanged], onlySubscribed: false },
78
+ );
79
+
80
+ const widgetUpdate = (state: WidgetState) => {
81
+ log.debug('updating widget state', state);
82
+ setWidgetState(state);
83
+ };
84
+
85
+ const layoutContext = useCreateLayoutContext();
86
+
87
+ const screenShareTracks = tracks
88
+ .filter(isTrackReference)
89
+ .filter((track) => track.publication.source === Track.Source.ScreenShare);
90
+
91
+ const focusTrack = usePinnedTracks(layoutContext)?.[0];
92
+ const carouselTracks = tracks.filter((track) => !isEqualTrackRef(track, focusTrack));
93
+
94
+ React.useEffect(() => {
95
+ // If screen share tracks are published, and no pin is set explicitly, auto set the screen share.
96
+ if (
97
+ screenShareTracks.some((track) => track.publication.isSubscribed) &&
98
+ lastAutoFocusedScreenShareTrack.current === null
99
+ ) {
100
+ log.debug('Auto set screen share focus:', { newScreenShareTrack: screenShareTracks[0] });
101
+ layoutContext.pin.dispatch?.({ msg: 'set_pin', trackReference: screenShareTracks[0] });
102
+ lastAutoFocusedScreenShareTrack.current = screenShareTracks[0];
103
+ } else if (
104
+ lastAutoFocusedScreenShareTrack.current &&
105
+ !screenShareTracks.some(
106
+ (track) =>
107
+ track.publication.trackSid ===
108
+ lastAutoFocusedScreenShareTrack.current?.publication?.trackSid,
109
+ )
110
+ ) {
111
+ log.debug('Auto clearing screen share focus.');
112
+ layoutContext.pin.dispatch?.({ msg: 'clear_pin' });
113
+ lastAutoFocusedScreenShareTrack.current = null;
114
+ }
115
+ if (focusTrack && !isTrackReference(focusTrack)) {
116
+ const updatedFocusTrack = tracks.find(
117
+ (tr) =>
118
+ tr.participant.identity === focusTrack.participant.identity &&
119
+ tr.source === focusTrack.source,
120
+ );
121
+ if (updatedFocusTrack !== focusTrack && isTrackReference(updatedFocusTrack)) {
122
+ layoutContext.pin.dispatch?.({ msg: 'set_pin', trackReference: updatedFocusTrack });
123
+ }
124
+ }
125
+ }, [
126
+ screenShareTracks
127
+ .map((ref) => `${ref.publication.trackSid}_${ref.publication.isSubscribed}`)
128
+ .join(),
129
+ focusTrack?.publication?.trackSid,
130
+ tracks,
131
+ ]);
132
+
133
+ useWarnAboutMissingStyles();
134
+
135
+ return (
136
+ <div className="lk-video-conference" {...props}>
137
+ {isWeb() && (
138
+ <LayoutContextProvider
139
+ value={layoutContext}
140
+ // onPinChange={handleFocusStateChange}
141
+ onWidgetChange={widgetUpdate}
142
+ >
143
+ <div className="lk-video-conference-inner">
144
+ {!focusTrack ? (
145
+ <div className="lk-grid-layout-wrapper">
146
+ <GridLayout tracks={tracks}>
147
+ <ParticipantTile />
148
+ </GridLayout>
149
+ </div>
150
+ ) : (
151
+ <div className="lk-focus-layout-wrapper">
152
+ <FocusLayoutContainer>
153
+ <CarouselLayout tracks={carouselTracks}>
154
+ <ParticipantTile />
155
+ </CarouselLayout>
156
+ {focusTrack && <FocusLayout trackRef={focusTrack} />}
157
+ </FocusLayoutContainer>
158
+ </div>
159
+ )}
160
+ <ControlBar
161
+ controls={{ chat: true, settings: !!SettingsComponent, ...controlBarProops }}
162
+ />
163
+ </div>
164
+ <Chat
165
+ style={{ display: widgetState.showChat ? 'grid' : 'none' }}
166
+ messageFormatter={chatMessageFormatter}
167
+ messageEncoder={chatMessageEncoder}
168
+ messageDecoder={chatMessageDecoder}
169
+ />
170
+ {SettingsComponent && (
171
+ <div
172
+ className="lk-settings-menu-modal"
173
+ style={{ display: widgetState.showSettings ? 'block' : 'none' }}
174
+ >
175
+ <SettingsComponent />
176
+ </div>
177
+ )}
178
+ </LayoutContextProvider>
179
+ )}
180
+ <RoomAudioRenderer />
181
+ <ConnectionStateToast />
182
+ </div>
183
+ );
184
+ }