@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 +15 -0
- package/dist/index.cjs.js +25 -6
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +25 -7
- package/dist/index.es.js.map +1 -1
- package/dist/src/components/Notification/MicCaptureErrorNotification.d.ts +10 -0
- package/dist/src/components/Notification/index.d.ts +1 -0
- package/package.json +3 -3
- package/src/components/CallControls/CallControls.tsx +9 -4
- package/src/components/Notification/MicCaptureErrorNotification.tsx +43 -0
- package/src/components/Notification/Notification.tsx +1 -1
- package/src/components/Notification/index.ts +1 -0
- package/src/core/components/CallLayout/LivestreamLayout.tsx +9 -7
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.
|
|
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 &&
|
|
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.
|
|
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;
|