@100mslive/roomkit-react 0.1.6-alpha.0 → 0.1.6-alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/{HLSView-PY2FKWX3.js → HLSView-HNVYG5VE.js} +208 -118
- package/dist/HLSView-HNVYG5VE.js.map +7 -0
- package/dist/Prebuilt/AppContext.d.ts +1 -1
- package/dist/Prebuilt/components/Chat/ChatFooter.d.ts +7 -0
- package/dist/Prebuilt/components/Connection/ConnectionIndicator.d.ts +6 -0
- package/dist/Prebuilt/components/Connection/TileConnection.d.ts +10 -0
- package/dist/Prebuilt/components/Footer/ChatToggle.d.ts +4 -0
- package/dist/Prebuilt/components/Footer/RoleAccordion.d.ts +14 -0
- package/dist/Prebuilt/components/Footer/RoleOptions.d.ts +6 -0
- package/dist/Prebuilt/components/Header/StreamActions.d.ts +11 -0
- package/dist/Prebuilt/components/Leave/DesktopLeaveRoom.d.ts +4 -3
- package/dist/Prebuilt/components/Leave/EndSessionContent.d.ts +4 -3
- package/dist/Prebuilt/components/Leave/LeaveCard.d.ts +1 -2
- package/dist/Prebuilt/components/Leave/LeaveSessionContent.d.ts +3 -1
- package/dist/Prebuilt/components/Leave/MwebLeaveRoom.d.ts +4 -3
- package/dist/Prebuilt/components/MoreSettings/SplitComponents/MwebOptions.d.ts +6 -0
- package/dist/Prebuilt/components/Preview/PreviewContainer.d.ts +3 -0
- package/dist/Prebuilt/components/Preview/PreviewJoin.d.ts +16 -0
- package/dist/Prebuilt/components/RoleChangeRequestModal.d.ts +2 -0
- package/dist/Prebuilt/components/SecondaryTiles.d.ts +1 -1
- package/dist/Prebuilt/components/VideoLayouts/EqualProminence.d.ts +1 -1
- package/dist/Prebuilt/components/VideoLayouts/Grid.d.ts +1 -0
- package/dist/Prebuilt/components/VideoLayouts/GridLayout.d.ts +5 -3
- package/dist/Prebuilt/components/VideoLayouts/ProminenceLayout.d.ts +6 -3
- package/dist/Prebuilt/components/VideoLayouts/RoleProminence.d.ts +1 -1
- package/dist/Prebuilt/components/VideoLayouts/ScreenshareLayout.d.ts +1 -1
- package/dist/Prebuilt/components/VideoLayouts/interface.d.ts +1 -0
- package/dist/Prebuilt/components/hooks/useAutoStartStreaming.d.ts +1 -0
- package/dist/Prebuilt/components/hooks/useRedirectToLeave.d.ts +3 -0
- package/dist/Prebuilt/components/hooks/useTileLayout.d.ts +2 -1
- package/dist/Prebuilt/components/hooks/useVideoTileLayout.d.ts +2 -0
- package/dist/Prebuilt/layouts/SidePane.d.ts +4 -1
- package/dist/Prebuilt/layouts/VideoStreamingSection.d.ts +2 -1
- package/dist/{VirtualBackground-AYDHYLIZ.js → VirtualBackground-UM2FOUHQ.js} +3 -3
- package/dist/{chunk-E2M2ZSOL.js → chunk-364HP22I.js} +2 -2
- package/dist/{chunk-RXTHJUMZ.js → chunk-LYSAET4G.js} +946 -390
- package/dist/chunk-LYSAET4G.js.map +7 -0
- package/dist/{chunk-GQD2AGWW.js → chunk-POE7H4IE.js} +12 -2
- package/dist/{chunk-GQD2AGWW.js.map → chunk-POE7H4IE.js.map} +2 -2
- package/dist/{conference-V2XZGTKU.js → conference-UWLJHMB2.js} +1116 -1316
- package/dist/conference-UWLJHMB2.js.map +7 -0
- package/dist/index.cjs.js +6080 -5631
- package/dist/index.cjs.js.map +4 -4
- package/dist/index.js +2 -2
- package/dist/meta.cjs.json +741 -493
- package/dist/meta.esbuild.json +782 -529
- package/package.json +8 -7
- package/src/Prebuilt/App.tsx +10 -21
- package/src/Prebuilt/AppContext.tsx +1 -1
- package/src/Prebuilt/IconButton.jsx +10 -0
- package/src/Prebuilt/common/PeersSorter.ts +1 -1
- package/src/Prebuilt/common/constants.js +1 -2
- package/src/Prebuilt/common/utils.js +1 -1
- package/src/Prebuilt/components/AppData/AppData.jsx +8 -2
- package/src/Prebuilt/components/AppData/useUISettings.js +6 -6
- package/src/Prebuilt/components/AudioVideoToggle.jsx +8 -6
- package/src/Prebuilt/components/Chat/Chat.jsx +23 -6
- package/src/Prebuilt/components/Chat/ChatBody.jsx +20 -21
- package/src/Prebuilt/components/Chat/{ChatFooter.jsx → ChatFooter.tsx} +38 -13
- package/src/Prebuilt/components/Chat/ChatParticipantHeader.jsx +38 -27
- package/src/Prebuilt/components/Chat/useEmojiPickerStyles.js +5 -4
- package/src/Prebuilt/components/Connection/{ConnectionIndicator.jsx → ConnectionIndicator.tsx} +12 -4
- package/src/Prebuilt/components/Connection/{TileConnection.jsx → TileConnection.tsx} +20 -6
- package/src/Prebuilt/components/EmojiReaction.jsx +2 -6
- package/src/Prebuilt/components/Footer/{ChatToggle.jsx → ChatToggle.tsx} +13 -3
- package/src/Prebuilt/components/Footer/Footer.tsx +15 -6
- package/src/Prebuilt/components/Footer/ParticipantList.jsx +15 -47
- package/src/Prebuilt/components/Footer/{RoleAccordion.jsx → RoleAccordion.tsx} +33 -17
- package/src/Prebuilt/components/Footer/RoleOptions.tsx +155 -0
- package/src/Prebuilt/components/FullPageProgress.jsx +3 -3
- package/src/Prebuilt/components/HMSVideo/Controls.jsx +1 -0
- package/src/Prebuilt/components/HMSVideo/HLSQualitySelector.jsx +39 -17
- package/src/Prebuilt/components/HMSVideo/HMSVideo.jsx +2 -2
- package/src/Prebuilt/components/HMSVideo/VideoProgress.jsx +5 -6
- package/src/Prebuilt/components/HMSVideo/VolumeControl.jsx +1 -1
- package/src/Prebuilt/components/Header/{StreamActions.jsx → StreamActions.tsx} +23 -9
- package/src/Prebuilt/components/Header/common.jsx +5 -2
- package/src/Prebuilt/components/IconButtonWithOptions/IconButtonWithOptions.jsx +6 -1
- package/src/Prebuilt/components/InsetTile.tsx +14 -8
- package/src/Prebuilt/components/Leave/DesktopLeaveRoom.tsx +21 -11
- package/src/Prebuilt/components/Leave/EndSessionContent.tsx +2 -5
- package/src/Prebuilt/components/Leave/LeaveCard.tsx +1 -3
- package/src/Prebuilt/components/Leave/LeaveRoom.tsx +28 -25
- package/src/Prebuilt/components/Leave/LeaveSessionContent.tsx +8 -2
- package/src/Prebuilt/components/Leave/MwebLeaveRoom.tsx +8 -8
- package/src/Prebuilt/components/MoreSettings/ChangeNameContent.jsx +4 -0
- package/src/Prebuilt/components/MoreSettings/MoreSettings.tsx +1 -1
- package/src/Prebuilt/components/MoreSettings/SplitComponents/DesktopOptions.tsx +9 -23
- package/src/Prebuilt/components/MoreSettings/SplitComponents/{MwebOptions.jsx → MwebOptions.tsx} +88 -27
- package/src/Prebuilt/components/Notifications/Notifications.jsx +30 -21
- package/src/Prebuilt/components/Notifications/ReconnectNotifications.jsx +5 -11
- package/src/Prebuilt/components/Pagination.tsx +14 -12
- package/src/Prebuilt/components/Preview/{PreviewContainer.jsx → PreviewContainer.tsx} +11 -2
- package/src/Prebuilt/components/Preview/PreviewForm.tsx +6 -8
- package/src/Prebuilt/components/Preview/{PreviewJoin.jsx → PreviewJoin.tsx} +43 -19
- package/src/Prebuilt/components/{RoleChangeRequestModal.jsx → RoleChangeRequestModal.tsx} +32 -15
- package/src/Prebuilt/components/ScreenshareTile.jsx +6 -7
- package/src/Prebuilt/components/SecondaryTiles.tsx +12 -10
- package/src/Prebuilt/components/TileMenu/TileMenu.jsx +1 -1
- package/src/Prebuilt/components/TileMenu/TileMenuContent.jsx +14 -10
- package/src/Prebuilt/components/Toast/ToastConfig.jsx +5 -4
- package/src/Prebuilt/components/VideoLayouts/EqualProminence.tsx +13 -10
- package/src/Prebuilt/components/VideoLayouts/Grid.tsx +36 -34
- package/src/Prebuilt/components/VideoLayouts/GridLayout.tsx +33 -15
- package/src/Prebuilt/components/VideoLayouts/ProminenceLayout.tsx +45 -31
- package/src/Prebuilt/components/VideoLayouts/RoleProminence.tsx +12 -9
- package/src/Prebuilt/components/VideoLayouts/ScreenshareLayout.tsx +25 -9
- package/src/Prebuilt/components/VideoLayouts/interface.ts +1 -0
- package/src/Prebuilt/components/VideoTile.jsx +45 -53
- package/src/Prebuilt/components/conference.jsx +71 -74
- package/src/Prebuilt/components/hooks/useAutoStartStreaming.tsx +57 -0
- package/src/Prebuilt/components/hooks/useMetadata.jsx +12 -3
- package/src/Prebuilt/components/hooks/useRedirectToLeave.tsx +34 -0
- package/src/Prebuilt/components/hooks/useRoleProminencePeers.tsx +1 -1
- package/src/Prebuilt/components/hooks/useTileLayout.tsx +24 -18
- package/src/Prebuilt/components/hooks/useVideoTileLayout.ts +4 -0
- package/src/Prebuilt/layouts/EmbedView.jsx +1 -11
- package/src/Prebuilt/layouts/HLSView.jsx +152 -82
- package/src/Prebuilt/layouts/SidePane.tsx +15 -3
- package/src/Prebuilt/layouts/VideoStreamingSection.tsx +11 -47
- package/src/Prebuilt/plugins/FlyingEmoji.jsx +14 -2
- package/src/Prebuilt/services/FeatureFlags.jsx +0 -1
- package/src/VideoTile/StyledVideoTile.tsx +1 -0
- package/dist/HLSView-PY2FKWX3.js.map +0 -7
- package/dist/chunk-RXTHJUMZ.js.map +0 -7
- package/dist/conference-V2XZGTKU.js.map +0 -7
- package/src/Prebuilt/components/AudioLevel/BeamSpeakerLabelsLogging.jsx +0 -16
- package/src/Prebuilt/components/VideoList.jsx +0 -73
- /package/dist/{VirtualBackground-AYDHYLIZ.js.map → VirtualBackground-UM2FOUHQ.js.map} +0 -0
- /package/dist/{chunk-E2M2ZSOL.js.map → chunk-364HP22I.js.map} +0 -0
@@ -1,5 +1,4 @@
|
|
1
1
|
import React, { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
2
|
-
import { useMedia } from 'react-use';
|
3
2
|
import {
|
4
3
|
selectAudioTrackByPeerID,
|
5
4
|
selectIsPeerAudioEnabled,
|
@@ -19,7 +18,7 @@ import TileMenu, { isSameTile } from './TileMenu/TileMenu';
|
|
19
18
|
import { Avatar } from '../../Avatar';
|
20
19
|
import { Box, Flex } from '../../Layout';
|
21
20
|
import { VideoTileStats } from '../../Stats';
|
22
|
-
import {
|
21
|
+
import { keyframes } from '../../Theme';
|
23
22
|
import { Video } from '../../Video';
|
24
23
|
import { StyledVideoTile } from '../../VideoTile';
|
25
24
|
import { getVideoTileLabel } from './peerTileUtils';
|
@@ -40,6 +39,7 @@ const Tile = ({
|
|
40
39
|
hideParticipantNameOnTile = false,
|
41
40
|
roundedVideoTile = true,
|
42
41
|
hideAudioMuteOnTile = false,
|
42
|
+
hideMetadataOnTile = false,
|
43
43
|
}) => {
|
44
44
|
const trackSelector = trackId ? selectVideoTrackByID(trackId) : selectVideoTrackByPeerID(peerId);
|
45
45
|
const track = useHMSStore(trackSelector);
|
@@ -81,7 +81,6 @@ const Tile = ({
|
|
81
81
|
}
|
82
82
|
return 'large';
|
83
83
|
}, [width, height]);
|
84
|
-
const isMobile = useMedia(cssConfig.media.md);
|
85
84
|
|
86
85
|
return (
|
87
86
|
<StyledVideoTile.Root
|
@@ -103,44 +102,42 @@ const Tile = ({
|
|
103
102
|
<VideoTileStats audioTrackID={audioTrack?.id} videoTrackID={track?.id} peerID={peerId} isLocal={isLocal} />
|
104
103
|
) : null}
|
105
104
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
) : null}
|
105
|
+
<Video
|
106
|
+
trackId={track?.id}
|
107
|
+
attach={isLocal ? undefined : !isAudioOnly}
|
108
|
+
mirror={
|
109
|
+
mirrorLocalVideo &&
|
110
|
+
peerId === localPeerID &&
|
111
|
+
track?.source === 'regular' &&
|
112
|
+
track?.facingMode !== 'environment'
|
113
|
+
}
|
114
|
+
noRadius={!roundedVideoTile}
|
115
|
+
data-testid="participant_video_tile"
|
116
|
+
css={{
|
117
|
+
objectFit,
|
118
|
+
filter: isVideoDegraded ? 'blur($space$2)' : undefined,
|
119
|
+
bg: 'transparent',
|
120
|
+
}}
|
121
|
+
/>
|
122
|
+
|
125
123
|
{isVideoMuted || (!isLocal && isAudioOnly) ? (
|
126
124
|
<StyledVideoTile.AvatarContainer>
|
127
125
|
<Avatar name={peerName || ''} data-testid="participant_avatar_icon" size={avatarSize} />
|
128
126
|
</StyledVideoTile.AvatarContainer>
|
129
127
|
) : null}
|
130
128
|
|
131
|
-
{
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
)}
|
129
|
+
{!hideAudioMuteOnTile ? (
|
130
|
+
isAudioMuted ? (
|
131
|
+
<StyledVideoTile.AudioIndicator
|
132
|
+
data-testid="participant_audio_mute_icon"
|
133
|
+
size={width && height && (width < 180 || height < 180) ? 'small' : 'medium'}
|
134
|
+
>
|
135
|
+
<MicOffIcon />
|
136
|
+
</StyledVideoTile.AudioIndicator>
|
137
|
+
) : (
|
138
|
+
<AudioLevel trackId={audioTrack?.id} />
|
139
|
+
)
|
140
|
+
) : null}
|
144
141
|
{isMouseHovered || isDragabble ? (
|
145
142
|
<TileMenu
|
146
143
|
peerID={peerId}
|
@@ -150,25 +147,24 @@ const Tile = ({
|
|
150
147
|
enableSpotlightingPeer={enableSpotlightingPeer}
|
151
148
|
/>
|
152
149
|
) : null}
|
153
|
-
<PeerMetadata peerId={peerId} />
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
)}
|
150
|
+
{!hideMetadataOnTile && <PeerMetadata peerId={peerId} />}
|
151
|
+
|
152
|
+
<TileConnection
|
153
|
+
hideLabel={hideParticipantNameOnTile}
|
154
|
+
name={label}
|
155
|
+
isTile
|
156
|
+
peerId={peerId}
|
157
|
+
width={width}
|
158
|
+
pinned={pinned}
|
159
|
+
spotlighted={spotlighted}
|
160
|
+
/>
|
165
161
|
</StyledVideoTile.Container>
|
166
162
|
) : null}
|
167
163
|
</StyledVideoTile.Root>
|
168
164
|
);
|
169
165
|
};
|
170
166
|
|
171
|
-
const metaStyles = { top: '$4', left: '$4' };
|
167
|
+
const metaStyles = { top: '$4', left: '$4', width: '$14', height: '$14' };
|
172
168
|
|
173
169
|
const heightAnimation = value =>
|
174
170
|
keyframes({
|
@@ -233,7 +229,7 @@ const PeerMetadata = ({ peerId }) => {
|
|
233
229
|
) : null}
|
234
230
|
{isBRB ? (
|
235
231
|
<StyledVideoTile.AttributeBox css={metaStyles} data-testid="brb_icon_onTile">
|
236
|
-
<BrbTileIcon width={
|
232
|
+
<BrbTileIcon width={22} height={22} />
|
237
233
|
</StyledVideoTile.AttributeBox>
|
238
234
|
) : null}
|
239
235
|
</Fragment>
|
@@ -242,8 +238,4 @@ const PeerMetadata = ({ peerId }) => {
|
|
242
238
|
|
243
239
|
const VideoTile = React.memo(Tile);
|
244
240
|
|
245
|
-
const showAudioMuted = ({ hideAudioMute, isAudioMuted }) => {
|
246
|
-
return isAudioMuted && !hideAudioMute;
|
247
|
-
};
|
248
|
-
|
249
241
|
export default VideoTile;
|
@@ -23,14 +23,13 @@ import {
|
|
23
23
|
useRoomLayoutConferencingScreen,
|
24
24
|
useRoomLayoutPreviewScreen,
|
25
25
|
} from '../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
|
26
|
-
import { useAuthToken,
|
27
|
-
import { APP_DATA,
|
26
|
+
import { useAuthToken, useSetAppDataByKey } from './AppData/useUISettings';
|
27
|
+
import { APP_DATA, isAndroid, isIOS, isIPadOS } from '../common/constants';
|
28
28
|
|
29
29
|
const Conference = () => {
|
30
30
|
const navigate = useNavigate();
|
31
31
|
const { roomId, role } = useParams();
|
32
|
-
const
|
33
|
-
const { userName } = useHMSPrebuiltContext();
|
32
|
+
const { userName, endpoints } = useHMSPrebuiltContext();
|
34
33
|
const screenProps = useRoomLayoutConferencingScreen();
|
35
34
|
const { isPreviewScreenEnabled } = useRoomLayoutPreviewScreen();
|
36
35
|
const roomState = useHMSStore(selectRoomState);
|
@@ -42,11 +41,11 @@ const Conference = () => {
|
|
42
41
|
const authTokenInAppData = useAuthToken();
|
43
42
|
const headerRef = useRef();
|
44
43
|
const footerRef = useRef();
|
44
|
+
const isMobileDevice = isAndroid || isIOS || isIPadOS;
|
45
45
|
const dropdownListRef = useRef();
|
46
|
-
const performAutoHide = hideControls && (isAndroid || isIOS || isIPadOS);
|
47
46
|
const [isHLSStarted] = useSetAppDataByKey(APP_DATA.hlsStarted);
|
48
47
|
const toggleControls = () => {
|
49
|
-
if (dropdownListRef.current?.length === 0) {
|
48
|
+
if (dropdownListRef.current?.length === 0 && isMobileDevice) {
|
50
49
|
setHideControls(value => !value);
|
51
50
|
}
|
52
51
|
};
|
@@ -58,14 +57,14 @@ const Conference = () => {
|
|
58
57
|
clearTimeout(timeout);
|
59
58
|
timeout = setTimeout(() => {
|
60
59
|
if (dropdownListRef.current.length === 0) {
|
61
|
-
setHideControls(
|
60
|
+
setHideControls(isMobileDevice);
|
62
61
|
}
|
63
62
|
}, 5000);
|
64
63
|
}
|
65
64
|
return () => {
|
66
65
|
clearTimeout(timeout);
|
67
66
|
};
|
68
|
-
}, [dropdownList, hideControls]);
|
67
|
+
}, [dropdownList, hideControls, isMobileDevice]);
|
69
68
|
|
70
69
|
useEffect(() => {
|
71
70
|
if (!roomId) {
|
@@ -90,9 +89,7 @@ const Conference = () => {
|
|
90
89
|
.join({
|
91
90
|
userName,
|
92
91
|
authToken: authTokenInAppData,
|
93
|
-
initEndpoint:
|
94
|
-
? `https://${process.env.REACT_APP_ENV}-init.100ms.live/init`
|
95
|
-
: undefined,
|
92
|
+
initEndpoint: endpoints?.init,
|
96
93
|
initialSettings: {
|
97
94
|
isAudioMuted: !isPreviewScreenEnabled,
|
98
95
|
isVideoMuted: !isPreviewScreenEnabled,
|
@@ -101,14 +98,7 @@ const Conference = () => {
|
|
101
98
|
})
|
102
99
|
.catch(console.error);
|
103
100
|
}
|
104
|
-
}, [authTokenInAppData, hmsActions, isConnectedToRoom, isPreviewScreenEnabled, roomState, userName]);
|
105
|
-
|
106
|
-
useEffect(() => {
|
107
|
-
// beam doesn't need to store messages, saves on unnecessary store updates in large calls
|
108
|
-
if (isHeadless) {
|
109
|
-
hmsActions.ignoreMessageTypes(['chat', EMOJI_REACTION_TYPE]);
|
110
|
-
}
|
111
|
-
}, [isHeadless, hmsActions]);
|
101
|
+
}, [authTokenInAppData, endpoints?.init, hmsActions, isConnectedToRoom, isPreviewScreenEnabled, roomState, userName]);
|
112
102
|
|
113
103
|
useEffect(() => {
|
114
104
|
return () => {
|
@@ -117,71 +107,78 @@ const Conference = () => {
|
|
117
107
|
}, []);
|
118
108
|
|
119
109
|
if (!isConnectedToRoom) {
|
120
|
-
return <FullPageProgress
|
121
|
-
}
|
122
|
-
|
123
|
-
if (isHLSStarted) {
|
124
|
-
return <FullPageProgress loadingText="Starting live stream..." />;
|
110
|
+
return <FullPageProgress text="Joining..." />;
|
125
111
|
}
|
126
112
|
|
127
113
|
return (
|
128
|
-
|
129
|
-
{
|
130
|
-
<Box
|
131
|
-
|
132
|
-
css={{
|
133
|
-
h: '$18',
|
134
|
-
transition: 'margin 0.3s ease-in-out',
|
135
|
-
marginTop: performAutoHide ? `-${headerRef.current?.clientHeight}px` : 'none',
|
136
|
-
'@md': {
|
137
|
-
h: '$17',
|
138
|
-
},
|
139
|
-
}}
|
140
|
-
data-testid="header"
|
141
|
-
>
|
142
|
-
<Header elements={screenProps.elements} screenType={screenProps.screenType} />
|
114
|
+
<>
|
115
|
+
{isHLSStarted ? (
|
116
|
+
<Box css={{ position: 'fixed', zIndex: 100, w: '100%', h: '100%', left: 0, top: 0 }}>
|
117
|
+
<FullPageProgress text="Starting live stream..." css={{ opacity: 0.8, bg: '$background_dim' }} />
|
143
118
|
</Box>
|
144
|
-
)}
|
145
|
-
<
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
{!screenProps.hideSections.includes('footer') && (
|
119
|
+
) : null}
|
120
|
+
<Flex css={{ size: '100%', overflow: 'hidden' }} direction="column">
|
121
|
+
{!screenProps.hideSections.includes('header') && (
|
122
|
+
<Box
|
123
|
+
ref={headerRef}
|
124
|
+
css={{
|
125
|
+
h: '$18',
|
126
|
+
transition: 'margin 0.3s ease-in-out',
|
127
|
+
marginTop: hideControls ? `-${headerRef.current?.clientHeight}px` : 'none',
|
128
|
+
'@md': {
|
129
|
+
h: '$17',
|
130
|
+
},
|
131
|
+
}}
|
132
|
+
data-testid="header"
|
133
|
+
>
|
134
|
+
<Header elements={screenProps.elements} screenType={screenProps.screenType} />
|
135
|
+
</Box>
|
136
|
+
)}
|
163
137
|
<Box
|
164
|
-
ref={footerRef}
|
165
138
|
css={{
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
'@
|
172
|
-
|
173
|
-
bg: screenProps.screenType === 'hls_live_streaming' ? 'transparent' : '$background_dim',
|
139
|
+
w: '100%',
|
140
|
+
flex: '1 1 0',
|
141
|
+
minHeight: 0,
|
142
|
+
px: screenProps?.elements?.video_tile_layout?.grid?.edge_to_edge ? 0 : '$10', // TODO: padding to be controlled by section/element
|
143
|
+
paddingBottom: 'env(safe-area-inset-bottom)',
|
144
|
+
'@lg': {
|
145
|
+
px: 0,
|
174
146
|
},
|
175
147
|
}}
|
176
|
-
|
148
|
+
id="conferencing"
|
149
|
+
data-testid="conferencing"
|
150
|
+
onClick={toggleControls}
|
177
151
|
>
|
178
|
-
<
|
152
|
+
<VideoStreamingSection
|
153
|
+
screenType={screenProps.screenType}
|
154
|
+
elements={screenProps.elements}
|
155
|
+
hideControls={hideControls}
|
156
|
+
/>
|
179
157
|
</Box>
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
158
|
+
{!screenProps.hideSections.includes('footer') && (
|
159
|
+
<Box
|
160
|
+
ref={footerRef}
|
161
|
+
css={{
|
162
|
+
flexShrink: 0,
|
163
|
+
maxHeight: '$24',
|
164
|
+
transition: 'margin 0.3s ease-in-out',
|
165
|
+
bg: '$background_dim',
|
166
|
+
marginBottom: hideControls ? `-${footerRef.current?.clientHeight}px` : undefined,
|
167
|
+
'@md': {
|
168
|
+
maxHeight: 'unset',
|
169
|
+
bg: screenProps.screenType === 'hls_live_streaming' ? 'transparent' : '$background_dim',
|
170
|
+
},
|
171
|
+
}}
|
172
|
+
data-testid="footer"
|
173
|
+
>
|
174
|
+
<Footer elements={screenProps.elements} screenType={screenProps.screenType} />
|
175
|
+
</Box>
|
176
|
+
)}
|
177
|
+
<RoleChangeRequestModal />
|
178
|
+
<HLSFailureModal />
|
179
|
+
<ActivatedPIP />
|
180
|
+
</Flex>
|
181
|
+
</>
|
185
182
|
);
|
186
183
|
};
|
187
184
|
|
@@ -0,0 +1,57 @@
|
|
1
|
+
import { useCallback, useEffect, useRef } from 'react';
|
2
|
+
import {
|
3
|
+
HMSException,
|
4
|
+
selectIsConnectedToRoom,
|
5
|
+
selectPermissions,
|
6
|
+
useHMSActions,
|
7
|
+
useHMSStore,
|
8
|
+
useRecordingStreaming,
|
9
|
+
} from '@100mslive/react-sdk';
|
10
|
+
// @ts-ignore: No implicit Any
|
11
|
+
import { useSetAppDataByKey } from '../AppData/useUISettings';
|
12
|
+
// @ts-ignore: No implicit Any
|
13
|
+
import { useShowStreamingUI } from '../../common/hooks';
|
14
|
+
// @ts-ignore: No implicit Any
|
15
|
+
import { APP_DATA } from '../../common/constants';
|
16
|
+
|
17
|
+
export const useAutoStartStreaming = () => {
|
18
|
+
const [isHLSStarted, setHLSStarted] = useSetAppDataByKey(APP_DATA.hlsStarted);
|
19
|
+
const permissions = useHMSStore(selectPermissions);
|
20
|
+
const showStreamingUI = useShowStreamingUI();
|
21
|
+
const hmsActions = useHMSActions();
|
22
|
+
const isConnected = useHMSStore(selectIsConnectedToRoom);
|
23
|
+
const { isHLSRunning } = useRecordingStreaming();
|
24
|
+
const streamStartedRef = useRef(false);
|
25
|
+
|
26
|
+
const startHLS = useCallback(async () => {
|
27
|
+
try {
|
28
|
+
if (isHLSStarted || !showStreamingUI || isHLSRunning) {
|
29
|
+
return;
|
30
|
+
}
|
31
|
+
setHLSStarted(true);
|
32
|
+
streamStartedRef.current = true;
|
33
|
+
await hmsActions.startHLSStreaming();
|
34
|
+
} catch (error) {
|
35
|
+
if ((error as HMSException).message?.includes('beam already started')) {
|
36
|
+
return;
|
37
|
+
}
|
38
|
+
streamStartedRef.current = false;
|
39
|
+
setHLSStarted(false);
|
40
|
+
}
|
41
|
+
}, [hmsActions, isHLSRunning, isHLSStarted, setHLSStarted, showStreamingUI]);
|
42
|
+
|
43
|
+
useEffect(() => {
|
44
|
+
if (!isHLSStarted && !isHLSRunning) {
|
45
|
+
streamStartedRef.current = false;
|
46
|
+
}
|
47
|
+
}, [isHLSStarted, isHLSRunning]);
|
48
|
+
|
49
|
+
useEffect(() => {
|
50
|
+
if (!isConnected || streamStartedRef.current || !permissions?.hlsStreaming) {
|
51
|
+
return;
|
52
|
+
}
|
53
|
+
// Is a streaming kit and broadcaster joins
|
54
|
+
startHLS();
|
55
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
56
|
+
}, [isConnected]);
|
57
|
+
};
|
@@ -1,19 +1,28 @@
|
|
1
1
|
import { useCallback, useState } from 'react';
|
2
|
-
import {
|
2
|
+
import {
|
3
|
+
selectLocalPeerID,
|
4
|
+
selectPeerMetadata,
|
5
|
+
useHMSActions,
|
6
|
+
useHMSStore,
|
7
|
+
useHMSVanillaStore,
|
8
|
+
} from '@100mslive/react-sdk';
|
3
9
|
|
4
10
|
export const useMyMetadata = () => {
|
5
11
|
const hmsActions = useHMSActions();
|
6
12
|
const localPeerId = useHMSStore(selectLocalPeerID);
|
13
|
+
const vanillaStore = useHMSVanillaStore();
|
7
14
|
const metaData = useHMSStore(selectPeerMetadata(localPeerId));
|
8
15
|
const [isHandRaised, setHandRaised] = useState(metaData?.isHandRaised || false);
|
9
16
|
const [isBRBOn, setBRBOn] = useState(metaData?.isBRBOn || false); // BRB = be right back
|
10
17
|
|
11
18
|
const update = async updatedFields => {
|
12
19
|
try {
|
13
|
-
|
20
|
+
// get current state from store and merge updated fields
|
21
|
+
const currentMetadata = vanillaStore.getState(selectPeerMetadata(localPeerId));
|
22
|
+
await hmsActions.changeMetadata(Object.assign(currentMetadata, updatedFields));
|
14
23
|
return true;
|
15
24
|
} catch (error) {
|
16
|
-
console.error('failed to update metadata ',
|
25
|
+
console.error('failed to update metadata ', updatedFields);
|
17
26
|
}
|
18
27
|
};
|
19
28
|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
import { useCallback } from 'react';
|
2
|
+
import { useNavigate, useParams } from 'react-router-dom';
|
3
|
+
import { useHMSPrebuiltContext } from '../../AppContext';
|
4
|
+
// @ts-ignore: No implicit Any
|
5
|
+
import { PictureInPicture } from '../PIP/PIPManager';
|
6
|
+
// @ts-ignore: No implicit Any
|
7
|
+
import { ToastManager } from '../Toast/ToastManager';
|
8
|
+
import { useRoomLayoutLeaveScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
|
9
|
+
|
10
|
+
export const useRedirectToLeave = () => {
|
11
|
+
const { isLeaveScreenEnabled } = useRoomLayoutLeaveScreen();
|
12
|
+
const { onLeave } = useHMSPrebuiltContext();
|
13
|
+
const params = useParams();
|
14
|
+
const navigate = useNavigate();
|
15
|
+
|
16
|
+
const redirect = useCallback(
|
17
|
+
(timeout = 0) => {
|
18
|
+
setTimeout(() => {
|
19
|
+
const prefix = isLeaveScreenEnabled ? '/leave/' : '/';
|
20
|
+
if (params.role) {
|
21
|
+
navigate(prefix + params.roomId + '/' + params.role);
|
22
|
+
} else {
|
23
|
+
navigate(prefix + params.roomId);
|
24
|
+
}
|
25
|
+
PictureInPicture.stop().catch(() => console.error('stopping pip'));
|
26
|
+
ToastManager.clearAllToast();
|
27
|
+
onLeave?.();
|
28
|
+
}, timeout);
|
29
|
+
},
|
30
|
+
[isLeaveScreenEnabled, navigate, onLeave, params.role, params.roomId],
|
31
|
+
);
|
32
|
+
|
33
|
+
return { redirectToLeave: redirect };
|
34
|
+
};
|
@@ -12,7 +12,7 @@ export const useRoleProminencePeers = (prominentRoles: string[], peers: HMSPeer[
|
|
12
12
|
if (pinnedTrack) {
|
13
13
|
if (pinnedTrack.peerId === peer.id) {
|
14
14
|
acc[0].push(peer);
|
15
|
-
} else {
|
15
|
+
} else if (!(isInsetEnabled && peer.isLocal)) {
|
16
16
|
acc[1].push(peer);
|
17
17
|
}
|
18
18
|
return acc;
|
@@ -10,7 +10,6 @@ import {
|
|
10
10
|
import { config as cssConfig } from '../../../Theme';
|
11
11
|
|
12
12
|
const aspectRatioConfig = { default: [1 / 1, 4 / 3, 16 / 9], mobile: [1 / 1, 3 / 4, 9 / 16] };
|
13
|
-
const gap = 8; // gap between flex items
|
14
13
|
|
15
14
|
export const usePagesWithTiles = ({ peers, maxTileCount }: { peers: HMSPeer[]; maxTileCount: number }) => {
|
16
15
|
const vanillaStore = useHMSVanillaStore();
|
@@ -39,9 +38,11 @@ export const usePagesWithTiles = ({ peers, maxTileCount }: { peers: HMSPeer[]; m
|
|
39
38
|
export const useTileLayout = ({
|
40
39
|
pageList,
|
41
40
|
maxTileCount,
|
41
|
+
edgeToEdge = false,
|
42
42
|
}: {
|
43
43
|
pageList: TrackWithPeerAndDimensions[][];
|
44
44
|
maxTileCount: number;
|
45
|
+
edgeToEdge?: boolean;
|
45
46
|
}) => {
|
46
47
|
const vanillaStore = useHMSVanillaStore();
|
47
48
|
const [ref, { width, height }] = useMeasure<HTMLDivElement>();
|
@@ -76,6 +77,7 @@ export const useTileLayout = ({
|
|
76
77
|
return rowElements;
|
77
78
|
});
|
78
79
|
|
80
|
+
const gap = edgeToEdge && isMobile ? 0 : 8; // gap between flex items
|
79
81
|
const maxHeight = height - (maxRows - 1) * gap;
|
80
82
|
const maxRowHeight = maxHeight / matrix.length;
|
81
83
|
const aspectRatios =
|
@@ -86,25 +88,29 @@ export const useTileLayout = ({
|
|
86
88
|
for (const row of matrix) {
|
87
89
|
let tileWidth = (width - (row.length - 1) * gap) / row.length;
|
88
90
|
let tileHeight = 0;
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
91
|
+
if (edgeToEdge) {
|
92
|
+
tileHeight = maxRowHeight;
|
93
|
+
} else {
|
94
|
+
const calcHeights = aspectRatios.map(aR => tileWidth / aR);
|
95
|
+
for (const h of calcHeights) {
|
96
|
+
if (h < maxRowHeight) {
|
97
|
+
if (tileHeight < h) {
|
98
|
+
tileHeight = h;
|
99
|
+
}
|
94
100
|
}
|
95
101
|
}
|
96
|
-
}
|
97
102
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
103
|
+
// tileHeight is not calculated as it could be exceeding the max possible height
|
104
|
+
// find the max possible width instead
|
105
|
+
if (tileHeight === 0) {
|
106
|
+
tileHeight = maxRowHeight;
|
107
|
+
const calcWidths = aspectRatios.map(aR => tileHeight * aR);
|
108
|
+
tileWidth = 0;
|
109
|
+
for (const w of calcWidths) {
|
110
|
+
if (w < width) {
|
111
|
+
if (tileWidth < w) {
|
112
|
+
tileWidth = w;
|
113
|
+
}
|
108
114
|
}
|
109
115
|
}
|
110
116
|
}
|
@@ -116,6 +122,6 @@ export const useTileLayout = ({
|
|
116
122
|
}
|
117
123
|
}
|
118
124
|
setPagesWithTiles([...pageList]);
|
119
|
-
}, [width, height, maxTileCount, pageList, vanillaStore, isMobile]);
|
125
|
+
}, [width, height, maxTileCount, pageList, vanillaStore, isMobile, edgeToEdge]);
|
120
126
|
return { pagesWithTiles, ref };
|
121
127
|
};
|
@@ -5,7 +5,9 @@ type TileContextType = {
|
|
5
5
|
hideParticipantNameOnTile?: boolean;
|
6
6
|
roundedVideoTile?: boolean;
|
7
7
|
hideAudioMuteOnTile?: boolean;
|
8
|
+
hideAudioLevelOnTile?: boolean;
|
8
9
|
objectFit?: 'cover' | 'contain';
|
10
|
+
hideMetadataOnTile?: boolean;
|
9
11
|
};
|
10
12
|
|
11
13
|
export const VideoTileContext = React.createContext<TileContextType>({
|
@@ -13,7 +15,9 @@ export const VideoTileContext = React.createContext<TileContextType>({
|
|
13
15
|
hideParticipantNameOnTile: false,
|
14
16
|
roundedVideoTile: true,
|
15
17
|
hideAudioMuteOnTile: false,
|
18
|
+
hideAudioLevelOnTile: false,
|
16
19
|
objectFit: 'contain',
|
20
|
+
hideMetadataOnTile: false,
|
17
21
|
});
|
18
22
|
|
19
23
|
export const useVideoTileContext = () => {
|
@@ -1,7 +1,5 @@
|
|
1
1
|
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
2
2
|
import {
|
3
|
-
selectLocalPeerID,
|
4
|
-
selectLocalPeerRoleName,
|
5
3
|
selectPeers,
|
6
4
|
selectPeerScreenSharing,
|
7
5
|
throwErrorHandler,
|
@@ -25,21 +23,13 @@ export const EmbedView = () => {
|
|
25
23
|
export const EmbebScreenShareView = ({ children }) => {
|
26
24
|
const peers = useHMSStore(selectPeers);
|
27
25
|
|
28
|
-
const localPeerID = useHMSStore(selectLocalPeerID);
|
29
|
-
const localPeerRole = useHMSStore(selectLocalPeerRoleName);
|
30
26
|
const peerPresenting = useHMSStore(selectPeerScreenSharing);
|
31
|
-
const isPresenterFromMyRole = peerPresenting?.roleName?.toLowerCase() === localPeerRole?.toLowerCase();
|
32
|
-
const amIPresenting = localPeerID === peerPresenting?.id;
|
33
|
-
const showPresenterInSmallTile = amIPresenting || isPresenterFromMyRole;
|
34
27
|
const [, setActiveScreenSharePeer] = useSetAppDataByKey(APP_DATA.activeScreensharePeerId);
|
35
28
|
|
36
29
|
const smallTilePeers = useMemo(() => {
|
37
30
|
const smallTilePeers = peers.filter(peer => peer.id !== peerPresenting?.id);
|
38
|
-
if (showPresenterInSmallTile && peerPresenting) {
|
39
|
-
smallTilePeers.unshift(peerPresenting); // put presenter on first page
|
40
|
-
}
|
41
31
|
return smallTilePeers;
|
42
|
-
}, [peers, peerPresenting
|
32
|
+
}, [peers, peerPresenting]);
|
43
33
|
|
44
34
|
useEffect(() => {
|
45
35
|
setActiveScreenSharePeer(peerPresenting?.id);
|