@100mslive/roomkit-react 0.1.6-alpha.0 → 0.1.6-alpha.2
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-PY2FKWX3.js → HLSView-QMU5JK7U.js} +208 -118
- package/dist/HLSView-QMU5JK7U.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 +2 -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/SidePaneTabs.d.ts +7 -0
- 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-37FXUPYO.js} +6 -6
- package/dist/VirtualBackground-37FXUPYO.js.map +7 -0
- package/dist/{chunk-GQD2AGWW.js → chunk-KBVIZGYW.js} +12 -2
- package/dist/{chunk-GQD2AGWW.js.map → chunk-KBVIZGYW.js.map} +2 -2
- package/dist/{chunk-RXTHJUMZ.js → chunk-WVGGQZK4.js} +986 -436
- package/dist/chunk-WVGGQZK4.js.map +7 -0
- package/dist/{chunk-E2M2ZSOL.js → chunk-ZKE2N5LH.js} +2 -2
- package/dist/{conference-V2XZGTKU.js → conference-FJJQ4TXX.js} +1136 -1301
- package/dist/conference-FJJQ4TXX.js.map +7 -0
- package/dist/index.cjs.js +3565 -3092
- package/dist/index.cjs.js.map +4 -4
- package/dist/index.js +2 -2
- package/dist/meta.cjs.json +773 -525
- package/dist/meta.esbuild.json +833 -579
- 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 +24 -11
- 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/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} +4 -1
- package/src/Prebuilt/components/Footer/Footer.tsx +30 -5
- package/src/Prebuilt/components/Footer/ParticipantList.jsx +15 -49
- 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/HeaderComponents.jsx +8 -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 +15 -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} +89 -28
- package/src/Prebuilt/components/Notifications/Notifications.jsx +44 -28
- 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} +44 -21
- package/src/Prebuilt/components/{RoleChangeRequestModal.jsx → RoleChangeRequestModal.tsx} +36 -17
- package/src/Prebuilt/components/ScreenshareTile.jsx +6 -7
- package/src/Prebuilt/components/SecondaryTiles.tsx +12 -10
- package/src/Prebuilt/components/SidePaneTabs.tsx +120 -0
- 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 +19 -28
- 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 +25 -11
- package/src/Prebuilt/layouts/VideoStreamingSection.tsx +11 -47
- package/src/Prebuilt/plugins/FlyingEmoji.jsx +14 -2
- package/src/Prebuilt/plugins/VirtualBackground/VirtualBackground.jsx +3 -3
- package/src/Prebuilt/provider/roomLayoutProvider/hooks/useFetchRoomLayout.ts +2 -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/VirtualBackground-AYDHYLIZ.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/Chat/ChatParticipantHeader.jsx +0 -73
- package/src/Prebuilt/components/VideoList.jsx +0 -73
- /package/dist/{chunk-E2M2ZSOL.js.map → chunk-ZKE2N5LH.js.map} +0 -0
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
1
|
+
import React, { ReactNode, useCallback, useEffect, useRef, useState } from 'react';
|
|
2
2
|
import { useMedia } from 'react-use';
|
|
3
3
|
import data from '@emoji-mart/data';
|
|
4
4
|
import Picker from '@emoji-mart/react';
|
|
5
5
|
import { useHMSActions } from '@100mslive/react-sdk';
|
|
6
6
|
import { EmojiIcon, SendIcon } from '@100mslive/react-icons';
|
|
7
|
-
import { Box, config as cssConfig, Flex, IconButton as BaseIconButton, Popover, styled } from '
|
|
7
|
+
import { Box, config as cssConfig, Flex, IconButton as BaseIconButton, Popover, styled } from '../../..';
|
|
8
|
+
// @ts-ignore
|
|
8
9
|
import { ToastManager } from '../Toast/ToastManager';
|
|
10
|
+
import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
|
|
9
11
|
// import { ChatSelectorContainer } from './ChatSelectorContainer';
|
|
12
|
+
// @ts-ignore
|
|
10
13
|
import { useChatDraftMessage } from '../AppData/useChatState';
|
|
14
|
+
// @ts-ignore
|
|
11
15
|
import { useEmojiPickerStyles } from './useEmojiPickerStyles';
|
|
12
16
|
|
|
13
17
|
const TextArea = styled('textarea', {
|
|
@@ -28,7 +32,7 @@ const TextArea = styled('textarea', {
|
|
|
28
32
|
},
|
|
29
33
|
});
|
|
30
34
|
|
|
31
|
-
function EmojiPicker({ onSelect }) {
|
|
35
|
+
function EmojiPicker({ onSelect }: { onSelect: (emoji: any) => void }) {
|
|
32
36
|
const [showEmoji, setShowEmoji] = useState(false);
|
|
33
37
|
const ref = useEmojiPickerStyles(showEmoji);
|
|
34
38
|
return (
|
|
@@ -62,14 +66,26 @@ function EmojiPicker({ onSelect }) {
|
|
|
62
66
|
);
|
|
63
67
|
}
|
|
64
68
|
|
|
65
|
-
export const ChatFooter = ({
|
|
69
|
+
export const ChatFooter = ({
|
|
70
|
+
role,
|
|
71
|
+
peerId,
|
|
72
|
+
onSend,
|
|
73
|
+
children /* onSelect, selection, screenType */,
|
|
74
|
+
}: {
|
|
75
|
+
role: any;
|
|
76
|
+
peerId: string;
|
|
77
|
+
onSend: any;
|
|
78
|
+
children: ReactNode;
|
|
79
|
+
}) => {
|
|
66
80
|
const hmsActions = useHMSActions();
|
|
67
|
-
const inputRef = useRef(null);
|
|
81
|
+
const inputRef = useRef<HTMLTextAreaElement>(null);
|
|
68
82
|
const [draftMessage, setDraftMessage] = useChatDraftMessage();
|
|
69
83
|
const isMobile = useMedia(cssConfig.media.md);
|
|
84
|
+
const { elements } = useRoomLayoutConferencingScreen();
|
|
85
|
+
const isOverlayChat = elements?.chat?.is_overlay;
|
|
70
86
|
|
|
71
87
|
const sendMessage = useCallback(async () => {
|
|
72
|
-
const message = inputRef
|
|
88
|
+
const message = inputRef?.current?.value;
|
|
73
89
|
if (!message || !message.trim().length) {
|
|
74
90
|
return;
|
|
75
91
|
}
|
|
@@ -86,7 +102,8 @@ export const ChatFooter = ({ role, peerId, onSend, children /* onSelect, selecti
|
|
|
86
102
|
onSend();
|
|
87
103
|
}, 0);
|
|
88
104
|
} catch (error) {
|
|
89
|
-
|
|
105
|
+
const err = error as Error;
|
|
106
|
+
ToastManager.addToast({ title: err.message });
|
|
90
107
|
}
|
|
91
108
|
}, [role, peerId, hmsActions, onSend]);
|
|
92
109
|
|
|
@@ -113,7 +130,7 @@ export const ChatFooter = ({ role, peerId, onSend, children /* onSelect, selecti
|
|
|
113
130
|
<Flex
|
|
114
131
|
align="center"
|
|
115
132
|
css={{
|
|
116
|
-
bg: isMobile ? '$surface_dim' : '$surface_default',
|
|
133
|
+
bg: isOverlayChat && isMobile ? '$surface_dim' : '$surface_default',
|
|
117
134
|
minHeight: '$16',
|
|
118
135
|
maxHeight: '$24',
|
|
119
136
|
position: 'relative',
|
|
@@ -130,9 +147,15 @@ export const ChatFooter = ({ role, peerId, onSend, children /* onSelect, selecti
|
|
|
130
147
|
>
|
|
131
148
|
{children}
|
|
132
149
|
<TextArea
|
|
150
|
+
css={{
|
|
151
|
+
c: '$on_surface_high',
|
|
152
|
+
'&:valid ~ .send-msg': { color: '$on_surface_high' },
|
|
153
|
+
'& ~ .send-msg': { color: '$on_surface_low' },
|
|
154
|
+
}}
|
|
133
155
|
placeholder="Send a message...."
|
|
134
156
|
ref={inputRef}
|
|
135
|
-
|
|
157
|
+
required
|
|
158
|
+
autoFocus={!isMobile}
|
|
136
159
|
onKeyPress={async event => {
|
|
137
160
|
if (event.key === 'Enter') {
|
|
138
161
|
if (!event.shiftKey) {
|
|
@@ -149,19 +172,21 @@ export const ChatFooter = ({ role, peerId, onSend, children /* onSelect, selecti
|
|
|
149
172
|
/>
|
|
150
173
|
{!isMobile ? (
|
|
151
174
|
<EmojiPicker
|
|
152
|
-
onSelect={emoji => {
|
|
153
|
-
inputRef.current
|
|
175
|
+
onSelect={(emoji: any) => {
|
|
176
|
+
if (inputRef.current) {
|
|
177
|
+
inputRef.current.value += ` ${emoji.native} `;
|
|
178
|
+
}
|
|
154
179
|
}}
|
|
155
180
|
/>
|
|
156
181
|
) : null}
|
|
157
182
|
<BaseIconButton
|
|
183
|
+
className="send-msg"
|
|
158
184
|
onClick={sendMessage}
|
|
159
185
|
css={{
|
|
160
186
|
ml: 'auto',
|
|
161
187
|
height: 'max-content',
|
|
162
188
|
mr: '$4',
|
|
163
|
-
|
|
164
|
-
'&:hover': { c: '$on_surface_high' },
|
|
189
|
+
'&:hover': { c: isMobile ? '' : '$on_surface_medium' },
|
|
165
190
|
}}
|
|
166
191
|
data-testid="send_msg_btn"
|
|
167
192
|
>
|
|
@@ -9,16 +9,17 @@ export const useEmojiPickerStyles = showing => {
|
|
|
9
9
|
const style = document.createElement('style');
|
|
10
10
|
style.textContent = `
|
|
11
11
|
#root {
|
|
12
|
-
--em-rgb-color: var(--hms-ui-colors-
|
|
12
|
+
--em-rgb-color: var(--hms-ui-colors-on_surface_high);
|
|
13
13
|
--em-rgb-input: var(--hms-ui-colors-on_primary_high);
|
|
14
|
-
--em-color-border: var(--hms-ui-colors-
|
|
15
|
-
--color-b: var(--hms-ui-colors-
|
|
14
|
+
--em-color-border: var(--hms-ui-colors-surface_bright);
|
|
15
|
+
--color-b: var(--hms-ui-colors-on_surface_high);
|
|
16
16
|
--rgb-background: transparent;
|
|
17
|
-
color: var(--hms-ui-colors-
|
|
17
|
+
color: var(--hms-ui-colors-on_surface_high);
|
|
18
18
|
font-family: var(--hms-ui-fonts-sans);
|
|
19
19
|
}
|
|
20
20
|
.sticky {
|
|
21
21
|
background-color: var(--hms-ui-colors-surface_bright);
|
|
22
|
+
margin-top: 0.5rem;
|
|
22
23
|
}
|
|
23
24
|
`;
|
|
24
25
|
root?.appendChild(style);
|
package/src/Prebuilt/components/Connection/{ConnectionIndicator.jsx → ConnectionIndicator.tsx}
RENAMED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { selectConnectionQualityByPeerID, useHMSStore } from '@100mslive/react-sdk';
|
|
3
3
|
import { PoorConnectivityIcon } from '@100mslive/react-icons';
|
|
4
|
-
import { styled, Tooltip, useTheme } from '
|
|
4
|
+
import { styled, Tooltip, useTheme } from '../../..';
|
|
5
|
+
// @ts-ignore
|
|
5
6
|
import { getColor, getTooltipText } from './connectionQualityUtils';
|
|
6
7
|
|
|
7
8
|
const Wrapper = styled('span', {
|
|
@@ -10,7 +11,6 @@ const Wrapper = styled('span', {
|
|
|
10
11
|
display: 'flex',
|
|
11
12
|
alignItems: 'center',
|
|
12
13
|
justifyContent: 'center',
|
|
13
|
-
backgroundColor: '$background_dim',
|
|
14
14
|
borderRadius: '$round',
|
|
15
15
|
variants: {
|
|
16
16
|
isTile: {
|
|
@@ -22,7 +22,15 @@ const Wrapper = styled('span', {
|
|
|
22
22
|
},
|
|
23
23
|
});
|
|
24
24
|
|
|
25
|
-
export const ConnectionIndicator = ({
|
|
25
|
+
export const ConnectionIndicator = ({
|
|
26
|
+
peerId,
|
|
27
|
+
isTile = false,
|
|
28
|
+
hideBg = false,
|
|
29
|
+
}: {
|
|
30
|
+
peerId: string;
|
|
31
|
+
isTile?: boolean;
|
|
32
|
+
hideBg?: boolean;
|
|
33
|
+
}) => {
|
|
26
34
|
const downlinkQuality = useHMSStore(selectConnectionQualityByPeerID(peerId))?.downlinkQuality;
|
|
27
35
|
const { theme } = useTheme();
|
|
28
36
|
const defaultColor = theme.colors.surface_brighter;
|
|
@@ -41,7 +49,7 @@ export const ConnectionIndicator = ({ peerId, isTile = false }) => {
|
|
|
41
49
|
const size = isTile ? 12 : 16;
|
|
42
50
|
return (
|
|
43
51
|
<Tooltip title={getTooltipText(downlinkQuality)}>
|
|
44
|
-
<Wrapper isTile={isTile} data-testid="tile_network">
|
|
52
|
+
<Wrapper isTile={isTile} data-testid="tile_network" css={{ backgroundColor: hideBg ? '' : '$surface_bright' }}>
|
|
45
53
|
<svg
|
|
46
54
|
width={size}
|
|
47
55
|
height={size}
|
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { PinIcon, SpotlightIcon } from '@100mslive/react-icons';
|
|
3
|
-
import { Flex, styled, Text, textEllipsis } from '
|
|
3
|
+
import { Flex, styled, Text, textEllipsis } from '../../..';
|
|
4
4
|
import { ConnectionIndicator } from './ConnectionIndicator';
|
|
5
5
|
|
|
6
|
-
const TileConnection = ({
|
|
6
|
+
const TileConnection = ({
|
|
7
|
+
name,
|
|
8
|
+
peerId,
|
|
9
|
+
hideLabel,
|
|
10
|
+
width,
|
|
11
|
+
spotlighted,
|
|
12
|
+
pinned,
|
|
13
|
+
}: {
|
|
14
|
+
name: string;
|
|
15
|
+
peerId: string;
|
|
16
|
+
hideLabel: boolean;
|
|
17
|
+
width?: number;
|
|
18
|
+
spotlighted?: boolean;
|
|
19
|
+
pinned?: boolean;
|
|
20
|
+
}) => {
|
|
7
21
|
return (
|
|
8
22
|
<Wrapper>
|
|
9
23
|
{!hideLabel ? (
|
|
@@ -11,26 +25,26 @@ const TileConnection = ({ name, peerId, hideLabel, width, spotlighted, pinned })
|
|
|
11
25
|
<Flex align="center">
|
|
12
26
|
{pinned && (
|
|
13
27
|
<IconWrapper>
|
|
14
|
-
<PinIcon width="15" height="15"
|
|
28
|
+
<PinIcon width="15" height="15" />
|
|
15
29
|
</IconWrapper>
|
|
16
30
|
)}
|
|
17
31
|
{spotlighted && (
|
|
18
32
|
<IconWrapper>
|
|
19
|
-
<SpotlightIcon width="15" height="15"
|
|
33
|
+
<SpotlightIcon width="15" height="15" />
|
|
20
34
|
</IconWrapper>
|
|
21
35
|
)}
|
|
22
36
|
<Text
|
|
23
37
|
css={{
|
|
24
38
|
c: '$on_surface_high',
|
|
25
39
|
verticalAlign: 'baseline',
|
|
26
|
-
...textEllipsis(width - 60),
|
|
40
|
+
...(width ? textEllipsis(width - 60) : {}),
|
|
27
41
|
}}
|
|
28
42
|
variant="xs"
|
|
29
43
|
>
|
|
30
44
|
{name}
|
|
31
45
|
</Text>
|
|
32
46
|
</Flex>
|
|
33
|
-
<ConnectionIndicator isTile peerId={peerId} />
|
|
47
|
+
<ConnectionIndicator isTile peerId={peerId} hideBg />
|
|
34
48
|
</>
|
|
35
49
|
) : null}
|
|
36
50
|
</Wrapper>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { Fragment,
|
|
1
|
+
import React, { Fragment, useState } from 'react';
|
|
2
2
|
import { useMedia } from 'react-use';
|
|
3
3
|
import data from '@emoji-mart/data/sets/14/apple.json';
|
|
4
4
|
import { init } from 'emoji-mart';
|
|
@@ -34,13 +34,8 @@ export const EmojiReaction = () => {
|
|
|
34
34
|
// const { isStreamingOn } = useRecordingStreaming();
|
|
35
35
|
const isMobile = useMedia(cssConfig.media.md);
|
|
36
36
|
|
|
37
|
-
const onEmojiEvent = useCallback(data => {
|
|
38
|
-
window.showFlyingEmoji(data?.emojiId, data?.senderId);
|
|
39
|
-
}, []);
|
|
40
|
-
|
|
41
37
|
const { sendEvent } = useCustomEvent({
|
|
42
38
|
type: EMOJI_REACTION_TYPE,
|
|
43
|
-
onEvent: onEmojiEvent,
|
|
44
39
|
});
|
|
45
40
|
|
|
46
41
|
const sendReaction = async emojiId => {
|
|
@@ -51,6 +46,7 @@ export const EmojiReaction = () => {
|
|
|
51
46
|
};
|
|
52
47
|
// TODO: RT find a way to figure out hls-viewer roles
|
|
53
48
|
sendEvent(data, { roleNames: roles });
|
|
49
|
+
window.showFlyingEmoji?.({ emojiId, senderId: localPeerId });
|
|
54
50
|
/* if (isStreamingOn) {
|
|
55
51
|
try {
|
|
56
52
|
await hmsActions.sendHLSTimedMetadata([
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { selectUnreadHMSMessagesCount, useHMSStore } from '@100mslive/react-sdk';
|
|
3
3
|
import { ChatIcon, ChatUnreadIcon } from '@100mslive/react-icons';
|
|
4
|
-
import { Tooltip } from '
|
|
4
|
+
import { Tooltip } from '../../..';
|
|
5
|
+
// @ts-ignore: No implicit Any
|
|
5
6
|
import IconButton from '../../IconButton';
|
|
7
|
+
// @ts-ignore: No implicit Any
|
|
6
8
|
import { useIsSidepaneTypeOpen, useSidepaneToggle } from '../AppData/useSidepane';
|
|
9
|
+
// @ts-ignore: No implicit Any
|
|
7
10
|
import { SIDE_PANE_OPTIONS } from '../../common/constants';
|
|
8
11
|
|
|
9
12
|
export const ChatToggle = () => {
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { Suspense, useEffect } from 'react';
|
|
2
2
|
import { useMedia } from 'react-use';
|
|
3
3
|
import {
|
|
4
4
|
ConferencingScreen,
|
|
5
5
|
DefaultConferencingScreen_Elements,
|
|
6
6
|
HLSLiveStreamingScreen_Elements,
|
|
7
7
|
} from '@100mslive/types-prebuilt';
|
|
8
|
+
import { Chat_ChatState } from '@100mslive/types-prebuilt/elements/chat';
|
|
8
9
|
import { config as cssConfig, Footer as AppFooter } from '../../..';
|
|
9
10
|
// @ts-ignore: No implicit Any
|
|
10
11
|
import { AudioVideoToggle } from '../AudioVideoToggle';
|
|
@@ -22,6 +23,12 @@ import { ScreenshareToggle } from '../ScreenShareToggle';
|
|
|
22
23
|
import { ChatToggle } from './ChatToggle';
|
|
23
24
|
// @ts-ignore: No implicit Any
|
|
24
25
|
import { ParticipantCount } from './ParticipantList';
|
|
26
|
+
// @ts-ignore: No implicit Any
|
|
27
|
+
import { useIsSidepaneTypeOpen, useSidepaneToggle } from '../AppData/useSidepane';
|
|
28
|
+
// @ts-ignore: No implicit Any
|
|
29
|
+
import { SIDE_PANE_OPTIONS } from '../../common/constants';
|
|
30
|
+
// @ts-ignore: No implicit Any
|
|
31
|
+
const VirtualBackground = React.lazy(() => import('../../plugins/VirtualBackground/VirtualBackground'));
|
|
25
32
|
|
|
26
33
|
export const Footer = ({
|
|
27
34
|
screenType,
|
|
@@ -31,6 +38,18 @@ export const Footer = ({
|
|
|
31
38
|
elements: DefaultConferencingScreen_Elements | HLSLiveStreamingScreen_Elements;
|
|
32
39
|
}) => {
|
|
33
40
|
const isMobile = useMedia(cssConfig.media.md);
|
|
41
|
+
const isOverlayChat = !!elements?.chat?.is_overlay;
|
|
42
|
+
const openByDefault = elements?.chat?.initial_state === Chat_ChatState.CHAT_STATE_OPEN;
|
|
43
|
+
|
|
44
|
+
const isChatOpen = useIsSidepaneTypeOpen(SIDE_PANE_OPTIONS.CHAT);
|
|
45
|
+
const toggleChat = useSidepaneToggle(SIDE_PANE_OPTIONS.CHAT);
|
|
46
|
+
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (!isChatOpen && openByDefault) {
|
|
49
|
+
toggleChat();
|
|
50
|
+
}
|
|
51
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
52
|
+
}, [toggleChat, openByDefault]);
|
|
34
53
|
|
|
35
54
|
return (
|
|
36
55
|
<AppFooter.Root
|
|
@@ -40,7 +59,8 @@ export const Footer = ({
|
|
|
40
59
|
justifyContent: 'center',
|
|
41
60
|
gap: '$10',
|
|
42
61
|
position: 'relative',
|
|
43
|
-
|
|
62
|
+
// To prevent it from showing over the sidepane if chat type is not overlay
|
|
63
|
+
zIndex: isOverlayChat ? 20 : 1,
|
|
44
64
|
},
|
|
45
65
|
}}
|
|
46
66
|
>
|
|
@@ -55,6 +75,11 @@ export const Footer = ({
|
|
|
55
75
|
>
|
|
56
76
|
{isMobile ? <LeaveRoom screenType={screenType} /> : null}
|
|
57
77
|
<AudioVideoToggle />
|
|
78
|
+
{isMobile ? null : (
|
|
79
|
+
<Suspense fallback={<></>}>
|
|
80
|
+
<VirtualBackground />
|
|
81
|
+
</Suspense>
|
|
82
|
+
)}
|
|
58
83
|
</AppFooter.Left>
|
|
59
84
|
<AppFooter.Center
|
|
60
85
|
css={{
|
|
@@ -73,15 +98,15 @@ export const Footer = ({
|
|
|
73
98
|
) : (
|
|
74
99
|
<>
|
|
75
100
|
<ScreenshareToggle />
|
|
76
|
-
|
|
101
|
+
<RaiseHand />
|
|
77
102
|
{elements?.emoji_reactions && <EmojiReaction />}
|
|
78
103
|
<LeaveRoom screenType={screenType} />
|
|
79
104
|
</>
|
|
80
105
|
)}
|
|
81
106
|
</AppFooter.Center>
|
|
82
107
|
<AppFooter.Right>
|
|
83
|
-
{elements?.chat && <ChatToggle />}
|
|
84
|
-
<ParticipantCount />
|
|
108
|
+
{!isMobile && elements?.chat && <ChatToggle />}
|
|
109
|
+
{elements?.participant_list && <ParticipantCount />}
|
|
85
110
|
<MoreSettings elements={elements} screenType={screenType} />
|
|
86
111
|
</AppFooter.Right>
|
|
87
112
|
</AppFooter.Root>
|
|
@@ -21,12 +21,10 @@ import {
|
|
|
21
21
|
} from '@100mslive/react-icons';
|
|
22
22
|
import { Box, config as cssConfig, Dropdown, Flex, Input, Text, textEllipsis } from '../../..';
|
|
23
23
|
import IconButton from '../../IconButton';
|
|
24
|
-
import { useRoomLayout } from '../../provider/roomLayoutProvider';
|
|
25
|
-
import { ChatParticipantHeader } from '../Chat/ChatParticipantHeader';
|
|
26
24
|
import { ConnectionIndicator } from '../Connection/ConnectionIndicator';
|
|
27
|
-
import { RoleChangeModal } from '../RoleChangeModal';
|
|
28
25
|
import { ToastManager } from '../Toast/ToastManager';
|
|
29
26
|
import { RoleAccordion } from './RoleAccordion';
|
|
27
|
+
import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
|
|
30
28
|
import { useIsSidepaneTypeOpen, useSidepaneToggle } from '../AppData/useSidepane';
|
|
31
29
|
import { useParticipants } from '../../common/hooks';
|
|
32
30
|
import { isInternalRole } from '../../common/utils';
|
|
@@ -46,7 +44,6 @@ export const ParticipantList = () => {
|
|
|
46
44
|
peersOrderedByRoles[participant.roleName].push(participant);
|
|
47
45
|
});
|
|
48
46
|
|
|
49
|
-
const [selectedPeerId, setSelectedPeerId] = useState(null);
|
|
50
47
|
const onSearch = useCallback(value => {
|
|
51
48
|
setFilter(filterValue => {
|
|
52
49
|
if (!filterValue) {
|
|
@@ -63,7 +60,6 @@ export const ParticipantList = () => {
|
|
|
63
60
|
return (
|
|
64
61
|
<Fragment>
|
|
65
62
|
<Flex direction="column" css={{ size: '100%', gap: '$4' }}>
|
|
66
|
-
<ChatParticipantHeader activeTabValue={SIDE_PANE_OPTIONS.PARTICIPANTS} />
|
|
67
63
|
{!filter?.search && participants.length === 0 ? null : <ParticipantSearch onSearch={onSearch} inSidePane />}
|
|
68
64
|
{participants.length === 0 ? (
|
|
69
65
|
<Flex align="center" justify="center" css={{ w: '100%', p: '$8 0' }}>
|
|
@@ -75,16 +71,7 @@ export const ParticipantList = () => {
|
|
|
75
71
|
handRaisedList={handRaisedPeers}
|
|
76
72
|
isConnected={isConnected}
|
|
77
73
|
filter={filter}
|
|
78
|
-
setSelectedPeerId={setSelectedPeerId}
|
|
79
74
|
/>
|
|
80
|
-
{selectedPeerId && (
|
|
81
|
-
<RoleChangeModal
|
|
82
|
-
peerId={selectedPeerId}
|
|
83
|
-
onOpenChange={value => {
|
|
84
|
-
!value && setSelectedPeerId(null);
|
|
85
|
-
}}
|
|
86
|
-
/>
|
|
87
|
-
)}
|
|
88
75
|
</Flex>
|
|
89
76
|
</Fragment>
|
|
90
77
|
);
|
|
@@ -126,13 +113,7 @@ export const ParticipantCount = () => {
|
|
|
126
113
|
);
|
|
127
114
|
};
|
|
128
115
|
|
|
129
|
-
const VirtualizedParticipants = ({
|
|
130
|
-
peersOrderedByRoles = {},
|
|
131
|
-
isConnected,
|
|
132
|
-
setSelectedPeerId,
|
|
133
|
-
filter,
|
|
134
|
-
handRaisedList = [],
|
|
135
|
-
}) => {
|
|
116
|
+
const VirtualizedParticipants = ({ peersOrderedByRoles = {}, isConnected, filter, handRaisedList = [] }) => {
|
|
136
117
|
return (
|
|
137
118
|
<Flex
|
|
138
119
|
direction="column"
|
|
@@ -149,7 +130,6 @@ const VirtualizedParticipants = ({
|
|
|
149
130
|
roleName="Hand Raised"
|
|
150
131
|
filter={filter}
|
|
151
132
|
isConnected={isConnected}
|
|
152
|
-
setSelectedPeerId={setSelectedPeerId}
|
|
153
133
|
isHandRaisedAccordion
|
|
154
134
|
/>
|
|
155
135
|
{Object.keys(peersOrderedByRoles).map(role => (
|
|
@@ -158,7 +138,6 @@ const VirtualizedParticipants = ({
|
|
|
158
138
|
peerList={peersOrderedByRoles[role]}
|
|
159
139
|
roleName={role}
|
|
160
140
|
isConnected={isConnected}
|
|
161
|
-
setSelectedPeerId={setSelectedPeerId}
|
|
162
141
|
filter={filter}
|
|
163
142
|
/>
|
|
164
143
|
))}
|
|
@@ -166,7 +145,7 @@ const VirtualizedParticipants = ({
|
|
|
166
145
|
);
|
|
167
146
|
};
|
|
168
147
|
|
|
169
|
-
export const Participant = ({ peer, isConnected
|
|
148
|
+
export const Participant = ({ peer, isConnected }) => {
|
|
170
149
|
const localPeerId = useHMSStore(selectLocalPeerID);
|
|
171
150
|
return (
|
|
172
151
|
<Flex
|
|
@@ -186,14 +165,7 @@ export const Participant = ({ peer, isConnected, setSelectedPeerId }) => {
|
|
|
186
165
|
{peer.name} {localPeerId === peer.id ? '(You)' : ''}
|
|
187
166
|
</Text>
|
|
188
167
|
{isConnected ? (
|
|
189
|
-
<ParticipantActions
|
|
190
|
-
peerId={peer.id}
|
|
191
|
-
isLocal={peer.id === localPeerId}
|
|
192
|
-
role={peer.roleName}
|
|
193
|
-
onSettings={() => {
|
|
194
|
-
setSelectedPeerId(peer.id);
|
|
195
|
-
}}
|
|
196
|
-
/>
|
|
168
|
+
<ParticipantActions peerId={peer.id} isLocal={peer.id === localPeerId} role={peer.roleName} />
|
|
197
169
|
) : null}
|
|
198
170
|
</Flex>
|
|
199
171
|
);
|
|
@@ -202,7 +174,7 @@ export const Participant = ({ peer, isConnected, setSelectedPeerId }) => {
|
|
|
202
174
|
/**
|
|
203
175
|
* shows settings to change for a participant like changing their role
|
|
204
176
|
*/
|
|
205
|
-
const ParticipantActions = React.memo(({
|
|
177
|
+
const ParticipantActions = React.memo(({ peerId, role, isLocal }) => {
|
|
206
178
|
const isHandRaised = useHMSStore(selectPeerMetadata(peerId))?.isHandRaised;
|
|
207
179
|
const canChangeRole = useHMSStore(selectPermissions)?.changeRole;
|
|
208
180
|
const shouldShowMoreActions = canChangeRole;
|
|
@@ -214,7 +186,6 @@ const ParticipantActions = React.memo(({ onSettings, peerId, role, isLocal }) =>
|
|
|
214
186
|
css={{
|
|
215
187
|
flexShrink: 0,
|
|
216
188
|
gap: '$8',
|
|
217
|
-
mt: '$2',
|
|
218
189
|
}}
|
|
219
190
|
>
|
|
220
191
|
<ConnectionIndicator peerId={peerId} />
|
|
@@ -238,24 +209,26 @@ const ParticipantActions = React.memo(({ onSettings, peerId, role, isLocal }) =>
|
|
|
238
209
|
) : null}
|
|
239
210
|
|
|
240
211
|
{shouldShowMoreActions && !isInternalRole(role) && !isLocal ? (
|
|
241
|
-
<ParticipantMoreActions
|
|
212
|
+
<ParticipantMoreActions peerId={peerId} role={role} />
|
|
242
213
|
) : null}
|
|
243
214
|
</Flex>
|
|
244
215
|
);
|
|
245
216
|
});
|
|
246
217
|
|
|
247
|
-
const ParticipantMoreActions = ({
|
|
218
|
+
const ParticipantMoreActions = ({ peerId, role }) => {
|
|
248
219
|
const hmsActions = useHMSActions();
|
|
249
220
|
const { changeRole: canChangeRole, removeOthers: canRemoveOthers } = useHMSStore(selectPermissions);
|
|
250
|
-
const
|
|
221
|
+
const { elements } = useRoomLayoutConferencingScreen();
|
|
251
222
|
const {
|
|
252
223
|
bring_to_stage_label,
|
|
253
224
|
remove_from_stage_label,
|
|
254
225
|
on_stage_role,
|
|
255
226
|
off_stage_roles = [],
|
|
256
|
-
} =
|
|
257
|
-
const canBringToStage = off_stage_roles.includes(role);
|
|
227
|
+
} = elements.on_stage_exp || {};
|
|
258
228
|
const isInStage = role === on_stage_role;
|
|
229
|
+
const shouldShowStageRoleChange =
|
|
230
|
+
canChangeRole &&
|
|
231
|
+
((isInStage && remove_from_stage_label) || (off_stage_roles?.includes(role) && bring_to_stage_label));
|
|
259
232
|
const prevRole = useHMSStore(selectPeerMetadata(peerId))?.prevRole;
|
|
260
233
|
const localPeerId = useHMSStore(selectLocalPeerID);
|
|
261
234
|
const isLocal = localPeerId === peerId;
|
|
@@ -263,7 +236,7 @@ const ParticipantMoreActions = ({ onRoleChange, peerId, role }) => {
|
|
|
263
236
|
|
|
264
237
|
const handleStageAction = async () => {
|
|
265
238
|
if (isInStage) {
|
|
266
|
-
hmsActions.changeRoleOfPeer(peerId, prevRole
|
|
239
|
+
prevRole && hmsActions.changeRoleOfPeer(peerId, prevRole, true);
|
|
267
240
|
} else {
|
|
268
241
|
await hmsActions.changeRoleOfPeer(peerId, on_stage_role);
|
|
269
242
|
}
|
|
@@ -296,21 +269,14 @@ const ParticipantMoreActions = ({ onRoleChange, peerId, role }) => {
|
|
|
296
269
|
</Dropdown.Trigger>
|
|
297
270
|
<Dropdown.Portal>
|
|
298
271
|
<Dropdown.Content align="end" sideOffset={8} css={{ w: '$64', bg: '$surface_default' }}>
|
|
299
|
-
{
|
|
272
|
+
{shouldShowStageRoleChange ? (
|
|
300
273
|
<Dropdown.Item css={{ bg: '$surface_default' }} onClick={() => handleStageAction()}>
|
|
301
274
|
<ChangeRoleIcon />
|
|
302
275
|
<Text variant="sm" css={{ ml: '$4', fontWeight: '$semiBold', c: '$on_surface_high' }}>
|
|
303
276
|
{isInStage ? remove_from_stage_label : bring_to_stage_label}
|
|
304
277
|
</Text>
|
|
305
278
|
</Dropdown.Item>
|
|
306
|
-
) :
|
|
307
|
-
<Dropdown.Item css={{ bg: '$surface_default' }} onClick={() => onRoleChange(peerId)}>
|
|
308
|
-
<ChangeRoleIcon />
|
|
309
|
-
<Text variant="sm" css={{ ml: '$4', fontWeight: '$semiBold', c: '$on_surface_high' }}>
|
|
310
|
-
Change Role
|
|
311
|
-
</Text>
|
|
312
|
-
</Dropdown.Item>
|
|
313
|
-
)}
|
|
279
|
+
) : null}
|
|
314
280
|
|
|
315
281
|
{!isLocal && canRemoveOthers && (
|
|
316
282
|
<Dropdown.Item
|
|
@@ -1,53 +1,61 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { useMeasure } from 'react-use';
|
|
3
3
|
import { FixedSizeList } from 'react-window';
|
|
4
|
+
import { HMSPeer } from '@100mslive/react-sdk';
|
|
4
5
|
import { Accordion } from '../../../Accordion';
|
|
5
6
|
import { Box, Flex } from '../../../Layout';
|
|
7
|
+
import { Text } from '../../../Text';
|
|
8
|
+
// @ts-ignore: No implicit Any
|
|
6
9
|
import { Participant } from './ParticipantList';
|
|
10
|
+
import { RoleOptions } from './RoleOptions';
|
|
11
|
+
// @ts-ignore: No implicit Any
|
|
7
12
|
import { getFormattedCount } from '../../common/utils';
|
|
8
13
|
|
|
9
14
|
const ROW_HEIGHT = 50;
|
|
10
15
|
|
|
11
|
-
|
|
16
|
+
interface ItemData {
|
|
17
|
+
peerList: HMSPeer[];
|
|
18
|
+
isConnected: boolean;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function itemKey(index: number, data: ItemData) {
|
|
12
22
|
return data.peerList[index].id;
|
|
13
23
|
}
|
|
14
24
|
|
|
15
|
-
const VirtualizedParticipantItem = React.memo(({ index, data }) => {
|
|
16
|
-
return
|
|
17
|
-
<Participant
|
|
18
|
-
key={data.peerList[index].id}
|
|
19
|
-
peer={data.peerList[index]}
|
|
20
|
-
isConnected={data.isConnected}
|
|
21
|
-
setSelectedPeerId={data.setSelectedPeerId}
|
|
22
|
-
/>
|
|
23
|
-
);
|
|
25
|
+
const VirtualizedParticipantItem = React.memo(({ index, data }: { index: number; data: ItemData }) => {
|
|
26
|
+
return <Participant key={data.peerList[index].id} peer={data.peerList[index]} isConnected={data.isConnected} />;
|
|
24
27
|
});
|
|
25
28
|
|
|
26
29
|
export const RoleAccordion = ({
|
|
27
30
|
peerList = [],
|
|
28
31
|
roleName,
|
|
29
|
-
setSelectedPeerId,
|
|
30
32
|
isConnected,
|
|
31
33
|
filter,
|
|
32
34
|
isHandRaisedAccordion = false,
|
|
35
|
+
}: ItemData & {
|
|
36
|
+
roleName: string;
|
|
37
|
+
isHandRaisedAccordion?: boolean;
|
|
38
|
+
filter?: { search: string };
|
|
33
39
|
}) => {
|
|
34
|
-
const [ref, { width }] = useMeasure();
|
|
35
|
-
const height = ROW_HEIGHT * peerList.length;
|
|
40
|
+
const [ref, { width }] = useMeasure<HTMLDivElement>();
|
|
36
41
|
const showAcordion = filter?.search ? peerList.some(peer => peer.name.toLowerCase().includes(filter.search)) : true;
|
|
42
|
+
|
|
37
43
|
if (!showAcordion || (isHandRaisedAccordion && filter?.search) || peerList.length === 0) {
|
|
38
44
|
return null;
|
|
39
45
|
}
|
|
46
|
+
const height = ROW_HEIGHT * peerList.length;
|
|
40
47
|
|
|
41
48
|
return (
|
|
42
|
-
<Flex direction="column" css={{ flexGrow: 1 }} ref={ref}>
|
|
49
|
+
<Flex direction="column" css={{ flexGrow: 1, '&:hover .role_actions': { visibility: 'visible' } }} ref={ref}>
|
|
43
50
|
<Accordion.Root
|
|
44
51
|
type="single"
|
|
45
52
|
collapsible
|
|
46
53
|
defaultValue={roleName}
|
|
47
|
-
css={{ borderRadius: '$
|
|
54
|
+
css={{ borderRadius: '$1', border: '1px solid $border_bright' }}
|
|
48
55
|
>
|
|
49
56
|
<Accordion.Item value={roleName}>
|
|
50
57
|
<Accordion.Header
|
|
58
|
+
iconStyles={{ c: '$on_surface_high' }}
|
|
51
59
|
css={{
|
|
52
60
|
textTransform: 'capitalize',
|
|
53
61
|
p: '$6 $8',
|
|
@@ -56,13 +64,21 @@ export const RoleAccordion = ({
|
|
|
56
64
|
c: '$on_surface_medium',
|
|
57
65
|
}}
|
|
58
66
|
>
|
|
59
|
-
{
|
|
67
|
+
<Flex justify="between" css={{ flexGrow: 1, pr: '$6' }}>
|
|
68
|
+
<Text
|
|
69
|
+
variant="sm"
|
|
70
|
+
css={{ fontWeight: '$semiBold', textTransform: 'capitalize', color: '$on_surface_medium' }}
|
|
71
|
+
>
|
|
72
|
+
{roleName} {`(${getFormattedCount(peerList.length)})`}
|
|
73
|
+
</Text>
|
|
74
|
+
<RoleOptions roleName={roleName} peerList={peerList} />
|
|
75
|
+
</Flex>
|
|
60
76
|
</Accordion.Header>
|
|
61
77
|
<Accordion.Content>
|
|
62
78
|
<Box css={{ borderTop: '1px solid $border_default' }} />
|
|
63
79
|
<FixedSizeList
|
|
64
80
|
itemSize={ROW_HEIGHT}
|
|
65
|
-
itemData={{ peerList, isConnected
|
|
81
|
+
itemData={{ peerList, isConnected }}
|
|
66
82
|
itemKey={itemKey}
|
|
67
83
|
itemCount={peerList.length}
|
|
68
84
|
width={width}
|