@stream-io/video-react-sdk 2.0.0-beta.0 → 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 +24 -0
  2. package/dist/css/embedded.css +2592 -1498
  3. package/dist/css/embedded.css.map +1 -1
  4. package/dist/css/styles.css +2388 -1222
  5. package/dist/css/styles.css.map +1 -1
  6. package/dist/embedded.cjs.js +535 -476
  7. package/dist/embedded.cjs.js.map +1 -1
  8. package/dist/esm/index.js +10 -7
  9. package/dist/esm/index.js.map +1 -1
  10. package/dist/esm/src/components/Avatar/Avatar.js +13 -5
  11. package/dist/esm/src/components/Avatar/Avatar.js.map +1 -1
  12. package/dist/esm/src/components/Badge/Badge.js +21 -0
  13. package/dist/esm/src/components/Badge/Badge.js.map +1 -0
  14. package/dist/esm/src/components/Button/Button.js +10 -0
  15. package/dist/esm/src/components/Button/Button.js.map +1 -0
  16. package/dist/esm/src/components/Button/CompositeButton.js +10 -17
  17. package/dist/esm/src/components/Button/CompositeButton.js.map +1 -1
  18. package/dist/esm/src/components/Button/IconButton.js +3 -9
  19. package/dist/esm/src/components/Button/IconButton.js.map +1 -1
  20. package/dist/esm/src/components/CallControls/AcceptCallButton.js +3 -2
  21. package/dist/esm/src/components/CallControls/AcceptCallButton.js.map +1 -1
  22. package/dist/esm/src/components/CallControls/CallControls.js +3 -0
  23. package/dist/esm/src/components/CallControls/CallControls.js.map +1 -1
  24. package/dist/esm/src/components/CallControls/CancelCallButton.js +11 -6
  25. package/dist/esm/src/components/CallControls/CancelCallButton.js.map +1 -1
  26. package/dist/esm/src/components/CallControls/ReactionsButton.js +7 -3
  27. package/dist/esm/src/components/CallControls/ReactionsButton.js.map +1 -1
  28. package/dist/esm/src/components/CallControls/RecordCallButton.js +17 -11
  29. package/dist/esm/src/components/CallControls/RecordCallButton.js.map +1 -1
  30. package/dist/esm/src/components/CallControls/ScreenShareButton.js +11 -4
  31. package/dist/esm/src/components/CallControls/ScreenShareButton.js.map +1 -1
  32. package/dist/esm/src/components/CallControls/ToggleAudioButton.js +28 -17
  33. package/dist/esm/src/components/CallControls/ToggleAudioButton.js.map +1 -1
  34. package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js +9 -4
  35. package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js.map +1 -1
  36. package/dist/esm/src/components/CallControls/ToggleVideoButton.js +32 -23
  37. package/dist/esm/src/components/CallControls/ToggleVideoButton.js.map +1 -1
  38. package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js +3 -3
  39. package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js.map +1 -1
  40. package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js +8 -3
  41. package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js.map +1 -1
  42. package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js +20 -7
  43. package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js.map +1 -1
  44. package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js +8 -5
  45. package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js.map +1 -1
  46. package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js +5 -2
  47. package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js.map +1 -1
  48. package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js +7 -3
  49. package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js.map +1 -1
  50. package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js +1 -1
  51. package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js.map +1 -1
  52. package/dist/esm/src/components/DeviceSettings/DeviceSelector.js +1 -1
  53. package/dist/esm/src/components/DeviceSettings/DeviceSelector.js.map +1 -1
  54. package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js +2 -2
  55. package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js.map +1 -1
  56. package/dist/esm/src/components/DeviceSettings/DeviceSettings.js +8 -5
  57. package/dist/esm/src/components/DeviceSettings/DeviceSettings.js.map +1 -1
  58. package/dist/esm/src/components/DeviceSettings/SpeakerTest.js +10 -4
  59. package/dist/esm/src/components/DeviceSettings/SpeakerTest.js.map +1 -1
  60. package/dist/esm/src/components/DropdownSelect/DropdownSelect.js +1 -1
  61. package/dist/esm/src/components/DropdownSelect/DropdownSelect.js.map +1 -1
  62. package/dist/esm/src/components/Menu/GenericMenu.js +2 -1
  63. package/dist/esm/src/components/Menu/GenericMenu.js.map +1 -1
  64. package/dist/esm/src/components/Menu/MenuToggle.js +3 -0
  65. package/dist/esm/src/components/Menu/MenuToggle.js.map +1 -1
  66. package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js +6 -3
  67. package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js.map +1 -1
  68. package/dist/esm/src/components/Notification/Notification.js +12 -3
  69. package/dist/esm/src/components/Notification/Notification.js.map +1 -1
  70. package/dist/esm/src/components/Notification/PermissionNotification.js +2 -2
  71. package/dist/esm/src/components/Notification/PermissionNotification.js.map +1 -1
  72. package/dist/esm/src/components/Notification/RecordingInProgressNotification.js +7 -3
  73. package/dist/esm/src/components/Notification/RecordingInProgressNotification.js.map +1 -1
  74. package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js +7 -2
  75. package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js.map +1 -1
  76. package/dist/esm/src/components/Permissions/PermissionRequests.js +13 -12
  77. package/dist/esm/src/components/Permissions/PermissionRequests.js.map +1 -1
  78. package/dist/esm/src/components/RingingCall/RingingCall.js +38 -14
  79. package/dist/esm/src/components/RingingCall/RingingCall.js.map +1 -1
  80. package/dist/esm/src/components/RingingCall/RingingCallControls.js +7 -3
  81. package/dist/esm/src/components/RingingCall/RingingCallControls.js.map +1 -1
  82. package/dist/esm/src/components/Search/SearchInput.js +1 -1
  83. package/dist/esm/src/components/Search/SearchInput.js.map +1 -1
  84. package/dist/esm/src/components/StreamTheme/StreamTheme.js +2 -2
  85. package/dist/esm/src/components/StreamTheme/StreamTheme.js.map +1 -1
  86. package/dist/esm/src/components/Tooltip/Tooltip.js +8 -8
  87. package/dist/esm/src/components/Tooltip/Tooltip.js.map +1 -1
  88. package/dist/esm/src/components/VideoPreview/VideoPreview.js +36 -5
  89. package/dist/esm/src/components/VideoPreview/VideoPreview.js.map +1 -1
  90. package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js +38 -12
  91. package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js.map +1 -1
  92. package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js +9 -5
  93. package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js.map +1 -1
  94. package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js +9 -6
  95. package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js.map +1 -1
  96. package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js +9 -6
  97. package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js.map +1 -1
  98. package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js +11 -6
  99. package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js.map +1 -1
  100. package/dist/esm/src/core/components/ParticipantView/ConnectionQualityIndicator.js +25 -0
  101. package/dist/esm/src/core/components/ParticipantView/ConnectionQualityIndicator.js.map +1 -0
  102. package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js +17 -13
  103. package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js.map +1 -1
  104. package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js +13 -8
  105. package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js.map +1 -1
  106. package/dist/esm/src/core/components/StreamVideo/StreamVideo.js +24 -3
  107. package/dist/esm/src/core/components/StreamVideo/StreamVideo.js.map +1 -1
  108. package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js +3 -13
  109. package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js.map +1 -1
  110. package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js +4 -2
  111. package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js.map +1 -1
  112. package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js +4 -2
  113. package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js.map +1 -1
  114. package/dist/esm/src/embedded/EmbeddedClientProvider.js +7 -4
  115. package/dist/esm/src/embedded/EmbeddedClientProvider.js.map +1 -1
  116. package/dist/esm/src/embedded/call/CallControls.js +10 -6
  117. package/dist/esm/src/embedded/call/CallControls.js.map +1 -1
  118. package/dist/esm/src/embedded/call/CallHeader.js +10 -7
  119. package/dist/esm/src/embedded/call/CallHeader.js.map +1 -1
  120. package/dist/esm/src/embedded/call/CallLayout.js +8 -5
  121. package/dist/esm/src/embedded/call/CallLayout.js.map +1 -1
  122. package/dist/esm/src/embedded/call/CallStateRouter.js +7 -4
  123. package/dist/esm/src/embedded/call/CallStateRouter.js.map +1 -1
  124. package/dist/esm/src/embedded/hooks/useLayout.js +7 -4
  125. package/dist/esm/src/embedded/hooks/useLayout.js.map +1 -1
  126. package/dist/esm/src/embedded/livestream/host/HostLayout.js +12 -7
  127. package/dist/esm/src/embedded/livestream/host/HostLayout.js.map +1 -1
  128. package/dist/esm/src/embedded/livestream/host/HostStateRouter.js +12 -7
  129. package/dist/esm/src/embedded/livestream/host/HostStateRouter.js.map +1 -1
  130. package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js +9 -6
  131. package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js.map +1 -1
  132. package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js +12 -9
  133. package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js.map +1 -1
  134. package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js +7 -4
  135. package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js.map +1 -1
  136. package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js +13 -9
  137. package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js.map +1 -1
  138. package/dist/esm/src/embedded/shared/CallDuration/CallDuration.js +40 -0
  139. package/dist/esm/src/embedded/shared/CallDuration/CallDuration.js.map +1 -0
  140. package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js +8 -6
  141. package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js.map +1 -1
  142. package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js +26 -2
  143. package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js.map +1 -1
  144. package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js +12 -6
  145. package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js.map +1 -1
  146. package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js +8 -6
  147. package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js.map +1 -1
  148. package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js +15 -14
  149. package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js.map +1 -1
  150. package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js +4 -0
  151. package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js.map +1 -1
  152. package/dist/esm/src/embedded/shared/JoinError/JoinError.js +8 -6
  153. package/dist/esm/src/embedded/shared/JoinError/JoinError.js.map +1 -1
  154. package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js +11 -7
  155. package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js.map +1 -1
  156. package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js +6 -4
  157. package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js.map +1 -1
  158. package/dist/esm/src/embedded/shared/Lobby/Lobby.js +10 -9
  159. package/dist/esm/src/embedded/shared/Lobby/Lobby.js.map +1 -1
  160. package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js +6 -4
  161. package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js.map +1 -1
  162. package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js +8 -6
  163. package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js.map +1 -1
  164. package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js +11 -9
  165. package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js.map +1 -1
  166. package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js +6 -4
  167. package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js.map +1 -1
  168. package/dist/esm/src/hooks/useDeviceList.js +4 -2
  169. package/dist/esm/src/hooks/useDeviceList.js.map +1 -1
  170. package/dist/esm/src/i18n/Streami18n.js +58 -0
  171. package/dist/esm/src/i18n/Streami18n.js.map +1 -0
  172. package/dist/esm/src/i18n/TranslationContext.js +42 -0
  173. package/dist/esm/src/i18n/TranslationContext.js.map +1 -0
  174. package/dist/esm/src/i18n/runtimeDefaults.js +20 -0
  175. package/dist/esm/src/i18n/runtimeDefaults.js.map +1 -0
  176. package/dist/esm/src/i18n/useStreami18n.js +49 -0
  177. package/dist/esm/src/i18n/useStreami18n.js.map +1 -0
  178. package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js +4 -0
  179. package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js.map +1 -1
  180. package/dist/index.cjs.js +559 -623
  181. package/dist/index.cjs.js.map +1 -1
  182. package/dist/index.d.ts +1 -1
  183. package/dist/src/components/Avatar/Avatar.d.ts +9 -4
  184. package/dist/src/components/Badge/Badge.d.ts +23 -0
  185. package/dist/src/components/Badge/index.d.ts +1 -0
  186. package/dist/src/components/Button/Button.d.ts +16 -0
  187. package/dist/src/components/Button/CompositeButton.d.ts +6 -3
  188. package/dist/src/components/Button/IconButton.d.ts +7 -7
  189. package/dist/src/components/Button/index.d.ts +2 -2
  190. package/dist/src/components/CallControls/CancelCallButton.d.ts +3 -1
  191. package/dist/src/components/CallControls/ToggleAudioButton.d.ts +3 -3
  192. package/dist/src/components/CallControls/ToggleAudioOutputButton.d.ts +2 -2
  193. package/dist/src/components/CallControls/ToggleVideoButton.d.ts +3 -3
  194. package/dist/src/components/CallControls/index.d.ts +0 -1
  195. package/dist/src/components/Menu/GenericMenu.d.ts +1 -0
  196. package/dist/src/components/Notification/Notification.d.ts +2 -1
  197. package/dist/src/components/StreamTheme/StreamTheme.d.ts +2 -1
  198. package/dist/src/components/VideoPreview/VideoPreview.d.ts +6 -1
  199. package/dist/src/components/index.d.ts +1 -1
  200. package/dist/src/core/components/ParticipantView/ConnectionQualityIndicator.d.ts +10 -0
  201. package/dist/src/core/components/ParticipantView/index.d.ts +1 -0
  202. package/dist/src/core/components/StreamVideo/StreamVideo.d.ts +18 -2
  203. package/dist/src/embedded/shared/CallDuration/CallDuration.d.ts +9 -0
  204. package/dist/src/embedded/shared/index.d.ts +1 -0
  205. package/dist/src/i18n/Streami18n.d.ts +56 -0
  206. package/dist/src/i18n/TranslationContext.d.ts +30 -0
  207. package/dist/src/i18n/index.d.ts +16 -0
  208. package/dist/src/i18n/keys.d.ts +164 -0
  209. package/dist/src/i18n/runtimeDefaults.d.ts +17 -0
  210. package/dist/src/i18n/types.d.ts +45 -0
  211. package/dist/src/i18n/useStreami18n.d.ts +19 -0
  212. package/index.ts +1 -1
  213. package/package.json +18 -13
  214. package/src/components/Avatar/Avatar.tsx +53 -19
  215. package/src/components/Badge/Badge.tsx +48 -0
  216. package/src/components/Badge/index.ts +1 -0
  217. package/src/components/Button/Button.tsx +49 -0
  218. package/src/components/Button/CompositeButton.tsx +82 -73
  219. package/src/components/Button/IconButton.tsx +19 -29
  220. package/src/components/Button/index.ts +2 -2
  221. package/src/components/CallControls/AcceptCallButton.tsx +3 -1
  222. package/src/components/CallControls/CancelCallButton.tsx +32 -24
  223. package/src/components/CallControls/ReactionsButton.tsx +7 -3
  224. package/src/components/CallControls/RecordCallButton.tsx +50 -23
  225. package/src/components/CallControls/ScreenShareButton.tsx +27 -6
  226. package/src/components/CallControls/ToggleAudioButton.tsx +62 -61
  227. package/src/components/CallControls/ToggleAudioOutputButton.tsx +7 -4
  228. package/src/components/CallControls/ToggleVideoButton.tsx +66 -66
  229. package/src/components/CallControls/index.ts +0 -1
  230. package/src/components/CallParticipantsList/BlockedUserListing.tsx +9 -2
  231. package/src/components/CallParticipantsList/CallParticipantListHeader.tsx +10 -3
  232. package/src/components/CallParticipantsList/CallParticipantListingItem.tsx +33 -8
  233. package/src/components/CallParticipantsList/CallParticipantsList.tsx +21 -5
  234. package/src/components/CallParticipantsList/EmptyParticipantSearchList.tsx +2 -2
  235. package/src/components/CallRecordingList/CallRecordingListHeader.tsx +11 -3
  236. package/src/components/DeviceSettings/DeviceAudioPreviewItem.tsx +3 -1
  237. package/src/components/DeviceSettings/DeviceSelector.tsx +1 -1
  238. package/src/components/DeviceSettings/DeviceSelectorAudio.tsx +2 -7
  239. package/src/components/DeviceSettings/DeviceSettings.tsx +14 -5
  240. package/src/components/DeviceSettings/SpeakerTest.tsx +7 -2
  241. package/src/components/DropdownSelect/DropdownSelect.tsx +3 -1
  242. package/src/components/Menu/GenericMenu.tsx +4 -0
  243. package/src/components/Notification/MicCaptureErrorNotification.tsx +7 -2
  244. package/src/components/Notification/Notification.tsx +20 -4
  245. package/src/components/Notification/PermissionNotification.tsx +2 -0
  246. package/src/components/Notification/RecordingInProgressNotification.tsx +5 -6
  247. package/src/components/Notification/SpeakingWhileMutedNotification.tsx +8 -2
  248. package/src/components/Permissions/PermissionRequests.tsx +50 -43
  249. package/src/components/RingingCall/RingingCall.tsx +40 -14
  250. package/src/components/RingingCall/RingingCallControls.tsx +2 -1
  251. package/src/components/Search/SearchInput.tsx +2 -3
  252. package/src/components/StreamTheme/StreamTheme.tsx +3 -1
  253. package/src/components/Tooltip/Tooltip.tsx +3 -10
  254. package/src/components/VideoPreview/VideoPreview.tsx +50 -5
  255. package/src/components/index.ts +1 -1
  256. package/src/core/components/CallLayout/LivestreamLayout.tsx +48 -18
  257. package/src/core/components/CallLayout/PaginatedGridLayout.tsx +14 -0
  258. package/src/core/components/CallLayout/PipLayout/Grid.tsx +10 -2
  259. package/src/core/components/CallLayout/PipLayout/Pip.tsx +6 -2
  260. package/src/core/components/CallLayout/SpeakerLayout.tsx +27 -0
  261. package/src/core/components/CallLayout/partcipantFilter.test.ts +38 -31
  262. package/src/core/components/ParticipantView/ConnectionQualityIndicator.tsx +54 -0
  263. package/src/core/components/ParticipantView/DefaultParticipantViewUI.tsx +60 -27
  264. package/src/core/components/ParticipantView/ParticipantActionsContextMenu.tsx +63 -22
  265. package/src/core/components/ParticipantView/index.ts +1 -0
  266. package/src/core/components/StreamVideo/StreamVideo.tsx +39 -4
  267. package/src/core/components/Video/BaseVideoPlaceholder.tsx +13 -30
  268. package/src/core/components/Video/DefaultPictureInPicturePlaceholder.tsx +5 -2
  269. package/src/core/components/Video/DefaultVideoPlaceholder.tsx +2 -2
  270. package/src/embedded/call/CallControls.tsx +9 -18
  271. package/src/embedded/call/CallHeader.tsx +3 -12
  272. package/src/embedded/call/CallLayout.tsx +1 -1
  273. package/src/embedded/livestream/host/HostLayout.tsx +26 -20
  274. package/src/embedded/livestream/host/HostStateRouter.tsx +12 -8
  275. package/src/embedded/livestream/viewer/ViewerLayout.tsx +8 -11
  276. package/src/embedded/livestream/viewer/ViewerLobby.tsx +31 -15
  277. package/src/embedded/shared/BlurToggleButton/BlurToggleButton.tsx +18 -12
  278. package/src/embedded/shared/CallDuration/CallDuration.tsx +32 -0
  279. package/src/embedded/shared/CallFeedback/CallEndedScreen.tsx +27 -13
  280. package/src/embedded/shared/CallFeedback/RatingScreen.tsx +20 -12
  281. package/src/embedded/shared/CallFeedback/StarRating.tsx +10 -3
  282. package/src/embedded/shared/CallFeedback/ThankYouScreen.tsx +6 -3
  283. package/src/embedded/shared/ConnectionNotification/ConnectionNotification.tsx +21 -14
  284. package/src/embedded/shared/JoinError/JoinError.tsx +7 -6
  285. package/src/embedded/shared/Lobby/DeviceControls.tsx +25 -3
  286. package/src/embedded/shared/Lobby/Lobby.tsx +19 -22
  287. package/src/embedded/shared/Lobby/ToggleMicButton.tsx +10 -3
  288. package/src/embedded/shared/Lobby/VideoPreviewFallbacks.tsx +4 -2
  289. package/src/embedded/shared/index.ts +1 -0
  290. package/src/hooks/useDeviceList.tsx +2 -2
  291. package/src/i18n/Streami18n.ts +67 -0
  292. package/src/i18n/TranslationContext.tsx +55 -0
  293. package/src/i18n/index.ts +22 -0
  294. package/src/i18n/keys.ts +169 -0
  295. package/src/i18n/runtimeDefaults.ts +17 -0
  296. package/src/i18n/types.ts +78 -0
  297. package/src/i18n/useStreami18n.ts +66 -0
  298. package/src/utilities/filter.test.ts +132 -124
  299. package/src/utilities/normalizeString.test.ts +50 -48
  300. package/dist/embedded-CallStatsLatencyChart-CpL1M_s0.cjs.js +0 -59
  301. package/dist/embedded-CallStatsLatencyChart-CpL1M_s0.cjs.js.map +0 -1
  302. package/dist/esm/src/components/Button/TextButton.js +0 -8
  303. package/dist/esm/src/components/Button/TextButton.js.map +0 -1
  304. package/dist/esm/src/components/CallControls/CallStatsButton.js +0 -18
  305. package/dist/esm/src/components/CallControls/CallStatsButton.js.map +0 -1
  306. package/dist/esm/src/components/CallStats/CallStats.js +0 -180
  307. package/dist/esm/src/components/CallStats/CallStats.js.map +0 -1
  308. package/dist/esm/src/components/CallStats/CallStatsLatencyChart.js +0 -57
  309. package/dist/esm/src/components/CallStats/CallStatsLatencyChart.js.map +0 -1
  310. package/dist/esm/src/translations/en.json.js +0 -177
  311. package/dist/esm/src/translations/en.json.js.map +0 -1
  312. package/dist/esm/src/translations/index.js +0 -6
  313. package/dist/esm/src/translations/index.js.map +0 -1
  314. package/dist/latency-chart-CpL1M_s0.cjs.js +0 -59
  315. package/dist/latency-chart-CpL1M_s0.cjs.js.map +0 -1
  316. package/dist/src/components/Button/TextButton.d.ts +0 -2
  317. package/dist/src/components/CallControls/CallStatsButton.d.ts +0 -4
  318. package/dist/src/components/CallStats/CallStats.d.ts +0 -22
  319. package/dist/src/components/CallStats/CallStatsLatencyChart.d.ts +0 -7
  320. package/dist/src/components/CallStats/index.d.ts +0 -1
  321. package/dist/src/translations/index.d.ts +0 -146
  322. package/src/components/Button/TextButton.tsx +0 -12
  323. package/src/components/CallControls/CallStatsButton.tsx +0 -37
  324. package/src/components/CallStats/CallStats.tsx +0 -439
  325. package/src/components/CallStats/CallStatsLatencyChart.tsx +0 -76
  326. package/src/components/CallStats/index.ts +0 -1
  327. package/src/translations/en.json +0 -154
  328. package/src/translations/index.ts +0 -3
@@ -1,6 +1,7 @@
1
1
  import { useEffect, useState } from 'react';
2
- import { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';
3
- import { Icon } from '../../../components';
2
+ import { useCallStateHooks } from '@stream-io/video-react-bindings';
3
+ import { useI18n } from '../../../i18n';
4
+ import { Button, Icon } from '../../../components';
4
5
  import { ViewersCount } from '../../shared';
5
6
  import { OwnCapability } from '@stream-io/video-client';
6
7
 
@@ -80,15 +81,22 @@ export const ViewerLobby = ({ onJoin }: ViewerLobbyProps) => {
80
81
  if (!startsAt) return null;
81
82
 
82
83
  if (startsAtPassed) {
83
- return t('Livestream starts soon');
84
+ return t(
85
+ 'livestream.backstage.startsSoon.text',
86
+ 'Livestream starts soon',
87
+ );
84
88
  }
85
89
 
86
- return t('Livestream starts at {{ time }}', {
87
- time: startsAt.toLocaleTimeString([], {
88
- hour: '2-digit',
89
- minute: '2-digit',
90
- }),
91
- });
90
+ return t(
91
+ 'livestream.backstage.startsAt.text',
92
+ 'Livestream starts at {{ time }}',
93
+ {
94
+ time: startsAt.toLocaleTimeString([], {
95
+ hour: '2-digit',
96
+ minute: '2-digit',
97
+ }),
98
+ },
99
+ );
92
100
  };
93
101
 
94
102
  return (
@@ -100,8 +108,11 @@ export const ViewerLobby = ({ onJoin }: ViewerLobbyProps) => {
100
108
 
101
109
  <h2 className="str-video__embedded-viewer-lobby__title">
102
110
  {canJoin
103
- ? t('Stream is ready!')
104
- : t('Waiting for the livestream to start')}
111
+ ? t('livestreamViewer.lobby.streamReady.title', 'Stream is ready!')
112
+ : t(
113
+ 'livestreamViewer.lobby.waitingForStart.title',
114
+ 'Waiting for the livestream to start',
115
+ )}
105
116
  </h2>
106
117
 
107
118
  {!canJoin && getStartsAtMessage() && (
@@ -114,9 +125,9 @@ export const ViewerLobby = ({ onJoin }: ViewerLobbyProps) => {
114
125
 
115
126
  <div className="str-video__embedded-viewer-lobby__actions">
116
127
  {canJoin ? (
117
- <button className="str-video__button" onClick={onJoin}>
118
- {t('Join Stream')}
119
- </button>
128
+ <Button size="sm" onClick={onJoin}>
129
+ {t('livestreamViewer.lobby.joinStream.label', 'Join Stream')}
130
+ </Button>
120
131
  ) : (
121
132
  <label className="str-video__embedded-viewer-lobby__auto-join">
122
133
  <input
@@ -124,7 +135,12 @@ export const ViewerLobby = ({ onJoin }: ViewerLobbyProps) => {
124
135
  checked={autoJoin}
125
136
  onChange={(e) => setAutoJoin(e.target.checked)}
126
137
  />
127
- <span>{t('Join automatically when stream starts')}</span>
138
+ <span>
139
+ {t(
140
+ 'livestreamViewer.lobby.joinAutomatically.text',
141
+ 'Join automatically when stream starts',
142
+ )}
143
+ </span>
128
144
  </label>
129
145
  )}
130
146
  </div>
@@ -1,7 +1,8 @@
1
1
  import { useCallback } from 'react';
2
- import clsx from 'clsx';
3
- import { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';
2
+ import { useCallStateHooks } from '@stream-io/video-react-bindings';
3
+ import { useI18n } from '../../../i18n';
4
4
  import {
5
+ Button,
5
6
  DeviceSelectorVideo,
6
7
  Icon,
7
8
  useBackgroundFilters,
@@ -40,26 +41,31 @@ export const BlurToggleButton = () => {
40
41
  ]);
41
42
 
42
43
  const getLabel = () => {
43
- if (isLoading) return t('Applying...');
44
- return isBlurred ? t('Disable blur') : t('Blur background');
44
+ if (isLoading)
45
+ return t('callControls.blurToggleButton.applying.label', 'Applying...');
46
+ return isBlurred
47
+ ? t('callControls.blurToggleButton.disableBlur.label', 'Disable blur')
48
+ : t(
49
+ 'callControls.blurToggleButton.blurBackground.label',
50
+ 'Blur background',
51
+ );
45
52
  };
46
53
 
47
54
  if (!isSupported) return null;
48
55
 
49
56
  return (
50
- <button
51
- type="button"
52
- className={clsx(
53
- 'str-video__embedded-blur-toggle',
54
- isBlurred && 'str-video__embedded-blur-toggle--active',
55
- )}
57
+ <Button
58
+ variant="secondary"
59
+ appearance="outline"
60
+ size="sm"
61
+ className="str-video__embedded-blur-toggle"
56
62
  disabled={isDisabled}
57
- aria-pressed={isBlurred}
63
+ active={isBlurred}
58
64
  onClick={handleClick}
59
65
  >
60
66
  <Icon icon="blur-icon" />
61
67
  <span>{getLabel()}</span>
62
- </button>
68
+ </Button>
63
69
  );
64
70
  };
65
71
 
@@ -0,0 +1,32 @@
1
+ import { Icon } from '../../../components';
2
+
3
+ interface CallDurationProps {
4
+ /**
5
+ * A formatted duration as produced by `useCallDuration`: `MM:SS`, or
6
+ * `HH:MM:SS` past the hour. Everything up to the last `:` is dimmed.
7
+ */
8
+ elapsed: string;
9
+ }
10
+
11
+ export const CallDuration = ({ elapsed }: CallDurationProps) => {
12
+ if (!elapsed) return null;
13
+
14
+ const secondsAt = elapsed.lastIndexOf(':') + 1;
15
+ const leading = elapsed.slice(0, secondsAt);
16
+ const seconds = elapsed.slice(secondsAt);
17
+
18
+ return (
19
+ <div className="str-video__embedded-call-duration">
20
+ <Icon
21
+ icon="verified"
22
+ className="str-video__embedded-call-duration__icon"
23
+ />
24
+ <span className="str-video__embedded-call-duration__time">
25
+ <span className="str-video__embedded-call-duration__time-leading">
26
+ {leading}
27
+ </span>
28
+ {seconds}
29
+ </span>
30
+ </div>
31
+ );
32
+ };
@@ -1,5 +1,5 @@
1
- import { useI18n } from '@stream-io/video-react-bindings';
2
- import { Icon } from '../../../components';
1
+ import { useI18n } from '../../../i18n';
2
+ import { Button, Icon } from '../../../components';
3
3
 
4
4
  interface CallEndedScreenProps {
5
5
  onJoin?: () => void;
@@ -15,39 +15,53 @@ export const CallEndedScreen = ({
15
15
  return (
16
16
  <div className="str-video__embedded-call-feedback__container">
17
17
  <h2 className="str-video__embedded-call-feedback__title">
18
- {t('Call ended')}
18
+ {t('callFeedback.callEndedScreen.callEnded.title', 'Call ended')}
19
19
  </h2>
20
20
  <div className="str-video__embedded-call-feedback__ended-actions">
21
21
  {onJoin && (
22
22
  <>
23
23
  <div className="str-video__embedded-call-feedback__ended-column">
24
24
  <p className="str-video__embedded-call-feedback__ended-label">
25
- {t('Left by mistake?')}
25
+ {t(
26
+ 'callFeedback.callEndedScreen.leftByMistake.text',
27
+ 'Left by mistake?',
28
+ )}
26
29
  </p>
27
- <button
28
- type="button"
30
+ <Button
31
+ variant="secondary"
32
+ appearance="outline"
29
33
  className="str-video__embedded-call-feedback__ended-button"
30
34
  onClick={onJoin}
31
35
  >
32
36
  <Icon icon="login" />
33
- {t('Rejoin call')}
34
- </button>
37
+ {t(
38
+ 'callFeedback.callEndedScreen.rejoinCall.label',
39
+ 'Rejoin call',
40
+ )}
41
+ </Button>
35
42
  </div>
36
43
  <div className="str-video__embedded-call-feedback__ended-divider" />
37
44
  </>
38
45
  )}
39
46
  <div className="str-video__embedded-call-feedback__ended-column">
40
47
  <p className="str-video__embedded-call-feedback__ended-label">
41
- {t('Help us improve')}
48
+ {t(
49
+ 'callFeedback.callEndedScreen.helpUsImprove.text',
50
+ 'Help us improve',
51
+ )}
42
52
  </p>
43
- <button
44
- type="button"
53
+ <Button
54
+ variant="secondary"
55
+ appearance="outline"
45
56
  className="str-video__embedded-call-feedback__ended-button"
46
57
  onClick={onFeedback}
47
58
  >
48
59
  <Icon icon="feedback" />
49
- {t('Leave feedback')}
50
- </button>
60
+ {t(
61
+ 'callFeedback.callEndedScreen.leaveFeedback.label',
62
+ 'Leave feedback',
63
+ )}
64
+ </Button>
51
65
  </div>
52
66
  </div>
53
67
  </div>
@@ -1,5 +1,6 @@
1
1
  import { useState } from 'react';
2
- import { useI18n } from '@stream-io/video-react-bindings';
2
+ import { useI18n } from '../../../i18n';
3
+ import { Button } from '../../../components';
3
4
  import { StarRating } from './StarRating';
4
5
 
5
6
  interface RatingScreenProps {
@@ -18,29 +19,36 @@ export const RatingScreen = ({ onSubmit }: RatingScreenProps) => {
18
19
  return (
19
20
  <div className="str-video__embedded-call-feedback__container">
20
21
  <h2 className="str-video__embedded-call-feedback__title">
21
- {t('Share your feedback')}
22
+ {t(
23
+ 'callFeedback.ratingScreen.shareYourFeedback.title',
24
+ 'Share your feedback',
25
+ )}
22
26
  </h2>
23
27
 
24
28
  <StarRating value={rating} onChange={setRating} />
25
29
 
26
30
  <textarea
27
- aria-label={t('Feedback message')}
31
+ aria-label={t(
32
+ 'callFeedback.ratingScreen.feedbackMessage.ariaLabel',
33
+ 'Feedback message',
34
+ )}
28
35
  className="str-video__embedded-call-feedback__textarea"
29
- placeholder={t('Tell us about your experience...')}
36
+ placeholder={t(
37
+ 'callFeedback.ratingScreen.tellUsAboutExperience.placeholder',
38
+ 'Tell us about your experience...',
39
+ )}
30
40
  value={message}
31
41
  onChange={(e) => setMessage(e.target.value)}
32
42
  rows={3}
33
43
  />
34
44
 
35
45
  <div className="str-video__embedded-call-feedback__actions">
36
- <button
37
- type="button"
38
- className="str-video__button"
39
- onClick={handleSubmit}
40
- disabled={rating === 0}
41
- >
42
- {t('Submit feedback')}
43
- </button>
46
+ <Button size="sm" onClick={handleSubmit} disabled={rating === 0}>
47
+ {t(
48
+ 'callFeedback.ratingScreen.submitFeedback.label',
49
+ 'Submit feedback',
50
+ )}
51
+ </Button>
44
52
  </div>
45
53
  </div>
46
54
  );
@@ -1,6 +1,6 @@
1
1
  import { useState } from 'react';
2
2
  import clsx from 'clsx';
3
- import { useI18n } from '@stream-io/video-react-bindings';
3
+ import { useI18n } from '../../../i18n';
4
4
  import { Icon } from '../../../components';
5
5
 
6
6
  interface StarRatingProps {
@@ -22,7 +22,10 @@ export const StarRating = ({ value, onChange }: StarRatingProps) => {
22
22
  return (
23
23
  <div className="str-video__embedded-call-feedback__rating-section">
24
24
  <p className="str-video__embedded-call-feedback__rating-label">
25
- {t('How was your call quality?')}
25
+ {t(
26
+ 'callFeedback.starRating.howWasCallQuality.text',
27
+ 'How was your call quality?',
28
+ )}
26
29
  </p>
27
30
  <div
28
31
  className="str-video__embedded-call-feedback__stars"
@@ -35,7 +38,11 @@ export const StarRating = ({ value, onChange }: StarRatingProps) => {
35
38
  className={getStarClasses(star)}
36
39
  onClick={() => onChange(star)}
37
40
  onMouseEnter={() => setHovered(star)}
38
- aria-label={t('Rate {{ count }} star', { count: star })}
41
+ aria-label={t('callFeedback.starRating.rateStars.ariaLabel', {
42
+ count: star,
43
+ defaultValue_one: 'Rate {{ count }} star',
44
+ defaultValue_other: 'Rate {{ count }} stars',
45
+ })}
39
46
  >
40
47
  <Icon icon="star-filled" />
41
48
  </button>
@@ -1,4 +1,4 @@
1
- import { useI18n } from '@stream-io/video-react-bindings';
1
+ import { useI18n } from '../../../i18n';
2
2
  import { Icon } from '../../../components';
3
3
 
4
4
  export const ThankYouScreen = () => {
@@ -9,10 +9,13 @@ export const ThankYouScreen = () => {
9
9
  <Icon icon="checkmark" />
10
10
  </div>
11
11
  <h2 className="str-video__embedded-call-feedback__title">
12
- {t('Thank you!')}
12
+ {t('callFeedback.thankYouScreen.thankYou.title', 'Thank you!')}
13
13
  </h2>
14
14
  <p className="str-video__embedded-call-feedback__subtitle">
15
- {t('Your feedback helps improve call quality.')}
15
+ {t(
16
+ 'callFeedback.thankYouScreen.feedbackHelpsImprove.text',
17
+ 'Your feedback helps improve call quality.',
18
+ )}
16
19
  </p>
17
20
  </div>
18
21
  );
@@ -1,6 +1,7 @@
1
1
  import { CallingState } from '@stream-io/video-client';
2
- import { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';
3
- import { LoadingIndicator, Notification } from '../../../components';
2
+ import { useCallStateHooks } from '@stream-io/video-react-bindings';
3
+ import { useI18n } from '../../../i18n';
4
+ import { Notification } from '../../../components';
4
5
 
5
6
  export const ConnectionNotification = () => {
6
7
  const { t } = useI18n();
@@ -21,11 +22,18 @@ export const ConnectionNotification = () => {
21
22
  <div className="str-video__embedded-connection-notification">
22
23
  <Notification
23
24
  isVisible
25
+ state="error"
24
26
  placement="bottom"
25
27
  message={
26
28
  isOffline
27
- ? t('You are offline. Check your internet connection.')
28
- : t('Failed to restore connection. Please try again.')
29
+ ? t(
30
+ 'connectionNotification.offline.text',
31
+ 'You are offline. Check your internet connection.',
32
+ )
33
+ : t(
34
+ 'connectionNotification.failedToRestore.text',
35
+ 'Failed to restore connection. Please try again.',
36
+ )
29
37
  }
30
38
  />
31
39
  </div>
@@ -37,18 +45,17 @@ export const ConnectionNotification = () => {
37
45
  <div className="str-video__embedded-connection-notification">
38
46
  <Notification
39
47
  isVisible
48
+ state="loading"
40
49
  placement="bottom"
41
- iconClassName={null}
42
50
  message={
43
- <LoadingIndicator
44
- text={
45
- isMigrating
46
- ? t('Migrating...')
47
- : isJoining
48
- ? t('Joining')
49
- : t('Reconnecting...')
50
- }
51
- />
51
+ isMigrating
52
+ ? t('connectionNotification.migrating.text', 'Migrating...')
53
+ : isJoining
54
+ ? t('connectionNotification.joining.text', 'Joining')
55
+ : t(
56
+ 'connectionNotification.reconnecting.text',
57
+ 'Reconnecting...',
58
+ )
52
59
  }
53
60
  />
54
61
  </div>
@@ -1,5 +1,5 @@
1
- import { useI18n } from '@stream-io/video-react-bindings';
2
- import { Icon } from '../../../components';
1
+ import { useI18n } from '../../../i18n';
2
+ import { Button, Icon } from '../../../components';
3
3
 
4
4
  interface JoinErrorProps {
5
5
  onJoin: () => void;
@@ -11,17 +11,18 @@ export const JoinError = ({ onJoin }: JoinErrorProps) => {
11
11
  return (
12
12
  <div className="str-video__embedded-join-error">
13
13
  <h2 className="str-video__embedded-join-error__title">
14
- {t('Failed to join the call')}
14
+ {t('joinError.failedToJoin.title', 'Failed to join the call')}
15
15
  </h2>
16
16
  <p className="str-video__embedded-join-error__message">
17
17
  {t(
18
+ 'joinError.couldNotConnect.text',
18
19
  "We couldn't connect to the server. Please check your connection and try again.",
19
20
  )}
20
21
  </p>
21
- <button type="button" className="str-video__button" onClick={onJoin}>
22
+ <Button size="sm" onClick={onJoin}>
22
23
  <Icon icon="login" />
23
- {t('Try again')}
24
- </button>
24
+ {t('common.tryAgain.label', 'Try again')}
25
+ </Button>
25
26
  </div>
26
27
  );
27
28
  };
@@ -1,4 +1,8 @@
1
- import { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';
1
+ import {
2
+ useCallStateHooks,
3
+ useConnectedUser,
4
+ } from '@stream-io/video-react-bindings';
5
+ import { useI18n } from '../../../i18n';
2
6
  import {
3
7
  ToggleAudioPreviewButton,
4
8
  ToggleVideoPreviewButton,
@@ -15,10 +19,12 @@ interface DeviceControlsProps {
15
19
 
16
20
  export const DeviceControls = ({ isVideoEnabled }: DeviceControlsProps) => {
17
21
  const { t } = useI18n();
22
+ const user = useConnectedUser();
18
23
  const { useCameraState, useMicrophoneState } = useCallStateHooks();
19
24
 
20
25
  const { hasBrowserPermission: hasCameraPermission } = useCameraState();
21
26
  const { hasBrowserPermission: hasMicPermission } = useMicrophoneState();
27
+ const displayName = user?.name || user?.id;
22
28
 
23
29
  return (
24
30
  <>
@@ -27,6 +33,13 @@ export const DeviceControls = ({ isVideoEnabled }: DeviceControlsProps) => {
27
33
  DisabledVideoPreview={DisabledVideoPreview}
28
34
  NoCameraPreview={NoCameraPreview}
29
35
  />
36
+ {displayName && (
37
+ <span className="str-video__embedded-lobby__participant-label">
38
+ <span className="str-video__embedded-lobby__participant-label-text">
39
+ {displayName}
40
+ </span>
41
+ </span>
42
+ )}
30
43
  <div className="str-video__embedded-lobby__media-toggle">
31
44
  <ToggleAudioPreviewButton Menu={null} />
32
45
  {isVideoEnabled && <ToggleVideoPreviewButton Menu={null} />}
@@ -37,7 +50,13 @@ export const DeviceControls = ({ isVideoEnabled }: DeviceControlsProps) => {
37
50
  {hasMicPermission ? (
38
51
  <ToggleMicButton />
39
52
  ) : (
40
- <DisabledDeviceButton icon="mic" label={t('Permission needed')} />
53
+ <DisabledDeviceButton
54
+ icon="mic"
55
+ label={t(
56
+ 'lobby.deviceControls.permissionNeeded.label',
57
+ 'Permission needed',
58
+ )}
59
+ />
41
60
  )}
42
61
  {isVideoEnabled &&
43
62
  (hasCameraPermission ? (
@@ -45,7 +64,10 @@ export const DeviceControls = ({ isVideoEnabled }: DeviceControlsProps) => {
45
64
  ) : (
46
65
  <DisabledDeviceButton
47
66
  icon="camera"
48
- label={t('Permission needed')}
67
+ label={t(
68
+ 'lobby.deviceControls.permissionNeeded.label',
69
+ 'Permission needed',
70
+ )}
49
71
  />
50
72
  ))}
51
73
  </div>
@@ -1,10 +1,7 @@
1
1
  import clsx from 'clsx';
2
- import {
3
- useCallStateHooks,
4
- useConnectedUser,
5
- useI18n,
6
- } from '@stream-io/video-react-bindings';
7
- import { Icon } from '../../../components';
2
+ import { useCallStateHooks } from '@stream-io/video-react-bindings';
3
+ import { useI18n } from '../../../i18n';
4
+ import { Button, Icon } from '../../../components';
8
5
  import { DeviceControls } from './DeviceControls';
9
6
 
10
7
  interface LobbyProps {
@@ -18,20 +15,28 @@ interface LobbyProps {
18
15
  */
19
16
  export const Lobby = ({ onJoin, title, joinLabel }: LobbyProps) => {
20
17
  const { t } = useI18n();
21
- const user = useConnectedUser();
22
18
  const { useCameraState, useCallSettings } = useCallStateHooks();
23
19
 
24
20
  const { isMute } = useCameraState();
25
21
  const settings = useCallSettings();
26
22
 
27
23
  const isVideoEnabled = settings?.video.enabled ?? true;
28
- const resolvedJoinLabel = joinLabel ?? t('Join');
29
- const resolvedTitle = title ?? t('Set up your call before joining');
24
+ const resolvedJoinLabel = joinLabel ?? t('lobby.join.label', 'Join');
25
+ const resolvedTitle =
26
+ title ?? t('lobby.setUpYourCall.title', 'Set up your call before joining');
30
27
 
31
28
  return (
32
29
  <div className="str-video__embedded-lobby">
33
30
  <div className="str-video__embedded-lobby__content">
34
- <h1 className="str-video__embedded-lobby__heading">{resolvedTitle}</h1>
31
+ <div className="str-video__embedded-lobby__title">
32
+ <Icon
33
+ icon="language"
34
+ className="str-video__embedded-lobby__title-icon"
35
+ />
36
+ <h1 className="str-video__embedded-lobby__heading">
37
+ {resolvedTitle}
38
+ </h1>
39
+ </div>
35
40
  <div
36
41
  className={clsx(
37
42
  'str-video__embedded-lobby__camera',
@@ -41,18 +46,10 @@ export const Lobby = ({ onJoin, title, joinLabel }: LobbyProps) => {
41
46
  <DeviceControls isVideoEnabled={isVideoEnabled} />
42
47
  </div>
43
48
 
44
- <div className="str-video__embedded-lobby__display-name">
45
- <div className="str-video__embedded-lobby__display-name-label">
46
- {t('Display name')}
47
- </div>
48
- <span className="str-video__embedded-lobby__display-name-value">
49
- {user?.name}
50
- </span>
51
- <button className="str-video__button" onClick={onJoin}>
52
- <Icon className="str-video__button__icon" icon="login" />
53
- {resolvedJoinLabel}
54
- </button>
55
- </div>
49
+ <Button className="str-video__embedded-lobby__join" onClick={onJoin}>
50
+ <Icon icon="login" />
51
+ {resolvedJoinLabel}
52
+ </Button>
56
53
  </div>
57
54
  </div>
58
55
  );
@@ -1,6 +1,7 @@
1
1
  import { forwardRef } from 'react';
2
2
 
3
- import { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';
3
+ import { useCallStateHooks } from '@stream-io/video-react-bindings';
4
+ import { useI18n } from '../../../i18n';
4
5
  import {
5
6
  DeviceSelectorAudioInput,
6
7
  DeviceSelectorAudioOutput,
@@ -41,8 +42,14 @@ export const ToggleMicButton = () => {
41
42
  ToggleButton={ToggleMenuButton}
42
43
  visualType={MenuVisualType.MENU}
43
44
  >
44
- <DeviceSelectorAudioInput visualType="list" title={t('Microphone')} />
45
- <DeviceSelectorAudioOutput visualType="list" title={t('Speaker')} />
45
+ <DeviceSelectorAudioInput
46
+ visualType="list"
47
+ title={t('common.microphone.label', 'Microphone')}
48
+ />
49
+ <DeviceSelectorAudioOutput
50
+ visualType="list"
51
+ title={t('common.speaker.label', 'Speaker')}
52
+ />
46
53
  </MenuToggle>
47
54
  );
48
55
  };
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  useCallStateHooks,
3
3
  useConnectedUser,
4
- useI18n,
5
4
  } from '@stream-io/video-react-bindings';
5
+ import { useI18n } from '../../../i18n';
6
6
  import { Avatar } from '../../../components';
7
7
 
8
8
  export const DisabledVideoPreview = () => {
@@ -22,6 +22,7 @@ export const DisabledVideoPreview = () => {
22
22
  <Avatar imageSrc={user?.image} name={user?.name || user?.id} />
23
23
  ) : (
24
24
  t(
25
+ 'lobby.videoPreviewFallbacks.grantBrowserPermission.text',
25
26
  'Please grant your browser permission to access your camera and microphone.',
26
27
  )
27
28
  )}
@@ -41,6 +42,7 @@ export const NoCameraPreview = () => {
41
42
  return (
42
43
  <div className="str-video__embedded-lobby__no-permission">
43
44
  {t(
45
+ 'lobby.videoPreviewFallbacks.grantBrowserPermission.text',
44
46
  'Please grant your browser permission to access your camera and microphone.',
45
47
  )}
46
48
  </div>
@@ -49,7 +51,7 @@ export const NoCameraPreview = () => {
49
51
 
50
52
  return (
51
53
  <div className="str-video__video-preview__no-camera-preview">
52
- {t('No camera found')}
54
+ {t('common.noCameraFound.text', 'No camera found')}
53
55
  </div>
54
56
  );
55
57
  };
@@ -1,4 +1,5 @@
1
1
  export * from './BlurToggleButton/BlurToggleButton';
2
+ export * from './CallDuration/CallDuration';
2
3
  export * from './CallFeedback/CallFeedback';
3
4
  export * from './ConnectionNotification/ConnectionNotification';
4
5
  export * from './EmbeddedParticipantViewUI/EmbeddedParticipantViewUI';
@@ -1,4 +1,4 @@
1
- import { useI18n } from '@stream-io/video-react-bindings';
1
+ import { useI18n } from '../i18n';
2
2
  import { useMemo } from 'react';
3
3
 
4
4
  export interface DeviceListItem {
@@ -43,7 +43,7 @@ export function useDeviceList(
43
43
  if (selectedDeviceInfo === null || selectedIndex === null) {
44
44
  const defaultDevice = {
45
45
  deviceId: 'default',
46
- label: t('Default'),
46
+ label: t('common.default.label', 'Default'),
47
47
  isSelected: true,
48
48
  };
49
49