@100mslive/roomkit-react 0.3.17-alpha.2 → 0.3.17-alpha.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. package/dist/{HLSView-XS66ENNF.css → HLSView-DIABXDOH.css} +3 -3
  2. package/dist/{HLSView-XS66ENNF.css.map → HLSView-DIABXDOH.css.map} +1 -1
  3. package/dist/{HLSView-DRQ5LA2D.js → HLSView-ZVZQFLSC.js} +2 -2
  4. package/dist/Prebuilt/components/MoreSettings/constants.d.ts +4 -0
  5. package/dist/Prebuilt/components/Notifications/ReconnectNotifications.d.ts +1 -2
  6. package/dist/Prebuilt/components/VirtualBackground/VBCollection.d.ts +1 -0
  7. package/dist/Prebuilt/components/VirtualBackground/util.d.ts +1 -0
  8. package/dist/{chunk-UBM3HDE3.js → chunk-ZZB5LU52.js} +924 -893
  9. package/dist/chunk-ZZB5LU52.js.map +7 -0
  10. package/dist/index.cjs.css +2 -2
  11. package/dist/index.cjs.css.map +1 -1
  12. package/dist/index.cjs.js +1074 -1040
  13. package/dist/index.cjs.js.map +4 -4
  14. package/dist/index.css +2 -2
  15. package/dist/index.css.map +1 -1
  16. package/dist/index.js +1 -1
  17. package/dist/meta.cjs.json +124 -75
  18. package/dist/meta.esbuild.json +135 -86
  19. package/package.json +7 -7
  20. package/src/Prebuilt/components/AppData/AppData.tsx +9 -3
  21. package/src/Prebuilt/components/AudioVideoToggle.tsx +31 -18
  22. package/src/Prebuilt/components/MoreSettings/constants.ts +2 -0
  23. package/src/Prebuilt/components/Notifications/ReconnectNotifications.tsx +10 -37
  24. package/src/Prebuilt/components/Preview/PreviewJoin.tsx +3 -1
  25. package/src/Prebuilt/components/Settings/LayoutSettings.tsx +0 -28
  26. package/src/Prebuilt/components/Toast/ToastConfig.jsx +2 -2
  27. package/src/Prebuilt/components/VirtualBackground/VBCollection.tsx +16 -11
  28. package/src/Prebuilt/components/VirtualBackground/VBHandler.tsx +1 -2
  29. package/src/Prebuilt/components/VirtualBackground/VBPicker.tsx +10 -2
  30. package/src/Prebuilt/components/VirtualBackground/VBToggle.tsx +9 -2
  31. package/src/Prebuilt/components/VirtualBackground/util.tsx +13 -0
  32. package/dist/chunk-UBM3HDE3.js.map +0 -7
  33. /package/dist/{HLSView-DRQ5LA2D.js.map → HLSView-ZVZQFLSC.js.map} +0 -0
package/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "prebuilt",
11
11
  "roomkit"
12
12
  ],
13
- "version": "0.3.17-alpha.2",
13
+ "version": "0.3.17-alpha.20",
14
14
  "author": "100ms",
15
15
  "license": "MIT",
16
16
  "repository": {
@@ -75,12 +75,12 @@
75
75
  "react": ">=17.0.2 <19.0.0"
76
76
  },
77
77
  "dependencies": {
78
- "@100mslive/hls-player": "0.3.17-alpha.2",
78
+ "@100mslive/hls-player": "0.3.17-alpha.20",
79
79
  "@100mslive/hms-noise-cancellation": "0.0.1",
80
- "@100mslive/hms-virtual-background": "1.13.17-alpha.2",
81
- "@100mslive/hms-whiteboard": "0.0.7-alpha.2",
82
- "@100mslive/react-icons": "0.10.17-alpha.2",
83
- "@100mslive/react-sdk": "0.10.17-alpha.2",
80
+ "@100mslive/hms-virtual-background": "1.13.17-alpha.20",
81
+ "@100mslive/hms-whiteboard": "0.0.7-alpha.20",
82
+ "@100mslive/react-icons": "0.10.17-alpha.20",
83
+ "@100mslive/react-sdk": "0.10.17-alpha.20",
84
84
  "@100mslive/types-prebuilt": "0.12.11",
85
85
  "@emoji-mart/data": "^1.0.6",
86
86
  "@emoji-mart/react": "^1.0.1",
@@ -117,5 +117,5 @@
117
117
  "uuid": "^8.3.2",
118
118
  "worker-timers": "^7.0.40"
119
119
  },
120
- "gitHead": "4eac5aec26328f724b6b1a7c9d7df52ed701e193"
120
+ "gitHead": "5cbec3cfca6748ed41589662da938d79f8290ac8"
121
121
  }
@@ -1,4 +1,5 @@
1
1
  import React, { useEffect, useMemo, useRef } from 'react';
2
+ import { useMedia } from 'react-use';
2
3
  import {
3
4
  HMSRoomState,
4
5
  selectFullAppData,
@@ -10,6 +11,7 @@ import {
10
11
  useHMSStore,
11
12
  useRecordingStreaming,
12
13
  } from '@100mslive/react-sdk';
14
+ import { config as cssConfig } from '../../../Theme';
13
15
  import { LayoutMode } from '../Settings/LayoutSettings';
14
16
  import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
15
17
  //@ts-ignore
@@ -26,6 +28,7 @@ import {
26
28
  UI_MODE_GRID,
27
29
  UI_SETTINGS,
28
30
  } from '../../common/constants';
31
+ import { DEFAULT_TILES_IN_VIEW } from '../MoreSettings/constants';
29
32
 
30
33
  const initialAppData = {
31
34
  [APP_DATA.uiSettings]: {
@@ -80,6 +83,7 @@ export const AppData = React.memo(() => {
80
83
  const { isLocalVideoEnabled } = useAVToggle();
81
84
  const sidepaneOpenedRef = useRef(false);
82
85
  const [, setNoiseCancellationEnabled] = useSetNoiseCancellation();
86
+ const isMobile = useMedia(cssConfig.media.md);
83
87
 
84
88
  useEffect(() => {
85
89
  if (elements?.noise_cancellation?.enabled_by_default) {
@@ -117,10 +121,12 @@ export const AppData = React.memo(() => {
117
121
  ...uiSettings,
118
122
  [UI_SETTINGS.isAudioOnly]: undefined,
119
123
  [UI_SETTINGS.uiViewMode]: uiSettings.uiViewMode || UI_MODE_GRID,
120
- [UI_SETTINGS.maxTileCount]: elements?.video_tile_layout?.grid?.tiles_in_view || 9,
124
+ [UI_SETTINGS.maxTileCount]: isMobile
125
+ ? DEFAULT_TILES_IN_VIEW.MWEB
126
+ : Number(elements?.video_tile_layout?.grid?.tiles_in_view) || DEFAULT_TILES_IN_VIEW.DESKTOP,
121
127
  };
122
- hmsActions.setAppData(APP_DATA.uiSettings, updatedSettings, true);
123
- }, [preferences, hmsActions, elements?.video_tile_layout]);
128
+ hmsActions.setAppData(APP_DATA.uiSettings, updatedSettings, false);
129
+ }, [preferences, hmsActions, elements?.video_tile_layout, isMobile]);
124
130
 
125
131
  useEffect(() => {
126
132
  if (!preferences.subscribedNotifications) {
@@ -1,4 +1,4 @@
1
- import React, { Fragment, useEffect, useState } from 'react';
1
+ import React, { Fragment, useCallback, useEffect, useState } from 'react';
2
2
  import { HMSKrispPlugin } from '@100mslive/hms-noise-cancellation';
3
3
  import {
4
4
  DeviceType,
@@ -14,6 +14,7 @@ import {
14
14
  useDevices,
15
15
  useHMSActions,
16
16
  useHMSStore,
17
+ useHMSVanillaStore,
17
18
  } from '@100mslive/react-sdk';
18
19
  import {
19
20
  AudioLevelIcon,
@@ -105,22 +106,26 @@ const useNoiseCancellationWithPlugin = () => {
105
106
  const actions = useHMSActions();
106
107
  const [inProgress, setInProgress] = useState(false);
107
108
  const [, setNoiseCancellationEnabled] = useSetNoiseCancellation();
108
- const setNoiseCancellationWithPlugin = async (enabled: boolean) => {
109
- if (inProgress) {
110
- return;
111
- }
112
- if (!krispPlugin.checkSupport().isSupported) {
113
- throw Error('Krisp plugin is not supported');
114
- }
115
- setInProgress(true);
116
- if (enabled) {
117
- await actions.addPluginToAudioTrack(krispPlugin);
118
- } else {
119
- await actions.removePluginFromAudioTrack(krispPlugin);
120
- }
121
- setNoiseCancellationEnabled(enabled);
122
- setInProgress(false);
123
- };
109
+ const isEnabledForRoom = useHMSStore(selectRoom)?.isNoiseCancellationEnabled;
110
+ const setNoiseCancellationWithPlugin = useCallback(
111
+ async (enabled: boolean) => {
112
+ if (!isEnabledForRoom || inProgress) {
113
+ return;
114
+ }
115
+ if (!krispPlugin.checkSupport().isSupported) {
116
+ throw Error('Krisp plugin is not supported');
117
+ }
118
+ setInProgress(true);
119
+ if (enabled) {
120
+ await actions.addPluginToAudioTrack(krispPlugin);
121
+ } else {
122
+ await actions.removePluginFromAudioTrack(krispPlugin);
123
+ }
124
+ setNoiseCancellationEnabled(enabled);
125
+ setInProgress(false);
126
+ },
127
+ [actions, inProgress, isEnabledForRoom, setNoiseCancellationEnabled],
128
+ );
124
129
  return {
125
130
  setNoiseCancellationWithPlugin,
126
131
  inProgress,
@@ -274,6 +279,7 @@ export const AudioVideoToggle = ({ hideOptions = false }: { hideOptions?: boolea
274
279
  const localPeer = useHMSStore(selectLocalPeer);
275
280
  const { isLocalVideoEnabled, isLocalAudioEnabled, toggleAudio, toggleVideo } = useAVToggle();
276
281
  const actions = useHMSActions();
282
+ const vanillaStore = useHMSVanillaStore();
277
283
  const videoTrackId = useHMSStore(selectLocalVideoTrackID);
278
284
  const localVideoTrack = useHMSStore(selectVideoTrackByID(videoTrackId));
279
285
  const roomState = useHMSStore(selectRoomState);
@@ -289,7 +295,14 @@ export const AudioVideoToggle = ({ hideOptions = false }: { hideOptions?: boolea
289
295
 
290
296
  useEffect(() => {
291
297
  (async () => {
292
- if (isNoiseCancellationEnabled && !isKrispPluginAdded && !inProgress && localPeer?.audioTrack) {
298
+ const isEnabledForRoom = vanillaStore.getState(selectRoom)?.isNoiseCancellationEnabled;
299
+ if (
300
+ isEnabledForRoom &&
301
+ isNoiseCancellationEnabled &&
302
+ !isKrispPluginAdded &&
303
+ !inProgress &&
304
+ localPeer?.audioTrack
305
+ ) {
293
306
  try {
294
307
  await setNoiseCancellationWithPlugin(true);
295
308
  ToastManager.addToast({
@@ -10,3 +10,5 @@ export const trackTypeOptions = [
10
10
  { label: 'audio', value: 'audio' },
11
11
  { label: 'video', value: 'video' },
12
12
  ];
13
+
14
+ export const DEFAULT_TILES_IN_VIEW = { MWEB: 4, DESKTOP: 9 };
@@ -1,6 +1,5 @@
1
- import React, { useEffect, useState } from 'react';
1
+ import { useEffect, useRef } from 'react';
2
2
  import { HMSNotificationTypes, useHMSNotifications } from '@100mslive/react-sdk';
3
- import { Dialog, Flex, Loading, Text } from '../../..';
4
3
  // @ts-ignore: No implicit Any
5
4
  import { ToastConfig } from '../Toast/ToastConfig';
6
5
  // @ts-ignore: No implicit Any
@@ -15,50 +14,24 @@ let notificationId: string | null = null;
15
14
 
16
15
  export const ReconnectNotifications = () => {
17
16
  const notification = useHMSNotifications(notificationTypes);
18
- const [open, setOpen] = useState(false);
17
+ const prevErrorCode = useRef(0);
19
18
  useEffect(() => {
20
19
  if (!notification) {
21
20
  return;
22
21
  }
23
- if (notification.type === HMSNotificationTypes.ERROR && notification.data?.isTerminal) {
24
- setOpen(false);
25
- } else if (notification.type === HMSNotificationTypes.RECONNECTED) {
26
- notificationId = ToastManager.replaceToast(notificationId, ToastConfig.RECONNECTED.single());
27
- setOpen(false);
22
+ if (notification.type === HMSNotificationTypes.RECONNECTED) {
23
+ notificationId = ToastManager.replaceToast(
24
+ notificationId,
25
+ ToastConfig.RECONNECTED.single([4005, 4006].includes(prevErrorCode.current)),
26
+ );
28
27
  } else if (notification.type === HMSNotificationTypes.RECONNECTING) {
28
+ prevErrorCode.current = notification.data?.code || 0;
29
29
  notificationId = ToastManager.replaceToast(
30
30
  notificationId,
31
31
  ToastConfig.RECONNECTING.single(notification.data?.message),
32
32
  );
33
33
  }
34
34
  }, [notification]);
35
- if (!open) return null;
36
- return (
37
- <Dialog.Root open={open} modal={true}>
38
- <Dialog.Portal container={document.getElementById('conferencing')}>
39
- <Dialog.Overlay />
40
- <Dialog.Content
41
- css={{
42
- width: 'fit-content',
43
- maxWidth: '80%',
44
- p: '$4 $8',
45
- position: 'relative',
46
- top: 'unset',
47
- bottom: '$9',
48
- transform: 'translate(-50%, -100%)',
49
- animation: 'none !important',
50
- }}
51
- >
52
- <Flex align="center">
53
- <div style={{ display: 'inline', margin: '0.25rem' }}>
54
- <Loading size={16} />
55
- </div>
56
- <Text css={{ fontSize: '$space$8', color: '$on_surface_high' }}>
57
- You lost your network connection. Trying to reconnect.
58
- </Text>
59
- </Flex>
60
- </Dialog.Content>
61
- </Dialog.Portal>
62
- </Dialog.Root>
63
- );
35
+
36
+ return null;
64
37
  };
@@ -4,6 +4,7 @@ import {
4
4
  HMSRoomState,
5
5
  selectAppData,
6
6
  selectIsLocalVideoEnabled,
7
+ selectIsVBEnabled,
7
8
  selectLocalPeer,
8
9
  selectRoomState,
9
10
  selectVideoTrackByID,
@@ -253,6 +254,7 @@ export const PreviewTile = ({ name, error }: { name: string; error?: boolean })
253
254
 
254
255
  export const PreviewControls = ({ hideSettings, vbEnabled }: { hideSettings: boolean; vbEnabled: boolean }) => {
255
256
  const isMobile = useMedia(cssConfig.media.md);
257
+ const isVBEnabledForUser = useHMSStore(selectIsVBEnabled);
256
258
  return (
257
259
  <Flex
258
260
  justify={hideSettings && isMobile ? 'center' : 'between'}
@@ -263,7 +265,7 @@ export const PreviewControls = ({ hideSettings, vbEnabled }: { hideSettings: boo
263
265
  >
264
266
  <Flex css={{ gap: '$4' }}>
265
267
  <AudioVideoToggle />
266
- {vbEnabled ? <VBToggle /> : null}
268
+ {vbEnabled && isVBEnabledForUser ? <VBToggle /> : null}
267
269
  </Flex>
268
270
  <Flex align="center" gap="1">
269
271
  {isMobile && <NoiseCancellation iconOnly />}
@@ -41,34 +41,6 @@ export const LayoutSettings = () => {
41
41
 
42
42
  return (
43
43
  <Box className={settingOverflow()}>
44
- <Box>
45
- {/* <Text variant="md" css={{ fontWeight: '$semiBold' }}>
46
- Layout Modes
47
- </Text>
48
- <RadioGroup.Root
49
- css={{ flexDirection: 'column', alignItems: 'start', gap: '$10', my: '$2', py: '$8' }}
50
- value={layoutMode}
51
- onValueChange={value =>
52
- setUISettings({
53
- [UI_SETTINGS.layoutMode]: value,
54
- })
55
- }
56
- >
57
- {Object.keys(LayoutMode).map(key => {
58
- return (
59
- <Flex align="center" key={key} css={{ mr: '$8', gap: '$8' }}>
60
- <RadioGroup.Item value={LayoutMode[key as LayoutModeKeys]} id={`layoutMode-${key}`} css={{ mr: '$4' }}>
61
- <RadioGroup.Indicator />
62
- </RadioGroup.Item>
63
- <Label htmlFor={`layoutMode-${key}`} css={{ display: 'flex', gap: '$8', cursor: 'pointer' }}>
64
- {LayoutModeIconMapping[LayoutMode[key as LayoutModeKeys]]}
65
- {LayoutMode[key as LayoutModeKeys]}
66
- </Label>
67
- </Flex>
68
- );
69
- })}
70
- </RadioGroup.Root> */}
71
- </Box>
72
44
  <Flex align="center" css={{ w: '100%', my: '$2', py: '$8', '@md': { display: 'none' } }}>
73
45
  <Text variant="md" css={{ fontWeight: '$semiBold' }}>
74
46
  Tiles In View({maxTileCount})
@@ -153,9 +153,9 @@ export const ToastConfig = {
153
153
  },
154
154
  },
155
155
  RECONNECTED: {
156
- single: () => {
156
+ single: online => {
157
157
  return {
158
- title: `You are now connected`,
158
+ title: `You are now ${online ? 'online' : 'connected'}`,
159
159
  icon: <ConnectivityIcon />,
160
160
  variant: 'success',
161
161
  duration: 3000,
@@ -15,6 +15,7 @@ export const VBCollection = ({
15
15
  onClick?: () => Promise<void>;
16
16
  mediaURL?: string;
17
17
  value: string | HMSVirtualBackgroundTypes;
18
+ supported?: boolean;
18
19
  }[];
19
20
  title: string;
20
21
  activeBackground: string;
@@ -28,17 +29,21 @@ export const VBCollection = ({
28
29
  {title}
29
30
  </Text>
30
31
  <Box css={{ py: '$4', display: 'grid', gridTemplateColumns: '1fr 1fr 1fr', gap: '$8' }}>
31
- {options.map((option, index) => (
32
- <VBOption.Root
33
- key={option.value}
34
- testid={option.value === HMSVirtualBackgroundTypes.IMAGE ? `virtual_bg_option-${index}` : option.value}
35
- {...option}
36
- isActive={activeBackground === option.value}
37
- >
38
- <VBOption.Icon>{option?.icon}</VBOption.Icon>
39
- <VBOption.Title>{option?.title}</VBOption.Title>
40
- </VBOption.Root>
41
- ))}
32
+ {options.map((option, index) =>
33
+ option.supported ? (
34
+ <VBOption.Root
35
+ key={option.value}
36
+ testid={option.value === HMSVirtualBackgroundTypes.IMAGE ? `virtual_bg_option-${index}` : option.value}
37
+ {...option}
38
+ isActive={activeBackground === option.value}
39
+ >
40
+ <VBOption.Icon>{option?.icon}</VBOption.Icon>
41
+ <VBOption.Title>{option?.title}</VBOption.Title>
42
+ </VBOption.Root>
43
+ ) : (
44
+ ''
45
+ ),
46
+ )}
42
47
  </Box>
43
48
  </Box>
44
49
  );
@@ -1,8 +1,7 @@
1
1
  import { HMSEffectsPlugin, HMSVBPlugin, HMSVirtualBackgroundTypes } from '@100mslive/hms-virtual-background';
2
-
3
2
  export class VBPlugin {
4
3
  private hmsPlugin?: HMSVBPlugin;
5
- private effectsPlugin?: HMSEffectsPlugin | undefined;
4
+ private effectsPlugin?: HMSEffectsPlugin;
6
5
 
7
6
  initialisePlugin = (effectsSDKKey?: string, onInit?: () => void) => {
8
7
  if (this.getVBObject()) {
@@ -22,6 +22,7 @@ import {
22
22
  import { BlurPersonHighIcon, CrossCircleIcon, CrossIcon } from '@100mslive/react-icons';
23
23
  import { Box, config as cssConfig, Flex, Loading, Slider, Video } from '../../../index';
24
24
  import { Text } from '../../../Text';
25
+ import { doesBrowserSupportEffectsSDK } from './util';
25
26
  import { VBCollection } from './VBCollection';
26
27
  import { VBHandler } from './VBHandler';
27
28
  // @ts-ignore
@@ -45,6 +46,7 @@ export const VBPicker = ({ backgroundMedia = [] }: { backgroundMedia: VirtualBac
45
46
  const [blurAmount, setBlurAmount] = useState(VBHandler.getBlurAmount() || 0.5);
46
47
  const roomState = useHMSStore(selectRoomState);
47
48
  const isLargeRoom = useHMSStore(selectIsLargeRoom);
49
+ const [isBlurSupported, setIsBlurSupported] = useState(false);
48
50
  const isEffectsEnabled = useHMSStore(selectIsEffectsEnabled);
49
51
  const effectsKey = useHMSStore(selectEffectsKey);
50
52
  const isMobile = useMedia(cssConfig.media.md);
@@ -61,13 +63,16 @@ export const VBPicker = ({ backgroundMedia = [] }: { backgroundMedia: VirtualBac
61
63
  if (!track?.id) {
62
64
  return;
63
65
  }
64
- if (!isPluginAdded) {
66
+ const isEffectsSupported = doesBrowserSupportEffectsSDK();
67
+ setIsBlurSupported(isEffectsSupported);
68
+ const vbObject = VBHandler.getVBObject();
69
+ if (!isPluginAdded && !vbObject) {
65
70
  setLoadingEffects(true);
66
71
  let vbObject = VBHandler.getVBObject();
67
72
  if (!vbObject) {
68
73
  VBHandler.initialisePlugin(isEffectsEnabled && effectsKey ? effectsKey : '', () => setLoadingEffects(false));
69
74
  vbObject = VBHandler.getVBObject();
70
- if (isEffectsEnabled && effectsKey) {
75
+ if (isEffectsEnabled && isEffectsSupported && effectsKey) {
71
76
  hmsActions.addPluginsToVideoStream([vbObject as HMSEffectsPlugin]);
72
77
  } else {
73
78
  setLoadingEffects(false);
@@ -155,6 +160,7 @@ export const VBPicker = ({ backgroundMedia = [] }: { backgroundMedia: VirtualBac
155
160
  await VBHandler.removeEffects();
156
161
  hmsActions.setAppData(APP_DATA.background, HMSVirtualBackgroundTypes.NONE);
157
162
  },
163
+ supported: true,
158
164
  },
159
165
  {
160
166
  title: 'Blur',
@@ -164,6 +170,7 @@ export const VBPicker = ({ backgroundMedia = [] }: { backgroundMedia: VirtualBac
164
170
  await VBHandler?.setBlur(blurAmount);
165
171
  hmsActions.setAppData(APP_DATA.background, HMSVirtualBackgroundTypes.BLUR);
166
172
  },
173
+ supported: isBlurSupported,
167
174
  },
168
175
  ]}
169
176
  activeBackground={background}
@@ -208,6 +215,7 @@ export const VBPicker = ({ backgroundMedia = [] }: { backgroundMedia: VirtualBac
208
215
  await VBHandler?.setBackground(mediaURL);
209
216
  hmsActions.setAppData(APP_DATA.background, mediaURL);
210
217
  },
218
+ supported: true,
211
219
  }))}
212
220
  activeBackground={background}
213
221
  />
@@ -1,5 +1,11 @@
1
1
  import React from 'react';
2
- import { selectAppData, selectIsEffectsEnabled, selectIsLocalVideoEnabled, useHMSStore } from '@100mslive/react-sdk';
2
+ import {
3
+ selectAppData,
4
+ selectIsEffectsEnabled,
5
+ selectIsLocalVideoEnabled,
6
+ selectIsVBEnabled,
7
+ useHMSStore,
8
+ } from '@100mslive/react-sdk';
3
9
  import { VirtualBackgroundIcon } from '@100mslive/react-icons';
4
10
  import { Loading } from '../../../Loading';
5
11
  import { Tooltip } from '../../../Tooltip';
@@ -12,10 +18,11 @@ export const VBToggle = () => {
12
18
  const toggleVB = useSidepaneToggle(SIDE_PANE_OPTIONS.VB);
13
19
  const isVBOpen = useIsSidepaneTypeOpen(SIDE_PANE_OPTIONS.VB);
14
20
  const isVideoOn = useHMSStore(selectIsLocalVideoEnabled);
21
+ const isVBEnabled = useHMSStore(selectIsVBEnabled);
15
22
  const isEffectsEnabled = useHMSStore(selectIsEffectsEnabled);
16
23
  const loadingEffects = useHMSStore(selectAppData(APP_DATA.loadingEffects));
17
24
 
18
- if (!isVideoOn || (!isEffectsEnabled && isSafari)) {
25
+ if (!isVideoOn || (!isEffectsEnabled && isSafari) || !isVBEnabled) {
19
26
  return null;
20
27
  }
21
28
 
@@ -0,0 +1,13 @@
1
+ import { parsedUserAgent } from '@100mslive/react-sdk';
2
+ import { isSafari } from '../../common/constants';
3
+
4
+ export const doesBrowserSupportEffectsSDK = () => {
5
+ if (!isSafari) {
6
+ return true;
7
+ }
8
+ const browserVersion = parsedUserAgent?.getBrowser()?.version || '16';
9
+ if (browserVersion && parseInt(browserVersion.split('.')[0]) < 17) {
10
+ return false;
11
+ }
12
+ return true;
13
+ };