@100mslive/roomkit-react 0.3.2-alpha.0 → 0.3.2-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.
@@ -4691,7 +4691,7 @@
4691
4691
  "format": "cjs"
4692
4692
  },
4693
4693
  "../hms-video-store/dist/index.js": {
4694
- "bytes": 326171,
4694
+ "bytes": 326185,
4695
4695
  "imports": [
4696
4696
  {
4697
4697
  "path": "../../node_modules/reselect/es/index.js",
@@ -6010,8 +6010,39 @@
6010
6010
  ],
6011
6011
  "format": "esm"
6012
6012
  },
6013
+ "src/Prebuilt/components/hooks/useGroupOnStageActions.tsx": {
6014
+ "bytes": 1795,
6015
+ "imports": [
6016
+ {
6017
+ "path": "ts-pattern",
6018
+ "kind": "import-statement",
6019
+ "external": true
6020
+ },
6021
+ {
6022
+ "path": "@100mslive/react-sdk",
6023
+ "kind": "import-statement",
6024
+ "external": true
6025
+ },
6026
+ {
6027
+ "path": "src/Prebuilt/provider/roomLayoutProvider/hooks/useRoomLayoutScreen.ts",
6028
+ "kind": "import-statement",
6029
+ "original": "../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen"
6030
+ },
6031
+ {
6032
+ "path": "<define:process.env>",
6033
+ "kind": "import-statement",
6034
+ "external": true
6035
+ },
6036
+ {
6037
+ "path": "<runtime>",
6038
+ "kind": "import-statement",
6039
+ "external": true
6040
+ }
6041
+ ],
6042
+ "format": "esm"
6043
+ },
6013
6044
  "src/Prebuilt/components/Footer/RoleAccordion.tsx": {
6014
- "bytes": 4692,
6045
+ "bytes": 5566,
6015
6046
  "imports": [
6016
6047
  {
6017
6048
  "path": "react",
@@ -6043,6 +6074,16 @@
6043
6074
  "kind": "import-statement",
6044
6075
  "original": "../../../Accordion"
6045
6076
  },
6077
+ {
6078
+ "path": "src/Button/index.tsx",
6079
+ "kind": "import-statement",
6080
+ "original": "../../../Button"
6081
+ },
6082
+ {
6083
+ "path": "src/Divider/index.ts",
6084
+ "kind": "import-statement",
6085
+ "original": "../../../Divider"
6086
+ },
6046
6087
  {
6047
6088
  "path": "src/Layout/index.tsx",
6048
6089
  "kind": "import-statement",
@@ -6063,6 +6104,11 @@
6063
6104
  "kind": "import-statement",
6064
6105
  "original": "./RoleOptions"
6065
6106
  },
6107
+ {
6108
+ "path": "src/Prebuilt/components/hooks/useGroupOnStageActions.tsx",
6109
+ "kind": "import-statement",
6110
+ "original": "../hooks/useGroupOnStageActions"
6111
+ },
6066
6112
  {
6067
6113
  "path": "src/Prebuilt/common/utils.js",
6068
6114
  "kind": "import-statement",
@@ -6076,8 +6122,39 @@
6076
6122
  ],
6077
6123
  "format": "esm"
6078
6124
  },
6125
+ "src/Prebuilt/components/hooks/usePeerOnStageActions.tsx": {
6126
+ "bytes": 1672,
6127
+ "imports": [
6128
+ {
6129
+ "path": "react",
6130
+ "kind": "import-statement",
6131
+ "external": true
6132
+ },
6133
+ {
6134
+ "path": "@100mslive/react-sdk",
6135
+ "kind": "import-statement",
6136
+ "external": true
6137
+ },
6138
+ {
6139
+ "path": "src/Prebuilt/provider/roomLayoutProvider/hooks/useRoomLayoutScreen.ts",
6140
+ "kind": "import-statement",
6141
+ "original": "../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen"
6142
+ },
6143
+ {
6144
+ "path": "<define:process.env>",
6145
+ "kind": "import-statement",
6146
+ "external": true
6147
+ },
6148
+ {
6149
+ "path": "<runtime>",
6150
+ "kind": "import-statement",
6151
+ "external": true
6152
+ }
6153
+ ],
6154
+ "format": "esm"
6155
+ },
6079
6156
  "src/Prebuilt/components/Footer/ParticipantList.tsx": {
6080
- "bytes": 12119,
6157
+ "bytes": 12623,
6081
6158
  "imports": [
6082
6159
  {
6083
6160
  "path": "react",
@@ -6104,6 +6181,11 @@
6104
6181
  "kind": "import-statement",
6105
6182
  "original": "../../.."
6106
6183
  },
6184
+ {
6185
+ "path": "src/IconButton/index.tsx",
6186
+ "kind": "import-statement",
6187
+ "original": "../../../IconButton"
6188
+ },
6107
6189
  {
6108
6190
  "path": "src/Prebuilt/IconButton.tsx",
6109
6191
  "kind": "import-statement",
@@ -6134,6 +6216,11 @@
6134
6216
  "kind": "import-statement",
6135
6217
  "original": "../AppData/useSidepane"
6136
6218
  },
6219
+ {
6220
+ "path": "src/Prebuilt/components/hooks/usePeerOnStageActions.tsx",
6221
+ "kind": "import-statement",
6222
+ "original": "../hooks/usePeerOnStageActions"
6223
+ },
6137
6224
  {
6138
6225
  "path": "src/Prebuilt/common/hooks.ts",
6139
6226
  "kind": "import-statement",
@@ -9321,7 +9408,7 @@
9321
9408
  "format": "esm"
9322
9409
  },
9323
9410
  "src/Prebuilt/layouts/SidePane.tsx": {
9324
- "bytes": 6649,
9411
+ "bytes": 6575,
9325
9412
  "imports": [
9326
9413
  {
9327
9414
  "path": "react",
@@ -10039,7 +10126,7 @@
10039
10126
  "format": "esm"
10040
10127
  },
10041
10128
  "src/Prebuilt/components/VideoLayouts/ProminenceLayout.tsx": {
10042
- "bytes": 2587,
10129
+ "bytes": 2519,
10043
10130
  "imports": [
10044
10131
  {
10045
10132
  "path": "react",
@@ -12200,7 +12287,7 @@
12200
12287
  "format": "esm"
12201
12288
  },
12202
12289
  "src/Prebuilt/components/MwebLandscapePrompt.tsx": {
12203
- "bytes": 3089,
12290
+ "bytes": 3095,
12204
12291
  "imports": [
12205
12292
  {
12206
12293
  "path": "react",
@@ -13627,7 +13714,7 @@
13627
13714
  "dist/index.js": {
13628
13715
  "imports": [
13629
13716
  {
13630
- "path": "dist/chunk-E7AEJ446.js",
13717
+ "path": "dist/chunk-OYWNLHYU.js",
13631
13718
  "kind": "import-statement"
13632
13719
  }
13633
13720
  ],
@@ -13700,16 +13787,16 @@
13700
13787
  "inputs": {},
13701
13788
  "bytes": 1822
13702
13789
  },
13703
- "dist/HLSView-C5XHK2VY.js.map": {
13790
+ "dist/HLSView-SF6SAQ5J.js.map": {
13704
13791
  "imports": [],
13705
13792
  "exports": [],
13706
13793
  "inputs": {},
13707
13794
  "bytes": 89757
13708
13795
  },
13709
- "dist/HLSView-C5XHK2VY.js": {
13796
+ "dist/HLSView-SF6SAQ5J.js": {
13710
13797
  "imports": [
13711
13798
  {
13712
- "path": "dist/chunk-E7AEJ446.js",
13799
+ "path": "dist/chunk-OYWNLHYU.js",
13713
13800
  "kind": "import-statement"
13714
13801
  },
13715
13802
  {
@@ -13927,13 +14014,13 @@
13927
14014
  },
13928
14015
  "bytes": 55042
13929
14016
  },
13930
- "dist/chunk-E7AEJ446.js.map": {
14017
+ "dist/chunk-OYWNLHYU.js.map": {
13931
14018
  "imports": [],
13932
14019
  "exports": [],
13933
14020
  "inputs": {},
13934
- "bytes": 3171400
14021
+ "bytes": 3179405
13935
14022
  },
13936
- "dist/chunk-E7AEJ446.js": {
14023
+ "dist/chunk-OYWNLHYU.js": {
13937
14024
  "imports": [
13938
14025
  {
13939
14026
  "path": "react",
@@ -15200,6 +15287,26 @@
15200
15287
  "kind": "import-statement",
15201
15288
  "external": true
15202
15289
  },
15290
+ {
15291
+ "path": "ts-pattern",
15292
+ "kind": "import-statement",
15293
+ "external": true
15294
+ },
15295
+ {
15296
+ "path": "@100mslive/react-sdk",
15297
+ "kind": "import-statement",
15298
+ "external": true
15299
+ },
15300
+ {
15301
+ "path": "react",
15302
+ "kind": "import-statement",
15303
+ "external": true
15304
+ },
15305
+ {
15306
+ "path": "@100mslive/react-sdk",
15307
+ "kind": "import-statement",
15308
+ "external": true
15309
+ },
15203
15310
  {
15204
15311
  "path": "react",
15205
15312
  "kind": "import-statement",
@@ -16301,7 +16408,7 @@
16301
16408
  "external": true
16302
16409
  },
16303
16410
  {
16304
- "path": "dist/HLSView-C5XHK2VY.js",
16411
+ "path": "dist/HLSView-SF6SAQ5J.js",
16305
16412
  "kind": "dynamic-import"
16306
16413
  },
16307
16414
  {
@@ -16776,7 +16883,7 @@
16776
16883
  ],
16777
16884
  "inputs": {
16778
16885
  "<define:process.env>": {
16779
- "bytesInOutput": 18234
16886
+ "bytesInOutput": 18284
16780
16887
  },
16781
16888
  "../../node_modules/lodash/lodash.js": {
16782
16889
  "bytesInOutput": 224291
@@ -17052,7 +17159,7 @@
17052
17159
  "bytesInOutput": 2709
17053
17160
  },
17054
17161
  "src/Prebuilt/provider/roomLayoutProvider/index.tsx": {
17055
- "bytesInOutput": 1118
17162
+ "bytesInOutput": 1121
17056
17163
  },
17057
17164
  "src/Prebuilt/provider/roomLayoutProvider/hooks/useFetchRoomLayout.ts": {
17058
17165
  "bytesInOutput": 2254
@@ -17214,7 +17321,7 @@
17214
17321
  "bytesInOutput": 10031
17215
17322
  },
17216
17323
  "../hms-video-store/dist/index.js": {
17217
- "bytesInOutput": 48564
17324
+ "bytesInOutput": 48592
17218
17325
  },
17219
17326
  "../../node_modules/reselect/es/index.js": {
17220
17327
  "bytesInOutput": 2539
@@ -17316,7 +17423,7 @@
17316
17423
  "bytesInOutput": 1404
17317
17424
  },
17318
17425
  "src/Prebuilt/components/Footer/ParticipantList.tsx": {
17319
- "bytesInOutput": 11538
17426
+ "bytesInOutput": 11800
17320
17427
  },
17321
17428
  "src/Prebuilt/components/Connection/ConnectionIndicator.tsx": {
17322
17429
  "bytesInOutput": 3749
@@ -17328,11 +17435,17 @@
17328
17435
  "bytesInOutput": 1290
17329
17436
  },
17330
17437
  "src/Prebuilt/components/Footer/RoleAccordion.tsx": {
17331
- "bytesInOutput": 4229
17438
+ "bytesInOutput": 4964
17332
17439
  },
17333
17440
  "src/Prebuilt/components/Footer/RoleOptions.tsx": {
17334
17441
  "bytesInOutput": 7326
17335
17442
  },
17443
+ "src/Prebuilt/components/hooks/useGroupOnStageActions.tsx": {
17444
+ "bytesInOutput": 1801
17445
+ },
17446
+ "src/Prebuilt/components/hooks/usePeerOnStageActions.tsx": {
17447
+ "bytesInOutput": 1806
17448
+ },
17336
17449
  "src/Prebuilt/components/Footer/PollsToggle.tsx": {
17337
17450
  "bytesInOutput": 1073
17338
17451
  },
@@ -17349,7 +17462,7 @@
17349
17462
  "bytesInOutput": 9637
17350
17463
  },
17351
17464
  "src/Prebuilt/layouts/SidePane.tsx": {
17352
- "bytesInOutput": 6345
17465
+ "bytesInOutput": 6274
17353
17466
  },
17354
17467
  "src/Prebuilt/components/Polls/Polls.tsx": {
17355
17468
  "bytesInOutput": 735
@@ -17574,7 +17687,7 @@
17574
17687
  "bytesInOutput": 2494
17575
17688
  },
17576
17689
  "src/Prebuilt/components/VideoLayouts/ProminenceLayout.tsx": {
17577
- "bytesInOutput": 2431
17690
+ "bytesInOutput": 2339
17578
17691
  },
17579
17692
  "src/Prebuilt/components/hooks/useRoleProminencePeers.tsx": {
17580
17693
  "bytesInOutput": 1046
@@ -17646,7 +17759,7 @@
17646
17759
  "bytesInOutput": 491
17647
17760
  },
17648
17761
  "src/Prebuilt/components/MwebLandscapePrompt.tsx": {
17649
- "bytesInOutput": 2922
17762
+ "bytesInOutput": 2928
17650
17763
  },
17651
17764
  "src/Prebuilt/components/Notifications/index.tsx": {
17652
17765
  "bytesInOutput": 27
@@ -17730,7 +17843,7 @@
17730
17843
  "bytesInOutput": 651
17731
17844
  }
17732
17845
  },
17733
- "bytes": 1300139
17846
+ "bytes": 1304788
17734
17847
  }
17735
17848
  }
17736
17849
  }
package/package.json CHANGED
@@ -4,13 +4,14 @@
4
4
  "main": "dist/index.cjs.js",
5
5
  "module": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
7
+ "type": "module",
7
8
  "keywords": [
8
9
  "100mslive",
9
10
  "react",
10
11
  "prebuilt",
11
12
  "roomkit"
12
13
  ],
13
- "version": "0.3.2-alpha.0",
14
+ "version": "0.3.2-alpha.2",
14
15
  "author": "100ms",
15
16
  "license": "MIT",
16
17
  "repository": {
@@ -82,11 +83,11 @@
82
83
  "react": ">=17.0.2 <19.0.0"
83
84
  },
84
85
  "dependencies": {
85
- "@100mslive/hls-player": "0.3.2-alpha.0",
86
+ "@100mslive/hls-player": "0.3.2-alpha.2",
86
87
  "@100mslive/hms-noise-cancellation": "0.0.0-alpha.1",
87
- "@100mslive/hms-virtual-background": "1.13.2-alpha.0",
88
- "@100mslive/react-icons": "0.10.2-alpha.0",
89
- "@100mslive/react-sdk": "0.10.2-alpha.0",
88
+ "@100mslive/hms-virtual-background": "1.13.2-alpha.2",
89
+ "@100mslive/react-icons": "0.10.2-alpha.2",
90
+ "@100mslive/react-sdk": "0.10.2-alpha.2",
90
91
  "@100mslive/types-prebuilt": "0.12.7",
91
92
  "@emoji-mart/data": "^1.0.6",
92
93
  "@emoji-mart/react": "^1.0.1",
@@ -122,5 +123,5 @@
122
123
  "uuid": "^8.3.2",
123
124
  "worker-timers": "^7.0.40"
124
125
  },
125
- "gitHead": "bb718372bf21a6c1945c644902cc208c0fca4a32"
126
+ "gitHead": "8689984dfac962416e160878c8a5821c88cdc8dd"
126
127
  }
@@ -9,24 +9,30 @@ import {
9
9
  selectIsPeerAudioEnabled,
10
10
  selectLocalPeerID,
11
11
  selectPeerCount,
12
- selectPeerMetadata,
13
12
  selectPermissions,
14
- useHMSActions,
15
13
  useHMSStore,
16
14
  } from '@100mslive/react-sdk';
17
- import { ChangeRoleIcon, HandIcon, MicOffIcon, PeopleIcon, SearchIcon, VerticalMenuIcon } from '@100mslive/react-icons';
15
+ import {
16
+ AddIcon,
17
+ ChangeRoleIcon,
18
+ CrossIcon,
19
+ HandIcon,
20
+ MicOffIcon,
21
+ PeopleIcon,
22
+ SearchIcon,
23
+ VerticalMenuIcon,
24
+ } from '@100mslive/react-icons';
18
25
  import { Accordion, Box, config as cssConfig, Dropdown, Flex, Input, Text, textEllipsis } from '../../..';
26
+ import { IconButton as BaseIconButton } from '../../../IconButton';
19
27
  // @ts-ignore: No implicit Any
20
28
  import IconButton from '../../IconButton';
21
29
  import { ConnectionIndicator } from '../Connection/ConnectionIndicator';
22
30
  import { RemoveParticipant } from '../RemoveParticipant';
23
31
  import { RoleAccordion } from './RoleAccordion';
24
- import {
25
- ConferencingScreenElements,
26
- useRoomLayoutConferencingScreen,
27
- } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
32
+ import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
28
33
  // @ts-ignore: No implicit Any
29
34
  import { useIsSidepaneTypeOpen, useSidepaneToggle } from '../AppData/useSidepane';
35
+ import { usePeerOnStageActions } from '../hooks/usePeerOnStageActions';
30
36
  import { useParticipants } from '../../common/hooks';
31
37
  // @ts-ignore: No implicit Any
32
38
  import { getFormattedCount } from '../../common/utils';
@@ -146,10 +152,12 @@ export const ParticipantCount = () => {
146
152
  export const Participant = ({
147
153
  peer,
148
154
  isConnected,
155
+ isHandRaisedAccordion,
149
156
  style,
150
157
  }: {
151
158
  peer: HMSPeer;
152
159
  isConnected: boolean;
160
+ isHandRaisedAccordion?: boolean;
153
161
  style: React.CSSProperties;
154
162
  }) => {
155
163
  const localPeerId = useHMSStore(selectLocalPeerID);
@@ -175,7 +183,12 @@ export const Participant = ({
175
183
  {peer.name} {localPeerId === peer.id ? '(You)' : ''}
176
184
  </Text>
177
185
  {isConnected && peer.roleName ? (
178
- <ParticipantActions peerId={peer.id} isLocal={peer.id === localPeerId} role={peer.roleName} />
186
+ <ParticipantActions
187
+ peerId={peer.id}
188
+ isLocal={peer.id === localPeerId}
189
+ role={peer.roleName}
190
+ isHandRaisedAccordion={isHandRaisedAccordion}
191
+ />
179
192
  ) : null}
180
193
  </Flex>
181
194
  );
@@ -247,7 +260,17 @@ const VirtualizedParticipants = ({
247
260
  * shows settings to change for a participant like changing their role
248
261
  */
249
262
  const ParticipantActions = React.memo(
250
- ({ peerId, role, isLocal }: { peerId: string; role: string; isLocal: boolean }) => {
263
+ ({
264
+ peerId,
265
+ role,
266
+ isLocal,
267
+ isHandRaisedAccordion,
268
+ }: {
269
+ peerId: string;
270
+ role: string;
271
+ isLocal: boolean;
272
+ isHandRaisedAccordion?: boolean;
273
+ }) => {
251
274
  const isHandRaised = useHMSStore(selectHasPeerHandRaised(peerId));
252
275
  const canChangeRole = useHMSStore(selectPermissions)?.changeRole;
253
276
  const canRemoveOthers = useHMSStore(selectPermissions)?.removeOthers;
@@ -264,72 +287,73 @@ const ParticipantActions = React.memo(
264
287
  gap: '$8',
265
288
  }}
266
289
  >
267
- <ConnectionIndicator peerId={peerId} />
268
- {isHandRaised && (
269
- <Flex
270
- align="center"
271
- justify="center"
272
- css={{ p: '$1', c: '$on_surface_high', bg: '$surface_bright', borderRadius: '$round' }}
273
- >
274
- <HandIcon height={19} width={19} />
275
- </Flex>
276
- )}
277
- {isAudioMuted ? (
278
- <Flex
279
- align="center"
280
- justify="center"
281
- css={{ p: '$2', c: '$on_surface_high', bg: '$surface_bright', borderRadius: '$round' }}
282
- >
283
- <MicOffIcon height={19} width={19} />
284
- </Flex>
285
- ) : null}
290
+ {isHandRaisedAccordion ? (
291
+ <HandRaisedAccordionParticipantActions peerId={peerId} role={role} />
292
+ ) : (
293
+ <>
294
+ <ConnectionIndicator peerId={peerId} />
295
+ {isHandRaised && (
296
+ <Flex
297
+ align="center"
298
+ justify="center"
299
+ css={{ p: '$1', c: '$on_surface_high', bg: '$surface_bright', borderRadius: '$round' }}
300
+ >
301
+ <HandIcon height={19} width={19} />
302
+ </Flex>
303
+ )}
304
+ {isAudioMuted ? (
305
+ <Flex
306
+ align="center"
307
+ justify="center"
308
+ css={{ p: '$2', c: '$on_surface_high', bg: '$surface_bright', borderRadius: '$round' }}
309
+ >
310
+ <MicOffIcon height={19} width={19} />
311
+ </Flex>
312
+ ) : null}
286
313
 
287
- {shouldShowMoreActions && !isLocal ? (
288
- <ParticipantMoreActions peerId={peerId} role={role} elements={elements} canChangeRole={!!canChangeRole} />
289
- ) : null}
314
+ {shouldShowMoreActions && !isLocal ? <ParticipantMoreActions peerId={peerId} role={role} /> : null}
315
+ </>
316
+ )}
290
317
  </Flex>
291
318
  );
292
319
  },
293
320
  );
294
321
 
295
- const ParticipantMoreActions = ({
296
- peerId,
297
- role,
298
- elements,
299
- canChangeRole,
300
- }: {
301
- peerId: string;
302
- role: string;
303
- canChangeRole: boolean;
304
- elements: ConferencingScreenElements;
305
- }) => {
306
- const hmsActions = useHMSActions();
322
+ const HandRaisedAccordionParticipantActions = ({ peerId, role }: { peerId: string; role: string }) => {
323
+ const { handleStageAction, lowerPeerHand, shouldShowStageRoleChange, isInStage } = usePeerOnStageActions({
324
+ peerId,
325
+ role,
326
+ });
327
+ return (
328
+ <>
329
+ <BaseIconButton
330
+ css={{ p: '$1', c: '$on_surface_high', bg: '$surface_bright', borderRadius: '$round' }}
331
+ onClick={() => lowerPeerHand()}
332
+ >
333
+ <CrossIcon height={19} width={19} />
334
+ </BaseIconButton>
335
+ {shouldShowStageRoleChange && !isInStage && (
336
+ <BaseIconButton
337
+ css={{ p: '$1', c: '$on_surface_high', bg: '$primary_default', borderRadius: '$round' }}
338
+ onClick={() => handleStageAction()}
339
+ >
340
+ <AddIcon height={19} width={19} />
341
+ </BaseIconButton>
342
+ )}
343
+ </>
344
+ );
345
+ };
346
+
347
+ const ParticipantMoreActions = ({ peerId, role }: { peerId: string; role: string }) => {
307
348
  const {
349
+ open,
350
+ setOpen,
308
351
  bring_to_stage_label,
309
352
  remove_from_stage_label,
310
- on_stage_role,
311
- off_stage_roles = [],
312
- skip_preview_for_role_change = false,
313
- } = elements.on_stage_exp || {};
314
- const isInStage = role === on_stage_role;
315
- const shouldShowStageRoleChange =
316
- canChangeRole &&
317
- ((isInStage && remove_from_stage_label) || (off_stage_roles?.includes(role) && bring_to_stage_label));
318
- const prevRole = useHMSStore(selectPeerMetadata(peerId))?.prevRole;
319
- const [open, setOpen] = useState(false);
320
-
321
- const handleStageAction = async () => {
322
- if (isInStage) {
323
- prevRole && hmsActions.changeRoleOfPeer(peerId, prevRole, true);
324
- } else if (on_stage_role) {
325
- await hmsActions.changeRoleOfPeer(peerId, on_stage_role, skip_preview_for_role_change);
326
- if (skip_preview_for_role_change) {
327
- await hmsActions.lowerRemotePeerHand(peerId);
328
- }
329
- }
330
- setOpen(false);
331
- };
332
-
353
+ handleStageAction,
354
+ isInStage,
355
+ shouldShowStageRoleChange,
356
+ } = usePeerOnStageActions({ peerId, role });
333
357
  return (
334
358
  <Dropdown.Root open={open} onOpenChange={value => setOpen(value)} modal={false}>
335
359
  <Dropdown.Trigger
@@ -4,10 +4,13 @@ import { FixedSizeList } from 'react-window';
4
4
  import { HMSPeer, selectIsLargeRoom, useHMSStore, usePaginatedParticipants } from '@100mslive/react-sdk';
5
5
  import { ChevronRightIcon } from '@100mslive/react-icons';
6
6
  import { Accordion } from '../../../Accordion';
7
+ import { Button } from '../../../Button';
8
+ import { HorizontalDivider } from '../../../Divider';
7
9
  import { Flex } from '../../../Layout';
8
10
  import { Text } from '../../../Text';
9
11
  import { Participant } from './ParticipantList';
10
12
  import { RoleOptions } from './RoleOptions';
13
+ import { useGroupOnStageActions } from '../hooks/useGroupOnStageActions';
11
14
  // @ts-ignore: No implicit Any
12
15
  import { getFormattedCount } from '../../common/utils';
13
16
 
@@ -16,6 +19,7 @@ const ITER_TIMER = 5000;
16
19
 
17
20
  export interface ItemData {
18
21
  peerList: HMSPeer[];
22
+ isHandRaisedAccordion?: boolean;
19
23
  isConnected: boolean;
20
24
  }
21
25
 
@@ -29,6 +33,7 @@ export const VirtualizedParticipantItem = React.memo(
29
33
  <Participant
30
34
  key={data.peerList[index].id}
31
35
  peer={data.peerList[index]}
36
+ isHandRaisedAccordion={data.isHandRaisedAccordion}
32
37
  isConnected={data.isConnected}
33
38
  style={style}
34
39
  />
@@ -63,6 +68,9 @@ export const RoleAccordion = ({
63
68
  peersInAccordion = peersInAccordion.filter(peer => peer.name.toLowerCase().includes(filter.search || ''));
64
69
  }
65
70
  }
71
+ const { bringAllToStage, bring_to_stage_label, canBringToStage, lowerAllHands } = useGroupOnStageActions({
72
+ peers: peersInAccordion,
73
+ });
66
74
 
67
75
  useEffect(() => {
68
76
  if (!isOffStageRole || !isLargeRoom) {
@@ -113,7 +121,7 @@ export const RoleAccordion = ({
113
121
  <Accordion.Content contentStyles={{ border: '1px solid $border_default', borderTop: 'none' }}>
114
122
  <FixedSizeList
115
123
  itemSize={ROW_HEIGHT}
116
- itemData={{ peerList: peersInAccordion, isConnected }}
124
+ itemData={{ peerList: peersInAccordion, isConnected, isHandRaisedAccordion }}
117
125
  itemKey={itemKey}
118
126
  itemCount={peersInAccordion.length}
119
127
  width={width}
@@ -140,6 +148,17 @@ export const RoleAccordion = ({
140
148
  <ChevronRightIcon />
141
149
  </Flex>
142
150
  ) : null}
151
+ {isHandRaisedAccordion && (
152
+ <>
153
+ <HorizontalDivider />
154
+ <Flex css={{ w: '100%', p: '$6', gap: '$4' }} justify="center">
155
+ <Button variant="standard" onClick={() => lowerAllHands()}>
156
+ Lower All Hands
157
+ </Button>
158
+ {canBringToStage && <Button onClick={() => bringAllToStage()}>{bring_to_stage_label}</Button>}
159
+ </Flex>
160
+ </>
161
+ )}
143
162
  </Accordion.Content>
144
163
  </Accordion.Item>
145
164
  );
@@ -32,7 +32,7 @@ export const MwebLandscapePrompt = () => {
32
32
  // Angle check needed to diff bw mobile and desktop
33
33
  setShowMwebLandscapePrompt(
34
34
  match({ angle, isLandscapeHLSStream, isLandscape, type })
35
- .with({ isLandscapeHLSStream }, () => false)
35
+ .with({ isLandscapeHLSStream: true }, () => false)
36
36
  .with({ angle: P.when(angle => angle && angle >= 90) }, ({ type }) => type.includes('landscape'))
37
37
  .otherwise(() => isLandscape),
38
38
  );
@@ -36,7 +36,6 @@ const SecondarySection = ({
36
36
  hasSidebar,
37
37
  }: React.PropsWithChildren<{ tiles: TrackWithPeerAndDimensions[]; edgeToEdge?: boolean; hasSidebar?: boolean }>) => {
38
38
  const tileLayoutProps = useVideoTileContext();
39
- console.log('secondary section', { tilesLength: tiles?.length });
40
39
  if (!tiles?.length) {
41
40
  return null;
42
41
  }