@100mslive/roomkit-react 0.3.8-alpha.0 → 0.3.8-alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/{HLSView-CTZXD762.js → HLSView-HUMJOIWO.js} +2 -2
- package/dist/Prebuilt/common/constants.d.ts +1 -0
- package/dist/Prebuilt/common/hooks.d.ts +10 -0
- package/dist/Prebuilt/components/FullPageProgress.d.ts +8 -0
- package/dist/Prebuilt/components/VirtualBackground/VBHandler.d.ts +3 -3
- package/dist/{chunk-NDLMRKFR.js → chunk-IDAPJGWC.js} +263 -279
- package/dist/chunk-IDAPJGWC.js.map +7 -0
- package/dist/index.cjs.js +190 -207
- package/dist/index.cjs.js.map +4 -4
- package/dist/index.js +1 -1
- package/dist/meta.cjs.json +74 -49
- package/dist/meta.esbuild.json +84 -59
- package/package.json +6 -6
- package/src/Prebuilt/common/constants.ts +1 -0
- package/src/Prebuilt/common/hooks.ts +72 -1
- package/src/Prebuilt/components/AppData/AppData.tsx +1 -0
- package/src/Prebuilt/components/ConferenceScreen.tsx +0 -2
- package/src/Prebuilt/components/{FullPageProgress.jsx → FullPageProgress.tsx} +10 -1
- package/src/Prebuilt/components/Header/StreamActions.tsx +3 -25
- package/src/Prebuilt/components/MoreSettings/SplitComponents/MwebOptions.tsx +4 -26
- package/src/Prebuilt/components/Notifications/PeerNotifications.tsx +1 -11
- package/src/Prebuilt/components/Preview/PreviewJoin.tsx +4 -9
- package/src/Prebuilt/components/Preview/PreviewScreen.tsx +0 -3
- package/src/Prebuilt/components/Settings/StartRecording.jsx +4 -37
- package/src/Prebuilt/components/Toast/ToastConfig.jsx +0 -22
- package/src/Prebuilt/components/VirtualBackground/VBHandler.tsx +3 -3
- package/src/Prebuilt/components/VirtualBackground/VBOption.tsx +3 -1
- package/src/Prebuilt/components/VirtualBackground/VBPicker.tsx +23 -7
- package/src/Prebuilt/components/VirtualBackground/VBToggle.tsx +5 -3
- package/src/Prebuilt/layouts/VideoStreamingSection.tsx +0 -2
- package/dist/chunk-NDLMRKFR.js.map +0 -7
- /package/dist/{HLSView-CTZXD762.js.map → HLSView-HUMJOIWO.js.map} +0 -0
@@ -20,12 +20,9 @@ import { ToastManager } from '../Toast/ToastManager';
|
|
20
20
|
// @ts-ignore
|
21
21
|
import { AdditionalRoomState, getRecordingText } from './AdditionalRoomState';
|
22
22
|
import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
|
23
|
-
|
24
|
-
import { useSetAppDataByKey } from '../AppData/useUISettings';
|
23
|
+
import { useRecordingHandler } from '../../common/hooks';
|
25
24
|
// @ts-ignore
|
26
25
|
import { formatTime } from '../../common/utils';
|
27
|
-
// @ts-ignore
|
28
|
-
import { APP_DATA } from '../../common/constants';
|
29
26
|
|
30
27
|
export const LiveStatus = () => {
|
31
28
|
const { isHLSRunning, isRTMPRunning } = useRecordingStreaming();
|
@@ -147,7 +144,7 @@ export const RecordingPauseStatus = () => {
|
|
147
144
|
const StartRecording = () => {
|
148
145
|
const permissions = useHMSStore(selectPermissions);
|
149
146
|
const [open, setOpen] = useState(false);
|
150
|
-
const
|
147
|
+
const { startRecording, recordingStarted } = useRecordingHandler();
|
151
148
|
const { isBrowserRecordingOn, isStreamingOn, isHLSRunning } = useRecordingStreaming();
|
152
149
|
const hmsActions = useHMSActions();
|
153
150
|
if (!permissions?.browserRecording || isHLSRunning) {
|
@@ -201,26 +198,7 @@ const StartRecording = () => {
|
|
201
198
|
icon
|
202
199
|
disabled={recordingStarted || isStreamingOn}
|
203
200
|
onClick={async () => {
|
204
|
-
|
205
|
-
setRecordingState(true);
|
206
|
-
await hmsActions.startRTMPOrRecording({
|
207
|
-
record: true,
|
208
|
-
});
|
209
|
-
} catch (error) {
|
210
|
-
const err = error as Error;
|
211
|
-
if (err.message.includes('stream already running')) {
|
212
|
-
ToastManager.addToast({
|
213
|
-
title: 'Recording already running',
|
214
|
-
variant: 'error',
|
215
|
-
});
|
216
|
-
} else {
|
217
|
-
ToastManager.addToast({
|
218
|
-
title: err.message,
|
219
|
-
variant: 'error',
|
220
|
-
});
|
221
|
-
}
|
222
|
-
setRecordingState(false);
|
223
|
-
}
|
201
|
+
await startRecording();
|
224
202
|
}}
|
225
203
|
>
|
226
204
|
{recordingStarted ? <Loading size={24} color="currentColor" /> : <RecordIcon />}
|
@@ -54,7 +54,7 @@ import { useShowPolls } from '../../AppData/useUISettings';
|
|
54
54
|
import { useDropdownList } from '../../hooks/useDropdownList';
|
55
55
|
import { useMyMetadata } from '../../hooks/useMetadata';
|
56
56
|
import { useUnreadPollQuizPresent } from '../../hooks/useUnreadPollQuizPresent';
|
57
|
-
import { useLandscapeHLSStream, useMobileHLSStream } from '../../../common/hooks';
|
57
|
+
import { useLandscapeHLSStream, useMobileHLSStream, useRecordingHandler } from '../../../common/hooks';
|
58
58
|
// @ts-ignore: No implicit any
|
59
59
|
import { getFormattedCount } from '../../../common/utils';
|
60
60
|
// @ts-ignore: No implicit any
|
@@ -88,7 +88,6 @@ export const MwebOptions = ({
|
|
88
88
|
const [openSettingsSheet, setOpenSettingsSheet] = useState(false);
|
89
89
|
const [showEmojiCard, setShowEmojiCard] = useState(false);
|
90
90
|
const [showRecordingOn, setShowRecordingOn] = useState(false);
|
91
|
-
const [isRecordingLoading, setIsRecordingLoading] = useState(false);
|
92
91
|
const toggleParticipants = useSidepaneToggle(SIDE_PANE_OPTIONS.PARTICIPANTS);
|
93
92
|
const { showPolls } = useShowPolls();
|
94
93
|
const togglePollView = usePollViewToggle();
|
@@ -102,7 +101,7 @@ export const MwebOptions = ({
|
|
102
101
|
const isLandscapeHLSStream = useLandscapeHLSStream();
|
103
102
|
const toggleVB = useSidepaneToggle(SIDE_PANE_OPTIONS.VB);
|
104
103
|
const isLocalVideoEnabled = useHMSStore(selectIsLocalVideoEnabled);
|
105
|
-
|
104
|
+
const { startRecording, isRecordingLoading } = useRecordingHandler();
|
106
105
|
useDropdownList({ open: openModals.size > 0 || openOptionsSheet || openSettingsSheet, name: 'MoreSettings' });
|
107
106
|
|
108
107
|
const updateState = (modalName: string, value: boolean) => {
|
@@ -260,29 +259,8 @@ export const MwebOptions = ({
|
|
260
259
|
setShowRecordingOn(true);
|
261
260
|
} else {
|
262
261
|
// start recording
|
263
|
-
|
264
|
-
|
265
|
-
await hmsActions.startRTMPOrRecording({
|
266
|
-
record: true,
|
267
|
-
});
|
268
|
-
setOpenOptionsSheet(false);
|
269
|
-
setIsRecordingLoading(false);
|
270
|
-
} catch (error) {
|
271
|
-
// @ts-ignore
|
272
|
-
if (error.message.includes('stream already running')) {
|
273
|
-
ToastManager.addToast({
|
274
|
-
title: 'Recording already running',
|
275
|
-
variant: 'error',
|
276
|
-
});
|
277
|
-
} else {
|
278
|
-
ToastManager.addToast({
|
279
|
-
// @ts-ignore
|
280
|
-
title: error.message,
|
281
|
-
variant: 'error',
|
282
|
-
});
|
283
|
-
}
|
284
|
-
setIsRecordingLoading(false);
|
285
|
-
}
|
262
|
+
await startRecording();
|
263
|
+
setOpenOptionsSheet(false);
|
286
264
|
}
|
287
265
|
if (isHLSRunning) {
|
288
266
|
setOpenOptionsSheet(false);
|
@@ -7,11 +7,7 @@ import { useSetSubscribedChatSelector, useSubscribedNotifications } from '../App
|
|
7
7
|
// @ts-ignore: No implicit Any
|
8
8
|
import { CHAT_SELECTOR, SUBSCRIBED_NOTIFICATIONS } from '../../common/constants';
|
9
9
|
|
10
|
-
const notificationTypes = [
|
11
|
-
HMSNotificationTypes.PEER_LIST,
|
12
|
-
HMSNotificationTypes.PEER_JOINED,
|
13
|
-
HMSNotificationTypes.PEER_LEFT,
|
14
|
-
];
|
10
|
+
const notificationTypes = [HMSNotificationTypes.PEER_JOINED, HMSNotificationTypes.PEER_LEFT];
|
15
11
|
|
16
12
|
export const PeerNotifications = () => {
|
17
13
|
const notification = useHMSNotifications(notificationTypes);
|
@@ -26,11 +22,6 @@ export const PeerNotifications = () => {
|
|
26
22
|
|
27
23
|
console.debug(`[${notification.type}]`, notification);
|
28
24
|
switch (notification.type) {
|
29
|
-
case HMSNotificationTypes.PEER_LIST:
|
30
|
-
if (!isPeerJoinSubscribed || notification.data.length === 0) {
|
31
|
-
return;
|
32
|
-
}
|
33
|
-
break;
|
34
25
|
case HMSNotificationTypes.PEER_JOINED:
|
35
26
|
if (!isPeerJoinSubscribed) {
|
36
27
|
return;
|
@@ -47,7 +38,6 @@ export const PeerNotifications = () => {
|
|
47
38
|
default:
|
48
39
|
return;
|
49
40
|
}
|
50
|
-
|
51
41
|
ToastBatcher.showToast({ notification });
|
52
42
|
}, [notification, isPeerJoinSubscribed, isPeerLeftSubscribed, selectedPeer.id, setPeerSelector]);
|
53
43
|
|
@@ -2,6 +2,7 @@ import React, { Fragment, useCallback, useEffect, useMemo, useState } from 'reac
|
|
2
2
|
import { useMeasure, useMedia } from 'react-use';
|
3
3
|
import {
|
4
4
|
HMSRoomState,
|
5
|
+
selectAppData,
|
5
6
|
selectIsLocalVideoEnabled,
|
6
7
|
selectLocalPeer,
|
7
8
|
selectRoomState,
|
@@ -16,24 +17,17 @@ import { MicOffIcon, SettingsIcon } from '@100mslive/react-icons';
|
|
16
17
|
import { Avatar, Box, config as cssConfig, Flex, flexCenter, styled, StyledVideoTile, Text, Video } from '../../..';
|
17
18
|
import { AudioLevel } from '../../../AudioLevel';
|
18
19
|
import { useHMSPrebuiltContext } from '../../AppContext';
|
19
|
-
// @ts-ignore: No implicit Any
|
20
20
|
import IconButton from '../../IconButton';
|
21
21
|
import SidePane from '../../layouts/SidePane';
|
22
|
-
// @ts-ignore: No implicit Any
|
23
22
|
import { AudioVideoToggle } from '../AudioVideoToggle';
|
24
|
-
// @ts-ignore: No implicit Any
|
25
23
|
import Chip from '../Chip';
|
26
|
-
// @ts-ignore: No implicit Any
|
27
24
|
import TileConnection from '../Connection/TileConnection';
|
28
|
-
// @ts-ignore: No implicit Any
|
29
25
|
import FullPageProgress from '../FullPageProgress';
|
30
26
|
// @ts-ignore: No implicit Any
|
31
27
|
import { Logo } from '../Header/HeaderComponents';
|
32
28
|
// @ts-ignore: No implicit Any
|
33
29
|
import SettingsModal from '../Settings/SettingsModal';
|
34
|
-
// @ts-ignore: No implicit Any
|
35
30
|
import { VBToggle } from '../VirtualBackground/VBToggle';
|
36
|
-
// @ts-ignore: No implicit Any
|
37
31
|
import PreviewForm from './PreviewForm';
|
38
32
|
import { useRoomLayoutPreviewScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
|
39
33
|
// @ts-ignore: No implicit Any
|
@@ -42,7 +36,7 @@ import { useAuthToken, useUISettings } from '../AppData/useUISettings';
|
|
42
36
|
import { defaultPreviewPreference, UserPreferencesKeys, useUserPreferences } from '../hooks/useUserPreferences';
|
43
37
|
// @ts-ignore: No implicit Any
|
44
38
|
import { calculateAvatarAndAttribBoxSize, getFormattedCount } from '../../common/utils';
|
45
|
-
import { UI_SETTINGS } from '../../common/constants';
|
39
|
+
import { APP_DATA, UI_SETTINGS } from '../../common/constants';
|
46
40
|
|
47
41
|
const getParticipantChipContent = (peerCount = 0) => {
|
48
42
|
if (peerCount === 0) {
|
@@ -85,6 +79,7 @@ const PreviewJoin = ({
|
|
85
79
|
const [previewError, setPreviewError] = useState(false);
|
86
80
|
const { endpoints } = useHMSPrebuiltContext();
|
87
81
|
const { peerCount } = useParticipants();
|
82
|
+
const loadingEffects = useHMSStore(selectAppData(APP_DATA.loadingEffects));
|
88
83
|
const { enableJoin, preview, join } = usePreviewJoin({
|
89
84
|
name,
|
90
85
|
token: authToken,
|
@@ -166,7 +161,7 @@ const PreviewJoin = ({
|
|
166
161
|
name={name}
|
167
162
|
disabled={!!initialName}
|
168
163
|
onChange={setName}
|
169
|
-
enableJoin={enableJoin}
|
164
|
+
enableJoin={enableJoin && !loadingEffects}
|
170
165
|
onJoin={savePreferenceAndJoin}
|
171
166
|
cannotPublishVideo={!toggleVideo}
|
172
167
|
cannotPublishAudio={!toggleAudio}
|
@@ -3,14 +3,11 @@ import { useSearchParam } from 'react-use';
|
|
3
3
|
import { Flex } from '../../..';
|
4
4
|
import { useHMSPrebuiltContext } from '../../AppContext';
|
5
5
|
import { useRoomLayout } from '../../provider/roomLayoutProvider';
|
6
|
-
// @ts-ignore: No implicit Any
|
7
6
|
import FullPageProgress from '../FullPageProgress';
|
8
|
-
// @ts-ignore: No implicit Any
|
9
7
|
import PreviewJoin from './PreviewJoin';
|
10
8
|
import { useRoomLayoutPreviewScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
|
11
9
|
// @ts-ignore: No implicit Any
|
12
10
|
import { useAuthToken } from '../AppData/useUISettings';
|
13
|
-
// @ts-ignore: No implicit Any
|
14
11
|
import { QUERY_PARAM_PREVIEW_AS_ROLE } from '../../common/constants';
|
15
12
|
|
16
13
|
export const PreviewScreen = () => {
|
@@ -4,27 +4,13 @@ import { AlertTriangleIcon } from '@100mslive/react-icons';
|
|
4
4
|
import { Button, Dialog, Flex, Text } from '../../../';
|
5
5
|
import { ResolutionInput } from '../Streaming/ResolutionInput';
|
6
6
|
import { ToastManager } from '../Toast/ToastManager';
|
7
|
-
import {
|
8
|
-
import {
|
9
|
-
|
10
|
-
export function getResolution(recordingResolution) {
|
11
|
-
const resolution = {};
|
12
|
-
if (recordingResolution.width) {
|
13
|
-
resolution.width = recordingResolution.width;
|
14
|
-
}
|
15
|
-
if (recordingResolution.height) {
|
16
|
-
resolution.height = recordingResolution.height;
|
17
|
-
}
|
18
|
-
if (Object.keys(resolution).length > 0) {
|
19
|
-
return resolution;
|
20
|
-
}
|
21
|
-
}
|
7
|
+
import { useRecordingHandler } from '../../common/hooks';
|
8
|
+
import { RTMP_RECORD_DEFAULT_RESOLUTION } from '../../common/constants';
|
22
9
|
|
23
10
|
const StartRecording = ({ open, onOpenChange }) => {
|
24
11
|
const permissions = useHMSStore(selectPermissions);
|
25
12
|
const [resolution, setResolution] = useState(RTMP_RECORD_DEFAULT_RESOLUTION);
|
26
|
-
|
27
|
-
const [recordingStarted, setRecordingState] = useSetAppDataByKey(APP_DATA.recordingStarted);
|
13
|
+
const { startRecording, recordingStarted } = useRecordingHandler();
|
28
14
|
const { isBrowserRecordingOn, isStreamingOn, isHLSRunning } = useRecordingStreaming();
|
29
15
|
const hmsActions = useHMSActions();
|
30
16
|
if (!permissions?.browserRecording || isHLSRunning) {
|
@@ -101,26 +87,7 @@ const StartRecording = ({ open, onOpenChange }) => {
|
|
101
87
|
type="submit"
|
102
88
|
disabled={recordingStarted || isStreamingOn}
|
103
89
|
onClick={async () => {
|
104
|
-
|
105
|
-
setRecordingState(true);
|
106
|
-
await hmsActions.startRTMPOrRecording({
|
107
|
-
resolution: getResolution(resolution),
|
108
|
-
record: true,
|
109
|
-
});
|
110
|
-
} catch (error) {
|
111
|
-
if (error.message.includes('stream already running')) {
|
112
|
-
ToastManager.addToast({
|
113
|
-
title: 'Recording already running',
|
114
|
-
variant: 'error',
|
115
|
-
});
|
116
|
-
} else {
|
117
|
-
ToastManager.addToast({
|
118
|
-
title: error.message,
|
119
|
-
variant: 'error',
|
120
|
-
});
|
121
|
-
}
|
122
|
-
setRecordingState(false);
|
123
|
-
}
|
90
|
+
await startRecording(resolution);
|
124
91
|
onOpenChange(false);
|
125
92
|
}}
|
126
93
|
>
|
@@ -72,28 +72,6 @@ const HandRaiseAction = React.forwardRef(({ id = '', isSingleHandRaise = true },
|
|
72
72
|
});
|
73
73
|
|
74
74
|
export const ToastConfig = {
|
75
|
-
PEER_LIST: {
|
76
|
-
single: function (notification) {
|
77
|
-
if (notification.data.length === 1) {
|
78
|
-
return {
|
79
|
-
title: `${notification.data[0]?.name} joined`,
|
80
|
-
icon: <PeopleAddIcon />,
|
81
|
-
};
|
82
|
-
}
|
83
|
-
return {
|
84
|
-
title: `${notification.data[notification.data.length - 1]?.name} and ${
|
85
|
-
notification.data.length - 1
|
86
|
-
} others joined`,
|
87
|
-
icon: <PeopleAddIcon />,
|
88
|
-
};
|
89
|
-
},
|
90
|
-
multiple: notifications => {
|
91
|
-
return {
|
92
|
-
title: `${notifications[0].data.name} and ${notifications.length - 1} others joined`,
|
93
|
-
icon: <PeopleAddIcon />,
|
94
|
-
};
|
95
|
-
},
|
96
|
-
},
|
97
75
|
PEER_JOINED: {
|
98
76
|
single: function (notification) {
|
99
77
|
return {
|
@@ -4,12 +4,12 @@ export class VBPlugin {
|
|
4
4
|
private hmsPlugin?: HMSVBPlugin;
|
5
5
|
private effectsPlugin?: HMSEffectsPlugin | undefined;
|
6
6
|
|
7
|
-
initialisePlugin = (effectsSDKKey?: string) => {
|
7
|
+
initialisePlugin = (effectsSDKKey?: string, onInit?: () => void) => {
|
8
8
|
if (this.getVBObject()) {
|
9
9
|
return;
|
10
10
|
}
|
11
11
|
if (effectsSDKKey) {
|
12
|
-
this.effectsPlugin = new HMSEffectsPlugin(effectsSDKKey);
|
12
|
+
this.effectsPlugin = new HMSEffectsPlugin(effectsSDKKey, onInit);
|
13
13
|
} else {
|
14
14
|
this.hmsPlugin = new HMSVBPlugin(HMSVirtualBackgroundTypes.NONE, HMSVirtualBackgroundTypes.NONE);
|
15
15
|
}
|
@@ -70,7 +70,7 @@ export class VBPlugin {
|
|
70
70
|
}
|
71
71
|
};
|
72
72
|
|
73
|
-
setPreset = async (preset:
|
73
|
+
setPreset = async (preset: 'quality' | 'balanced') => {
|
74
74
|
if (this.effectsPlugin) {
|
75
75
|
await this.effectsPlugin.setPreset(preset);
|
76
76
|
}
|
@@ -28,7 +28,9 @@ const Root = ({
|
|
28
28
|
'&:hover': { border: '4px solid $primary_dim' },
|
29
29
|
...(mediaURL ? { height: '$20', backgroundImage: `url(${mediaURL})`, backgroundSize: 'cover' } : {}),
|
30
30
|
}}
|
31
|
-
onClick={async () =>
|
31
|
+
onClick={async () => {
|
32
|
+
await onClick?.();
|
33
|
+
}}
|
32
34
|
>
|
33
35
|
{children}
|
34
36
|
</Flex>
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import React, { useEffect, useState } from 'react';
|
2
|
+
import { useMedia } from 'react-use';
|
2
3
|
import {
|
3
4
|
selectAppData,
|
4
5
|
selectEffectsKey,
|
@@ -19,14 +20,14 @@ import {
|
|
19
20
|
useHMSStore,
|
20
21
|
} from '@100mslive/react-sdk';
|
21
22
|
import { BlurPersonHighIcon, CrossCircleIcon, CrossIcon } from '@100mslive/react-icons';
|
22
|
-
import { Box, Flex, Slider, Video } from '../../../index';
|
23
|
+
import { Box, config as cssConfig, Flex, Loading, Slider, Video } from '../../../index';
|
23
24
|
import { Text } from '../../../Text';
|
24
25
|
import { VBCollection } from './VBCollection';
|
25
26
|
import { VBHandler } from './VBHandler';
|
26
27
|
// @ts-ignore
|
27
28
|
import { useSidepaneToggle } from '../AppData/useSidepane';
|
28
29
|
// @ts-ignore
|
29
|
-
import { useUISettings } from '../AppData/useUISettings';
|
30
|
+
import { useSetAppDataByKey, useUISettings } from '../AppData/useUISettings';
|
30
31
|
import { APP_DATA, SIDE_PANE_OPTIONS, UI_SETTINGS } from '../../common/constants';
|
31
32
|
import { defaultMedia } from './constants';
|
32
33
|
|
@@ -46,6 +47,8 @@ export const VBPicker = ({ backgroundMedia = [] }: { backgroundMedia: VirtualBac
|
|
46
47
|
const isLargeRoom = useHMSStore(selectIsLargeRoom);
|
47
48
|
const isEffectsEnabled = useHMSStore(selectIsEffectsEnabled);
|
48
49
|
const effectsKey = useHMSStore(selectEffectsKey);
|
50
|
+
const isMobile = useMedia(cssConfig.media.md);
|
51
|
+
const [loadingEffects, setLoadingEffects] = useSetAppDataByKey(APP_DATA.loadingEffects);
|
49
52
|
const isPluginAdded = useHMSStore(selectIsLocalVideoPluginPresent(VBHandler?.getName() || ''));
|
50
53
|
const background = useHMSStore(selectAppData(APP_DATA.background));
|
51
54
|
const mediaList = backgroundMedia.length
|
@@ -61,13 +64,15 @@ export const VBPicker = ({ backgroundMedia = [] }: { backgroundMedia: VirtualBac
|
|
61
64
|
return;
|
62
65
|
}
|
63
66
|
if (!isPluginAdded) {
|
67
|
+
setLoadingEffects(true);
|
64
68
|
let vbObject = VBHandler.getVBObject();
|
65
69
|
if (!vbObject) {
|
66
|
-
VBHandler.initialisePlugin(isEffectsEnabled && effectsKey ? effectsKey : '');
|
70
|
+
VBHandler.initialisePlugin(isEffectsEnabled && effectsKey ? effectsKey : '', () => setLoadingEffects(false));
|
67
71
|
vbObject = VBHandler.getVBObject();
|
68
72
|
if (isEffectsEnabled && effectsKey) {
|
69
73
|
hmsActions.addPluginsToVideoStream([vbObject as HMSEffectsPlugin]);
|
70
74
|
} else {
|
75
|
+
setLoadingEffects(false);
|
71
76
|
if (!role) {
|
72
77
|
return;
|
73
78
|
}
|
@@ -89,19 +94,30 @@ export const VBPicker = ({ backgroundMedia = [] }: { backgroundMedia: VirtualBac
|
|
89
94
|
};
|
90
95
|
handleDefaultBackground();
|
91
96
|
}
|
92
|
-
}, [
|
97
|
+
}, [
|
98
|
+
hmsActions,
|
99
|
+
role,
|
100
|
+
isPluginAdded,
|
101
|
+
isEffectsEnabled,
|
102
|
+
effectsKey,
|
103
|
+
track?.id,
|
104
|
+
background,
|
105
|
+
blurAmount,
|
106
|
+
setLoadingEffects,
|
107
|
+
]);
|
93
108
|
|
94
109
|
useEffect(() => {
|
95
110
|
if (!isVideoOn) {
|
96
111
|
toggleVB();
|
97
112
|
}
|
98
|
-
|
113
|
+
return () => setLoadingEffects(false);
|
114
|
+
}, [isVideoOn, setLoadingEffects, toggleVB]);
|
99
115
|
|
100
116
|
return (
|
101
117
|
<Flex css={{ pr: '$6', size: '100%' }} direction="column">
|
102
118
|
<Flex align="center" justify="between" css={{ w: '100%', background: '$surface_dim', pb: '$4' }}>
|
103
|
-
<Text variant="h6" css={{ color: '$on_surface_high' }}>
|
104
|
-
Virtual Background
|
119
|
+
<Text variant="h6" css={{ color: '$on_surface_high', display: 'flex', alignItems: 'center' }}>
|
120
|
+
Virtual Background {isMobile && loadingEffects ? <Loading size={18} style={{ marginLeft: '0.5rem' }} /> : ''}
|
105
121
|
</Text>
|
106
122
|
<Box
|
107
123
|
css={{ color: '$on_surface_high', '&:hover': { color: '$on_surface_medium' }, cursor: 'pointer' }}
|
@@ -1,17 +1,19 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
import { selectIsEffectsEnabled, selectIsLocalVideoEnabled, useHMSStore } from '@100mslive/react-sdk';
|
2
|
+
import { selectAppData, selectIsEffectsEnabled, selectIsLocalVideoEnabled, useHMSStore } from '@100mslive/react-sdk';
|
3
3
|
import { VirtualBackgroundIcon } from '@100mslive/react-icons';
|
4
|
+
import { Loading } from '../../../Loading';
|
4
5
|
import { Tooltip } from '../../../Tooltip';
|
5
6
|
import IconButton from '../../IconButton';
|
6
7
|
// @ts-ignore
|
7
8
|
import { useIsSidepaneTypeOpen, useSidepaneToggle } from '../AppData/useSidepane';
|
8
|
-
import { isSafari, SIDE_PANE_OPTIONS } from '../../common/constants';
|
9
|
+
import { APP_DATA, isSafari, SIDE_PANE_OPTIONS } from '../../common/constants';
|
9
10
|
|
10
11
|
export const VBToggle = () => {
|
11
12
|
const toggleVB = useSidepaneToggle(SIDE_PANE_OPTIONS.VB);
|
12
13
|
const isVBOpen = useIsSidepaneTypeOpen(SIDE_PANE_OPTIONS.VB);
|
13
14
|
const isVideoOn = useHMSStore(selectIsLocalVideoEnabled);
|
14
15
|
const isEffectsEnabled = useHMSStore(selectIsEffectsEnabled);
|
16
|
+
const loadingEffects = useHMSStore(selectAppData(APP_DATA.loadingEffects));
|
15
17
|
|
16
18
|
if (!isVideoOn || (!isEffectsEnabled && isSafari)) {
|
17
19
|
return null;
|
@@ -20,7 +22,7 @@ export const VBToggle = () => {
|
|
20
22
|
return (
|
21
23
|
<Tooltip side="top" disabled={isVBOpen} title="Configure Virtual Background">
|
22
24
|
<IconButton active={!isVBOpen} onClick={toggleVB} data-testid="virtual_bg_btn">
|
23
|
-
<VirtualBackgroundIcon />
|
25
|
+
{loadingEffects ? <Loading size={18} /> : <VirtualBackgroundIcon />}
|
24
26
|
</IconButton>
|
25
27
|
</Tooltip>
|
26
28
|
);
|
@@ -6,7 +6,6 @@ import {
|
|
6
6
|
} from '@100mslive/types-prebuilt';
|
7
7
|
import { match } from 'ts-pattern';
|
8
8
|
import { selectIsConnectedToRoom, selectLocalPeerRoleName, useHMSActions, useHMSStore } from '@100mslive/react-sdk';
|
9
|
-
// @ts-ignore: No implicit Any
|
10
9
|
import FullPageProgress from '../components/FullPageProgress';
|
11
10
|
import { GridLayout } from '../components/VideoLayouts/GridLayout';
|
12
11
|
import { Box, Flex } from '../../Layout';
|
@@ -25,7 +24,6 @@ import {
|
|
25
24
|
} from '../components/AppData/useUISettings';
|
26
25
|
import { useCloseScreenshareWhiteboard } from '../components/hooks/useCloseScreenshareWhiteboard';
|
27
26
|
import { useLandscapeHLSStream, useMobileHLSStream } from '../common/hooks';
|
28
|
-
// @ts-ignore: No implicit Any
|
29
27
|
import { SESSION_STORE_KEY } from '../common/constants';
|
30
28
|
|
31
29
|
// @ts-ignore: No implicit Any
|