@stream-io/video-react-sdk 1.31.8 → 1.32.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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,21 @@
2
2
 
3
3
  This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
4
4
 
5
+ ## [1.32.0](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-sdk-1.31.8...@stream-io/video-react-sdk-1.32.0) (2026-02-06)
6
+
7
+ ### Dependency Updates
8
+
9
+ - `@stream-io/video-client` updated to version `1.42.0`
10
+ - `@stream-io/video-react-bindings` updated to version `1.13.4`
11
+
12
+ ### Features
13
+
14
+ - Detectors for broken microphone setup ([#2090](https://github.com/GetStream/stream-video-js/issues/2090)) ([552b3f4](https://github.com/GetStream/stream-video-js/commit/552b3f4e3c54e0b6fa67221cd510f4ea1f6f8a61))
15
+
16
+ ### Bug Fixes
17
+
18
+ - **react:** hide livestream layout fullscreen button when fullscreen is unsupported ([#2112](https://github.com/GetStream/stream-video-js/issues/2112)) ([f436b01](https://github.com/GetStream/stream-video-js/commit/f436b01f28416d2974c278f4059495fea555f305))
19
+
5
20
  ## [1.31.8](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-sdk-1.31.7...@stream-io/video-react-sdk-1.31.8) (2026-01-30)
6
21
 
7
22
  ### Dependency Updates
package/dist/index.cjs.js CHANGED
@@ -1104,7 +1104,7 @@ const Notification = (props) => {
1104
1104
  }, visibilityTimeout);
1105
1105
  return () => clearTimeout(timeout);
1106
1106
  }, [isVisible, resetIsVisible, visibilityTimeout]);
1107
- return (jsxRuntime.jsxs("div", { ref: refs.setReference, children: [isVisible && (jsxRuntime.jsxs("div", { className: clsx('str-video__notification', className), ref: refs.setFloating, style: {
1107
+ return (jsxRuntime.jsxs("div", { className: "str-video__notification-wrapper", ref: refs.setReference, children: [isVisible && (jsxRuntime.jsxs("div", { className: clsx('str-video__notification', className), ref: refs.setFloating, style: {
1108
1108
  position: strategy,
1109
1109
  top: y ?? 0,
1110
1110
  left: x ?? 0,
@@ -1161,6 +1161,22 @@ const RecordingInProgressNotification = ({ children, text, }) => {
1161
1161
  return (jsxRuntime.jsx(Notification, { message: message, iconClassName: "str-video__icon str-video__icon--recording-on", isVisible: isVisible, placement: "top-start", close: () => setVisible(false), children: children }));
1162
1162
  };
1163
1163
 
1164
+ const MicCaptureErrorNotification = ({ children, text, placement, }) => {
1165
+ const call = videoReactBindings.useCall();
1166
+ const { t } = videoReactBindings.useI18n();
1167
+ const [isVisible, setIsVisible] = react.useState(false);
1168
+ react.useEffect(() => {
1169
+ if (!call)
1170
+ return;
1171
+ return call.on('mic.capture_report', (event) => {
1172
+ setIsVisible(!event.capturesAudio);
1173
+ });
1174
+ }, [call]);
1175
+ const message = text ??
1176
+ t('Your microphone is not capturing audio. Please check your setup.');
1177
+ return (jsxRuntime.jsx(Notification, { message: message, isVisible: isVisible, placement: placement, close: () => setIsVisible(false), children: children }));
1178
+ };
1179
+
1164
1180
  const LoadingIndicator = ({ className, type = 'spinner', text, tooltip, }) => {
1165
1181
  return (jsxRuntime.jsxs("div", { className: clsx('str-video__loading-indicator', className), title: tooltip, children: [jsxRuntime.jsx("div", { className: clsx('str-video__loading-indicator__icon', type) }), text && jsxRuntime.jsx("p", { className: "str-video__loading-indicator-text", children: text })] }));
1166
1182
  };
@@ -1510,7 +1526,7 @@ const SpeakerTest = (props) => {
1510
1526
  const audioElementRef = react.useRef(null);
1511
1527
  const [isPlaying, setIsPlaying] = react.useState(false);
1512
1528
  const { t } = videoReactBindings.useI18n();
1513
- const { audioUrl = `https://unpkg.com/${"@stream-io/video-react-sdk"}@${"1.31.8"}/assets/piano.mp3`, } = props;
1529
+ const { audioUrl = `https://unpkg.com/${"@stream-io/video-react-sdk"}@${"1.32.0"}/assets/piano.mp3`, } = props;
1514
1530
  // Update audio output device when selection changes
1515
1531
  react.useEffect(() => {
1516
1532
  const audio = audioElementRef.current;
@@ -1727,7 +1743,7 @@ const CancelCallButton = ({ disabled, caption, onClick, onLeave, }) => {
1727
1743
  return (jsxRuntime.jsx(IconButton, { disabled: disabled, icon: "call-end", variant: "danger", title: caption ?? t('Leave call'), "data-testid": "cancel-call-button", onClick: handleClick }));
1728
1744
  };
1729
1745
 
1730
- const CallControls = ({ onLeave }) => (jsxRuntime.jsxs("div", { className: "str-video__call-controls", children: [jsxRuntime.jsx(videoReactBindings.Restricted, { requiredGrants: [videoClient.OwnCapability.SEND_AUDIO], children: jsxRuntime.jsx(SpeakingWhileMutedNotification, { children: jsxRuntime.jsx(ToggleAudioPublishingButton, {}) }) }), jsxRuntime.jsx(videoReactBindings.Restricted, { requiredGrants: [videoClient.OwnCapability.SEND_VIDEO], children: jsxRuntime.jsx(ToggleVideoPublishingButton, {}) }), jsxRuntime.jsx(videoReactBindings.Restricted, { requiredGrants: [videoClient.OwnCapability.CREATE_REACTION], children: jsxRuntime.jsx(ReactionsButton, {}) }), jsxRuntime.jsx(videoReactBindings.Restricted, { requiredGrants: [videoClient.OwnCapability.SCREENSHARE], children: jsxRuntime.jsx(ScreenShareButton, {}) }), jsxRuntime.jsx(videoReactBindings.Restricted, { requiredGrants: [
1746
+ const CallControls = ({ onLeave }) => (jsxRuntime.jsxs("div", { className: "str-video__call-controls", children: [jsxRuntime.jsx(videoReactBindings.Restricted, { requiredGrants: [videoClient.OwnCapability.SEND_AUDIO], children: jsxRuntime.jsx(MicCaptureErrorNotification, { children: jsxRuntime.jsx(SpeakingWhileMutedNotification, { children: jsxRuntime.jsx(ToggleAudioPublishingButton, {}) }) }) }), jsxRuntime.jsx(videoReactBindings.Restricted, { requiredGrants: [videoClient.OwnCapability.SEND_VIDEO], children: jsxRuntime.jsx(ToggleVideoPublishingButton, {}) }), jsxRuntime.jsx(videoReactBindings.Restricted, { requiredGrants: [videoClient.OwnCapability.CREATE_REACTION], children: jsxRuntime.jsx(ReactionsButton, {}) }), jsxRuntime.jsx(videoReactBindings.Restricted, { requiredGrants: [videoClient.OwnCapability.SCREENSHARE], children: jsxRuntime.jsx(ScreenShareButton, {}) }), jsxRuntime.jsx(videoReactBindings.Restricted, { requiredGrants: [
1731
1747
  videoClient.OwnCapability.START_RECORD_CALL,
1732
1748
  videoClient.OwnCapability.STOP_RECORD_CALL,
1733
1749
  ], children: jsxRuntime.jsx(RecordCallButton, {}) }), jsxRuntime.jsx(CancelCallButton, { onLeave: onLeave })] }));
@@ -2837,7 +2853,7 @@ const ParticipantOverlay = (props) => {
2837
2853
  showLiveBadge ||
2838
2854
  showMuteButton ||
2839
2855
  showSpeakerName;
2840
- const { participant } = useParticipantViewContext();
2856
+ const { participant, participantViewElement } = useParticipantViewContext();
2841
2857
  const { useParticipantCount, useSpeakerState } = videoReactBindings.useCallStateHooks();
2842
2858
  const participantCount = useParticipantCount();
2843
2859
  const duration = useUpdateCallDuration();
@@ -2848,7 +2864,9 @@ const ParticipantOverlay = (props) => {
2848
2864
  return (jsxRuntime.jsx("div", { className: "str-video__livestream-layout__overlay", children: overlayBarVisible && (jsxRuntime.jsxs("div", { className: "str-video__livestream-layout__overlay__bar", children: [showLiveBadge && (jsxRuntime.jsx("span", { className: "str-video__livestream-layout__live-badge", children: t('Live') })), showParticipantCount && (jsxRuntime.jsx("span", { className: "str-video__livestream-layout__viewers-count", children: humanizeParticipantCount
2849
2865
  ? videoClient.humanize(participantCount)
2850
2866
  : participantCount })), showSpeakerName && (jsxRuntime.jsx("span", { className: "str-video__livestream-layout__speaker-name", title: participant.name || participant.userId || '', children: participant.name || participant.userId || '' })), showDuration && (jsxRuntime.jsx("span", { className: "str-video__livestream-layout__duration", children: formatDuration(duration) })), showMuteButton && (jsxRuntime.jsx("span", { className: clsx('str-video__livestream-layout__mute-button', isSpeakerMuted &&
2851
- 'str-video__livestream-layout__mute-button--muted'), onClick: () => speaker.setVolume(isSpeakerMuted ? 1 : 0) })), enableFullScreen && (jsxRuntime.jsx("span", { className: "str-video__livestream-layout__go-fullscreen", onClick: toggleFullScreen }))] })) }));
2867
+ 'str-video__livestream-layout__mute-button--muted'), onClick: () => speaker.setVolume(isSpeakerMuted ? 1 : 0) })), enableFullScreen &&
2868
+ participantViewElement &&
2869
+ typeof participantViewElement.requestFullscreen !== 'undefined' && (jsxRuntime.jsx("span", { className: "str-video__livestream-layout__go-fullscreen", onClick: toggleFullScreen }))] })) }));
2852
2870
  };
2853
2871
  const useUpdateCallDuration = () => {
2854
2872
  const { useIsCallLive, useCallSession } = videoReactBindings.useCallStateHooks();
@@ -3228,7 +3246,7 @@ const checkCanJoinEarly = (startsAt, joinAheadTimeSeconds) => {
3228
3246
  return Date.now() >= +startsAt - (joinAheadTimeSeconds ?? 0) * 1000;
3229
3247
  };
3230
3248
 
3231
- const [major, minor, patch] = ("1.31.8").split('.');
3249
+ const [major, minor, patch] = ("1.32.0").split('.');
3232
3250
  videoClient.setSdkInfo({
3233
3251
  type: videoClient.SfuModels.SdkType.REACT,
3234
3252
  major,
@@ -3278,6 +3296,7 @@ exports.LivestreamPlayer = LivestreamPlayer;
3278
3296
  exports.LoadingCallRecordingListing = LoadingCallRecordingListing;
3279
3297
  exports.LoadingIndicator = LoadingIndicator;
3280
3298
  exports.MenuToggle = MenuToggle;
3299
+ exports.MicCaptureErrorNotification = MicCaptureErrorNotification;
3281
3300
  exports.NoiseCancellationProvider = NoiseCancellationProvider;
3282
3301
  exports.Notification = Notification;
3283
3302
  exports.PaginatedGridLayout = PaginatedGridLayout;