@100mslive/roomkit-react 0.3.4 → 0.3.5-alpha.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/dist/{HLSView-6NEUUQBX.js → HLSView-GF23J3TJ.js} +5 -3
- package/dist/{HLSView-6NEUUQBX.js.map → HLSView-GF23J3TJ.js.map} +2 -2
- package/dist/Prebuilt/components/RaiseHand.d.ts +1 -1
- package/dist/Prebuilt/components/hooks/useMetadata.d.ts +8 -0
- package/dist/{chunk-JF6QG5V5.js → chunk-7O27GQEH.js} +479 -453
- package/dist/chunk-7O27GQEH.js.map +7 -0
- package/dist/fixtures/peers.d.ts +1 -1
- package/dist/index.cjs.js +917 -894
- package/dist/index.cjs.js.map +4 -4
- package/dist/index.js +1 -1
- package/dist/meta.cjs.json +93 -68
- package/dist/meta.esbuild.json +101 -76
- package/package.json +7 -7
- package/src/Avatar/Avatar.tsx +3 -3
- package/src/Avatar/getAvatarBg.ts +11 -7
- package/src/Prebuilt/App.tsx +5 -6
- package/src/Prebuilt/AppStateContext.tsx +27 -14
- package/src/Prebuilt/components/AuthToken.jsx +27 -26
- package/src/Prebuilt/components/Chat/ChatFooter.tsx +2 -4
- package/src/Prebuilt/components/ConferenceScreen.tsx +1 -4
- package/src/Prebuilt/components/Connection/TileConnection.tsx +14 -2
- package/src/Prebuilt/components/Footer/Footer.tsx +1 -4
- package/src/Prebuilt/components/Footer/ParticipantList.tsx +15 -1
- package/src/Prebuilt/components/MoreSettings/SplitComponents/DesktopOptions.tsx +1 -2
- package/src/Prebuilt/components/MoreSettings/SplitComponents/MwebOptions.tsx +1 -5
- package/src/Prebuilt/components/PreviousRoleInMetadata.tsx +0 -1
- package/src/Prebuilt/components/RaiseHand.tsx +7 -1
- package/src/Prebuilt/components/RoleChangeRequest/RoleChangeRequestModal.tsx +0 -1
- package/src/Prebuilt/components/hooks/{useMetadata.jsx → useMetadata.tsx} +2 -8
- package/src/Prebuilt/layouts/HLSView.jsx +4 -1
- package/src/Prebuilt/layouts/VideoStreamingSection.tsx +22 -15
- package/src/Stats/Stats.tsx +12 -2
- package/src/fixtures/peers.ts +2 -1
- package/dist/chunk-JF6QG5V5.js.map +0 -7
package/src/Prebuilt/App.tsx
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
import React, { MutableRefObject, useEffect, useRef } from 'react';
|
2
2
|
import { HMSStatsStoreWrapper, HMSStoreWrapper, IHMSNotifications } from '@100mslive/hms-video-store';
|
3
3
|
import { Layout, Logo, Screens, Theme, Typography } from '@100mslive/types-prebuilt';
|
4
|
+
import { match } from 'ts-pattern';
|
4
5
|
import {
|
5
6
|
HMSActions,
|
6
7
|
HMSReactiveStore,
|
@@ -251,12 +252,10 @@ const AppStates = ({ activeState }: { activeState: PrebuiltStates }) => {
|
|
251
252
|
const { isLeaveScreenEnabled } = useRoomLayoutLeaveScreen();
|
252
253
|
useAutoStartStreaming();
|
253
254
|
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
}
|
259
|
-
return <ConferenceScreen />;
|
255
|
+
return match({ activeState, isPreviewScreenEnabled, isLeaveScreenEnabled })
|
256
|
+
.with({ activeState: PrebuiltStates.PREVIEW, isPreviewScreenEnabled: true }, () => <PreviewScreen />)
|
257
|
+
.with({ activeState: PrebuiltStates.LEAVE, isLeaveScreenEnabled: true }, () => <LeaveScreen />)
|
258
|
+
.otherwise(() => <ConferenceScreen />);
|
260
259
|
};
|
261
260
|
|
262
261
|
const BackSwipe = () => {
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import React, { useContext, useEffect } from 'react';
|
2
2
|
import { usePreviousDistinct } from 'react-use';
|
3
|
+
import { match, P } from 'ts-pattern';
|
3
4
|
import { HMSRoomState, selectRoomState, useHMSStore } from '@100mslive/react-sdk';
|
4
5
|
import { VBHandler } from './components/VirtualBackground/VBHandler';
|
5
6
|
import { useRoomLayout } from './provider/roomLayoutProvider';
|
@@ -52,20 +53,32 @@ export const useAppStateManager = () => {
|
|
52
53
|
if (!roomLayout) {
|
53
54
|
return;
|
54
55
|
}
|
55
|
-
|
56
|
-
setActiveState(PrebuiltStates.MEETING)
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
56
|
+
match([roomState, prevRoomState])
|
57
|
+
.with([HMSRoomState.Connected, P.any], () => setActiveState(PrebuiltStates.MEETING))
|
58
|
+
.with(
|
59
|
+
[HMSRoomState.Disconnecting, HMSRoomState.Connected],
|
60
|
+
[HMSRoomState.Disconnecting, HMSRoomState.Connecting],
|
61
|
+
[HMSRoomState.Disconnecting, HMSRoomState.Reconnecting],
|
62
|
+
[HMSRoomState.Disconnected, HMSRoomState.Connected],
|
63
|
+
[HMSRoomState.Disconnected, HMSRoomState.Connecting],
|
64
|
+
[HMSRoomState.Disconnected, HMSRoomState.Reconnecting],
|
65
|
+
() => {
|
66
|
+
setActiveState(
|
67
|
+
match({ isLeaveScreenEnabled, isPreviewScreenEnabled })
|
68
|
+
.with({ isLeaveScreenEnabled: true }, () => PrebuiltStates.LEAVE)
|
69
|
+
.with({ isPreviewScreenEnabled: true }, () => PrebuiltStates.PREVIEW)
|
70
|
+
.otherwise(() => PrebuiltStates.MEETING),
|
71
|
+
);
|
72
|
+
VBHandler.reset();
|
73
|
+
redirectToLeave(1000); // to clear toasts after 1 second
|
74
|
+
},
|
75
|
+
)
|
76
|
+
.with([HMSRoomState.Disconnected, P.nullish], () => {
|
77
|
+
setActiveState(isPreviewScreenEnabled ? PrebuiltStates.PREVIEW : PrebuiltStates.MEETING);
|
78
|
+
})
|
79
|
+
.otherwise(() => {
|
80
|
+
// do nothing
|
81
|
+
});
|
69
82
|
}, [roomLayout, roomState, isLeaveScreenEnabled, isPreviewScreenEnabled, prevRoomState, redirectToLeave]);
|
70
83
|
|
71
84
|
return { activeState, rejoin };
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import React, { useEffect, useState } from 'react';
|
2
2
|
import { useSessionStorage } from 'react-use';
|
3
|
+
import { match } from 'ts-pattern';
|
3
4
|
import { v4 as uuid } from 'uuid';
|
4
5
|
import { useHMSActions } from '@100mslive/react-sdk';
|
5
6
|
import { Dialog } from '../../Modal';
|
@@ -88,38 +89,38 @@ const convertError = error => {
|
|
88
89
|
'If you think this is a mistake on our side, please reach out to us over Discord:',
|
89
90
|
'https://discord.com/invite/kGdmszyzq2',
|
90
91
|
);
|
91
|
-
|
92
|
-
|
92
|
+
return match([error.action, error.code])
|
93
|
+
.with(['GET_TOKEN', 403], () => ({
|
93
94
|
title: 'Psst! This room is currently inactive.',
|
94
95
|
body: 'Please feel free to join another open room for more conversations. Thanks for stopping by!',
|
95
|
-
}
|
96
|
-
|
97
|
-
|
96
|
+
}))
|
97
|
+
|
98
|
+
.with(['GET_TOKEN', 404], () => ({
|
98
99
|
title: 'Room code does not exist',
|
99
100
|
body: 'We could not find a room code corresponding to this link.',
|
100
|
-
}
|
101
|
-
|
102
|
-
return {
|
101
|
+
}))
|
102
|
+
.with(['GET_TOKEN', 2003], () => ({
|
103
103
|
title: 'Endpoint is not reachable',
|
104
104
|
body: `Endpoint is not reachable. ${error.description}.`,
|
105
|
-
}
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
105
|
+
}))
|
106
|
+
.otherwise(() =>
|
107
|
+
match(error.response?.status)
|
108
|
+
.with(404, () => ({
|
109
|
+
title: 'Room does not exist',
|
110
|
+
body: 'We could not find a room corresponding to this link.',
|
111
|
+
}))
|
112
|
+
.with(403, () => ({
|
113
|
+
title: 'Accessing room using this link format is disabled',
|
114
|
+
body: 'You can re-enable this from the developer section in Dashboard.',
|
115
|
+
}))
|
116
|
+
.otherwise(() => {
|
117
|
+
console.error('Token API Error', error);
|
118
|
+
return {
|
119
|
+
title: 'Error fetching token',
|
120
|
+
body: 'An error occurred while fetching the app token. Please look into logs for more details.',
|
121
|
+
};
|
122
|
+
}),
|
123
|
+
);
|
123
124
|
};
|
124
125
|
|
125
126
|
export default AuthToken;
|
@@ -2,7 +2,7 @@ import React, { ReactNode, useCallback, useEffect, useRef, useState } from 'reac
|
|
2
2
|
import { useMedia } from 'react-use';
|
3
3
|
import data from '@emoji-mart/data';
|
4
4
|
import Picker from '@emoji-mart/react';
|
5
|
-
import { HMSException, selectLocalPeer,
|
5
|
+
import { HMSException, selectLocalPeer, useHMSActions, useHMSStore } from '@100mslive/react-sdk';
|
6
6
|
import { EmojiIcon, PauseCircleIcon, SendIcon, VerticalMenuIcon } from '@100mslive/react-icons';
|
7
7
|
import { Box, config as cssConfig, Flex, IconButton as BaseIconButton, Popover, styled, Text } from '../../..';
|
8
8
|
import { IconButton } from '../../../IconButton';
|
@@ -89,8 +89,6 @@ export const ChatFooter = ({ onSend, children }: { onSend: (count: number) => vo
|
|
89
89
|
const defaultSelection = useDefaultChatSelection();
|
90
90
|
const selection = selectedPeer.name || selectedRole || defaultSelection;
|
91
91
|
const isLocalPeerBlacklisted = useIsPeerBlacklisted({ local: true });
|
92
|
-
const { toggleAudio, toggleVideo } = useAVToggle();
|
93
|
-
const noAVPermissions = !(toggleAudio || toggleVideo);
|
94
92
|
const isMwebHLSStream = useMobileHLSStream();
|
95
93
|
const isLandscapeHLSStream = useLandscapeHLSStream();
|
96
94
|
|
@@ -275,7 +273,7 @@ export const ChatFooter = ({ onSend, children }: { onSend: (count: number) => vo
|
|
275
273
|
}}
|
276
274
|
gap="2"
|
277
275
|
>
|
278
|
-
|
276
|
+
<RaiseHand css={{ bg: '$surface_default' }} />
|
279
277
|
<MoreSettings elements={elements} screenType={screenType} />
|
280
278
|
</Flex>
|
281
279
|
</>
|
@@ -6,7 +6,6 @@ import {
|
|
6
6
|
selectAppData,
|
7
7
|
selectIsConnectedToRoom,
|
8
8
|
selectRoomState,
|
9
|
-
useAVToggle,
|
10
9
|
useHMSActions,
|
11
10
|
useHMSStore,
|
12
11
|
} from '@100mslive/react-sdk';
|
@@ -54,8 +53,6 @@ export const ConferenceScreen = () => {
|
|
54
53
|
const dropdownListRef = useRef<string[]>();
|
55
54
|
const [isHLSStarted] = useSetAppDataByKey(APP_DATA.hlsStarted);
|
56
55
|
|
57
|
-
const { toggleAudio, toggleVideo } = useAVToggle();
|
58
|
-
const noAVPermissions = !(toggleAudio || toggleVideo);
|
59
56
|
// using it in hls stream to show action button when chat is disabled
|
60
57
|
const showChat = !!screenProps.elements?.chat;
|
61
58
|
const autoRoomJoined = useRef(isPreviewScreenEnabled);
|
@@ -202,7 +199,7 @@ export const ConferenceScreen = () => {
|
|
202
199
|
justify="end"
|
203
200
|
gap="2"
|
204
201
|
>
|
205
|
-
|
202
|
+
<RaiseHand />
|
206
203
|
<MoreSettings elements={screenProps.elements} screenType={screenProps.screenType} />
|
207
204
|
<Box
|
208
205
|
css={{
|
@@ -1,6 +1,12 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
import {
|
3
|
-
|
2
|
+
import {
|
3
|
+
HMSPeerType,
|
4
|
+
selectPeerTypeByID,
|
5
|
+
selectScreenShareByPeerID,
|
6
|
+
selectSessionStore,
|
7
|
+
useHMSStore,
|
8
|
+
} from '@100mslive/react-sdk';
|
9
|
+
import { CallIcon, PinIcon, ShareScreenIcon, SpotlightIcon } from '@100mslive/react-icons';
|
4
10
|
import { Flex, styled, Text, textEllipsis } from '../../..';
|
5
11
|
import { ConnectionIndicator } from './ConnectionIndicator';
|
6
12
|
import { SESSION_STORE_KEY } from '../../common/constants';
|
@@ -20,12 +26,18 @@ const TileConnection = ({
|
|
20
26
|
}) => {
|
21
27
|
const spotlighted = useHMSStore(selectSessionStore(SESSION_STORE_KEY.SPOTLIGHT)) === peerId;
|
22
28
|
const isPeerScreenSharing = !!useHMSStore(selectScreenShareByPeerID(peerId));
|
29
|
+
const peerType = useHMSStore(selectPeerTypeByID(peerId));
|
23
30
|
return (
|
24
31
|
<Wrapper>
|
25
32
|
{!hideLabel ? (
|
26
33
|
<>
|
27
34
|
{name ? (
|
28
35
|
<Flex align="center">
|
36
|
+
{peerType === HMSPeerType.SIP && (
|
37
|
+
<IconWrapper>
|
38
|
+
<CallIcon width="15" height="15" />
|
39
|
+
</IconWrapper>
|
40
|
+
)}
|
29
41
|
{isPeerScreenSharing && (
|
30
42
|
<IconWrapper>
|
31
43
|
<ShareScreenIcon width="15" height="15" />
|
@@ -2,7 +2,6 @@ import React, { useEffect } from 'react';
|
|
2
2
|
import { useMedia } from 'react-use';
|
3
3
|
import { ConferencingScreen } from '@100mslive/types-prebuilt';
|
4
4
|
import { Chat_ChatState } from '@100mslive/types-prebuilt/elements/chat';
|
5
|
-
import { useAVToggle } from '@100mslive/react-sdk';
|
6
5
|
import { config as cssConfig, Footer as AppFooter } from '../../..';
|
7
6
|
// @ts-ignore: No implicit Any
|
8
7
|
import { AudioVideoToggle } from '../AudioVideoToggle';
|
@@ -41,8 +40,6 @@ export const Footer = ({
|
|
41
40
|
const isOverlayChat = !!elements?.chat?.is_overlay;
|
42
41
|
const openByDefault = elements?.chat?.initial_state === Chat_ChatState.CHAT_STATE_OPEN;
|
43
42
|
|
44
|
-
const { toggleAudio, toggleVideo } = useAVToggle();
|
45
|
-
const noAVPermissions = !(toggleAudio || toggleVideo);
|
46
43
|
const isChatOpen = useIsSidepaneTypeOpen(SIDE_PANE_OPTIONS.CHAT);
|
47
44
|
const toggleChat = useSidepaneToggle(SIDE_PANE_OPTIONS.CHAT);
|
48
45
|
const { showPolls } = useShowPolls();
|
@@ -90,7 +87,7 @@ export const Footer = ({
|
|
90
87
|
>
|
91
88
|
{isMobile ? (
|
92
89
|
<>
|
93
|
-
|
90
|
+
<RaiseHand />
|
94
91
|
{elements?.chat && <ChatToggle />}
|
95
92
|
<MoreSettings elements={elements} screenType={screenType} />
|
96
93
|
</>
|
@@ -2,6 +2,7 @@ import React, { Fragment, useCallback, useState } from 'react';
|
|
2
2
|
import { useDebounce, useMedia } from 'react-use';
|
3
3
|
import {
|
4
4
|
HMSPeer,
|
5
|
+
HMSPeerType,
|
5
6
|
HMSRoleName,
|
6
7
|
selectHandRaisedPeers,
|
7
8
|
selectHasPeerHandRaised,
|
@@ -14,6 +15,7 @@ import {
|
|
14
15
|
} from '@100mslive/react-sdk';
|
15
16
|
import {
|
16
17
|
AddIcon,
|
18
|
+
CallIcon,
|
17
19
|
ChangeRoleIcon,
|
18
20
|
CrossIcon,
|
19
21
|
HandIcon,
|
@@ -184,6 +186,7 @@ export const Participant = ({
|
|
184
186
|
{isConnected && peer.roleName ? (
|
185
187
|
<ParticipantActions
|
186
188
|
peerId={peer.id}
|
189
|
+
peerType={peer.type}
|
187
190
|
isLocal={peer.id === localPeerId}
|
188
191
|
role={peer.roleName}
|
189
192
|
isHandRaisedAccordion={isHandRaisedAccordion}
|
@@ -261,6 +264,7 @@ const VirtualizedParticipants = ({
|
|
261
264
|
const ParticipantActions = React.memo(
|
262
265
|
({
|
263
266
|
peerId,
|
267
|
+
peerType,
|
264
268
|
role,
|
265
269
|
isLocal,
|
266
270
|
isHandRaisedAccordion,
|
@@ -269,6 +273,7 @@ const ParticipantActions = React.memo(
|
|
269
273
|
role: string;
|
270
274
|
isLocal: boolean;
|
271
275
|
isHandRaisedAccordion?: boolean;
|
276
|
+
peerType: HMSPeerType;
|
272
277
|
}) => {
|
273
278
|
const isHandRaised = useHMSStore(selectHasPeerHandRaised(peerId));
|
274
279
|
const canChangeRole = useHMSStore(selectPermissions)?.changeRole;
|
@@ -290,7 +295,16 @@ const ParticipantActions = React.memo(
|
|
290
295
|
<HandRaisedAccordionParticipantActions peerId={peerId} role={role} />
|
291
296
|
) : (
|
292
297
|
<>
|
293
|
-
<ConnectionIndicator peerId={peerId} />
|
298
|
+
{peerType === HMSPeerType.REGULAR && <ConnectionIndicator peerId={peerId} />}
|
299
|
+
{peerType === HMSPeerType.SIP && (
|
300
|
+
<Flex
|
301
|
+
align="center"
|
302
|
+
justify="center"
|
303
|
+
css={{ p: '$1', c: '$on_surface_high', bg: '$surface_bright', borderRadius: '$round' }}
|
304
|
+
>
|
305
|
+
<CallIcon width={19} height={19} />
|
306
|
+
</Flex>
|
307
|
+
)}
|
294
308
|
{isHandRaised && (
|
295
309
|
<Flex
|
296
310
|
align="center"
|
@@ -29,7 +29,6 @@ import { FullScreenItem } from '../FullScreenItem';
|
|
29
29
|
import { MuteAllModal } from '../MuteAllModal';
|
30
30
|
// @ts-ignore: No implicit any
|
31
31
|
import { useDropdownList } from '../../hooks/useDropdownList';
|
32
|
-
// @ts-ignore: No implicit any
|
33
32
|
import { useMyMetadata } from '../../hooks/useMetadata';
|
34
33
|
// @ts-ignore: No implicit any
|
35
34
|
import { APP_DATA, isMacOS } from '../../../common/constants';
|
@@ -117,7 +116,7 @@ export const DesktopOptions = ({
|
|
117
116
|
) : null}
|
118
117
|
|
119
118
|
{screenType !== 'hls_live_streaming' ? (
|
120
|
-
<Dropdown.Item>
|
119
|
+
<Dropdown.Item css={{ '&:empty': { display: 'none' } }}>
|
121
120
|
<PIP
|
122
121
|
content={
|
123
122
|
<Flex css={{ w: '100%' }}>
|
@@ -6,7 +6,6 @@ import {
|
|
6
6
|
selectIsConnectedToRoom,
|
7
7
|
selectPeerCount,
|
8
8
|
selectPermissions,
|
9
|
-
useAVToggle,
|
10
9
|
useHMSActions,
|
11
10
|
useHMSStore,
|
12
11
|
useRecordingStreaming,
|
@@ -51,7 +50,6 @@ import { usePollViewToggle, useSidepaneToggle } from '../../AppData/useSidepane'
|
|
51
50
|
import { useShowPolls } from '../../AppData/useUISettings';
|
52
51
|
// @ts-ignore: No implicit any
|
53
52
|
import { useDropdownList } from '../../hooks/useDropdownList';
|
54
|
-
// @ts-ignore: No implicit any
|
55
53
|
import { useMyMetadata } from '../../hooks/useMetadata';
|
56
54
|
import { useUnreadPollQuizPresent } from '../../hooks/useUnreadPollQuizPresent';
|
57
55
|
import { useLandscapeHLSStream, useMobileHLSStream } from '../../../common/hooks';
|
@@ -95,8 +93,6 @@ export const MwebOptions = ({
|
|
95
93
|
const peerCount = useHMSStore(selectPeerCount);
|
96
94
|
const emojiCardRef = useRef(null);
|
97
95
|
const { isBRBOn, toggleBRB, isHandRaised, toggleHandRaise } = useMyMetadata();
|
98
|
-
const { toggleAudio, toggleVideo } = useAVToggle();
|
99
|
-
const noAVPermissions = !(toggleAudio || toggleVideo);
|
100
96
|
const { unreadPollQuiz, setUnreadPollQuiz } = useUnreadPollQuizPresent();
|
101
97
|
const { title, description } = useRoomLayoutHeader();
|
102
98
|
const toggleDetailsSheet = useSheetToggle(SHEET_OPTIONS.ROOM_DETAILS);
|
@@ -175,7 +171,7 @@ export const MwebOptions = ({
|
|
175
171
|
</ActionTile.Root>
|
176
172
|
)}
|
177
173
|
|
178
|
-
{
|
174
|
+
{elements.hand_raise ? (
|
179
175
|
<ActionTile.Root
|
180
176
|
active={isHandRaised}
|
181
177
|
onClick={() => {
|
@@ -4,11 +4,17 @@ import { CSS } from '../../Theme';
|
|
4
4
|
import { Tooltip } from '../../Tooltip';
|
5
5
|
// @ts-ignore: No implicit Any
|
6
6
|
import IconButton from '../IconButton';
|
7
|
-
|
7
|
+
import { useRoomLayoutConferencingScreen } from '../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
|
8
8
|
import { useMyMetadata } from './hooks/useMetadata';
|
9
9
|
|
10
10
|
export const RaiseHand = ({ css }: { css?: CSS }) => {
|
11
11
|
const { isHandRaised, toggleHandRaise } = useMyMetadata();
|
12
|
+
const { elements } = useRoomLayoutConferencingScreen();
|
13
|
+
|
14
|
+
if (!elements.hand_raise) {
|
15
|
+
return null;
|
16
|
+
}
|
17
|
+
|
12
18
|
return (
|
13
19
|
<Tooltip title={isHandRaised ? 'Lower hand' : 'Raise hand'}>
|
14
20
|
<IconButton
|
@@ -13,7 +13,6 @@ import { Flex, Text } from '../../..';
|
|
13
13
|
import { PreviewControls, PreviewTile } from '../Preview/PreviewJoin';
|
14
14
|
import { RequestPrompt } from './RequestPrompt';
|
15
15
|
import { useRoomLayoutPreviewScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
|
16
|
-
// @ts-ignore: No implicit Any
|
17
16
|
import { useMyMetadata } from '../hooks/useMetadata';
|
18
17
|
// @ts-ignore: No implicit Any
|
19
18
|
import { ROLE_CHANGE_DECLINED } from '../../common/constants';
|
@@ -15,7 +15,7 @@ export const useMyMetadata = () => {
|
|
15
15
|
const metaData = useHMSStore(selectPeerMetadata(localPeerId));
|
16
16
|
const isHandRaised = useHMSStore(selectHasPeerHandRaised(localPeerId));
|
17
17
|
|
18
|
-
const update = async updatedFields => {
|
18
|
+
const update = async (updatedFields: Record<string, any>) => {
|
19
19
|
try {
|
20
20
|
// get current state from store and merge updated fields
|
21
21
|
const currentMetadata = vanillaStore.getState(selectPeerMetadata(localPeerId));
|
@@ -24,6 +24,7 @@ export const useMyMetadata = () => {
|
|
24
24
|
} catch (error) {
|
25
25
|
console.error('failed to update metadata ', updatedFields);
|
26
26
|
}
|
27
|
+
return false;
|
27
28
|
};
|
28
29
|
|
29
30
|
const toggleHandRaise = useCallback(async () => {
|
@@ -43,12 +44,6 @@ export const useMyMetadata = () => {
|
|
43
44
|
}
|
44
45
|
}, [metaData?.isBRBOn]); //eslint-disable-line
|
45
46
|
|
46
|
-
const setPrevRole = async role => {
|
47
|
-
await update({
|
48
|
-
prevRole: role,
|
49
|
-
});
|
50
|
-
};
|
51
|
-
|
52
47
|
return {
|
53
48
|
isHandRaised,
|
54
49
|
isBRBOn: !!metaData?.isBRBOn,
|
@@ -56,6 +51,5 @@ export const useMyMetadata = () => {
|
|
56
51
|
updateMetaData: update,
|
57
52
|
toggleHandRaise,
|
58
53
|
toggleBRB,
|
59
|
-
setPrevRole,
|
60
54
|
};
|
61
55
|
};
|
@@ -602,7 +602,10 @@ const HLSView = () => {
|
|
602
602
|
if (isFullScreen) {
|
603
603
|
toggle();
|
604
604
|
}
|
605
|
-
|
605
|
+
// toggle and closing fullscreen takes few ms, to make it synced we are calling settimeout
|
606
|
+
setTimeout(() => {
|
607
|
+
toggleChat();
|
608
|
+
}, 0);
|
606
609
|
}}
|
607
610
|
/>
|
608
611
|
)}
|
@@ -70,20 +70,6 @@ export const VideoStreamingSection = ({
|
|
70
70
|
return null;
|
71
71
|
}
|
72
72
|
|
73
|
-
let ViewComponent;
|
74
|
-
if (screenType === 'hls_live_streaming') {
|
75
|
-
ViewComponent = <HLSView />;
|
76
|
-
} else if (localPeerRole === waitingViewerRole) {
|
77
|
-
ViewComponent = <WaitingView />;
|
78
|
-
} else if (pdfAnnotatorActive) {
|
79
|
-
ViewComponent = <PDFView />;
|
80
|
-
} else if (urlToIframe) {
|
81
|
-
ViewComponent = <EmbedView />;
|
82
|
-
} else {
|
83
|
-
//@ts-ignore
|
84
|
-
ViewComponent = <GridLayout {...(elements as DefaultConferencingScreen_Elements)?.video_tile_layout?.grid} />;
|
85
|
-
}
|
86
|
-
|
87
73
|
return (
|
88
74
|
<Suspense fallback={<FullPageProgress />}>
|
89
75
|
<Flex
|
@@ -97,7 +83,28 @@ export const VideoStreamingSection = ({
|
|
97
83
|
.with({ isMobileHLSStream: true }, () => 'column')
|
98
84
|
.otherwise(() => 'row')}
|
99
85
|
>
|
100
|
-
{
|
86
|
+
{match({ screenType, localPeerRole, pdfAnnotatorActive, urlToIframe })
|
87
|
+
.with(
|
88
|
+
{
|
89
|
+
screenType: 'hls_live_streaming',
|
90
|
+
},
|
91
|
+
() => <HLSView />,
|
92
|
+
)
|
93
|
+
.when(
|
94
|
+
({ localPeerRole }) => localPeerRole === waitingViewerRole,
|
95
|
+
() => <WaitingView />,
|
96
|
+
)
|
97
|
+
.with({ pdfAnnotatorActive: true }, () => <PDFView />)
|
98
|
+
.when(
|
99
|
+
({ urlToIframe }) => !!urlToIframe,
|
100
|
+
() => <EmbedView />,
|
101
|
+
)
|
102
|
+
|
103
|
+
.otherwise(() => {
|
104
|
+
// @ts-ignore
|
105
|
+
return <GridLayout {...(elements as DefaultConferencingScreen_Elements)?.video_tile_layout?.grid} />;
|
106
|
+
})}
|
107
|
+
|
101
108
|
<Box
|
102
109
|
css={{
|
103
110
|
flex: match({ isLandscapeHLSStream, isMobileHLSStream })
|
package/src/Stats/Stats.tsx
CHANGED
@@ -56,7 +56,7 @@ export function VideoTileStats({ videoTrackID, audioTrackID, peerID, isLocal = f
|
|
56
56
|
}
|
57
57
|
const layer = stat.rid ? simulcastMapping[stat.rid as RID] : '';
|
58
58
|
return (
|
59
|
-
<Fragment>
|
59
|
+
<Fragment key={`${stat.id}${stat.rid}`}>
|
60
60
|
{layer && <StatsRow label={layer.toUpperCase()} value="" />}
|
61
61
|
<StatsRow
|
62
62
|
show={isNotNullishAndNot0(stat.frameWidth)}
|
@@ -106,6 +106,16 @@ export function VideoTileStats({ videoTrackID, audioTrackID, peerID, isLocal = f
|
|
106
106
|
: ''
|
107
107
|
}`}
|
108
108
|
/>
|
109
|
+
<StatsRow
|
110
|
+
show={isNotNullish(videoTrackStats?.totalPausesDuration)}
|
111
|
+
label="Pauses Duration"
|
112
|
+
value={videoTrackStats?.totalPausesDuration}
|
113
|
+
/>
|
114
|
+
<StatsRow
|
115
|
+
show={isNotNullish(videoTrackStats?.totalFreezesDuration)}
|
116
|
+
label="Freezes Duration"
|
117
|
+
value={videoTrackStats?.totalFreezesDuration}
|
118
|
+
/>
|
109
119
|
<StatsRow
|
110
120
|
show={isNotNullish(videoTrackStats?.bitrate)}
|
111
121
|
label="Bitrate(V)"
|
@@ -185,7 +195,7 @@ const RawStatsRow = ({
|
|
185
195
|
show?: boolean;
|
186
196
|
tooltip?: string;
|
187
197
|
}) => {
|
188
|
-
const statsLabel = <Stats.Label
|
198
|
+
const statsLabel = <Stats.Label>{label}</Stats.Label>;
|
189
199
|
|
190
200
|
return (
|
191
201
|
<>
|
package/src/fixtures/peers.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import { HMSPeerWithMuteStatus } from '@100mslive/
|
1
|
+
import { HMSPeerType, HMSPeerWithMuteStatus } from '@100mslive/react-sdk';
|
2
2
|
|
3
3
|
let counter = 1;
|
4
4
|
export const makeFakeParticipant = (name: string, role = 'Student'): HMSPeerWithMuteStatus => {
|
@@ -11,6 +11,7 @@ export const makeFakeParticipant = (name: string, role = 'Student'): HMSPeerWith
|
|
11
11
|
isLocal: counter === 1,
|
12
12
|
groups: [],
|
13
13
|
isHandRaised: false,
|
14
|
+
type: HMSPeerType.REGULAR,
|
14
15
|
},
|
15
16
|
isAudioEnabled: false,
|
16
17
|
};
|