@stream-io/video-react-sdk 1.41.0 → 1.43.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 (312) hide show
  1. package/CHANGELOG.md +30 -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/esm/embedded.js +3 -0
  8. package/dist/esm/embedded.js.map +1 -0
  9. package/dist/esm/index.js +92 -0
  10. package/dist/esm/index.js.map +1 -0
  11. package/dist/esm/src/components/Avatar/Avatar.js +14 -0
  12. package/dist/esm/src/components/Avatar/Avatar.js.map +1 -0
  13. package/dist/{background-filters-D2U5UBbH.es.js → esm/src/components/BackgroundFilters/BackgroundFilters.js} +97 -71
  14. package/dist/esm/src/components/BackgroundFilters/BackgroundFilters.js.map +1 -0
  15. package/dist/esm/src/components/BackgroundFilters/BackgroundFiltersProvider.js +33 -0
  16. package/dist/esm/src/components/BackgroundFilters/BackgroundFiltersProvider.js.map +1 -0
  17. package/dist/esm/src/components/Button/CompositeButton.js +29 -0
  18. package/dist/esm/src/components/Button/CompositeButton.js.map +1 -0
  19. package/dist/esm/src/components/Button/IconButton.js +18 -0
  20. package/dist/esm/src/components/Button/IconButton.js.map +1 -0
  21. package/dist/esm/src/components/Button/TextButton.js +8 -0
  22. package/dist/esm/src/components/Button/TextButton.js.map +1 -0
  23. package/dist/esm/src/components/CallControls/AcceptCallButton.js +28 -0
  24. package/dist/esm/src/components/CallControls/AcceptCallButton.js.map +1 -0
  25. package/dist/esm/src/components/CallControls/CallControls.js +21 -0
  26. package/dist/esm/src/components/CallControls/CallControls.js.map +1 -0
  27. package/dist/esm/src/components/CallControls/CallStatsButton.js +18 -0
  28. package/dist/esm/src/components/CallControls/CallStatsButton.js.map +1 -0
  29. package/dist/esm/src/components/CallControls/CancelCallButton.js +78 -0
  30. package/dist/esm/src/components/CallControls/CancelCallButton.js.map +1 -0
  31. package/dist/esm/src/components/CallControls/ReactionsButton.js +61 -0
  32. package/dist/esm/src/components/CallControls/ReactionsButton.js.map +1 -0
  33. package/dist/esm/src/components/CallControls/RecordCallButton.js +64 -0
  34. package/dist/esm/src/components/CallControls/RecordCallButton.js.map +1 -0
  35. package/dist/esm/src/components/CallControls/ScreenShareButton.js +44 -0
  36. package/dist/esm/src/components/CallControls/ScreenShareButton.js.map +1 -0
  37. package/dist/esm/src/components/CallControls/ToggleAudioButton.js +72 -0
  38. package/dist/esm/src/components/CallControls/ToggleAudioButton.js.map +1 -0
  39. package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js +27 -0
  40. package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js.map +1 -0
  41. package/dist/esm/src/components/CallControls/ToggleVideoButton.js +81 -0
  42. package/dist/esm/src/components/CallControls/ToggleVideoButton.js.map +1 -0
  43. package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js +23 -0
  44. package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js.map +1 -0
  45. package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js +15 -0
  46. package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js.map +1 -0
  47. package/dist/esm/src/components/CallParticipantsList/CallParticipantListing.js +7 -0
  48. package/dist/esm/src/components/CallParticipantsList/CallParticipantListing.js.map +1 -0
  49. package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js +46 -0
  50. package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js.map +1 -0
  51. package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js +81 -0
  52. package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js.map +1 -0
  53. package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js +10 -0
  54. package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js.map +1 -0
  55. package/dist/esm/src/components/CallPreview/CallPreview.js +24 -0
  56. package/dist/esm/src/components/CallPreview/CallPreview.js.map +1 -0
  57. package/dist/esm/src/components/CallRecordingList/CallRecordingList.js +12 -0
  58. package/dist/esm/src/components/CallRecordingList/CallRecordingList.js.map +1 -0
  59. package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js +12 -0
  60. package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js.map +1 -0
  61. package/dist/esm/src/components/CallRecordingList/CallRecordingListItem.js +14 -0
  62. package/dist/esm/src/components/CallRecordingList/CallRecordingListItem.js.map +1 -0
  63. package/dist/esm/src/components/CallRecordingList/EmptyCallRecordingListing.js +8 -0
  64. package/dist/esm/src/components/CallRecordingList/EmptyCallRecordingListing.js.map +1 -0
  65. package/dist/esm/src/components/CallRecordingList/LoadingCallRecordingListing.js +10 -0
  66. package/dist/esm/src/components/CallRecordingList/LoadingCallRecordingListing.js.map +1 -0
  67. package/dist/esm/src/components/CallStats/CallStats.js +180 -0
  68. package/dist/esm/src/components/CallStats/CallStats.js.map +1 -0
  69. package/dist/{latency-chart-Bj5OSYzg.es.js → esm/src/components/CallStats/CallStatsLatencyChart.js} +1 -1
  70. package/dist/esm/src/components/CallStats/CallStatsLatencyChart.js.map +1 -0
  71. package/dist/esm/src/components/DeviceSettings/AudioVolumeIndicator.js +27 -0
  72. package/dist/esm/src/components/DeviceSettings/AudioVolumeIndicator.js.map +1 -0
  73. package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js +42 -0
  74. package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js.map +1 -0
  75. package/dist/esm/src/components/DeviceSettings/DeviceSelector.js +67 -0
  76. package/dist/esm/src/components/DeviceSettings/DeviceSelector.js.map +1 -0
  77. package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js +26 -0
  78. package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js.map +1 -0
  79. package/dist/esm/src/components/DeviceSettings/DeviceSelectorVideo.js +15 -0
  80. package/dist/esm/src/components/DeviceSettings/DeviceSelectorVideo.js.map +1 -0
  81. package/dist/esm/src/components/DeviceSettings/DeviceSettings.js +26 -0
  82. package/dist/esm/src/components/DeviceSettings/DeviceSettings.js.map +1 -0
  83. package/dist/esm/src/components/DeviceSettings/DeviceVideoPreviewItem.js +42 -0
  84. package/dist/esm/src/components/DeviceSettings/DeviceVideoPreviewItem.js.map +1 -0
  85. package/dist/esm/src/components/DeviceSettings/SpeakerTest.js +57 -0
  86. package/dist/esm/src/components/DeviceSettings/SpeakerTest.js.map +1 -0
  87. package/dist/esm/src/components/DropdownSelect/DropdownSelect.js +79 -0
  88. package/dist/esm/src/components/DropdownSelect/DropdownSelect.js.map +1 -0
  89. package/dist/esm/src/components/Icon/Icon.js +7 -0
  90. package/dist/esm/src/components/Icon/Icon.js.map +1 -0
  91. package/dist/esm/src/components/LoadingIndicator/LoadingIndicator.js +9 -0
  92. package/dist/esm/src/components/LoadingIndicator/LoadingIndicator.js.map +1 -0
  93. package/dist/esm/src/components/Menu/GenericMenu.js +19 -0
  94. package/dist/esm/src/components/Menu/GenericMenu.js.map +1 -0
  95. package/dist/esm/src/components/Menu/MenuToggle.js +75 -0
  96. package/dist/esm/src/components/Menu/MenuToggle.js.map +1 -0
  97. package/dist/esm/src/components/NoiseCancellation/NoiseCancellationProvider.js +96 -0
  98. package/dist/esm/src/components/NoiseCancellation/NoiseCancellationProvider.js.map +1 -0
  99. package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js +23 -0
  100. package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js.map +1 -0
  101. package/dist/esm/src/components/Notification/Notification.js +31 -0
  102. package/dist/esm/src/components/Notification/Notification.js.map +1 -0
  103. package/dist/esm/src/components/Notification/PermissionNotification.js +32 -0
  104. package/dist/esm/src/components/Notification/PermissionNotification.js.map +1 -0
  105. package/dist/esm/src/components/Notification/RecordingInProgressNotification.js +23 -0
  106. package/dist/esm/src/components/Notification/RecordingInProgressNotification.js.map +1 -0
  107. package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js +14 -0
  108. package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js.map +1 -0
  109. package/dist/esm/src/components/Permissions/PermissionRequests.js +99 -0
  110. package/dist/esm/src/components/Permissions/PermissionRequests.js.map +1 -0
  111. package/dist/esm/src/components/Reaction/Reaction.js +32 -0
  112. package/dist/esm/src/components/Reaction/Reaction.js.map +1 -0
  113. package/dist/esm/src/components/RingingCall/RingingCall.js +48 -0
  114. package/dist/esm/src/components/RingingCall/RingingCall.js.map +1 -0
  115. package/dist/esm/src/components/RingingCall/RingingCallControls.js +34 -0
  116. package/dist/esm/src/components/RingingCall/RingingCallControls.js.map +1 -0
  117. package/dist/esm/src/components/Search/SearchInput.js +27 -0
  118. package/dist/esm/src/components/Search/SearchInput.js.map +1 -0
  119. package/dist/esm/src/components/Search/SearchResults.js +15 -0
  120. package/dist/esm/src/components/Search/SearchResults.js.map +1 -0
  121. package/dist/esm/src/components/Search/hooks/useSearch.js +38 -0
  122. package/dist/esm/src/components/Search/hooks/useSearch.js.map +1 -0
  123. package/dist/esm/src/components/StreamTheme/StreamTheme.js +9 -0
  124. package/dist/esm/src/components/StreamTheme/StreamTheme.js.map +1 -0
  125. package/dist/esm/src/components/Tooltip/Tooltip.js +29 -0
  126. package/dist/esm/src/components/Tooltip/Tooltip.js.map +1 -0
  127. package/dist/esm/src/components/Tooltip/WithTooltip.js +15 -0
  128. package/dist/esm/src/components/Tooltip/WithTooltip.js.map +1 -0
  129. package/dist/esm/src/components/Tooltip/hooks/useEnterLeaveHandlers.js +17 -0
  130. package/dist/esm/src/components/Tooltip/hooks/useEnterLeaveHandlers.js.map +1 -0
  131. package/dist/esm/src/components/VideoPreview/VideoPreview.js +37 -0
  132. package/dist/esm/src/components/VideoPreview/VideoPreview.js.map +1 -0
  133. package/dist/esm/src/core/components/Audio/Audio.js +22 -0
  134. package/dist/esm/src/core/components/Audio/Audio.js.map +1 -0
  135. package/dist/esm/src/core/components/Audio/ParticipantsAudio.js +23 -0
  136. package/dist/esm/src/core/components/Audio/ParticipantsAudio.js.map +1 -0
  137. package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js +150 -0
  138. package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js.map +1 -0
  139. package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js +79 -0
  140. package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js.map +1 -0
  141. package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js +80 -0
  142. package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js.map +1 -0
  143. package/dist/esm/src/core/components/CallLayout/PipLayout/Host.js +13 -0
  144. package/dist/esm/src/core/components/CallLayout/PipLayout/Host.js.map +1 -0
  145. package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js +57 -0
  146. package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js.map +1 -0
  147. package/dist/esm/src/core/components/CallLayout/PipLayout/index.js +8 -0
  148. package/dist/esm/src/core/components/CallLayout/PipLayout/index.js.map +1 -0
  149. package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js +103 -0
  150. package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js.map +1 -0
  151. package/dist/esm/src/core/components/CallLayout/hooks.js +62 -0
  152. package/dist/esm/src/core/components/CallLayout/hooks.js.map +1 -0
  153. package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js +94 -0
  154. package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js.map +1 -0
  155. package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js +97 -0
  156. package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js.map +1 -0
  157. package/dist/esm/src/core/components/ParticipantView/ParticipantView.js +65 -0
  158. package/dist/esm/src/core/components/ParticipantView/ParticipantView.js.map +1 -0
  159. package/dist/esm/src/core/components/ParticipantView/ParticipantViewContext.js +7 -0
  160. package/dist/esm/src/core/components/ParticipantView/ParticipantViewContext.js.map +1 -0
  161. package/dist/esm/src/core/components/StreamCall/StreamCall.js +8 -0
  162. package/dist/esm/src/core/components/StreamCall/StreamCall.js.map +1 -0
  163. package/dist/esm/src/core/components/StreamVideo/StreamVideo.js +11 -0
  164. package/dist/esm/src/core/components/StreamVideo/StreamVideo.js.map +1 -0
  165. package/dist/esm/src/core/components/Video/BaseVideo.js +41 -0
  166. package/dist/esm/src/core/components/Video/BaseVideo.js.map +1 -0
  167. package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js +21 -0
  168. package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js.map +1 -0
  169. package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js +12 -0
  170. package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js.map +1 -0
  171. package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js +12 -0
  172. package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js.map +1 -0
  173. package/dist/esm/src/core/components/Video/Video.js +88 -0
  174. package/dist/esm/src/core/components/Video/Video.js.map +1 -0
  175. package/dist/esm/src/core/hooks/useCalculateHardLimit.js +59 -0
  176. package/dist/esm/src/core/hooks/useCalculateHardLimit.js.map +1 -0
  177. package/dist/esm/src/core/hooks/usePictureInPictureState.js +24 -0
  178. package/dist/esm/src/core/hooks/usePictureInPictureState.js.map +1 -0
  179. package/dist/esm/src/core/hooks/useTrackElementVisibility.js +14 -0
  180. package/dist/esm/src/core/hooks/useTrackElementVisibility.js.map +1 -0
  181. package/dist/esm/src/embedded/EmbeddedClientProvider.js +83 -0
  182. package/dist/esm/src/embedded/EmbeddedClientProvider.js.map +1 -0
  183. package/dist/esm/src/embedded/call/CallControls.js +65 -0
  184. package/dist/esm/src/embedded/call/CallControls.js.map +1 -0
  185. package/dist/esm/src/embedded/call/CallHeader.js +57 -0
  186. package/dist/esm/src/embedded/call/CallHeader.js.map +1 -0
  187. package/dist/esm/src/embedded/call/CallLayout.js +63 -0
  188. package/dist/esm/src/embedded/call/CallLayout.js.map +1 -0
  189. package/dist/esm/src/embedded/call/CallStateRouter.js +87 -0
  190. package/dist/esm/src/embedded/call/CallStateRouter.js.map +1 -0
  191. package/dist/esm/src/embedded/call/EmbeddedCall.js +12 -0
  192. package/dist/esm/src/embedded/call/EmbeddedCall.js.map +1 -0
  193. package/dist/esm/src/embedded/context/ConfigurationContext.js +21 -0
  194. package/dist/esm/src/embedded/context/ConfigurationContext.js.map +1 -0
  195. package/dist/esm/src/embedded/hooks/useCallDuration.js +32 -0
  196. package/dist/esm/src/embedded/hooks/useCallDuration.js.map +1 -0
  197. package/dist/esm/src/embedded/hooks/useEmbeddedClient.js +40 -0
  198. package/dist/esm/src/embedded/hooks/useEmbeddedClient.js.map +1 -0
  199. package/dist/esm/src/embedded/hooks/useInitializeCall.js +39 -0
  200. package/dist/esm/src/embedded/hooks/useInitializeCall.js.map +1 -0
  201. package/dist/esm/src/embedded/hooks/useInitializeVideoClient.js +93 -0
  202. package/dist/esm/src/embedded/hooks/useInitializeVideoClient.js.map +1 -0
  203. package/dist/esm/src/embedded/hooks/useIsLivestreamPaused.js +42 -0
  204. package/dist/esm/src/embedded/hooks/useIsLivestreamPaused.js.map +1 -0
  205. package/dist/esm/src/embedded/hooks/useLayout.js +122 -0
  206. package/dist/esm/src/embedded/hooks/useLayout.js.map +1 -0
  207. package/dist/esm/src/embedded/hooks/useNoiseCancellationLoader.js +48 -0
  208. package/dist/esm/src/embedded/hooks/useNoiseCancellationLoader.js.map +1 -0
  209. package/dist/esm/src/embedded/hooks/useWakeLock.js +34 -0
  210. package/dist/esm/src/embedded/hooks/useWakeLock.js.map +1 -0
  211. package/dist/esm/src/embedded/livestream/EmbeddedLivestream.js +11 -0
  212. package/dist/esm/src/embedded/livestream/EmbeddedLivestream.js.map +1 -0
  213. package/dist/esm/src/embedded/livestream/LivestreamUI.js +17 -0
  214. package/dist/esm/src/embedded/livestream/LivestreamUI.js.map +1 -0
  215. package/dist/esm/src/embedded/livestream/host/HostLayout.js +76 -0
  216. package/dist/esm/src/embedded/livestream/host/HostLayout.js.map +1 -0
  217. package/dist/esm/src/embedded/livestream/host/HostStateRouter.js +110 -0
  218. package/dist/esm/src/embedded/livestream/host/HostStateRouter.js.map +1 -0
  219. package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js +74 -0
  220. package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js.map +1 -0
  221. package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js +109 -0
  222. package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js.map +1 -0
  223. package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js +105 -0
  224. package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js.map +1 -0
  225. package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js +65 -0
  226. package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js.map +1 -0
  227. package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js +34 -0
  228. package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js.map +1 -0
  229. package/dist/esm/src/embedded/shared/CallFeedback/CallFeedback.js +35 -0
  230. package/dist/esm/src/embedded/shared/CallFeedback/CallFeedback.js.map +1 -0
  231. package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js +18 -0
  232. package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js.map +1 -0
  233. package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js +37 -0
  234. package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js.map +1 -0
  235. package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js +34 -0
  236. package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js.map +1 -0
  237. package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js +56 -0
  238. package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js.map +1 -0
  239. package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js +42 -0
  240. package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js.map +1 -0
  241. package/dist/esm/src/embedded/shared/JoinError/JoinError.js +34 -0
  242. package/dist/esm/src/embedded/shared/JoinError/JoinError.js.map +1 -0
  243. package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js +44 -0
  244. package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js.map +1 -0
  245. package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js +31 -0
  246. package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js.map +1 -0
  247. package/dist/esm/src/embedded/shared/Lobby/Lobby.js +45 -0
  248. package/dist/esm/src/embedded/shared/Lobby/Lobby.js.map +1 -0
  249. package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js +40 -0
  250. package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js.map +1 -0
  251. package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js +41 -0
  252. package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js.map +1 -0
  253. package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js +50 -0
  254. package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js.map +1 -0
  255. package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js +31 -0
  256. package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js.map +1 -0
  257. package/dist/esm/src/hooks/useDeviceList.js +40 -0
  258. package/dist/esm/src/hooks/useDeviceList.js.map +1 -0
  259. package/dist/esm/src/hooks/useDragToScroll.js +116 -0
  260. package/dist/esm/src/hooks/useDragToScroll.js.map +1 -0
  261. package/dist/esm/src/hooks/useFloatingUIPreset.js +34 -0
  262. package/dist/esm/src/hooks/useFloatingUIPreset.js.map +1 -0
  263. package/dist/esm/src/hooks/useLoopbackRecording.js +138 -0
  264. package/dist/esm/src/hooks/useLoopbackRecording.js.map +1 -0
  265. package/dist/esm/src/hooks/useModeration.js +135 -0
  266. package/dist/esm/src/hooks/useModeration.js.map +1 -0
  267. package/dist/esm/src/hooks/usePersistedDevicePreferences.js +16 -0
  268. package/dist/esm/src/hooks/usePersistedDevicePreferences.js.map +1 -0
  269. package/dist/esm/src/hooks/useRequestPermission.js +41 -0
  270. package/dist/esm/src/hooks/useRequestPermission.js.map +1 -0
  271. package/dist/esm/src/hooks/useScrollPosition.js +66 -0
  272. package/dist/esm/src/hooks/useScrollPosition.js.map +1 -0
  273. package/dist/esm/src/translations/en.json.js +177 -0
  274. package/dist/esm/src/translations/en.json.js.map +1 -0
  275. package/dist/esm/src/translations/index.js +6 -0
  276. package/dist/esm/src/translations/index.js.map +1 -0
  277. package/dist/esm/src/utilities/applyElementToRef.js +10 -0
  278. package/dist/esm/src/utilities/applyElementToRef.js.map +1 -0
  279. package/dist/esm/src/utilities/callControlHandler.js +29 -0
  280. package/dist/esm/src/utilities/callControlHandler.js.map +1 -0
  281. package/dist/esm/src/utilities/chunk.js +7 -0
  282. package/dist/esm/src/utilities/chunk.js.map +1 -0
  283. package/dist/esm/src/utilities/filter.js +94 -0
  284. package/dist/esm/src/utilities/filter.js.map +1 -0
  285. package/dist/esm/src/utilities/isComponentType.js +10 -0
  286. package/dist/esm/src/utilities/isComponentType.js.map +1 -0
  287. package/dist/esm/src/utilities/normalizeString.js +11 -0
  288. package/dist/esm/src/utilities/normalizeString.js.map +1 -0
  289. package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js +105 -0
  290. package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js.map +1 -0
  291. package/dist/index.cjs.js +136 -3
  292. package/dist/index.cjs.js.map +1 -1
  293. package/dist/index.d.ts +1 -1
  294. package/dist/src/hooks/index.d.ts +1 -0
  295. package/dist/src/hooks/useLoopbackRecording.d.ts +23 -0
  296. package/index.ts +4 -0
  297. package/package.json +14 -10
  298. package/src/components/BackgroundFilters/BackgroundFilters.tsx +139 -103
  299. package/src/hooks/index.ts +1 -0
  300. package/src/hooks/useLoopbackRecording.ts +207 -0
  301. package/dist/background-filters-D2U5UBbH.es.js.map +0 -1
  302. package/dist/background-filters-folwWrgs.cjs.js.map +0 -1
  303. package/dist/embedded-BackgroundFilters-D2U5UBbH.es.js +0 -420
  304. package/dist/embedded-BackgroundFilters-D2U5UBbH.es.js.map +0 -1
  305. package/dist/embedded-BackgroundFilters-folwWrgs.cjs.js.map +0 -1
  306. package/dist/embedded-CallStatsLatencyChart-Bj5OSYzg.es.js +0 -57
  307. package/dist/embedded-CallStatsLatencyChart-Bj5OSYzg.es.js.map +0 -1
  308. package/dist/embedded.es.js +0 -3536
  309. package/dist/embedded.es.js.map +0 -1
  310. package/dist/index.es.js +0 -3291
  311. package/dist/index.es.js.map +0 -1
  312. package/dist/latency-chart-Bj5OSYzg.es.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompositeButton.js","sources":["../../../../../../../src/components/Button/CompositeButton.tsx"],"sourcesContent":["import clsx from 'clsx';\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\nimport {\n ComponentProps,\n ComponentType,\n forwardRef,\n PropsWithChildren,\n ReactElement,\n} from 'react';\nimport { Placement } from '@floating-ui/react';\n\nimport { IconButton } from './IconButton';\nimport { isComponentType } from '../../utilities';\n\nexport type IconButtonWithMenuProps<E extends HTMLElement = HTMLButtonElement> =\n PropsWithChildren<{\n active?: boolean;\n Menu?: ComponentType | ReactElement | null;\n caption?: string;\n className?: string;\n menuPlacement?: Placement;\n menuOffset?: number;\n ToggleMenuButton?: ComponentType<ToggleMenuButtonProps<E>>;\n variant?: 'primary' | 'secondary';\n onMenuToggle?: (menuShown: boolean) => void;\n }> &\n ComponentProps<'button'>;\n\nexport const CompositeButton = forwardRef<\n HTMLDivElement,\n IconButtonWithMenuProps\n>(function CompositeButtonRender(\n {\n disabled,\n caption,\n children,\n className,\n active,\n Menu,\n menuPlacement,\n menuOffset,\n title,\n ToggleMenuButton = DefaultToggleMenuButton,\n variant,\n onClick,\n onMenuToggle,\n ...restButtonProps\n },\n ref,\n) {\n return (\n <div\n className={clsx('str-video__composite-button', className, {\n 'str-video__composite-button--caption': caption,\n 'str-video__composite-button--menu': Menu,\n })}\n title={title}\n ref={ref}\n >\n <div\n className={clsx('str-video__composite-button__button-group', {\n 'str-video__composite-button__button-group--active': active,\n 'str-video__composite-button__button-group--active-primary':\n active && variant === 'primary',\n 'str-video__composite-button__button-group--active-secondary':\n active && variant === 'secondary',\n 'str-video__composite-button__button-group--disabled': disabled,\n })}\n >\n <button\n type=\"button\"\n className=\"str-video__composite-button__button\"\n onClick={(e) => {\n e.preventDefault();\n onClick?.(e);\n }}\n disabled={disabled}\n {...restButtonProps}\n >\n {children}\n </button>\n {Menu && (\n <MenuToggle\n offset={menuOffset}\n placement={menuPlacement}\n ToggleButton={ToggleMenuButton}\n onToggle={onMenuToggle}\n >\n {isComponentType(Menu) ? <Menu /> : Menu}\n </MenuToggle>\n )}\n </div>\n {caption && (\n <div className=\"str-video__composite-button__caption\">{caption}</div>\n )}\n </div>\n );\n});\n\nconst DefaultToggleMenuButton = forwardRef<\n HTMLButtonElement,\n ToggleMenuButtonProps\n>(function DefaultToggleMenuButtonRender({ menuShown }, ref) {\n return (\n <IconButton\n className={clsx('str-video__menu-toggle-button', {\n 'str-video__menu-toggle-button--active': menuShown,\n })}\n icon={menuShown ? 'caret-down' : 'caret-up'}\n ref={ref}\n />\n );\n});\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;AA4BO,MAAM,eAAe,GAAG,UAAU,CAGvC,SAAS,qBAAqB,CAC9B,EACE,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,SAAS,EACT,MAAM,EACN,IAAI,EACJ,aAAa,EACb,UAAU,EACV,KAAK,EACL,gBAAgB,GAAG,uBAAuB,EAC1C,OAAO,EACP,OAAO,EACP,YAAY,EACZ,GAAG,eAAe,EACnB,EACD,GAAG,EAAA;IAEH,QACEA,cACE,SAAS,EAAE,IAAI,CAAC,6BAA6B,EAAE,SAAS,EAAE;AACxD,YAAA,sCAAsC,EAAE,OAAO;AAC/C,YAAA,mCAAmC,EAAE,IAAI;AAC1C,SAAA,CAAC,EACF,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,GAAG,EAAA,QAAA,EAAA,CAERA,cACE,SAAS,EAAE,IAAI,CAAC,2CAA2C,EAAE;AAC3D,oBAAA,mDAAmD,EAAE,MAAM;AAC3D,oBAAA,2DAA2D,EACzD,MAAM,IAAI,OAAO,KAAK,SAAS;AACjC,oBAAA,6DAA6D,EAC3D,MAAM,IAAI,OAAO,KAAK,WAAW;AACnC,oBAAA,qDAAqD,EAAE,QAAQ;AAChE,iBAAA,CAAC,EAAA,QAAA,EAAA,CAEFC,GAAA,CAAA,QAAA,EAAA,EACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,qCAAqC,EAC/C,OAAO,EAAE,CAAC,CAAC,KAAI;4BACb,CAAC,CAAC,cAAc,EAAE;AAClB,4BAAA,OAAO,GAAG,CAAC,CAAC;AACd,wBAAA,CAAC,EACD,QAAQ,EAAE,QAAQ,EAAA,GACd,eAAe,EAAA,QAAA,EAElB,QAAQ,EAAA,CACF,EACR,IAAI,KACHA,GAAA,CAAC,UAAU,EAAA,EACT,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,aAAa,EACxB,YAAY,EAAE,gBAAgB,EAC9B,QAAQ,EAAE,YAAY,EAAA,QAAA,EAErB,eAAe,CAAC,IAAI,CAAC,GAAGA,GAAA,CAAC,IAAI,EAAA,EAAA,CAAG,GAAG,IAAI,EAAA,CAC7B,CACd,CAAA,EAAA,CACG,EACL,OAAO,KACNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,sCAAsC,EAAA,QAAA,EAAE,OAAO,EAAA,CAAO,CACtE,CAAA,EAAA,CACG;AAEV,CAAC;AAED,MAAM,uBAAuB,GAAG,UAAU,CAGxC,SAAS,6BAA6B,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,EAAA;IACzD,QACEA,IAAC,UAAU,EAAA,EACT,SAAS,EAAE,IAAI,CAAC,+BAA+B,EAAE;AAC/C,YAAA,uCAAuC,EAAE,SAAS;AACnD,SAAA,CAAC,EACF,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,UAAU,EAC3C,GAAG,EAAE,GAAG,EAAA,CACR;AAEN,CAAC,CAAC;;;;"}
@@ -0,0 +1,18 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { forwardRef } from 'react';
3
+ import clsx from 'clsx';
4
+ import { Icon } from '../Icon/Icon.js';
5
+
6
+ const IconButton = forwardRef(function IconButtonRender(props, ref) {
7
+ const { icon, enabled, variant, onClick, className, ...rest } = props;
8
+ return (jsx("button", { className: clsx('str-video__call-controls__button', className, {
9
+ [`str-video__call-controls__button--variant-${variant}`]: variant,
10
+ 'str-video__call-controls__button--enabled': enabled,
11
+ }), onClick: (e) => {
12
+ e.preventDefault();
13
+ onClick?.(e);
14
+ }, ref: ref, ...rest, children: jsx(Icon, { icon: icon }) }));
15
+ });
16
+
17
+ export { IconButton };
18
+ //# sourceMappingURL=IconButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconButton.js","sources":["../../../../../../../src/components/Button/IconButton.tsx"],"sourcesContent":["import { ComponentProps, ForwardedRef, forwardRef } from 'react';\nimport clsx from 'clsx';\n\nimport { Icon, IconProps } from '../Icon';\n\nexport type ButtonWithIconProps = {\n enabled?: boolean;\n variant?: string;\n} & ComponentProps<'button'> &\n IconProps;\n\nexport const IconButton = forwardRef(function IconButtonRender(\n props: ButtonWithIconProps,\n ref: ForwardedRef<HTMLButtonElement>,\n) {\n const { icon, enabled, variant, onClick, className, ...rest } = props;\n return (\n <button\n className={clsx('str-video__call-controls__button', className, {\n [`str-video__call-controls__button--variant-${variant}`]: variant,\n 'str-video__call-controls__button--enabled': enabled,\n })}\n onClick={(e) => {\n e.preventDefault();\n onClick?.(e);\n }}\n ref={ref}\n {...rest}\n >\n <Icon icon={icon} />\n </button>\n );\n});\n"],"names":["_jsx"],"mappings":";;;;;AAWO,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,gBAAgB,CAC5D,KAA0B,EAC1B,GAAoC,EAAA;AAEpC,IAAA,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK;IACrE,QACEA,gBACE,SAAS,EAAE,IAAI,CAAC,kCAAkC,EAAE,SAAS,EAAE;AAC7D,YAAA,CAAC,CAAA,0CAAA,EAA6C,OAAO,CAAA,CAAE,GAAG,OAAO;AACjE,YAAA,2CAA2C,EAAE,OAAO;AACrD,SAAA,CAAC,EACF,OAAO,EAAE,CAAC,CAAC,KAAI;YACb,CAAC,CAAC,cAAc,EAAE;AAClB,YAAA,OAAO,GAAG,CAAC,CAAC;AACd,QAAA,CAAC,EACD,GAAG,EAAE,GAAG,EAAA,GACJ,IAAI,EAAA,QAAA,EAERA,GAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,IAAI,EAAA,CAAI,EAAA,CACb;AAEb,CAAC;;;;"}
@@ -0,0 +1,8 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+
3
+ const TextButton = ({ children, ...rest }) => {
4
+ return (jsx("button", { ...rest, className: "str-video__text-button", children: children }));
5
+ };
6
+
7
+ export { TextButton };
8
+ //# sourceMappingURL=TextButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextButton.js","sources":["../../../../../../../src/components/Button/TextButton.tsx"],"sourcesContent":["import { ComponentProps } from 'react';\n\nexport const TextButton = ({\n children,\n ...rest\n}: Omit<ComponentProps<'button'>, 'ref' | 'className'>) => {\n return (\n <button {...rest} className=\"str-video__text-button\">\n {children}\n </button>\n );\n};\n"],"names":["_jsx"],"mappings":";;AAEO,MAAM,UAAU,GAAG,CAAC,EACzB,QAAQ,EACR,GAAG,IAAI,EAC6C,KAAI;IACxD,QACEA,GAAA,CAAA,QAAA,EAAA,EAAA,GAAY,IAAI,EAAE,SAAS,EAAC,wBAAwB,EAAA,QAAA,EACjD,QAAQ,EAAA,CACF;AAEb;;;;"}
@@ -0,0 +1,28 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useCallback } from 'react';
3
+ import '../Button/CompositeButton.js';
4
+ import { IconButton } from '../Button/IconButton.js';
5
+ import { useCall } from '@stream-io/video-react-bindings';
6
+
7
+ const AcceptCallButton = ({ disabled, onAccept, onClick, }) => {
8
+ const call = useCall();
9
+ const handleClick = useCallback(async (e) => {
10
+ if (onClick) {
11
+ onClick(e);
12
+ }
13
+ else if (call) {
14
+ try {
15
+ await call.join();
16
+ onAccept?.();
17
+ }
18
+ catch (err) {
19
+ console.error(`Failed to accept call`, err);
20
+ onAccept?.(err);
21
+ }
22
+ }
23
+ }, [onClick, onAccept, call]);
24
+ return (jsx(IconButton, { disabled: disabled, icon: "call-accept", variant: "success", "data-testid": "accept-call-button", onClick: handleClick }));
25
+ };
26
+
27
+ export { AcceptCallButton };
28
+ //# sourceMappingURL=AcceptCallButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AcceptCallButton.js","sources":["../../../../../../../src/components/CallControls/AcceptCallButton.tsx"],"sourcesContent":["import { MouseEventHandler, useCallback } from 'react';\nimport { IconButton } from '../Button';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type AcceptCallButtonProps = {\n disabled?: boolean;\n onClick?: MouseEventHandler<HTMLButtonElement>;\n onAccept?: (err?: Error) => void;\n};\n\nexport const AcceptCallButton = ({\n disabled,\n onAccept,\n onClick,\n}: AcceptCallButtonProps) => {\n const call = useCall();\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n try {\n await call.join();\n onAccept?.();\n } catch (err) {\n console.error(`Failed to accept call`, err);\n onAccept?.(err as Error);\n }\n }\n },\n [onClick, onAccept, call],\n );\n return (\n <IconButton\n disabled={disabled}\n icon=\"call-accept\"\n variant=\"success\"\n data-testid=\"accept-call-button\"\n onClick={handleClick}\n />\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;AAUO,MAAM,gBAAgB,GAAG,CAAC,EAC/B,QAAQ,EACR,QAAQ,EACR,OAAO,GACe,KAAI;AAC1B,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE;IACtB,MAAM,WAAW,GAAyC,WAAW,CACnE,OAAO,CAAC,KAAI;QACV,IAAI,OAAO,EAAE;YACX,OAAO,CAAC,CAAC,CAAC;QACZ;aAAO,IAAI,IAAI,EAAE;AACf,YAAA,IAAI;AACF,gBAAA,MAAM,IAAI,CAAC,IAAI,EAAE;gBACjB,QAAQ,IAAI;YACd;YAAE,OAAO,GAAG,EAAE;AACZ,gBAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC;AAC3C,gBAAA,QAAQ,GAAG,GAAY,CAAC;YAC1B;QACF;IACF,CAAC,EACD,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAC1B;IACD,QACEA,IAAC,UAAU,EAAA,EACT,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAC,aAAa,EAClB,OAAO,EAAC,SAAS,EAAA,aAAA,EACL,oBAAoB,EAChC,OAAO,EAAE,WAAW,EAAA,CACpB;AAEN;;;;"}
@@ -0,0 +1,21 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { OwnCapability } from '@stream-io/video-client';
3
+ import { Restricted } from '@stream-io/video-react-bindings';
4
+ import 'react';
5
+ import 'clsx';
6
+ import '@floating-ui/react';
7
+ import { SpeakingWhileMutedNotification } from '../Notification/SpeakingWhileMutedNotification.js';
8
+ import { RecordCallButton } from './RecordCallButton.js';
9
+ import { ReactionsButton } from './ReactionsButton.js';
10
+ import { ScreenShareButton } from './ScreenShareButton.js';
11
+ import { ToggleAudioPublishingButton } from './ToggleAudioButton.js';
12
+ import { ToggleVideoPublishingButton } from './ToggleVideoButton.js';
13
+ import { CancelCallButton } from './CancelCallButton.js';
14
+
15
+ const CallControls = ({ onLeave }) => (jsxs("div", { className: "str-video__call-controls", children: [jsx(Restricted, { requiredGrants: [OwnCapability.SEND_AUDIO], children: jsx(SpeakingWhileMutedNotification, { children: jsx(ToggleAudioPublishingButton, {}) }) }), jsx(Restricted, { requiredGrants: [OwnCapability.SEND_VIDEO], children: jsx(ToggleVideoPublishingButton, {}) }), jsx(Restricted, { requiredGrants: [OwnCapability.CREATE_REACTION], children: jsx(ReactionsButton, {}) }), jsx(Restricted, { requiredGrants: [OwnCapability.SCREENSHARE], children: jsx(ScreenShareButton, {}) }), jsx(Restricted, { requiredGrants: [
16
+ OwnCapability.START_RECORD_CALL,
17
+ OwnCapability.STOP_RECORD_CALL,
18
+ ], children: jsx(RecordCallButton, {}) }), jsx(CancelCallButton, { onLeave: onLeave })] }));
19
+
20
+ export { CallControls };
21
+ //# sourceMappingURL=CallControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CallControls.js","sources":["../../../../../../../src/components/CallControls/CallControls.tsx"],"sourcesContent":["import { OwnCapability } from '@stream-io/video-client';\nimport { Restricted } from '@stream-io/video-react-bindings';\nimport { SpeakingWhileMutedNotification } from '../Notification';\nimport { RecordCallButton } from './RecordCallButton';\nimport { ReactionsButton } from './ReactionsButton';\nimport { ScreenShareButton } from './ScreenShareButton';\nimport { ToggleAudioPublishingButton } from './ToggleAudioButton';\nimport { ToggleVideoPublishingButton } from './ToggleVideoButton';\nimport { CancelCallButton } from './CancelCallButton';\n\nexport type CallControlsProps = {\n onLeave?: (err?: Error) => void;\n};\n\nexport const CallControls = ({ onLeave }: CallControlsProps) => (\n <div className=\"str-video__call-controls\">\n <Restricted requiredGrants={[OwnCapability.SEND_AUDIO]}>\n <SpeakingWhileMutedNotification>\n <ToggleAudioPublishingButton />\n </SpeakingWhileMutedNotification>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.SEND_VIDEO]}>\n <ToggleVideoPublishingButton />\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.CREATE_REACTION]}>\n <ReactionsButton />\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.SCREENSHARE]}>\n <ScreenShareButton />\n </Restricted>\n <Restricted\n requiredGrants={[\n OwnCapability.START_RECORD_CALL,\n OwnCapability.STOP_RECORD_CALL,\n ]}\n >\n <RecordCallButton />\n </Restricted>\n <CancelCallButton onLeave={onLeave} />\n </div>\n);\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;;;;;AAcO,MAAM,YAAY,GAAG,CAAC,EAAE,OAAO,EAAqB,MACzDA,cAAK,SAAS,EAAC,0BAA0B,EAAA,QAAA,EAAA,CACvCC,GAAA,CAAC,UAAU,EAAA,EAAC,cAAc,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,EAAA,QAAA,EACpDA,GAAA,CAAC,8BAA8B,EAAA,EAAA,QAAA,EAC7BA,GAAA,CAAC,2BAA2B,EAAA,EAAA,CAAG,EAAA,CACA,GACtB,EACbA,GAAA,CAAC,UAAU,EAAA,EAAC,cAAc,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,EAAA,QAAA,EACpDA,GAAA,CAAC,2BAA2B,EAAA,EAAA,CAAG,EAAA,CACpB,EACbA,GAAA,CAAC,UAAU,IAAC,cAAc,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,EAAA,QAAA,EACzDA,IAAC,eAAe,EAAA,EAAA,CAAG,GACR,EACbA,GAAA,CAAC,UAAU,EAAA,EAAC,cAAc,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,YACrDA,GAAA,CAAC,iBAAiB,KAAG,EAAA,CACV,EACbA,IAAC,UAAU,EAAA,EACT,cAAc,EAAE;AACd,gBAAA,aAAa,CAAC,iBAAiB;AAC/B,gBAAA,aAAa,CAAC,gBAAgB;AAC/B,aAAA,EAAA,QAAA,EAEDA,GAAA,CAAC,gBAAgB,EAAA,EAAA,CAAG,EAAA,CACT,EACbA,GAAA,CAAC,gBAAgB,EAAA,EAAC,OAAO,EAAE,OAAO,EAAA,CAAI,CAAA,EAAA,CAClC;;;;"}
@@ -0,0 +1,18 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { forwardRef } from 'react';
3
+ import { useI18n } from '@stream-io/video-react-bindings';
4
+ import { CallStats } from '../CallStats/CallStats.js';
5
+ import { CompositeButton } from '../Button/CompositeButton.js';
6
+ import '../Button/IconButton.js';
7
+ import { MenuToggle } from '../Menu/MenuToggle.js';
8
+ import { Icon } from '../Icon/Icon.js';
9
+
10
+ const CallStatsButton = () => (jsx(MenuToggle, { placement: "top-end", ToggleButton: ToggleMenuButton, children: jsx(CallStats, {}) }));
11
+ const ToggleMenuButton = forwardRef(function ToggleMenuButtonRender(props, ref) {
12
+ const { t } = useI18n();
13
+ const { caption, menuShown } = props;
14
+ return (jsx(CompositeButton, { ref: ref, active: menuShown, caption: caption, title: caption || t('Statistics'), "data-testid": "stats-button", children: jsx(Icon, { icon: "stats" }) }));
15
+ });
16
+
17
+ export { CallStatsButton };
18
+ //# sourceMappingURL=CallStatsButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CallStatsButton.js","sources":["../../../../../../../src/components/CallControls/CallStatsButton.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\n\nimport { CallStats } from '../CallStats';\nimport { CompositeButton } from '../Button/';\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\nimport { Icon } from '../Icon';\n\nexport type CallStatsButtonProps = {\n caption?: string;\n};\n\nexport const CallStatsButton = () => (\n <MenuToggle placement=\"top-end\" ToggleButton={ToggleMenuButton}>\n <CallStats />\n </MenuToggle>\n);\n\nconst ToggleMenuButton = forwardRef<\n HTMLDivElement,\n ToggleMenuButtonProps<HTMLDivElement> & CallStatsButtonProps\n>(function ToggleMenuButtonRender(props, ref) {\n const { t } = useI18n();\n const { caption, menuShown } = props;\n\n return (\n <CompositeButton\n ref={ref}\n active={menuShown}\n caption={caption}\n title={caption || t('Statistics')}\n data-testid=\"stats-button\"\n >\n <Icon icon=\"stats\" />\n </CompositeButton>\n );\n});\n"],"names":["_jsx"],"mappings":";;;;;;;;;AAYO,MAAM,eAAe,GAAG,OAC7BA,GAAA,CAAC,UAAU,EAAA,EAAC,SAAS,EAAC,SAAS,EAAC,YAAY,EAAE,gBAAgB,EAAA,QAAA,EAC5DA,IAAC,SAAS,EAAA,EAAA,CAAG,EAAA,CACF;AAGf,MAAM,gBAAgB,GAAG,UAAU,CAGjC,SAAS,sBAAsB,CAAC,KAAK,EAAE,GAAG,EAAA;AAC1C,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE;AACvB,IAAA,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,KAAK;AAEpC,IAAA,QACEA,GAAA,CAAC,eAAe,EAAA,EACd,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,IAAI,CAAC,CAAC,YAAY,CAAC,EAAA,aAAA,EACrB,cAAc,EAAA,QAAA,EAE1BA,GAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAC,OAAO,EAAA,CAAG,EAAA,CACL;AAEtB,CAAC,CAAC;;;;"}
@@ -0,0 +1,78 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { forwardRef, useCallback } from 'react';
3
+ import { OwnCapability } from '@stream-io/video-client';
4
+ import { useI18n, useCall, Restricted } from '@stream-io/video-react-bindings';
5
+ import { MenuToggle } from '../Menu/MenuToggle.js';
6
+ import '../Button/CompositeButton.js';
7
+ import { IconButton } from '../Button/IconButton.js';
8
+ import { Icon } from '../Icon/Icon.js';
9
+ import 'clsx';
10
+ import '@floating-ui/react';
11
+ import { WithTooltip } from '../Tooltip/WithTooltip.js';
12
+
13
+ const EndCallMenu = (props) => {
14
+ const { onLeave, onEnd } = props;
15
+ const { t } = useI18n();
16
+ return (jsxs("div", { className: "str-video__end-call__confirmation", children: [jsxs("button", { className: "str-video__button str-video__end-call__leave", type: "button", "data-testid": "leave-call-button", onClick: onLeave, children: [jsx(Icon, { className: "str-video__button__icon str-video__end-call__leave-icon", icon: "logout" }), t('Leave call')] }), jsx(Restricted, { requiredGrants: [OwnCapability.END_CALL], children: jsxs("button", { className: "str-video__button str-video__end-call__end", type: "button", "data-testid": "end-call-for-all-button", onClick: onEnd, children: [jsx(Icon, { className: "str-video__button__icon str-video__end-call__end-icon", icon: "call-end" }), t('End call for all')] }) })] }));
17
+ };
18
+ const CancelCallToggleMenuButton = forwardRef(function CancelCallToggleMenuButtonRender({ menuShown }, ref) {
19
+ const { t } = useI18n();
20
+ return (jsx(WithTooltip, { title: t('Leave call'), tooltipDisabled: menuShown, children: jsx(IconButton, { icon: menuShown ? 'close' : 'call-end', variant: menuShown ? 'active' : 'danger', "data-testid": "leave-call-button", ref: ref }) }));
21
+ });
22
+ const CancelCallConfirmButton = ({ onClick, onLeave, }) => {
23
+ const call = useCall();
24
+ const handleLeave = useCallback(async (e) => {
25
+ if (onClick) {
26
+ onClick(e);
27
+ }
28
+ else if (call) {
29
+ try {
30
+ await call.leave();
31
+ onLeave?.();
32
+ }
33
+ catch (err) {
34
+ console.error(`Failed to leave call`, err);
35
+ onLeave?.(err);
36
+ }
37
+ }
38
+ }, [onClick, onLeave, call]);
39
+ const handleEndCall = useCallback(async (e) => {
40
+ if (onClick) {
41
+ onClick(e);
42
+ }
43
+ else if (call) {
44
+ try {
45
+ await call.endCall();
46
+ onLeave?.();
47
+ }
48
+ catch (err) {
49
+ console.error(`Failed to end call`, err);
50
+ onLeave?.(err);
51
+ }
52
+ }
53
+ }, [onClick, onLeave, call]);
54
+ return (jsx(MenuToggle, { placement: "top-start", ToggleButton: CancelCallToggleMenuButton, children: jsx(EndCallMenu, { onEnd: handleEndCall, onLeave: handleLeave }) }));
55
+ };
56
+ const CancelCallButton = ({ disabled, caption, onClick, onLeave, }) => {
57
+ const call = useCall();
58
+ const { t } = useI18n();
59
+ const handleClick = useCallback(async (e) => {
60
+ if (onClick) {
61
+ onClick(e);
62
+ }
63
+ else if (call) {
64
+ try {
65
+ await call.leave();
66
+ onLeave?.();
67
+ }
68
+ catch (err) {
69
+ console.error(`Failed to leave call`, err);
70
+ onLeave?.(err);
71
+ }
72
+ }
73
+ }, [onClick, onLeave, call]);
74
+ return (jsx(IconButton, { disabled: disabled, icon: "call-end", variant: "danger", title: caption ?? t('Leave call'), "data-testid": "cancel-call-button", onClick: handleClick }));
75
+ };
76
+
77
+ export { CancelCallButton, CancelCallConfirmButton };
78
+ //# sourceMappingURL=CancelCallButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CancelCallButton.js","sources":["../../../../../../../src/components/CallControls/CancelCallButton.tsx"],"sourcesContent":["import { forwardRef, MouseEventHandler, useCallback } from 'react';\nimport { OwnCapability } from '@stream-io/video-client';\nimport { Restricted, useCall, useI18n } from '@stream-io/video-react-bindings';\n\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\n\nimport { IconButton } from '../Button';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\n\nconst EndCallMenu = (props: {\n onLeave: MouseEventHandler<HTMLButtonElement>;\n onEnd: MouseEventHandler<HTMLButtonElement>;\n}) => {\n const { onLeave, onEnd } = props;\n const { t } = useI18n();\n return (\n <div className=\"str-video__end-call__confirmation\">\n <button\n className=\"str-video__button str-video__end-call__leave\"\n type=\"button\"\n data-testid=\"leave-call-button\"\n onClick={onLeave}\n >\n <Icon\n className=\"str-video__button__icon str-video__end-call__leave-icon\"\n icon=\"logout\"\n />\n {t('Leave call')}\n </button>\n <Restricted requiredGrants={[OwnCapability.END_CALL]}>\n <button\n className=\"str-video__button str-video__end-call__end\"\n type=\"button\"\n data-testid=\"end-call-for-all-button\"\n onClick={onEnd}\n >\n <Icon\n className=\"str-video__button__icon str-video__end-call__end-icon\"\n icon=\"call-end\"\n />\n {t('End call for all')}\n </button>\n </Restricted>\n </div>\n );\n};\n\nconst CancelCallToggleMenuButton = forwardRef<\n HTMLButtonElement,\n ToggleMenuButtonProps\n>(function CancelCallToggleMenuButtonRender({ menuShown }, ref) {\n const { t } = useI18n();\n return (\n <WithTooltip title={t('Leave call')} tooltipDisabled={menuShown}>\n <IconButton\n icon={menuShown ? 'close' : 'call-end'}\n variant={menuShown ? 'active' : 'danger'}\n data-testid=\"leave-call-button\"\n ref={ref}\n />\n </WithTooltip>\n );\n});\n\nexport type CancelCallButtonProps = {\n disabled?: boolean;\n caption?: string;\n onClick?: MouseEventHandler<HTMLButtonElement>;\n onLeave?: (err?: Error) => void;\n};\n\nexport const CancelCallConfirmButton = ({\n onClick,\n onLeave,\n}: CancelCallButtonProps) => {\n const call = useCall();\n\n const handleLeave: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n try {\n await call.leave();\n onLeave?.();\n } catch (err) {\n console.error(`Failed to leave call`, err);\n onLeave?.(err as Error);\n }\n }\n },\n [onClick, onLeave, call],\n );\n\n const handleEndCall: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n try {\n await call.endCall();\n onLeave?.();\n } catch (err) {\n console.error(`Failed to end call`, err);\n onLeave?.(err as Error);\n }\n }\n },\n [onClick, onLeave, call],\n );\n\n return (\n <MenuToggle placement=\"top-start\" ToggleButton={CancelCallToggleMenuButton}>\n <EndCallMenu onEnd={handleEndCall} onLeave={handleLeave} />\n </MenuToggle>\n );\n};\n\nexport const CancelCallButton = ({\n disabled,\n caption,\n onClick,\n onLeave,\n}: CancelCallButtonProps) => {\n const call = useCall();\n const { t } = useI18n();\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n try {\n await call.leave();\n onLeave?.();\n } catch (err) {\n console.error(`Failed to leave call`, err);\n onLeave?.(err as Error);\n }\n }\n },\n [onClick, onLeave, call],\n );\n return (\n <IconButton\n disabled={disabled}\n icon=\"call-end\"\n variant=\"danger\"\n title={caption ?? t('Leave call')}\n data-testid=\"cancel-call-button\"\n onClick={handleClick}\n />\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { forwardRef } from 'react';
3
+ import clsx from 'clsx';
4
+ import { OwnCapability } from '@stream-io/video-client';
5
+ import { useI18n, useCall, Restricted } from '@stream-io/video-react-bindings';
6
+ import { useMenuContext, MenuToggle, MenuVisualType } from '../Menu/MenuToggle.js';
7
+ import { CompositeButton } from '../Button/CompositeButton.js';
8
+ import '../Button/IconButton.js';
9
+ import { defaultEmojiReactionMap } from '../Reaction/Reaction.js';
10
+ import { Icon } from '../Icon/Icon.js';
11
+ import '@floating-ui/react';
12
+ import { WithTooltip } from '../Tooltip/WithTooltip.js';
13
+
14
+ const defaultReactions = [
15
+ {
16
+ type: 'reaction',
17
+ emoji_code: ':like:',
18
+ },
19
+ {
20
+ // TODO OL: use `prompt` type?
21
+ type: 'raised-hand',
22
+ emoji_code: ':raise-hand:',
23
+ },
24
+ {
25
+ type: 'reaction',
26
+ emoji_code: ':fireworks:',
27
+ },
28
+ {
29
+ type: 'reaction',
30
+ emoji_code: ':dislike:',
31
+ },
32
+ {
33
+ type: 'reaction',
34
+ emoji_code: ':heart:',
35
+ },
36
+ {
37
+ type: 'reaction',
38
+ emoji_code: ':smile:',
39
+ },
40
+ ];
41
+ const ReactionsButton = ({ reactions = defaultReactions, }) => {
42
+ return (jsx(Restricted, { requiredGrants: [OwnCapability.CREATE_REACTION], children: jsx(MenuToggle, { placement: "top", ToggleButton: ToggleReactionsMenuButton, visualType: MenuVisualType.MENU, children: jsx(DefaultReactionsMenu, { reactions: reactions }) }) }));
43
+ };
44
+ const ToggleReactionsMenuButton = forwardRef(function ToggleReactionsMenuButtonRender({ menuShown }, ref) {
45
+ const { t } = useI18n();
46
+ return (jsx(WithTooltip, { title: t('Reactions'), tooltipDisabled: menuShown, children: jsx(CompositeButton, { ref: ref, active: menuShown, variant: "primary", children: jsx(Icon, { icon: "reactions" }) }) }));
47
+ });
48
+ const DefaultReactionsMenu = ({ reactions, layout = 'horizontal', }) => {
49
+ const call = useCall();
50
+ const { close } = useMenuContext();
51
+ return (jsx("div", { className: clsx('str-video__reactions-menu', {
52
+ 'str-video__reactions-menu--horizontal': layout === 'horizontal',
53
+ 'str-video__reactions-menu--vertical': layout === 'vertical',
54
+ }), children: reactions.map((reaction) => (jsx("button", { type: "button", className: "str-video__reactions-menu__button", onClick: () => {
55
+ call?.sendReaction(reaction);
56
+ close?.();
57
+ }, children: reaction.emoji_code && defaultEmojiReactionMap[reaction.emoji_code] }, reaction.emoji_code))) }));
58
+ };
59
+
60
+ export { DefaultReactionsMenu, ReactionsButton, defaultReactions };
61
+ //# sourceMappingURL=ReactionsButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReactionsButton.js","sources":["../../../../../../../src/components/CallControls/ReactionsButton.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport clsx from 'clsx';\n\nimport { OwnCapability, StreamReaction } from '@stream-io/video-client';\nimport { Restricted, useCall, useI18n } from '@stream-io/video-react-bindings';\n\nimport {\n MenuToggle,\n MenuVisualType,\n ToggleMenuButtonProps,\n useMenuContext,\n} from '../Menu';\nimport { CompositeButton } from '../Button';\nimport { defaultEmojiReactionMap } from '../Reaction';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\n\nexport const defaultReactions: StreamReaction[] = [\n {\n type: 'reaction',\n emoji_code: ':like:',\n },\n {\n // TODO OL: use `prompt` type?\n type: 'raised-hand',\n emoji_code: ':raise-hand:',\n },\n {\n type: 'reaction',\n emoji_code: ':fireworks:',\n },\n {\n type: 'reaction',\n emoji_code: ':dislike:',\n },\n {\n type: 'reaction',\n emoji_code: ':heart:',\n },\n {\n type: 'reaction',\n emoji_code: ':smile:',\n },\n];\n\nexport interface ReactionsButtonProps {\n reactions?: StreamReaction[];\n}\n\nexport const ReactionsButton = ({\n reactions = defaultReactions,\n}: ReactionsButtonProps) => {\n return (\n <Restricted requiredGrants={[OwnCapability.CREATE_REACTION]}>\n <MenuToggle\n placement=\"top\"\n ToggleButton={ToggleReactionsMenuButton}\n visualType={MenuVisualType.MENU}\n >\n <DefaultReactionsMenu reactions={reactions} />\n </MenuToggle>\n </Restricted>\n );\n};\n\nconst ToggleReactionsMenuButton = forwardRef<\n HTMLDivElement,\n ToggleMenuButtonProps\n>(function ToggleReactionsMenuButtonRender({ menuShown }, ref) {\n const { t } = useI18n();\n return (\n <WithTooltip title={t('Reactions')} tooltipDisabled={menuShown}>\n <CompositeButton ref={ref} active={menuShown} variant=\"primary\">\n <Icon icon=\"reactions\" />\n </CompositeButton>\n </WithTooltip>\n );\n});\n\nexport interface DefaultReactionsMenuProps {\n reactions: StreamReaction[];\n layout?: 'horizontal' | 'vertical';\n}\n\nexport const DefaultReactionsMenu = ({\n reactions,\n layout = 'horizontal',\n}: DefaultReactionsMenuProps) => {\n const call = useCall();\n const { close } = useMenuContext();\n return (\n <div\n className={clsx('str-video__reactions-menu', {\n 'str-video__reactions-menu--horizontal': layout === 'horizontal',\n 'str-video__reactions-menu--vertical': layout === 'vertical',\n })}\n >\n {reactions.map((reaction) => (\n <button\n key={reaction.emoji_code}\n type=\"button\"\n className=\"str-video__reactions-menu__button\"\n onClick={() => {\n call?.sendReaction(reaction);\n close?.();\n }}\n >\n {reaction.emoji_code && defaultEmojiReactionMap[reaction.emoji_code]}\n </button>\n ))}\n </div>\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;;;;;;;;AAiBO,MAAM,gBAAgB,GAAqB;AAChD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,QAAQ;AACrB,KAAA;AACD,IAAA;;AAEE,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,UAAU,EAAE,cAAc;AAC3B,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,aAAa;AAC1B,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,WAAW;AACxB,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,SAAS;AACtB,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,SAAS;AACtB,KAAA;;AAOI,MAAM,eAAe,GAAG,CAAC,EAC9B,SAAS,GAAG,gBAAgB,GACP,KAAI;AACzB,IAAA,QACEA,GAAA,CAAC,UAAU,EAAA,EAAC,cAAc,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,EAAA,QAAA,EACzDA,GAAA,CAAC,UAAU,EAAA,EACT,SAAS,EAAC,KAAK,EACf,YAAY,EAAE,yBAAyB,EACvC,UAAU,EAAE,cAAc,CAAC,IAAI,EAAA,QAAA,EAE/BA,GAAA,CAAC,oBAAoB,EAAA,EAAC,SAAS,EAAE,SAAS,GAAI,EAAA,CACnC,EAAA,CACF;AAEjB;AAEA,MAAM,yBAAyB,GAAG,UAAU,CAG1C,SAAS,+BAA+B,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,EAAA;AAC3D,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE;AACvB,IAAA,QACEA,GAAA,CAAC,WAAW,IAAC,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,eAAe,EAAE,SAAS,YAC5DA,GAAA,CAAC,eAAe,IAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAC,SAAS,EAAA,QAAA,EAC7DA,GAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAC,WAAW,GAAG,EAAA,CACT,EAAA,CACN;AAElB,CAAC,CAAC;AAOK,MAAM,oBAAoB,GAAG,CAAC,EACnC,SAAS,EACT,MAAM,GAAG,YAAY,GACK,KAAI;AAC9B,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE;AACtB,IAAA,MAAM,EAAE,KAAK,EAAE,GAAG,cAAc,EAAE;AAClC,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,IAAI,CAAC,2BAA2B,EAAE;YAC3C,uCAAuC,EAAE,MAAM,KAAK,YAAY;YAChE,qCAAqC,EAAE,MAAM,KAAK,UAAU;SAC7D,CAAC,EAAA,QAAA,EAED,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,MACtBA,gBAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mCAAmC,EAC7C,OAAO,EAAE,MAAK;AACZ,gBAAA,IAAI,EAAE,YAAY,CAAC,QAAQ,CAAC;gBAC5B,KAAK,IAAI;YACX,CAAC,EAAA,QAAA,EAEA,QAAQ,CAAC,UAAU,IAAI,uBAAuB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAA,EAR/D,QAAQ,CAAC,UAAU,CASjB,CACV,CAAC,EAAA,CACE;AAEV;;;;"}
@@ -0,0 +1,64 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { forwardRef } from 'react';
3
+ import { OwnCapability } from '@stream-io/video-client';
4
+ import { useI18n, useToggleCallRecording, Restricted } from '@stream-io/video-react-bindings';
5
+ import { CompositeButton } from '../Button/CompositeButton.js';
6
+ import '../Button/IconButton.js';
7
+ import { Icon } from '../Icon/Icon.js';
8
+ import { MenuToggle, MenuVisualType, useMenuContext } from '../Menu/MenuToggle.js';
9
+ import { LoadingIndicator } from '../LoadingIndicator/LoadingIndicator.js';
10
+ import 'clsx';
11
+ import '@floating-ui/react';
12
+ import { WithTooltip } from '../Tooltip/WithTooltip.js';
13
+ import { createCallControlHandler } from '../../utilities/callControlHandler.js';
14
+
15
+ const RecordEndConfirmation = (props) => {
16
+ const { t } = useI18n();
17
+ const { toggleCallRecording, isAwaitingResponse } = useToggleCallRecording();
18
+ const { close } = useMenuContext();
19
+ const handleClick = createCallControlHandler(props, toggleCallRecording);
20
+ return (jsxs("div", { className: "str-video__end-recording__confirmation", children: [jsxs("div", { className: "str-video__end-recording__header", children: [jsx(Icon, { icon: "recording-on" }), jsx("h2", { className: "str-video__end-recording__heading", children: t('End recording') })] }), jsx("p", { className: "str-video__end-recording__description", children: t('Are you sure you want end the recording?') }), jsxs("div", { className: "str-video__end-recording__actions", children: [jsx(CompositeButton, { variant: "secondary", onClick: close, children: t('Cancel') }), jsx(CompositeButton, { variant: "primary", onClick: isAwaitingResponse ? undefined : handleClick, children: isAwaitingResponse ? jsx(LoadingIndicator, {}) : t('End recording') })] })] }));
21
+ };
22
+ const ToggleEndRecordingMenuButton = forwardRef(function ToggleEndRecordingMenuButtonRender(props, ref) {
23
+ return (jsx(CompositeButton, { ref: ref, active: true, variant: "secondary", "data-testid": "recording-stop-button", children: jsx(Icon, { icon: "recording-off" }) }));
24
+ });
25
+ const RecordCallConfirmationButton = (props) => {
26
+ const { caption } = props;
27
+ const { t } = useI18n();
28
+ const { toggleCallRecording, isAwaitingResponse, isCallRecordingInProgress } = useToggleCallRecording();
29
+ const handleClick = createCallControlHandler(props, toggleCallRecording);
30
+ if (isCallRecordingInProgress) {
31
+ return (jsx(Restricted, { requiredGrants: [
32
+ OwnCapability.START_RECORD_CALL,
33
+ OwnCapability.STOP_RECORD_CALL,
34
+ ], children: jsx(MenuToggle, { ToggleButton: ToggleEndRecordingMenuButton, visualType: MenuVisualType.PORTAL, children: jsx(RecordEndConfirmation, { onError: props.onError }) }) }));
35
+ }
36
+ const title = isAwaitingResponse
37
+ ? t('Waiting for recording to start...')
38
+ : (caption ?? t('Record call'));
39
+ return (jsx(Restricted, { requiredGrants: [
40
+ OwnCapability.START_RECORD_CALL,
41
+ OwnCapability.STOP_RECORD_CALL,
42
+ ], children: jsx(WithTooltip, { title: title, children: jsx(CompositeButton, { active: isCallRecordingInProgress, caption: caption, variant: "secondary", "data-testid": "recording-start-button", onClick: isAwaitingResponse ? undefined : handleClick, children: isAwaitingResponse ? (jsx(LoadingIndicator, {})) : (jsx(Icon, { icon: "recording-off" })) }) }) }));
43
+ };
44
+ const RecordCallButton = (props) => {
45
+ const { caption } = props;
46
+ const { t } = useI18n();
47
+ const { toggleCallRecording, isAwaitingResponse, isCallRecordingInProgress } = useToggleCallRecording();
48
+ const handleClick = createCallControlHandler(props, toggleCallRecording);
49
+ let title = caption ?? t('Record call');
50
+ if (isAwaitingResponse) {
51
+ title = isCallRecordingInProgress
52
+ ? t('Waiting for recording to stop...')
53
+ : t('Waiting for recording to start...');
54
+ }
55
+ return (jsx(Restricted, { requiredGrants: [
56
+ OwnCapability.START_RECORD_CALL,
57
+ OwnCapability.STOP_RECORD_CALL,
58
+ ], children: jsx(CompositeButton, { active: isCallRecordingInProgress, caption: caption, variant: "secondary", "data-testid": isCallRecordingInProgress
59
+ ? 'recording-stop-button'
60
+ : 'recording-start-button', title: title, onClick: isAwaitingResponse ? undefined : handleClick, children: isAwaitingResponse ? (jsx(LoadingIndicator, {})) : (jsx(Icon, { icon: isCallRecordingInProgress ? 'recording-on' : 'recording-off' })) }) }));
61
+ };
62
+
63
+ export { RecordCallButton, RecordCallConfirmationButton };
64
+ //# sourceMappingURL=RecordCallButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordCallButton.js","sources":["../../../../../../../src/components/CallControls/RecordCallButton.tsx"],"sourcesContent":["import { forwardRef } from 'react';\n\nimport { OwnCapability } from '@stream-io/video-client';\nimport {\n Restricted,\n useI18n,\n useToggleCallRecording,\n} from '@stream-io/video-react-bindings';\nimport { CompositeButton } from '../Button/';\nimport { Icon } from '../Icon';\nimport {\n MenuToggle,\n MenuVisualType,\n ToggleMenuButtonProps,\n useMenuContext,\n} from '../Menu';\nimport { LoadingIndicator } from '../LoadingIndicator';\nimport { WithTooltip } from '../Tooltip';\nimport {\n createCallControlHandler,\n PropsWithErrorHandler,\n} from '../../utilities/callControlHandler';\n\nexport type RecordCallButtonProps = PropsWithErrorHandler<{\n caption?: string;\n}>;\n\nconst RecordEndConfirmation = (props: PropsWithErrorHandler) => {\n const { t } = useI18n();\n const { toggleCallRecording, isAwaitingResponse } = useToggleCallRecording();\n\n const { close } = useMenuContext();\n\n const handleClick = createCallControlHandler(props, toggleCallRecording);\n\n return (\n <div className=\"str-video__end-recording__confirmation\">\n <div className=\"str-video__end-recording__header\">\n <Icon icon=\"recording-on\" />\n <h2 className=\"str-video__end-recording__heading\">\n {t('End recording')}\n </h2>\n </div>\n <p className=\"str-video__end-recording__description\">\n {t('Are you sure you want end the recording?')}\n </p>\n <div className=\"str-video__end-recording__actions\">\n <CompositeButton variant=\"secondary\" onClick={close}>\n {t('Cancel')}\n </CompositeButton>\n <CompositeButton\n variant=\"primary\"\n onClick={isAwaitingResponse ? undefined : handleClick}\n >\n {isAwaitingResponse ? <LoadingIndicator /> : t('End recording')}\n </CompositeButton>\n </div>\n </div>\n );\n};\n\nconst ToggleEndRecordingMenuButton = forwardRef<\n HTMLDivElement,\n ToggleMenuButtonProps\n>(function ToggleEndRecordingMenuButtonRender(props, ref) {\n return (\n <CompositeButton\n ref={ref}\n active={true}\n variant=\"secondary\"\n data-testid=\"recording-stop-button\"\n >\n <Icon icon=\"recording-off\" />\n </CompositeButton>\n );\n});\n\nexport const RecordCallConfirmationButton = (\n props: PropsWithErrorHandler<{ caption?: string }>,\n) => {\n const { caption } = props;\n const { t } = useI18n();\n const { toggleCallRecording, isAwaitingResponse, isCallRecordingInProgress } =\n useToggleCallRecording();\n\n const handleClick = createCallControlHandler(props, toggleCallRecording);\n\n if (isCallRecordingInProgress) {\n return (\n <Restricted\n requiredGrants={[\n OwnCapability.START_RECORD_CALL,\n OwnCapability.STOP_RECORD_CALL,\n ]}\n >\n <MenuToggle\n ToggleButton={ToggleEndRecordingMenuButton}\n visualType={MenuVisualType.PORTAL}\n >\n <RecordEndConfirmation onError={props.onError} />\n </MenuToggle>\n </Restricted>\n );\n }\n\n const title = isAwaitingResponse\n ? t('Waiting for recording to start...')\n : (caption ?? t('Record call'));\n\n return (\n <Restricted\n requiredGrants={[\n OwnCapability.START_RECORD_CALL,\n OwnCapability.STOP_RECORD_CALL,\n ]}\n >\n <WithTooltip title={title}>\n <CompositeButton\n active={isCallRecordingInProgress}\n caption={caption}\n variant=\"secondary\"\n data-testid=\"recording-start-button\"\n onClick={isAwaitingResponse ? undefined : handleClick}\n >\n {isAwaitingResponse ? (\n <LoadingIndicator />\n ) : (\n <Icon icon=\"recording-off\" />\n )}\n </CompositeButton>\n </WithTooltip>\n </Restricted>\n );\n};\n\nexport const RecordCallButton = (props: RecordCallButtonProps) => {\n const { caption } = props;\n const { t } = useI18n();\n const { toggleCallRecording, isAwaitingResponse, isCallRecordingInProgress } =\n useToggleCallRecording();\n\n const handleClick = createCallControlHandler(props, toggleCallRecording);\n\n let title = caption ?? t('Record call');\n\n if (isAwaitingResponse) {\n title = isCallRecordingInProgress\n ? t('Waiting for recording to stop...')\n : t('Waiting for recording to start...');\n }\n\n return (\n <Restricted\n requiredGrants={[\n OwnCapability.START_RECORD_CALL,\n OwnCapability.STOP_RECORD_CALL,\n ]}\n >\n <CompositeButton\n active={isCallRecordingInProgress}\n caption={caption}\n variant=\"secondary\"\n data-testid={\n isCallRecordingInProgress\n ? 'recording-stop-button'\n : 'recording-start-button'\n }\n title={title}\n onClick={isAwaitingResponse ? undefined : handleClick}\n >\n {isAwaitingResponse ? (\n <LoadingIndicator />\n ) : (\n <Icon\n icon={isCallRecordingInProgress ? 'recording-on' : 'recording-off'}\n />\n )}\n </CompositeButton>\n </Restricted>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { RequestPermissionRequestPermissionsEnum, OwnCapability } from '@stream-io/video-client';
3
+ import { useI18n, useCallStateHooks, Restricted } from '@stream-io/video-react-bindings';
4
+ import { CompositeButton } from '../Button/CompositeButton.js';
5
+ import '../Button/IconButton.js';
6
+ import 'react';
7
+ import 'clsx';
8
+ import '@floating-ui/react';
9
+ import { useRequestPermission } from '../../hooks/useRequestPermission.js';
10
+ import { PermissionNotification } from '../Notification/PermissionNotification.js';
11
+ import { Icon } from '../Icon/Icon.js';
12
+ import { WithTooltip } from '../Tooltip/WithTooltip.js';
13
+ import { createCallControlHandler } from '../../utilities/callControlHandler.js';
14
+
15
+ const ScreenShareButton = (props) => {
16
+ const { t } = useI18n();
17
+ const { caption, optimisticUpdates } = props;
18
+ const { useHasOngoingScreenShare, useScreenShareState, useCallSettings } = useCallStateHooks();
19
+ const isSomeoneScreenSharing = useHasOngoingScreenShare();
20
+ const { hasPermission, requestPermission, isAwaitingPermission } = useRequestPermission(RequestPermissionRequestPermissionsEnum.SCREENSHARE);
21
+ const callSettings = useCallSettings();
22
+ const isScreenSharingAllowed = callSettings?.screensharing.enabled;
23
+ const { screenShare, optionsAwareIsMute, isTogglePending } = useScreenShareState({
24
+ optimisticUpdates,
25
+ });
26
+ const amIScreenSharing = !optionsAwareIsMute;
27
+ const disableScreenShareButton = (!amIScreenSharing &&
28
+ (isSomeoneScreenSharing || isScreenSharingAllowed === false)) ||
29
+ (!optimisticUpdates && isTogglePending);
30
+ const handleClick = createCallControlHandler(props, async () => {
31
+ if (!hasPermission) {
32
+ await requestPermission();
33
+ }
34
+ else {
35
+ await screenShare.toggle();
36
+ }
37
+ });
38
+ return (jsx(Restricted, { requiredGrants: [OwnCapability.SCREENSHARE], children: jsx(PermissionNotification, { permission: OwnCapability.SCREENSHARE, isAwaitingApproval: isAwaitingPermission, messageApproved: t('You can now share your screen.'), messageAwaitingApproval: t('Awaiting for an approval to share screen.'), messageRevoked: t('You can no longer share your screen.'), children: jsx(WithTooltip, { title: caption ?? t('Share screen'), children: jsx(CompositeButton, { active: isSomeoneScreenSharing || amIScreenSharing, caption: caption, variant: "primary", "data-testid": isSomeoneScreenSharing
39
+ ? 'screen-share-stop-button'
40
+ : 'screen-share-start-button', disabled: disableScreenShareButton, onClick: handleClick, children: jsx(Icon, { icon: isSomeoneScreenSharing ? 'screen-share-on' : 'screen-share-off' }) }) }) }) }));
41
+ };
42
+
43
+ export { ScreenShareButton };
44
+ //# sourceMappingURL=ScreenShareButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScreenShareButton.js","sources":["../../../../../../../src/components/CallControls/ScreenShareButton.tsx"],"sourcesContent":["import {\n OwnCapability,\n RequestPermissionRequestPermissionsEnum,\n} from '@stream-io/video-client';\nimport {\n Restricted,\n useCallStateHooks,\n useI18n,\n UseInputMediaDeviceOptions,\n} from '@stream-io/video-react-bindings';\nimport { CompositeButton } from '../Button/';\nimport { PermissionNotification } from '../Notification';\nimport { useRequestPermission } from '../../hooks';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\nimport {\n PropsWithErrorHandler,\n createCallControlHandler,\n} from '../../utilities/callControlHandler';\n\nexport type ScreenShareButtonProps = PropsWithErrorHandler<\n {\n caption?: string;\n } & UseInputMediaDeviceOptions\n>;\n\nexport const ScreenShareButton = (props: ScreenShareButtonProps) => {\n const { t } = useI18n();\n const { caption, optimisticUpdates } = props;\n\n const { useHasOngoingScreenShare, useScreenShareState, useCallSettings } =\n useCallStateHooks();\n const isSomeoneScreenSharing = useHasOngoingScreenShare();\n const { hasPermission, requestPermission, isAwaitingPermission } =\n useRequestPermission(RequestPermissionRequestPermissionsEnum.SCREENSHARE);\n\n const callSettings = useCallSettings();\n const isScreenSharingAllowed = callSettings?.screensharing.enabled;\n\n const { screenShare, optionsAwareIsMute, isTogglePending } =\n useScreenShareState({\n optimisticUpdates,\n });\n const amIScreenSharing = !optionsAwareIsMute;\n const disableScreenShareButton =\n (!amIScreenSharing &&\n (isSomeoneScreenSharing || isScreenSharingAllowed === false)) ||\n (!optimisticUpdates && isTogglePending);\n const handleClick = createCallControlHandler(props, async () => {\n if (!hasPermission) {\n await requestPermission();\n } else {\n await screenShare.toggle();\n }\n });\n\n return (\n <Restricted requiredGrants={[OwnCapability.SCREENSHARE]}>\n <PermissionNotification\n permission={OwnCapability.SCREENSHARE}\n isAwaitingApproval={isAwaitingPermission}\n messageApproved={t('You can now share your screen.')}\n messageAwaitingApproval={t('Awaiting for an approval to share screen.')}\n messageRevoked={t('You can no longer share your screen.')}\n >\n <WithTooltip title={caption ?? t('Share screen')}>\n <CompositeButton\n active={isSomeoneScreenSharing || amIScreenSharing}\n caption={caption}\n variant=\"primary\"\n data-testid={\n isSomeoneScreenSharing\n ? 'screen-share-stop-button'\n : 'screen-share-start-button'\n }\n disabled={disableScreenShareButton}\n onClick={handleClick}\n >\n <Icon\n icon={\n isSomeoneScreenSharing ? 'screen-share-on' : 'screen-share-off'\n }\n />\n </CompositeButton>\n </WithTooltip>\n </PermissionNotification>\n </Restricted>\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;;;;;;;;;AA0BO,MAAM,iBAAiB,GAAG,CAAC,KAA6B,KAAI;AACjE,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE;AACvB,IAAA,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,KAAK;IAE5C,MAAM,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,eAAe,EAAE,GACtE,iBAAiB,EAAE;AACrB,IAAA,MAAM,sBAAsB,GAAG,wBAAwB,EAAE;AACzD,IAAA,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,GAC9D,oBAAoB,CAAC,uCAAuC,CAAC,WAAW,CAAC;AAE3E,IAAA,MAAM,YAAY,GAAG,eAAe,EAAE;AACtC,IAAA,MAAM,sBAAsB,GAAG,YAAY,EAAE,aAAa,CAAC,OAAO;IAElE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,eAAe,EAAE,GACxD,mBAAmB,CAAC;QAClB,iBAAiB;AAClB,KAAA,CAAC;AACJ,IAAA,MAAM,gBAAgB,GAAG,CAAC,kBAAkB;AAC5C,IAAA,MAAM,wBAAwB,GAC5B,CAAC,CAAC,gBAAgB;AAChB,SAAC,sBAAsB,IAAI,sBAAsB,KAAK,KAAK,CAAC;AAC9D,SAAC,CAAC,iBAAiB,IAAI,eAAe,CAAC;IACzC,MAAM,WAAW,GAAG,wBAAwB,CAAC,KAAK,EAAE,YAAW;QAC7D,IAAI,CAAC,aAAa,EAAE;YAClB,MAAM,iBAAiB,EAAE;QAC3B;aAAO;AACL,YAAA,MAAM,WAAW,CAAC,MAAM,EAAE;QAC5B;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,QACEA,GAAA,CAAC,UAAU,EAAA,EAAC,cAAc,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,EAAA,QAAA,EACrDA,GAAA,CAAC,sBAAsB,IACrB,UAAU,EAAE,aAAa,CAAC,WAAW,EACrC,kBAAkB,EAAE,oBAAoB,EACxC,eAAe,EAAE,CAAC,CAAC,gCAAgC,CAAC,EACpD,uBAAuB,EAAE,CAAC,CAAC,2CAA2C,CAAC,EACvE,cAAc,EAAE,CAAC,CAAC,sCAAsC,CAAC,EAAA,QAAA,EAEzDA,GAAA,CAAC,WAAW,EAAA,EAAC,KAAK,EAAE,OAAO,IAAI,CAAC,CAAC,cAAc,CAAC,EAAA,QAAA,EAC9CA,GAAA,CAAC,eAAe,EAAA,EACd,MAAM,EAAE,sBAAsB,IAAI,gBAAgB,EAClD,OAAO,EAAE,OAAO,EAChB,OAAO,EAAC,SAAS,iBAEf;AACE,0BAAE;AACF,0BAAE,2BAA2B,EAEjC,QAAQ,EAAE,wBAAwB,EAClC,OAAO,EAAE,WAAW,EAAA,QAAA,EAEpBA,GAAA,CAAC,IAAI,EAAA,EACH,IAAI,EACF,sBAAsB,GAAG,iBAAiB,GAAG,kBAAkB,EAAA,CAEjE,EAAA,CACc,EAAA,CACN,EAAA,CACS,EAAA,CACd;AAEjB;;;;"}
@@ -0,0 +1,72 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { SfuModels, RequestPermissionRequestPermissionsEnum, OwnCapability } from '@stream-io/video-client';
3
+ import { useI18n, useCallStateHooks, Restricted } from '@stream-io/video-react-bindings';
4
+ import clsx from 'clsx';
5
+ import { CompositeButton } from '../Button/CompositeButton.js';
6
+ import '../Button/IconButton.js';
7
+ import { useState } from 'react';
8
+ import { Icon } from '../Icon/Icon.js';
9
+ import '../DeviceSettings/DeviceSettings.js';
10
+ import '@floating-ui/react';
11
+ import { useRequestPermission } from '../../hooks/useRequestPermission.js';
12
+ import '../DropdownSelect/DropdownSelect.js';
13
+ import '../Menu/MenuToggle.js';
14
+ import { DeviceSelectorAudioInput } from '../DeviceSettings/DeviceSelectorAudio.js';
15
+ import { PermissionNotification } from '../Notification/PermissionNotification.js';
16
+ import { WithTooltip } from '../Tooltip/WithTooltip.js';
17
+ import { createCallControlHandler } from '../../utilities/callControlHandler.js';
18
+
19
+ const ToggleAudioPreviewButton = (props) => {
20
+ const { caption, Menu = DeviceSelectorAudioInput, menuPlacement = 'top', onMenuToggle, optimisticUpdates, ...restCompositeButtonProps } = props;
21
+ const { t } = useI18n();
22
+ const { useMicrophoneState, useLocalParticipant } = useCallStateHooks();
23
+ const { microphone, hasBrowserPermission, isPromptingPermission, optionsAwareIsMute, isTogglePending, } = useMicrophoneState({ optimisticUpdates });
24
+ const localParticipant = useLocalParticipant();
25
+ const isSystemMuted = !!localParticipant?.interruptedTracks?.includes(SfuModels.TrackType.AUDIO);
26
+ const [tooltipDisabled, setTooltipDisabled] = useState(false);
27
+ const handleClick = createCallControlHandler(props, () => microphone.toggle());
28
+ return (jsx(WithTooltip, { title: !hasBrowserPermission
29
+ ? t('Check your browser audio permissions')
30
+ : isSystemMuted
31
+ ? t('Microphone is paused by your system')
32
+ : (caption ?? t('Mic')), tooltipDisabled: tooltipDisabled, children: jsxs(CompositeButton, { active: optionsAwareIsMute, caption: caption, className: clsx(!hasBrowserPermission && 'str-video__device-unavailable'), variant: "secondary", disabled: !hasBrowserPermission || (!optimisticUpdates && isTogglePending), "data-testid": optionsAwareIsMute
33
+ ? 'preview-audio-unmute-button'
34
+ : 'preview-audio-mute-button', onClick: handleClick, Menu: Menu, menuPlacement: menuPlacement, ...restCompositeButtonProps, onMenuToggle: (shown) => {
35
+ setTooltipDisabled(shown);
36
+ onMenuToggle?.(shown);
37
+ }, children: [jsx(Icon, { icon: !optionsAwareIsMute ? 'mic' : 'mic-off' }), !hasBrowserPermission && (jsx("span", { className: "str-video__no-media-permission", title: t('Check your browser audio permissions'), children: "!" })), isPromptingPermission && (jsx("span", { className: "str-video__pending-permission", title: t('Waiting for permission'), children: "?" })), isSystemMuted && hasBrowserPermission && (jsx("span", { className: "str-video__system-muted", title: t('Microphone is paused by your system'), children: "!" }))] }) }));
38
+ };
39
+ const ToggleAudioPublishingButton = (props) => {
40
+ const { t } = useI18n();
41
+ const { caption, Menu = jsx(DeviceSelectorAudioInput, { visualType: "list" }), menuPlacement = 'top', onMenuToggle, optimisticUpdates, ...restCompositeButtonProps } = props;
42
+ const { hasPermission, requestPermission, isAwaitingPermission } = useRequestPermission(RequestPermissionRequestPermissionsEnum.SEND_AUDIO);
43
+ const { useMicrophoneState, useLocalParticipant } = useCallStateHooks();
44
+ const { microphone, hasBrowserPermission, isPromptingPermission, isTogglePending, optionsAwareIsMute, } = useMicrophoneState({ optimisticUpdates });
45
+ const localParticipant = useLocalParticipant();
46
+ const isSystemMuted = !!localParticipant?.interruptedTracks?.includes(SfuModels.TrackType.AUDIO);
47
+ const [tooltipDisabled, setTooltipDisabled] = useState(false);
48
+ const handleClick = createCallControlHandler(props, async () => {
49
+ if (!hasPermission) {
50
+ await requestPermission();
51
+ }
52
+ else {
53
+ await microphone.toggle();
54
+ }
55
+ });
56
+ return (jsx(Restricted, { requiredGrants: [OwnCapability.SEND_AUDIO], children: jsx(PermissionNotification, { permission: OwnCapability.SEND_AUDIO, isAwaitingApproval: isAwaitingPermission, messageApproved: t('You can now speak.'), messageAwaitingApproval: t('Awaiting for an approval to speak.'), messageRevoked: t('You can no longer speak.'), children: jsx(WithTooltip, { title: !hasPermission
57
+ ? t('You have no permission to share your audio')
58
+ : !hasBrowserPermission
59
+ ? t('Check your browser mic permissions')
60
+ : isSystemMuted
61
+ ? t('Microphone is paused by your system')
62
+ : (caption ?? t('Mic')), tooltipDisabled: tooltipDisabled, children: jsxs(CompositeButton, { active: optionsAwareIsMute, caption: caption, variant: "secondary", disabled: !hasBrowserPermission ||
63
+ !hasPermission ||
64
+ // disable button while the toggle action is pending when not using optimistic updates
65
+ (!optimisticUpdates && isTogglePending), "data-testid": optionsAwareIsMute ? 'audio-unmute-button' : 'audio-mute-button', onClick: handleClick, Menu: Menu, menuPlacement: menuPlacement, menuOffset: 16, ...restCompositeButtonProps, onMenuToggle: (shown) => {
66
+ setTooltipDisabled(shown);
67
+ onMenuToggle?.(shown);
68
+ }, children: [jsx(Icon, { icon: optionsAwareIsMute ? 'mic-off' : 'mic' }), (!hasBrowserPermission || !hasPermission) && (jsx("span", { className: "str-video__no-media-permission", children: "!" })), isPromptingPermission && (jsx("span", { className: "str-video__pending-permission", title: t('Waiting for permission'), children: "?" })), isSystemMuted && hasBrowserPermission && hasPermission && (jsx("span", { className: "str-video__system-muted", title: t('Microphone is paused by your system'), children: "!" }))] }) }) }) }));
69
+ };
70
+
71
+ export { ToggleAudioPreviewButton, ToggleAudioPublishingButton };
72
+ //# sourceMappingURL=ToggleAudioButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToggleAudioButton.js","sources":["../../../../../../../src/components/CallControls/ToggleAudioButton.tsx"],"sourcesContent":["import {\n OwnCapability,\n RequestPermissionRequestPermissionsEnum,\n SfuModels,\n} from '@stream-io/video-client';\nimport {\n Restricted,\n useCallStateHooks,\n useI18n,\n type UseInputMediaDeviceOptions,\n} from '@stream-io/video-react-bindings';\nimport clsx from 'clsx';\nimport { CompositeButton, IconButtonWithMenuProps } from '../Button';\nimport { DeviceSelectorAudioInput } from '../DeviceSettings';\nimport { PermissionNotification } from '../Notification';\nimport { useRequestPermission } from '../../hooks';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\nimport { useState } from 'react';\nimport {\n createCallControlHandler,\n PropsWithErrorHandler,\n} from '../../utilities/callControlHandler';\n\nexport type ToggleAudioPreviewButtonProps = PropsWithErrorHandler<\n Pick<\n IconButtonWithMenuProps,\n 'caption' | 'Menu' | 'menuPlacement' | 'onMenuToggle'\n > &\n UseInputMediaDeviceOptions\n>;\n\nexport const ToggleAudioPreviewButton = (\n props: ToggleAudioPreviewButtonProps,\n) => {\n const {\n caption,\n Menu = DeviceSelectorAudioInput,\n menuPlacement = 'top',\n onMenuToggle,\n optimisticUpdates,\n ...restCompositeButtonProps\n } = props;\n const { t } = useI18n();\n const { useMicrophoneState, useLocalParticipant } = useCallStateHooks();\n const {\n microphone,\n hasBrowserPermission,\n isPromptingPermission,\n optionsAwareIsMute,\n isTogglePending,\n } = useMicrophoneState({ optimisticUpdates });\n const localParticipant = useLocalParticipant();\n const isSystemMuted = !!localParticipant?.interruptedTracks?.includes(\n SfuModels.TrackType.AUDIO,\n );\n const [tooltipDisabled, setTooltipDisabled] = useState(false);\n const handleClick = createCallControlHandler(props, () =>\n microphone.toggle(),\n );\n\n return (\n <WithTooltip\n title={\n !hasBrowserPermission\n ? t('Check your browser audio permissions')\n : isSystemMuted\n ? t('Microphone is paused by your system')\n : (caption ?? t('Mic'))\n }\n tooltipDisabled={tooltipDisabled}\n >\n <CompositeButton\n active={optionsAwareIsMute}\n caption={caption}\n className={clsx(\n !hasBrowserPermission && 'str-video__device-unavailable',\n )}\n variant=\"secondary\"\n disabled={\n !hasBrowserPermission || (!optimisticUpdates && isTogglePending)\n }\n data-testid={\n optionsAwareIsMute\n ? 'preview-audio-unmute-button'\n : 'preview-audio-mute-button'\n }\n onClick={handleClick}\n Menu={Menu}\n menuPlacement={menuPlacement}\n {...restCompositeButtonProps}\n onMenuToggle={(shown) => {\n setTooltipDisabled(shown);\n onMenuToggle?.(shown);\n }}\n >\n <Icon icon={!optionsAwareIsMute ? 'mic' : 'mic-off'} />\n {!hasBrowserPermission && (\n <span\n className=\"str-video__no-media-permission\"\n title={t('Check your browser audio permissions')}\n children=\"!\"\n />\n )}\n {isPromptingPermission && (\n <span\n className=\"str-video__pending-permission\"\n title={t('Waiting for permission')}\n children=\"?\"\n />\n )}\n {isSystemMuted && hasBrowserPermission && (\n <span\n className=\"str-video__system-muted\"\n title={t('Microphone is paused by your system')}\n children=\"!\"\n />\n )}\n </CompositeButton>\n </WithTooltip>\n );\n};\n\nexport type ToggleAudioPublishingButtonProps = PropsWithErrorHandler<\n Pick<\n IconButtonWithMenuProps,\n 'caption' | 'Menu' | 'menuPlacement' | 'onMenuToggle'\n > &\n UseInputMediaDeviceOptions\n>;\n\nexport const ToggleAudioPublishingButton = (\n props: ToggleAudioPublishingButtonProps,\n) => {\n const { t } = useI18n();\n const {\n caption,\n Menu = <DeviceSelectorAudioInput visualType=\"list\" />,\n menuPlacement = 'top',\n onMenuToggle,\n optimisticUpdates,\n ...restCompositeButtonProps\n } = props;\n\n const { hasPermission, requestPermission, isAwaitingPermission } =\n useRequestPermission(RequestPermissionRequestPermissionsEnum.SEND_AUDIO);\n\n const { useMicrophoneState, useLocalParticipant } = useCallStateHooks();\n const {\n microphone,\n hasBrowserPermission,\n isPromptingPermission,\n isTogglePending,\n optionsAwareIsMute,\n } = useMicrophoneState({ optimisticUpdates });\n const localParticipant = useLocalParticipant();\n const isSystemMuted = !!localParticipant?.interruptedTracks?.includes(\n SfuModels.TrackType.AUDIO,\n );\n\n const [tooltipDisabled, setTooltipDisabled] = useState(false);\n const handleClick = createCallControlHandler(props, async () => {\n if (!hasPermission) {\n await requestPermission();\n } else {\n await microphone.toggle();\n }\n });\n\n return (\n <Restricted requiredGrants={[OwnCapability.SEND_AUDIO]}>\n <PermissionNotification\n permission={OwnCapability.SEND_AUDIO}\n isAwaitingApproval={isAwaitingPermission}\n messageApproved={t('You can now speak.')}\n messageAwaitingApproval={t('Awaiting for an approval to speak.')}\n messageRevoked={t('You can no longer speak.')}\n >\n <WithTooltip\n title={\n !hasPermission\n ? t('You have no permission to share your audio')\n : !hasBrowserPermission\n ? t('Check your browser mic permissions')\n : isSystemMuted\n ? t('Microphone is paused by your system')\n : (caption ?? t('Mic'))\n }\n tooltipDisabled={tooltipDisabled}\n >\n <CompositeButton\n active={optionsAwareIsMute}\n caption={caption}\n variant=\"secondary\"\n disabled={\n !hasBrowserPermission ||\n !hasPermission ||\n // disable button while the toggle action is pending when not using optimistic updates\n (!optimisticUpdates && isTogglePending)\n }\n data-testid={\n optionsAwareIsMute ? 'audio-unmute-button' : 'audio-mute-button'\n }\n onClick={handleClick}\n Menu={Menu}\n menuPlacement={menuPlacement}\n menuOffset={16}\n {...restCompositeButtonProps}\n onMenuToggle={(shown) => {\n setTooltipDisabled(shown);\n onMenuToggle?.(shown);\n }}\n >\n <Icon icon={optionsAwareIsMute ? 'mic-off' : 'mic'} />\n {(!hasBrowserPermission || !hasPermission) && (\n <span className=\"str-video__no-media-permission\">!</span>\n )}\n {isPromptingPermission && (\n <span\n className=\"str-video__pending-permission\"\n title={t('Waiting for permission')}\n >\n ?\n </span>\n )}\n {isSystemMuted && hasBrowserPermission && hasPermission && (\n <span\n className=\"str-video__system-muted\"\n title={t('Microphone is paused by your system')}\n >\n !\n </span>\n )}\n </CompositeButton>\n </WithTooltip>\n </PermissionNotification>\n </Restricted>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { CompositeButton } from '../Button/CompositeButton.js';
3
+ import '../Button/IconButton.js';
4
+ import { useI18n } from '@stream-io/video-react-bindings';
5
+ import { Icon } from '../Icon/Icon.js';
6
+ import { useState } from 'react';
7
+ import '@stream-io/video-client';
8
+ import '../DeviceSettings/DeviceSettings.js';
9
+ import 'clsx';
10
+ import '@floating-ui/react';
11
+ import '../DropdownSelect/DropdownSelect.js';
12
+ import '../Menu/MenuToggle.js';
13
+ import { DeviceSelectorAudioOutput } from '../DeviceSettings/DeviceSelectorAudio.js';
14
+ import { WithTooltip } from '../Tooltip/WithTooltip.js';
15
+
16
+ const ToggleAudioOutputButton = (props) => {
17
+ const { t } = useI18n();
18
+ const { caption, Menu = DeviceSelectorAudioOutput, menuPlacement = 'top', onMenuToggle, } = props;
19
+ const [tooltipDisabled, setTooltipDisabled] = useState(false);
20
+ return (jsx(WithTooltip, { title: caption || t('Speakers'), tooltipDisabled: tooltipDisabled, children: jsx(CompositeButton, { Menu: Menu, menuPlacement: menuPlacement, caption: caption, "data-testid": "audio-output-button", onMenuToggle: (shown) => {
21
+ setTooltipDisabled(shown);
22
+ onMenuToggle?.(shown);
23
+ }, children: jsx(Icon, { icon: "speaker" }) }) }));
24
+ };
25
+
26
+ export { ToggleAudioOutputButton };
27
+ //# sourceMappingURL=ToggleAudioOutputButton.js.map