@stream-io/video-react-sdk 1.32.3 → 1.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/css/embedded.css +3630 -0
  3. package/dist/css/embedded.css.map +1 -0
  4. package/dist/css/styles.css +13 -2
  5. package/dist/css/styles.css.map +1 -1
  6. package/dist/embedded-BackgroundFilters-RdXfNf6_.es.js +353 -0
  7. package/dist/embedded-BackgroundFilters-RdXfNf6_.es.js.map +1 -0
  8. package/dist/embedded-BackgroundFilters-Zu84SkRR.cjs.js +355 -0
  9. package/dist/embedded-BackgroundFilters-Zu84SkRR.cjs.js.map +1 -0
  10. package/dist/embedded-CallStatsLatencyChart-Bj5OSYzg.es.js +57 -0
  11. package/dist/embedded-CallStatsLatencyChart-Bj5OSYzg.es.js.map +1 -0
  12. package/dist/embedded-CallStatsLatencyChart-CpL1M_s0.cjs.js +59 -0
  13. package/dist/embedded-CallStatsLatencyChart-CpL1M_s0.cjs.js.map +1 -0
  14. package/dist/embedded.cjs.js +3410 -0
  15. package/dist/embedded.cjs.js.map +1 -0
  16. package/dist/embedded.d.ts +1 -0
  17. package/dist/embedded.es.js +3407 -0
  18. package/dist/embedded.es.js.map +1 -0
  19. package/dist/index.cjs.js +67 -202
  20. package/dist/index.cjs.js.map +1 -1
  21. package/dist/index.es.js +69 -204
  22. package/dist/index.es.js.map +1 -1
  23. package/dist/src/embedded/EmbeddedClientProvider.d.ts +21 -0
  24. package/dist/src/embedded/call/CallControls.d.ts +9 -0
  25. package/dist/src/embedded/call/CallHeader.d.ts +4 -0
  26. package/dist/src/embedded/call/CallLayout.d.ts +4 -0
  27. package/dist/src/embedded/call/CallStateRouter.d.ts +4 -0
  28. package/dist/src/embedded/call/EmbeddedCall.d.ts +6 -0
  29. package/dist/src/embedded/call/index.d.ts +1 -0
  30. package/dist/src/embedded/context/ConfigurationContext.d.ts +11 -0
  31. package/dist/src/embedded/context/index.d.ts +1 -0
  32. package/dist/src/embedded/hooks/index.d.ts +8 -0
  33. package/dist/src/embedded/hooks/useCallDuration.d.ts +7 -0
  34. package/dist/src/embedded/hooks/useEmbeddedClient.d.ts +22 -0
  35. package/dist/src/embedded/hooks/useInitializeCall.d.ts +11 -0
  36. package/dist/src/embedded/hooks/useInitializeVideoClient.d.ts +16 -0
  37. package/dist/src/embedded/hooks/useIsLivestreamPaused.d.ts +8 -0
  38. package/dist/src/embedded/hooks/useLayout.d.ts +9 -0
  39. package/dist/src/embedded/hooks/useNoiseCancellationLoader.d.ts +12 -0
  40. package/dist/src/embedded/hooks/useWakeLock.d.ts +5 -0
  41. package/dist/src/embedded/index.d.ts +3 -0
  42. package/dist/src/embedded/livestream/EmbeddedLivestream.d.ts +5 -0
  43. package/dist/src/embedded/livestream/LivestreamUI.d.ts +1 -0
  44. package/dist/src/embedded/livestream/host/HostLayout.d.ts +7 -0
  45. package/dist/src/embedded/livestream/host/HostStateRouter.d.ts +1 -0
  46. package/dist/src/embedded/livestream/index.d.ts +1 -0
  47. package/dist/src/embedded/livestream/viewer/ViewerLayout.d.ts +1 -0
  48. package/dist/src/embedded/livestream/viewer/ViewerLobby.d.ts +4 -0
  49. package/dist/src/embedded/livestream/viewer/ViewerStateRouter.d.ts +1 -0
  50. package/dist/src/embedded/shared/BlurToggleButton/BlurToggleButton.d.ts +2 -0
  51. package/dist/src/embedded/shared/CallFeedback/CallEndedScreen.d.ts +6 -0
  52. package/dist/src/embedded/shared/CallFeedback/CallFeedback.d.ts +4 -0
  53. package/dist/src/embedded/shared/CallFeedback/RatingScreen.d.ts +5 -0
  54. package/dist/src/embedded/shared/CallFeedback/StarRating.d.ts +6 -0
  55. package/dist/src/embedded/shared/CallFeedback/ThankYouScreen.d.ts +1 -0
  56. package/dist/src/embedded/shared/ConnectionNotification/ConnectionNotification.d.ts +1 -0
  57. package/dist/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.d.ts +1 -0
  58. package/dist/src/embedded/shared/JoinError/JoinError.d.ts +5 -0
  59. package/dist/src/embedded/shared/Lobby/DeviceControls.d.ts +5 -0
  60. package/dist/src/embedded/shared/Lobby/DisabledDeviceButton.d.ts +6 -0
  61. package/dist/src/embedded/shared/Lobby/Lobby.d.ts +10 -0
  62. package/dist/src/embedded/shared/Lobby/ToggleCameraButton.d.ts +1 -0
  63. package/dist/src/embedded/shared/Lobby/ToggleMicButton.d.ts +1 -0
  64. package/dist/src/embedded/shared/Lobby/VideoPreviewFallbacks.d.ts +2 -0
  65. package/dist/src/embedded/shared/ViewersCount/ViewersCount.d.ts +5 -0
  66. package/dist/src/embedded/shared/index.d.ts +7 -0
  67. package/dist/src/embedded/types.d.ts +65 -0
  68. package/dist/src/hooks/usePersistedDevicePreferences.d.ts +3 -12
  69. package/dist/src/translations/index.d.ts +42 -1
  70. package/embedded.ts +1 -0
  71. package/package.json +18 -4
  72. package/src/core/components/CallLayout/LivestreamLayout.tsx +53 -41
  73. package/src/embedded/EmbeddedClientProvider.tsx +125 -0
  74. package/src/embedded/call/CallControls.tsx +124 -0
  75. package/src/embedded/call/CallHeader.tsx +30 -0
  76. package/src/embedded/call/CallLayout.tsx +66 -0
  77. package/src/embedded/call/CallStateRouter.tsx +56 -0
  78. package/src/embedded/call/EmbeddedCall.tsx +14 -0
  79. package/src/embedded/call/index.ts +1 -0
  80. package/src/embedded/context/ConfigurationContext.tsx +36 -0
  81. package/src/embedded/context/index.ts +1 -0
  82. package/src/embedded/hooks/index.ts +8 -0
  83. package/src/embedded/hooks/useCallDuration.ts +40 -0
  84. package/src/embedded/hooks/useEmbeddedClient.ts +64 -0
  85. package/src/embedded/hooks/useInitializeCall.ts +51 -0
  86. package/src/embedded/hooks/useInitializeVideoClient.ts +118 -0
  87. package/src/embedded/hooks/useIsLivestreamPaused.ts +44 -0
  88. package/src/embedded/hooks/useLayout.ts +100 -0
  89. package/src/embedded/hooks/useNoiseCancellationLoader.ts +62 -0
  90. package/src/embedded/hooks/useWakeLock.ts +33 -0
  91. package/src/embedded/index.ts +12 -0
  92. package/src/embedded/livestream/EmbeddedLivestream.tsx +16 -0
  93. package/src/embedded/livestream/LivestreamUI.tsx +17 -0
  94. package/src/embedded/livestream/host/HostLayout.tsx +210 -0
  95. package/src/embedded/livestream/host/HostStateRouter.tsx +100 -0
  96. package/src/embedded/livestream/index.ts +1 -0
  97. package/src/embedded/livestream/viewer/ViewerLayout.tsx +160 -0
  98. package/src/embedded/livestream/viewer/ViewerLobby.tsx +135 -0
  99. package/src/embedded/livestream/viewer/ViewerStateRouter.tsx +82 -0
  100. package/src/embedded/shared/BlurToggleButton/BlurToggleButton.tsx +75 -0
  101. package/src/embedded/shared/CallFeedback/CallEndedScreen.tsx +55 -0
  102. package/src/embedded/shared/CallFeedback/CallFeedback.tsx +51 -0
  103. package/src/embedded/shared/CallFeedback/RatingScreen.tsx +47 -0
  104. package/src/embedded/shared/CallFeedback/StarRating.tsx +46 -0
  105. package/src/embedded/shared/CallFeedback/ThankYouScreen.tsx +19 -0
  106. package/src/embedded/shared/ConnectionNotification/ConnectionNotification.tsx +59 -0
  107. package/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.tsx +32 -0
  108. package/src/embedded/shared/JoinError/JoinError.tsx +27 -0
  109. package/src/embedded/shared/Lobby/DeviceControls.tsx +54 -0
  110. package/src/embedded/shared/Lobby/DisabledDeviceButton.tsx +21 -0
  111. package/src/embedded/shared/Lobby/Lobby.tsx +59 -0
  112. package/src/embedded/shared/Lobby/ToggleCameraButton.tsx +44 -0
  113. package/src/embedded/shared/Lobby/ToggleMicButton.tsx +48 -0
  114. package/src/embedded/shared/Lobby/VideoPreviewFallbacks.tsx +55 -0
  115. package/src/embedded/shared/ViewersCount/ViewersCount.tsx +18 -0
  116. package/src/embedded/shared/index.ts +7 -0
  117. package/src/embedded/types.ts +80 -0
  118. package/src/hooks/usePersistedDevicePreferences.ts +8 -307
  119. package/src/translations/en.json +44 -2
package/dist/index.es.js CHANGED
@@ -1,9 +1,9 @@
1
- import { hasAudio, hasScreenShareAudio, CallingState, hasVideo, hasScreenShare, OwnCapability, Browsers, VisibilityState, hasPausedTrack, createSoundDetector, SfuModels, isPinned, name, NoiseCancellationSettingsModeEnum, paginatedLayoutSortPreset, combineComparators, screenSharing, speakerLayoutSortPreset, CallTypes, defaultSortPreset, humanize, setSdkInfo } from '@stream-io/video-client';
1
+ import { hasAudio, hasScreenShareAudio, hasVideo, hasScreenShare, OwnCapability, Browsers, VisibilityState, hasPausedTrack, createSoundDetector, SfuModels, isPinned, name, NoiseCancellationSettingsModeEnum, CallingState, paginatedLayoutSortPreset, combineComparators, screenSharing, speakerLayoutSortPreset, CallTypes, defaultSortPreset, humanize, setSdkInfo } from '@stream-io/video-client';
2
2
  export * from '@stream-io/video-client';
3
3
  import { useCall, useCallStateHooks, useI18n, Restricted, useToggleCallRecording, useConnectedUser, StreamCallProvider, StreamVideoProvider, useStreamVideoClient, useEffectEvent } from '@stream-io/video-react-bindings';
4
4
  export * from '@stream-io/video-react-bindings';
5
5
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
6
- import { useState, useEffect, Fragment as Fragment$1, createContext, useContext, useRef, useCallback, useMemo, isValidElement, forwardRef, useLayoutEffect, lazy, Suspense } from 'react';
6
+ import { useState, useEffect, Fragment as Fragment$1, createContext, useContext, useCallback, useMemo, useRef, isValidElement, forwardRef, useLayoutEffect, lazy, Suspense } from 'react';
7
7
  import { useFloating, offset, shift, flip, size, autoUpdate, FloatingOverlay, FloatingPortal, arrow, FloatingArrow, useListItem, useListNavigation, useTypeahead, useClick, useDismiss, useRole, useInteractions, FloatingFocusManager, FloatingList, useHover } from '@floating-ui/react';
8
8
  import clsx from 'clsx';
9
9
 
@@ -71,202 +71,17 @@ const useFloatingUIPreset = ({ middleware = [], placement, strategy, offset: off
71
71
  return { refs, x, y, domReference, floating, strategy, context };
72
72
  };
73
73
 
74
- const defaultDevice = 'default';
75
74
  /**
76
- * This hook will apply and persist the device preferences from local storage.
75
+ * This hook is a no-op. Device preference persistence is now handled
76
+ * by the low-level client SDK.
77
77
  *
78
- * @param key the key to use for local storage.
78
+ * @deprecated use the devicePreferences API of the StreamVideoClient.
79
79
  */
80
- const usePersistedDevicePreferences = (key = '@stream-io/device-preferences') => {
81
- const { useCallSettings, useCallCallingState, useMicrophoneState, useCameraState, useSpeakerState, } = useCallStateHooks();
82
- const settings = useCallSettings();
83
- const callingState = useCallCallingState();
84
- const microphoneState = useMicrophoneState();
85
- const cameraState = useCameraState();
86
- const speakerState = useSpeakerState();
87
- const [applyingState, setApplyingState] = useState('idle');
88
- const call = useCall();
89
- // Set deferServerDefaults flag synchronously during render.
90
- // Please ensure the flag is set BEFORE any call.get() or call.getOrCreate()
91
- // is called, preventing server defaults from overriding user preferences.
92
- const deferredCallRef = useRef(null);
93
- if (call && deferredCallRef.current !== call) {
94
- call.camera.deferServerDefaults = true;
95
- call.microphone.deferServerDefaults = true;
96
- deferredCallRef.current = call;
97
- }
98
- // Cleanup: reset the flag when the component unmounts or call changes.
99
- // This allows server defaults to apply if the hook is no longer used.
80
+ const usePersistedDevicePreferences = (key = '') => {
100
81
  useEffect(() => {
101
- return () => {
102
- const currentCall = deferredCallRef.current;
103
- if (currentCall) {
104
- currentCall.camera.deferServerDefaults = false;
105
- currentCall.microphone.deferServerDefaults = false;
106
- deferredCallRef.current = null;
107
- }
108
- };
109
- }, [call]);
110
- // when the camera is disabled on call type level, we should discard
111
- // any stored camera preferences.
112
- const cameraDevices = settings?.video?.enabled ? cameraState.devices : false;
113
- useEffect(function apply() {
114
- if (callingState === CallingState.LEFT ||
115
- microphoneState.devices.length === 0 ||
116
- (Array.isArray(cameraDevices) && cameraDevices.length === 0) ||
117
- speakerState.devices.length === 0 ||
118
- !settings ||
119
- applyingState !== 'idle') {
120
- return;
121
- }
122
- setApplyingState('applying');
123
- (async () => {
124
- const { audio, video } = settings;
125
- for (const [deviceKey, state, defaultMuted, enabledInCallType] of [
126
- ['microphone', microphoneState, !audio.mic_default_on, true],
127
- ['camera', cameraState, !video.camera_default_on, video.enabled],
128
- ['speaker', speakerState, false, true],
129
- ]) {
130
- const preferences = parseLocalDevicePreferences(key);
131
- const preference = preferences[deviceKey];
132
- const manager = state[deviceKey];
133
- const applyPromise = preference
134
- ? applyLocalDevicePreference(manager, [preference].flat(), deviceKey === 'camera' ? cameraDevices || [] : state.devices, enabledInCallType)
135
- : applyMutedState(manager, defaultMuted, enabledInCallType);
136
- await applyPromise.catch((err) => {
137
- console.warn(`Failed to apply ${deviceKey} device preferences`, err);
138
- });
139
- }
140
- })().finally(() => setApplyingState((state) => (state === 'applying' ? 'applied' : state)));
141
- }, [
142
- applyingState,
143
- callingState,
144
- cameraState,
145
- cameraDevices,
146
- key,
147
- microphoneState,
148
- microphoneState.devices,
149
- settings,
150
- speakerState,
151
- speakerState.devices,
152
- ]);
153
- useEffect(function persist() {
154
- if (callingState === CallingState.LEFT || applyingState !== 'applied') {
155
- return;
156
- }
157
- for (const [deviceKey, devices, selectedDevice, isMute] of [
158
- [
159
- 'camera',
160
- cameraDevices || [],
161
- cameraState.selectedDevice,
162
- cameraState.isMute,
163
- ],
164
- [
165
- 'microphone',
166
- microphoneState.devices,
167
- microphoneState.selectedDevice,
168
- microphoneState.isMute,
169
- ],
170
- [
171
- 'speaker',
172
- speakerState.devices,
173
- speakerState.selectedDevice,
174
- speakerState.isMute,
175
- ],
176
- ]) {
177
- try {
178
- patchLocalDevicePreference(key, deviceKey, {
179
- devices,
180
- selectedDevice,
181
- isMute,
182
- });
183
- }
184
- catch (err) {
185
- console.warn(`Failed to save ${deviceKey} device preferences`, err);
186
- }
187
- }
188
- }, [
189
- applyingState,
190
- callingState,
191
- cameraDevices,
192
- cameraState.isMute,
193
- cameraState.selectedDevice,
194
- key,
195
- microphoneState.devices,
196
- microphoneState.isMute,
197
- microphoneState.selectedDevice,
198
- speakerState.devices,
199
- speakerState.isMute,
200
- speakerState.selectedDevice,
201
- ]);
202
- };
203
- const parseLocalDevicePreferences = (key) => {
204
- const preferencesStr = window.localStorage.getItem(key);
205
- let preferences = {};
206
- if (preferencesStr) {
207
- try {
208
- preferences = JSON.parse(preferencesStr);
209
- if (Object.hasOwn(preferences, 'mic')) {
210
- // for backwards compatibility
211
- preferences.microphone = preferences.mic;
212
- }
213
- }
214
- catch {
215
- /* assume preferences are empty */
216
- }
217
- }
218
- return preferences;
219
- };
220
- const patchLocalDevicePreference = (key, deviceKey, state) => {
221
- const preferences = parseLocalDevicePreferences(key);
222
- const nextPreference = getSelectedDevicePreference(state.devices, state.selectedDevice);
223
- const preferenceHistory = [preferences[deviceKey] ?? []]
224
- .flat()
225
- .filter((p) => p.selectedDeviceId !== nextPreference.selectedDeviceId &&
226
- (p.selectedDeviceLabel === '' ||
227
- p.selectedDeviceLabel !== nextPreference.selectedDeviceLabel));
228
- window.localStorage.setItem(key, JSON.stringify({
229
- ...preferences,
230
- mic: undefined, // for backwards compatibility
231
- [deviceKey]: [
232
- {
233
- ...nextPreference,
234
- muted: state.isMute,
235
- },
236
- ...preferenceHistory,
237
- ].slice(0, 3),
238
- }));
239
- };
240
- const applyLocalDevicePreference = async (manager, preference, devices, enabledInCallType) => {
241
- let muted;
242
- for (const p of preference) {
243
- muted ?? (muted = p.muted);
244
- if (p.selectedDeviceId === defaultDevice) {
245
- break;
246
- }
247
- const device = devices.find((d) => d.deviceId === p.selectedDeviceId) ??
248
- devices.find((d) => d.label === p.selectedDeviceLabel);
249
- if (device) {
250
- if (!manager.state.selectedDevice) {
251
- await manager.select(device.deviceId);
252
- }
253
- muted = p.muted;
254
- break;
255
- }
256
- }
257
- if (typeof muted === 'boolean') {
258
- await applyMutedState(manager, muted, enabledInCallType);
259
- }
260
- };
261
- const applyMutedState = async (manager, muted, enabledInCallType) => {
262
- if (enabledInCallType && !manager.state.status) {
263
- await manager[muted ? 'disable' : 'enable']?.();
264
- }
82
+ console.warn(`usePersistedDevicePreferences is deprecated. Please use the devicePreferences API of the StreamVideoClient instead.`);
83
+ }, [key]);
265
84
  };
266
- const getSelectedDevicePreference = (devices, selectedDevice) => ({
267
- selectedDeviceId: selectedDevice || defaultDevice,
268
- selectedDeviceLabel: devices?.find((d) => d.deviceId === selectedDevice)?.label ?? '',
269
- });
270
85
 
271
86
  const SCROLL_THRESHOLD = 10;
272
87
  /**
@@ -1532,7 +1347,7 @@ const SpeakerTest = (props) => {
1532
1347
  const audioElementRef = useRef(null);
1533
1348
  const [isPlaying, setIsPlaying] = useState(false);
1534
1349
  const { t } = useI18n();
1535
- const { audioUrl = `https://unpkg.com/${"@stream-io/video-react-sdk"}@${"1.32.3"}/assets/piano.mp3`, } = props;
1350
+ const { audioUrl = `https://unpkg.com/${"@stream-io/video-react-sdk"}@${"1.33.0"}/assets/piano.mp3`, } = props;
1536
1351
  // Update audio output device when selection changes
1537
1352
  useEffect(() => {
1538
1353
  const audio = audioElementRef.current;
@@ -2556,6 +2371,9 @@ var Enter = "Enter";
2556
2371
  var Leave = "Leave";
2557
2372
  var Participants = "Participants";
2558
2373
  var Anonymous = ", and ({{ count }}) anonymous";
2374
+ var Speaker = "Speaker";
2375
+ var Microphone = "Microphone";
2376
+ var Backstage = "Backstage";
2559
2377
  var en = {
2560
2378
  Joining: Joining,
2561
2379
  Mic: Mic,
@@ -2572,7 +2390,7 @@ var en = {
2572
2390
  "Background filters performance is degraded. Consider disabling filters for better performance.": "Background filters performance is degraded. Consider disabling filters for better performance.",
2573
2391
  Live: Live,
2574
2392
  "Livestream starts soon": "Livestream starts soon",
2575
- "Livestream starts at {{ startsAt }}": "Livestream starts at {{ startsAt, datetime }}",
2393
+ "Livestream starts at {{ time }}": "Livestream starts at {{ time }}",
2576
2394
  "{{ count }} participants joined early_one": "{{ count }} participant joined early",
2577
2395
  "{{ count }} participants joined early_other": "{{ count }} participants joined early",
2578
2396
  "You can now speak.": "You can now speak.",
@@ -2651,7 +2469,48 @@ var en = {
2651
2469
  "{{ userName }} is requesting to speak": "{{ userName }} is requesting to speak",
2652
2470
  "{{ userName }} is requesting to share their camera": "{{ userName }} is requesting to share their camera",
2653
2471
  "{{ userName }} is requesting to present their screen": "{{ userName }} is requesting to present their screen",
2654
- "{{ userName }} is requesting permission: {{ permission }}": "{{ userName }} is requesting permission: {{ permission }}"
2472
+ "{{ userName }} is requesting permission: {{ permission }}": "{{ userName }} is requesting permission: {{ permission }}",
2473
+ "Applying...": "Applying...",
2474
+ "Disable blur": "Disable blur",
2475
+ "Blur background": "Blur background",
2476
+ "Migrating...": "Migrating...",
2477
+ "Reconnecting...": "Reconnecting...",
2478
+ "You are offline. Check your internet connection.": "You are offline. Check your internet connection.",
2479
+ "Failed to restore connection. Please try again.": "Failed to restore connection. Please try again.",
2480
+ "Failed to join. Please try again.": "Failed to join. Please try again.",
2481
+ "Set up your call before joining": "Set up your call before joining",
2482
+ "Please grant your browser permission to access your camera and microphone.": "Please grant your browser permission to access your camera and microphone.",
2483
+ "Start call": "Start call",
2484
+ Speaker: Speaker,
2485
+ Microphone: Microphone,
2486
+ Backstage: Backstage,
2487
+ "Go Live": "Go Live",
2488
+ "Stop Live": "End Live",
2489
+ "Enter Backstage": "Enter Backstage",
2490
+ "Prepare your livestream": "Prepare your livestream",
2491
+ "Ready to go live": "Ready to go live",
2492
+ "Stream is ready!": "Stream is ready!",
2493
+ "Waiting for the livestream to start": "Waiting for the livestream to start",
2494
+ "{{ count }} waiting": "{{ count }} waiting",
2495
+ "Join Stream": "Join Stream",
2496
+ "Join automatically when stream starts": "Join automatically when stream starts",
2497
+ "Display name": "Display name",
2498
+ "Permission needed": "Permission needed",
2499
+ "Call ended": "Call ended",
2500
+ "Rejoin call": "Rejoin call",
2501
+ "Left by mistake?": "Left by mistake?",
2502
+ "Help us improve": "Help us improve",
2503
+ "Leave feedback": "Leave feedback",
2504
+ "Failed to rejoin. Please try again.": "Failed to rejoin. Please try again.",
2505
+ "Share your feedback": "Share your feedback",
2506
+ "Tell us about your experience...": "Tell us about your experience...",
2507
+ "Submit feedback": "Submit feedback",
2508
+ "Feedback message": "Feedback message",
2509
+ "How was your call quality?": "How was your call quality?",
2510
+ "Rate {{ count }} star_one": "Rate {{ count }} star",
2511
+ "Rate {{ count }} star_other": "Rate {{ count }} stars",
2512
+ "Thank you!": "Thank you!",
2513
+ "Your feedback helps improve call quality.": "Your feedback helps improve call quality."
2655
2514
  };
2656
2515
 
2657
2516
  const translations = { en };
@@ -2864,7 +2723,12 @@ const BackstageLayout = (props) => {
2864
2723
  const { t } = useI18n();
2865
2724
  return (jsx("div", { className: "str-video__livestream-layout__wrapper", children: jsxs("div", { className: "str-video__livestream-layout__backstage", children: [startsAt && (jsx("span", { className: "str-video__livestream-layout__starts-at", children: startsAt.getTime() < Date.now()
2866
2725
  ? t('Livestream starts soon')
2867
- : t('Livestream starts at {{ startsAt }}', { startsAt }) })), showEarlyParticipantCount && (jsx("span", { className: "str-video__livestream-layout__early-viewers-count", children: t('{{ count }} participants joined early', {
2726
+ : t('Livestream starts at {{ time }}', {
2727
+ time: startsAt.toLocaleTimeString([], {
2728
+ hour: '2-digit',
2729
+ minute: '2-digit',
2730
+ }),
2731
+ }) })), showEarlyParticipantCount && (jsx("span", { className: "str-video__livestream-layout__early-viewers-count", children: t('{{ count }} participants joined early', {
2868
2732
  count: humanizeParticipantCount
2869
2733
  ? humanize(participantCount)
2870
2734
  : participantCount,
@@ -2887,12 +2751,13 @@ const ParticipantOverlay = (props) => {
2887
2751
  const { speaker, volume } = useSpeakerState();
2888
2752
  const isSpeakerMuted = volume === 0;
2889
2753
  const { t } = useI18n();
2890
- return (jsx("div", { className: "str-video__livestream-layout__overlay", children: overlayBarVisible && (jsxs("div", { className: "str-video__livestream-layout__overlay__bar", children: [showLiveBadge && (jsx("span", { className: "str-video__livestream-layout__live-badge", children: t('Live') })), showParticipantCount && (jsx("span", { className: "str-video__livestream-layout__viewers-count", children: humanizeParticipantCount
2891
- ? humanize(participantCount)
2892
- : participantCount })), showSpeakerName && (jsx("span", { className: "str-video__livestream-layout__speaker-name", title: participant.name || participant.userId || '', children: participant.name || participant.userId || '' })), showDuration && (jsx("span", { className: "str-video__livestream-layout__duration", children: formatDuration(duration) })), showMuteButton && (jsx("span", { className: clsx('str-video__livestream-layout__mute-button', isSpeakerMuted &&
2893
- 'str-video__livestream-layout__mute-button--muted'), onClick: () => speaker.setVolume(isSpeakerMuted ? 1 : 0) })), enableFullScreen &&
2894
- participantViewElement &&
2895
- typeof participantViewElement.requestFullscreen !== 'undefined' && (jsx("span", { className: "str-video__livestream-layout__go-fullscreen", onClick: toggleFullScreen }))] })) }));
2754
+ return (jsx("div", { className: "str-video__livestream-layout__overlay", children: overlayBarVisible && (jsxs("div", { className: "str-video__livestream-layout__overlay__bar", children: [jsxs("div", { className: "str-video__livestream-layout__overlay__bar-left", children: [showLiveBadge && (jsx("span", { className: "str-video__livestream-layout__live-badge", children: t('Live') })), showParticipantCount && (jsx("span", { className: "str-video__livestream-layout__viewers-count", children: humanizeParticipantCount
2755
+ ? humanize(participantCount)
2756
+ : participantCount })), showSpeakerName && (jsx("span", { className: "str-video__livestream-layout__speaker-name", title: participant.name || participant.userId || '', children: participant.name || participant.userId || '' }))] }), jsx("div", { className: "str-video__livestream-layout__overlay__bar-center", children: showDuration && (jsx("span", { className: "str-video__livestream-layout__duration", children: formatDuration(duration) })) }), jsxs("div", { className: "str-video__livestream-layout__overlay__bar-right", children: [showMuteButton && (jsx("span", { className: clsx('str-video__livestream-layout__mute-button', isSpeakerMuted &&
2757
+ 'str-video__livestream-layout__mute-button--muted'), onClick: () => speaker.setVolume(isSpeakerMuted ? 1 : 0) })), enableFullScreen &&
2758
+ participantViewElement &&
2759
+ typeof participantViewElement.requestFullscreen !==
2760
+ 'undefined' && (jsx("span", { className: "str-video__livestream-layout__go-fullscreen", onClick: toggleFullScreen }))] })] })) }));
2896
2761
  };
2897
2762
  const useUpdateCallDuration = () => {
2898
2763
  const { useIsCallLive, useCallSession } = useCallStateHooks();
@@ -3272,7 +3137,7 @@ const checkCanJoinEarly = (startsAt, joinAheadTimeSeconds) => {
3272
3137
  return Date.now() >= +startsAt - (joinAheadTimeSeconds ?? 0) * 1000;
3273
3138
  };
3274
3139
 
3275
- const [major, minor, patch] = ("1.32.3").split('.');
3140
+ const [major, minor, patch] = ("1.33.0").split('.');
3276
3141
  setSdkInfo({
3277
3142
  type: SfuModels.SdkType.REACT,
3278
3143
  major,