@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
package/dist/esm/index.js CHANGED
@@ -7,6 +7,7 @@ export { ParticipantActionsContextMenu } from './src/core/components/Participant
7
7
  export { ParticipantView } from './src/core/components/ParticipantView/ParticipantView.js';
8
8
  export { ParticipantViewContext, useParticipantViewContext } from './src/core/components/ParticipantView/ParticipantViewContext.js';
9
9
  export { DefaultAudioBlockedNotification, DefaultParticipantViewUI, DefaultScreenShareOverlay, ParticipantDetails, SpeechIndicator } from './src/core/components/ParticipantView/DefaultParticipantViewUI.js';
10
+ export { ConnectionQualityIndicator } from './src/core/components/ParticipantView/ConnectionQualityIndicator.js';
10
11
  export { StreamCall } from './src/core/components/StreamCall/StreamCall.js';
11
12
  export { StreamVideo } from './src/core/components/StreamVideo/StreamVideo.js';
12
13
  export { BaseVideo } from './src/core/components/Video/BaseVideo.js';
@@ -19,12 +20,12 @@ export { useFilteredParticipants } from './src/core/components/CallLayout/hooks.
19
20
  export { useTrackElementVisibility } from './src/core/hooks/useTrackElementVisibility.js';
20
21
  export { Avatar, AvatarFallback } from './src/components/Avatar/Avatar.js';
21
22
  export { BackgroundFiltersProvider, useBackgroundFilters } from './src/components/BackgroundFilters/BackgroundFiltersProvider.js';
22
- export { CompositeButton } from './src/components/Button/CompositeButton.js';
23
+ export { Badge } from './src/components/Badge/Badge.js';
24
+ export { Button } from './src/components/Button/Button.js';
23
25
  export { IconButton } from './src/components/Button/IconButton.js';
24
- export { TextButton } from './src/components/Button/TextButton.js';
26
+ export { CompositeButton } from './src/components/Button/CompositeButton.js';
25
27
  export { AcceptCallButton } from './src/components/CallControls/AcceptCallButton.js';
26
28
  export { CallControls } from './src/components/CallControls/CallControls.js';
27
- export { CallStatsButton } from './src/components/CallControls/CallStatsButton.js';
28
29
  export { CancelCallButton, CancelCallConfirmButton } from './src/components/CallControls/CancelCallButton.js';
29
30
  export { DefaultReactionsMenu, ReactionsButton, defaultReactions } from './src/components/CallControls/ReactionsButton.js';
30
31
  export { RecordCallButton, RecordCallConfirmationButton } from './src/components/CallControls/RecordCallButton.js';
@@ -41,7 +42,6 @@ export { CallRecordingListHeader } from './src/components/CallRecordingList/Call
41
42
  export { CallRecordingListItem } from './src/components/CallRecordingList/CallRecordingListItem.js';
42
43
  export { EmptyCallRecordingListing } from './src/components/CallRecordingList/EmptyCallRecordingListing.js';
43
44
  export { LoadingCallRecordingListing } from './src/components/CallRecordingList/LoadingCallRecordingListing.js';
44
- export { CallStats, StatCard } from './src/components/CallStats/CallStats.js';
45
45
  export { AudioVolumeIndicator } from './src/components/DeviceSettings/AudioVolumeIndicator.js';
46
46
  export { DeviceSettings } from './src/components/DeviceSettings/DeviceSettings.js';
47
47
  export { DeviceSelector } from './src/components/DeviceSettings/DeviceSelector.js';
@@ -52,7 +52,7 @@ export { DropDownSelect, DropDownSelectOption } from './src/components/DropdownS
52
52
  export { Icon } from './src/components/Icon/Icon.js';
53
53
  export { LoadingIndicator } from './src/components/LoadingIndicator/LoadingIndicator.js';
54
54
  export { MenuToggle, MenuVisualType, useMenuContext } from './src/components/Menu/MenuToggle.js';
55
- export { GenericMenu, GenericMenuButtonItem } from './src/components/Menu/GenericMenu.js';
55
+ export { GenericMenu, GenericMenuButtonItem, GenericMenuSeparator } from './src/components/Menu/GenericMenu.js';
56
56
  export { NoiseCancellationProvider, useNoiseCancellation } from './src/components/NoiseCancellation/NoiseCancellationProvider.js';
57
57
  export { Notification } from './src/components/Notification/Notification.js';
58
58
  export { PermissionNotification } from './src/components/Notification/PermissionNotification.js';
@@ -71,7 +71,10 @@ export { WithTooltip } from './src/components/Tooltip/WithTooltip.js';
71
71
  export { DefaultVideoPlaceholder } from './src/core/components/Video/DefaultVideoPlaceholder.js';
72
72
  export { VideoPreview } from './src/components/VideoPreview/VideoPreview.js';
73
73
  export { LivestreamPlayer } from './src/wrappers/LivestreamPlayer/LivestreamPlayer.js';
74
- export { translations } from './src/translations/index.js';
74
+ export { Streami18n } from './src/i18n/Streami18n.js';
75
+ export { TranslationContext, TranslationProvider, useI18n } from './src/i18n/TranslationContext.js';
76
+ export { useStreami18n } from './src/i18n/useStreami18n.js';
77
+ export { asDynamicKey, defaultDateTimeParser, getDateString, predefinedFormatters } from '@stream-io/i18n';
75
78
  import 'react';
76
79
  import '@floating-ui/react';
77
80
  export { usePersistedDevicePreferences } from './src/hooks/usePersistedDevicePreferences.js';
@@ -82,7 +85,7 @@ export { useModeration } from './src/hooks/useModeration.js';
82
85
  export { useLoopbackRecording } from './src/hooks/useLoopbackRecording.js';
83
86
  export { applyFilter } from './src/utilities/filter.js';
84
87
 
85
- const [major, minor, patch] = ("1.43.2").split('.');
88
+ const [major, minor, patch] = ("2.0.0-beta.1").split('.');
86
89
  setSdkInfo({
87
90
  type: SfuModels.SdkType.REACT,
88
91
  major,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../index.ts"],"sourcesContent":["import { setSdkInfo, SfuModels } from '@stream-io/video-client';\n\nexport * from '@stream-io/video-client';\nexport * from '@stream-io/video-react-bindings';\n\nexport * from './src/core';\n\nexport * from './src/components';\nexport * from './src/wrappers';\nexport * from './src/translations';\nexport {\n useHorizontalScrollPosition,\n useVerticalScrollPosition,\n useRequestPermission,\n usePersistedDevicePreferences,\n useDeviceList,\n useModeration,\n useLoopbackRecording,\n type LoopbackRecordingState,\n type StartLoopbackRecordingOptions,\n type UseLoopbackRecordingResult,\n} from './src/hooks';\nexport { applyFilter, type Filter } from './src/utilities/filter';\n\nconst [major, minor, patch] = (\n process.env.PKG_VERSION || '0.0.0-development'\n).split('.');\n\nsetSdkInfo({\n type: SfuModels.SdkType.REACT,\n major,\n minor,\n patch,\n});\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAC5B,QAA8C,EAC9C,KAAK,CAAC,GAAG,CAAC;AAEZ,UAAU,CAAC;AACT,IAAA,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK;IAC7B,KAAK;IACL,KAAK;IACL,KAAK;AACN,CAAA,CAAC"}
1
+ {"version":3,"file":"index.js","sources":["../../../../index.ts"],"sourcesContent":["import { setSdkInfo, SfuModels } from '@stream-io/video-client';\n\nexport * from '@stream-io/video-client';\nexport * from '@stream-io/video-react-bindings';\n\nexport * from './src/core';\n\nexport * from './src/components';\nexport * from './src/wrappers';\nexport * from './src/i18n';\nexport {\n useHorizontalScrollPosition,\n useVerticalScrollPosition,\n useRequestPermission,\n usePersistedDevicePreferences,\n useDeviceList,\n useModeration,\n useLoopbackRecording,\n type LoopbackRecordingState,\n type StartLoopbackRecordingOptions,\n type UseLoopbackRecordingResult,\n} from './src/hooks';\nexport { applyFilter, type Filter } from './src/utilities/filter';\n\nconst [major, minor, patch] = (\n process.env.PKG_VERSION || '0.0.0-development'\n).split('.');\n\nsetSdkInfo({\n type: SfuModels.SdkType.REACT,\n major,\n minor,\n patch,\n});\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAC5B,cAA8C,EAC9C,KAAK,CAAC,GAAG,CAAC;AAEZ,UAAU,CAAC;AACT,IAAA,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK;IAC7B,KAAK;IACL,KAAK;IACL,KAAK;AACN,CAAA,CAAC"}
@@ -1,13 +1,21 @@
1
- import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useState } from 'react';
3
3
  import clsx from 'clsx';
4
4
 
5
- const Avatar = ({ imageSrc, name, style, className, ...rest }) => {
5
+ const variantClasses = ({ size = 'md', showOutline }) => [
6
+ `str-video__avatar--size-${size}`,
7
+ showOutline && 'str-video__avatar--outlined',
8
+ ];
9
+ const Avatar = ({ imageSrc, name, style, className, size = 'md', showOutline, ...rest }) => {
6
10
  const [error, setError] = useState(false);
7
- return (jsxs(Fragment, { children: [(!imageSrc || error) && name && (jsx(AvatarFallback, { className: className, style: style, names: [name] })), imageSrc && !error && (jsx("img", { onError: () => setError(true), alt: "avatar", className: clsx('str-video__avatar', className), src: imageSrc, style: style, ...rest }))] }));
11
+ if (!imageSrc || error) {
12
+ return name ? (jsx(AvatarFallback, { className: className, style: style, names: name.split(/\s+/).filter(Boolean), size: size, showOutline: showOutline })) : null;
13
+ }
14
+ return (jsx("img", { onError: () => setError(true), alt: "avatar", className: clsx('str-video__avatar', variantClasses({ size, showOutline }), className), src: imageSrc, style: style, ...rest }));
8
15
  };
9
- const AvatarFallback = ({ className, names, style, }) => {
10
- return (jsx("div", { className: clsx('str-video__avatar--initials-fallback', className), style: style, children: jsxs("div", { children: [names[0][0], names[1]?.[0]] }) }));
16
+ const AvatarFallback = ({ className, names, style, size = 'md', showOutline, }) => {
17
+ const isCompact = size === 'xs' || size === 'sm';
18
+ return (jsx("div", { className: clsx('str-video__avatar--initials-fallback', variantClasses({ size, showOutline }), className), style: style, children: jsxs("div", { children: [names[0]?.[0], !isCompact && names[1]?.[0]] }) }));
11
19
  };
12
20
 
13
21
  export { Avatar, AvatarFallback };
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar.js","sources":["../../../../../../../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import { ComponentProps, CSSProperties, useState } from 'react';\nimport clsx from 'clsx';\n\nexport type AvatarData = {\n imageSrc?: string;\n name?: string;\n style?: CSSProperties & Record<string, string | number>;\n};\n\nexport type AvatarProps = AvatarData & ComponentProps<'img'>;\n\nexport const Avatar = ({\n imageSrc,\n name,\n style,\n className,\n ...rest\n}: AvatarProps) => {\n const [error, setError] = useState(false);\n\n return (\n <>\n {(!imageSrc || error) && name && (\n <AvatarFallback className={className} style={style} names={[name]} />\n )}\n {imageSrc && !error && (\n <img\n onError={() => setError(true)}\n alt=\"avatar\"\n className={clsx('str-video__avatar', className)}\n src={imageSrc}\n style={style}\n {...rest}\n />\n )}\n </>\n );\n};\n\ntype AvatarFallbackProps = {\n names: string[];\n className?: string;\n style?: CSSProperties & Record<string, string | number>;\n};\nexport const AvatarFallback = ({\n className,\n names,\n style,\n}: AvatarFallbackProps) => {\n return (\n <div\n className={clsx('str-video__avatar--initials-fallback', className)}\n style={style}\n >\n <div>\n {names[0][0]}\n {names[1]?.[0]}\n </div>\n </div>\n );\n};\n"],"names":["_jsxs","_Fragment","_jsx"],"mappings":";;;;AAWO,MAAM,MAAM,GAAG,CAAC,EACrB,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,SAAS,EACT,GAAG,IAAI,EACK,KAAI;IAChB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;AAEzC,IAAA,QACEA,IAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CACG,CAAC,CAAC,QAAQ,IAAI,KAAK,KAAK,IAAI,KAC3BC,GAAA,CAAC,cAAc,IAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAA,CAAI,CACtE,EACA,QAAQ,IAAI,CAAC,KAAK,KACjBA,GAAA,CAAA,KAAA,EAAA,EACE,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,EAC7B,GAAG,EAAC,QAAQ,EACZ,SAAS,EAAE,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC,EAC/C,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,KAAK,KACR,IAAI,EAAA,CACR,CACH,CAAA,EAAA,CACA;AAEP;AAOO,MAAM,cAAc,GAAG,CAAC,EAC7B,SAAS,EACT,KAAK,EACL,KAAK,GACe,KAAI;AACxB,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,IAAI,CAAC,sCAAsC,EAAE,SAAS,CAAC,EAClE,KAAK,EAAE,KAAK,YAEZF,IAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CACG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACX,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,EAAA,CACV,EAAA,CACF;AAEV;;;;"}
1
+ {"version":3,"file":"Avatar.js","sources":["../../../../../../../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import { ComponentProps, CSSProperties, useState } from 'react';\nimport clsx from 'clsx';\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';\n\nexport type AvatarData = {\n imageSrc?: string;\n name?: string;\n style?: CSSProperties & Record<string, string | number>;\n};\n\nexport type AvatarVariantProps = {\n size?: AvatarSize;\n showOutline?: boolean;\n};\n\nexport type AvatarProps = AvatarData &\n ComponentProps<'img'> &\n AvatarVariantProps;\n\nconst variantClasses = ({ size = 'md', showOutline }: AvatarVariantProps) => [\n `str-video__avatar--size-${size}`,\n showOutline && 'str-video__avatar--outlined',\n];\n\nexport const Avatar = ({\n imageSrc,\n name,\n style,\n className,\n size = 'md',\n showOutline,\n ...rest\n}: AvatarProps) => {\n const [error, setError] = useState(false);\n\n if (!imageSrc || error) {\n return name ? (\n <AvatarFallback\n className={className}\n style={style}\n names={name.split(/\\s+/).filter(Boolean)}\n size={size}\n showOutline={showOutline}\n />\n ) : null;\n }\n\n return (\n <img\n onError={() => setError(true)}\n alt=\"avatar\"\n className={clsx(\n 'str-video__avatar',\n variantClasses({ size, showOutline }),\n className,\n )}\n src={imageSrc}\n style={style}\n {...rest}\n />\n );\n};\n\ntype AvatarFallbackProps = {\n names: string[];\n className?: string;\n style?: CSSProperties & Record<string, string | number>;\n} & AvatarVariantProps;\n\nexport const AvatarFallback = ({\n className,\n names,\n style,\n size = 'md',\n showOutline,\n}: AvatarFallbackProps) => {\n const isCompact = size === 'xs' || size === 'sm';\n\n return (\n <div\n className={clsx(\n 'str-video__avatar--initials-fallback',\n variantClasses({ size, showOutline }),\n className,\n )}\n style={style}\n >\n <div>\n {names[0]?.[0]}\n {!isCompact && names[1]?.[0]}\n </div>\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":";;;;AAoBA,MAAM,cAAc,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,WAAW,EAAsB,KAAK;AAC3E,IAAA,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAE;AACjC,IAAA,WAAW,IAAI,6BAA6B;CAC7C;AAEM,MAAM,MAAM,GAAG,CAAC,EACrB,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,SAAS,EACT,IAAI,GAAG,IAAI,EACX,WAAW,EACX,GAAG,IAAI,EACK,KAAI;IAChB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;AAEzC,IAAA,IAAI,CAAC,QAAQ,IAAI,KAAK,EAAE;AACtB,QAAA,OAAO,IAAI,IACTA,GAAA,CAAC,cAAc,EAAA,EACb,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EACxC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,EAAA,CACxB,IACA,IAAI;IACV;IAEA,QACEA,aACE,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,EAC7B,GAAG,EAAC,QAAQ,EACZ,SAAS,EAAE,IAAI,CACb,mBAAmB,EACnB,cAAc,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EACrC,SAAS,CACV,EACD,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,KAAK,EAAA,GACR,IAAI,EAAA,CACR;AAEN;AAQO,MAAM,cAAc,GAAG,CAAC,EAC7B,SAAS,EACT,KAAK,EACL,KAAK,EACL,IAAI,GAAG,IAAI,EACX,WAAW,GACS,KAAI;IACxB,MAAM,SAAS,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI;IAEhD,QACEA,aACE,SAAS,EAAE,IAAI,CACb,sCAAsC,EACtC,cAAc,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EACrC,SAAS,CACV,EACD,KAAK,EAAE,KAAK,EAAA,QAAA,EAEZC,yBACG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EACb,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,EAAA,CACxB,EAAA,CACF;AAEV;;;;"}
@@ -0,0 +1,21 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { forwardRef } from 'react';
3
+ import clsx from 'clsx';
4
+ import { Icon } from '../Icon/Icon.js';
5
+
6
+ /**
7
+ * A compact badge for counts, notifications and error markers.
8
+ *
9
+ * Without `icon` it is a pill that grows with its content; with `icon` it is a
10
+ * circle of the size given by `size`.
11
+ *
12
+ * The badge carries no positioning of its own — whatever it annotates places
13
+ * it. For the call controls, rendering a badge among `CompositeButton`'s
14
+ * children anchors it to the top-right corner of the button.
15
+ */
16
+ const Badge = forwardRef(function BadgeRender({ variant = 'default', size = 'sm', icon, className, children, ...rest }, ref) {
17
+ return (jsx("span", { ref: ref, className: clsx('str-video__badge', `str-video__badge--${variant}`, `str-video__badge--size-${size}`, icon && 'str-video__badge--icon', className), ...rest, children: icon ? jsx(Icon, { icon: icon }) : children }));
18
+ });
19
+
20
+ export { Badge };
21
+ //# sourceMappingURL=Badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.js","sources":["../../../../../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import { ComponentPropsWithoutRef, forwardRef } from 'react';\nimport clsx from 'clsx';\n\nimport { Icon } from '../Icon';\n\nexport type BadgeVariant =\n 'default' | 'primary' | 'error' | 'neutral' | 'inverse';\n\nexport type BadgeSize = 'xs' | 'sm' | 'md';\n\nexport type BadgeProps = ComponentPropsWithoutRef<'span'> & {\n variant?: BadgeVariant;\n size?: BadgeSize;\n icon?: string;\n};\n\n/**\n * A compact badge for counts, notifications and error markers.\n *\n * Without `icon` it is a pill that grows with its content; with `icon` it is a\n * circle of the size given by `size`.\n *\n * The badge carries no positioning of its own — whatever it annotates places\n * it. For the call controls, rendering a badge among `CompositeButton`'s\n * children anchors it to the top-right corner of the button.\n */\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(\n function BadgeRender(\n { variant = 'default', size = 'sm', icon, className, children, ...rest },\n ref,\n ) {\n return (\n <span\n ref={ref}\n className={clsx(\n 'str-video__badge',\n `str-video__badge--${variant}`,\n `str-video__badge--size-${size}`,\n icon && 'str-video__badge--icon',\n className,\n )}\n {...rest}\n >\n {icon ? <Icon icon={icon} /> : children}\n </span>\n );\n },\n);\n"],"names":["_jsx"],"mappings":";;;;;AAgBA;;;;;;;;;AASG;AACI,MAAM,KAAK,GAAG,UAAU,CAC7B,SAAS,WAAW,CAClB,EAAE,OAAO,GAAG,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EACxE,GAAG,EAAA;IAEH,QACEA,cACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,IAAI,CACb,kBAAkB,EAClB,CAAA,kBAAA,EAAqB,OAAO,CAAA,CAAE,EAC9B,0BAA0B,IAAI,CAAA,CAAE,EAChC,IAAI,IAAI,wBAAwB,EAChC,SAAS,CACV,KACG,IAAI,EAAA,QAAA,EAEP,IAAI,GAAGA,GAAA,CAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAA,CAAI,GAAG,QAAQ,EAAA,CAClC;AAEX,CAAC;;;;"}
@@ -0,0 +1,10 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { forwardRef } from 'react';
3
+ import clsx from 'clsx';
4
+
5
+ const Button = forwardRef(function ButtonRender({ variant = 'primary', appearance = 'solid', size = 'md', active, className, type = 'button', children, ...rest }, ref) {
6
+ return (jsx("button", { ref: ref, type: type, className: clsx('str-video__button', `str-video__button--${variant}`, `str-video__button--${appearance}`, `str-video__button--size-${size}`, className), ...rest, "aria-pressed": active ?? rest['aria-pressed'], children: children }));
7
+ });
8
+
9
+ export { Button };
10
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","sources":["../../../../../../../src/components/Button/Button.tsx"],"sourcesContent":["import { ComponentPropsWithoutRef, forwardRef } from 'react';\nimport clsx from 'clsx';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'destructive';\n\nexport type ButtonAppearance = 'solid' | 'outline' | 'ghost';\n\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';\n\nexport type ButtonProps = ComponentPropsWithoutRef<'button'> & {\n variant?: ButtonVariant;\n appearance?: ButtonAppearance;\n size?: ButtonSize;\n active?: boolean;\n};\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n function ButtonRender(\n {\n variant = 'primary',\n appearance = 'solid',\n size = 'md',\n active,\n className,\n type = 'button',\n children,\n ...rest\n },\n ref,\n ) {\n return (\n <button\n ref={ref}\n type={type}\n className={clsx(\n 'str-video__button',\n `str-video__button--${variant}`,\n `str-video__button--${appearance}`,\n `str-video__button--size-${size}`,\n className,\n )}\n {...rest}\n aria-pressed={active ?? rest['aria-pressed']}\n >\n {children}\n </button>\n );\n },\n);\n"],"names":["_jsx"],"mappings":";;;;AAgBO,MAAM,MAAM,GAAG,UAAU,CAC9B,SAAS,YAAY,CACnB,EACE,OAAO,GAAG,SAAS,EACnB,UAAU,GAAG,OAAO,EACpB,IAAI,GAAG,IAAI,EACX,MAAM,EACN,SAAS,EACT,IAAI,GAAG,QAAQ,EACf,QAAQ,EACR,GAAG,IAAI,EACR,EACD,GAAG,EAAA;AAEH,IAAA,QACEA,GAAA,CAAA,QAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,IAAI,CACb,mBAAmB,EACnB,CAAA,mBAAA,EAAsB,OAAO,EAAE,EAC/B,CAAA,mBAAA,EAAsB,UAAU,CAAA,CAAE,EAClC,2BAA2B,IAAI,CAAA,CAAE,EACjC,SAAS,CACV,KACG,IAAI,EAAA,cAAA,EACM,MAAM,IAAI,IAAI,CAAC,cAAc,CAAC,YAE3C,QAAQ,EAAA,CACF;AAEb,CAAC;;;;"}
@@ -2,27 +2,20 @@ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import clsx from 'clsx';
3
3
  import { MenuToggle } from '../Menu/MenuToggle.js';
4
4
  import { forwardRef } from 'react';
5
+ import '@stream-io/i18n';
6
+ import { useI18n } from '../../i18n/TranslationContext.js';
7
+ import '@stream-io/i18n/react';
8
+ import { Button } from './Button.js';
5
9
  import { IconButton } from './IconButton.js';
6
10
  import { isComponentType } from '../../utilities/isComponentType.js';
7
11
 
8
- const CompositeButton = forwardRef(function CompositeButtonRender({ disabled, caption, children, className, active, Menu, menuPlacement, menuOffset, title, ToggleMenuButton = DefaultToggleMenuButton, variant, onClick, onMenuToggle, ...restButtonProps }, ref) {
9
- return (jsxs("div", { className: clsx('str-video__composite-button', className, {
10
- 'str-video__composite-button--caption': caption,
11
- 'str-video__composite-button--menu': Menu,
12
- }), title: title, ref: ref, children: [jsxs("div", { className: clsx('str-video__composite-button__button-group', {
13
- 'str-video__composite-button__button-group--active': active,
14
- 'str-video__composite-button__button-group--active-primary': active && variant === 'primary',
15
- 'str-video__composite-button__button-group--active-secondary': active && variant === 'secondary',
16
- 'str-video__composite-button__button-group--disabled': disabled,
17
- }), children: [jsx("button", { type: "button", className: "str-video__composite-button__button", onClick: (e) => {
18
- e.preventDefault();
19
- onClick?.(e);
20
- }, disabled: disabled, ...restButtonProps, children: children }), Menu && (jsx(MenuToggle, { offset: menuOffset, placement: menuPlacement, ToggleButton: ToggleMenuButton, onToggle: onMenuToggle, children: isComponentType(Menu) ? jsx(Menu, {}) : Menu }))] }), caption && (jsx("div", { className: "str-video__composite-button__caption", children: caption }))] }));
12
+ const CompositeButton = forwardRef(function CompositeButtonRender({ appearance, caption, children, className, disabled, Menu, menuOffset, menuPlacement, onMenuToggle, active, size = 'md', title, ToggleMenuButton = CompositeCaret, variant = 'secondary', ...buttonProps }, ref) {
13
+ return (jsxs("div", { ref: ref, title: title, className: clsx('str-video__composite-button', `str-video__composite-button--${variant}`, `str-video__composite-button--size-${size}`, `str-video__composite-button--${appearance ?? 'solid'}`, Menu && 'str-video__composite-button--menu', className), children: [jsxs("div", { className: "str-video__composite-button__group", children: [jsx(Button, { variant: variant, appearance: appearance, size: size, disabled: disabled, active: active, className: "str-video__composite-button__action str-video__button--icon-only", ...buttonProps, children: children }), Menu &&
14
+ (disabled ? (jsx(CompositeCaret, { menuShown: false, disabled: true })) : (jsx(MenuToggle, { offset: menuOffset, placement: menuPlacement, ToggleButton: ToggleMenuButton, onToggle: onMenuToggle, children: isComponentType(Menu) ? jsx(Menu, {}) : Menu })))] }), caption && (jsx("span", { className: "str-video__composite-button__caption", children: caption }))] }));
21
15
  });
22
- const DefaultToggleMenuButton = forwardRef(function DefaultToggleMenuButtonRender({ menuShown }, ref) {
23
- return (jsx(IconButton, { className: clsx('str-video__menu-toggle-button', {
24
- 'str-video__menu-toggle-button--active': menuShown,
25
- }), icon: menuShown ? 'caret-down' : 'caret-up', ref: ref }));
16
+ const CompositeCaret = forwardRef(function CompositeCaretRender({ menuShown, disabled }, ref) {
17
+ const { t } = useI18n();
18
+ return (jsx(IconButton, { className: "str-video__composite-button__caret", size: "xs", appearance: "ghost", disabled: disabled, "aria-label": t('common.toggleMenu.ariaLabel', 'Toggle menu'), "aria-haspopup": "menu", "aria-expanded": menuShown, icon: menuShown ? 'caret-down' : 'caret-up', ref: ref }));
26
19
  });
27
20
 
28
21
  export { CompositeButton };
@@ -1 +1 @@
1
- {"version":3,"file":"CompositeButton.js","sources":["../../../../../../../src/components/Button/CompositeButton.tsx"],"sourcesContent":["import clsx from 'clsx';\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\nimport {\n ComponentProps,\n ComponentType,\n forwardRef,\n PropsWithChildren,\n ReactElement,\n} from 'react';\nimport { Placement } from '@floating-ui/react';\n\nimport { IconButton } from './IconButton';\nimport { isComponentType } from '../../utilities';\n\nexport type IconButtonWithMenuProps<E extends HTMLElement = HTMLButtonElement> =\n PropsWithChildren<{\n active?: boolean;\n Menu?: ComponentType | ReactElement | null;\n caption?: string;\n className?: string;\n menuPlacement?: Placement;\n menuOffset?: number;\n ToggleMenuButton?: ComponentType<ToggleMenuButtonProps<E>>;\n variant?: 'primary' | 'secondary';\n onMenuToggle?: (menuShown: boolean) => void;\n }> &\n ComponentProps<'button'>;\n\nexport const CompositeButton = forwardRef<\n HTMLDivElement,\n IconButtonWithMenuProps\n>(function CompositeButtonRender(\n {\n disabled,\n caption,\n children,\n className,\n active,\n Menu,\n menuPlacement,\n menuOffset,\n title,\n ToggleMenuButton = DefaultToggleMenuButton,\n variant,\n onClick,\n onMenuToggle,\n ...restButtonProps\n },\n ref,\n) {\n return (\n <div\n className={clsx('str-video__composite-button', className, {\n 'str-video__composite-button--caption': caption,\n 'str-video__composite-button--menu': Menu,\n })}\n title={title}\n ref={ref}\n >\n <div\n className={clsx('str-video__composite-button__button-group', {\n 'str-video__composite-button__button-group--active': active,\n 'str-video__composite-button__button-group--active-primary':\n active && variant === 'primary',\n 'str-video__composite-button__button-group--active-secondary':\n active && variant === 'secondary',\n 'str-video__composite-button__button-group--disabled': disabled,\n })}\n >\n <button\n type=\"button\"\n className=\"str-video__composite-button__button\"\n onClick={(e) => {\n e.preventDefault();\n onClick?.(e);\n }}\n disabled={disabled}\n {...restButtonProps}\n >\n {children}\n </button>\n {Menu && (\n <MenuToggle\n offset={menuOffset}\n placement={menuPlacement}\n ToggleButton={ToggleMenuButton}\n onToggle={onMenuToggle}\n >\n {isComponentType(Menu) ? <Menu /> : Menu}\n </MenuToggle>\n )}\n </div>\n {caption && (\n <div className=\"str-video__composite-button__caption\">{caption}</div>\n )}\n </div>\n );\n});\n\nconst DefaultToggleMenuButton = forwardRef<\n HTMLButtonElement,\n ToggleMenuButtonProps\n>(function DefaultToggleMenuButtonRender({ menuShown }, ref) {\n return (\n <IconButton\n className={clsx('str-video__menu-toggle-button', {\n 'str-video__menu-toggle-button--active': menuShown,\n })}\n icon={menuShown ? 'caret-down' : 'caret-up'}\n ref={ref}\n />\n );\n});\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;AA4BO,MAAM,eAAe,GAAG,UAAU,CAGvC,SAAS,qBAAqB,CAC9B,EACE,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,SAAS,EACT,MAAM,EACN,IAAI,EACJ,aAAa,EACb,UAAU,EACV,KAAK,EACL,gBAAgB,GAAG,uBAAuB,EAC1C,OAAO,EACP,OAAO,EACP,YAAY,EACZ,GAAG,eAAe,EACnB,EACD,GAAG,EAAA;IAEH,QACEA,cACE,SAAS,EAAE,IAAI,CAAC,6BAA6B,EAAE,SAAS,EAAE;AACxD,YAAA,sCAAsC,EAAE,OAAO;AAC/C,YAAA,mCAAmC,EAAE,IAAI;AAC1C,SAAA,CAAC,EACF,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,GAAG,EAAA,QAAA,EAAA,CAERA,cACE,SAAS,EAAE,IAAI,CAAC,2CAA2C,EAAE;AAC3D,oBAAA,mDAAmD,EAAE,MAAM;AAC3D,oBAAA,2DAA2D,EACzD,MAAM,IAAI,OAAO,KAAK,SAAS;AACjC,oBAAA,6DAA6D,EAC3D,MAAM,IAAI,OAAO,KAAK,WAAW;AACnC,oBAAA,qDAAqD,EAAE,QAAQ;AAChE,iBAAA,CAAC,EAAA,QAAA,EAAA,CAEFC,GAAA,CAAA,QAAA,EAAA,EACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,qCAAqC,EAC/C,OAAO,EAAE,CAAC,CAAC,KAAI;4BACb,CAAC,CAAC,cAAc,EAAE;AAClB,4BAAA,OAAO,GAAG,CAAC,CAAC;AACd,wBAAA,CAAC,EACD,QAAQ,EAAE,QAAQ,EAAA,GACd,eAAe,EAAA,QAAA,EAElB,QAAQ,EAAA,CACF,EACR,IAAI,KACHA,GAAA,CAAC,UAAU,EAAA,EACT,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,aAAa,EACxB,YAAY,EAAE,gBAAgB,EAC9B,QAAQ,EAAE,YAAY,EAAA,QAAA,EAErB,eAAe,CAAC,IAAI,CAAC,GAAGA,GAAA,CAAC,IAAI,EAAA,EAAA,CAAG,GAAG,IAAI,EAAA,CAC7B,CACd,CAAA,EAAA,CACG,EACL,OAAO,KACNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,sCAAsC,EAAA,QAAA,EAAE,OAAO,EAAA,CAAO,CACtE,CAAA,EAAA,CACG;AAEV,CAAC;AAED,MAAM,uBAAuB,GAAG,UAAU,CAGxC,SAAS,6BAA6B,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,EAAA;IACzD,QACEA,IAAC,UAAU,EAAA,EACT,SAAS,EAAE,IAAI,CAAC,+BAA+B,EAAE;AAC/C,YAAA,uCAAuC,EAAE,SAAS;AACnD,SAAA,CAAC,EACF,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,UAAU,EAC3C,GAAG,EAAE,GAAG,EAAA,CACR;AAEN,CAAC,CAAC;;;;"}
1
+ {"version":3,"file":"CompositeButton.js","sources":["../../../../../../../src/components/Button/CompositeButton.tsx"],"sourcesContent":["import clsx from 'clsx';\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\nimport {\n ComponentProps,\n ComponentType,\n forwardRef,\n PropsWithChildren,\n ReactElement,\n} from 'react';\nimport { Placement } from '@floating-ui/react';\nimport { useI18n } from '../../i18n';\n\nimport { Button, ButtonAppearance, ButtonSize, ButtonVariant } from './Button';\nimport { IconButton } from './IconButton';\nimport { isComponentType } from '../../utilities';\n\nexport type CompositeButtonProps<E extends HTMLElement = HTMLButtonElement> =\n PropsWithChildren<{\n active?: boolean;\n Menu?: ComponentType | ReactElement | null;\n caption?: string;\n className?: string;\n menuPlacement?: Placement;\n menuOffset?: number;\n ToggleMenuButton?: ComponentType<ToggleMenuButtonProps<E>>;\n variant?: ButtonVariant;\n appearance?: ButtonAppearance;\n size?: Exclude<ButtonSize, 'xs'>;\n onMenuToggle?: (menuShown: boolean) => void;\n }> &\n ComponentProps<'button'>;\n\nexport const CompositeButton = forwardRef<HTMLDivElement, CompositeButtonProps>(\n function CompositeButtonRender(\n {\n appearance,\n caption,\n children,\n className,\n disabled,\n Menu,\n menuOffset,\n menuPlacement,\n onMenuToggle,\n active,\n size = 'md',\n title,\n ToggleMenuButton = CompositeCaret,\n variant = 'secondary',\n ...buttonProps\n },\n ref,\n ) {\n return (\n <div\n ref={ref}\n title={title}\n className={clsx(\n 'str-video__composite-button',\n `str-video__composite-button--${variant}`,\n `str-video__composite-button--size-${size}`,\n `str-video__composite-button--${appearance ?? 'solid'}`,\n Menu && 'str-video__composite-button--menu',\n className,\n )}\n >\n <div className=\"str-video__composite-button__group\">\n <Button\n variant={variant}\n appearance={appearance}\n size={size}\n disabled={disabled}\n active={active}\n className=\"str-video__composite-button__action str-video__button--icon-only\"\n {...buttonProps}\n >\n {children}\n </Button>\n {Menu &&\n (disabled ? (\n <CompositeCaret menuShown={false} disabled />\n ) : (\n <MenuToggle\n offset={menuOffset}\n placement={menuPlacement}\n ToggleButton={ToggleMenuButton}\n onToggle={onMenuToggle}\n >\n {isComponentType(Menu) ? <Menu /> : Menu}\n </MenuToggle>\n ))}\n </div>\n {caption && (\n <span className=\"str-video__composite-button__caption\">\n {caption}\n </span>\n )}\n </div>\n );\n },\n);\n\nconst CompositeCaret = forwardRef<\n HTMLButtonElement,\n { menuShown: boolean; disabled?: boolean }\n>(function CompositeCaretRender({ menuShown, disabled }, ref) {\n const { t } = useI18n();\n\n return (\n <IconButton\n className=\"str-video__composite-button__caret\"\n size=\"xs\"\n appearance=\"ghost\"\n disabled={disabled}\n aria-label={t('common.toggleMenu.ariaLabel', 'Toggle menu')}\n aria-haspopup=\"menu\"\n aria-expanded={menuShown}\n icon={menuShown ? 'caret-down' : 'caret-up'}\n ref={ref}\n />\n );\n});\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;;MAgCa,eAAe,GAAG,UAAU,CACvC,SAAS,qBAAqB,CAC5B,EACE,UAAU,EACV,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,UAAU,EACV,aAAa,EACb,YAAY,EACZ,MAAM,EACN,IAAI,GAAG,IAAI,EACX,KAAK,EACL,gBAAgB,GAAG,cAAc,EACjC,OAAO,GAAG,WAAW,EACrB,GAAG,WAAW,EACf,EACD,GAAG,EAAA;AAEH,IAAA,QACEA,IAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,IAAI,CACb,6BAA6B,EAC7B,CAAA,6BAAA,EAAgC,OAAO,CAAA,CAAE,EACzC,CAAA,kCAAA,EAAqC,IAAI,CAAA,CAAE,EAC3C,gCAAgC,UAAU,IAAI,OAAO,CAAA,CAAE,EACvD,IAAI,IAAI,mCAAmC,EAC3C,SAAS,CACV,EAAA,QAAA,EAAA,CAEDA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,oCAAoC,EAAA,QAAA,EAAA,CACjDC,GAAA,CAAC,MAAM,EAAA,EACL,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,SAAS,EAAC,kEAAkE,KACxE,WAAW,EAAA,QAAA,EAEd,QAAQ,EAAA,CACF,EACR,IAAI;AACH,yBAAC,QAAQ,IACPA,GAAA,CAAC,cAAc,EAAA,EAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,SAAG,KAE7CA,GAAA,CAAC,UAAU,EAAA,EACT,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,aAAa,EACxB,YAAY,EAAE,gBAAgB,EAC9B,QAAQ,EAAE,YAAY,EAAA,QAAA,EAErB,eAAe,CAAC,IAAI,CAAC,GAAGA,GAAA,CAAC,IAAI,EAAA,EAAA,CAAG,GAAG,IAAI,EAAA,CAC7B,CACd,CAAC,CAAA,EAAA,CACA,EACL,OAAO,KACNA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,sCAAsC,YACnD,OAAO,EAAA,CACH,CACR,CAAA,EAAA,CACG;AAEV,CAAC;AAGH,MAAM,cAAc,GAAG,UAAU,CAG/B,SAAS,oBAAoB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAA;AAC1D,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE;IAEvB,QACEA,IAAC,UAAU,EAAA,EACT,SAAS,EAAC,oCAAoC,EAC9C,IAAI,EAAC,IAAI,EACT,UAAU,EAAC,OAAO,EAClB,QAAQ,EAAE,QAAQ,EAAA,YAAA,EACN,CAAC,CAAC,6BAA6B,EAAE,aAAa,CAAC,EAAA,eAAA,EAC7C,MAAM,EAAA,eAAA,EACL,SAAS,EACxB,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,UAAU,EAC3C,GAAG,EAAE,GAAG,EAAA,CACR;AAEN,CAAC,CAAC;;;;"}
@@ -1,17 +1,11 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { forwardRef } from 'react';
3
3
  import clsx from 'clsx';
4
+ import { Button } from './Button.js';
4
5
  import { Icon } from '../Icon/Icon.js';
5
6
 
6
- const IconButton = forwardRef(function IconButtonRender(props, ref) {
7
- const { icon, enabled, variant, onClick, className, ...rest } = props;
8
- return (jsx("button", { className: clsx('str-video__call-controls__button', className, {
9
- [`str-video__call-controls__button--variant-${variant}`]: variant,
10
- 'str-video__call-controls__button--enabled': enabled,
11
- }), onClick: (e) => {
12
- e.preventDefault();
13
- onClick?.(e);
14
- }, ref: ref, ...rest, children: jsx(Icon, { icon: icon }) }));
7
+ const IconButton = forwardRef(function IconButtonRender({ icon, className, ...props }, ref) {
8
+ return (jsx(Button, { ref: ref, className: clsx('str-video__button--icon-only', className), ...props, children: jsx(Icon, { icon: icon }) }));
15
9
  });
16
10
 
17
11
  export { IconButton };
@@ -1 +1 @@
1
- {"version":3,"file":"IconButton.js","sources":["../../../../../../../src/components/Button/IconButton.tsx"],"sourcesContent":["import { ComponentProps, ForwardedRef, forwardRef } from 'react';\nimport clsx from 'clsx';\n\nimport { Icon, IconProps } from '../Icon';\n\nexport type ButtonWithIconProps = {\n enabled?: boolean;\n variant?: string;\n} & ComponentProps<'button'> &\n IconProps;\n\nexport const IconButton = forwardRef(function IconButtonRender(\n props: ButtonWithIconProps,\n ref: ForwardedRef<HTMLButtonElement>,\n) {\n const { icon, enabled, variant, onClick, className, ...rest } = props;\n return (\n <button\n className={clsx('str-video__call-controls__button', className, {\n [`str-video__call-controls__button--variant-${variant}`]: variant,\n 'str-video__call-controls__button--enabled': enabled,\n })}\n onClick={(e) => {\n e.preventDefault();\n onClick?.(e);\n }}\n ref={ref}\n {...rest}\n >\n <Icon icon={icon} />\n </button>\n );\n});\n"],"names":["_jsx"],"mappings":";;;;;AAWO,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,gBAAgB,CAC5D,KAA0B,EAC1B,GAAoC,EAAA;AAEpC,IAAA,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK;IACrE,QACEA,gBACE,SAAS,EAAE,IAAI,CAAC,kCAAkC,EAAE,SAAS,EAAE;AAC7D,YAAA,CAAC,CAAA,0CAAA,EAA6C,OAAO,CAAA,CAAE,GAAG,OAAO;AACjE,YAAA,2CAA2C,EAAE,OAAO;AACrD,SAAA,CAAC,EACF,OAAO,EAAE,CAAC,CAAC,KAAI;YACb,CAAC,CAAC,cAAc,EAAE;AAClB,YAAA,OAAO,GAAG,CAAC,CAAC;AACd,QAAA,CAAC,EACD,GAAG,EAAE,GAAG,EAAA,GACJ,IAAI,EAAA,QAAA,EAERA,GAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,IAAI,EAAA,CAAI,EAAA,CACb;AAEb,CAAC;;;;"}
1
+ {"version":3,"file":"IconButton.js","sources":["../../../../../../../src/components/Button/IconButton.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport clsx from 'clsx';\n\nimport { Button, ButtonProps } from './Button';\nimport { Icon } from '../Icon';\n\nexport type IconButtonProps = Omit<ButtonProps, 'children'> & {\n icon: string;\n};\n\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n function IconButtonRender({ icon, className, ...props }, ref) {\n return (\n <Button\n ref={ref}\n className={clsx('str-video__button--icon-only', className)}\n {...props}\n >\n <Icon icon={icon} />\n </Button>\n );\n },\n);\n"],"names":["_jsx"],"mappings":";;;;;;AAUO,MAAM,UAAU,GAAG,UAAU,CAClC,SAAS,gBAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAA;AAC1D,IAAA,QACEA,GAAA,CAAC,MAAM,EAAA,EACL,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,IAAI,CAAC,8BAA8B,EAAE,SAAS,CAAC,EAAA,GACtD,KAAK,EAAA,QAAA,EAETA,GAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,IAAI,EAAA,CAAI,EAAA,CACb;AAEb,CAAC;;;;"}
@@ -1,7 +1,8 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { useCallback } from 'react';
3
- import '../Button/CompositeButton.js';
3
+ import '../Button/Button.js';
4
4
  import { IconButton } from '../Button/IconButton.js';
5
+ import '../Button/CompositeButton.js';
5
6
  import { useCall } from '@stream-io/video-react-bindings';
6
7
 
7
8
  const AcceptCallButton = ({ disabled, onAccept, onClick, }) => {
@@ -21,7 +22,7 @@ const AcceptCallButton = ({ disabled, onAccept, onClick, }) => {
21
22
  }
22
23
  }
23
24
  }, [onClick, onAccept, call]);
24
- return (jsx(IconButton, { disabled: disabled, icon: "call-accept", variant: "success", "data-testid": "accept-call-button", onClick: handleClick }));
25
+ return (jsx(IconButton, { className: "str-video__accept-call-button", size: "sm", disabled: disabled, icon: "call-accept", variant: "secondary", "data-testid": "accept-call-button", onClick: handleClick }));
25
26
  };
26
27
 
27
28
  export { AcceptCallButton };
@@ -1 +1 @@
1
- {"version":3,"file":"AcceptCallButton.js","sources":["../../../../../../../src/components/CallControls/AcceptCallButton.tsx"],"sourcesContent":["import { MouseEventHandler, useCallback } from 'react';\nimport { IconButton } from '../Button';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type AcceptCallButtonProps = {\n disabled?: boolean;\n onClick?: MouseEventHandler<HTMLButtonElement>;\n onAccept?: (err?: Error) => void;\n};\n\nexport const AcceptCallButton = ({\n disabled,\n onAccept,\n onClick,\n}: AcceptCallButtonProps) => {\n const call = useCall();\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n try {\n await call.join();\n onAccept?.();\n } catch (err) {\n console.error(`Failed to accept call`, err);\n onAccept?.(err as Error);\n }\n }\n },\n [onClick, onAccept, call],\n );\n return (\n <IconButton\n disabled={disabled}\n icon=\"call-accept\"\n variant=\"success\"\n data-testid=\"accept-call-button\"\n onClick={handleClick}\n />\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;AAUO,MAAM,gBAAgB,GAAG,CAAC,EAC/B,QAAQ,EACR,QAAQ,EACR,OAAO,GACe,KAAI;AAC1B,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE;IACtB,MAAM,WAAW,GAAyC,WAAW,CACnE,OAAO,CAAC,KAAI;QACV,IAAI,OAAO,EAAE;YACX,OAAO,CAAC,CAAC,CAAC;QACZ;aAAO,IAAI,IAAI,EAAE;AACf,YAAA,IAAI;AACF,gBAAA,MAAM,IAAI,CAAC,IAAI,EAAE;gBACjB,QAAQ,IAAI;YACd;YAAE,OAAO,GAAG,EAAE;AACZ,gBAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC;AAC3C,gBAAA,QAAQ,GAAG,GAAY,CAAC;YAC1B;QACF;IACF,CAAC,EACD,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAC1B;IACD,QACEA,IAAC,UAAU,EAAA,EACT,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAC,aAAa,EAClB,OAAO,EAAC,SAAS,EAAA,aAAA,EACL,oBAAoB,EAChC,OAAO,EAAE,WAAW,EAAA,CACpB;AAEN;;;;"}
1
+ {"version":3,"file":"AcceptCallButton.js","sources":["../../../../../../../src/components/CallControls/AcceptCallButton.tsx"],"sourcesContent":["import { MouseEventHandler, useCallback } from 'react';\nimport { IconButton } from '../Button';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport type AcceptCallButtonProps = {\n disabled?: boolean;\n onClick?: MouseEventHandler<HTMLButtonElement>;\n onAccept?: (err?: Error) => void;\n};\n\nexport const AcceptCallButton = ({\n disabled,\n onAccept,\n onClick,\n}: AcceptCallButtonProps) => {\n const call = useCall();\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n try {\n await call.join();\n onAccept?.();\n } catch (err) {\n console.error(`Failed to accept call`, err);\n onAccept?.(err as Error);\n }\n }\n },\n [onClick, onAccept, call],\n );\n return (\n <IconButton\n className=\"str-video__accept-call-button\"\n size=\"sm\"\n disabled={disabled}\n icon=\"call-accept\"\n variant=\"secondary\"\n data-testid=\"accept-call-button\"\n onClick={handleClick}\n />\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;;AAUO,MAAM,gBAAgB,GAAG,CAAC,EAC/B,QAAQ,EACR,QAAQ,EACR,OAAO,GACe,KAAI;AAC1B,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE;IACtB,MAAM,WAAW,GAAyC,WAAW,CACnE,OAAO,CAAC,KAAI;QACV,IAAI,OAAO,EAAE;YACX,OAAO,CAAC,CAAC,CAAC;QACZ;aAAO,IAAI,IAAI,EAAE;AACf,YAAA,IAAI;AACF,gBAAA,MAAM,IAAI,CAAC,IAAI,EAAE;gBACjB,QAAQ,IAAI;YACd;YAAE,OAAO,GAAG,EAAE;AACZ,gBAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC;AAC3C,gBAAA,QAAQ,GAAG,GAAY,CAAC;YAC1B;QACF;IACF,CAAC,EACD,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAC1B;AACD,IAAA,QACEA,GAAA,CAAC,UAAU,EAAA,EACT,SAAS,EAAC,+BAA+B,EACzC,IAAI,EAAC,IAAI,EACT,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAC,aAAa,EAClB,OAAO,EAAC,WAAW,EAAA,aAAA,EACP,oBAAoB,EAChC,OAAO,EAAE,WAAW,EAAA,CACpB;AAEN;;;;"}
@@ -4,6 +4,9 @@ import { Restricted } from '@stream-io/video-react-bindings';
4
4
  import 'react';
5
5
  import 'clsx';
6
6
  import '@floating-ui/react';
7
+ import '@stream-io/i18n';
8
+ import '../../i18n/TranslationContext.js';
9
+ import '@stream-io/i18n/react';
7
10
  import { SpeakingWhileMutedNotification } from '../Notification/SpeakingWhileMutedNotification.js';
8
11
  import { RecordCallButton } from './RecordCallButton.js';
9
12
  import { ReactionsButton } from './ReactionsButton.js';
@@ -1 +1 @@
1
- {"version":3,"file":"CallControls.js","sources":["../../../../../../../src/components/CallControls/CallControls.tsx"],"sourcesContent":["import { OwnCapability } from '@stream-io/video-client';\nimport { Restricted } from '@stream-io/video-react-bindings';\nimport { SpeakingWhileMutedNotification } from '../Notification';\nimport { RecordCallButton } from './RecordCallButton';\nimport { ReactionsButton } from './ReactionsButton';\nimport { ScreenShareButton } from './ScreenShareButton';\nimport { ToggleAudioPublishingButton } from './ToggleAudioButton';\nimport { ToggleVideoPublishingButton } from './ToggleVideoButton';\nimport { CancelCallButton } from './CancelCallButton';\n\nexport type CallControlsProps = {\n onLeave?: (err?: Error) => void;\n};\n\nexport const CallControls = ({ onLeave }: CallControlsProps) => (\n <div className=\"str-video__call-controls\">\n <Restricted requiredGrants={[OwnCapability.SEND_AUDIO]}>\n <SpeakingWhileMutedNotification>\n <ToggleAudioPublishingButton />\n </SpeakingWhileMutedNotification>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.SEND_VIDEO]}>\n <ToggleVideoPublishingButton />\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.CREATE_REACTION]}>\n <ReactionsButton />\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.SCREENSHARE]}>\n <ScreenShareButton />\n </Restricted>\n <Restricted\n requiredGrants={[\n OwnCapability.START_RECORD_CALL,\n OwnCapability.STOP_RECORD_CALL,\n ]}\n >\n <RecordCallButton />\n </Restricted>\n <CancelCallButton onLeave={onLeave} />\n </div>\n);\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;;;;;AAcO,MAAM,YAAY,GAAG,CAAC,EAAE,OAAO,EAAqB,MACzDA,cAAK,SAAS,EAAC,0BAA0B,EAAA,QAAA,EAAA,CACvCC,GAAA,CAAC,UAAU,EAAA,EAAC,cAAc,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,EAAA,QAAA,EACpDA,GAAA,CAAC,8BAA8B,EAAA,EAAA,QAAA,EAC7BA,GAAA,CAAC,2BAA2B,EAAA,EAAA,CAAG,EAAA,CACA,GACtB,EACbA,GAAA,CAAC,UAAU,EAAA,EAAC,cAAc,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,EAAA,QAAA,EACpDA,GAAA,CAAC,2BAA2B,EAAA,EAAA,CAAG,EAAA,CACpB,EACbA,GAAA,CAAC,UAAU,IAAC,cAAc,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,EAAA,QAAA,EACzDA,IAAC,eAAe,EAAA,EAAA,CAAG,GACR,EACbA,GAAA,CAAC,UAAU,EAAA,EAAC,cAAc,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,YACrDA,GAAA,CAAC,iBAAiB,KAAG,EAAA,CACV,EACbA,IAAC,UAAU,EAAA,EACT,cAAc,EAAE;AACd,gBAAA,aAAa,CAAC,iBAAiB;AAC/B,gBAAA,aAAa,CAAC,gBAAgB;AAC/B,aAAA,EAAA,QAAA,EAEDA,GAAA,CAAC,gBAAgB,EAAA,EAAA,CAAG,EAAA,CACT,EACbA,GAAA,CAAC,gBAAgB,EAAA,EAAC,OAAO,EAAE,OAAO,EAAA,CAAI,CAAA,EAAA,CAClC;;;;"}
1
+ {"version":3,"file":"CallControls.js","sources":["../../../../../../../src/components/CallControls/CallControls.tsx"],"sourcesContent":["import { OwnCapability } from '@stream-io/video-client';\nimport { Restricted } from '@stream-io/video-react-bindings';\nimport { SpeakingWhileMutedNotification } from '../Notification';\nimport { RecordCallButton } from './RecordCallButton';\nimport { ReactionsButton } from './ReactionsButton';\nimport { ScreenShareButton } from './ScreenShareButton';\nimport { ToggleAudioPublishingButton } from './ToggleAudioButton';\nimport { ToggleVideoPublishingButton } from './ToggleVideoButton';\nimport { CancelCallButton } from './CancelCallButton';\n\nexport type CallControlsProps = {\n onLeave?: (err?: Error) => void;\n};\n\nexport const CallControls = ({ onLeave }: CallControlsProps) => (\n <div className=\"str-video__call-controls\">\n <Restricted requiredGrants={[OwnCapability.SEND_AUDIO]}>\n <SpeakingWhileMutedNotification>\n <ToggleAudioPublishingButton />\n </SpeakingWhileMutedNotification>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.SEND_VIDEO]}>\n <ToggleVideoPublishingButton />\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.CREATE_REACTION]}>\n <ReactionsButton />\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.SCREENSHARE]}>\n <ScreenShareButton />\n </Restricted>\n <Restricted\n requiredGrants={[\n OwnCapability.START_RECORD_CALL,\n OwnCapability.STOP_RECORD_CALL,\n ]}\n >\n <RecordCallButton />\n </Restricted>\n <CancelCallButton onLeave={onLeave} />\n </div>\n);\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;;;;;;;;AAcO,MAAM,YAAY,GAAG,CAAC,EAAE,OAAO,EAAqB,MACzDA,cAAK,SAAS,EAAC,0BAA0B,EAAA,QAAA,EAAA,CACvCC,GAAA,CAAC,UAAU,EAAA,EAAC,cAAc,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,EAAA,QAAA,EACpDA,GAAA,CAAC,8BAA8B,EAAA,EAAA,QAAA,EAC7BA,GAAA,CAAC,2BAA2B,EAAA,EAAA,CAAG,EAAA,CACA,GACtB,EACbA,GAAA,CAAC,UAAU,EAAA,EAAC,cAAc,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,EAAA,QAAA,EACpDA,GAAA,CAAC,2BAA2B,EAAA,EAAA,CAAG,EAAA,CACpB,EACbA,GAAA,CAAC,UAAU,IAAC,cAAc,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,EAAA,QAAA,EACzDA,IAAC,eAAe,EAAA,EAAA,CAAG,GACR,EACbA,GAAA,CAAC,UAAU,EAAA,EAAC,cAAc,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,YACrDA,GAAA,CAAC,iBAAiB,KAAG,EAAA,CACV,EACbA,IAAC,UAAU,EAAA,EACT,cAAc,EAAE;AACd,gBAAA,aAAa,CAAC,iBAAiB;AAC/B,gBAAA,aAAa,CAAC,gBAAgB;AAC/B,aAAA,EAAA,QAAA,EAEDA,GAAA,CAAC,gBAAgB,EAAA,EAAA,CAAG,EAAA,CACT,EACbA,GAAA,CAAC,gBAAgB,EAAA,EAAC,OAAO,EAAE,OAAO,EAAA,CAAI,CAAA,EAAA,CAClC;;;;"}
@@ -1,10 +1,14 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { forwardRef, useCallback } from 'react';
3
3
  import { OwnCapability } from '@stream-io/video-client';
4
- import { useI18n, useCall, Restricted } from '@stream-io/video-react-bindings';
4
+ import { useCall, Restricted } from '@stream-io/video-react-bindings';
5
+ import '@stream-io/i18n';
6
+ import { useI18n } from '../../i18n/TranslationContext.js';
7
+ import '@stream-io/i18n/react';
5
8
  import { MenuToggle } from '../Menu/MenuToggle.js';
6
- import '../Button/CompositeButton.js';
9
+ import { Button } from '../Button/Button.js';
7
10
  import { IconButton } from '../Button/IconButton.js';
11
+ import '../Button/CompositeButton.js';
8
12
  import { Icon } from '../Icon/Icon.js';
9
13
  import 'clsx';
10
14
  import '@floating-ui/react';
@@ -13,11 +17,11 @@ import { WithTooltip } from '../Tooltip/WithTooltip.js';
13
17
  const EndCallMenu = (props) => {
14
18
  const { onLeave, onEnd } = props;
15
19
  const { t } = useI18n();
16
- return (jsxs("div", { className: "str-video__end-call__confirmation", children: [jsxs("button", { className: "str-video__button str-video__end-call__leave", type: "button", "data-testid": "leave-call-button", onClick: onLeave, children: [jsx(Icon, { className: "str-video__button__icon str-video__end-call__leave-icon", icon: "logout" }), t('Leave call')] }), jsx(Restricted, { requiredGrants: [OwnCapability.END_CALL], children: jsxs("button", { className: "str-video__button str-video__end-call__end", type: "button", "data-testid": "end-call-for-all-button", onClick: onEnd, children: [jsx(Icon, { className: "str-video__button__icon str-video__end-call__end-icon", icon: "call-end" }), t('End call for all')] }) })] }));
20
+ return (jsxs("div", { className: "str-video__end-call__confirmation", children: [jsxs(Button, { variant: "secondary", appearance: "outline", className: "str-video__end-call__leave", "data-testid": "leave-call-button", onClick: onLeave, children: [jsx(Icon, { icon: "logout" }), t('callControls.cancelCallButton.leaveCall.title', 'Leave call')] }), jsx(Restricted, { requiredGrants: [OwnCapability.END_CALL], children: jsxs(Button, { variant: "destructive", className: "str-video__end-call__end", "data-testid": "end-call-for-all-button", onClick: onEnd, children: [jsx(Icon, { icon: "call-end" }), t('callControls.cancelCallButton.endCallForAll.label', 'End call for all')] }) })] }));
17
21
  };
18
22
  const CancelCallToggleMenuButton = forwardRef(function CancelCallToggleMenuButtonRender({ menuShown }, ref) {
19
23
  const { t } = useI18n();
20
- return (jsx(WithTooltip, { title: t('Leave call'), tooltipDisabled: menuShown, children: jsx(IconButton, { icon: menuShown ? 'close' : 'call-end', variant: menuShown ? 'active' : 'danger', "data-testid": "leave-call-button", ref: ref }) }));
24
+ return (jsx(WithTooltip, { title: t('callControls.cancelCallButton.leaveCall.title', 'Leave call'), tooltipDisabled: menuShown, children: jsx(IconButton, { icon: menuShown ? 'close' : 'call-end', variant: "destructive", "data-testid": "leave-call-button", ref: ref }) }));
21
25
  });
22
26
  const CancelCallConfirmButton = ({ onClick, onLeave, }) => {
23
27
  const call = useCall();
@@ -53,7 +57,7 @@ const CancelCallConfirmButton = ({ onClick, onLeave, }) => {
53
57
  }, [onClick, onLeave, call]);
54
58
  return (jsx(MenuToggle, { placement: "top-start", ToggleButton: CancelCallToggleMenuButton, children: jsx(EndCallMenu, { onEnd: handleEndCall, onLeave: handleLeave }) }));
55
59
  };
56
- const CancelCallButton = ({ disabled, caption, onClick, onLeave, }) => {
60
+ const CancelCallButton = ({ disabled, caption, size, onClick, onLeave, }) => {
57
61
  const call = useCall();
58
62
  const { t } = useI18n();
59
63
  const handleClick = useCallback(async (e) => {
@@ -71,7 +75,8 @@ const CancelCallButton = ({ disabled, caption, onClick, onLeave, }) => {
71
75
  }
72
76
  }
73
77
  }, [onClick, onLeave, call]);
74
- return (jsx(IconButton, { disabled: disabled, icon: "call-end", variant: "danger", title: caption ?? t('Leave call'), "data-testid": "cancel-call-button", onClick: handleClick }));
78
+ return (jsx(IconButton, { size: size, disabled: disabled, icon: "call-end", variant: "destructive", title: caption ??
79
+ t('callControls.cancelCallButton.leaveCall.title', 'Leave call'), "data-testid": "cancel-call-button", onClick: handleClick }));
75
80
  };
76
81
 
77
82
  export { CancelCallButton, CancelCallConfirmButton };
@@ -1 +1 @@
1
- {"version":3,"file":"CancelCallButton.js","sources":["../../../../../../../src/components/CallControls/CancelCallButton.tsx"],"sourcesContent":["import { forwardRef, MouseEventHandler, useCallback } from 'react';\nimport { OwnCapability } from '@stream-io/video-client';\nimport { Restricted, useCall, useI18n } from '@stream-io/video-react-bindings';\n\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\n\nimport { IconButton } from '../Button';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\n\nconst EndCallMenu = (props: {\n onLeave: MouseEventHandler<HTMLButtonElement>;\n onEnd: MouseEventHandler<HTMLButtonElement>;\n}) => {\n const { onLeave, onEnd } = props;\n const { t } = useI18n();\n return (\n <div className=\"str-video__end-call__confirmation\">\n <button\n className=\"str-video__button str-video__end-call__leave\"\n type=\"button\"\n data-testid=\"leave-call-button\"\n onClick={onLeave}\n >\n <Icon\n className=\"str-video__button__icon str-video__end-call__leave-icon\"\n icon=\"logout\"\n />\n {t('Leave call')}\n </button>\n <Restricted requiredGrants={[OwnCapability.END_CALL]}>\n <button\n className=\"str-video__button str-video__end-call__end\"\n type=\"button\"\n data-testid=\"end-call-for-all-button\"\n onClick={onEnd}\n >\n <Icon\n className=\"str-video__button__icon str-video__end-call__end-icon\"\n icon=\"call-end\"\n />\n {t('End call for all')}\n </button>\n </Restricted>\n </div>\n );\n};\n\nconst CancelCallToggleMenuButton = forwardRef<\n HTMLButtonElement,\n ToggleMenuButtonProps\n>(function CancelCallToggleMenuButtonRender({ menuShown }, ref) {\n const { t } = useI18n();\n return (\n <WithTooltip title={t('Leave call')} tooltipDisabled={menuShown}>\n <IconButton\n icon={menuShown ? 'close' : 'call-end'}\n variant={menuShown ? 'active' : 'danger'}\n data-testid=\"leave-call-button\"\n ref={ref}\n />\n </WithTooltip>\n );\n});\n\nexport type CancelCallButtonProps = {\n disabled?: boolean;\n caption?: string;\n onClick?: MouseEventHandler<HTMLButtonElement>;\n onLeave?: (err?: Error) => void;\n};\n\nexport const CancelCallConfirmButton = ({\n onClick,\n onLeave,\n}: CancelCallButtonProps) => {\n const call = useCall();\n\n const handleLeave: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n try {\n await call.leave();\n onLeave?.();\n } catch (err) {\n console.error(`Failed to leave call`, err);\n onLeave?.(err as Error);\n }\n }\n },\n [onClick, onLeave, call],\n );\n\n const handleEndCall: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n try {\n await call.endCall();\n onLeave?.();\n } catch (err) {\n console.error(`Failed to end call`, err);\n onLeave?.(err as Error);\n }\n }\n },\n [onClick, onLeave, call],\n );\n\n return (\n <MenuToggle placement=\"top-start\" ToggleButton={CancelCallToggleMenuButton}>\n <EndCallMenu onEnd={handleEndCall} onLeave={handleLeave} />\n </MenuToggle>\n );\n};\n\nexport const CancelCallButton = ({\n disabled,\n caption,\n onClick,\n onLeave,\n}: CancelCallButtonProps) => {\n const call = useCall();\n const { t } = useI18n();\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n try {\n await call.leave();\n onLeave?.();\n } catch (err) {\n console.error(`Failed to leave call`, err);\n onLeave?.(err as Error);\n }\n }\n },\n [onClick, onLeave, call],\n );\n return (\n <IconButton\n disabled={disabled}\n icon=\"call-end\"\n variant=\"danger\"\n title={caption ?? t('Leave call')}\n data-testid=\"cancel-call-button\"\n onClick={handleClick}\n />\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"CancelCallButton.js","sources":["../../../../../../../src/components/CallControls/CancelCallButton.tsx"],"sourcesContent":["import { forwardRef, MouseEventHandler, useCallback } from 'react';\nimport { OwnCapability } from '@stream-io/video-client';\nimport { Restricted, useCall } from '@stream-io/video-react-bindings';\nimport { useI18n } from '../../i18n';\n\nimport { MenuToggle, ToggleMenuButtonProps } from '../Menu';\n\nimport { Button, ButtonProps, IconButton } from '../Button';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\n\nconst EndCallMenu = (props: {\n onLeave: MouseEventHandler<HTMLButtonElement>;\n onEnd: MouseEventHandler<HTMLButtonElement>;\n}) => {\n const { onLeave, onEnd } = props;\n const { t } = useI18n();\n return (\n <div className=\"str-video__end-call__confirmation\">\n <Button\n variant=\"secondary\"\n appearance=\"outline\"\n className=\"str-video__end-call__leave\"\n data-testid=\"leave-call-button\"\n onClick={onLeave}\n >\n <Icon icon=\"logout\" />\n {t('callControls.cancelCallButton.leaveCall.title', 'Leave call')}\n </Button>\n <Restricted requiredGrants={[OwnCapability.END_CALL]}>\n <Button\n variant=\"destructive\"\n className=\"str-video__end-call__end\"\n data-testid=\"end-call-for-all-button\"\n onClick={onEnd}\n >\n <Icon icon=\"call-end\" />\n {t(\n 'callControls.cancelCallButton.endCallForAll.label',\n 'End call for all',\n )}\n </Button>\n </Restricted>\n </div>\n );\n};\n\nconst CancelCallToggleMenuButton = forwardRef<\n HTMLButtonElement,\n ToggleMenuButtonProps\n>(function CancelCallToggleMenuButtonRender({ menuShown }, ref) {\n const { t } = useI18n();\n return (\n <WithTooltip\n title={t('callControls.cancelCallButton.leaveCall.title', 'Leave call')}\n tooltipDisabled={menuShown}\n >\n <IconButton\n icon={menuShown ? 'close' : 'call-end'}\n variant=\"destructive\"\n data-testid=\"leave-call-button\"\n ref={ref}\n />\n </WithTooltip>\n );\n});\n\nexport type CancelCallButtonProps = {\n disabled?: boolean;\n caption?: string;\n size?: ButtonProps['size'];\n onClick?: MouseEventHandler<HTMLButtonElement>;\n onLeave?: (err?: Error) => void;\n};\n\nexport const CancelCallConfirmButton = ({\n onClick,\n onLeave,\n}: CancelCallButtonProps) => {\n const call = useCall();\n\n const handleLeave: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n try {\n await call.leave();\n onLeave?.();\n } catch (err) {\n console.error(`Failed to leave call`, err);\n onLeave?.(err as Error);\n }\n }\n },\n [onClick, onLeave, call],\n );\n\n const handleEndCall: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n try {\n await call.endCall();\n onLeave?.();\n } catch (err) {\n console.error(`Failed to end call`, err);\n onLeave?.(err as Error);\n }\n }\n },\n [onClick, onLeave, call],\n );\n\n return (\n <MenuToggle placement=\"top-start\" ToggleButton={CancelCallToggleMenuButton}>\n <EndCallMenu onEnd={handleEndCall} onLeave={handleLeave} />\n </MenuToggle>\n );\n};\n\nexport const CancelCallButton = ({\n disabled,\n caption,\n size,\n onClick,\n onLeave,\n}: CancelCallButtonProps) => {\n const call = useCall();\n const { t } = useI18n();\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n async (e) => {\n if (onClick) {\n onClick(e);\n } else if (call) {\n try {\n await call.leave();\n onLeave?.();\n } catch (err) {\n console.error(`Failed to leave call`, err);\n onLeave?.(err as Error);\n }\n }\n },\n [onClick, onLeave, call],\n );\n return (\n <IconButton\n size={size}\n disabled={disabled}\n icon=\"call-end\"\n variant=\"destructive\"\n title={\n caption ??\n t('callControls.cancelCallButton.leaveCall.title', 'Leave call')\n }\n data-testid=\"cancel-call-button\"\n onClick={handleClick}\n />\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -2,10 +2,14 @@ import { jsx } from 'react/jsx-runtime';
2
2
  import { forwardRef } from 'react';
3
3
  import clsx from 'clsx';
4
4
  import { OwnCapability } from '@stream-io/video-client';
5
- import { useI18n, useCall, Restricted } from '@stream-io/video-react-bindings';
5
+ import { useCall, Restricted } from '@stream-io/video-react-bindings';
6
+ import '@stream-io/i18n';
7
+ import { useI18n } from '../../i18n/TranslationContext.js';
8
+ import '@stream-io/i18n/react';
6
9
  import { useMenuContext, MenuToggle, MenuVisualType } from '../Menu/MenuToggle.js';
7
- import { CompositeButton } from '../Button/CompositeButton.js';
10
+ import '../Button/Button.js';
8
11
  import '../Button/IconButton.js';
12
+ import { CompositeButton } from '../Button/CompositeButton.js';
9
13
  import { defaultEmojiReactionMap } from '../Reaction/Reaction.js';
10
14
  import { Icon } from '../Icon/Icon.js';
11
15
  import '@floating-ui/react';
@@ -43,7 +47,7 @@ const ReactionsButton = ({ reactions = defaultReactions, }) => {
43
47
  };
44
48
  const ToggleReactionsMenuButton = forwardRef(function ToggleReactionsMenuButtonRender({ menuShown }, ref) {
45
49
  const { t } = useI18n();
46
- return (jsx(WithTooltip, { title: t('Reactions'), tooltipDisabled: menuShown, children: jsx(CompositeButton, { ref: ref, active: menuShown, variant: "primary", children: jsx(Icon, { icon: "reactions" }) }) }));
50
+ return (jsx(WithTooltip, { title: t('callControls.reactionsButton.reactions.title', 'Reactions'), tooltipDisabled: menuShown, children: jsx(CompositeButton, { ref: ref, active: menuShown, children: jsx(Icon, { icon: "reactions" }) }) }));
47
51
  });
48
52
  const DefaultReactionsMenu = ({ reactions, layout = 'horizontal', }) => {
49
53
  const call = useCall();
@@ -1 +1 @@
1
- {"version":3,"file":"ReactionsButton.js","sources":["../../../../../../../src/components/CallControls/ReactionsButton.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport clsx from 'clsx';\n\nimport { OwnCapability, StreamReaction } from '@stream-io/video-client';\nimport { Restricted, useCall, useI18n } from '@stream-io/video-react-bindings';\n\nimport {\n MenuToggle,\n MenuVisualType,\n ToggleMenuButtonProps,\n useMenuContext,\n} from '../Menu';\nimport { CompositeButton } from '../Button';\nimport { defaultEmojiReactionMap } from '../Reaction';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\n\nexport const defaultReactions: StreamReaction[] = [\n {\n type: 'reaction',\n emoji_code: ':like:',\n },\n {\n // TODO OL: use `prompt` type?\n type: 'raised-hand',\n emoji_code: ':raise-hand:',\n },\n {\n type: 'reaction',\n emoji_code: ':fireworks:',\n },\n {\n type: 'reaction',\n emoji_code: ':dislike:',\n },\n {\n type: 'reaction',\n emoji_code: ':heart:',\n },\n {\n type: 'reaction',\n emoji_code: ':smile:',\n },\n];\n\nexport interface ReactionsButtonProps {\n reactions?: StreamReaction[];\n}\n\nexport const ReactionsButton = ({\n reactions = defaultReactions,\n}: ReactionsButtonProps) => {\n return (\n <Restricted requiredGrants={[OwnCapability.CREATE_REACTION]}>\n <MenuToggle\n placement=\"top\"\n ToggleButton={ToggleReactionsMenuButton}\n visualType={MenuVisualType.MENU}\n >\n <DefaultReactionsMenu reactions={reactions} />\n </MenuToggle>\n </Restricted>\n );\n};\n\nconst ToggleReactionsMenuButton = forwardRef<\n HTMLDivElement,\n ToggleMenuButtonProps\n>(function ToggleReactionsMenuButtonRender({ menuShown }, ref) {\n const { t } = useI18n();\n return (\n <WithTooltip title={t('Reactions')} tooltipDisabled={menuShown}>\n <CompositeButton ref={ref} active={menuShown} variant=\"primary\">\n <Icon icon=\"reactions\" />\n </CompositeButton>\n </WithTooltip>\n );\n});\n\nexport interface DefaultReactionsMenuProps {\n reactions: StreamReaction[];\n layout?: 'horizontal' | 'vertical';\n}\n\nexport const DefaultReactionsMenu = ({\n reactions,\n layout = 'horizontal',\n}: DefaultReactionsMenuProps) => {\n const call = useCall();\n const { close } = useMenuContext();\n return (\n <div\n className={clsx('str-video__reactions-menu', {\n 'str-video__reactions-menu--horizontal': layout === 'horizontal',\n 'str-video__reactions-menu--vertical': layout === 'vertical',\n })}\n >\n {reactions.map((reaction) => (\n <button\n key={reaction.emoji_code}\n type=\"button\"\n className=\"str-video__reactions-menu__button\"\n onClick={() => {\n call?.sendReaction(reaction);\n close?.();\n }}\n >\n {reaction.emoji_code && defaultEmojiReactionMap[reaction.emoji_code]}\n </button>\n ))}\n </div>\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;;;;;;;;AAiBO,MAAM,gBAAgB,GAAqB;AAChD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,QAAQ;AACrB,KAAA;AACD,IAAA;;AAEE,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,UAAU,EAAE,cAAc;AAC3B,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,aAAa;AAC1B,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,WAAW;AACxB,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,SAAS;AACtB,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,SAAS;AACtB,KAAA;;AAOI,MAAM,eAAe,GAAG,CAAC,EAC9B,SAAS,GAAG,gBAAgB,GACP,KAAI;AACzB,IAAA,QACEA,GAAA,CAAC,UAAU,EAAA,EAAC,cAAc,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,EAAA,QAAA,EACzDA,GAAA,CAAC,UAAU,EAAA,EACT,SAAS,EAAC,KAAK,EACf,YAAY,EAAE,yBAAyB,EACvC,UAAU,EAAE,cAAc,CAAC,IAAI,EAAA,QAAA,EAE/BA,GAAA,CAAC,oBAAoB,EAAA,EAAC,SAAS,EAAE,SAAS,GAAI,EAAA,CACnC,EAAA,CACF;AAEjB;AAEA,MAAM,yBAAyB,GAAG,UAAU,CAG1C,SAAS,+BAA+B,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,EAAA;AAC3D,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE;AACvB,IAAA,QACEA,GAAA,CAAC,WAAW,IAAC,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,eAAe,EAAE,SAAS,YAC5DA,GAAA,CAAC,eAAe,IAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAC,SAAS,EAAA,QAAA,EAC7DA,GAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAC,WAAW,GAAG,EAAA,CACT,EAAA,CACN;AAElB,CAAC,CAAC;AAOK,MAAM,oBAAoB,GAAG,CAAC,EACnC,SAAS,EACT,MAAM,GAAG,YAAY,GACK,KAAI;AAC9B,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE;AACtB,IAAA,MAAM,EAAE,KAAK,EAAE,GAAG,cAAc,EAAE;AAClC,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,IAAI,CAAC,2BAA2B,EAAE;YAC3C,uCAAuC,EAAE,MAAM,KAAK,YAAY;YAChE,qCAAqC,EAAE,MAAM,KAAK,UAAU;SAC7D,CAAC,EAAA,QAAA,EAED,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,MACtBA,gBAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mCAAmC,EAC7C,OAAO,EAAE,MAAK;AACZ,gBAAA,IAAI,EAAE,YAAY,CAAC,QAAQ,CAAC;gBAC5B,KAAK,IAAI;YACX,CAAC,EAAA,QAAA,EAEA,QAAQ,CAAC,UAAU,IAAI,uBAAuB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAA,EAR/D,QAAQ,CAAC,UAAU,CASjB,CACV,CAAC,EAAA,CACE;AAEV;;;;"}
1
+ {"version":3,"file":"ReactionsButton.js","sources":["../../../../../../../src/components/CallControls/ReactionsButton.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport clsx from 'clsx';\n\nimport { OwnCapability, StreamReaction } from '@stream-io/video-client';\nimport { Restricted, useCall } from '@stream-io/video-react-bindings';\nimport { useI18n } from '../../i18n';\n\nimport {\n MenuToggle,\n MenuVisualType,\n ToggleMenuButtonProps,\n useMenuContext,\n} from '../Menu';\nimport { CompositeButton } from '../Button';\nimport { defaultEmojiReactionMap } from '../Reaction';\nimport { Icon } from '../Icon';\nimport { WithTooltip } from '../Tooltip';\n\nexport const defaultReactions: StreamReaction[] = [\n {\n type: 'reaction',\n emoji_code: ':like:',\n },\n {\n // TODO OL: use `prompt` type?\n type: 'raised-hand',\n emoji_code: ':raise-hand:',\n },\n {\n type: 'reaction',\n emoji_code: ':fireworks:',\n },\n {\n type: 'reaction',\n emoji_code: ':dislike:',\n },\n {\n type: 'reaction',\n emoji_code: ':heart:',\n },\n {\n type: 'reaction',\n emoji_code: ':smile:',\n },\n];\n\nexport interface ReactionsButtonProps {\n reactions?: StreamReaction[];\n}\n\nexport const ReactionsButton = ({\n reactions = defaultReactions,\n}: ReactionsButtonProps) => {\n return (\n <Restricted requiredGrants={[OwnCapability.CREATE_REACTION]}>\n <MenuToggle\n placement=\"top\"\n ToggleButton={ToggleReactionsMenuButton}\n visualType={MenuVisualType.MENU}\n >\n <DefaultReactionsMenu reactions={reactions} />\n </MenuToggle>\n </Restricted>\n );\n};\n\nconst ToggleReactionsMenuButton = forwardRef<\n HTMLDivElement,\n ToggleMenuButtonProps\n>(function ToggleReactionsMenuButtonRender({ menuShown }, ref) {\n const { t } = useI18n();\n return (\n <WithTooltip\n title={t('callControls.reactionsButton.reactions.title', 'Reactions')}\n tooltipDisabled={menuShown}\n >\n <CompositeButton ref={ref} active={menuShown}>\n <Icon icon=\"reactions\" />\n </CompositeButton>\n </WithTooltip>\n );\n});\n\nexport interface DefaultReactionsMenuProps {\n reactions: StreamReaction[];\n layout?: 'horizontal' | 'vertical';\n}\n\nexport const DefaultReactionsMenu = ({\n reactions,\n layout = 'horizontal',\n}: DefaultReactionsMenuProps) => {\n const call = useCall();\n const { close } = useMenuContext();\n return (\n <div\n className={clsx('str-video__reactions-menu', {\n 'str-video__reactions-menu--horizontal': layout === 'horizontal',\n 'str-video__reactions-menu--vertical': layout === 'vertical',\n })}\n >\n {reactions.map((reaction) => (\n <button\n key={reaction.emoji_code}\n type=\"button\"\n className=\"str-video__reactions-menu__button\"\n onClick={() => {\n call?.sendReaction(reaction);\n close?.();\n }}\n >\n {reaction.emoji_code && defaultEmojiReactionMap[reaction.emoji_code]}\n </button>\n ))}\n </div>\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;;;;;;;;;;;;AAkBO,MAAM,gBAAgB,GAAqB;AAChD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,QAAQ;AACrB,KAAA;AACD,IAAA;;AAEE,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,UAAU,EAAE,cAAc;AAC3B,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,aAAa;AAC1B,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,WAAW;AACxB,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,SAAS;AACtB,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,UAAU,EAAE,SAAS;AACtB,KAAA;;AAOI,MAAM,eAAe,GAAG,CAAC,EAC9B,SAAS,GAAG,gBAAgB,GACP,KAAI;AACzB,IAAA,QACEA,GAAA,CAAC,UAAU,EAAA,EAAC,cAAc,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,EAAA,QAAA,EACzDA,GAAA,CAAC,UAAU,EAAA,EACT,SAAS,EAAC,KAAK,EACf,YAAY,EAAE,yBAAyB,EACvC,UAAU,EAAE,cAAc,CAAC,IAAI,EAAA,QAAA,EAE/BA,GAAA,CAAC,oBAAoB,EAAA,EAAC,SAAS,EAAE,SAAS,GAAI,EAAA,CACnC,EAAA,CACF;AAEjB;AAEA,MAAM,yBAAyB,GAAG,UAAU,CAG1C,SAAS,+BAA+B,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,EAAA;AAC3D,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE;AACvB,IAAA,QACEA,GAAA,CAAC,WAAW,EAAA,EACV,KAAK,EAAE,CAAC,CAAC,8CAA8C,EAAE,WAAW,CAAC,EACrE,eAAe,EAAE,SAAS,YAE1BA,GAAA,CAAC,eAAe,EAAA,EAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAA,QAAA,EAC1CA,GAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAC,WAAW,GAAG,EAAA,CACT,EAAA,CACN;AAElB,CAAC,CAAC;AAOK,MAAM,oBAAoB,GAAG,CAAC,EACnC,SAAS,EACT,MAAM,GAAG,YAAY,GACK,KAAI;AAC9B,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE;AACtB,IAAA,MAAM,EAAE,KAAK,EAAE,GAAG,cAAc,EAAE;AAClC,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,IAAI,CAAC,2BAA2B,EAAE;YAC3C,uCAAuC,EAAE,MAAM,KAAK,YAAY;YAChE,qCAAqC,EAAE,MAAM,KAAK,UAAU;SAC7D,CAAC,EAAA,QAAA,EAED,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,MACtBA,gBAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mCAAmC,EAC7C,OAAO,EAAE,MAAK;AACZ,gBAAA,IAAI,EAAE,YAAY,CAAC,QAAQ,CAAC;gBAC5B,KAAK,IAAI;YACX,CAAC,EAAA,QAAA,EAEA,QAAQ,CAAC,UAAU,IAAI,uBAAuB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAA,EAR/D,QAAQ,CAAC,UAAU,CASjB,CACV,CAAC,EAAA,CACE;AAEV;;;;"}
@@ -1,9 +1,13 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { forwardRef } from 'react';
3
3
  import { OwnCapability } from '@stream-io/video-client';
4
- import { useI18n, useToggleCallRecording, Restricted } from '@stream-io/video-react-bindings';
5
- import { CompositeButton } from '../Button/CompositeButton.js';
4
+ import { useToggleCallRecording, Restricted } from '@stream-io/video-react-bindings';
5
+ import '@stream-io/i18n';
6
+ import { useI18n } from '../../i18n/TranslationContext.js';
7
+ import '@stream-io/i18n/react';
8
+ import { Button } from '../Button/Button.js';
6
9
  import '../Button/IconButton.js';
10
+ import { CompositeButton } from '../Button/CompositeButton.js';
7
11
  import { Icon } from '../Icon/Icon.js';
8
12
  import { MenuToggle, MenuVisualType, useMenuContext } from '../Menu/MenuToggle.js';
9
13
  import { LoadingIndicator } from '../LoadingIndicator/LoadingIndicator.js';
@@ -17,10 +21,10 @@ const RecordEndConfirmation = (props) => {
17
21
  const { toggleCallRecording, isAwaitingResponse } = useToggleCallRecording();
18
22
  const { close } = useMenuContext();
19
23
  const handleClick = createCallControlHandler(props, toggleCallRecording);
20
- return (jsxs("div", { className: "str-video__end-recording__confirmation", children: [jsxs("div", { className: "str-video__end-recording__header", children: [jsx(Icon, { icon: "recording-on" }), jsx("h2", { className: "str-video__end-recording__heading", children: t('End recording') })] }), jsx("p", { className: "str-video__end-recording__description", children: t('Are you sure you want end the recording?') }), jsxs("div", { className: "str-video__end-recording__actions", children: [jsx(CompositeButton, { variant: "secondary", onClick: close, children: t('Cancel') }), jsx(CompositeButton, { variant: "primary", onClick: isAwaitingResponse ? undefined : handleClick, children: isAwaitingResponse ? jsx(LoadingIndicator, {}) : t('End recording') })] })] }));
24
+ return (jsxs("div", { className: "str-video__end-recording__confirmation", children: [jsxs("div", { className: "str-video__end-recording__header", children: [jsx(Icon, { icon: "recording-on" }), jsxs("div", { className: "str-video__end-recording__text", children: [jsx("h2", { className: "str-video__end-recording__heading", children: t('callControls.recordCallButton.endRecording.title', 'End recording') }), jsx("p", { className: "str-video__end-recording__description", children: t('callControls.recordCallButton.confirmEndRecording.description', 'Are you sure you want end the recording?') })] })] }), jsxs("div", { className: "str-video__end-recording__actions", children: [jsx(Button, { variant: "destructive", onClick: isAwaitingResponse ? undefined : handleClick, children: isAwaitingResponse ? (jsx(LoadingIndicator, {})) : (t('callControls.recordCallButton.endRecording.title', 'End recording')) }), jsx(Button, { variant: "secondary", appearance: "outline", onClick: close, children: t('common.cancel.label', 'Cancel') })] })] }));
21
25
  };
22
26
  const ToggleEndRecordingMenuButton = forwardRef(function ToggleEndRecordingMenuButtonRender(props, ref) {
23
- return (jsx(CompositeButton, { ref: ref, active: true, variant: "secondary", "data-testid": "recording-stop-button", children: jsx(Icon, { icon: "recording-off" }) }));
27
+ return (jsx(CompositeButton, { ref: ref, active: true, variant: "destructive", "data-testid": "recording-stop-button", children: jsx(Icon, { icon: "recording-off" }) }));
24
28
  });
25
29
  const RecordCallConfirmationButton = (props) => {
26
30
  const { caption } = props;
@@ -34,28 +38,30 @@ const RecordCallConfirmationButton = (props) => {
34
38
  ], children: jsx(MenuToggle, { ToggleButton: ToggleEndRecordingMenuButton, visualType: MenuVisualType.PORTAL, children: jsx(RecordEndConfirmation, { onError: props.onError }) }) }));
35
39
  }
36
40
  const title = isAwaitingResponse
37
- ? t('Waiting for recording to start...')
38
- : (caption ?? t('Record call'));
41
+ ? t('callControls.recordCallButton.waitingRecordingStart.title', 'Waiting for recording to start...')
42
+ : (caption ??
43
+ t('callControls.recordCallButton.recordCall.title', 'Record call'));
39
44
  return (jsx(Restricted, { requiredGrants: [
40
45
  OwnCapability.START_RECORD_CALL,
41
46
  OwnCapability.STOP_RECORD_CALL,
42
- ], children: jsx(WithTooltip, { title: title, children: jsx(CompositeButton, { active: isCallRecordingInProgress, caption: caption, variant: "secondary", "data-testid": "recording-start-button", onClick: isAwaitingResponse ? undefined : handleClick, children: isAwaitingResponse ? (jsx(LoadingIndicator, {})) : (jsx(Icon, { icon: "recording-off" })) }) }) }));
47
+ ], children: jsx(WithTooltip, { title: title, children: jsx(CompositeButton, { active: isCallRecordingInProgress, caption: caption, variant: isCallRecordingInProgress ? 'destructive' : 'secondary', "data-testid": "recording-start-button", onClick: isAwaitingResponse ? undefined : handleClick, children: isAwaitingResponse ? (jsx(LoadingIndicator, {})) : (jsx(Icon, { icon: "recording-off" })) }) }) }));
43
48
  };
44
49
  const RecordCallButton = (props) => {
45
50
  const { caption } = props;
46
51
  const { t } = useI18n();
47
52
  const { toggleCallRecording, isAwaitingResponse, isCallRecordingInProgress } = useToggleCallRecording();
48
53
  const handleClick = createCallControlHandler(props, toggleCallRecording);
49
- let title = caption ?? t('Record call');
54
+ let title = caption ??
55
+ t('callControls.recordCallButton.recordCall.title', 'Record call');
50
56
  if (isAwaitingResponse) {
51
57
  title = isCallRecordingInProgress
52
- ? t('Waiting for recording to stop...')
53
- : t('Waiting for recording to start...');
58
+ ? t('callControls.recordCallButton.waitingRecordingStop.title', 'Waiting for recording to stop...')
59
+ : t('callControls.recordCallButton.waitingRecordingStart.title', 'Waiting for recording to start...');
54
60
  }
55
61
  return (jsx(Restricted, { requiredGrants: [
56
62
  OwnCapability.START_RECORD_CALL,
57
63
  OwnCapability.STOP_RECORD_CALL,
58
- ], children: jsx(CompositeButton, { active: isCallRecordingInProgress, caption: caption, variant: "secondary", "data-testid": isCallRecordingInProgress
64
+ ], children: jsx(CompositeButton, { active: isCallRecordingInProgress, caption: caption, variant: isCallRecordingInProgress ? 'destructive' : 'secondary', "data-testid": isCallRecordingInProgress
59
65
  ? 'recording-stop-button'
60
66
  : 'recording-start-button', title: title, onClick: isAwaitingResponse ? undefined : handleClick, children: isAwaitingResponse ? (jsx(LoadingIndicator, {})) : (jsx(Icon, { icon: isCallRecordingInProgress ? 'recording-on' : 'recording-off' })) }) }));
61
67
  };