@stream-io/video-react-sdk 1.43.2 → 2.0.0-beta.1

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 (328) hide show
  1. package/CHANGELOG.md +18 -19
  2. package/dist/css/embedded.css +2592 -1498
  3. package/dist/css/embedded.css.map +1 -1
  4. package/dist/css/styles.css +2388 -1222
  5. package/dist/css/styles.css.map +1 -1
  6. package/dist/embedded.cjs.js +535 -476
  7. package/dist/embedded.cjs.js.map +1 -1
  8. package/dist/esm/index.js +10 -7
  9. package/dist/esm/index.js.map +1 -1
  10. package/dist/esm/src/components/Avatar/Avatar.js +13 -5
  11. package/dist/esm/src/components/Avatar/Avatar.js.map +1 -1
  12. package/dist/esm/src/components/Badge/Badge.js +21 -0
  13. package/dist/esm/src/components/Badge/Badge.js.map +1 -0
  14. package/dist/esm/src/components/Button/Button.js +10 -0
  15. package/dist/esm/src/components/Button/Button.js.map +1 -0
  16. package/dist/esm/src/components/Button/CompositeButton.js +10 -17
  17. package/dist/esm/src/components/Button/CompositeButton.js.map +1 -1
  18. package/dist/esm/src/components/Button/IconButton.js +3 -9
  19. package/dist/esm/src/components/Button/IconButton.js.map +1 -1
  20. package/dist/esm/src/components/CallControls/AcceptCallButton.js +3 -2
  21. package/dist/esm/src/components/CallControls/AcceptCallButton.js.map +1 -1
  22. package/dist/esm/src/components/CallControls/CallControls.js +3 -0
  23. package/dist/esm/src/components/CallControls/CallControls.js.map +1 -1
  24. package/dist/esm/src/components/CallControls/CancelCallButton.js +11 -6
  25. package/dist/esm/src/components/CallControls/CancelCallButton.js.map +1 -1
  26. package/dist/esm/src/components/CallControls/ReactionsButton.js +7 -3
  27. package/dist/esm/src/components/CallControls/ReactionsButton.js.map +1 -1
  28. package/dist/esm/src/components/CallControls/RecordCallButton.js +17 -11
  29. package/dist/esm/src/components/CallControls/RecordCallButton.js.map +1 -1
  30. package/dist/esm/src/components/CallControls/ScreenShareButton.js +11 -4
  31. package/dist/esm/src/components/CallControls/ScreenShareButton.js.map +1 -1
  32. package/dist/esm/src/components/CallControls/ToggleAudioButton.js +28 -17
  33. package/dist/esm/src/components/CallControls/ToggleAudioButton.js.map +1 -1
  34. package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js +9 -4
  35. package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js.map +1 -1
  36. package/dist/esm/src/components/CallControls/ToggleVideoButton.js +32 -23
  37. package/dist/esm/src/components/CallControls/ToggleVideoButton.js.map +1 -1
  38. package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js +3 -3
  39. package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js.map +1 -1
  40. package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js +8 -3
  41. package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js.map +1 -1
  42. package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js +20 -7
  43. package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js.map +1 -1
  44. package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js +8 -5
  45. package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js.map +1 -1
  46. package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js +5 -2
  47. package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js.map +1 -1
  48. package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js +7 -3
  49. package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js.map +1 -1
  50. package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js +1 -1
  51. package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js.map +1 -1
  52. package/dist/esm/src/components/DeviceSettings/DeviceSelector.js +1 -1
  53. package/dist/esm/src/components/DeviceSettings/DeviceSelector.js.map +1 -1
  54. package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js +2 -2
  55. package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js.map +1 -1
  56. package/dist/esm/src/components/DeviceSettings/DeviceSettings.js +8 -5
  57. package/dist/esm/src/components/DeviceSettings/DeviceSettings.js.map +1 -1
  58. package/dist/esm/src/components/DeviceSettings/SpeakerTest.js +10 -4
  59. package/dist/esm/src/components/DeviceSettings/SpeakerTest.js.map +1 -1
  60. package/dist/esm/src/components/DropdownSelect/DropdownSelect.js +1 -1
  61. package/dist/esm/src/components/DropdownSelect/DropdownSelect.js.map +1 -1
  62. package/dist/esm/src/components/Menu/GenericMenu.js +2 -1
  63. package/dist/esm/src/components/Menu/GenericMenu.js.map +1 -1
  64. package/dist/esm/src/components/Menu/MenuToggle.js +3 -0
  65. package/dist/esm/src/components/Menu/MenuToggle.js.map +1 -1
  66. package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js +6 -3
  67. package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js.map +1 -1
  68. package/dist/esm/src/components/Notification/Notification.js +12 -3
  69. package/dist/esm/src/components/Notification/Notification.js.map +1 -1
  70. package/dist/esm/src/components/Notification/PermissionNotification.js +2 -2
  71. package/dist/esm/src/components/Notification/PermissionNotification.js.map +1 -1
  72. package/dist/esm/src/components/Notification/RecordingInProgressNotification.js +7 -3
  73. package/dist/esm/src/components/Notification/RecordingInProgressNotification.js.map +1 -1
  74. package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js +7 -2
  75. package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js.map +1 -1
  76. package/dist/esm/src/components/Permissions/PermissionRequests.js +13 -12
  77. package/dist/esm/src/components/Permissions/PermissionRequests.js.map +1 -1
  78. package/dist/esm/src/components/RingingCall/RingingCall.js +38 -14
  79. package/dist/esm/src/components/RingingCall/RingingCall.js.map +1 -1
  80. package/dist/esm/src/components/RingingCall/RingingCallControls.js +7 -3
  81. package/dist/esm/src/components/RingingCall/RingingCallControls.js.map +1 -1
  82. package/dist/esm/src/components/Search/SearchInput.js +1 -1
  83. package/dist/esm/src/components/Search/SearchInput.js.map +1 -1
  84. package/dist/esm/src/components/StreamTheme/StreamTheme.js +2 -2
  85. package/dist/esm/src/components/StreamTheme/StreamTheme.js.map +1 -1
  86. package/dist/esm/src/components/Tooltip/Tooltip.js +8 -8
  87. package/dist/esm/src/components/Tooltip/Tooltip.js.map +1 -1
  88. package/dist/esm/src/components/VideoPreview/VideoPreview.js +36 -5
  89. package/dist/esm/src/components/VideoPreview/VideoPreview.js.map +1 -1
  90. package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js +38 -12
  91. package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js.map +1 -1
  92. package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js +9 -5
  93. package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js.map +1 -1
  94. package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js +9 -6
  95. package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js.map +1 -1
  96. package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js +9 -6
  97. package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js.map +1 -1
  98. package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js +11 -6
  99. package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js.map +1 -1
  100. package/dist/esm/src/core/components/ParticipantView/ConnectionQualityIndicator.js +25 -0
  101. package/dist/esm/src/core/components/ParticipantView/ConnectionQualityIndicator.js.map +1 -0
  102. package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js +17 -13
  103. package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js.map +1 -1
  104. package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js +13 -8
  105. package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js.map +1 -1
  106. package/dist/esm/src/core/components/StreamVideo/StreamVideo.js +24 -3
  107. package/dist/esm/src/core/components/StreamVideo/StreamVideo.js.map +1 -1
  108. package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js +3 -13
  109. package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js.map +1 -1
  110. package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js +4 -2
  111. package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js.map +1 -1
  112. package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js +4 -2
  113. package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js.map +1 -1
  114. package/dist/esm/src/embedded/EmbeddedClientProvider.js +7 -4
  115. package/dist/esm/src/embedded/EmbeddedClientProvider.js.map +1 -1
  116. package/dist/esm/src/embedded/call/CallControls.js +10 -6
  117. package/dist/esm/src/embedded/call/CallControls.js.map +1 -1
  118. package/dist/esm/src/embedded/call/CallHeader.js +10 -7
  119. package/dist/esm/src/embedded/call/CallHeader.js.map +1 -1
  120. package/dist/esm/src/embedded/call/CallLayout.js +8 -5
  121. package/dist/esm/src/embedded/call/CallLayout.js.map +1 -1
  122. package/dist/esm/src/embedded/call/CallStateRouter.js +7 -4
  123. package/dist/esm/src/embedded/call/CallStateRouter.js.map +1 -1
  124. package/dist/esm/src/embedded/hooks/useLayout.js +7 -4
  125. package/dist/esm/src/embedded/hooks/useLayout.js.map +1 -1
  126. package/dist/esm/src/embedded/livestream/host/HostLayout.js +12 -7
  127. package/dist/esm/src/embedded/livestream/host/HostLayout.js.map +1 -1
  128. package/dist/esm/src/embedded/livestream/host/HostStateRouter.js +12 -7
  129. package/dist/esm/src/embedded/livestream/host/HostStateRouter.js.map +1 -1
  130. package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js +9 -6
  131. package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js.map +1 -1
  132. package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js +12 -9
  133. package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js.map +1 -1
  134. package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js +7 -4
  135. package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js.map +1 -1
  136. package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js +13 -9
  137. package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js.map +1 -1
  138. package/dist/esm/src/embedded/shared/CallDuration/CallDuration.js +40 -0
  139. package/dist/esm/src/embedded/shared/CallDuration/CallDuration.js.map +1 -0
  140. package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js +8 -6
  141. package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js.map +1 -1
  142. package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js +26 -2
  143. package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js.map +1 -1
  144. package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js +12 -6
  145. package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js.map +1 -1
  146. package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js +8 -6
  147. package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js.map +1 -1
  148. package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js +15 -14
  149. package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js.map +1 -1
  150. package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js +4 -0
  151. package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js.map +1 -1
  152. package/dist/esm/src/embedded/shared/JoinError/JoinError.js +8 -6
  153. package/dist/esm/src/embedded/shared/JoinError/JoinError.js.map +1 -1
  154. package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js +11 -7
  155. package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js.map +1 -1
  156. package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js +6 -4
  157. package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js.map +1 -1
  158. package/dist/esm/src/embedded/shared/Lobby/Lobby.js +10 -9
  159. package/dist/esm/src/embedded/shared/Lobby/Lobby.js.map +1 -1
  160. package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js +6 -4
  161. package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js.map +1 -1
  162. package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js +8 -6
  163. package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js.map +1 -1
  164. package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js +11 -9
  165. package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js.map +1 -1
  166. package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js +6 -4
  167. package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js.map +1 -1
  168. package/dist/esm/src/hooks/useDeviceList.js +4 -2
  169. package/dist/esm/src/hooks/useDeviceList.js.map +1 -1
  170. package/dist/esm/src/i18n/Streami18n.js +58 -0
  171. package/dist/esm/src/i18n/Streami18n.js.map +1 -0
  172. package/dist/esm/src/i18n/TranslationContext.js +42 -0
  173. package/dist/esm/src/i18n/TranslationContext.js.map +1 -0
  174. package/dist/esm/src/i18n/runtimeDefaults.js +20 -0
  175. package/dist/esm/src/i18n/runtimeDefaults.js.map +1 -0
  176. package/dist/esm/src/i18n/useStreami18n.js +49 -0
  177. package/dist/esm/src/i18n/useStreami18n.js.map +1 -0
  178. package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js +4 -0
  179. package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js.map +1 -1
  180. package/dist/index.cjs.js +559 -623
  181. package/dist/index.cjs.js.map +1 -1
  182. package/dist/index.d.ts +1 -1
  183. package/dist/src/components/Avatar/Avatar.d.ts +9 -4
  184. package/dist/src/components/Badge/Badge.d.ts +23 -0
  185. package/dist/src/components/Badge/index.d.ts +1 -0
  186. package/dist/src/components/Button/Button.d.ts +16 -0
  187. package/dist/src/components/Button/CompositeButton.d.ts +6 -3
  188. package/dist/src/components/Button/IconButton.d.ts +7 -7
  189. package/dist/src/components/Button/index.d.ts +2 -2
  190. package/dist/src/components/CallControls/CancelCallButton.d.ts +3 -1
  191. package/dist/src/components/CallControls/ToggleAudioButton.d.ts +3 -3
  192. package/dist/src/components/CallControls/ToggleAudioOutputButton.d.ts +2 -2
  193. package/dist/src/components/CallControls/ToggleVideoButton.d.ts +3 -3
  194. package/dist/src/components/CallControls/index.d.ts +0 -1
  195. package/dist/src/components/Menu/GenericMenu.d.ts +1 -0
  196. package/dist/src/components/Notification/Notification.d.ts +2 -1
  197. package/dist/src/components/StreamTheme/StreamTheme.d.ts +2 -1
  198. package/dist/src/components/VideoPreview/VideoPreview.d.ts +6 -1
  199. package/dist/src/components/index.d.ts +1 -1
  200. package/dist/src/core/components/ParticipantView/ConnectionQualityIndicator.d.ts +10 -0
  201. package/dist/src/core/components/ParticipantView/index.d.ts +1 -0
  202. package/dist/src/core/components/StreamVideo/StreamVideo.d.ts +18 -2
  203. package/dist/src/embedded/shared/CallDuration/CallDuration.d.ts +9 -0
  204. package/dist/src/embedded/shared/index.d.ts +1 -0
  205. package/dist/src/i18n/Streami18n.d.ts +56 -0
  206. package/dist/src/i18n/TranslationContext.d.ts +30 -0
  207. package/dist/src/i18n/index.d.ts +16 -0
  208. package/dist/src/i18n/keys.d.ts +164 -0
  209. package/dist/src/i18n/runtimeDefaults.d.ts +17 -0
  210. package/dist/src/i18n/types.d.ts +45 -0
  211. package/dist/src/i18n/useStreami18n.d.ts +19 -0
  212. package/index.ts +1 -1
  213. package/package.json +18 -13
  214. package/src/components/Avatar/Avatar.tsx +53 -19
  215. package/src/components/Badge/Badge.tsx +48 -0
  216. package/src/components/Badge/index.ts +1 -0
  217. package/src/components/Button/Button.tsx +49 -0
  218. package/src/components/Button/CompositeButton.tsx +82 -73
  219. package/src/components/Button/IconButton.tsx +19 -29
  220. package/src/components/Button/index.ts +2 -2
  221. package/src/components/CallControls/AcceptCallButton.tsx +3 -1
  222. package/src/components/CallControls/CancelCallButton.tsx +32 -24
  223. package/src/components/CallControls/ReactionsButton.tsx +7 -3
  224. package/src/components/CallControls/RecordCallButton.tsx +50 -23
  225. package/src/components/CallControls/ScreenShareButton.tsx +27 -6
  226. package/src/components/CallControls/ToggleAudioButton.tsx +62 -61
  227. package/src/components/CallControls/ToggleAudioOutputButton.tsx +7 -4
  228. package/src/components/CallControls/ToggleVideoButton.tsx +66 -66
  229. package/src/components/CallControls/index.ts +0 -1
  230. package/src/components/CallParticipantsList/BlockedUserListing.tsx +9 -2
  231. package/src/components/CallParticipantsList/CallParticipantListHeader.tsx +10 -3
  232. package/src/components/CallParticipantsList/CallParticipantListingItem.tsx +33 -8
  233. package/src/components/CallParticipantsList/CallParticipantsList.tsx +21 -5
  234. package/src/components/CallParticipantsList/EmptyParticipantSearchList.tsx +2 -2
  235. package/src/components/CallRecordingList/CallRecordingListHeader.tsx +11 -3
  236. package/src/components/DeviceSettings/DeviceAudioPreviewItem.tsx +3 -1
  237. package/src/components/DeviceSettings/DeviceSelector.tsx +1 -1
  238. package/src/components/DeviceSettings/DeviceSelectorAudio.tsx +2 -7
  239. package/src/components/DeviceSettings/DeviceSettings.tsx +14 -5
  240. package/src/components/DeviceSettings/SpeakerTest.tsx +7 -2
  241. package/src/components/DropdownSelect/DropdownSelect.tsx +3 -1
  242. package/src/components/Menu/GenericMenu.tsx +4 -0
  243. package/src/components/Notification/MicCaptureErrorNotification.tsx +7 -2
  244. package/src/components/Notification/Notification.tsx +20 -4
  245. package/src/components/Notification/PermissionNotification.tsx +2 -0
  246. package/src/components/Notification/RecordingInProgressNotification.tsx +5 -6
  247. package/src/components/Notification/SpeakingWhileMutedNotification.tsx +8 -2
  248. package/src/components/Permissions/PermissionRequests.tsx +50 -43
  249. package/src/components/RingingCall/RingingCall.tsx +40 -14
  250. package/src/components/RingingCall/RingingCallControls.tsx +2 -1
  251. package/src/components/Search/SearchInput.tsx +2 -3
  252. package/src/components/StreamTheme/StreamTheme.tsx +3 -1
  253. package/src/components/Tooltip/Tooltip.tsx +3 -10
  254. package/src/components/VideoPreview/VideoPreview.tsx +50 -5
  255. package/src/components/index.ts +1 -1
  256. package/src/core/components/CallLayout/LivestreamLayout.tsx +48 -18
  257. package/src/core/components/CallLayout/PaginatedGridLayout.tsx +14 -0
  258. package/src/core/components/CallLayout/PipLayout/Grid.tsx +10 -2
  259. package/src/core/components/CallLayout/PipLayout/Pip.tsx +6 -2
  260. package/src/core/components/CallLayout/SpeakerLayout.tsx +27 -0
  261. package/src/core/components/CallLayout/partcipantFilter.test.ts +38 -31
  262. package/src/core/components/ParticipantView/ConnectionQualityIndicator.tsx +54 -0
  263. package/src/core/components/ParticipantView/DefaultParticipantViewUI.tsx +60 -27
  264. package/src/core/components/ParticipantView/ParticipantActionsContextMenu.tsx +63 -22
  265. package/src/core/components/ParticipantView/index.ts +1 -0
  266. package/src/core/components/StreamVideo/StreamVideo.tsx +39 -4
  267. package/src/core/components/Video/BaseVideoPlaceholder.tsx +13 -30
  268. package/src/core/components/Video/DefaultPictureInPicturePlaceholder.tsx +5 -2
  269. package/src/core/components/Video/DefaultVideoPlaceholder.tsx +2 -2
  270. package/src/embedded/call/CallControls.tsx +9 -18
  271. package/src/embedded/call/CallHeader.tsx +3 -12
  272. package/src/embedded/call/CallLayout.tsx +1 -1
  273. package/src/embedded/livestream/host/HostLayout.tsx +26 -20
  274. package/src/embedded/livestream/host/HostStateRouter.tsx +12 -8
  275. package/src/embedded/livestream/viewer/ViewerLayout.tsx +8 -11
  276. package/src/embedded/livestream/viewer/ViewerLobby.tsx +31 -15
  277. package/src/embedded/shared/BlurToggleButton/BlurToggleButton.tsx +18 -12
  278. package/src/embedded/shared/CallDuration/CallDuration.tsx +32 -0
  279. package/src/embedded/shared/CallFeedback/CallEndedScreen.tsx +27 -13
  280. package/src/embedded/shared/CallFeedback/RatingScreen.tsx +20 -12
  281. package/src/embedded/shared/CallFeedback/StarRating.tsx +10 -3
  282. package/src/embedded/shared/CallFeedback/ThankYouScreen.tsx +6 -3
  283. package/src/embedded/shared/ConnectionNotification/ConnectionNotification.tsx +21 -14
  284. package/src/embedded/shared/JoinError/JoinError.tsx +7 -6
  285. package/src/embedded/shared/Lobby/DeviceControls.tsx +25 -3
  286. package/src/embedded/shared/Lobby/Lobby.tsx +19 -22
  287. package/src/embedded/shared/Lobby/ToggleMicButton.tsx +10 -3
  288. package/src/embedded/shared/Lobby/VideoPreviewFallbacks.tsx +4 -2
  289. package/src/embedded/shared/index.ts +1 -0
  290. package/src/hooks/useDeviceList.tsx +2 -2
  291. package/src/i18n/Streami18n.ts +67 -0
  292. package/src/i18n/TranslationContext.tsx +55 -0
  293. package/src/i18n/index.ts +22 -0
  294. package/src/i18n/keys.ts +169 -0
  295. package/src/i18n/runtimeDefaults.ts +17 -0
  296. package/src/i18n/types.ts +78 -0
  297. package/src/i18n/useStreami18n.ts +66 -0
  298. package/src/utilities/filter.test.ts +132 -124
  299. package/src/utilities/normalizeString.test.ts +50 -48
  300. package/dist/embedded-CallStatsLatencyChart-CpL1M_s0.cjs.js +0 -59
  301. package/dist/embedded-CallStatsLatencyChart-CpL1M_s0.cjs.js.map +0 -1
  302. package/dist/esm/src/components/Button/TextButton.js +0 -8
  303. package/dist/esm/src/components/Button/TextButton.js.map +0 -1
  304. package/dist/esm/src/components/CallControls/CallStatsButton.js +0 -18
  305. package/dist/esm/src/components/CallControls/CallStatsButton.js.map +0 -1
  306. package/dist/esm/src/components/CallStats/CallStats.js +0 -180
  307. package/dist/esm/src/components/CallStats/CallStats.js.map +0 -1
  308. package/dist/esm/src/components/CallStats/CallStatsLatencyChart.js +0 -57
  309. package/dist/esm/src/components/CallStats/CallStatsLatencyChart.js.map +0 -1
  310. package/dist/esm/src/translations/en.json.js +0 -177
  311. package/dist/esm/src/translations/en.json.js.map +0 -1
  312. package/dist/esm/src/translations/index.js +0 -6
  313. package/dist/esm/src/translations/index.js.map +0 -1
  314. package/dist/latency-chart-CpL1M_s0.cjs.js +0 -59
  315. package/dist/latency-chart-CpL1M_s0.cjs.js.map +0 -1
  316. package/dist/src/components/Button/TextButton.d.ts +0 -2
  317. package/dist/src/components/CallControls/CallStatsButton.d.ts +0 -4
  318. package/dist/src/components/CallStats/CallStats.d.ts +0 -22
  319. package/dist/src/components/CallStats/CallStatsLatencyChart.d.ts +0 -7
  320. package/dist/src/components/CallStats/index.d.ts +0 -1
  321. package/dist/src/translations/index.d.ts +0 -146
  322. package/src/components/Button/TextButton.tsx +0 -12
  323. package/src/components/CallControls/CallStatsButton.tsx +0 -37
  324. package/src/components/CallStats/CallStats.tsx +0 -439
  325. package/src/components/CallStats/CallStatsLatencyChart.tsx +0 -76
  326. package/src/components/CallStats/index.ts +0 -1
  327. package/src/translations/en.json +0 -154
  328. package/src/translations/index.ts +0 -3
@@ -1,10 +1,13 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { useState, useEffect } from 'react';
3
- import { useCall, useI18n, Restricted } from '@stream-io/video-react-bindings';
3
+ import { useCall, Restricted } from '@stream-io/video-react-bindings';
4
+ import '@stream-io/i18n';
5
+ import { useI18n } from '../../../i18n/TranslationContext.js';
6
+ import '@stream-io/i18n/react';
4
7
  import { hasAudio, hasVideo, hasScreenShare, hasScreenShareAudio, OwnCapability } from '@stream-io/video-client';
5
8
  import { useParticipantViewContext } from './ParticipantViewContext.js';
6
9
  import { useMenuContext } from '../../../components/Menu/MenuToggle.js';
7
- import { GenericMenu, GenericMenuButtonItem } from '../../../components/Menu/GenericMenu.js';
10
+ import { GenericMenu, GenericMenuButtonItem, GenericMenuSeparator } from '../../../components/Menu/GenericMenu.js';
8
11
  import { Icon } from '../../../components/Icon/Icon.js';
9
12
  import { usePictureInPictureState } from '../../hooks/usePictureInPictureState.js';
10
13
 
@@ -85,12 +88,14 @@ const ParticipantActionsContextMenu = () => {
85
88
  return document.exitPictureInPicture().catch(console.error);
86
89
  };
87
90
  const { close } = useMenuContext() || {};
88
- return (jsxs(GenericMenu, { onItemClick: close, children: [jsxs(GenericMenuButtonItem, { onClick: toggleParticipantPin, disabled: pin && !pin.isLocalPin, children: [jsx(Icon, { icon: "pin" }), pin ? t('Unpin') : t('Pin')] }), jsxs(Restricted, { requiredGrants: [OwnCapability.PIN_FOR_EVERYONE], children: [jsxs(GenericMenuButtonItem, { onClick: pinForEveryone, disabled: pin && !pin.isLocalPin, children: [jsx(Icon, { icon: "pin" }), t('Pin for everyone')] }), jsxs(GenericMenuButtonItem, { onClick: unpinForEveryone, disabled: !pin || pin.isLocalPin, children: [jsx(Icon, { icon: "pin" }), t('Unpin for everyone')] })] }), jsx(Restricted, { requiredGrants: [OwnCapability.BLOCK_USERS], children: jsxs(GenericMenuButtonItem, { onClick: blockUser, children: [jsx(Icon, { icon: "not-allowed" }), t('Block')] }) }), jsx(Restricted, { requiredGrants: [OwnCapability.KICK_USER], children: jsxs(GenericMenuButtonItem, { onClick: kickUser, children: [jsx(Icon, { icon: "kick-user" }), t('Kick')] }) }), jsxs(Restricted, { requiredGrants: [OwnCapability.MUTE_USERS], children: [hasVideoTrack && (jsxs(GenericMenuButtonItem, { onClick: muteVideo, children: [jsx(Icon, { icon: "camera-off-outline" }), t('Turn off video')] })), hasScreenShareTrack && (jsxs(GenericMenuButtonItem, { onClick: muteScreenShare, children: [jsx(Icon, { icon: "screen-share-off" }), t('Turn off screen share')] })), hasAudioTrack && (jsxs(GenericMenuButtonItem, { onClick: muteAudio, children: [jsx(Icon, { icon: "no-audio" }), t('Mute audio')] })), hasScreenShareAudioTrack && (jsxs(GenericMenuButtonItem, { onClick: muteScreenShareAudio, children: [jsx(Icon, { icon: "no-audio" }), t('Mute screen share audio')] }))] }), participantViewElement &&
89
- typeof participantViewElement.requestFullscreen !== 'undefined' && (jsx(GenericMenuButtonItem, { onClick: toggleFullscreenMode, children: t('{{ direction }} fullscreen', {
90
- direction: fullscreenModeOn ? t('Leave') : t('Enter'),
91
- }) })), videoElement && document.pictureInPictureEnabled && (jsx(GenericMenuButtonItem, { onClick: togglePictureInPicture, children: t('{{ direction }} picture-in-picture', {
92
- direction: isPiP ? t('Leave') : t('Enter'),
93
- }) })), jsxs(Restricted, { requiredGrants: [OwnCapability.UPDATE_CALL_PERMISSIONS], children: [jsx(GenericMenuButtonItem, { onClick: grantPermission(OwnCapability.SEND_AUDIO), children: t('Allow audio') }), jsx(GenericMenuButtonItem, { onClick: grantPermission(OwnCapability.SEND_VIDEO), children: t('Allow video') }), jsx(GenericMenuButtonItem, { onClick: grantPermission(OwnCapability.SCREENSHARE), children: t('Allow screen sharing') }), jsx(GenericMenuButtonItem, { onClick: revokePermission(OwnCapability.SEND_AUDIO), children: t('Disable audio') }), jsx(GenericMenuButtonItem, { onClick: revokePermission(OwnCapability.SEND_VIDEO), children: t('Disable video') }), jsx(GenericMenuButtonItem, { onClick: revokePermission(OwnCapability.SCREENSHARE), children: t('Disable screen sharing') })] })] }));
91
+ return (jsxs(GenericMenu, { onItemClick: close, children: [jsxs(GenericMenuButtonItem, { onClick: toggleParticipantPin, disabled: pin && !pin.isLocalPin, children: [jsx(Icon, { icon: "pin" }), pin
92
+ ? t('participantView.unpin.label', 'Unpin')
93
+ : t('participantView.actionsMenu.pin.label', 'Pin')] }), jsxs(Restricted, { requiredGrants: [OwnCapability.PIN_FOR_EVERYONE], children: [jsxs(GenericMenuButtonItem, { onClick: pinForEveryone, disabled: pin && !pin.isLocalPin, children: [jsx(Icon, { icon: "pin" }), t('participantView.actionsMenu.pinForEveryone.label', 'Pin for everyone')] }), jsxs(GenericMenuButtonItem, { onClick: unpinForEveryone, disabled: !pin || pin.isLocalPin, children: [jsx(Icon, { icon: "pin" }), t('participantView.actionsMenu.unpinForEveryone.label', 'Unpin for everyone')] })] }), jsx(Restricted, { requiredGrants: [OwnCapability.BLOCK_USERS], children: jsxs(GenericMenuButtonItem, { onClick: blockUser, children: [jsx(Icon, { icon: "not-allowed" }), t('participantView.actionsMenu.block.label', 'Block')] }) }), jsx(Restricted, { requiredGrants: [OwnCapability.KICK_USER], children: jsxs(GenericMenuButtonItem, { onClick: kickUser, children: [jsx(Icon, { icon: "kick-user" }), t('participantView.actionsMenu.kick.label', 'Kick')] }) }), jsx(GenericMenuSeparator, {}), jsxs(Restricted, { requiredGrants: [OwnCapability.MUTE_USERS], children: [hasVideoTrack && (jsxs(GenericMenuButtonItem, { onClick: muteVideo, children: [jsx(Icon, { icon: "camera-off-outline" }), t('participantView.actionsMenu.turnOffVideo.label', 'Turn off video')] })), hasScreenShareTrack && (jsxs(GenericMenuButtonItem, { onClick: muteScreenShare, children: [jsx(Icon, { icon: "screen-share-off" }), t('participantView.actionsMenu.turnOffScreenShare.label', 'Turn off screen share')] })), hasAudioTrack && (jsxs(GenericMenuButtonItem, { onClick: muteAudio, children: [jsx(Icon, { icon: "no-audio" }), t('participantView.actionsMenu.muteAudio.label', 'Mute audio')] })), hasScreenShareAudioTrack && (jsxs(GenericMenuButtonItem, { onClick: muteScreenShareAudio, children: [jsx(Icon, { icon: "no-audio" }), t('participantView.actionsMenu.muteScreenShareAudio.label', 'Mute screen share audio')] }))] }), participantViewElement &&
94
+ typeof participantViewElement.requestFullscreen !== 'undefined' && (jsxs(GenericMenuButtonItem, { onClick: toggleFullscreenMode, children: [jsx(Icon, { icon: "fullscreen" }), fullscreenModeOn
95
+ ? t('participantView.actionsMenu.leaveFullscreen.label', 'Leave fullscreen')
96
+ : t('participantView.actionsMenu.enterFullscreen.label', 'Enter fullscreen')] })), videoElement && document.pictureInPictureEnabled && (jsxs(GenericMenuButtonItem, { onClick: togglePictureInPicture, children: [jsx(Icon, { icon: "pip" }), isPiP
97
+ ? t('participantView.actionsMenu.leavePip.label', 'Leave picture-in-picture')
98
+ : t('participantView.actionsMenu.enterPip.label', 'Enter picture-in-picture')] })), jsx(GenericMenuSeparator, {}), jsxs(Restricted, { requiredGrants: [OwnCapability.UPDATE_CALL_PERMISSIONS], children: [jsx(GenericMenuButtonItem, { onClick: grantPermission(OwnCapability.SEND_AUDIO), children: t('participantView.actionsMenu.allowAudio.label', 'Allow audio') }), jsx(GenericMenuButtonItem, { onClick: grantPermission(OwnCapability.SEND_VIDEO), children: t('participantView.actionsMenu.allowVideo.label', 'Allow video') }), jsx(GenericMenuButtonItem, { onClick: grantPermission(OwnCapability.SCREENSHARE), children: t('participantView.actionsMenu.allowScreenSharing.label', 'Allow screen sharing') }), jsx(GenericMenuButtonItem, { onClick: revokePermission(OwnCapability.SEND_AUDIO), children: t('participantView.actionsMenu.disableAudio.label', 'Disable audio') }), jsx(GenericMenuButtonItem, { onClick: revokePermission(OwnCapability.SEND_VIDEO), children: t('participantView.actionsMenu.disableVideo.label', 'Disable video') }), jsx(GenericMenuButtonItem, { onClick: revokePermission(OwnCapability.SCREENSHARE), children: t('participantView.actionsMenu.disableScreenSharing.label', 'Disable screen sharing') })] })] }));
94
99
  };
95
100
 
96
101
  export { ParticipantActionsContextMenu };
@@ -1 +1 @@
1
- {"version":3,"file":"ParticipantActionsContextMenu.js","sources":["../../../../../../../../src/core/components/ParticipantView/ParticipantActionsContextMenu.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { Restricted, useCall, useI18n } from '@stream-io/video-react-bindings';\nimport {\n hasAudio,\n hasScreenShare,\n hasScreenShareAudio,\n hasVideo,\n OwnCapability,\n UpdateUserPermissionsRequestGrantPermissionsEnum,\n UpdateUserPermissionsRequestRevokePermissionsEnum,\n} from '@stream-io/video-client';\nimport { useParticipantViewContext } from './ParticipantViewContext';\nimport {\n GenericMenu,\n GenericMenuButtonItem,\n useMenuContext,\n} from '../../../components/Menu';\nimport { Icon } from '../../../components/Icon';\nimport { usePictureInPictureState } from '../../hooks/usePictureInPictureState';\n\nexport const ParticipantActionsContextMenu = () => {\n const { participant, participantViewElement, videoElement } =\n useParticipantViewContext();\n const [fullscreenModeOn, setFullscreenModeOn] = useState(\n !!document.fullscreenElement,\n );\n const call = useCall();\n const isPiP = usePictureInPictureState(videoElement ?? undefined);\n const { t } = useI18n();\n\n const { pin, sessionId, userId } = participant;\n\n const hasAudioTrack = hasAudio(participant);\n const hasVideoTrack = hasVideo(participant);\n const hasScreenShareTrack = hasScreenShare(participant);\n const hasScreenShareAudioTrack = hasScreenShareAudio(participant);\n\n const blockUser = () => call?.blockUser(userId);\n const kickUser = () => call?.kickUser({ user_id: userId });\n const muteAudio = () => call?.muteUser(userId, 'audio');\n const muteVideo = () => call?.muteUser(userId, 'video');\n const muteScreenShare = () => call?.muteUser(userId, 'screenshare');\n const muteScreenShareAudio = () =>\n call?.muteUser(userId, 'screenshare_audio');\n\n const grantPermission =\n (permission: UpdateUserPermissionsRequestGrantPermissionsEnum) => () => {\n call?.updateUserPermissions({\n user_id: userId,\n grant_permissions: [permission],\n });\n };\n\n const revokePermission =\n (permission: UpdateUserPermissionsRequestRevokePermissionsEnum) => () => {\n call?.updateUserPermissions({\n user_id: userId,\n revoke_permissions: [permission],\n });\n };\n\n const toggleParticipantPin = () => {\n if (pin) {\n call?.unpin(sessionId);\n } else {\n call?.pin(sessionId);\n }\n };\n\n const pinForEveryone = () => {\n call\n ?.pinForEveryone({ user_id: userId, session_id: sessionId })\n .catch((err) => {\n console.error(`Failed to pin participant ${userId}`, err);\n });\n };\n\n const unpinForEveryone = () => {\n call\n ?.unpinForEveryone({ user_id: userId, session_id: sessionId })\n .catch((err) => {\n console.error(`Failed to unpin participant ${userId}`, err);\n });\n };\n\n const toggleFullscreenMode = () => {\n if (!fullscreenModeOn) {\n return participantViewElement?.requestFullscreen().catch(console.error);\n }\n return document.exitFullscreen().catch(console.error);\n };\n\n useEffect(() => {\n // handles the case when fullscreen mode is toggled externally,\n // e.g., by pressing ESC key or some other keyboard shortcut\n const handleFullscreenChange = () => {\n setFullscreenModeOn(!!document.fullscreenElement);\n };\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n\n const togglePictureInPicture = () => {\n if (videoElement && !isPiP) {\n return videoElement\n .requestPictureInPicture()\n .catch(console.error) as Promise<void>;\n }\n\n return document.exitPictureInPicture().catch(console.error);\n };\n\n const { close } = useMenuContext() || {};\n return (\n <GenericMenu onItemClick={close}>\n <GenericMenuButtonItem\n onClick={toggleParticipantPin}\n disabled={pin && !pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {pin ? t('Unpin') : t('Pin')}\n </GenericMenuButtonItem>\n <Restricted requiredGrants={[OwnCapability.PIN_FOR_EVERYONE]}>\n <GenericMenuButtonItem\n onClick={pinForEveryone}\n disabled={pin && !pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {t('Pin for everyone')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={unpinForEveryone}\n disabled={!pin || pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {t('Unpin for everyone')}\n </GenericMenuButtonItem>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.BLOCK_USERS]}>\n <GenericMenuButtonItem onClick={blockUser}>\n <Icon icon=\"not-allowed\" />\n {t('Block')}\n </GenericMenuButtonItem>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.KICK_USER]}>\n <GenericMenuButtonItem onClick={kickUser}>\n <Icon icon=\"kick-user\" />\n {t('Kick')}\n </GenericMenuButtonItem>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.MUTE_USERS]}>\n {hasVideoTrack && (\n <GenericMenuButtonItem onClick={muteVideo}>\n <Icon icon=\"camera-off-outline\" />\n {t('Turn off video')}\n </GenericMenuButtonItem>\n )}\n {hasScreenShareTrack && (\n <GenericMenuButtonItem onClick={muteScreenShare}>\n <Icon icon=\"screen-share-off\" />\n {t('Turn off screen share')}\n </GenericMenuButtonItem>\n )}\n {hasAudioTrack && (\n <GenericMenuButtonItem onClick={muteAudio}>\n <Icon icon=\"no-audio\" />\n {t('Mute audio')}\n </GenericMenuButtonItem>\n )}\n {hasScreenShareAudioTrack && (\n <GenericMenuButtonItem onClick={muteScreenShareAudio}>\n <Icon icon=\"no-audio\" />\n {t('Mute screen share audio')}\n </GenericMenuButtonItem>\n )}\n </Restricted>\n {participantViewElement &&\n typeof participantViewElement.requestFullscreen !== 'undefined' && (\n <GenericMenuButtonItem onClick={toggleFullscreenMode}>\n {t('{{ direction }} fullscreen', {\n direction: fullscreenModeOn ? t('Leave') : t('Enter'),\n })}\n </GenericMenuButtonItem>\n )}\n {videoElement && document.pictureInPictureEnabled && (\n <GenericMenuButtonItem onClick={togglePictureInPicture}>\n {t('{{ direction }} picture-in-picture', {\n direction: isPiP ? t('Leave') : t('Enter'),\n })}\n </GenericMenuButtonItem>\n )}\n <Restricted requiredGrants={[OwnCapability.UPDATE_CALL_PERMISSIONS]}>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SEND_AUDIO)}\n >\n {t('Allow audio')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SEND_VIDEO)}\n >\n {t('Allow video')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SCREENSHARE)}\n >\n {t('Allow screen sharing')}\n </GenericMenuButtonItem>\n\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SEND_AUDIO)}\n >\n {t('Disable audio')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SEND_VIDEO)}\n >\n {t('Disable video')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SCREENSHARE)}\n >\n {t('Disable screen sharing')}\n </GenericMenuButtonItem>\n </Restricted>\n </GenericMenu>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"ParticipantActionsContextMenu.js","sources":["../../../../../../../../src/core/components/ParticipantView/ParticipantActionsContextMenu.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { Restricted, useCall } from '@stream-io/video-react-bindings';\nimport { useI18n } from '../../../i18n';\nimport {\n hasAudio,\n hasScreenShare,\n hasScreenShareAudio,\n hasVideo,\n OwnCapability,\n UpdateUserPermissionsRequestGrantPermissionsEnum,\n UpdateUserPermissionsRequestRevokePermissionsEnum,\n} from '@stream-io/video-client';\nimport { useParticipantViewContext } from './ParticipantViewContext';\nimport {\n GenericMenu,\n GenericMenuButtonItem,\n GenericMenuSeparator,\n useMenuContext,\n} from '../../../components/Menu';\nimport { Icon } from '../../../components/Icon';\nimport { usePictureInPictureState } from '../../hooks/usePictureInPictureState';\n\nexport const ParticipantActionsContextMenu = () => {\n const { participant, participantViewElement, videoElement } =\n useParticipantViewContext();\n const [fullscreenModeOn, setFullscreenModeOn] = useState(\n !!document.fullscreenElement,\n );\n const call = useCall();\n const isPiP = usePictureInPictureState(videoElement ?? undefined);\n const { t } = useI18n();\n\n const { pin, sessionId, userId } = participant;\n\n const hasAudioTrack = hasAudio(participant);\n const hasVideoTrack = hasVideo(participant);\n const hasScreenShareTrack = hasScreenShare(participant);\n const hasScreenShareAudioTrack = hasScreenShareAudio(participant);\n\n const blockUser = () => call?.blockUser(userId);\n const kickUser = () => call?.kickUser({ user_id: userId });\n const muteAudio = () => call?.muteUser(userId, 'audio');\n const muteVideo = () => call?.muteUser(userId, 'video');\n const muteScreenShare = () => call?.muteUser(userId, 'screenshare');\n const muteScreenShareAudio = () =>\n call?.muteUser(userId, 'screenshare_audio');\n\n const grantPermission =\n (permission: UpdateUserPermissionsRequestGrantPermissionsEnum) => () => {\n call?.updateUserPermissions({\n user_id: userId,\n grant_permissions: [permission],\n });\n };\n\n const revokePermission =\n (permission: UpdateUserPermissionsRequestRevokePermissionsEnum) => () => {\n call?.updateUserPermissions({\n user_id: userId,\n revoke_permissions: [permission],\n });\n };\n\n const toggleParticipantPin = () => {\n if (pin) {\n call?.unpin(sessionId);\n } else {\n call?.pin(sessionId);\n }\n };\n\n const pinForEveryone = () => {\n call\n ?.pinForEveryone({ user_id: userId, session_id: sessionId })\n .catch((err) => {\n console.error(`Failed to pin participant ${userId}`, err);\n });\n };\n\n const unpinForEveryone = () => {\n call\n ?.unpinForEveryone({ user_id: userId, session_id: sessionId })\n .catch((err) => {\n console.error(`Failed to unpin participant ${userId}`, err);\n });\n };\n\n const toggleFullscreenMode = () => {\n if (!fullscreenModeOn) {\n return participantViewElement?.requestFullscreen().catch(console.error);\n }\n return document.exitFullscreen().catch(console.error);\n };\n\n useEffect(() => {\n // handles the case when fullscreen mode is toggled externally,\n // e.g., by pressing ESC key or some other keyboard shortcut\n const handleFullscreenChange = () => {\n setFullscreenModeOn(!!document.fullscreenElement);\n };\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n\n const togglePictureInPicture = () => {\n if (videoElement && !isPiP) {\n return videoElement\n .requestPictureInPicture()\n .catch(console.error) as Promise<void>;\n }\n\n return document.exitPictureInPicture().catch(console.error);\n };\n\n const { close } = useMenuContext() || {};\n return (\n <GenericMenu onItemClick={close}>\n <GenericMenuButtonItem\n onClick={toggleParticipantPin}\n disabled={pin && !pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {pin\n ? t('participantView.unpin.label', 'Unpin')\n : t('participantView.actionsMenu.pin.label', 'Pin')}\n </GenericMenuButtonItem>\n <Restricted requiredGrants={[OwnCapability.PIN_FOR_EVERYONE]}>\n <GenericMenuButtonItem\n onClick={pinForEveryone}\n disabled={pin && !pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {t(\n 'participantView.actionsMenu.pinForEveryone.label',\n 'Pin for everyone',\n )}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={unpinForEveryone}\n disabled={!pin || pin.isLocalPin}\n >\n <Icon icon=\"pin\" />\n {t(\n 'participantView.actionsMenu.unpinForEveryone.label',\n 'Unpin for everyone',\n )}\n </GenericMenuButtonItem>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.BLOCK_USERS]}>\n <GenericMenuButtonItem onClick={blockUser}>\n <Icon icon=\"not-allowed\" />\n {t('participantView.actionsMenu.block.label', 'Block')}\n </GenericMenuButtonItem>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.KICK_USER]}>\n <GenericMenuButtonItem onClick={kickUser}>\n <Icon icon=\"kick-user\" />\n {t('participantView.actionsMenu.kick.label', 'Kick')}\n </GenericMenuButtonItem>\n </Restricted>\n <GenericMenuSeparator />\n <Restricted requiredGrants={[OwnCapability.MUTE_USERS]}>\n {hasVideoTrack && (\n <GenericMenuButtonItem onClick={muteVideo}>\n <Icon icon=\"camera-off-outline\" />\n {t(\n 'participantView.actionsMenu.turnOffVideo.label',\n 'Turn off video',\n )}\n </GenericMenuButtonItem>\n )}\n {hasScreenShareTrack && (\n <GenericMenuButtonItem onClick={muteScreenShare}>\n <Icon icon=\"screen-share-off\" />\n {t(\n 'participantView.actionsMenu.turnOffScreenShare.label',\n 'Turn off screen share',\n )}\n </GenericMenuButtonItem>\n )}\n {hasAudioTrack && (\n <GenericMenuButtonItem onClick={muteAudio}>\n <Icon icon=\"no-audio\" />\n {t('participantView.actionsMenu.muteAudio.label', 'Mute audio')}\n </GenericMenuButtonItem>\n )}\n {hasScreenShareAudioTrack && (\n <GenericMenuButtonItem onClick={muteScreenShareAudio}>\n <Icon icon=\"no-audio\" />\n {t(\n 'participantView.actionsMenu.muteScreenShareAudio.label',\n 'Mute screen share audio',\n )}\n </GenericMenuButtonItem>\n )}\n </Restricted>\n {participantViewElement &&\n typeof participantViewElement.requestFullscreen !== 'undefined' && (\n <GenericMenuButtonItem onClick={toggleFullscreenMode}>\n <Icon icon=\"fullscreen\" />\n {fullscreenModeOn\n ? t(\n 'participantView.actionsMenu.leaveFullscreen.label',\n 'Leave fullscreen',\n )\n : t(\n 'participantView.actionsMenu.enterFullscreen.label',\n 'Enter fullscreen',\n )}\n </GenericMenuButtonItem>\n )}\n {videoElement && document.pictureInPictureEnabled && (\n <GenericMenuButtonItem onClick={togglePictureInPicture}>\n <Icon icon=\"pip\" />\n {isPiP\n ? t(\n 'participantView.actionsMenu.leavePip.label',\n 'Leave picture-in-picture',\n )\n : t(\n 'participantView.actionsMenu.enterPip.label',\n 'Enter picture-in-picture',\n )}\n </GenericMenuButtonItem>\n )}\n <GenericMenuSeparator />\n <Restricted requiredGrants={[OwnCapability.UPDATE_CALL_PERMISSIONS]}>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SEND_AUDIO)}\n >\n {t('participantView.actionsMenu.allowAudio.label', 'Allow audio')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SEND_VIDEO)}\n >\n {t('participantView.actionsMenu.allowVideo.label', 'Allow video')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={grantPermission(OwnCapability.SCREENSHARE)}\n >\n {t(\n 'participantView.actionsMenu.allowScreenSharing.label',\n 'Allow screen sharing',\n )}\n </GenericMenuButtonItem>\n\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SEND_AUDIO)}\n >\n {t('participantView.actionsMenu.disableAudio.label', 'Disable audio')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SEND_VIDEO)}\n >\n {t('participantView.actionsMenu.disableVideo.label', 'Disable video')}\n </GenericMenuButtonItem>\n <GenericMenuButtonItem\n onClick={revokePermission(OwnCapability.SCREENSHARE)}\n >\n {t(\n 'participantView.actionsMenu.disableScreenSharing.label',\n 'Disable screen sharing',\n )}\n </GenericMenuButtonItem>\n </Restricted>\n </GenericMenu>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -1,9 +1,30 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { StreamVideoProvider } from '@stream-io/video-react-bindings';
3
- import { translations } from '../../../translations/index.js';
3
+ import '@stream-io/i18n';
4
+ import { TranslationProvider } from '../../../i18n/TranslationContext.js';
5
+ import { useStreami18n } from '../../../i18n/useStreami18n.js';
4
6
 
5
- const StreamVideo = (props) => {
6
- return (jsx(StreamVideoProvider, { translationsOverrides: translations, ...props }));
7
+ /**
8
+ * StreamVideo is the root provider of the SDK: it provides the client to the component tree and
9
+ * mounts the SDK's translation context.
10
+ *
11
+ * The i18n runtime lives here rather than in `@stream-io/video-react-bindings` because the key
12
+ * catalog is generated from *this* package's `t()` call sites.
13
+ *
14
+ * This also fixes a real bug in the previous implementation, which rendered
15
+ * `<StreamVideoProvider translationsOverrides={translations} {...props} />`. Because `{...props}`
16
+ * came last, an integrator passing `translationsOverrides` *replaced* the SDK's bundled strings
17
+ * instead of merging with them, leaving every untranslated key rendering as a raw dotted path.
18
+ * `useStreami18n` layers integrator dictionaries over the SDK's own defaults, so a partial
19
+ * dictionary is now safe.
20
+ */
21
+ const StreamVideo = ({ children, client, i18nInstance, language, translations, }) => {
22
+ const translationContext = useStreami18n({
23
+ i18nInstance,
24
+ language,
25
+ translations,
26
+ });
27
+ return (jsx(StreamVideoProvider, { client: client, children: jsx(TranslationProvider, { value: translationContext, children: children }) }));
7
28
  };
8
29
  StreamVideo.displayName = 'StreamVideo';
9
30
 
@@ -1 +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;;;;"}
1
+ {"version":3,"file":"StreamVideo.js","sources":["../../../../../../../../src/core/components/StreamVideo/StreamVideo.tsx"],"sourcesContent":["import {\n type StreamVideoProviderProps,\n StreamVideoProvider,\n} from '@stream-io/video-react-bindings';\nimport { PropsWithChildren } from 'react';\nimport {\n TranslationProvider,\n useStreami18n,\n type UseStreami18nParams,\n} from '../../../i18n';\n\nexport type StreamVideoProps = StreamVideoProviderProps & UseStreami18nParams;\n\n/**\n * StreamVideo is the root provider of the SDK: it provides the client to the component tree and\n * mounts the SDK's translation context.\n *\n * The i18n runtime lives here rather than in `@stream-io/video-react-bindings` because the key\n * catalog is generated from *this* package's `t()` call sites.\n *\n * This also fixes a real bug in the previous implementation, which rendered\n * `<StreamVideoProvider translationsOverrides={translations} {...props} />`. Because `{...props}`\n * came last, an integrator passing `translationsOverrides` *replaced* the SDK's bundled strings\n * instead of merging with them, leaving every untranslated key rendering as a raw dotted path.\n * `useStreami18n` layers integrator dictionaries over the SDK's own defaults, so a partial\n * dictionary is now safe.\n */\nexport const StreamVideo = ({\n children,\n client,\n i18nInstance,\n language,\n translations,\n}: PropsWithChildren<StreamVideoProps>) => {\n const translationContext = useStreami18n({\n i18nInstance,\n language,\n translations,\n });\n return (\n <StreamVideoProvider client={client}>\n <TranslationProvider value={translationContext}>\n {children}\n </TranslationProvider>\n </StreamVideoProvider>\n );\n};\n\nStreamVideo.displayName = 'StreamVideo';\n"],"names":["_jsx"],"mappings":";;;;;;AAaA;;;;;;;;;;;;;AAaG;AACI,MAAM,WAAW,GAAG,CAAC,EAC1B,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,YAAY,GACwB,KAAI;IACxC,MAAM,kBAAkB,GAAG,aAAa,CAAC;QACvC,YAAY;QACZ,QAAQ;QACR,YAAY;AACb,KAAA,CAAC;AACF,IAAA,QACEA,GAAA,CAAC,mBAAmB,IAAC,MAAM,EAAE,MAAM,EAAA,QAAA,EACjCA,GAAA,CAAC,mBAAmB,EAAA,EAAC,KAAK,EAAE,kBAAkB,EAAA,QAAA,EAC3C,QAAQ,EAAA,CACW,EAAA,CACF;AAE1B;AAEA,WAAW,CAAC,WAAW,GAAG,aAAa;;;;"}
@@ -1,21 +1,11 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { forwardRef, useState } from 'react';
2
+ import { forwardRef } from 'react';
3
+ import { Avatar } from '../../../components/Avatar/Avatar.js';
3
4
 
4
5
  const BaseVideoPlaceholder = forwardRef(function DefaultVideoPlaceholder({ participant, style, children }, ref) {
5
- const [error, setError] = useState(false);
6
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 }))] }));
7
+ return (jsxs("div", { className: "str-video__video-placeholder", style: style, ref: ref, children: [(participant.image || name) && (jsx(Avatar, { size: "2xl", showOutline: true, imageSrc: participant.image, name: name })), !participant.image && !name && (jsx("div", { className: "str-video__video-placeholder__no-video-label", children: children }))] }));
9
8
  });
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
9
 
20
10
  export { BaseVideoPlaceholder };
21
11
  //# sourceMappingURL=BaseVideoPlaceholder.js.map
@@ -1 +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;;;;"}
1
+ {"version":3,"file":"BaseVideoPlaceholder.js","sources":["../../../../../../../../src/core/components/Video/BaseVideoPlaceholder.tsx"],"sourcesContent":["import { ComponentProps, RefAttributes, forwardRef } from 'react';\nimport type { StreamVideoParticipant } from '@stream-io/video-client';\nimport { Avatar } from '../../../components/Avatar';\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 name = participant.name || participant.userId;\n return (\n <div className=\"str-video__video-placeholder\" style={style} ref={ref}>\n {(participant.image || name) && (\n <Avatar\n size=\"2xl\"\n showOutline\n imageSrc={participant.image}\n name={name}\n />\n )}\n {!participant.image && !name && (\n <div className=\"str-video__video-placeholder__no-video-label\">\n {children}\n </div>\n )}\n </div>\n );\n});\n"],"names":["_jsxs","_jsx"],"mappings":";;;;AASO,MAAM,oBAAoB,GAAG,UAAU,CAG5C,SAAS,uBAAuB,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAA;IACtE,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,MAAM;AACnD,IAAA,QACEA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,8BAA8B,EAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAA,QAAA,EAAA,CACjE,CAAC,WAAW,CAAC,KAAK,IAAI,IAAI,MACzBC,GAAA,CAAC,MAAM,EAAA,EACL,IAAI,EAAC,KAAK,EACV,WAAW,EAAA,IAAA,EACX,QAAQ,EAAE,WAAW,CAAC,KAAK,EAC3B,IAAI,EAAE,IAAI,EAAA,CACV,CACH,EACA,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,IAAI,KAC1BA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,8CAA8C,EAAA,QAAA,EAC1D,QAAQ,EAAA,CACL,CACP,CAAA,EAAA,CACG;AAEV,CAAC;;;;"}
@@ -1,11 +1,13 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { forwardRef } from 'react';
3
- import { useI18n } from '@stream-io/video-react-bindings';
3
+ import '@stream-io/i18n';
4
+ import { useI18n } from '../../../i18n/TranslationContext.js';
5
+ import '@stream-io/i18n/react';
4
6
  import { BaseVideoPlaceholder } from './BaseVideoPlaceholder.js';
5
7
 
6
8
  const DefaultPictureInPicturePlaceholder = forwardRef(function DefaultPictureInPicturePlaceholderRender(props, ref) {
7
9
  const { t } = useI18n();
8
- return (jsx(BaseVideoPlaceholder, { ref: ref, ...props, children: t('Video is playing in a popup') }));
10
+ return (jsx(BaseVideoPlaceholder, { ref: ref, ...props, children: t('videoPlaceholder.videoPlayingInPopup.text', 'Video is playing in a popup') }));
9
11
  });
10
12
 
11
13
  export { DefaultPictureInPicturePlaceholder };
@@ -1 +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;;;;"}
1
+ {"version":3,"file":"DefaultPictureInPicturePlaceholder.js","sources":["../../../../../../../../src/core/components/Video/DefaultPictureInPicturePlaceholder.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { useI18n } from '../../../i18n';\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(\n 'videoPlaceholder.videoPlayingInPopup.text',\n 'Video is playing in a popup',\n )}\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,IAAC,GAAG,EAAE,GAAG,EAAA,GAAM,KAAK,EAAA,QAAA,EACtC,CAAC,CACA,2CAA2C,EAC3C,6BAA6B,CAC9B,EAAA,CACoB;AAE3B,CAAC;;;;"}
@@ -1,11 +1,13 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { forwardRef } from 'react';
3
- import { useI18n } from '@stream-io/video-react-bindings';
3
+ import '@stream-io/i18n';
4
+ import { useI18n } from '../../../i18n/TranslationContext.js';
5
+ import '@stream-io/i18n/react';
4
6
  import { BaseVideoPlaceholder } from './BaseVideoPlaceholder.js';
5
7
 
6
8
  const DefaultVideoPlaceholder = forwardRef(function DefaultVideoPlaceholderRender(props, ref) {
7
9
  const { t } = useI18n();
8
- return (jsx(BaseVideoPlaceholder, { ref: ref, ...props, children: t('Video is disabled') }));
10
+ return (jsx(BaseVideoPlaceholder, { ref: ref, ...props, children: t('common.videoDisabled.text', 'Video is disabled') }));
9
11
  });
10
12
 
11
13
  export { DefaultVideoPlaceholder };
@@ -1 +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;;;;"}
1
+ {"version":3,"file":"DefaultVideoPlaceholder.js","sources":["../../../../../../../../src/core/components/Video/DefaultVideoPlaceholder.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { useI18n } from '../../../i18n';\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('common.videoDisabled.text', '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,IAAC,GAAG,EAAE,GAAG,EAAA,GAAM,KAAK,EAAA,QAAA,EACtC,CAAC,CAAC,2BAA2B,EAAE,mBAAmB,CAAC,EAAA,CAC/B;AAE3B,CAAC;;;;"}
@@ -3,12 +3,16 @@ import { useState, useCallback } from 'react';
3
3
  import { useEffectEvent } from '@stream-io/video-react-bindings';
4
4
  import '../core/components/Audio/Audio.js';
5
5
  import '../core/components/Audio/ParticipantsAudio.js';
6
+ import '@stream-io/i18n';
7
+ import '../i18n/TranslationContext.js';
8
+ import '@stream-io/i18n/react';
6
9
  import '@stream-io/video-client';
7
10
  import '../core/components/ParticipantView/ParticipantViewContext.js';
8
11
  import '../components/Menu/MenuToggle.js';
9
12
  import 'clsx';
10
13
  import '../core/components/ParticipantView/ParticipantView.js';
11
14
  import '../core/components/ParticipantView/DefaultParticipantViewUI.js';
15
+ import '../core/components/ParticipantView/ConnectionQualityIndicator.js';
12
16
  import { StreamCall } from '../core/components/StreamCall/StreamCall.js';
13
17
  import { StreamVideo } from '../core/components/StreamVideo/StreamVideo.js';
14
18
  import '../core/components/Video/BaseVideo.js';
@@ -20,21 +24,20 @@ import '../core/components/CallLayout/PipLayout/Pip.js';
20
24
  import '../core/components/CallLayout/PipLayout/Host.js';
21
25
  import '../core/components/CallLayout/PipLayout/Grid.js';
22
26
  import { BackgroundFiltersProvider } from '../components/BackgroundFilters/BackgroundFiltersProvider.js';
23
- import '../components/Button/CompositeButton.js';
27
+ import '../components/Badge/Badge.js';
28
+ import '../components/Button/Button.js';
24
29
  import '../components/Button/IconButton.js';
30
+ import '../components/Button/CompositeButton.js';
25
31
  import '@floating-ui/react';
26
32
  import '../components/CallControls/RecordCallButton.js';
27
33
  import '../components/CallControls/ReactionsButton.js';
28
34
  import '../components/DeviceSettings/DeviceSettings.js';
29
35
  import '../components/DropdownSelect/DropdownSelect.js';
30
36
  import '../components/CallControls/CancelCallButton.js';
31
- import '../components/CallControls/CallStatsButton.js';
32
37
  import '../components/CallParticipantsList/CallParticipantsList.js';
33
38
  import '../components/CallParticipantsList/CallParticipantListingItem.js';
34
39
  import { LoadingIndicator } from '../components/LoadingIndicator/LoadingIndicator.js';
35
- import '../components/CallStats/CallStats.js';
36
40
  import { NoiseCancellationProvider } from '../components/NoiseCancellation/NoiseCancellationProvider.js';
37
- import '../components/RingingCall/RingingCall.js';
38
41
  import '../components/Permissions/PermissionRequests.js';
39
42
  import { StreamTheme } from '../components/StreamTheme/StreamTheme.js';
40
43
  import '../core/components/Video/DefaultVideoPlaceholder.js';
@@ -1 +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;;;;"}
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;;;;"}
@@ -1,11 +1,16 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { OwnCapability } from '@stream-io/video-client';
3
- import { useI18n, useCallStateHooks, Restricted } from '@stream-io/video-react-bindings';
3
+ import { useCallStateHooks, Restricted } from '@stream-io/video-react-bindings';
4
+ import '@stream-io/i18n';
5
+ import { useI18n } from '../../i18n/TranslationContext.js';
4
6
  import 'react';
7
+ import '@stream-io/i18n/react';
5
8
  import 'clsx';
6
9
  import '../../components/BackgroundFilters/BackgroundFiltersProvider.js';
7
- import { CompositeButton } from '../../components/Button/CompositeButton.js';
10
+ import '../../components/Badge/Badge.js';
11
+ import '../../components/Button/Button.js';
8
12
  import '../../components/Button/IconButton.js';
13
+ import { CompositeButton } from '../../components/Button/CompositeButton.js';
9
14
  import '@floating-ui/react';
10
15
  import { MicCaptureErrorNotification } from '../../components/Notification/MicCaptureErrorNotification.js';
11
16
  import { RecordCallConfirmationButton } from '../../components/CallControls/RecordCallButton.js';
@@ -14,7 +19,6 @@ import { ScreenShareButton } from '../../components/CallControls/ScreenShareButt
14
19
  import { ToggleAudioPublishingButton } from '../../components/CallControls/ToggleAudioButton.js';
15
20
  import { ToggleVideoPublishingButton } from '../../components/CallControls/ToggleVideoButton.js';
16
21
  import { CancelCallConfirmButton } from '../../components/CallControls/CancelCallButton.js';
17
- import '../../components/CallControls/CallStatsButton.js';
18
22
  import { Icon } from '../../components/Icon/Icon.js';
19
23
  import '../../components/DeviceSettings/DeviceSettings.js';
20
24
  import '../../components/DropdownSelect/DropdownSelect.js';
@@ -23,9 +27,7 @@ import { DeviceSelectorAudioInput, DeviceSelectorAudioOutput } from '../../compo
23
27
  import { WithTooltip } from '../../components/Tooltip/WithTooltip.js';
24
28
  import '../../components/CallParticipantsList/CallParticipantsList.js';
25
29
  import '../../components/CallParticipantsList/CallParticipantListingItem.js';
26
- import '../../components/CallStats/CallStats.js';
27
30
  import '../../components/NoiseCancellation/NoiseCancellationProvider.js';
28
- import '../../components/RingingCall/RingingCall.js';
29
31
  import '../../components/Permissions/PermissionRequests.js';
30
32
  import '../../core/components/Video/Video.js';
31
33
  import '../../core/components/Video/BaseVideo.js';
@@ -35,6 +37,7 @@ import '../../core/components/Audio/ParticipantsAudio.js';
35
37
  import '../../core/components/ParticipantView/ParticipantViewContext.js';
36
38
  import '../../core/components/ParticipantView/ParticipantView.js';
37
39
  import '../../core/components/ParticipantView/DefaultParticipantViewUI.js';
40
+ import '../../core/components/ParticipantView/ConnectionQualityIndicator.js';
38
41
  import '../../core/components/StreamCall/StreamCall.js';
39
42
  import '../../core/components/StreamVideo/StreamVideo.js';
40
43
  import '../../core/components/CallLayout/LivestreamLayout.js';
@@ -45,6 +48,7 @@ import '../../core/components/CallLayout/PipLayout/Host.js';
45
48
  import '../../core/components/CallLayout/PipLayout/Grid.js';
46
49
  import '../context/ConfigurationContext.js';
47
50
  import { CameraMenuWithBlur } from '../shared/BlurToggleButton/BlurToggleButton.js';
51
+ import { CallDuration } from '../shared/CallDuration/CallDuration.js';
48
52
  import '../shared/Lobby/ToggleMicButton.js';
49
53
  import '../shared/Lobby/ToggleCameraButton.js';
50
54
  import { useCallDuration } from '../hooks/useCallDuration.js';
@@ -58,7 +62,7 @@ const CallControls = ({ showParticipants, onToggleParticipants, }) => {
58
62
  const session = useCallSession();
59
63
  const startedAt = session?.started_at;
60
64
  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" }) }) }) })] }));
65
+ 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 && (jsx("div", { className: "str-video__embedded-desktop", children: jsx(CallDuration, { elapsed: 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('common.microphone.label', 'Microphone') }), jsx(DeviceSelectorAudioOutput, { visualType: "list", title: t('common.speaker.label', '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('common.participants.label', 'Participants'), children: jsx(CompositeButton, { active: showParticipants, "aria-label": t('common.participants.label', 'Participants'), "aria-pressed": showParticipants, onClick: onToggleParticipants, children: jsx(Icon, { icon: "participants" }) }) }) })] }));
62
66
  };
63
67
 
64
68
  export { CallControls };
@@ -1 +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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"}
1
+ {"version":3,"file":"CallControls.js","sources":["../../../../../../../src/embedded/call/CallControls.tsx"],"sourcesContent":["import { OwnCapability } from '@stream-io/video-client';\nimport { Restricted, useCallStateHooks } from '@stream-io/video-react-bindings';\nimport { useI18n } from '../../i18n';\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 { CallDuration, 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-desktop\">\n <CallDuration elapsed={elapsed} />\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('common.microphone.label', 'Microphone')}\n />\n <DeviceSelectorAudioOutput\n visualType=\"list\"\n title={t('common.speaker.label', '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('common.participants.label', 'Participants')}>\n <CompositeButton\n active={showParticipants}\n aria-label={t('common.participants.label', '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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"}
@@ -4,11 +4,15 @@ import 'react';
4
4
  import '@stream-io/video-client';
5
5
  import '../../core/components/Audio/Audio.js';
6
6
  import '../../core/components/Audio/ParticipantsAudio.js';
7
+ import '@stream-io/i18n';
8
+ import '../../i18n/TranslationContext.js';
9
+ import '@stream-io/i18n/react';
7
10
  import '../../core/components/ParticipantView/ParticipantViewContext.js';
8
11
  import '../../components/Menu/MenuToggle.js';
9
- import { Icon } from '../../components/Icon/Icon.js';
12
+ import 'clsx';
10
13
  import '../../core/components/ParticipantView/ParticipantView.js';
11
14
  import '../../core/components/ParticipantView/DefaultParticipantViewUI.js';
15
+ import '../../core/components/ParticipantView/ConnectionQualityIndicator.js';
12
16
  import '../../core/components/StreamCall/StreamCall.js';
13
17
  import '../../core/components/StreamVideo/StreamVideo.js';
14
18
  import '../../core/components/Video/BaseVideo.js';
@@ -20,24 +24,23 @@ import '../../core/components/CallLayout/PipLayout/Pip.js';
20
24
  import '../../core/components/CallLayout/PipLayout/Host.js';
21
25
  import '../../core/components/CallLayout/PipLayout/Grid.js';
22
26
  import '../context/ConfigurationContext.js';
23
- import 'clsx';
24
27
  import '../../components/BackgroundFilters/BackgroundFiltersProvider.js';
25
- import '../../components/Button/CompositeButton.js';
28
+ import '../../components/Badge/Badge.js';
29
+ import '../../components/Button/Button.js';
26
30
  import '../../components/Button/IconButton.js';
31
+ import '../../components/Button/CompositeButton.js';
27
32
  import '@floating-ui/react';
28
33
  import '../../components/CallControls/RecordCallButton.js';
29
34
  import '../../components/CallControls/ReactionsButton.js';
30
35
  import '../../components/DeviceSettings/DeviceSettings.js';
31
36
  import '../../components/DropdownSelect/DropdownSelect.js';
32
37
  import { CancelCallConfirmButton } from '../../components/CallControls/CancelCallButton.js';
33
- import '../../components/CallControls/CallStatsButton.js';
34
38
  import '../../components/CallParticipantsList/CallParticipantsList.js';
35
39
  import '../../components/CallParticipantsList/CallParticipantListingItem.js';
36
- import '../../components/CallStats/CallStats.js';
37
40
  import '../../components/NoiseCancellation/NoiseCancellationProvider.js';
38
- import '../../components/RingingCall/RingingCall.js';
39
41
  import '../../components/Permissions/PermissionRequests.js';
40
42
  import '../../core/components/Video/DefaultVideoPlaceholder.js';
43
+ import { CallDuration } from '../shared/CallDuration/CallDuration.js';
41
44
  import '../shared/Lobby/ToggleMicButton.js';
42
45
  import '../shared/Lobby/ToggleCameraButton.js';
43
46
  import { useCallDuration } from '../hooks/useCallDuration.js';
@@ -50,7 +53,7 @@ const CallHeader = () => {
50
53
  const session = useCallSession();
51
54
  const startedAt = session?.started_at;
52
55
  const { elapsed } = useCallDuration(startedAt);
53
- return (jsxs("div", { className: "str-video__embedded-call-header", children: [startedAt && (jsxs("div", { className: "str-video__embedded-call-duration", children: [jsx(Icon, { icon: "verified", className: "str-video__embedded-call-duration__icon" }), jsx("span", { className: "str-video__embedded-call-duration__time", children: elapsed })] })), jsx(CancelCallConfirmButton, {})] }));
56
+ return (jsxs("div", { className: "str-video__embedded-call-header", children: [startedAt && jsx(CallDuration, { elapsed: elapsed }), jsx(CancelCallConfirmButton, {})] }));
54
57
  };
55
58
 
56
59
  export { CallHeader };
@@ -1 +1 @@
1
- {"version":3,"file":"CallHeader.js","sources":["../../../../../../../src/embedded/call/CallHeader.tsx"],"sourcesContent":["import { useCallStateHooks } from '@stream-io/video-react-bindings';\nimport { useCallDuration } from '../hooks';\nimport { CancelCallConfirmButton, Icon } from '../../components';\n\n/**\n * Renders the call header bar with elapsed time and leave/end call button.\n */\nexport const CallHeader = () => {\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-header\">\n {startedAt && (\n <div className=\"str-video__embedded-call-duration\">\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 <CancelCallConfirmButton />\n </div>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA;;AAEG;AACI,MAAM,UAAU,GAAG,MAAK;AAC7B,IAAA,MAAM,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE;AAC9C,IAAA,MAAM,OAAO,GAAG,cAAc,EAAE;AAChC,IAAA,MAAM,SAAS,GAAG,OAAO,EAAE,UAAU;IACrC,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC;AAE9C,IAAA,QACEA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAAA,CAC7C,SAAS,KACRA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CAChDC,IAAC,IAAI,EAAA,EACH,IAAI,EAAC,UAAU,EACf,SAAS,EAAC,yCAAyC,EAAA,CACnD,EACFA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,yCAAyC,EAAA,QAAA,EACtD,OAAO,EAAA,CACH,CAAA,EAAA,CACH,CACP,EACDA,GAAA,CAAC,uBAAuB,EAAA,EAAA,CAAG,CAAA,EAAA,CACvB;AAEV;;;;"}
1
+ {"version":3,"file":"CallHeader.js","sources":["../../../../../../../src/embedded/call/CallHeader.tsx"],"sourcesContent":["import { useCallStateHooks } from '@stream-io/video-react-bindings';\nimport { useCallDuration } from '../hooks';\nimport { CancelCallConfirmButton } from '../../components';\nimport { CallDuration } from '../shared';\n\n/**\n * Renders the call header bar with elapsed time and leave/end call button.\n */\nexport const CallHeader = () => {\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-header\">\n {startedAt && <CallDuration elapsed={elapsed} />}\n <CancelCallConfirmButton />\n </div>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA;;AAEG;AACI,MAAM,UAAU,GAAG,MAAK;AAC7B,IAAA,MAAM,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE;AAC9C,IAAA,MAAM,OAAO,GAAG,cAAc,EAAE;AAChC,IAAA,MAAM,SAAS,GAAG,OAAO,EAAE,UAAU;IACrC,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC;IAE9C,QACEA,cAAK,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAAA,CAC7C,SAAS,IAAIC,GAAA,CAAC,YAAY,IAAC,OAAO,EAAE,OAAO,EAAA,CAAI,EAChDA,IAAC,uBAAuB,EAAA,EAAA,CAAG,CAAA,EAAA,CACvB;AAEV;;;;"}
@@ -4,9 +4,14 @@ import clsx from 'clsx';
4
4
  import { OwnCapability } from '@stream-io/video-client';
5
5
  import { Restricted } from '@stream-io/video-react-bindings';
6
6
  import '../../components/BackgroundFilters/BackgroundFiltersProvider.js';
7
- import '../../components/Button/CompositeButton.js';
7
+ import '../../components/Badge/Badge.js';
8
+ import '../../components/Button/Button.js';
8
9
  import '../../components/Button/IconButton.js';
10
+ import '../../components/Button/CompositeButton.js';
9
11
  import '@floating-ui/react';
12
+ import '@stream-io/i18n';
13
+ import '../../i18n/TranslationContext.js';
14
+ import '@stream-io/i18n/react';
10
15
  import { SpeakingWhileMutedNotification } from '../../components/Notification/SpeakingWhileMutedNotification.js';
11
16
  import '../../components/CallControls/RecordCallButton.js';
12
17
  import '../../components/CallControls/ReactionsButton.js';
@@ -14,12 +19,9 @@ import '../../components/DeviceSettings/DeviceSettings.js';
14
19
  import '../../components/DropdownSelect/DropdownSelect.js';
15
20
  import '../../components/Menu/MenuToggle.js';
16
21
  import '../../components/CallControls/CancelCallButton.js';
17
- import '../../components/CallControls/CallStatsButton.js';
18
22
  import { CallParticipantsList } from '../../components/CallParticipantsList/CallParticipantsList.js';
19
23
  import '../../components/CallParticipantsList/CallParticipantListingItem.js';
20
- import '../../components/CallStats/CallStats.js';
21
24
  import '../../components/NoiseCancellation/NoiseCancellationProvider.js';
22
- import '../../components/RingingCall/RingingCall.js';
23
25
  import { PermissionRequests } from '../../components/Permissions/PermissionRequests.js';
24
26
  import '../../core/components/Video/Video.js';
25
27
  import '../../core/components/Video/BaseVideo.js';
@@ -33,6 +35,7 @@ import '../../core/components/Audio/ParticipantsAudio.js';
33
35
  import '../../core/components/ParticipantView/ParticipantViewContext.js';
34
36
  import '../../core/components/ParticipantView/ParticipantView.js';
35
37
  import '../../core/components/ParticipantView/DefaultParticipantViewUI.js';
38
+ import '../../core/components/ParticipantView/ConnectionQualityIndicator.js';
36
39
  import '../../core/components/StreamCall/StreamCall.js';
37
40
  import '../../core/components/StreamVideo/StreamVideo.js';
38
41
  import '../../core/components/CallLayout/LivestreamLayout.js';
@@ -56,7 +59,7 @@ const CallLayout = () => {
56
59
  const handleToggleParticipants = useCallback(() => {
57
60
  setShowParticipants((prev) => !prev);
58
61
  }, []);
59
- return (jsxs("div", { className: "str-video__embedded-call", children: [jsx(ConnectionNotification, {}), jsx(PermissionRequests, {}), jsx("div", { className: "str-video__embedded-notifications", children: jsx(Restricted, { requiredGrants: [OwnCapability.SEND_AUDIO], hasPermissionsOnly: true, children: jsx(SpeakingWhileMutedNotification, {}) }) }), jsx(CallHeader, {}), jsxs("div", { className: "str-video__embedded-layout", children: [jsx("div", { className: "str-video__embedded-layout__stage", children: jsx(LayoutComponent, { ...layoutProps }) }), jsx("div", { className: clsx('str-video__embedded-sidebar', showParticipants && 'str-video__embedded-sidebar--open'), children: showParticipants && (jsx("div", { className: "str-video__embedded-participants", children: jsx(CallParticipantsList, { onClose: handleToggleParticipants }) })) })] }), jsx(CallControls, { showParticipants: showParticipants, onToggleParticipants: handleToggleParticipants })] }));
62
+ return (jsxs("div", { className: "str-video__embedded-call", children: [jsx(ConnectionNotification, {}), jsx(PermissionRequests, {}), jsx("div", { className: "str-video__embedded-notifications", children: jsx(Restricted, { requiredGrants: [OwnCapability.SEND_AUDIO], hasPermissionsOnly: true, children: jsx(SpeakingWhileMutedNotification, { placement: "top" }) }) }), jsx(CallHeader, {}), jsxs("div", { className: "str-video__embedded-layout", children: [jsx("div", { className: "str-video__embedded-layout__stage", children: jsx(LayoutComponent, { ...layoutProps }) }), jsx("div", { className: clsx('str-video__embedded-sidebar', showParticipants && 'str-video__embedded-sidebar--open'), children: showParticipants && (jsx("div", { className: "str-video__embedded-participants", children: jsx(CallParticipantsList, { onClose: handleToggleParticipants }) })) })] }), jsx(CallControls, { showParticipants: showParticipants, onToggleParticipants: handleToggleParticipants })] }));
60
63
  };
61
64
 
62
65
  export { CallLayout };