@stream-io/video-react-sdk 1.41.0 → 2.0.0-beta.0

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 (313) hide show
  1. package/CHANGELOG.md +22 -6
  2. package/dist/{embedded-BackgroundFilters-folwWrgs.cjs.js → background-filters-DMStbSEg.cjs.js} +97 -71
  3. package/dist/background-filters-DMStbSEg.cjs.js.map +1 -0
  4. package/dist/{background-filters-folwWrgs.cjs.js → embedded-BackgroundFilters-DMStbSEg.cjs.js} +97 -71
  5. package/dist/embedded-BackgroundFilters-DMStbSEg.cjs.js.map +1 -0
  6. package/dist/embedded.cjs.js +2 -2
  7. package/dist/embedded.cjs.js.map +1 -1
  8. package/dist/esm/embedded.js +3 -0
  9. package/dist/esm/embedded.js.map +1 -0
  10. package/dist/esm/index.js +92 -0
  11. package/dist/esm/index.js.map +1 -0
  12. package/dist/esm/src/components/Avatar/Avatar.js +14 -0
  13. package/dist/esm/src/components/Avatar/Avatar.js.map +1 -0
  14. package/dist/{background-filters-D2U5UBbH.es.js → esm/src/components/BackgroundFilters/BackgroundFilters.js} +97 -71
  15. package/dist/esm/src/components/BackgroundFilters/BackgroundFilters.js.map +1 -0
  16. package/dist/esm/src/components/BackgroundFilters/BackgroundFiltersProvider.js +33 -0
  17. package/dist/esm/src/components/BackgroundFilters/BackgroundFiltersProvider.js.map +1 -0
  18. package/dist/esm/src/components/Button/CompositeButton.js +29 -0
  19. package/dist/esm/src/components/Button/CompositeButton.js.map +1 -0
  20. package/dist/esm/src/components/Button/IconButton.js +18 -0
  21. package/dist/esm/src/components/Button/IconButton.js.map +1 -0
  22. package/dist/esm/src/components/Button/TextButton.js +8 -0
  23. package/dist/esm/src/components/Button/TextButton.js.map +1 -0
  24. package/dist/esm/src/components/CallControls/AcceptCallButton.js +28 -0
  25. package/dist/esm/src/components/CallControls/AcceptCallButton.js.map +1 -0
  26. package/dist/esm/src/components/CallControls/CallControls.js +21 -0
  27. package/dist/esm/src/components/CallControls/CallControls.js.map +1 -0
  28. package/dist/esm/src/components/CallControls/CallStatsButton.js +18 -0
  29. package/dist/esm/src/components/CallControls/CallStatsButton.js.map +1 -0
  30. package/dist/esm/src/components/CallControls/CancelCallButton.js +78 -0
  31. package/dist/esm/src/components/CallControls/CancelCallButton.js.map +1 -0
  32. package/dist/esm/src/components/CallControls/ReactionsButton.js +61 -0
  33. package/dist/esm/src/components/CallControls/ReactionsButton.js.map +1 -0
  34. package/dist/esm/src/components/CallControls/RecordCallButton.js +64 -0
  35. package/dist/esm/src/components/CallControls/RecordCallButton.js.map +1 -0
  36. package/dist/esm/src/components/CallControls/ScreenShareButton.js +44 -0
  37. package/dist/esm/src/components/CallControls/ScreenShareButton.js.map +1 -0
  38. package/dist/esm/src/components/CallControls/ToggleAudioButton.js +72 -0
  39. package/dist/esm/src/components/CallControls/ToggleAudioButton.js.map +1 -0
  40. package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js +27 -0
  41. package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js.map +1 -0
  42. package/dist/esm/src/components/CallControls/ToggleVideoButton.js +81 -0
  43. package/dist/esm/src/components/CallControls/ToggleVideoButton.js.map +1 -0
  44. package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js +23 -0
  45. package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js.map +1 -0
  46. package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js +15 -0
  47. package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js.map +1 -0
  48. package/dist/esm/src/components/CallParticipantsList/CallParticipantListing.js +7 -0
  49. package/dist/esm/src/components/CallParticipantsList/CallParticipantListing.js.map +1 -0
  50. package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js +46 -0
  51. package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js.map +1 -0
  52. package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js +81 -0
  53. package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js.map +1 -0
  54. package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js +10 -0
  55. package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js.map +1 -0
  56. package/dist/esm/src/components/CallPreview/CallPreview.js +24 -0
  57. package/dist/esm/src/components/CallPreview/CallPreview.js.map +1 -0
  58. package/dist/esm/src/components/CallRecordingList/CallRecordingList.js +12 -0
  59. package/dist/esm/src/components/CallRecordingList/CallRecordingList.js.map +1 -0
  60. package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js +12 -0
  61. package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js.map +1 -0
  62. package/dist/esm/src/components/CallRecordingList/CallRecordingListItem.js +14 -0
  63. package/dist/esm/src/components/CallRecordingList/CallRecordingListItem.js.map +1 -0
  64. package/dist/esm/src/components/CallRecordingList/EmptyCallRecordingListing.js +8 -0
  65. package/dist/esm/src/components/CallRecordingList/EmptyCallRecordingListing.js.map +1 -0
  66. package/dist/esm/src/components/CallRecordingList/LoadingCallRecordingListing.js +10 -0
  67. package/dist/esm/src/components/CallRecordingList/LoadingCallRecordingListing.js.map +1 -0
  68. package/dist/esm/src/components/CallStats/CallStats.js +180 -0
  69. package/dist/esm/src/components/CallStats/CallStats.js.map +1 -0
  70. package/dist/{latency-chart-Bj5OSYzg.es.js → esm/src/components/CallStats/CallStatsLatencyChart.js} +1 -1
  71. package/dist/esm/src/components/CallStats/CallStatsLatencyChart.js.map +1 -0
  72. package/dist/esm/src/components/DeviceSettings/AudioVolumeIndicator.js +27 -0
  73. package/dist/esm/src/components/DeviceSettings/AudioVolumeIndicator.js.map +1 -0
  74. package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js +42 -0
  75. package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js.map +1 -0
  76. package/dist/esm/src/components/DeviceSettings/DeviceSelector.js +67 -0
  77. package/dist/esm/src/components/DeviceSettings/DeviceSelector.js.map +1 -0
  78. package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js +26 -0
  79. package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js.map +1 -0
  80. package/dist/esm/src/components/DeviceSettings/DeviceSelectorVideo.js +15 -0
  81. package/dist/esm/src/components/DeviceSettings/DeviceSelectorVideo.js.map +1 -0
  82. package/dist/esm/src/components/DeviceSettings/DeviceSettings.js +26 -0
  83. package/dist/esm/src/components/DeviceSettings/DeviceSettings.js.map +1 -0
  84. package/dist/esm/src/components/DeviceSettings/DeviceVideoPreviewItem.js +42 -0
  85. package/dist/esm/src/components/DeviceSettings/DeviceVideoPreviewItem.js.map +1 -0
  86. package/dist/esm/src/components/DeviceSettings/SpeakerTest.js +57 -0
  87. package/dist/esm/src/components/DeviceSettings/SpeakerTest.js.map +1 -0
  88. package/dist/esm/src/components/DropdownSelect/DropdownSelect.js +79 -0
  89. package/dist/esm/src/components/DropdownSelect/DropdownSelect.js.map +1 -0
  90. package/dist/esm/src/components/Icon/Icon.js +7 -0
  91. package/dist/esm/src/components/Icon/Icon.js.map +1 -0
  92. package/dist/esm/src/components/LoadingIndicator/LoadingIndicator.js +9 -0
  93. package/dist/esm/src/components/LoadingIndicator/LoadingIndicator.js.map +1 -0
  94. package/dist/esm/src/components/Menu/GenericMenu.js +19 -0
  95. package/dist/esm/src/components/Menu/GenericMenu.js.map +1 -0
  96. package/dist/esm/src/components/Menu/MenuToggle.js +75 -0
  97. package/dist/esm/src/components/Menu/MenuToggle.js.map +1 -0
  98. package/dist/esm/src/components/NoiseCancellation/NoiseCancellationProvider.js +96 -0
  99. package/dist/esm/src/components/NoiseCancellation/NoiseCancellationProvider.js.map +1 -0
  100. package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js +23 -0
  101. package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js.map +1 -0
  102. package/dist/esm/src/components/Notification/Notification.js +31 -0
  103. package/dist/esm/src/components/Notification/Notification.js.map +1 -0
  104. package/dist/esm/src/components/Notification/PermissionNotification.js +32 -0
  105. package/dist/esm/src/components/Notification/PermissionNotification.js.map +1 -0
  106. package/dist/esm/src/components/Notification/RecordingInProgressNotification.js +23 -0
  107. package/dist/esm/src/components/Notification/RecordingInProgressNotification.js.map +1 -0
  108. package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js +14 -0
  109. package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js.map +1 -0
  110. package/dist/esm/src/components/Permissions/PermissionRequests.js +99 -0
  111. package/dist/esm/src/components/Permissions/PermissionRequests.js.map +1 -0
  112. package/dist/esm/src/components/Reaction/Reaction.js +32 -0
  113. package/dist/esm/src/components/Reaction/Reaction.js.map +1 -0
  114. package/dist/esm/src/components/RingingCall/RingingCall.js +48 -0
  115. package/dist/esm/src/components/RingingCall/RingingCall.js.map +1 -0
  116. package/dist/esm/src/components/RingingCall/RingingCallControls.js +34 -0
  117. package/dist/esm/src/components/RingingCall/RingingCallControls.js.map +1 -0
  118. package/dist/esm/src/components/Search/SearchInput.js +27 -0
  119. package/dist/esm/src/components/Search/SearchInput.js.map +1 -0
  120. package/dist/esm/src/components/Search/SearchResults.js +15 -0
  121. package/dist/esm/src/components/Search/SearchResults.js.map +1 -0
  122. package/dist/esm/src/components/Search/hooks/useSearch.js +38 -0
  123. package/dist/esm/src/components/Search/hooks/useSearch.js.map +1 -0
  124. package/dist/esm/src/components/StreamTheme/StreamTheme.js +9 -0
  125. package/dist/esm/src/components/StreamTheme/StreamTheme.js.map +1 -0
  126. package/dist/esm/src/components/Tooltip/Tooltip.js +29 -0
  127. package/dist/esm/src/components/Tooltip/Tooltip.js.map +1 -0
  128. package/dist/esm/src/components/Tooltip/WithTooltip.js +15 -0
  129. package/dist/esm/src/components/Tooltip/WithTooltip.js.map +1 -0
  130. package/dist/esm/src/components/Tooltip/hooks/useEnterLeaveHandlers.js +17 -0
  131. package/dist/esm/src/components/Tooltip/hooks/useEnterLeaveHandlers.js.map +1 -0
  132. package/dist/esm/src/components/VideoPreview/VideoPreview.js +37 -0
  133. package/dist/esm/src/components/VideoPreview/VideoPreview.js.map +1 -0
  134. package/dist/esm/src/core/components/Audio/Audio.js +22 -0
  135. package/dist/esm/src/core/components/Audio/Audio.js.map +1 -0
  136. package/dist/esm/src/core/components/Audio/ParticipantsAudio.js +23 -0
  137. package/dist/esm/src/core/components/Audio/ParticipantsAudio.js.map +1 -0
  138. package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js +150 -0
  139. package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js.map +1 -0
  140. package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js +79 -0
  141. package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js.map +1 -0
  142. package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js +80 -0
  143. package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js.map +1 -0
  144. package/dist/esm/src/core/components/CallLayout/PipLayout/Host.js +13 -0
  145. package/dist/esm/src/core/components/CallLayout/PipLayout/Host.js.map +1 -0
  146. package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js +57 -0
  147. package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js.map +1 -0
  148. package/dist/esm/src/core/components/CallLayout/PipLayout/index.js +8 -0
  149. package/dist/esm/src/core/components/CallLayout/PipLayout/index.js.map +1 -0
  150. package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js +103 -0
  151. package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js.map +1 -0
  152. package/dist/esm/src/core/components/CallLayout/hooks.js +62 -0
  153. package/dist/esm/src/core/components/CallLayout/hooks.js.map +1 -0
  154. package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js +94 -0
  155. package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js.map +1 -0
  156. package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js +97 -0
  157. package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js.map +1 -0
  158. package/dist/esm/src/core/components/ParticipantView/ParticipantView.js +65 -0
  159. package/dist/esm/src/core/components/ParticipantView/ParticipantView.js.map +1 -0
  160. package/dist/esm/src/core/components/ParticipantView/ParticipantViewContext.js +7 -0
  161. package/dist/esm/src/core/components/ParticipantView/ParticipantViewContext.js.map +1 -0
  162. package/dist/esm/src/core/components/StreamCall/StreamCall.js +8 -0
  163. package/dist/esm/src/core/components/StreamCall/StreamCall.js.map +1 -0
  164. package/dist/esm/src/core/components/StreamVideo/StreamVideo.js +11 -0
  165. package/dist/esm/src/core/components/StreamVideo/StreamVideo.js.map +1 -0
  166. package/dist/esm/src/core/components/Video/BaseVideo.js +41 -0
  167. package/dist/esm/src/core/components/Video/BaseVideo.js.map +1 -0
  168. package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js +21 -0
  169. package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js.map +1 -0
  170. package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js +12 -0
  171. package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js.map +1 -0
  172. package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js +12 -0
  173. package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js.map +1 -0
  174. package/dist/esm/src/core/components/Video/Video.js +88 -0
  175. package/dist/esm/src/core/components/Video/Video.js.map +1 -0
  176. package/dist/esm/src/core/hooks/useCalculateHardLimit.js +59 -0
  177. package/dist/esm/src/core/hooks/useCalculateHardLimit.js.map +1 -0
  178. package/dist/esm/src/core/hooks/usePictureInPictureState.js +24 -0
  179. package/dist/esm/src/core/hooks/usePictureInPictureState.js.map +1 -0
  180. package/dist/esm/src/core/hooks/useTrackElementVisibility.js +14 -0
  181. package/dist/esm/src/core/hooks/useTrackElementVisibility.js.map +1 -0
  182. package/dist/esm/src/embedded/EmbeddedClientProvider.js +83 -0
  183. package/dist/esm/src/embedded/EmbeddedClientProvider.js.map +1 -0
  184. package/dist/esm/src/embedded/call/CallControls.js +65 -0
  185. package/dist/esm/src/embedded/call/CallControls.js.map +1 -0
  186. package/dist/esm/src/embedded/call/CallHeader.js +57 -0
  187. package/dist/esm/src/embedded/call/CallHeader.js.map +1 -0
  188. package/dist/esm/src/embedded/call/CallLayout.js +63 -0
  189. package/dist/esm/src/embedded/call/CallLayout.js.map +1 -0
  190. package/dist/esm/src/embedded/call/CallStateRouter.js +87 -0
  191. package/dist/esm/src/embedded/call/CallStateRouter.js.map +1 -0
  192. package/dist/esm/src/embedded/call/EmbeddedCall.js +12 -0
  193. package/dist/esm/src/embedded/call/EmbeddedCall.js.map +1 -0
  194. package/dist/esm/src/embedded/context/ConfigurationContext.js +21 -0
  195. package/dist/esm/src/embedded/context/ConfigurationContext.js.map +1 -0
  196. package/dist/esm/src/embedded/hooks/useCallDuration.js +32 -0
  197. package/dist/esm/src/embedded/hooks/useCallDuration.js.map +1 -0
  198. package/dist/esm/src/embedded/hooks/useEmbeddedClient.js +40 -0
  199. package/dist/esm/src/embedded/hooks/useEmbeddedClient.js.map +1 -0
  200. package/dist/esm/src/embedded/hooks/useInitializeCall.js +39 -0
  201. package/dist/esm/src/embedded/hooks/useInitializeCall.js.map +1 -0
  202. package/dist/esm/src/embedded/hooks/useInitializeVideoClient.js +93 -0
  203. package/dist/esm/src/embedded/hooks/useInitializeVideoClient.js.map +1 -0
  204. package/dist/esm/src/embedded/hooks/useIsLivestreamPaused.js +42 -0
  205. package/dist/esm/src/embedded/hooks/useIsLivestreamPaused.js.map +1 -0
  206. package/dist/esm/src/embedded/hooks/useLayout.js +122 -0
  207. package/dist/esm/src/embedded/hooks/useLayout.js.map +1 -0
  208. package/dist/esm/src/embedded/hooks/useNoiseCancellationLoader.js +48 -0
  209. package/dist/esm/src/embedded/hooks/useNoiseCancellationLoader.js.map +1 -0
  210. package/dist/esm/src/embedded/hooks/useWakeLock.js +34 -0
  211. package/dist/esm/src/embedded/hooks/useWakeLock.js.map +1 -0
  212. package/dist/esm/src/embedded/livestream/EmbeddedLivestream.js +11 -0
  213. package/dist/esm/src/embedded/livestream/EmbeddedLivestream.js.map +1 -0
  214. package/dist/esm/src/embedded/livestream/LivestreamUI.js +17 -0
  215. package/dist/esm/src/embedded/livestream/LivestreamUI.js.map +1 -0
  216. package/dist/esm/src/embedded/livestream/host/HostLayout.js +76 -0
  217. package/dist/esm/src/embedded/livestream/host/HostLayout.js.map +1 -0
  218. package/dist/esm/src/embedded/livestream/host/HostStateRouter.js +110 -0
  219. package/dist/esm/src/embedded/livestream/host/HostStateRouter.js.map +1 -0
  220. package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js +74 -0
  221. package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js.map +1 -0
  222. package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js +109 -0
  223. package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js.map +1 -0
  224. package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js +105 -0
  225. package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js.map +1 -0
  226. package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js +65 -0
  227. package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js.map +1 -0
  228. package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js +34 -0
  229. package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js.map +1 -0
  230. package/dist/esm/src/embedded/shared/CallFeedback/CallFeedback.js +35 -0
  231. package/dist/esm/src/embedded/shared/CallFeedback/CallFeedback.js.map +1 -0
  232. package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js +18 -0
  233. package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js.map +1 -0
  234. package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js +37 -0
  235. package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js.map +1 -0
  236. package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js +34 -0
  237. package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js.map +1 -0
  238. package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js +56 -0
  239. package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js.map +1 -0
  240. package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js +42 -0
  241. package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js.map +1 -0
  242. package/dist/esm/src/embedded/shared/JoinError/JoinError.js +34 -0
  243. package/dist/esm/src/embedded/shared/JoinError/JoinError.js.map +1 -0
  244. package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js +44 -0
  245. package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js.map +1 -0
  246. package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js +31 -0
  247. package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js.map +1 -0
  248. package/dist/esm/src/embedded/shared/Lobby/Lobby.js +45 -0
  249. package/dist/esm/src/embedded/shared/Lobby/Lobby.js.map +1 -0
  250. package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js +40 -0
  251. package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js.map +1 -0
  252. package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js +41 -0
  253. package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js.map +1 -0
  254. package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js +50 -0
  255. package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js.map +1 -0
  256. package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js +31 -0
  257. package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js.map +1 -0
  258. package/dist/esm/src/hooks/useDeviceList.js +40 -0
  259. package/dist/esm/src/hooks/useDeviceList.js.map +1 -0
  260. package/dist/esm/src/hooks/useDragToScroll.js +116 -0
  261. package/dist/esm/src/hooks/useDragToScroll.js.map +1 -0
  262. package/dist/esm/src/hooks/useFloatingUIPreset.js +34 -0
  263. package/dist/esm/src/hooks/useFloatingUIPreset.js.map +1 -0
  264. package/dist/esm/src/hooks/useLoopbackRecording.js +138 -0
  265. package/dist/esm/src/hooks/useLoopbackRecording.js.map +1 -0
  266. package/dist/esm/src/hooks/useModeration.js +135 -0
  267. package/dist/esm/src/hooks/useModeration.js.map +1 -0
  268. package/dist/esm/src/hooks/usePersistedDevicePreferences.js +16 -0
  269. package/dist/esm/src/hooks/usePersistedDevicePreferences.js.map +1 -0
  270. package/dist/esm/src/hooks/useRequestPermission.js +41 -0
  271. package/dist/esm/src/hooks/useRequestPermission.js.map +1 -0
  272. package/dist/esm/src/hooks/useScrollPosition.js +66 -0
  273. package/dist/esm/src/hooks/useScrollPosition.js.map +1 -0
  274. package/dist/esm/src/translations/en.json.js +177 -0
  275. package/dist/esm/src/translations/en.json.js.map +1 -0
  276. package/dist/esm/src/translations/index.js +6 -0
  277. package/dist/esm/src/translations/index.js.map +1 -0
  278. package/dist/esm/src/utilities/applyElementToRef.js +10 -0
  279. package/dist/esm/src/utilities/applyElementToRef.js.map +1 -0
  280. package/dist/esm/src/utilities/callControlHandler.js +29 -0
  281. package/dist/esm/src/utilities/callControlHandler.js.map +1 -0
  282. package/dist/esm/src/utilities/chunk.js +7 -0
  283. package/dist/esm/src/utilities/chunk.js.map +1 -0
  284. package/dist/esm/src/utilities/filter.js +94 -0
  285. package/dist/esm/src/utilities/filter.js.map +1 -0
  286. package/dist/esm/src/utilities/isComponentType.js +10 -0
  287. package/dist/esm/src/utilities/isComponentType.js.map +1 -0
  288. package/dist/esm/src/utilities/normalizeString.js +11 -0
  289. package/dist/esm/src/utilities/normalizeString.js.map +1 -0
  290. package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js +105 -0
  291. package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js.map +1 -0
  292. package/dist/index.cjs.js +136 -3
  293. package/dist/index.cjs.js.map +1 -1
  294. package/dist/index.d.ts +1 -1
  295. package/dist/src/hooks/index.d.ts +1 -0
  296. package/dist/src/hooks/useLoopbackRecording.d.ts +23 -0
  297. package/index.ts +4 -0
  298. package/package.json +15 -11
  299. package/src/components/BackgroundFilters/BackgroundFilters.tsx +139 -103
  300. package/src/hooks/index.ts +1 -0
  301. package/src/hooks/useLoopbackRecording.ts +207 -0
  302. package/dist/background-filters-D2U5UBbH.es.js.map +0 -1
  303. package/dist/background-filters-folwWrgs.cjs.js.map +0 -1
  304. package/dist/embedded-BackgroundFilters-D2U5UBbH.es.js +0 -420
  305. package/dist/embedded-BackgroundFilters-D2U5UBbH.es.js.map +0 -1
  306. package/dist/embedded-BackgroundFilters-folwWrgs.cjs.js.map +0 -1
  307. package/dist/embedded-CallStatsLatencyChart-Bj5OSYzg.es.js +0 -57
  308. package/dist/embedded-CallStatsLatencyChart-Bj5OSYzg.es.js.map +0 -1
  309. package/dist/embedded.es.js +0 -3536
  310. package/dist/embedded.es.js.map +0 -1
  311. package/dist/index.es.js +0 -3291
  312. package/dist/index.es.js.map +0 -1
  313. package/dist/latency-chart-Bj5OSYzg.es.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StreamCall.js","sources":["../../../../../../../../src/core/components/StreamCall/StreamCall.tsx"],"sourcesContent":["import { ComponentType, PropsWithChildren } from 'react';\nimport {\n StreamCallProvider,\n StreamCallProviderProps,\n} from '@stream-io/video-react-bindings';\n\n// re-exporting the StreamCallProvider as StreamCall\nexport const StreamCall: ComponentType<\n PropsWithChildren<StreamCallProviderProps>\n> = StreamCallProvider;\n\nStreamCall.displayName = 'StreamCall';\n"],"names":[],"mappings":";;AAMA;AACO,MAAM,UAAU,GAEnB;AAEJ,UAAU,CAAC,WAAW,GAAG,YAAY;;;;"}
@@ -0,0 +1,11 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { StreamVideoProvider } from '@stream-io/video-react-bindings';
3
+ import { translations } from '../../../translations/index.js';
4
+
5
+ const StreamVideo = (props) => {
6
+ return (jsx(StreamVideoProvider, { translationsOverrides: translations, ...props }));
7
+ };
8
+ StreamVideo.displayName = 'StreamVideo';
9
+
10
+ export { StreamVideo };
11
+ //# sourceMappingURL=StreamVideo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StreamVideo.js","sources":["../../../../../../../../src/core/components/StreamVideo/StreamVideo.tsx"],"sourcesContent":["import {\n StreamVideoProps,\n StreamVideoProvider,\n} from '@stream-io/video-react-bindings';\nimport { PropsWithChildren } from 'react';\nimport { translations } from '../../../translations';\n\nexport const StreamVideo = (props: PropsWithChildren<StreamVideoProps>) => {\n return (\n <StreamVideoProvider translationsOverrides={translations} {...props} />\n );\n};\n\nStreamVideo.displayName = 'StreamVideo';\n"],"names":["_jsx"],"mappings":";;;;AAOO,MAAM,WAAW,GAAG,CAAC,KAA0C,KAAI;IACxE,QACEA,GAAA,CAAC,mBAAmB,EAAA,EAAC,qBAAqB,EAAE,YAAY,EAAA,GAAM,KAAK,EAAA,CAAI;AAE3E;AAEA,WAAW,CAAC,WAAW,GAAG,aAAa;;;;"}
@@ -0,0 +1,41 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { forwardRef, useState, useEffect } from 'react';
3
+ import { Browsers } from '@stream-io/video-client';
4
+ import { applyElementToRef } from '../../../utilities/applyElementToRef.js';
5
+
6
+ /**
7
+ * @description Extends video element with `stream` property
8
+ * (`srcObject`) to reactively handle stream changes
9
+ */
10
+ const BaseVideo = forwardRef(function BaseVideoRender({ stream, ...rest }, ref) {
11
+ const [videoElement, setVideoElement] = useState(null);
12
+ useEffect(() => {
13
+ if (!videoElement || !stream)
14
+ return;
15
+ if (stream === videoElement.srcObject)
16
+ return;
17
+ videoElement.srcObject = stream;
18
+ let timeoutId;
19
+ if (Browsers.isSafari() || Browsers.isFirefox()) {
20
+ // Firefox and Safari have some timing issue
21
+ timeoutId = setTimeout(() => {
22
+ videoElement.srcObject = stream;
23
+ videoElement.play().catch((e) => {
24
+ console.error(`Failed to play stream`, e);
25
+ });
26
+ }, 0);
27
+ }
28
+ return () => {
29
+ clearTimeout(timeoutId);
30
+ videoElement.pause();
31
+ videoElement.srcObject = null;
32
+ };
33
+ }, [stream, videoElement]);
34
+ return (jsx("video", { autoPlay: true, playsInline: true, ...rest, ref: (element) => {
35
+ applyElementToRef(ref, element);
36
+ setVideoElement(element);
37
+ } }));
38
+ });
39
+
40
+ export { BaseVideo };
41
+ //# sourceMappingURL=BaseVideo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseVideo.js","sources":["../../../../../../../../src/core/components/Video/BaseVideo.tsx"],"sourcesContent":["import { ComponentPropsWithRef, forwardRef, useEffect, useState } from 'react';\nimport { Browsers } from '@stream-io/video-client';\n\nimport { applyElementToRef } from '../../../utilities';\n\nexport type BaseVideoProps = ComponentPropsWithRef<'video'> & {\n stream?: MediaStream;\n};\n\n/**\n * @description Extends video element with `stream` property\n * (`srcObject`) to reactively handle stream changes\n */\nexport const BaseVideo = forwardRef<HTMLVideoElement, BaseVideoProps>(\n function BaseVideoRender({ stream, ...rest }, ref) {\n const [videoElement, setVideoElement] = useState<HTMLVideoElement | null>(\n null,\n );\n\n useEffect(() => {\n if (!videoElement || !stream) return;\n if (stream === videoElement.srcObject) return;\n\n videoElement.srcObject = stream;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (Browsers.isSafari() || Browsers.isFirefox()) {\n // Firefox and Safari have some timing issue\n timeoutId = setTimeout(() => {\n videoElement.srcObject = stream;\n videoElement.play().catch((e) => {\n console.error(`Failed to play stream`, e);\n });\n }, 0);\n }\n\n return () => {\n clearTimeout(timeoutId);\n videoElement.pause();\n videoElement.srcObject = null;\n };\n }, [stream, videoElement]);\n\n return (\n <video\n autoPlay\n playsInline\n {...rest}\n ref={(element) => {\n applyElementToRef(ref, element);\n setVideoElement(element);\n }}\n />\n );\n },\n);\n"],"names":["_jsx"],"mappings":";;;;;AASA;;;AAGG;AACI,MAAM,SAAS,GAAG,UAAU,CACjC,SAAS,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,EAAA;IAC/C,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAC9C,IAAI,CACL;IAED,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM;YAAE;AAC9B,QAAA,IAAI,MAAM,KAAK,YAAY,CAAC,SAAS;YAAE;AAEvC,QAAA,YAAY,CAAC,SAAS,GAAG,MAAM;AAC/B,QAAA,IAAI,SAAoD;QACxD,IAAI,QAAQ,CAAC,QAAQ,EAAE,IAAI,QAAQ,CAAC,SAAS,EAAE,EAAE;;AAE/C,YAAA,SAAS,GAAG,UAAU,CAAC,MAAK;AAC1B,gBAAA,YAAY,CAAC,SAAS,GAAG,MAAM;gBAC/B,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAI;AAC9B,oBAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC,CAAC;AAC3C,gBAAA,CAAC,CAAC;YACJ,CAAC,EAAE,CAAC,CAAC;QACP;AAEA,QAAA,OAAO,MAAK;YACV,YAAY,CAAC,SAAS,CAAC;YACvB,YAAY,CAAC,KAAK,EAAE;AACpB,YAAA,YAAY,CAAC,SAAS,GAAG,IAAI;AAC/B,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAE1B,IAAA,QACEA,GAAA,CAAA,OAAA,EAAA,EACE,QAAQ,EAAA,IAAA,EACR,WAAW,EAAA,IAAA,EAAA,GACP,IAAI,EACR,GAAG,EAAE,CAAC,OAAO,KAAI;AACf,YAAA,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC;YAC/B,eAAe,CAAC,OAAO,CAAC;QAC1B,CAAC,EAAA,CACD;AAEN,CAAC;;;;"}
@@ -0,0 +1,21 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { forwardRef, useState } from 'react';
3
+
4
+ const BaseVideoPlaceholder = forwardRef(function DefaultVideoPlaceholder({ participant, style, children }, ref) {
5
+ const [error, setError] = useState(false);
6
+ const name = participant.name || participant.userId;
7
+ return (jsxs("div", { className: "str-video__video-placeholder", style: style, ref: ref, children: [(!participant.image || error) &&
8
+ (name ? (jsx(InitialsFallback, { name: name })) : (jsx("div", { className: "str-video__video-placeholder__no-video-label", children: children }))), participant.image && !error && (jsx("img", { onError: () => setError(true), alt: name, className: "str-video__video-placeholder__avatar", src: participant.image }))] }));
9
+ });
10
+ const InitialsFallback = (props) => {
11
+ const { name } = props;
12
+ const initials = name
13
+ .split(' ')
14
+ .slice(0, 2)
15
+ .map((n) => n[0])
16
+ .join('');
17
+ return (jsx("div", { className: "str-video__video-placeholder__initials-fallback", children: initials }));
18
+ };
19
+
20
+ export { BaseVideoPlaceholder };
21
+ //# sourceMappingURL=BaseVideoPlaceholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseVideoPlaceholder.js","sources":["../../../../../../../../src/core/components/Video/BaseVideoPlaceholder.tsx"],"sourcesContent":["import { ComponentProps, RefAttributes, forwardRef, useState } from 'react';\nimport type { StreamVideoParticipant } from '@stream-io/video-client';\n\nexport type BaseVideoPlaceholderProps = {\n participant: StreamVideoParticipant;\n} & RefAttributes<HTMLDivElement> &\n ComponentProps<'div'>;\n\nexport const BaseVideoPlaceholder = forwardRef<\n HTMLDivElement,\n BaseVideoPlaceholderProps\n>(function DefaultVideoPlaceholder({ participant, style, children }, ref) {\n const [error, setError] = useState(false);\n const name = participant.name || participant.userId;\n return (\n <div className=\"str-video__video-placeholder\" style={style} ref={ref}>\n {(!participant.image || error) &&\n (name ? (\n <InitialsFallback name={name} />\n ) : (\n <div className=\"str-video__video-placeholder__no-video-label\">\n {children}\n </div>\n ))}\n {participant.image && !error && (\n <img\n onError={() => setError(true)}\n alt={name}\n className=\"str-video__video-placeholder__avatar\"\n src={participant.image}\n />\n )}\n </div>\n );\n});\n\nconst InitialsFallback = (props: { name: string }) => {\n const { name } = props;\n const initials = name\n .split(' ')\n .slice(0, 2)\n .map((n) => n[0])\n .join('');\n return (\n <div className=\"str-video__video-placeholder__initials-fallback\">\n {initials}\n </div>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":";;;AAQO,MAAM,oBAAoB,GAAG,UAAU,CAG5C,SAAS,uBAAuB,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAA;IACtE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IACzC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,MAAM;IACnD,QACEA,cAAK,SAAS,EAAC,8BAA8B,EAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,aACjE,CAAC,CAAC,WAAW,CAAC,KAAK,IAAI,KAAK;AAC3B,iBAAC,IAAI,IACHC,GAAA,CAAC,gBAAgB,EAAA,EAAC,IAAI,EAAE,IAAI,EAAA,CAAI,KAEhCA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,8CAA8C,EAAA,QAAA,EAC1D,QAAQ,EAAA,CACL,CACP,CAAC,EACH,WAAW,CAAC,KAAK,IAAI,CAAC,KAAK,KAC1BA,GAAA,CAAA,KAAA,EAAA,EACE,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,EAC7B,GAAG,EAAE,IAAI,EACT,SAAS,EAAC,sCAAsC,EAChD,GAAG,EAAE,WAAW,CAAC,KAAK,EAAA,CACtB,CACH,CAAA,EAAA,CACG;AAEV,CAAC;AAED,MAAM,gBAAgB,GAAG,CAAC,KAAuB,KAAI;AACnD,IAAA,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK;IACtB,MAAM,QAAQ,GAAG;SACd,KAAK,CAAC,GAAG;AACT,SAAA,KAAK,CAAC,CAAC,EAAE,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACf,IAAI,CAAC,EAAE,CAAC;IACX,QACEA,aAAK,SAAS,EAAC,iDAAiD,EAAA,QAAA,EAC7D,QAAQ,EAAA,CACL;AAEV,CAAC;;;;"}
@@ -0,0 +1,12 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { forwardRef } from 'react';
3
+ import { useI18n } from '@stream-io/video-react-bindings';
4
+ import { BaseVideoPlaceholder } from './BaseVideoPlaceholder.js';
5
+
6
+ const DefaultPictureInPicturePlaceholder = forwardRef(function DefaultPictureInPicturePlaceholderRender(props, ref) {
7
+ const { t } = useI18n();
8
+ return (jsx(BaseVideoPlaceholder, { ref: ref, ...props, children: t('Video is playing in a popup') }));
9
+ });
10
+
11
+ export { DefaultPictureInPicturePlaceholder };
12
+ //# sourceMappingURL=DefaultPictureInPicturePlaceholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultPictureInPicturePlaceholder.js","sources":["../../../../../../../../src/core/components/Video/DefaultPictureInPicturePlaceholder.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport {\n BaseVideoPlaceholder,\n type BaseVideoPlaceholderProps,\n} from './BaseVideoPlaceholder';\n\nexport type PictureInPicturePlaceholderProps = BaseVideoPlaceholderProps;\n\nexport const DefaultPictureInPicturePlaceholder = forwardRef<\n HTMLDivElement,\n PictureInPicturePlaceholderProps\n>(function DefaultPictureInPicturePlaceholderRender(props, ref) {\n const { t } = useI18n();\n return (\n <BaseVideoPlaceholder ref={ref} {...props}>\n {t('Video is playing in a popup')}\n </BaseVideoPlaceholder>\n );\n});\n"],"names":["_jsx"],"mappings":";;;;;AASO,MAAM,kCAAkC,GAAG,UAAU,CAG1D,SAAS,wCAAwC,CAAC,KAAK,EAAE,GAAG,EAAA;AAC5D,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE;AACvB,IAAA,QACEA,GAAA,CAAC,oBAAoB,EAAA,EAAC,GAAG,EAAE,GAAG,EAAA,GAAM,KAAK,EAAA,QAAA,EACtC,CAAC,CAAC,6BAA6B,CAAC,EAAA,CACZ;AAE3B,CAAC;;;;"}
@@ -0,0 +1,12 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { forwardRef } from 'react';
3
+ import { useI18n } from '@stream-io/video-react-bindings';
4
+ import { BaseVideoPlaceholder } from './BaseVideoPlaceholder.js';
5
+
6
+ const DefaultVideoPlaceholder = forwardRef(function DefaultVideoPlaceholderRender(props, ref) {
7
+ const { t } = useI18n();
8
+ return (jsx(BaseVideoPlaceholder, { ref: ref, ...props, children: t('Video is disabled') }));
9
+ });
10
+
11
+ export { DefaultVideoPlaceholder };
12
+ //# sourceMappingURL=DefaultVideoPlaceholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultVideoPlaceholder.js","sources":["../../../../../../../../src/core/components/Video/DefaultVideoPlaceholder.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport {\n BaseVideoPlaceholder,\n type BaseVideoPlaceholderProps,\n} from './BaseVideoPlaceholder';\n\nexport type VideoPlaceholderProps = BaseVideoPlaceholderProps;\n\nexport const DefaultVideoPlaceholder = forwardRef<\n HTMLDivElement,\n VideoPlaceholderProps\n>(function DefaultVideoPlaceholderRender(props, ref) {\n const { t } = useI18n();\n return (\n <BaseVideoPlaceholder ref={ref} {...props}>\n {t('Video is disabled')}\n </BaseVideoPlaceholder>\n );\n});\n"],"names":["_jsx"],"mappings":";;;;;AASO,MAAM,uBAAuB,GAAG,UAAU,CAG/C,SAAS,6BAA6B,CAAC,KAAK,EAAE,GAAG,EAAA;AACjD,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE;AACvB,IAAA,QACEA,GAAA,CAAC,oBAAoB,EAAA,EAAC,GAAG,EAAE,GAAG,EAAA,GAAM,KAAK,EAAA,QAAA,EACtC,CAAC,CAAC,mBAAmB,CAAC,EAAA,CACF;AAE3B,CAAC;;;;"}
@@ -0,0 +1,88 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { useState, useLayoutEffect, useEffect } from 'react';
3
+ import { hasVideo, hasScreenShare, VisibilityState, hasPausedTrack } from '@stream-io/video-client';
4
+ import clsx from 'clsx';
5
+ import { DefaultVideoPlaceholder } from './DefaultVideoPlaceholder.js';
6
+ import { useCall } from '@stream-io/video-react-bindings';
7
+ import { usePictureInPictureState } from '../../hooks/usePictureInPictureState.js';
8
+ import { DefaultPictureInPicturePlaceholder } from './DefaultPictureInPicturePlaceholder.js';
9
+
10
+ const ABSOLUTE_POSITION_STYLE = { position: 'absolute' };
11
+ const Video = ({ enabled = true, mirror, trackType, participant, className, VideoPlaceholder = DefaultVideoPlaceholder, PictureInPicturePlaceholder = DefaultPictureInPicturePlaceholder, refs, ...rest }) => {
12
+ const { sessionId, videoStream, screenShareStream, viewportVisibilityState, isLocalParticipant, userId, } = participant;
13
+ const call = useCall();
14
+ const [videoElement, setVideoElement] = useState(null);
15
+ // start with true, will flip once the video starts playing
16
+ const [isVideoPaused, setIsVideoPaused] = useState(true);
17
+ const [isWideMode, setIsWideMode] = useState(true);
18
+ const isPiP = usePictureInPictureState(videoElement ?? undefined);
19
+ const stream = trackType === 'videoTrack'
20
+ ? videoStream
21
+ : trackType === 'screenShareTrack'
22
+ ? screenShareStream
23
+ : undefined;
24
+ useLayoutEffect(() => {
25
+ if (!call || !videoElement || trackType === 'none')
26
+ return;
27
+ const cleanup = call.bindVideoElement(videoElement, sessionId, trackType);
28
+ return () => {
29
+ cleanup?.();
30
+ };
31
+ }, [call, trackType, sessionId, videoElement]);
32
+ useEffect(() => {
33
+ if (!stream || !videoElement)
34
+ return;
35
+ const [track] = stream.getVideoTracks();
36
+ if (!track)
37
+ return;
38
+ const handlePlayPause = () => {
39
+ setIsVideoPaused(videoElement.paused);
40
+ const { width = 0, height = 0 } = track.getSettings();
41
+ setIsWideMode(width >= height);
42
+ };
43
+ // playback may have started before we had a chance to
44
+ // attach the 'play/pause' event listener, so we set the state
45
+ // here to make sure it's in sync
46
+ setIsVideoPaused(videoElement.paused);
47
+ videoElement.addEventListener('play', handlePlayPause);
48
+ videoElement.addEventListener('pause', handlePlayPause);
49
+ track.addEventListener('unmute', handlePlayPause);
50
+ return () => {
51
+ videoElement.removeEventListener('play', handlePlayPause);
52
+ videoElement.removeEventListener('pause', handlePlayPause);
53
+ track.removeEventListener('unmute', handlePlayPause);
54
+ // reset the 'pause' state once we unmount the video element
55
+ setIsVideoPaused(true);
56
+ };
57
+ }, [stream, videoElement]);
58
+ if (!call)
59
+ return null;
60
+ const isPublishingTrack = trackType === 'videoTrack'
61
+ ? hasVideo(participant)
62
+ : trackType === 'screenShareTrack'
63
+ ? hasScreenShare(participant)
64
+ : false;
65
+ const isInvisible = trackType === 'none' ||
66
+ viewportVisibilityState?.[trackType] === VisibilityState.INVISIBLE;
67
+ const hasNoVideoOrInvisible = !enabled ||
68
+ !isPublishingTrack ||
69
+ isInvisible ||
70
+ hasPausedTrack(participant, trackType);
71
+ const mirrorVideo = mirror === undefined
72
+ ? isLocalParticipant && trackType === 'videoTrack'
73
+ : mirror;
74
+ const isScreenShareTrack = trackType === 'screenShareTrack';
75
+ return (jsxs(Fragment, { children: [!hasNoVideoOrInvisible && (jsx("video", { ...rest, className: clsx('str-video__video', className, {
76
+ 'str-video__video--not-playing': isVideoPaused,
77
+ 'str-video__video--tall': !isWideMode,
78
+ 'str-video__video--mirror': mirrorVideo,
79
+ 'str-video__video--screen-share': isScreenShareTrack,
80
+ }), "data-user-id": userId, "data-session-id": sessionId, ref: (element) => {
81
+ setVideoElement(element);
82
+ refs?.setVideoElement?.(element);
83
+ } })), isPiP && PictureInPicturePlaceholder && (jsx(PictureInPicturePlaceholder, { style: ABSOLUTE_POSITION_STYLE, participant: participant })), (hasNoVideoOrInvisible || isVideoPaused) && VideoPlaceholder && (jsx(VideoPlaceholder, { style: ABSOLUTE_POSITION_STYLE, participant: participant, ref: refs?.setVideoPlaceholderElement }))] }));
84
+ };
85
+ Video.displayName = 'Video';
86
+
87
+ export { Video };
88
+ //# sourceMappingURL=Video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Video.js","sources":["../../../../../../../../src/core/components/Video/Video.tsx"],"sourcesContent":["import {\n ComponentPropsWithoutRef,\n ComponentType,\n CSSProperties,\n useEffect,\n useLayoutEffect,\n useState,\n} from 'react';\nimport {\n hasPausedTrack,\n hasScreenShare,\n hasVideo,\n StreamVideoParticipant,\n VideoTrackType,\n VisibilityState,\n} from '@stream-io/video-client';\nimport clsx from 'clsx';\nimport {\n DefaultVideoPlaceholder,\n VideoPlaceholderProps,\n} from './DefaultVideoPlaceholder';\nimport { useCall } from '@stream-io/video-react-bindings';\nimport { usePictureInPictureState } from '../../hooks/usePictureInPictureState';\nimport {\n DefaultPictureInPicturePlaceholder,\n PictureInPicturePlaceholderProps,\n} from './DefaultPictureInPicturePlaceholder';\n\nconst ABSOLUTE_POSITION_STYLE: CSSProperties = { position: 'absolute' };\n\nexport type VideoProps = ComponentPropsWithoutRef<'video'> & {\n /**\n * Pass false to disable rendering video and render fallback\n * even if the participant has published video.\n * @default true\n */\n enabled?: boolean;\n /**\n * Forces the video to be mirrored or unmirrored. By default, video track\n * from the local participant is mirrored, and all other videos are not mirrored.\n */\n mirror?: boolean;\n /**\n * The track type to display.\n */\n trackType: VideoTrackType | 'none';\n /**\n * The participant represented by this video element.\n */\n participant: StreamVideoParticipant;\n /**\n * Override the default UI that's visible when a participant turned off their video.\n * Set it to `null` if you wish to disable the video placeholder.\n *\n * @default DefaultVideoPlaceholder\n */\n VideoPlaceholder?: ComponentType<VideoPlaceholderProps> | null;\n /**\n * Override the default UI that's dispayed in place of the video when it's playing\n * in picture-in-picture. Set it to `null` if you wish to display the browser's default\n * placeholder.\n *\n * @default DefaultPictureInPicturePlaceholder\n */\n PictureInPicturePlaceholder?: ComponentType<PictureInPicturePlaceholderProps> | null;\n /**\n /**\n * An object with setRef functions\n * meant for exposing some of the internal elements of this component.\n */\n refs?: {\n /**\n * The video element that's used to play the video stream.\n * @param element the video element.\n */\n setVideoElement?: (element: HTMLVideoElement | null) => void;\n /**\n * The video placeholder element that's used when the video stream is not playing.\n * @param element the video placeholder element.\n */\n setVideoPlaceholderElement?: (element: HTMLDivElement | null) => void;\n setPictureInPicturePlaceholderElement?: (\n element: HTMLDivElement | null,\n ) => void;\n };\n};\n\nexport const Video = ({\n enabled = true,\n mirror,\n trackType,\n participant,\n className,\n VideoPlaceholder = DefaultVideoPlaceholder,\n PictureInPicturePlaceholder = DefaultPictureInPicturePlaceholder,\n refs,\n ...rest\n}: VideoProps) => {\n const {\n sessionId,\n videoStream,\n screenShareStream,\n viewportVisibilityState,\n isLocalParticipant,\n userId,\n } = participant;\n\n const call = useCall();\n const [videoElement, setVideoElement] = useState<HTMLVideoElement | null>(\n null,\n );\n // start with true, will flip once the video starts playing\n const [isVideoPaused, setIsVideoPaused] = useState(true);\n const [isWideMode, setIsWideMode] = useState(true);\n const isPiP = usePictureInPictureState(videoElement ?? undefined);\n\n const stream =\n trackType === 'videoTrack'\n ? videoStream\n : trackType === 'screenShareTrack'\n ? screenShareStream\n : undefined;\n\n useLayoutEffect(() => {\n if (!call || !videoElement || trackType === 'none') return;\n\n const cleanup = call.bindVideoElement(videoElement, sessionId, trackType);\n\n return () => {\n cleanup?.();\n };\n }, [call, trackType, sessionId, videoElement]);\n\n useEffect(() => {\n if (!stream || !videoElement) return;\n\n const [track] = stream.getVideoTracks();\n if (!track) return;\n\n const handlePlayPause = () => {\n setIsVideoPaused(videoElement.paused);\n\n const { width = 0, height = 0 } = track.getSettings();\n setIsWideMode(width >= height);\n };\n\n // playback may have started before we had a chance to\n // attach the 'play/pause' event listener, so we set the state\n // here to make sure it's in sync\n setIsVideoPaused(videoElement.paused);\n\n videoElement.addEventListener('play', handlePlayPause);\n videoElement.addEventListener('pause', handlePlayPause);\n track.addEventListener('unmute', handlePlayPause);\n return () => {\n videoElement.removeEventListener('play', handlePlayPause);\n videoElement.removeEventListener('pause', handlePlayPause);\n track.removeEventListener('unmute', handlePlayPause);\n\n // reset the 'pause' state once we unmount the video element\n setIsVideoPaused(true);\n };\n }, [stream, videoElement]);\n\n if (!call) return null;\n\n const isPublishingTrack =\n trackType === 'videoTrack'\n ? hasVideo(participant)\n : trackType === 'screenShareTrack'\n ? hasScreenShare(participant)\n : false;\n\n const isInvisible =\n trackType === 'none' ||\n viewportVisibilityState?.[trackType] === VisibilityState.INVISIBLE;\n\n const hasNoVideoOrInvisible =\n !enabled ||\n !isPublishingTrack ||\n isInvisible ||\n hasPausedTrack(participant, trackType);\n const mirrorVideo =\n mirror === undefined\n ? isLocalParticipant && trackType === 'videoTrack'\n : mirror;\n const isScreenShareTrack = trackType === 'screenShareTrack';\n return (\n <>\n {!hasNoVideoOrInvisible && (\n <video\n {...rest}\n className={clsx('str-video__video', className, {\n 'str-video__video--not-playing': isVideoPaused,\n 'str-video__video--tall': !isWideMode,\n 'str-video__video--mirror': mirrorVideo,\n 'str-video__video--screen-share': isScreenShareTrack,\n })}\n data-user-id={userId}\n data-session-id={sessionId}\n ref={(element) => {\n setVideoElement(element);\n refs?.setVideoElement?.(element);\n }}\n />\n )}\n {isPiP && PictureInPicturePlaceholder && (\n <PictureInPicturePlaceholder\n style={ABSOLUTE_POSITION_STYLE}\n participant={participant}\n />\n )}\n {/* TODO: add condition to \"hold\" the placeholder until track unmutes as well */}\n {(hasNoVideoOrInvisible || isVideoPaused) && VideoPlaceholder && (\n <VideoPlaceholder\n style={ABSOLUTE_POSITION_STYLE}\n participant={participant}\n ref={refs?.setVideoPlaceholderElement}\n />\n )}\n </>\n );\n};\n\nVideo.displayName = 'Video';\n"],"names":["_jsxs","_Fragment","_jsx"],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { useState, useEffect } from 'react';
2
+
3
+ const useCalculateHardLimit = (
4
+ /**
5
+ * Element that stretches to 100% of the whole layout component
6
+ */
7
+ wrapperElement,
8
+ /**
9
+ * Element that directly hosts individual `ParticipantView` (or wrapper) elements
10
+ */
11
+ hostElement, limit) => {
12
+ const [calculatedLimit, setCalculatedLimit] = useState({
13
+ vertical: typeof limit === 'number' ? limit : null,
14
+ horizontal: typeof limit === 'number' ? limit : null,
15
+ });
16
+ useEffect(() => {
17
+ if (!hostElement ||
18
+ !wrapperElement ||
19
+ typeof limit === 'number' ||
20
+ typeof limit === 'undefined')
21
+ return;
22
+ let childWidth = null;
23
+ let childHeight = null;
24
+ const resizeObserver = new ResizeObserver((entries, observer) => {
25
+ // this part should ideally run as little times as possible
26
+ // get child measurements and disconnect
27
+ // does not consider dynamically sized children
28
+ // this hook is for SpeakerLayout use only, where children in the bar are fixed size
29
+ if (entries.length > 1) {
30
+ const child = hostElement.firstChild;
31
+ if (child) {
32
+ childHeight = child.clientHeight;
33
+ childWidth = child.clientWidth;
34
+ observer.unobserve(hostElement);
35
+ }
36
+ }
37
+ // keep the state at { vertical: 1, horizontal: 1 }
38
+ // until we get the proper child measurements
39
+ if (childHeight === null || childWidth === null)
40
+ return;
41
+ const vertical = Math.floor(wrapperElement.clientHeight / childHeight);
42
+ const horizontal = Math.floor(wrapperElement.clientWidth / childWidth);
43
+ setCalculatedLimit((pv) => {
44
+ if (pv.vertical !== vertical || pv.horizontal !== horizontal)
45
+ return { vertical, horizontal };
46
+ return pv;
47
+ });
48
+ });
49
+ resizeObserver.observe(wrapperElement);
50
+ resizeObserver.observe(hostElement);
51
+ return () => {
52
+ resizeObserver.disconnect();
53
+ };
54
+ }, [hostElement, limit, wrapperElement]);
55
+ return calculatedLimit;
56
+ };
57
+
58
+ export { useCalculateHardLimit };
59
+ //# sourceMappingURL=useCalculateHardLimit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCalculateHardLimit.js","sources":["../../../../../../../src/core/hooks/useCalculateHardLimit.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nexport const useCalculateHardLimit = (\n /**\n * Element that stretches to 100% of the whole layout component\n */\n wrapperElement: HTMLDivElement | null,\n /**\n * Element that directly hosts individual `ParticipantView` (or wrapper) elements\n */\n hostElement: HTMLDivElement | null,\n limit?: 'dynamic' | number,\n) => {\n const [calculatedLimit, setCalculatedLimit] = useState<{\n vertical: number | null;\n horizontal: number | null;\n }>({\n vertical: typeof limit === 'number' ? limit : null,\n horizontal: typeof limit === 'number' ? limit : null,\n });\n\n useEffect(() => {\n if (\n !hostElement ||\n !wrapperElement ||\n typeof limit === 'number' ||\n typeof limit === 'undefined'\n )\n return;\n\n let childWidth: number | null = null;\n let childHeight: number | null = null;\n\n const resizeObserver = new ResizeObserver((entries, observer) => {\n // this part should ideally run as little times as possible\n // get child measurements and disconnect\n // does not consider dynamically sized children\n // this hook is for SpeakerLayout use only, where children in the bar are fixed size\n if (entries.length > 1) {\n const child = hostElement.firstChild as HTMLElement | null;\n\n if (child) {\n childHeight = child.clientHeight;\n childWidth = child.clientWidth;\n observer.unobserve(hostElement);\n }\n }\n\n // keep the state at { vertical: 1, horizontal: 1 }\n // until we get the proper child measurements\n if (childHeight === null || childWidth === null) return;\n\n const vertical = Math.floor(wrapperElement.clientHeight / childHeight);\n const horizontal = Math.floor(wrapperElement.clientWidth / childWidth);\n\n setCalculatedLimit((pv) => {\n if (pv.vertical !== vertical || pv.horizontal !== horizontal)\n return { vertical, horizontal };\n return pv;\n });\n });\n\n resizeObserver.observe(wrapperElement);\n resizeObserver.observe(hostElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [hostElement, limit, wrapperElement]);\n\n return calculatedLimit;\n};\n"],"names":[],"mappings":";;AAEO,MAAM,qBAAqB,GAAG;AACnC;;AAEG;AACH,cAAqC;AACrC;;AAEG;AACH,WAAkC,EAClC,KAA0B,KACxB;AACF,IAAA,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAGnD;AACD,QAAA,QAAQ,EAAE,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,IAAI;AAClD,QAAA,UAAU,EAAE,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,IAAI;AACrD,KAAA,CAAC;IAEF,SAAS,CAAC,MAAK;AACb,QAAA,IACE,CAAC,WAAW;AACZ,YAAA,CAAC,cAAc;YACf,OAAO,KAAK,KAAK,QAAQ;YACzB,OAAO,KAAK,KAAK,WAAW;YAE5B;QAEF,IAAI,UAAU,GAAkB,IAAI;QACpC,IAAI,WAAW,GAAkB,IAAI;QAErC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAI;;;;;AAK9D,YAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AACtB,gBAAA,MAAM,KAAK,GAAG,WAAW,CAAC,UAAgC;gBAE1D,IAAI,KAAK,EAAE;AACT,oBAAA,WAAW,GAAG,KAAK,CAAC,YAAY;AAChC,oBAAA,UAAU,GAAG,KAAK,CAAC,WAAW;AAC9B,oBAAA,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC;gBACjC;YACF;;;AAIA,YAAA,IAAI,WAAW,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI;gBAAE;AAEjD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,GAAG,WAAW,CAAC;AACtE,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,GAAG,UAAU,CAAC;AAEtE,YAAA,kBAAkB,CAAC,CAAC,EAAE,KAAI;gBACxB,IAAI,EAAE,CAAC,QAAQ,KAAK,QAAQ,IAAI,EAAE,CAAC,UAAU,KAAK,UAAU;AAC1D,oBAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE;AACjC,gBAAA,OAAO,EAAE;AACX,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC;AACtC,QAAA,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC;AAEnC,QAAA,OAAO,MAAK;YACV,cAAc,CAAC,UAAU,EAAE;AAC7B,QAAA,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;AAExC,IAAA,OAAO,eAAe;AACxB;;;;"}
@@ -0,0 +1,24 @@
1
+ import { useState, useEffect } from 'react';
2
+
3
+ function usePictureInPictureState(videoElement) {
4
+ const [isPiP, setIsPiP] = useState(document.pictureInPictureElement === videoElement);
5
+ if (!videoElement && isPiP)
6
+ setIsPiP(false);
7
+ useEffect(() => {
8
+ if (!videoElement)
9
+ return;
10
+ const handlePiP = () => {
11
+ setIsPiP(document.pictureInPictureElement === videoElement);
12
+ };
13
+ videoElement.addEventListener('enterpictureinpicture', handlePiP);
14
+ videoElement.addEventListener('leavepictureinpicture', handlePiP);
15
+ return () => {
16
+ videoElement.removeEventListener('enterpictureinpicture', handlePiP);
17
+ videoElement.removeEventListener('leavepictureinpicture', handlePiP);
18
+ };
19
+ }, [videoElement]);
20
+ return isPiP;
21
+ }
22
+
23
+ export { usePictureInPictureState };
24
+ //# sourceMappingURL=usePictureInPictureState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePictureInPictureState.js","sources":["../../../../../../../src/core/hooks/usePictureInPictureState.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nexport function usePictureInPictureState(videoElement?: HTMLVideoElement) {\n const [isPiP, setIsPiP] = useState(\n document.pictureInPictureElement === videoElement,\n );\n\n if (!videoElement && isPiP) setIsPiP(false);\n\n useEffect(() => {\n if (!videoElement) return;\n\n const handlePiP = () => {\n setIsPiP(document.pictureInPictureElement === videoElement);\n };\n\n videoElement.addEventListener('enterpictureinpicture', handlePiP);\n videoElement.addEventListener('leavepictureinpicture', handlePiP);\n\n return () => {\n videoElement.removeEventListener('enterpictureinpicture', handlePiP);\n videoElement.removeEventListener('leavepictureinpicture', handlePiP);\n };\n }, [videoElement]);\n\n return isPiP;\n}\n"],"names":[],"mappings":";;AAEM,SAAU,wBAAwB,CAAC,YAA+B,EAAA;AACtE,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAChC,QAAQ,CAAC,uBAAuB,KAAK,YAAY,CAClD;IAED,IAAI,CAAC,YAAY,IAAI,KAAK;QAAE,QAAQ,CAAC,KAAK,CAAC;IAE3C,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,YAAY;YAAE;QAEnB,MAAM,SAAS,GAAG,MAAK;AACrB,YAAA,QAAQ,CAAC,QAAQ,CAAC,uBAAuB,KAAK,YAAY,CAAC;AAC7D,QAAA,CAAC;AAED,QAAA,YAAY,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,SAAS,CAAC;AACjE,QAAA,YAAY,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,SAAS,CAAC;AAEjE,QAAA,OAAO,MAAK;AACV,YAAA,YAAY,CAAC,mBAAmB,CAAC,uBAAuB,EAAE,SAAS,CAAC;AACpE,YAAA,YAAY,CAAC,mBAAmB,CAAC,uBAAuB,EAAE,SAAS,CAAC;AACtE,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;AAElB,IAAA,OAAO,KAAK;AACd;;;;"}
@@ -0,0 +1,14 @@
1
+ import { useEffect } from 'react';
2
+ import { useCall } from '@stream-io/video-react-bindings';
3
+
4
+ const useTrackElementVisibility = ({ trackedElement, sessionId, trackType, }) => {
5
+ const call = useCall();
6
+ useEffect(() => {
7
+ if (!trackedElement || !call || trackType === 'none')
8
+ return;
9
+ return call.trackElementVisibility(trackedElement, sessionId, trackType);
10
+ }, [trackedElement, call, sessionId, trackType]);
11
+ };
12
+
13
+ export { useTrackElementVisibility };
14
+ //# sourceMappingURL=useTrackElementVisibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTrackElementVisibility.js","sources":["../../../../../../../src/core/hooks/useTrackElementVisibility.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { VideoTrackType } from '@stream-io/video-client';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport const useTrackElementVisibility = <T extends HTMLElement>({\n trackedElement,\n sessionId,\n trackType,\n}: {\n trackedElement: T | null;\n sessionId: string;\n trackType: VideoTrackType | 'none';\n}) => {\n const call = useCall();\n useEffect(() => {\n if (!trackedElement || !call || trackType === 'none') return;\n return call.trackElementVisibility(trackedElement, sessionId, trackType);\n }, [trackedElement, call, sessionId, trackType]);\n};\n"],"names":[],"mappings":";;;AAIO,MAAM,yBAAyB,GAAG,CAAwB,EAC/D,cAAc,EACd,SAAS,EACT,SAAS,GAKV,KAAI;AACH,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE;IACtB,SAAS,CAAC,MAAK;QACb,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,IAAI,SAAS,KAAK,MAAM;YAAE;QACtD,OAAO,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,SAAS,EAAE,SAAS,CAAC;IAC1E,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAClD;;;;"}
@@ -0,0 +1,83 @@
1
+ import { jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useState, useCallback } from 'react';
3
+ import { useEffectEvent } from '@stream-io/video-react-bindings';
4
+ import '../core/components/Audio/Audio.js';
5
+ import '../core/components/Audio/ParticipantsAudio.js';
6
+ import '@stream-io/video-client';
7
+ import '../core/components/ParticipantView/ParticipantViewContext.js';
8
+ import '../components/Menu/MenuToggle.js';
9
+ import 'clsx';
10
+ import '../core/components/ParticipantView/ParticipantView.js';
11
+ import '../core/components/ParticipantView/DefaultParticipantViewUI.js';
12
+ import { StreamCall } from '../core/components/StreamCall/StreamCall.js';
13
+ import { StreamVideo } from '../core/components/StreamVideo/StreamVideo.js';
14
+ import '../core/components/Video/BaseVideo.js';
15
+ import '../core/components/Video/Video.js';
16
+ import '../core/components/CallLayout/LivestreamLayout.js';
17
+ import '../core/components/CallLayout/PaginatedGridLayout.js';
18
+ import '../core/components/CallLayout/SpeakerLayout.js';
19
+ import '../core/components/CallLayout/PipLayout/Pip.js';
20
+ import '../core/components/CallLayout/PipLayout/Host.js';
21
+ import '../core/components/CallLayout/PipLayout/Grid.js';
22
+ import { BackgroundFiltersProvider } from '../components/BackgroundFilters/BackgroundFiltersProvider.js';
23
+ import '../components/Button/CompositeButton.js';
24
+ import '../components/Button/IconButton.js';
25
+ import '@floating-ui/react';
26
+ import '../components/CallControls/RecordCallButton.js';
27
+ import '../components/CallControls/ReactionsButton.js';
28
+ import '../components/DeviceSettings/DeviceSettings.js';
29
+ import '../components/DropdownSelect/DropdownSelect.js';
30
+ import '../components/CallControls/CancelCallButton.js';
31
+ import '../components/CallControls/CallStatsButton.js';
32
+ import '../components/CallParticipantsList/CallParticipantsList.js';
33
+ import '../components/CallParticipantsList/CallParticipantListingItem.js';
34
+ import { LoadingIndicator } from '../components/LoadingIndicator/LoadingIndicator.js';
35
+ import '../components/CallStats/CallStats.js';
36
+ import { NoiseCancellationProvider } from '../components/NoiseCancellation/NoiseCancellationProvider.js';
37
+ import '../components/RingingCall/RingingCall.js';
38
+ import '../components/Permissions/PermissionRequests.js';
39
+ import { StreamTheme } from '../components/StreamTheme/StreamTheme.js';
40
+ import '../core/components/Video/DefaultVideoPlaceholder.js';
41
+ import { ConfigurationProvider } from './context/ConfigurationContext.js';
42
+ import './shared/Lobby/ToggleMicButton.js';
43
+ import './shared/Lobby/ToggleCameraButton.js';
44
+ import { useEmbeddedClient } from './hooks/useEmbeddedClient.js';
45
+
46
+ const NoiseCancellationWrapper = ({ noiseCancellation, children, }) => {
47
+ if (!noiseCancellation) {
48
+ return jsx(Fragment, { children: children });
49
+ }
50
+ return (jsx(NoiseCancellationProvider, { noiseCancellation: noiseCancellation, children: children }));
51
+ };
52
+ /**
53
+ * Shared provider wrapper for embedded components.
54
+ * Handles client/call initialization and wraps children with all necessary providers.
55
+ */
56
+ const EmbeddedClientProvider = ({ apiKey, user, callId, callType, token, tokenProvider, logLevel, onError, layout, theme, children, }) => {
57
+ const [showError, setShowError] = useState(false);
58
+ const onErrorStable = useEffectEvent(onError ?? console.error);
59
+ const handleError = useCallback((error) => {
60
+ setShowError(true);
61
+ onErrorStable(error);
62
+ }, [onErrorStable]);
63
+ const { client, call, noiseCancellation, noiseCancellationReady } = useEmbeddedClient({
64
+ apiKey,
65
+ user,
66
+ callId,
67
+ callType,
68
+ token,
69
+ tokenProvider,
70
+ logLevel,
71
+ handleError,
72
+ });
73
+ if (showError) {
74
+ return (jsx(StreamTheme, { className: "str-video__embedded", children: jsx("div", { className: "str-video__embedded-error", children: jsx("p", { className: "str-video__embedded-error__message", children: "An error occurred while initializing the client. Please try again later." }) }) }));
75
+ }
76
+ if (!call || !client || !noiseCancellationReady) {
77
+ return (jsx(StreamTheme, { className: "str-video__embedded", children: jsx(LoadingIndicator, { className: "str-video__embedded-loading" }) }));
78
+ }
79
+ return (jsx(StreamVideo, { client: client, children: jsx(StreamCall, { call: call, children: jsx(ConfigurationProvider, { layout: layout, onError: onErrorStable, children: jsx(BackgroundFiltersProvider, { children: jsx(NoiseCancellationWrapper, { noiseCancellation: noiseCancellation, children: jsx(StreamTheme, { className: "str-video__embedded", style: theme, children: children }) }) }) }) }) }));
80
+ };
81
+
82
+ export { EmbeddedClientProvider };
83
+ //# sourceMappingURL=EmbeddedClientProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbeddedClientProvider.js","sources":["../../../../../../src/embedded/EmbeddedClientProvider.tsx"],"sourcesContent":["import { useCallback, useState, type ReactNode } from 'react';\nimport type { INoiseCancellation } from '@stream-io/audio-filters-web';\nimport { useEffectEvent as useEffectEventShim } from '@stream-io/video-react-bindings';\n\nimport { StreamCall, StreamVideo } from '../core';\nimport {\n StreamTheme,\n BackgroundFiltersProvider,\n NoiseCancellationProvider,\n} from '../components';\nimport { ConfigurationProvider } from './context';\nimport { useEmbeddedClient } from './hooks';\nimport type { LogLevel, TokenProvider } from '@stream-io/video-client';\nimport type { EmbeddedUser, LayoutOption } from './types';\nimport { LoadingIndicator } from '../components';\n\nexport interface EmbeddedClientProviderProps {\n apiKey: string;\n user: EmbeddedUser;\n callId: string;\n callType: string;\n token?: string;\n tokenProvider?: TokenProvider;\n logLevel?: LogLevel;\n onError?: (error: any) => void;\n layout?: LayoutOption;\n theme?: Record<string, string>;\n children: ReactNode;\n}\n\nconst NoiseCancellationWrapper = ({\n noiseCancellation,\n children,\n}: {\n noiseCancellation?: INoiseCancellation;\n children: ReactNode;\n}) => {\n if (!noiseCancellation) {\n return <>{children}</>;\n }\n\n return (\n <NoiseCancellationProvider noiseCancellation={noiseCancellation}>\n {children}\n </NoiseCancellationProvider>\n );\n};\n\n/**\n * Shared provider wrapper for embedded components.\n * Handles client/call initialization and wraps children with all necessary providers.\n */\nexport const EmbeddedClientProvider = ({\n apiKey,\n user,\n callId,\n callType,\n token,\n tokenProvider,\n logLevel,\n onError,\n layout,\n theme,\n children,\n}: EmbeddedClientProviderProps) => {\n const [showError, setShowError] = useState<boolean>(false);\n\n const onErrorStable = useEffectEventShim(onError ?? console.error);\n const handleError = useCallback(\n (error: any) => {\n setShowError(true);\n onErrorStable(error);\n },\n [onErrorStable],\n );\n\n const { client, call, noiseCancellation, noiseCancellationReady } =\n useEmbeddedClient({\n apiKey,\n user,\n callId,\n callType,\n token,\n tokenProvider,\n logLevel,\n handleError,\n });\n\n if (showError) {\n return (\n <StreamTheme className=\"str-video__embedded\">\n <div className=\"str-video__embedded-error\">\n <p className=\"str-video__embedded-error__message\">\n An error occurred while initializing the client. Please try again\n later.\n </p>\n </div>\n </StreamTheme>\n );\n }\n\n if (!call || !client || !noiseCancellationReady) {\n return (\n <StreamTheme className=\"str-video__embedded\">\n <LoadingIndicator className=\"str-video__embedded-loading\" />\n </StreamTheme>\n );\n }\n\n return (\n <StreamVideo client={client}>\n <StreamCall call={call}>\n <ConfigurationProvider layout={layout} onError={onErrorStable}>\n <BackgroundFiltersProvider>\n <NoiseCancellationWrapper noiseCancellation={noiseCancellation}>\n <StreamTheme className=\"str-video__embedded\" style={theme}>\n {children}\n </StreamTheme>\n </NoiseCancellationWrapper>\n </BackgroundFiltersProvider>\n </ConfigurationProvider>\n </StreamCall>\n </StreamVideo>\n );\n};\n"],"names":["_jsx","_Fragment","useEffectEventShim"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,MAAM,wBAAwB,GAAG,CAAC,EAChC,iBAAiB,EACjB,QAAQ,GAIT,KAAI;IACH,IAAI,CAAC,iBAAiB,EAAE;QACtB,OAAOA,GAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAI;IACxB;IAEA,QACED,GAAA,CAAC,yBAAyB,EAAA,EAAC,iBAAiB,EAAE,iBAAiB,EAAA,QAAA,EAC5D,QAAQ,EAAA,CACiB;AAEhC,CAAC;AAED;;;AAGG;AACI,MAAM,sBAAsB,GAAG,CAAC,EACrC,MAAM,EACN,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,KAAK,EACL,aAAa,EACb,QAAQ,EACR,OAAO,EACP,MAAM,EACN,KAAK,EACL,QAAQ,GACoB,KAAI;IAChC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC;IAE1D,MAAM,aAAa,GAAGE,cAAkB,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;AAClE,IAAA,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,KAAU,KAAI;QACb,YAAY,CAAC,IAAI,CAAC;QAClB,aAAa,CAAC,KAAK,CAAC;AACtB,IAAA,CAAC,EACD,CAAC,aAAa,CAAC,CAChB;IAED,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,GAC/D,iBAAiB,CAAC;QAChB,MAAM;QACN,IAAI;QACJ,MAAM;QACN,QAAQ;QACR,KAAK;QACL,aAAa;QACb,QAAQ;QACR,WAAW;AACZ,KAAA,CAAC;IAEJ,IAAI,SAAS,EAAE;QACb,QACEF,IAAC,WAAW,EAAA,EAAC,SAAS,EAAC,qBAAqB,YAC1CA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,2BAA2B,EAAA,QAAA,EACxCA,WAAG,SAAS,EAAC,oCAAoC,EAAA,QAAA,EAAA,0EAAA,EAAA,CAG7C,EAAA,CACA,EAAA,CACM;IAElB;IAEA,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,sBAAsB,EAAE;AAC/C,QAAA,QACEA,GAAA,CAAC,WAAW,EAAA,EAAC,SAAS,EAAC,qBAAqB,EAAA,QAAA,EAC1CA,GAAA,CAAC,gBAAgB,IAAC,SAAS,EAAC,6BAA6B,EAAA,CAAG,EAAA,CAChD;IAElB;IAEA,QACEA,GAAA,CAAC,WAAW,EAAA,EAAC,MAAM,EAAE,MAAM,EAAA,QAAA,EACzBA,GAAA,CAAC,UAAU,EAAA,EAAC,IAAI,EAAE,IAAI,EAAA,QAAA,EACpBA,GAAA,CAAC,qBAAqB,EAAA,EAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAA,QAAA,EAC3DA,GAAA,CAAC,yBAAyB,EAAA,EAAA,QAAA,EACxBA,GAAA,CAAC,wBAAwB,EAAA,EAAC,iBAAiB,EAAE,iBAAiB,EAAA,QAAA,EAC5DA,GAAA,CAAC,WAAW,EAAA,EAAC,SAAS,EAAC,qBAAqB,EAAC,KAAK,EAAE,KAAK,EAAA,QAAA,EACtD,QAAQ,EAAA,CACG,EAAA,CACW,EAAA,CACD,EAAA,CACN,EAAA,CACb,EAAA,CACD;AAElB;;;;"}
@@ -0,0 +1,65 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { OwnCapability } from '@stream-io/video-client';
3
+ import { useI18n, useCallStateHooks, Restricted } from '@stream-io/video-react-bindings';
4
+ import 'react';
5
+ import 'clsx';
6
+ import '../../components/BackgroundFilters/BackgroundFiltersProvider.js';
7
+ import { CompositeButton } from '../../components/Button/CompositeButton.js';
8
+ import '../../components/Button/IconButton.js';
9
+ import '@floating-ui/react';
10
+ import { MicCaptureErrorNotification } from '../../components/Notification/MicCaptureErrorNotification.js';
11
+ import { RecordCallConfirmationButton } from '../../components/CallControls/RecordCallButton.js';
12
+ import { ReactionsButton } from '../../components/CallControls/ReactionsButton.js';
13
+ import { ScreenShareButton } from '../../components/CallControls/ScreenShareButton.js';
14
+ import { ToggleAudioPublishingButton } from '../../components/CallControls/ToggleAudioButton.js';
15
+ import { ToggleVideoPublishingButton } from '../../components/CallControls/ToggleVideoButton.js';
16
+ import { CancelCallConfirmButton } from '../../components/CallControls/CancelCallButton.js';
17
+ import '../../components/CallControls/CallStatsButton.js';
18
+ import { Icon } from '../../components/Icon/Icon.js';
19
+ import '../../components/DeviceSettings/DeviceSettings.js';
20
+ import '../../components/DropdownSelect/DropdownSelect.js';
21
+ import '../../components/Menu/MenuToggle.js';
22
+ import { DeviceSelectorAudioInput, DeviceSelectorAudioOutput } from '../../components/DeviceSettings/DeviceSelectorAudio.js';
23
+ import { WithTooltip } from '../../components/Tooltip/WithTooltip.js';
24
+ import '../../components/CallParticipantsList/CallParticipantsList.js';
25
+ import '../../components/CallParticipantsList/CallParticipantListingItem.js';
26
+ import '../../components/CallStats/CallStats.js';
27
+ import '../../components/NoiseCancellation/NoiseCancellationProvider.js';
28
+ import '../../components/RingingCall/RingingCall.js';
29
+ import '../../components/Permissions/PermissionRequests.js';
30
+ import '../../core/components/Video/Video.js';
31
+ import '../../core/components/Video/BaseVideo.js';
32
+ import '../../core/components/Video/DefaultVideoPlaceholder.js';
33
+ import '../../core/components/Audio/Audio.js';
34
+ import '../../core/components/Audio/ParticipantsAudio.js';
35
+ import '../../core/components/ParticipantView/ParticipantViewContext.js';
36
+ import '../../core/components/ParticipantView/ParticipantView.js';
37
+ import '../../core/components/ParticipantView/DefaultParticipantViewUI.js';
38
+ import '../../core/components/StreamCall/StreamCall.js';
39
+ import '../../core/components/StreamVideo/StreamVideo.js';
40
+ import '../../core/components/CallLayout/LivestreamLayout.js';
41
+ import '../../core/components/CallLayout/PaginatedGridLayout.js';
42
+ import '../../core/components/CallLayout/SpeakerLayout.js';
43
+ import '../../core/components/CallLayout/PipLayout/Pip.js';
44
+ import '../../core/components/CallLayout/PipLayout/Host.js';
45
+ import '../../core/components/CallLayout/PipLayout/Grid.js';
46
+ import '../context/ConfigurationContext.js';
47
+ import { CameraMenuWithBlur } from '../shared/BlurToggleButton/BlurToggleButton.js';
48
+ import '../shared/Lobby/ToggleMicButton.js';
49
+ import '../shared/Lobby/ToggleCameraButton.js';
50
+ import { useCallDuration } from '../hooks/useCallDuration.js';
51
+
52
+ /**
53
+ * Renders the active call control bar
54
+ */
55
+ const CallControls = ({ showParticipants, onToggleParticipants, }) => {
56
+ const { t } = useI18n();
57
+ const { useCallSession } = useCallStateHooks();
58
+ const session = useCallSession();
59
+ const startedAt = session?.started_at;
60
+ const { elapsed } = useCallDuration(startedAt);
61
+ return (jsxs("div", { className: "str-video__embedded-call-controls str-video__call-controls", children: [jsxs("div", { className: "str-video__call-controls--group str-video__call-controls--options", children: [jsx(Restricted, { requiredGrants: [OwnCapability.CREATE_REACTION], children: jsx("div", { className: "str-video__embedded-mobile", children: jsx(ReactionsButton, {}) }) }), startedAt && (jsxs("div", { className: "str-video__embedded-call-duration str-video__embedded-desktop", children: [jsx(Icon, { icon: "verified", className: "str-video__embedded-call-duration__icon" }), jsx("span", { className: "str-video__embedded-call-duration__time", children: elapsed })] }))] }), jsxs("div", { className: "str-video__call-controls--group str-video__call-controls--media", children: [jsx(Restricted, { requiredGrants: [OwnCapability.SEND_AUDIO], hasPermissionsOnly: true, children: jsx(MicCaptureErrorNotification, { children: jsx(ToggleAudioPublishingButton, { Menu: jsxs(Fragment, { children: [jsx(DeviceSelectorAudioInput, { visualType: "list", title: t('Microphone') }), jsx(DeviceSelectorAudioOutput, { visualType: "list", title: t('Speaker') })] }), menuPlacement: "top" }) }) }), jsx(Restricted, { requiredGrants: [OwnCapability.SEND_VIDEO], hasPermissionsOnly: true, children: jsx(ToggleVideoPublishingButton, { Menu: jsx(CameraMenuWithBlur, {}), menuPlacement: "top" }) }), jsx(Restricted, { requiredGrants: [OwnCapability.CREATE_REACTION], children: jsx("div", { className: "str-video__embedded-desktop", children: jsx(ReactionsButton, {}) }) }), jsx(Restricted, { requiredGrants: [OwnCapability.SCREENSHARE], children: jsx("div", { className: "str-video__embedded-desktop", children: jsx(ScreenShareButton, {}) }) }), jsx(RecordCallConfirmationButton, {}), jsx("div", { className: "str-video__embedded-desktop", children: jsx(CancelCallConfirmButton, {}) })] }), jsx("div", { className: "str-video__call-controls--group str-video__call-controls--sidebar", children: jsx(WithTooltip, { title: t('Participants'), children: jsx(CompositeButton, { active: showParticipants, "aria-label": t('Participants'), "aria-pressed": showParticipants, onClick: onToggleParticipants, children: jsx(Icon, { icon: "participants" }) }) }) })] }));
62
+ };
63
+
64
+ export { CallControls };
65
+ //# sourceMappingURL=CallControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CallControls.js","sources":["../../../../../../../src/embedded/call/CallControls.tsx"],"sourcesContent":["import { OwnCapability } from '@stream-io/video-client';\nimport {\n Restricted,\n useCallStateHooks,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport {\n CancelCallConfirmButton,\n CompositeButton,\n DeviceSelectorAudioInput,\n DeviceSelectorAudioOutput,\n Icon,\n MicCaptureErrorNotification,\n ReactionsButton,\n RecordCallConfirmationButton,\n ScreenShareButton,\n ToggleAudioPublishingButton,\n ToggleVideoPublishingButton,\n WithTooltip,\n} from '../../components';\n\nimport { useCallDuration } from '../hooks';\nimport { CameraMenuWithBlur } from '../shared';\n\ninterface CallControlsProps {\n showParticipants: boolean;\n onToggleParticipants: () => void;\n}\n\n/**\n * Renders the active call control bar\n */\nexport const CallControls = ({\n showParticipants,\n onToggleParticipants,\n}: CallControlsProps) => {\n const { t } = useI18n();\n const { useCallSession } = useCallStateHooks();\n const session = useCallSession();\n const startedAt = session?.started_at;\n const { elapsed } = useCallDuration(startedAt);\n\n return (\n <div className=\"str-video__embedded-call-controls str-video__call-controls\">\n <div className=\"str-video__call-controls--group str-video__call-controls--options\">\n <Restricted requiredGrants={[OwnCapability.CREATE_REACTION]}>\n <div className=\"str-video__embedded-mobile\">\n <ReactionsButton />\n </div>\n </Restricted>\n {startedAt && (\n <div className=\"str-video__embedded-call-duration str-video__embedded-desktop\">\n <Icon\n icon=\"verified\"\n className=\"str-video__embedded-call-duration__icon\"\n />\n <span className=\"str-video__embedded-call-duration__time\">\n {elapsed}\n </span>\n </div>\n )}\n </div>\n <div className=\"str-video__call-controls--group str-video__call-controls--media\">\n <Restricted\n requiredGrants={[OwnCapability.SEND_AUDIO]}\n hasPermissionsOnly\n >\n <MicCaptureErrorNotification>\n <ToggleAudioPublishingButton\n Menu={\n <>\n <DeviceSelectorAudioInput\n visualType=\"list\"\n title={t('Microphone')}\n />\n <DeviceSelectorAudioOutput\n visualType=\"list\"\n title={t('Speaker')}\n />\n </>\n }\n menuPlacement=\"top\"\n />\n </MicCaptureErrorNotification>\n </Restricted>\n <Restricted\n requiredGrants={[OwnCapability.SEND_VIDEO]}\n hasPermissionsOnly\n >\n <ToggleVideoPublishingButton\n Menu={<CameraMenuWithBlur />}\n menuPlacement=\"top\"\n />\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.CREATE_REACTION]}>\n <div className=\"str-video__embedded-desktop\">\n <ReactionsButton />\n </div>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.SCREENSHARE]}>\n <div className=\"str-video__embedded-desktop\">\n <ScreenShareButton />\n </div>\n </Restricted>\n <RecordCallConfirmationButton />\n <div className=\"str-video__embedded-desktop\">\n <CancelCallConfirmButton />\n </div>\n </div>\n <div className=\"str-video__call-controls--group str-video__call-controls--sidebar\">\n <WithTooltip title={t('Participants')}>\n <CompositeButton\n active={showParticipants}\n aria-label={t('Participants')}\n aria-pressed={showParticipants}\n onClick={onToggleParticipants}\n >\n <Icon icon=\"participants\" />\n </CompositeButton>\n </WithTooltip>\n </div>\n </div>\n );\n};\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}