@100mslive/roomkit-react 0.3.4 → 0.3.5-alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/{HLSView-6NEUUQBX.js → HLSView-YAR57OPP.js} +5 -3
- package/dist/{HLSView-6NEUUQBX.js.map → HLSView-YAR57OPP.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-MXPCXPZQ.js} +484 -456
- package/dist/chunk-MXPCXPZQ.js.map +7 -0
- package/dist/fixtures/peers.d.ts +1 -1
- package/dist/index.cjs.js +920 -896
- package/dist/index.cjs.js.map +4 -4
- package/dist/index.js +1 -1
- package/dist/meta.cjs.json +97 -72
- package/dist/meta.esbuild.json +105 -80
- 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/Chat/ChatSelector.tsx +4 -1
- package/src/Prebuilt/components/ConferenceScreen.tsx +1 -4
- package/src/Prebuilt/components/Connection/ConnectionIndicator.tsx +3 -2
- 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 +14 -0
- 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
@@ -2,13 +2,17 @@ const getInitials = (name: string | undefined) => {
|
|
2
2
|
if (!name) {
|
3
3
|
return undefined;
|
4
4
|
} else {
|
5
|
-
return
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
return (
|
6
|
+
name
|
7
|
+
.trim()
|
8
|
+
// remove non chars/digits
|
9
|
+
.replace(/[^a-zA-Z0-9]/g, '')
|
10
|
+
.match(/(^\S\S?|\b\S)?/g)
|
11
|
+
?.join('')
|
12
|
+
?.match(/(^\S|\S$)?/g)
|
13
|
+
?.join('')
|
14
|
+
.toUpperCase()
|
15
|
+
);
|
12
16
|
}
|
13
17
|
};
|
14
18
|
|
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
|
</>
|
@@ -2,6 +2,7 @@ import React, { useMemo, useState } from 'react';
|
|
2
2
|
import { useMedia } from 'react-use';
|
3
3
|
import {
|
4
4
|
HMSPeer,
|
5
|
+
HMSPeerType,
|
5
6
|
selectMessagesUnreadCountByPeerID,
|
6
7
|
selectMessagesUnreadCountByRole,
|
7
8
|
selectRemotePeers,
|
@@ -158,7 +159,9 @@ const VirtualizedSelectItemList = ({
|
|
158
159
|
() =>
|
159
160
|
peers.filter(
|
160
161
|
// search should be empty or search phrase should be included in name
|
161
|
-
peer =>
|
162
|
+
peer =>
|
163
|
+
(!searchValue || peer.name.toLowerCase().includes(searchValue.toLowerCase())) &&
|
164
|
+
peer.type !== HMSPeerType.SIP,
|
162
165
|
),
|
163
166
|
[peers, searchValue],
|
164
167
|
);
|
@@ -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,5 +1,5 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
import { selectConnectionQualityByPeerID, useHMSStore } from '@100mslive/react-sdk';
|
2
|
+
import { HMSPeerType, selectConnectionQualityByPeerID, selectPeerTypeByID, useHMSStore } from '@100mslive/react-sdk';
|
3
3
|
import { PoorConnectivityIcon } from '@100mslive/react-icons';
|
4
4
|
import { styled, Tooltip, useTheme } from '../../..';
|
5
5
|
// @ts-ignore
|
@@ -32,9 +32,10 @@ export const ConnectionIndicator = ({
|
|
32
32
|
hideBg?: boolean;
|
33
33
|
}) => {
|
34
34
|
const downlinkQuality = useHMSStore(selectConnectionQualityByPeerID(peerId))?.downlinkQuality;
|
35
|
+
const peerType = useHMSStore(selectPeerTypeByID(peerId));
|
35
36
|
const { theme } = useTheme();
|
36
37
|
const defaultColor = theme.colors.on_surface_low;
|
37
|
-
if (downlinkQuality === -1 || downlinkQuality === undefined) {
|
38
|
+
if (downlinkQuality === -1 || downlinkQuality === undefined || peerType === HMSPeerType.SIP) {
|
38
39
|
return null;
|
39
40
|
}
|
40
41
|
if (downlinkQuality === 0) {
|
@@ -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;
|
@@ -291,6 +296,15 @@ const ParticipantActions = React.memo(
|
|
291
296
|
) : (
|
292
297
|
<>
|
293
298
|
<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
|
};
|