@stream-io/video-react-sdk 0.6.10 → 0.6.12

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/dist/index.es.js CHANGED
@@ -1,4 +1,4 @@
1
- import { SfuModels, CallingState, OwnCapability, name, VisibilityState, Browsers, paginatedLayoutSortPreset, combineComparators, screenSharing, speakerLayoutSortPreset, CallTypes, defaultSortPreset, setSdkInfo } from '@stream-io/video-client';
1
+ import { SfuModels, CallingState, OwnCapability, name, NoiseCancellationSettingsModeEnum, VisibilityState, Browsers, paginatedLayoutSortPreset, combineComparators, screenSharing, speakerLayoutSortPreset, CallTypes, defaultSortPreset, setSdkInfo } from '@stream-io/video-client';
2
2
  export * from '@stream-io/video-client';
3
3
  import { useCall, useCallStateHooks, useI18n, Restricted, useConnectedUser, StreamCallProvider, StreamVideoProvider } from '@stream-io/video-react-bindings';
4
4
  export * from '@stream-io/video-react-bindings';
@@ -127,21 +127,24 @@ const BackgroundFilters = (props) => {
127
127
  const [canvasRef, setCanvasRef] = useState(null);
128
128
  const [width, setWidth] = useState(1920);
129
129
  const [height, setHeight] = useState(1080);
130
- const resolveFilterRef = useRef();
130
+ // Holds a ref to the `resolve` function of the returned Promise as part
131
+ // of the `camera.registerFilter()` API. Once the filter is initialized,
132
+ // it should be called with the filtered MediaStream as an argument.
133
+ const signalFilterReadyRef = useRef();
131
134
  const [mediaStream, setMediaStream] = useState();
132
- const registerFilterRef = useRef(Promise.resolve(async () => { }));
135
+ const unregister = useRef();
133
136
  useEffect(() => {
134
137
  if (!call || !backgroundFilter)
135
138
  return;
136
- registerFilterRef.current = registerFilterRef.current.then(() => call.camera.registerFilter(async (ms) => {
139
+ const register = (unregister.current || Promise.resolve()).then(() => call.camera.registerFilter(async (ms) => {
137
140
  return new Promise((resolve) => {
138
141
  setMediaStream(ms);
139
- resolveFilterRef.current = resolve;
142
+ signalFilterReadyRef.current = resolve;
140
143
  });
141
144
  }));
142
145
  return () => {
143
- registerFilterRef.current
144
- .then((unregister) => unregister())
146
+ unregister.current = register
147
+ .then((unregisterFilter) => unregisterFilter())
145
148
  .then(() => setMediaStream(undefined))
146
149
  .catch((err) => console.error('Failed to unregister filter', err));
147
150
  };
@@ -156,7 +159,7 @@ const BackgroundFilters = (props) => {
156
159
  setWidth(w);
157
160
  setHeight(h);
158
161
  }
159
- const resolveFilter = resolveFilterRef.current;
162
+ const resolveFilter = signalFilterReadyRef.current;
160
163
  if (!resolveFilter)
161
164
  return;
162
165
  const filter = canvasRef.captureStream();
@@ -1544,6 +1547,67 @@ const CallRecordingList = ({ callRecordings, CallRecordingListHeader: CallRecord
1544
1547
  return (jsxs("div", { className: "str-video__call-recording-list", children: [jsx(CallRecordingListHeader$1, { callRecordings: callRecordings, onRefresh: onRefresh }), jsx("div", { className: "str-video__call-recording-list__listing", children: loading ? (jsx(LoadingCallRecordingList, { callRecordings: callRecordings })) : callRecordings.length ? (jsxs(Fragment, { children: [jsx("ul", { className: "str-video__call-recording-list__list", children: jsxs("li", { className: "str-video__call-recording-list__item", children: [jsx("div", { className: "str-video__call-recording-list__filename", children: "Name" }), jsx("div", { className: "str-video__call-recording-list__time", children: "Start time" }), jsx("div", { className: "str-video__call-recording-list__time", children: "End time" }), jsx("div", { className: "str-video__call-recording-list__download" })] }) }), jsx("ul", { className: "str-video__call-recording-list__list", children: callRecordings.map((recording) => (jsx(CallRecordingListItem$1, { recording: recording }, recording.filename))) })] })) : (jsx(EmptyCallRecordingList, {})) })] }));
1545
1548
  };
1546
1549
 
1550
+ const NoiseCancellationContext = createContext(null);
1551
+ /**
1552
+ * Exposes the NoiseCancellation API.
1553
+ * Throws an error if used outside <NoiseCancellationProvider />.
1554
+ */
1555
+ const useNoiseCancellation = () => {
1556
+ const context = useContext(NoiseCancellationContext);
1557
+ if (!context) {
1558
+ throw new Error('useNoiseCancellation must be used within a NoiseCancellationProvider');
1559
+ }
1560
+ return context;
1561
+ };
1562
+ const NoiseCancellationProvider = (props) => {
1563
+ const { children, noiseCancellation } = props;
1564
+ const call = useCall();
1565
+ const { useCallSettings, useHasPermissions } = useCallStateHooks();
1566
+ const settings = useCallSettings();
1567
+ const noiseCancellationAllowed = !!(settings &&
1568
+ settings.audio.noise_cancellation &&
1569
+ settings.audio.noise_cancellation.mode !==
1570
+ NoiseCancellationSettingsModeEnum.DISABLED);
1571
+ const hasCapability = useHasPermissions(OwnCapability.ENABLE_NOISE_CANCELLATION);
1572
+ const isSupported = hasCapability &&
1573
+ noiseCancellationAllowed &&
1574
+ noiseCancellation.isSupported();
1575
+ const [isEnabled, setIsEnabled] = useState(false);
1576
+ const deinit = useRef();
1577
+ useEffect(() => {
1578
+ if (!call || !isSupported)
1579
+ return;
1580
+ const unsubscribe = noiseCancellation.on('change', (v) => setIsEnabled(v));
1581
+ const init = (deinit.current || Promise.resolve())
1582
+ .then(() => noiseCancellation.init())
1583
+ .then(() => call.microphone.enableNoiseCancellation(noiseCancellation))
1584
+ .catch((err) => console.error(`Can't initialize noise suppression`, err));
1585
+ return () => {
1586
+ deinit.current = init
1587
+ .then(() => call.microphone.disableNoiseCancellation())
1588
+ .then(() => noiseCancellation.dispose())
1589
+ .then(() => unsubscribe());
1590
+ };
1591
+ }, [call, isSupported, noiseCancellation]);
1592
+ return (jsx(NoiseCancellationContext.Provider, { value: {
1593
+ isSupported,
1594
+ isEnabled,
1595
+ setEnabled: (enabledOrSetter) => {
1596
+ if (!noiseCancellation)
1597
+ return;
1598
+ const enable = typeof enabledOrSetter === 'function'
1599
+ ? enabledOrSetter(isEnabled)
1600
+ : enabledOrSetter;
1601
+ if (enable) {
1602
+ noiseCancellation.enable();
1603
+ }
1604
+ else {
1605
+ noiseCancellation.disable();
1606
+ }
1607
+ },
1608
+ }, children: children }));
1609
+ };
1610
+
1547
1611
  const RingingCallControls = () => {
1548
1612
  const call = useCall();
1549
1613
  const { useCallCallingState } = useCallStateHooks();
@@ -2433,7 +2497,7 @@ const VerticalScrollButtons = ({ scrollWrapper, }) => {
2433
2497
  };
2434
2498
  const hasScreenShare = (p) => !!p?.publishedTracks.includes(SfuModels.TrackType.SCREEN_SHARE);
2435
2499
 
2436
- const [major, minor, patch] = ("0.6.10" ).split('.');
2500
+ const [major, minor, patch] = ("0.6.12" ).split('.');
2437
2501
  setSdkInfo({
2438
2502
  type: SfuModels.SdkType.REACT,
2439
2503
  major,
@@ -2441,5 +2505,5 @@ setSdkInfo({
2441
2505
  patch,
2442
2506
  });
2443
2507
 
2444
- export { AcceptCallButton, Audio, Avatar, AvatarFallback, BackgroundFiltersProvider, BaseVideo, CallControls, CallParticipantListing, CallParticipantListingItem, CallParticipantsList, CallPreview, CallRecordingList, CallRecordingListHeader, CallRecordingListItem, CallStats, CallStatsButton, CallStatsLatencyChart, CancelCallButton, CancelCallConfirmButton, CompositeButton, DefaultParticipantViewUI, DefaultReactionsMenu, DefaultScreenShareOverlay, DefaultVideoPlaceholder, DeviceSelector, DeviceSelectorAudioInput, DeviceSelectorAudioOutput, DeviceSelectorVideo, DeviceSettings, DropDownSelect, DropDownSelectOption, EmptyCallRecordingListing, GenericMenu, GenericMenuButtonItem, Icon, IconButton, LivestreamLayout, LoadingCallRecordingListing, LoadingIndicator, MenuToggle, MenuVisualType, Notification, PaginatedGridLayout, ParticipantActionsContextMenu, ParticipantDetails, ParticipantView, ParticipantViewContext, ParticipantsAudio, PermissionNotification, PermissionRequestList, PermissionRequests, ReactionsButton, RecordCallButton, RecordCallConfirmationButton, RecordingInProgressNotification, RingingCall, RingingCallControls, ScreenShareButton, SearchInput, SearchResults, SpeakerLayout, SpeakingWhileMutedNotification, SpeechIndicator, StatCard, StatCardExplanation, StatsTag, Statuses, StreamCall, StreamTheme, StreamVideo, TextButton, ToggleAudioOutputButton, ToggleAudioPreviewButton, ToggleAudioPublishingButton, ToggleVideoPreviewButton, ToggleVideoPublishingButton, Tooltip, Video$1 as Video, VideoPreview, WithTooltip, defaultReactions, translations, useBackgroundFilters, useHorizontalScrollPosition, useMenuContext, useParticipantViewContext, usePersistedDevicePreferences, useRequestPermission, useTrackElementVisibility, useVerticalScrollPosition };
2508
+ export { AcceptCallButton, Audio, Avatar, AvatarFallback, BackgroundFiltersProvider, BaseVideo, CallControls, CallParticipantListing, CallParticipantListingItem, CallParticipantsList, CallPreview, CallRecordingList, CallRecordingListHeader, CallRecordingListItem, CallStats, CallStatsButton, CallStatsLatencyChart, CancelCallButton, CancelCallConfirmButton, CompositeButton, DefaultParticipantViewUI, DefaultReactionsMenu, DefaultScreenShareOverlay, DefaultVideoPlaceholder, DeviceSelector, DeviceSelectorAudioInput, DeviceSelectorAudioOutput, DeviceSelectorVideo, DeviceSettings, DropDownSelect, DropDownSelectOption, EmptyCallRecordingListing, GenericMenu, GenericMenuButtonItem, Icon, IconButton, LivestreamLayout, LoadingCallRecordingListing, LoadingIndicator, MenuToggle, MenuVisualType, NoiseCancellationProvider, Notification, PaginatedGridLayout, ParticipantActionsContextMenu, ParticipantDetails, ParticipantView, ParticipantViewContext, ParticipantsAudio, PermissionNotification, PermissionRequestList, PermissionRequests, ReactionsButton, RecordCallButton, RecordCallConfirmationButton, RecordingInProgressNotification, RingingCall, RingingCallControls, ScreenShareButton, SearchInput, SearchResults, SpeakerLayout, SpeakingWhileMutedNotification, SpeechIndicator, StatCard, StatCardExplanation, StatsTag, Statuses, StreamCall, StreamTheme, StreamVideo, TextButton, ToggleAudioOutputButton, ToggleAudioPreviewButton, ToggleAudioPublishingButton, ToggleVideoPreviewButton, ToggleVideoPublishingButton, Tooltip, Video$1 as Video, VideoPreview, WithTooltip, defaultReactions, translations, useBackgroundFilters, useHorizontalScrollPosition, useMenuContext, useNoiseCancellation, useParticipantViewContext, usePersistedDevicePreferences, useRequestPermission, useTrackElementVisibility, useVerticalScrollPosition };
2445
2509
  //# sourceMappingURL=index.es.js.map