@100mslive/roomkit-react 0.1.7-alpha.0 → 0.1.8-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/AudioLevel/AudioLevel.d.ts +5 -8
- package/dist/AudioLevel/index.d.ts +2 -1
- package/dist/AudioLevel/useBorderAudioLevel.d.ts +8 -0
- package/dist/{HLSView-F5BDZVT2.js → HLSView-IQRPLYNH.js} +8 -6
- package/dist/{HLSView-F5BDZVT2.js.map → HLSView-IQRPLYNH.js.map} +2 -2
- package/dist/Prebuilt/components/Chip.d.ts +12 -0
- package/dist/Prebuilt/components/PrebuiltDialogPortal.d.ts +4 -0
- package/dist/Prebuilt/components/RoleChangeRequest/RequestPrompt.d.ts +9 -0
- package/dist/VideoTile/StyledVideoTile.d.ts +445 -3
- package/dist/{VirtualBackground-THDRYDRA.js → VirtualBackground-GP4ATXD3.js} +3 -3
- package/dist/{chunk-JSH7SKEH.js → chunk-2H5NIZB7.js} +2 -2
- package/dist/{chunk-CDYRVICT.js → chunk-GLYGPYNS.js} +574 -1196
- package/dist/chunk-GLYGPYNS.js.map +7 -0
- package/dist/{chunk-U3G743OY.js → chunk-Z3O2WGWV.js} +2 -2
- package/dist/{chunk-U3G743OY.js.map → chunk-Z3O2WGWV.js.map} +1 -1
- package/dist/{conference-6IVZHILI.js → conference-JD35TNH4.js} +1545 -840
- package/dist/conference-JD35TNH4.js.map +7 -0
- package/dist/index.cjs.js +5975 -5849
- package/dist/index.cjs.js.map +4 -4
- package/dist/index.js +4 -2
- package/dist/meta.cjs.json +1633 -1399
- package/dist/meta.esbuild.json +1689 -1454
- package/package.json +6 -6
- package/src/AudioLevel/AudioLevel.tsx +79 -30
- package/src/AudioLevel/audio-level.png +0 -0
- package/src/AudioLevel/index.ts +2 -1
- package/src/AudioLevel/useBorderAudioLevel.tsx +34 -0
- package/src/Input/Input.tsx +1 -1
- package/src/Prebuilt/App.tsx +1 -0
- package/src/Prebuilt/components/Chat/ChatBody.jsx +125 -106
- package/src/Prebuilt/components/{Chip.jsx → Chip.tsx} +13 -2
- package/src/Prebuilt/components/Footer/ParticipantList.jsx +24 -13
- package/src/Prebuilt/components/Footer/RoleAccordion.tsx +43 -3
- package/src/Prebuilt/components/Leave/DesktopLeaveRoom.tsx +41 -46
- package/src/Prebuilt/components/Leave/MwebLeaveRoom.tsx +23 -35
- package/src/Prebuilt/components/MoreSettings/ChangeNameModal.jsx +3 -2
- package/src/Prebuilt/components/MoreSettings/EmbedUrl.jsx +3 -2
- package/src/Prebuilt/components/MwebLandscapePrompt.jsx +58 -0
- package/src/Prebuilt/components/Notifications/HLSFailureModal.jsx +3 -2
- package/src/Prebuilt/components/Notifications/PermissionErrorModal.jsx +3 -2
- package/src/Prebuilt/components/PrebuiltDialogPortal.tsx +6 -0
- package/src/Prebuilt/components/Preview/PreviewJoin.tsx +9 -6
- package/src/Prebuilt/components/RaiseHand.jsx +4 -11
- package/src/Prebuilt/components/RoleChangeModal.jsx +3 -2
- package/src/Prebuilt/components/RoleChangeRequest/RequestPrompt.tsx +67 -0
- package/src/Prebuilt/components/{RoleChangeRequestModal.tsx → RoleChangeRequest/RoleChangeRequestModal.tsx} +18 -50
- package/src/Prebuilt/components/Settings/SettingsModal.jsx +3 -2
- package/src/Prebuilt/components/Settings/StartRecording.jsx +3 -2
- package/src/Prebuilt/components/StatsForNerds.jsx +3 -2
- package/src/Prebuilt/components/VideoTile.jsx +34 -75
- package/src/Prebuilt/components/conference.jsx +1 -1
- package/src/Prebuilt/components/hooks/useMetadata.jsx +2 -1
- package/src/Prebuilt/components/pdfAnnotator/pdfFileOptions.jsx +3 -2
- package/src/Prebuilt/components/pdfAnnotator/shareScreenOptions.jsx +4 -29
- package/src/Prebuilt/components/pdfAnnotator/uploadedFile.jsx +3 -2
- package/src/Prebuilt/layouts/HLSView.jsx +4 -2
- package/src/Prebuilt/layouts/SidePane.tsx +0 -1
- package/src/Prebuilt/primitives/DialogContent.jsx +5 -4
- package/src/VideoTile/StyledVideoTile.tsx +10 -14
- package/dist/chunk-CDYRVICT.js.map +0 -7
- package/dist/conference-6IVZHILI.js.map +0 -7
- /package/dist/Prebuilt/components/{RoleChangeRequestModal.d.ts → RoleChangeRequest/RoleChangeRequestModal.d.ts} +0 -0
- /package/dist/{VirtualBackground-THDRYDRA.js.map → VirtualBackground-GP4ATXD3.js.map} +0 -0
- /package/dist/{chunk-JSH7SKEH.js.map → chunk-2H5NIZB7.js.map} +0 -0
@@ -0,0 +1,67 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { useMedia } from 'react-use';
|
3
|
+
import { Box, Button, config as cssConfig, Dialog, Flex, Text } from '../../..';
|
4
|
+
import { Sheet } from '../../../Sheet';
|
5
|
+
import { PrebuiltDialogPortal } from '../PrebuiltDialogPortal';
|
6
|
+
|
7
|
+
export const RequestPrompt = ({
|
8
|
+
open = true,
|
9
|
+
onOpenChange,
|
10
|
+
title,
|
11
|
+
body,
|
12
|
+
actionText = 'Accept',
|
13
|
+
onAction,
|
14
|
+
}: {
|
15
|
+
open?: boolean;
|
16
|
+
onOpenChange: (value: boolean) => void;
|
17
|
+
title: string;
|
18
|
+
body: React.ReactNode;
|
19
|
+
actionText?: string;
|
20
|
+
onAction: () => void;
|
21
|
+
}) => {
|
22
|
+
const isMobile = useMedia(cssConfig.media.md);
|
23
|
+
|
24
|
+
if (isMobile) {
|
25
|
+
return (
|
26
|
+
<Sheet.Root open={open} onOpenChange={onOpenChange}>
|
27
|
+
<Sheet.Content css={{ py: '$8' }}>
|
28
|
+
<Text css={{ fontWeight: '$semiBold', c: '$on_surface_high', '@md': { px: '$8' } }}>{title}</Text>
|
29
|
+
{body}
|
30
|
+
<RequestActions actionText={actionText} onAction={onAction} />
|
31
|
+
</Sheet.Content>
|
32
|
+
</Sheet.Root>
|
33
|
+
);
|
34
|
+
}
|
35
|
+
|
36
|
+
return (
|
37
|
+
<Dialog.Root open={open} onOpenChange={onOpenChange}>
|
38
|
+
<PrebuiltDialogPortal>
|
39
|
+
<Dialog.Overlay />
|
40
|
+
<Dialog.Content css={{ p: '$10' }}>
|
41
|
+
<Dialog.Title css={{ p: 0, display: 'flex', flexDirection: 'row', gap: '$md', justifyContent: 'center' }}>
|
42
|
+
<Text variant="h6">{title}</Text>
|
43
|
+
</Dialog.Title>
|
44
|
+
<Box css={{ mt: '$4', mb: '$10' }}>{body}</Box>
|
45
|
+
<RequestActions actionText={actionText} onAction={onAction} />
|
46
|
+
</Dialog.Content>
|
47
|
+
</PrebuiltDialogPortal>
|
48
|
+
</Dialog.Root>
|
49
|
+
);
|
50
|
+
};
|
51
|
+
|
52
|
+
const RequestActions = ({ onAction, actionText }: { actionText?: string; onAction: () => void }) => (
|
53
|
+
<Flex justify="center" align="center" css={{ width: '100%', gap: '$md', '@md': { mt: '$8', px: '$8' } }}>
|
54
|
+
<Box css={{ width: '50%' }}>
|
55
|
+
<Dialog.Close css={{ width: '100%' }}>
|
56
|
+
<Button variant="standard" outlined css={{ width: '100%' }}>
|
57
|
+
Decline
|
58
|
+
</Button>
|
59
|
+
</Dialog.Close>
|
60
|
+
</Box>
|
61
|
+
<Box css={{ width: '50%' }}>
|
62
|
+
<Button variant="primary" css={{ width: '100%' }} onClick={onAction}>
|
63
|
+
{actionText}
|
64
|
+
</Button>
|
65
|
+
</Box>
|
66
|
+
</Flex>
|
67
|
+
);
|
@@ -7,13 +7,14 @@ import {
|
|
7
7
|
useHMSActions,
|
8
8
|
useHMSStore,
|
9
9
|
} from '@100mslive/react-sdk';
|
10
|
+
import { Flex, Text } from '../../..';
|
10
11
|
// @ts-ignore: No implicit Any
|
11
|
-
import { PreviewControls, PreviewTile } from '
|
12
|
-
import {
|
12
|
+
import { PreviewControls, PreviewTile } from '../Preview/PreviewJoin';
|
13
|
+
import { RequestPrompt } from './RequestPrompt';
|
13
14
|
// @ts-ignore: No implicit Any
|
14
|
-
import { useMyMetadata } from '
|
15
|
+
import { useMyMetadata } from '../hooks/useMetadata';
|
15
16
|
// @ts-ignore: No implicit Any
|
16
|
-
import { ROLE_CHANGE_DECLINED } from '
|
17
|
+
import { ROLE_CHANGE_DECLINED } from '../../common/constants';
|
17
18
|
|
18
19
|
export const RoleChangeRequestModal = () => {
|
19
20
|
const hmsActions = useHMSActions();
|
@@ -38,7 +39,14 @@ export const RoleChangeRequestModal = () => {
|
|
38
39
|
|
39
40
|
const body = (
|
40
41
|
<>
|
41
|
-
<Text
|
42
|
+
<Text
|
43
|
+
variant="xs"
|
44
|
+
css={{
|
45
|
+
c: '$on_surface_medium',
|
46
|
+
textAlign: 'center',
|
47
|
+
'@md': { textAlign: 'left', borderBottom: '1px solid $border_bright', pb: '$4', px: '$8' },
|
48
|
+
}}
|
49
|
+
>
|
42
50
|
Setup your audio and video before joining
|
43
51
|
</Text>
|
44
52
|
<Flex
|
@@ -48,20 +56,22 @@ export const RoleChangeRequestModal = () => {
|
|
48
56
|
'@sm': { width: '100%' },
|
49
57
|
flexDirection: 'column',
|
50
58
|
mt: '$6',
|
59
|
+
'@md': { px: '$8' },
|
51
60
|
}}
|
52
61
|
>
|
53
62
|
<PreviewTile name={name || ''} />
|
63
|
+
|
54
64
|
<PreviewControls hideSettings={true} />
|
55
65
|
</Flex>
|
56
66
|
</>
|
57
67
|
);
|
58
68
|
|
59
69
|
return (
|
60
|
-
<
|
61
|
-
title=
|
70
|
+
<RequestPrompt
|
71
|
+
title="You're invited to join the stage"
|
62
72
|
onOpenChange={async value => {
|
63
73
|
if (!value) {
|
64
|
-
|
74
|
+
hmsActions.rejectChangeRole(roleChangeRequest);
|
65
75
|
sendEvent({ ...roleChangeRequest, peerName: name }, { peerId: roleChangeRequest.requestedBy?.id });
|
66
76
|
await hmsActions.cancelMidCallPreview();
|
67
77
|
await hmsActions.lowerLocalPeerHand();
|
@@ -77,45 +87,3 @@ export const RoleChangeRequestModal = () => {
|
|
77
87
|
/>
|
78
88
|
);
|
79
89
|
};
|
80
|
-
|
81
|
-
const RequestDialog = ({
|
82
|
-
open = true,
|
83
|
-
onOpenChange,
|
84
|
-
title,
|
85
|
-
body,
|
86
|
-
actionText = 'Accept',
|
87
|
-
onAction,
|
88
|
-
}: {
|
89
|
-
open?: boolean;
|
90
|
-
onOpenChange: (value: boolean) => void;
|
91
|
-
title: string;
|
92
|
-
body: React.ReactNode;
|
93
|
-
actionText?: string;
|
94
|
-
onAction: () => void;
|
95
|
-
}) => (
|
96
|
-
<Dialog.Root open={open} onOpenChange={onOpenChange}>
|
97
|
-
<Dialog.Portal>
|
98
|
-
<Dialog.Overlay />
|
99
|
-
<Dialog.Content css={{ p: '$10' }}>
|
100
|
-
<Dialog.Title css={{ p: 0, display: 'flex', flexDirection: 'row', gap: '$md', justifyContent: 'center' }}>
|
101
|
-
<Text variant="h6">{title}</Text>
|
102
|
-
</Dialog.Title>
|
103
|
-
<Box css={{ mt: '$4', mb: '$10' }}>{body}</Box>
|
104
|
-
<Flex justify="center" align="center" css={{ width: '100%', gap: '$md' }}>
|
105
|
-
<Box css={{ width: '50%' }}>
|
106
|
-
<Dialog.Close css={{ width: '100%' }}>
|
107
|
-
<Button variant="standard" outlined css={{ width: '100%' }}>
|
108
|
-
Cancel
|
109
|
-
</Button>
|
110
|
-
</Dialog.Close>
|
111
|
-
</Box>
|
112
|
-
<Box css={{ width: '50%' }}>
|
113
|
-
<Button variant="primary" css={{ width: '100%' }} onClick={onAction}>
|
114
|
-
{actionText}
|
115
|
-
</Button>
|
116
|
-
</Box>
|
117
|
-
</Flex>
|
118
|
-
</Dialog.Content>
|
119
|
-
</Dialog.Portal>
|
120
|
-
</Dialog.Root>
|
121
|
-
);
|
@@ -9,6 +9,7 @@ import { Sheet } from '../../../Sheet';
|
|
9
9
|
import { Tabs } from '../../../Tabs';
|
10
10
|
import { Text } from '../../../Text';
|
11
11
|
import { config as cssConfig } from '../../../Theme';
|
12
|
+
import { PrebuiltDialogPortal } from '../PrebuiltDialogPortal';
|
12
13
|
import { settingContent, settingsList } from './common.js';
|
13
14
|
|
14
15
|
const SettingsModal = ({ open, onOpenChange, screenType, children = <></> }) => {
|
@@ -186,7 +187,7 @@ const DesktopSettingModal = ({
|
|
186
187
|
return (
|
187
188
|
<Dialog.Root open={open} onOpenChange={onOpenChange}>
|
188
189
|
<Dialog.Trigger asChild>{children}</Dialog.Trigger>
|
189
|
-
<
|
190
|
+
<PrebuiltDialogPortal>
|
190
191
|
<Dialog.Overlay />
|
191
192
|
<Dialog.Content
|
192
193
|
css={{
|
@@ -256,7 +257,7 @@ const DesktopSettingModal = ({
|
|
256
257
|
</IconButton>
|
257
258
|
</Dialog.Close>
|
258
259
|
</Dialog.Content>
|
259
|
-
</
|
260
|
+
</PrebuiltDialogPortal>
|
260
261
|
</Dialog.Root>
|
261
262
|
);
|
262
263
|
};
|
@@ -2,6 +2,7 @@ import React, { useState } from 'react';
|
|
2
2
|
import { selectPermissions, useHMSActions, useHMSStore, useRecordingStreaming } from '@100mslive/react-sdk';
|
3
3
|
import { AlertTriangleIcon } from '@100mslive/react-icons';
|
4
4
|
import { Button, Dialog, Flex, Text } from '../../../';
|
5
|
+
import { PrebuiltDialogPortal } from '../PrebuiltDialogPortal';
|
5
6
|
import { ResolutionInput } from '../Streaming/ResolutionInput';
|
6
7
|
import { getResolution } from '../Streaming/RTMPStreaming';
|
7
8
|
import { ToastManager } from '../Toast/ToastManager';
|
@@ -21,7 +22,7 @@ const StartRecording = ({ open, onOpenChange }) => {
|
|
21
22
|
if (isBrowserRecordingOn) {
|
22
23
|
return (
|
23
24
|
<Dialog.Root open={open} onOpenChange={onOpenChange}>
|
24
|
-
<
|
25
|
+
<PrebuiltDialogPortal>
|
25
26
|
<Dialog.Content
|
26
27
|
css={{
|
27
28
|
width: 'min(400px,80%)',
|
@@ -66,7 +67,7 @@ const StartRecording = ({ open, onOpenChange }) => {
|
|
66
67
|
</Button>
|
67
68
|
</Flex>
|
68
69
|
</Dialog.Content>
|
69
|
-
</
|
70
|
+
</PrebuiltDialogPortal>
|
70
71
|
</Dialog.Root>
|
71
72
|
);
|
72
73
|
}
|
@@ -15,6 +15,7 @@ import { Dialog } from '../../Modal';
|
|
15
15
|
import { Switch } from '../../Switch';
|
16
16
|
import { Text } from '../../Text';
|
17
17
|
import { DialogDropdownTrigger } from '../primitives/DropdownTrigger';
|
18
|
+
import { PrebuiltDialogPortal } from './PrebuiltDialogPortal';
|
18
19
|
import { useSetUiSettings } from './AppData/useUISettings';
|
19
20
|
import { useDropdownSelection } from './hooks/useDropdownSelection';
|
20
21
|
import { UI_SETTINGS } from '../common/constants';
|
@@ -39,7 +40,7 @@ export const StatsForNerds = ({ onOpenChange }) => {
|
|
39
40
|
|
40
41
|
return (
|
41
42
|
<Dialog.Root defaultOpen onOpenChange={onOpenChange}>
|
42
|
-
<
|
43
|
+
<PrebuiltDialogPortal>
|
43
44
|
<Dialog.Overlay />
|
44
45
|
<Dialog.Content
|
45
46
|
css={{
|
@@ -118,7 +119,7 @@ export const StatsForNerds = ({ onOpenChange }) => {
|
|
118
119
|
<TrackStats trackID={selectedStat.id} layer={selectedStat.layer} local={selectedStat.local} />
|
119
120
|
)}
|
120
121
|
</Dialog.Content>
|
121
|
-
</
|
122
|
+
</PrebuiltDialogPortal>
|
122
123
|
</Dialog.Root>
|
123
124
|
);
|
124
125
|
};
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import React, { Fragment, useCallback,
|
1
|
+
import React, { Fragment, useCallback, useMemo, useRef, useState } from 'react';
|
2
2
|
import { useMedia } from 'react-use';
|
3
3
|
import {
|
4
4
|
selectAudioTrackByPeerID,
|
@@ -8,19 +8,17 @@ import {
|
|
8
8
|
selectPeerMetadata,
|
9
9
|
selectPeerNameByID,
|
10
10
|
selectSessionStore,
|
11
|
-
selectTrackAudioByID,
|
12
11
|
selectVideoTrackByID,
|
13
12
|
selectVideoTrackByPeerID,
|
14
13
|
useHMSStore,
|
15
|
-
useHMSVanillaStore,
|
16
14
|
} from '@100mslive/react-sdk';
|
17
15
|
import { BrbTileIcon, HandIcon, MicOffIcon } from '@100mslive/react-icons';
|
18
16
|
import TileConnection from './Connection/TileConnection';
|
19
17
|
import TileMenu, { isSameTile } from './TileMenu/TileMenu';
|
18
|
+
import { AudioLevel } from '../../AudioLevel';
|
20
19
|
import { Avatar } from '../../Avatar';
|
21
|
-
import { Box, Flex } from '../../Layout';
|
22
20
|
import { VideoTileStats } from '../../Stats';
|
23
|
-
import { config as cssConfig
|
21
|
+
import { config as cssConfig } from '../../Theme';
|
24
22
|
import { Video } from '../../Video';
|
25
23
|
import { StyledVideoTile } from '../../VideoTile';
|
26
24
|
import { getVideoTileLabel } from './peerTileUtils';
|
@@ -72,21 +70,34 @@ const Tile = ({
|
|
72
70
|
const onHoverHandler = useCallback(event => {
|
73
71
|
setIsMouseHovered(event.type === 'mouseenter');
|
74
72
|
}, []);
|
75
|
-
|
76
|
-
const
|
77
|
-
|
78
|
-
|
73
|
+
|
74
|
+
const ref = useRef(null);
|
75
|
+
const calculatedHeight = ref.current?.clientHeight || '';
|
76
|
+
const calculatedWidth = ref.current?.clientWidth || '';
|
77
|
+
|
78
|
+
const isTileBigEnoughToShowStats = calculatedHeight >= 180 && calculatedWidth >= 180;
|
79
|
+
|
80
|
+
const [avatarSize, attribBoxSize] = useMemo(() => {
|
81
|
+
if (!calculatedWidth || !calculatedHeight) {
|
82
|
+
return [undefined, undefined];
|
79
83
|
}
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
+
let avatarSize = 'large';
|
85
|
+
if (calculatedWidth <= 150 || calculatedHeight <= 150) {
|
86
|
+
avatarSize = 'small';
|
87
|
+
} else if (calculatedWidth <= 300 || calculatedHeight <= 300) {
|
88
|
+
avatarSize = 'medium';
|
84
89
|
}
|
85
|
-
|
86
|
-
|
90
|
+
let attribBoxSize = 'medium';
|
91
|
+
if (calculatedWidth <= 180 || calculatedHeight <= 180) {
|
92
|
+
attribBoxSize = 'small';
|
93
|
+
}
|
94
|
+
|
95
|
+
return [avatarSize, attribBoxSize];
|
96
|
+
}, [calculatedWidth, calculatedHeight]);
|
87
97
|
|
88
98
|
return (
|
89
99
|
<StyledVideoTile.Root
|
100
|
+
ref={ref}
|
90
101
|
css={{
|
91
102
|
width,
|
92
103
|
height,
|
@@ -131,14 +142,13 @@ const Tile = ({
|
|
131
142
|
|
132
143
|
{!hideAudioMuteOnTile ? (
|
133
144
|
isAudioMuted ? (
|
134
|
-
<StyledVideoTile.AudioIndicator
|
135
|
-
data-testid="participant_audio_mute_icon"
|
136
|
-
size={width && height && (width < 180 || height < 180) ? 'small' : 'medium'}
|
137
|
-
>
|
145
|
+
<StyledVideoTile.AudioIndicator data-testid="participant_audio_mute_icon" size={attribBoxSize}>
|
138
146
|
<MicOffIcon />
|
139
147
|
</StyledVideoTile.AudioIndicator>
|
140
148
|
) : (
|
141
|
-
<
|
149
|
+
<StyledVideoTile.AudioIndicator size={attribBoxSize}>
|
150
|
+
<AudioLevel trackId={audioTrack?.id} size={attribBoxSize} />
|
151
|
+
</StyledVideoTile.AudioIndicator>
|
142
152
|
)
|
143
153
|
) : null}
|
144
154
|
{isMouseHovered || (isDragabble && isMobile) ? (
|
@@ -150,7 +160,7 @@ const Tile = ({
|
|
150
160
|
enableSpotlightingPeer={enableSpotlightingPeer}
|
151
161
|
/>
|
152
162
|
) : null}
|
153
|
-
{!hideMetadataOnTile && <PeerMetadata peerId={peerId} />}
|
163
|
+
{!hideMetadataOnTile && <PeerMetadata peerId={peerId} size={attribBoxSize} />}
|
154
164
|
|
155
165
|
<TileConnection
|
156
166
|
hideLabel={hideParticipantNameOnTile}
|
@@ -167,58 +177,7 @@ const Tile = ({
|
|
167
177
|
);
|
168
178
|
};
|
169
179
|
|
170
|
-
const
|
171
|
-
|
172
|
-
const heightAnimation = value =>
|
173
|
-
keyframes({
|
174
|
-
'50%': {
|
175
|
-
transform: `scale3d(1,${value},1)`,
|
176
|
-
},
|
177
|
-
'100%': {
|
178
|
-
transform: `scale3d(1,1,1)`,
|
179
|
-
},
|
180
|
-
});
|
181
|
-
|
182
|
-
const AudioLevelIndicator = ({ trackId, value, delay }) => {
|
183
|
-
const vanillaStore = useHMSVanillaStore();
|
184
|
-
const ref = useRef();
|
185
|
-
|
186
|
-
useEffect(() => {
|
187
|
-
const unsubscribe = vanillaStore.subscribe(audioLevel => {
|
188
|
-
if (ref.current) {
|
189
|
-
ref.current.style['animation'] = `${heightAnimation(
|
190
|
-
audioLevel ? value : 1,
|
191
|
-
)} 0.3s cubic-bezier(0.61, 1, 0.88, 1) infinite ${delay}s`;
|
192
|
-
}
|
193
|
-
}, selectTrackAudioByID(trackId));
|
194
|
-
return unsubscribe;
|
195
|
-
}, [vanillaStore, trackId, value, delay]);
|
196
|
-
return (
|
197
|
-
<Box
|
198
|
-
ref={ref}
|
199
|
-
css={{
|
200
|
-
w: 4,
|
201
|
-
height: 6,
|
202
|
-
r: 2,
|
203
|
-
bg: '$on_primary_high',
|
204
|
-
}}
|
205
|
-
/>
|
206
|
-
);
|
207
|
-
};
|
208
|
-
|
209
|
-
export const AudioLevel = ({ trackId }) => {
|
210
|
-
return (
|
211
|
-
<StyledVideoTile.AudioIndicator>
|
212
|
-
<Flex align="center" justify="center" css={{ gap: '$2' }}>
|
213
|
-
{[3, 2, 3].map((v, i) => (
|
214
|
-
<AudioLevelIndicator trackId={trackId} value={v} delay={i * 0.15} key={i} />
|
215
|
-
))}
|
216
|
-
</Flex>
|
217
|
-
</StyledVideoTile.AudioIndicator>
|
218
|
-
);
|
219
|
-
};
|
220
|
-
|
221
|
-
const PeerMetadata = ({ peerId }) => {
|
180
|
+
const PeerMetadata = ({ peerId, size }) => {
|
222
181
|
const metaData = useHMSStore(selectPeerMetadata(peerId));
|
223
182
|
const isBRB = metaData?.isBRBOn || false;
|
224
183
|
const isHandRaised = useHMSStore(selectHasPeerHandRaised(peerId));
|
@@ -226,12 +185,12 @@ const PeerMetadata = ({ peerId }) => {
|
|
226
185
|
return (
|
227
186
|
<Fragment>
|
228
187
|
{isHandRaised ? (
|
229
|
-
<StyledVideoTile.AttributeBox
|
188
|
+
<StyledVideoTile.AttributeBox size={size} data-testid="raiseHand_icon_onTile">
|
230
189
|
<HandIcon width={24} height={24} />
|
231
190
|
</StyledVideoTile.AttributeBox>
|
232
191
|
) : null}
|
233
192
|
{isBRB ? (
|
234
|
-
<StyledVideoTile.AttributeBox
|
193
|
+
<StyledVideoTile.AttributeBox size={size} data-testid="brb_icon_onTile">
|
235
194
|
<BrbTileIcon width={22} height={22} />
|
236
195
|
</StyledVideoTile.AttributeBox>
|
237
196
|
) : null}
|
@@ -13,12 +13,12 @@ import { Footer } from './Footer/Footer';
|
|
13
13
|
import { HLSFailureModal } from './Notifications/HLSFailureModal';
|
14
14
|
import { ActivatedPIP } from './PIP/PIPComponent';
|
15
15
|
import { PictureInPicture } from './PIP/PIPManager';
|
16
|
+
import { RoleChangeRequestModal } from './RoleChangeRequest/RoleChangeRequestModal';
|
16
17
|
import { Box, Flex } from '../../Layout';
|
17
18
|
import { useHMSPrebuiltContext } from '../AppContext';
|
18
19
|
import { VideoStreamingSection } from '../layouts/VideoStreamingSection';
|
19
20
|
import FullPageProgress from './FullPageProgress';
|
20
21
|
import { Header } from './Header';
|
21
|
-
import { RoleChangeRequestModal } from './RoleChangeRequestModal';
|
22
22
|
import {
|
23
23
|
useRoomLayoutConferencingScreen,
|
24
24
|
useRoomLayoutPreviewScreen,
|
@@ -31,12 +31,13 @@ export const useMyMetadata = () => {
|
|
31
31
|
await hmsActions.lowerLocalPeerHand();
|
32
32
|
} else {
|
33
33
|
await hmsActions.raiseLocalPeerHand();
|
34
|
+
await update({ isBRBOn: false });
|
34
35
|
}
|
35
36
|
}, [isHandRaised]); //eslint-disable-line
|
36
37
|
|
37
38
|
const toggleBRB = useCallback(async () => {
|
38
39
|
const newValue = !metaData?.isBRBOn;
|
39
|
-
await update({ isBRBOn:
|
40
|
+
await update({ isBRBOn: newValue });
|
40
41
|
if (newValue) {
|
41
42
|
await hmsActions.lowerLocalPeerHand();
|
42
43
|
}
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import React, { useState } from 'react';
|
2
2
|
import { Dialog, Flex } from '../../../';
|
3
3
|
import { DialogInputFile } from '../../primitives/DialogContent';
|
4
|
+
import { PrebuiltDialogPortal } from '../PrebuiltDialogPortal';
|
4
5
|
import { PDFHeader } from './pdfHeader';
|
5
6
|
import { SubmitPDF } from './submitPdf';
|
6
7
|
import { UploadedFile } from './uploadedFile';
|
@@ -10,7 +11,7 @@ export function PDFFileOptions({ onOpenChange }) {
|
|
10
11
|
|
11
12
|
return !pdfFile ? (
|
12
13
|
<Dialog.Root defaultOpen onOpenChange={onOpenChange}>
|
13
|
-
<
|
14
|
+
<PrebuiltDialogPortal>
|
14
15
|
<Dialog.Overlay />
|
15
16
|
<Dialog.Content
|
16
17
|
css={{
|
@@ -34,7 +35,7 @@ export function PDFFileOptions({ onOpenChange }) {
|
|
34
35
|
<SubmitPDF pdfFile={pdfFile} onOpenChange={onOpenChange} />
|
35
36
|
</Flex>
|
36
37
|
</Dialog.Content>
|
37
|
-
</
|
38
|
+
</PrebuiltDialogPortal>
|
38
39
|
</Dialog.Root>
|
39
40
|
) : (
|
40
41
|
<UploadedFile pdfFile={pdfFile} setPDFFile={setPDFFile} onOpenChange={onOpenChange} />
|
@@ -3,7 +3,7 @@ import { useScreenShare } from '@100mslive/react-sdk';
|
|
3
3
|
import { StarIcon, VerticalMenuIcon } from '@100mslive/react-icons';
|
4
4
|
import PDFShareImg from './../../images/pdf-share.png';
|
5
5
|
import ScreenShareImg from './../../images/screen-share.png';
|
6
|
-
import { Box,
|
6
|
+
import { Box, Dropdown, Flex, IconButton, Text, Tooltip } from '../../../';
|
7
7
|
import { ShareMenuIcon } from '../ShareMenuIcon';
|
8
8
|
import { PDFFileOptions } from './pdfFileOptions';
|
9
9
|
|
@@ -75,7 +75,8 @@ export function ShareScreenOptions() {
|
|
75
75
|
alignItems: 'flex-start',
|
76
76
|
gap: '$8',
|
77
77
|
px: '$10',
|
78
|
-
|
78
|
+
pt: '$6',
|
79
|
+
pb: '$10',
|
79
80
|
'&:hover': {
|
80
81
|
bg: '$transparent',
|
81
82
|
cursor: 'default',
|
@@ -163,7 +164,7 @@ export function ShareScreenOptions() {
|
|
163
164
|
align="center"
|
164
165
|
css={{
|
165
166
|
position: 'absolute',
|
166
|
-
top: '
|
167
|
+
top: '35%',
|
167
168
|
left: '54%',
|
168
169
|
padding: '$2 $4',
|
169
170
|
r: '$2',
|
@@ -200,32 +201,6 @@ export function ShareScreenOptions() {
|
|
200
201
|
</Flex>
|
201
202
|
</Flex>
|
202
203
|
</Dropdown.Item>
|
203
|
-
<Dropdown.Item
|
204
|
-
css={{
|
205
|
-
px: '$10',
|
206
|
-
pb: '$10',
|
207
|
-
pt: '$6',
|
208
|
-
'&:hover': {
|
209
|
-
bg: '$transparent',
|
210
|
-
cursor: 'default',
|
211
|
-
},
|
212
|
-
}}
|
213
|
-
>
|
214
|
-
<Button
|
215
|
-
variant="standard"
|
216
|
-
outlined
|
217
|
-
type="submit"
|
218
|
-
onClick={() => {
|
219
|
-
updateState(MODALS.SHARE, false);
|
220
|
-
}}
|
221
|
-
data-testid="share_btn"
|
222
|
-
css={{
|
223
|
-
w: '100%',
|
224
|
-
}}
|
225
|
-
>
|
226
|
-
Cancel
|
227
|
-
</Button>
|
228
|
-
</Dropdown.Item>
|
229
204
|
</Dropdown.Content>
|
230
205
|
</Dropdown.Root>
|
231
206
|
{openModals.has(MODALS.PDF_SHARE) && (
|
@@ -2,6 +2,7 @@ import React from 'react';
|
|
2
2
|
import { TrashIcon } from '@100mslive/react-icons';
|
3
3
|
import { Dialog, Flex, Text } from '../../../';
|
4
4
|
import { DialogRow } from '../../primitives/DialogContent';
|
5
|
+
import { PrebuiltDialogPortal } from '../PrebuiltDialogPortal';
|
5
6
|
import { PDFHeader } from './pdfHeader';
|
6
7
|
import { PDFInfo } from './pdfInfo';
|
7
8
|
import { SubmitPDF } from './submitPdf';
|
@@ -10,7 +11,7 @@ export const UploadedFile = ({ pdfFile, setPDFFile, onOpenChange }) => {
|
|
10
11
|
const [fileName, ext] = pdfFile.name.split('.');
|
11
12
|
return (
|
12
13
|
<Dialog.Root defaultOpen onOpenChange={onOpenChange}>
|
13
|
-
<
|
14
|
+
<PrebuiltDialogPortal>
|
14
15
|
<Dialog.Overlay />
|
15
16
|
<Dialog.Content
|
16
17
|
css={{
|
@@ -65,7 +66,7 @@ export const UploadedFile = ({ pdfFile, setPDFFile, onOpenChange }) => {
|
|
65
66
|
<SubmitPDF pdfFile={pdfFile} onOpenChange={onOpenChange} />
|
66
67
|
</Flex>
|
67
68
|
</Dialog.Content>
|
68
|
-
</
|
69
|
+
</PrebuiltDialogPortal>
|
69
70
|
</Dialog.Root>
|
70
71
|
);
|
71
72
|
};
|
@@ -272,10 +272,12 @@ const HLSView = () => {
|
|
272
272
|
top: '40%',
|
273
273
|
left: '50%',
|
274
274
|
transform: 'translateY(-40%) translateX(-50%)',
|
275
|
-
padding: '$
|
275
|
+
padding: '$8 14px $8 18px',
|
276
276
|
display: 'inline-flex',
|
277
|
-
r: '
|
277
|
+
r: '50%',
|
278
|
+
gap: '$1',
|
278
279
|
bg: '$primary_default',
|
280
|
+
zIndex: 21,
|
279
281
|
}}
|
280
282
|
>
|
281
283
|
<IconButton onClick={async () => await hlsPlayer?.play()} data-testid="play_btn">
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import React, { useRef } from 'react';
|
2
2
|
import { CheckIcon, CloudUploadIcon, CrossIcon } from '@100mslive/react-icons';
|
3
|
+
import { PrebuiltDialogPortal } from '../components/PrebuiltDialogPortal';
|
3
4
|
import { Button } from '../../Button';
|
4
5
|
import { Checkbox } from '../../Checkbox';
|
5
6
|
import { HorizontalDivider } from '../../Divider';
|
@@ -14,7 +15,7 @@ import { Text } from '../../Text';
|
|
14
15
|
|
15
16
|
export const DialogContent = ({ Icon, title, closeable = true, children, css, iconCSS = {}, ...props }) => {
|
16
17
|
return (
|
17
|
-
<
|
18
|
+
<PrebuiltDialogPortal>
|
18
19
|
<Dialog.Overlay />
|
19
20
|
<Dialog.Content css={{ width: 'min(600px, 100%)', ...css }} {...props}>
|
20
21
|
<Dialog.Title>
|
@@ -35,7 +36,7 @@ export const DialogContent = ({ Icon, title, closeable = true, children, css, ic
|
|
35
36
|
<HorizontalDivider css={{ mt: '0.8rem' }} />
|
36
37
|
<Box>{children}</Box>
|
37
38
|
</Dialog.Content>
|
38
|
-
</
|
39
|
+
</PrebuiltDialogPortal>
|
39
40
|
);
|
40
41
|
};
|
41
42
|
|
@@ -60,7 +61,7 @@ export const ErrorDialog = ({ open = true, onOpenChange, title, children, ...pro
|
|
60
61
|
|
61
62
|
export const RequestDialog = ({ open = true, onOpenChange, title, body, actionText = 'Accept', onAction, Icon }) => (
|
62
63
|
<Dialog.Root open={open} onOpenChange={onOpenChange}>
|
63
|
-
<
|
64
|
+
<PrebuiltDialogPortal>
|
64
65
|
<Dialog.Overlay />
|
65
66
|
<Dialog.Content css={{ width: 'min(400px,80%)', p: '$10' }}>
|
66
67
|
<Dialog.Title css={{ p: 0, display: 'flex', flexDirection: 'row', gap: '$md' }}>
|
@@ -97,7 +98,7 @@ export const RequestDialog = ({ open = true, onOpenChange, title, body, actionTe
|
|
97
98
|
</Box>
|
98
99
|
</Flex>
|
99
100
|
</Dialog.Content>
|
100
|
-
</
|
101
|
+
</PrebuiltDialogPortal>
|
101
102
|
</Dialog.Root>
|
102
103
|
);
|
103
104
|
|