@100mslive/roomkit-react 0.2.3 → 0.2.4-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.
Files changed (84) hide show
  1. package/dist/{HLSView-2BP4GO3Q.js → HLSView-5I6UAYPZ.js} +6 -6
  2. package/dist/HLSView-5I6UAYPZ.js.map +7 -0
  3. package/dist/Prebuilt/common/constants.d.ts +1 -0
  4. package/dist/Prebuilt/components/Connection/TileConnection.d.ts +2 -3
  5. package/dist/Prebuilt/components/InsetTile.d.ts +3 -1
  6. package/dist/Prebuilt/components/LayoutModeSelector.d.ts +2 -0
  7. package/dist/Prebuilt/components/MoreSettings/ChangeNameContent.d.ts +10 -0
  8. package/dist/Prebuilt/components/MoreSettings/ChangeNameModal.d.ts +5 -0
  9. package/dist/Prebuilt/components/Polls/CreatePollQuiz/PollsQuizMenu.d.ts +2 -0
  10. package/dist/Prebuilt/components/Polls/CreateQuestions/SavedQuestion.d.ts +1 -2
  11. package/dist/Prebuilt/components/Polls/common/StatusIndicator.d.ts +4 -3
  12. package/dist/Prebuilt/components/Polls/common/constants.d.ts +5 -0
  13. package/dist/Prebuilt/components/ScreenshareDisplay.d.ts +2 -0
  14. package/dist/Prebuilt/components/ScreenshareTile.d.ts +7 -0
  15. package/dist/Prebuilt/components/SecondaryTiles.d.ts +1 -1
  16. package/dist/Prebuilt/components/Settings/LayoutSettings.d.ts +11 -0
  17. package/dist/Prebuilt/components/Settings/NotificationSettings.d.ts +2 -0
  18. package/dist/Prebuilt/components/Settings/SwitchWithLabel.d.ts +10 -0
  19. package/dist/Prebuilt/components/Settings/common.d.ts +878 -0
  20. package/dist/Prebuilt/components/TileMenu/TileMenu.d.ts +14 -0
  21. package/dist/Prebuilt/components/TileMenu/TileMenuContent.d.ts +7 -7
  22. package/dist/Prebuilt/components/VideoLayouts/ProminenceLayout.d.ts +4 -2
  23. package/dist/Prebuilt/components/VideoLayouts/interface.d.ts +1 -0
  24. package/dist/Prebuilt/components/VideoTile.d.ts +19 -0
  25. package/dist/Prebuilt/components/hooks/useDropdownList.d.ts +4 -0
  26. package/dist/{chunk-G25T3EBJ.js → chunk-OGCNZHHH.js} +1328 -1097
  27. package/dist/chunk-OGCNZHHH.js.map +7 -0
  28. package/dist/index.cjs.js +1826 -1575
  29. package/dist/index.cjs.js.map +4 -4
  30. package/dist/index.js +1 -1
  31. package/dist/meta.cjs.json +458 -293
  32. package/dist/meta.esbuild.json +470 -305
  33. package/package.json +6 -6
  34. package/src/Pagination/StyledPagination.tsx +1 -0
  35. package/src/Popover/index.tsx +8 -1
  36. package/src/Prebuilt/common/constants.ts +1 -0
  37. package/src/Prebuilt/components/AppData/AppData.tsx +2 -0
  38. package/src/Prebuilt/components/AppData/useUISettings.js +1 -1
  39. package/src/Prebuilt/components/Connection/TileConnection.tsx +13 -6
  40. package/src/Prebuilt/components/HlsStatsOverlay.jsx +2 -2
  41. package/src/Prebuilt/components/InsetTile.tsx +13 -6
  42. package/src/Prebuilt/components/LayoutModeSelector.tsx +106 -0
  43. package/src/Prebuilt/components/MoreSettings/{ChangeNameContent.jsx → ChangeNameContent.tsx} +10 -2
  44. package/src/Prebuilt/components/MoreSettings/{ChangeNameModal.jsx → ChangeNameModal.tsx} +14 -5
  45. package/src/Prebuilt/components/MoreSettings/SplitComponents/DesktopOptions.tsx +2 -2
  46. package/src/Prebuilt/components/MoreSettings/SplitComponents/MwebOptions.tsx +2 -2
  47. package/src/Prebuilt/components/Notifications/Notifications.tsx +0 -1
  48. package/src/Prebuilt/components/Playlist/VideoPlayer.jsx +1 -1
  49. package/src/Prebuilt/components/Polls/CreatePollQuiz/{PollsQuizMenu.jsx → PollsQuizMenu.tsx} +54 -26
  50. package/src/Prebuilt/components/Polls/CreateQuestions/CreateQuestions.jsx +21 -31
  51. package/src/Prebuilt/components/Polls/CreateQuestions/SavedQuestion.tsx +3 -17
  52. package/src/Prebuilt/components/Polls/Voting/LeaderboardSummary.tsx +1 -1
  53. package/src/Prebuilt/components/Polls/Voting/QuestionCard.jsx +1 -10
  54. package/src/Prebuilt/components/Polls/Voting/Voting.tsx +1 -3
  55. package/src/Prebuilt/components/Polls/common/StatusIndicator.tsx +12 -3
  56. package/src/Prebuilt/components/Polls/common/constants.ts +5 -0
  57. package/src/Prebuilt/components/Preview/PreviewForm.tsx +2 -2
  58. package/src/Prebuilt/components/PreviousRoleInMetadata.tsx +1 -1
  59. package/src/Prebuilt/components/{ScreenshareTile.jsx → ScreenshareTile.tsx} +39 -6
  60. package/src/Prebuilt/components/SecondaryTiles.tsx +36 -4
  61. package/src/Prebuilt/components/Settings/DeviceSettings.jsx +1 -1
  62. package/src/Prebuilt/components/Settings/{LayoutSettings.jsx → LayoutSettings.tsx} +58 -14
  63. package/src/Prebuilt/components/Settings/{NotificationSettings.jsx → NotificationSettings.tsx} +14 -3
  64. package/src/Prebuilt/components/Settings/SettingsModal.jsx +32 -6
  65. package/src/Prebuilt/components/Settings/{SwitchWithLabel.jsx → SwitchWithLabel.tsx} +15 -1
  66. package/src/Prebuilt/components/Settings/common.ts +16 -0
  67. package/src/Prebuilt/components/TileMenu/{TileMenu.jsx → TileMenu.tsx} +12 -4
  68. package/src/Prebuilt/components/TileMenu/TileMenuContent.tsx +12 -10
  69. package/src/Prebuilt/components/VideoLayouts/ProminenceLayout.tsx +29 -14
  70. package/src/Prebuilt/components/VideoLayouts/RoleProminence.tsx +12 -2
  71. package/src/Prebuilt/components/VideoLayouts/ScreenshareLayout.tsx +20 -5
  72. package/src/Prebuilt/components/VideoLayouts/interface.ts +1 -0
  73. package/src/Prebuilt/components/{VideoTile.jsx → VideoTile.tsx} +57 -44
  74. package/src/Prebuilt/components/VirtualBackground/VBPicker.tsx +2 -2
  75. package/src/Prebuilt/components/hooks/{useDropdownList.jsx → useDropdownList.ts} +2 -1
  76. package/src/Prebuilt/components/pdfAnnotator/shareScreenOptions.jsx +1 -1
  77. package/src/Prebuilt/layouts/HLSView.jsx +2 -2
  78. package/src/Prebuilt/layouts/SidePane.tsx +8 -4
  79. package/src/Prebuilt/layouts/VideoStreamingSection.tsx +1 -1
  80. package/src/VideoTile/StyledVideoTile.tsx +4 -4
  81. package/dist/HLSView-2BP4GO3Q.js.map +0 -7
  82. package/dist/chunk-G25T3EBJ.js.map +0 -7
  83. package/src/Prebuilt/components/Settings/common.js +0 -41
  84. /package/src/Prebuilt/components/{ScreenshareDisplay.jsx → ScreenshareDisplay.tsx} +0 -0
@@ -1,6 +1,7 @@
1
1
  import React, { useState } from 'react';
2
2
  import { useMedia } from 'react-use';
3
3
  import {
4
+ HMSVideoTrack,
4
5
  selectLocalPeerID,
5
6
  selectPeerByID,
6
7
  selectPermissions,
@@ -30,20 +31,27 @@ const TileMenu = ({
30
31
  isScreenshare = false,
31
32
  canMinimise,
32
33
  enableSpotlightingPeer = true,
34
+ }: {
35
+ audioTrackID: string;
36
+ videoTrackID: string;
37
+ peerID: string;
38
+ isScreenshare?: boolean;
39
+ canMinimise?: boolean;
40
+ enableSpotlightingPeer?: boolean;
33
41
  }) => {
34
42
  const [open, setOpen] = useState(false);
35
43
  const { theme } = useTheme();
36
44
 
37
45
  const localPeerID = useHMSStore(selectLocalPeerID);
38
46
  const isLocal = localPeerID === peerID;
39
- const { removeOthers } = useHMSStore(selectPermissions);
47
+ const { removeOthers } = useHMSStore(selectPermissions) || {};
40
48
  const { setVolume, toggleAudio, toggleVideo } = useRemoteAVToggle(audioTrackID, videoTrackID);
41
49
  const showSpotlight = enableSpotlightingPeer;
42
50
 
43
51
  const isPrimaryVideoTrack = useHMSStore(selectVideoTrackByPeerID(peerID))?.id === videoTrackID;
44
- const showPinAction = audioTrackID || (videoTrackID && isPrimaryVideoTrack);
52
+ const showPinAction = !!(audioTrackID || (videoTrackID && isPrimaryVideoTrack));
45
53
 
46
- const track = useHMSStore(selectTrackByID(videoTrackID));
54
+ const track = useHMSStore(selectTrackByID(videoTrackID)) as HMSVideoTrack;
47
55
  const hideSimulcastLayers = !track?.layerDefinitions?.length || track.degraded || !track.enabled;
48
56
  const isMobile = useMedia(cssConfig.media.md);
49
57
  const peer = useHMSStore(selectPeerByID(peerID));
@@ -99,7 +107,7 @@ const TileMenu = ({
99
107
  >
100
108
  <Box>
101
109
  <Text css={{ color: '$on_surface_high', fontWeight: '$semiBold' }}>
102
- {peer.name}
110
+ {peer?.name}
103
111
  {isLocal ? ` (You)` : null}
104
112
  </Text>
105
113
  {peer?.roleName ? (
@@ -47,9 +47,9 @@ export const isSameTile = ({
47
47
  audioTrackID,
48
48
  }: {
49
49
  trackId: HMSTrackID;
50
- videoTrackID: string;
51
- audioTrackID: string;
52
- }) => trackId && ((videoTrackID && videoTrackID === trackId) || (audioTrackID && audioTrackID === trackId));
50
+ videoTrackID?: string;
51
+ audioTrackID?: string;
52
+ }) => !!trackId && ((!!videoTrackID && videoTrackID === trackId) || (!!audioTrackID && audioTrackID === trackId));
53
53
 
54
54
  const spacingCSS = { '@md': { my: '$8', fontWeight: '$semiBold', fontSize: 'sm' } };
55
55
 
@@ -232,9 +232,9 @@ export const TileMenuContent = ({
232
232
  showSpotlight: boolean;
233
233
  showPinAction: boolean;
234
234
  peerID: string;
235
- canMinimise: boolean;
236
- closeSheetOnClick: () => void;
237
- openNameChangeModal: () => void;
235
+ canMinimise?: boolean;
236
+ closeSheetOnClick?: () => void;
237
+ openNameChangeModal?: () => void;
238
238
  }) => {
239
239
  const actions = useHMSActions();
240
240
  const dragClassName = getDragClassName();
@@ -252,8 +252,8 @@ export const TileMenuContent = ({
252
252
 
253
253
  const isMobile = useMedia(cssConfig.media.md);
254
254
 
255
- return isLocal ? (
256
- (showPinAction || canMinimise || !userName || showSpotlight) && (
255
+ if (isLocal) {
256
+ return showPinAction || canMinimise || !userName || showSpotlight ? (
257
257
  <>
258
258
  {showPinAction && <PinActions audioTrackID={audioTrackID} videoTrackID={videoTrackID} />}
259
259
  {showSpotlight && <SpotlightActions peerId={peerID} onSpotLightClick={() => closeSheetOnClick()} />}
@@ -273,8 +273,10 @@ export const TileMenuContent = ({
273
273
  </StyledMenuTile.ItemButton>
274
274
  )}
275
275
  </>
276
- )
277
- ) : (
276
+ ) : null;
277
+ }
278
+
279
+ return (
278
280
  <>
279
281
  {toggleVideo ? (
280
282
  <StyledMenuTile.ItemButton
@@ -6,14 +6,20 @@ import { CSS } from '../../../Theme';
6
6
  import VideoTile from '../VideoTile';
7
7
  import { useVideoTileContext } from '../hooks/useVideoTileLayout';
8
8
 
9
- const Root = ({ children, edgeToEdge }: React.PropsWithChildren<{ edgeToEdge?: boolean }>) => (
10
- <Flex
11
- direction="column"
12
- css={{ h: '100%', flex: '1 1 0', minWidth: 0, gap: '$6', '@md': { gap: edgeToEdge ? 0 : '$6' } }}
13
- >
14
- {children}
15
- </Flex>
16
- );
9
+ const Root = ({
10
+ children,
11
+ edgeToEdge,
12
+ hasSidebar,
13
+ }: React.PropsWithChildren<{ edgeToEdge?: boolean; hasSidebar?: boolean }>) => {
14
+ return (
15
+ <Flex
16
+ direction={hasSidebar ? 'row' : 'column'}
17
+ css={{ h: '100%', flex: '1 1 0', minWidth: 0, gap: '$6', '@md': { gap: edgeToEdge ? 0 : '$6' } }}
18
+ >
19
+ {children}
20
+ </Flex>
21
+ );
22
+ };
17
23
 
18
24
  const ProminentSection = ({ children, css = {} }: React.PropsWithChildren<{ css?: CSS }>) => {
19
25
  return (
@@ -27,20 +33,29 @@ const SecondarySection = ({
27
33
  tiles,
28
34
  children,
29
35
  edgeToEdge,
30
- }: React.PropsWithChildren<{ tiles: TrackWithPeerAndDimensions[]; edgeToEdge?: boolean }>) => {
36
+ hasSidebar,
37
+ }: React.PropsWithChildren<{ tiles: TrackWithPeerAndDimensions[]; edgeToEdge?: boolean; hasSidebar?: boolean }>) => {
31
38
  const tileLayoutProps = useVideoTileContext();
32
39
  if (!tiles?.length) {
33
40
  return null;
34
41
  }
42
+ const gridStyles = hasSidebar
43
+ ? {
44
+ gridTemplateColumns: '1fr',
45
+ gridTemplateRows: `repeat(${tiles.length}, minmax(0, 135px))`,
46
+ }
47
+ : {
48
+ gridTemplateRows: React.Children.count(children) > 0 ? '136px auto' : '154px',
49
+ gridTemplateColumns: `repeat(${tiles.length}, minmax(0, 1fr))`,
50
+ };
35
51
  return (
36
52
  <Box
37
53
  css={{
38
54
  display: 'grid',
39
- gridTemplateRows: React.Children.count(children) > 0 ? '136px auto' : '154px',
40
- gridTemplateColumns: `repeat(${tiles.length}, minmax(0, 1fr))`,
41
- margin: '0 auto',
42
- gap: '$2 $4',
55
+ margin: 'auto',
56
+ gap: hasSidebar ? '$8' : '$2 $4',
43
57
  placeItems: 'center',
58
+ ...gridStyles,
44
59
  '@md': { gap: edgeToEdge ? 0 : '$4' },
45
60
  }}
46
61
  >
@@ -62,7 +77,7 @@ const SecondarySection = ({
62
77
  />
63
78
  );
64
79
  })}
65
- <Box css={{ gridColumn: `1/span ${tiles.length}` }}>{children}</Box>
80
+ {children && <Box css={{ gridColumn: hasSidebar ? 1 : `1/span ${tiles.length}` }}>{children}</Box>}
66
81
  </Box>
67
82
  );
68
83
  };
@@ -3,11 +3,15 @@ import { selectLocalPeer, useHMSStore } from '@100mslive/react-sdk';
3
3
  import { InsetTile } from '../InsetTile';
4
4
  import { Pagination } from '../Pagination';
5
5
  import { SecondaryTiles } from '../SecondaryTiles';
6
+ import { LayoutMode } from '../Settings/LayoutSettings';
6
7
  import { Grid } from './Grid';
7
8
  import { LayoutProps } from './interface';
8
9
  import { ProminenceLayout } from './ProminenceLayout';
10
+ // @ts-ignore: No implicit Any
11
+ import { useUISettings } from '../AppData/useUISettings';
9
12
  import { useRoleProminencePeers } from '../hooks/useRoleProminencePeers';
10
13
  import { usePagesWithTiles, useTileLayout } from '../hooks/useTileLayout';
14
+ import { UI_SETTINGS } from '../../common/constants';
11
15
 
12
16
  export function RoleProminence({
13
17
  isInsetEnabled = false,
@@ -19,6 +23,7 @@ export function RoleProminence({
19
23
  }: LayoutProps) {
20
24
  const { prominentPeers, secondaryPeers } = useRoleProminencePeers(prominentRoles, peers, isInsetEnabled);
21
25
  const localPeer = useHMSStore(selectLocalPeer);
26
+ const layoutMode = useUISettings(UI_SETTINGS.layoutMode);
22
27
  const maxTileCount = 4;
23
28
  const pageList = usePagesWithTiles({
24
29
  peers: prominentPeers,
@@ -38,7 +43,7 @@ export function RoleProminence({
38
43
  }, [pageSize, onPageSize]);
39
44
 
40
45
  return (
41
- <ProminenceLayout.Root>
46
+ <ProminenceLayout.Root hasSidebar={layoutMode === LayoutMode.SIDEBAR}>
42
47
  <ProminenceLayout.ProminentSection>
43
48
  <Grid ref={ref} tiles={pagesWithTiles[page]} />
44
49
  </ProminenceLayout.ProminentSection>
@@ -52,7 +57,12 @@ export function RoleProminence({
52
57
  numPages={pagesWithTiles.length}
53
58
  />
54
59
  )}
55
- <SecondaryTiles peers={secondaryPeers} isInsetEnabled={isInsetEnabled} edgeToEdge={edgeToEdge} />
60
+ <SecondaryTiles
61
+ peers={layoutMode === LayoutMode.SPOTLIGHT ? [] : secondaryPeers}
62
+ isInsetEnabled={isInsetEnabled}
63
+ edgeToEdge={edgeToEdge}
64
+ hasSidebar={layoutMode === LayoutMode.SIDEBAR}
65
+ />
56
66
  {isInsetEnabled && localPeer && !prominentPeers.includes(localPeer) && <InsetTile />}
57
67
  </ProminenceLayout.Root>
58
68
  );
@@ -2,30 +2,43 @@ import React, { useEffect, useMemo, useState } from 'react';
2
2
  import { useMedia } from 'react-use';
3
3
  import { selectPeersScreenSharing, useHMSStore } from '@100mslive/react-sdk';
4
4
  import { config as cssConfig } from '../../../Theme';
5
+ import { InsetTile } from '../InsetTile';
5
6
  import { Pagination } from '../Pagination';
6
7
  // @ts-ignore: No implicit Any
7
8
  import ScreenshareTile from '../ScreenshareTile';
8
9
  import { SecondaryTiles } from '../SecondaryTiles';
10
+ import { LayoutMode } from '../Settings/LayoutSettings';
9
11
  import { LayoutProps } from './interface';
10
12
  import { ProminenceLayout } from './ProminenceLayout';
11
13
  // @ts-ignore: No implicit Any
12
- import { useSetAppDataByKey } from '../AppData/useUISettings';
13
- import { APP_DATA } from '../../common/constants';
14
+ import { useSetAppDataByKey, useSetUiSettings } from '../AppData/useUISettings';
15
+ import { APP_DATA, UI_SETTINGS } from '../../common/constants';
14
16
 
15
17
  export const ScreenshareLayout = ({ peers, onPageChange, onPageSize, edgeToEdge }: LayoutProps) => {
16
18
  const peersSharing = useHMSStore(selectPeersScreenSharing);
17
19
  const [, setActiveScreenSharePeer] = useSetAppDataByKey(APP_DATA.activeScreensharePeerId);
18
20
  const [page, setPage] = useState(0);
21
+ const [layoutMode, setLayoutMode] = useSetUiSettings(UI_SETTINGS.layoutMode);
19
22
  const activeSharePeer = peersSharing[page];
20
23
  const isMobile = useMedia(cssConfig.media.md);
24
+ const hasSidebar = !isMobile && layoutMode === LayoutMode.SIDEBAR;
21
25
  const secondaryPeers = useMemo(() => {
22
- if (isMobile) {
26
+ if (layoutMode === LayoutMode.SPOTLIGHT) {
27
+ return [];
28
+ }
29
+ if (isMobile || layoutMode === LayoutMode.SIDEBAR) {
23
30
  return activeSharePeer
24
31
  ? [activeSharePeer, ...peers.filter(p => p.id !== activeSharePeer?.id)] //keep active sharing peer as first tile
25
32
  : peers;
26
33
  }
27
34
  return peers.filter(p => p.id !== activeSharePeer?.id);
28
- }, [activeSharePeer, peers, isMobile]);
35
+ }, [activeSharePeer, peers, isMobile, layoutMode]);
36
+
37
+ useEffect(() => {
38
+ if (layoutMode !== LayoutMode.SIDEBAR) {
39
+ setLayoutMode(LayoutMode.SIDEBAR);
40
+ }
41
+ }, []); // eslint-disable-line react-hooks/exhaustive-deps
29
42
  useEffect(() => {
30
43
  setActiveScreenSharePeer(isMobile ? '' : activeSharePeer?.id);
31
44
  return () => {
@@ -34,7 +47,7 @@ export const ScreenshareLayout = ({ peers, onPageChange, onPageSize, edgeToEdge
34
47
  }, [activeSharePeer?.id, isMobile, setActiveScreenSharePeer]);
35
48
 
36
49
  return (
37
- <ProminenceLayout.Root edgeToEdge={edgeToEdge}>
50
+ <ProminenceLayout.Root edgeToEdge={edgeToEdge} hasSidebar={hasSidebar}>
38
51
  <ProminenceLayout.ProminentSection>
39
52
  <ScreenshareTile peerId={peersSharing[page]?.id} />
40
53
  {!edgeToEdge && <Pagination page={page} onPageChange={setPage} numPages={peersSharing.length} />}
@@ -44,7 +57,9 @@ export const ScreenshareLayout = ({ peers, onPageChange, onPageSize, edgeToEdge
44
57
  onPageChange={onPageChange}
45
58
  onPageSize={onPageSize}
46
59
  edgeToEdge={edgeToEdge}
60
+ hasSidebar={hasSidebar}
47
61
  />
62
+ {layoutMode === LayoutMode.SPOTLIGHT && activeSharePeer && <InsetTile peerId={activeSharePeer?.id} />}
48
63
  </ProminenceLayout.Root>
49
64
  );
50
65
  };
@@ -4,6 +4,7 @@ export interface LayoutProps {
4
4
  isInsetEnabled?: boolean;
5
5
  edgeToEdge?: boolean;
6
6
  prominentRoles?: string[];
7
+ hasSidebar?: boolean;
7
8
  peers: HMSPeer[];
8
9
  onPageChange?: (page: number) => void;
9
10
  onPageSize?: (size: number) => void;
@@ -1,4 +1,4 @@
1
- import React, { Fragment, useCallback, useMemo, useState } from 'react';
1
+ import React, { useCallback, useMemo, useState } from 'react';
2
2
  import { useMeasure } from 'react-use';
3
3
  import {
4
4
  selectAudioTrackByPeerID,
@@ -7,7 +7,6 @@ import {
7
7
  selectLocalPeerID,
8
8
  selectPeerMetadata,
9
9
  selectPeerNameByID,
10
- selectSessionStore,
11
10
  selectVideoTrackByID,
12
11
  selectVideoTrackByPeerID,
13
12
  useHMSStore,
@@ -18,16 +17,41 @@ import TileMenu, { isSameTile } from './TileMenu/TileMenu';
18
17
  import { AudioLevel } from '../../AudioLevel';
19
18
  import { Avatar } from '../../Avatar';
20
19
  import { VideoTileStats } from '../../Stats';
20
+ import { CSS } from '../../Theme';
21
21
  import { Video } from '../../Video';
22
22
  import { StyledVideoTile } from '../../VideoTile';
23
+ // @ts-ignore: No implicit Any
23
24
  import { getVideoTileLabel } from './peerTileUtils';
25
+ // @ts-ignore: No implicit Any
24
26
  import { useSetAppDataByKey, useUISettings } from './AppData/useUISettings';
27
+ // @ts-ignore: No implicit Any
25
28
  import { calculateAvatarAndAttribBoxSize } from '../common/utils';
26
- import { APP_DATA, SESSION_STORE_KEY, UI_SETTINGS } from '../common/constants';
29
+ import { APP_DATA, UI_SETTINGS } from '../common/constants';
30
+
31
+ const PeerMetadata = ({ peerId, size }: { peerId: string; size?: 'medium' | 'small' }) => {
32
+ const metaData = useHMSStore(selectPeerMetadata(peerId));
33
+ const isBRB = metaData?.isBRBOn || false;
34
+ const isHandRaised = useHMSStore(selectHasPeerHandRaised(peerId));
35
+
36
+ return (
37
+ <>
38
+ {isHandRaised ? (
39
+ <StyledVideoTile.AttributeBox size={size} data-testid="raiseHand_icon_onTile">
40
+ <HandIcon width={24} height={24} />
41
+ </StyledVideoTile.AttributeBox>
42
+ ) : null}
43
+ {isBRB ? (
44
+ <StyledVideoTile.AttributeBox size={size} data-testid="brb_icon_onTile">
45
+ <BrbTileIcon width={22} height={22} />
46
+ </StyledVideoTile.AttributeBox>
47
+ ) : null}
48
+ </>
49
+ );
50
+ };
27
51
 
28
52
  const Tile = ({
29
- peerId,
30
- trackId,
53
+ peerId = '',
54
+ trackId = '',
31
55
  width,
32
56
  height,
33
57
  objectFit = 'cover',
@@ -40,6 +64,21 @@ const Tile = ({
40
64
  roundedVideoTile = true,
41
65
  hideAudioMuteOnTile = false,
42
66
  hideMetadataOnTile = false,
67
+ }: {
68
+ peerId?: string;
69
+ trackId?: string;
70
+ width?: string | number;
71
+ height?: string | number;
72
+ objectFit?: string;
73
+ canMinimise?: boolean;
74
+ isDragabble?: boolean;
75
+ rootCSS?: CSS;
76
+ containerCSS?: CSS;
77
+ enableSpotlightingPeer?: boolean;
78
+ hideParticipantNameOnTile?: boolean;
79
+ roundedVideoTile?: boolean;
80
+ hideAudioMuteOnTile?: boolean;
81
+ hideMetadataOnTile?: boolean;
43
82
  }) => {
44
83
  const trackSelector = trackId ? selectVideoTrackByID(trackId) : selectVideoTrackByPeerID(peerId);
45
84
  const track = useHMSStore(trackSelector);
@@ -60,17 +99,16 @@ const Tile = ({
60
99
  videoTrackID: track?.id,
61
100
  audioTrackID: audioTrack?.id,
62
101
  });
63
- const spotlighted = useHMSStore(selectSessionStore(SESSION_STORE_KEY.SPOTLIGHT)) === peerId;
64
102
  const label = getVideoTileLabel({
65
103
  peerName,
66
104
  track,
67
105
  isLocal,
68
106
  });
69
- const onHoverHandler = useCallback(event => {
107
+ const onHoverHandler = useCallback((event: React.MouseEvent) => {
70
108
  setIsMouseHovered(event.type === 'mouseenter');
71
109
  }, []);
72
110
 
73
- const [ref, { width: calculatedWidth, height: calculatedHeight }] = useMeasure();
111
+ const [ref, { width: calculatedWidth, height: calculatedHeight }] = useMeasure<HTMLDivElement>();
74
112
 
75
113
  const isTileBigEnoughToShowStats = calculatedHeight >= 180 && calculatedWidth >= 180;
76
114
 
@@ -124,17 +162,15 @@ const Tile = ({
124
162
  <Avatar name={peerName || ''} data-testid="participant_avatar_icon" size={avatarSize} />
125
163
  </StyledVideoTile.AvatarContainer>
126
164
  ) : null}
127
-
128
- {!hideAudioMuteOnTile ? (
129
- isAudioMuted ? (
130
- <StyledVideoTile.AudioIndicator data-testid="participant_audio_mute_icon" size={attribBoxSize}>
131
- <MicOffIcon />
132
- </StyledVideoTile.AudioIndicator>
133
- ) : (
134
- <StyledVideoTile.AudioIndicator size={attribBoxSize}>
135
- <AudioLevel trackId={audioTrack?.id} size={attribBoxSize} />
136
- </StyledVideoTile.AudioIndicator>
137
- )
165
+ {!hideAudioMuteOnTile && isAudioMuted ? (
166
+ <StyledVideoTile.AudioIndicator data-testid="participant_audio_mute_icon" size={attribBoxSize}>
167
+ <MicOffIcon />
168
+ </StyledVideoTile.AudioIndicator>
169
+ ) : null}
170
+ {!hideAudioMuteOnTile && !isAudioMuted ? (
171
+ <StyledVideoTile.AudioIndicator size={attribBoxSize}>
172
+ <AudioLevel trackId={audioTrack?.id} size={attribBoxSize} />
173
+ </StyledVideoTile.AudioIndicator>
138
174
  ) : null}
139
175
  {!hideMetadataOnTile && <PeerMetadata peerId={peerId} size={attribBoxSize} />}
140
176
  </>
@@ -142,8 +178,8 @@ const Tile = ({
142
178
  {isMouseHovered || (isDragabble && navigator.maxTouchPoints > 0) ? (
143
179
  <TileMenu
144
180
  peerID={peerId}
145
- audioTrackID={audioTrack?.id}
146
- videoTrackID={track?.id}
181
+ audioTrackID={audioTrack?.id || ''}
182
+ videoTrackID={track?.id || ''}
147
183
  canMinimise={canMinimise}
148
184
  enableSpotlightingPeer={enableSpotlightingPeer}
149
185
  />
@@ -152,11 +188,9 @@ const Tile = ({
152
188
  <TileConnection
153
189
  hideLabel={hideParticipantNameOnTile}
154
190
  name={label}
155
- isTile
156
191
  peerId={peerId}
157
192
  width={width}
158
193
  pinned={pinned}
159
- spotlighted={spotlighted}
160
194
  />
161
195
  </StyledVideoTile.Container>
162
196
  ) : null}
@@ -164,27 +198,6 @@ const Tile = ({
164
198
  );
165
199
  };
166
200
 
167
- const PeerMetadata = ({ peerId, size }) => {
168
- const metaData = useHMSStore(selectPeerMetadata(peerId));
169
- const isBRB = metaData?.isBRBOn || false;
170
- const isHandRaised = useHMSStore(selectHasPeerHandRaised(peerId));
171
-
172
- return (
173
- <Fragment>
174
- {isHandRaised ? (
175
- <StyledVideoTile.AttributeBox size={size} data-testid="raiseHand_icon_onTile">
176
- <HandIcon width={24} height={24} />
177
- </StyledVideoTile.AttributeBox>
178
- ) : null}
179
- {isBRB ? (
180
- <StyledVideoTile.AttributeBox size={size} data-testid="brb_icon_onTile">
181
- <BrbTileIcon width={22} height={22} />
182
- </StyledVideoTile.AttributeBox>
183
- ) : null}
184
- </Fragment>
185
- );
186
- };
187
-
188
201
  const VideoTile = React.memo(Tile);
189
202
 
190
203
  export default VideoTile;
@@ -13,7 +13,7 @@ import {
13
13
  useHMSActions,
14
14
  useHMSStore,
15
15
  } from '@100mslive/react-sdk';
16
- import { BlurPersonHighIcon, CloseIcon, CrossCircleIcon } from '@100mslive/react-icons';
16
+ import { BlurPersonHighIcon, CrossCircleIcon, CrossIcon } from '@100mslive/react-icons';
17
17
  import { Box, Flex, Slider, Video } from '../../../index';
18
18
  import { Text } from '../../../Text';
19
19
  import { VBCollection } from './VBCollection';
@@ -90,7 +90,7 @@ export const VBPicker = ({ backgroundMedia = [] }: { backgroundMedia: VirtualBac
90
90
  css={{ color: '$on_surface_high', '&:hover': { color: '$on_surface_medium' }, cursor: 'pointer' }}
91
91
  onClick={toggleVB}
92
92
  >
93
- <CloseIcon />
93
+ <CrossIcon />
94
94
  </Box>
95
95
  </Flex>
96
96
 
@@ -1,8 +1,9 @@
1
1
  import { useEffect } from 'react';
2
+ // @ts-ignore: No implicit Any
2
3
  import { useSetAppDataByKey } from '../AppData/useUISettings';
3
4
  import { APP_DATA } from '../../common/constants';
4
5
 
5
- export const useDropdownList = ({ name, open }) => {
6
+ export const useDropdownList = ({ name, open }: { name: string; open: boolean }) => {
6
7
  const [dropdownList = [], setDropdownList] = useSetAppDataByKey(APP_DATA.dropdownList);
7
8
 
8
9
  useEffect(() => {
@@ -92,7 +92,7 @@ export function ShareScreenOptions() {
92
92
  >
93
93
  <IconButton
94
94
  as="div"
95
- onClick={() => toggleScreenShare()}
95
+ onClick={toggleScreenShare}
96
96
  css={{
97
97
  p: '$6',
98
98
  display: 'flex',
@@ -13,7 +13,7 @@ import {
13
13
  useHMSStore,
14
14
  useHMSVanillaStore,
15
15
  } from '@100mslive/react-sdk';
16
- import { ColoredHandIcon, ExpandIcon, PlayIcon, RadioIcon, ShrinkIcon } from '@100mslive/react-icons';
16
+ import { ColoredHandIcon, ExpandIcon, GoLiveIcon, PlayIcon, ShrinkIcon } from '@100mslive/react-icons';
17
17
  import { HlsStatsOverlay } from '../components/HlsStatsOverlay';
18
18
  import { HMSVideoPlayer } from '../components/HMSVideo';
19
19
  import { FullScreenButton } from '../components/HMSVideo/FullscreenButton';
@@ -449,7 +449,7 @@ const HLSView = () => {
449
449
  ) : (
450
450
  <Flex align="center" justify="center" direction="column" css={{ size: '100%', px: '$10' }}>
451
451
  <Flex css={{ c: '$on_surface_high', r: '$round', bg: '$surface_default', p: '$2' }}>
452
- {streamEnded ? <ColoredHandIcon height={56} width={56} /> : <RadioIcon height={56} width={56} />}
452
+ {streamEnded ? <ColoredHandIcon height={56} width={56} /> : <GoLiveIcon height={56} width={56} />}
453
453
  </Flex>
454
454
  <Text variant="h5" css={{ c: '$on_surface_high', mt: '$10', mb: 0, textAlign: 'center' }}>
455
455
  {streamEnded ? 'Stream has ended' : 'Stream yet to start'}
@@ -2,6 +2,7 @@ import React, { useEffect } from 'react';
2
2
  import { useMedia } from 'react-use';
3
3
  import { selectAppData, selectVideoTrackByPeerID, useHMSStore } from '@100mslive/react-sdk';
4
4
  import { Polls } from '../components/Polls/Polls';
5
+ import { LayoutMode } from '../components/Settings/LayoutSettings';
5
6
  import { SidePaneTabs } from '../components/SidePaneTabs';
6
7
  import { TileCustomisationProps } from '../components/VideoLayouts/GridLayout';
7
8
  // @ts-ignore: No implicit Any
@@ -12,12 +13,14 @@ import { Box, Flex } from '../../Layout';
12
13
  import { config as cssConfig } from '../../Theme';
13
14
  // @ts-ignore: No implicit Any
14
15
  import { useSidepaneReset } from '../components/AppData/useSidepane';
16
+ // @ts-ignore: No implicit Any
17
+ import { useUISettings } from '../components/AppData/useUISettings';
15
18
  import {
16
19
  useRoomLayoutConferencingScreen,
17
20
  useRoomLayoutPreviewScreen,
18
21
  } from '../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
19
22
  import { translateAcross } from '../../utils';
20
- import { APP_DATA, SIDE_PANE_OPTIONS } from '../common/constants';
23
+ import { APP_DATA, SIDE_PANE_OPTIONS, UI_SETTINGS } from '../common/constants';
21
24
 
22
25
  const SidePane = ({
23
26
  tileProps,
@@ -32,6 +35,7 @@ const SidePane = ({
32
35
  const trackId = useHMSStore(selectVideoTrackByPeerID(activeScreensharePeerId))?.id;
33
36
  const { elements } = useRoomLayoutConferencingScreen();
34
37
  const { elements: preview_elements } = useRoomLayoutPreviewScreen();
38
+ const layoutMode = useUISettings(UI_SETTINGS.layoutMode);
35
39
 
36
40
  const backgroundMedia = preview_elements?.virtual_background?.background_media?.length
37
41
  ? preview_elements?.virtual_background?.background_media
@@ -55,10 +59,9 @@ const SidePane = ({
55
59
  };
56
60
  }, [resetSidePane]);
57
61
 
58
- if (!ViewComponent && !trackId) {
62
+ if (!ViewComponent && (!trackId || layoutMode !== LayoutMode.GALLERY)) {
59
63
  return null;
60
64
  }
61
-
62
65
  const tileLayout = {
63
66
  hideParticipantNameOnTile: tileProps?.hide_participant_name_on_tile,
64
67
  roundedVideoTile: tileProps?.rounded_video_tile,
@@ -82,7 +85,7 @@ const SidePane = ({
82
85
  '@md': { position: mwebStreamingChat ? 'absolute' : '', zIndex: 12 },
83
86
  }}
84
87
  >
85
- {trackId && (
88
+ {trackId && layoutMode === LayoutMode.GALLERY && (
86
89
  <VideoTile
87
90
  peerId={activeScreensharePeerId}
88
91
  trackId={trackId}
@@ -118,6 +121,7 @@ const SidePane = ({
118
121
  },
119
122
  '@md': {
120
123
  p: '$6 $8',
124
+ h: 'auto',
121
125
  pb: mwebStreamingChat ? '$20' : '$12',
122
126
  borderTopLeftRadius: sidepane === SIDE_PANE_OPTIONS.POLLS ? '$2' : '0',
123
127
  borderTopRightRadius: sidepane === SIDE_PANE_OPTIONS.POLLS ? '$2' : '0',
@@ -106,7 +106,7 @@ export const VideoStreamingSection = ({
106
106
  }}
107
107
  >
108
108
  {ViewComponent}
109
- <Box css={{ height: '100%', maxHeight: '100%', overflowY: 'clip' }}>
109
+ <Box css={{ height: '100%', maxHeight: '100%', overflowY: 'clip', '&:empty': { display: 'none' } }}>
110
110
  <SidePane
111
111
  screenType={screenType}
112
112
  // @ts-ignore
@@ -94,11 +94,11 @@ const AttributeBox = styled('div', {
94
94
  const AudioIndicator = styled(AttributeBox, { defaultVariants: { position: 'right' } });
95
95
 
96
96
  const FullScreenButton = styled('button', {
97
- width: '2.25rem',
98
- height: '2.25rem',
97
+ height: '$14',
98
+ p: '$2 $4',
99
99
  color: '$on_surface_high',
100
- borderRadius: '$round',
101
- backgroundColor: '$surface_default',
100
+ borderRadius: '$1',
101
+ border: 'none',
102
102
  display: 'flex',
103
103
  justifyContent: 'center',
104
104
  alignItems: 'center',