@100mslive/roomkit-react 0.3.23 → 0.3.24-alpha.1

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 (100) hide show
  1. package/dist/Accordion/Accordion.d.ts +134 -322
  2. package/dist/Accordion/index.d.ts +134 -322
  3. package/dist/Avatar/Avatar.d.ts +47 -141
  4. package/dist/Button/Button.d.ts +47 -141
  5. package/dist/Checkbox/Checkbox.d.ts +134 -322
  6. package/dist/Collapsible/Collapsible.d.ts +201 -483
  7. package/dist/Divider/Divider.d.ts +134 -322
  8. package/dist/Dropdown/Dropdown.d.ts +804 -1932
  9. package/dist/Fieldset/Fieldset.d.ts +47 -141
  10. package/dist/Footer/Footer.d.ts +536 -1288
  11. package/dist/IconButton/IconButton.d.ts +47 -141
  12. package/dist/Input/Input.d.ts +362 -926
  13. package/dist/Label/Label.d.ts +47 -141
  14. package/dist/Layout/Box.d.ts +47 -141
  15. package/dist/Layout/Flex.d.ts +47 -141
  16. package/dist/Link/Link.d.ts +47 -141
  17. package/dist/Modal/Dialog.d.ts +329 -987
  18. package/dist/Modal/DialogContent.d.ts +469 -1127
  19. package/dist/Pagination/StyledPagination.d.ts +268 -644
  20. package/dist/Popover/index.d.ts +201 -483
  21. package/dist/Prebuilt/IconButton.d.ts +134 -322
  22. package/dist/Prebuilt/components/Chat/ChatBody.d.ts +134 -322
  23. package/dist/Prebuilt/components/Leave/LeaveAtoms.d.ts +335 -805
  24. package/dist/Prebuilt/components/Notifications/DeviceChangeNotifications.d.ts +1 -0
  25. package/dist/Prebuilt/components/Notifications/ErrorNotifications.d.ts +1 -0
  26. package/dist/Prebuilt/components/Notifications/MessageNotifications.d.ts +1 -0
  27. package/dist/Prebuilt/components/Notifications/PollNotificationModal.d.ts +1 -0
  28. package/dist/Prebuilt/components/Notifications/RoleChangeNotification.d.ts +1 -0
  29. package/dist/Prebuilt/components/Settings/common.d.ts +134 -322
  30. package/dist/Progress/index.d.ts +134 -322
  31. package/dist/RadioGroup/RadioGroup.d.ts +201 -483
  32. package/dist/ReactSelect/ReactSelect.d.ts +670 -1610
  33. package/dist/Select/Select.d.ts +201 -483
  34. package/dist/Sheet/Sheet.d.ts +329 -987
  35. package/dist/Slider/Slider.d.ts +47 -141
  36. package/dist/Stats/StyledStats.d.ts +402 -966
  37. package/dist/Switch/Switch.d.ts +47 -141
  38. package/dist/Tabs/Tabs.d.ts +268 -644
  39. package/dist/Text/Text.d.ts +47 -141
  40. package/dist/TextArea/TextArea.d.ts +47 -141
  41. package/dist/Theme/base.config.d.ts +26 -78
  42. package/dist/Theme/stitches.config.d.ts +1046 -1493
  43. package/dist/TileMenu/StyledMenuTile.d.ts +469 -1127
  44. package/dist/Toast/Toast.d.ts +382 -946
  45. package/dist/Video/Video.d.ts +47 -141
  46. package/dist/VideoList/StyledVideoList.d.ts +201 -483
  47. package/dist/VideoTile/StyledVideoTile.d.ts +670 -1610
  48. package/dist/android-perm-1.png +0 -0
  49. package/dist/audio-level.png +0 -0
  50. package/dist/empty-chat.svg +12 -0
  51. package/dist/index.cjs.css +2 -2
  52. package/dist/index.cjs.css.map +1 -1
  53. package/dist/index.cjs.js +34062 -37242
  54. package/dist/index.cjs.js.map +4 -4
  55. package/dist/index.css +2 -2
  56. package/dist/index.css.map +1 -1
  57. package/dist/index.js +36387 -67
  58. package/dist/index.js.map +4 -4
  59. package/dist/ios-perm-0.png +0 -0
  60. package/dist/meta.cjs.json +1531 -1218
  61. package/dist/meta.esbuild.json +942 -794
  62. package/dist/pdf-share.png +0 -0
  63. package/dist/screen-share.png +0 -0
  64. package/dist/transaction_error.svg +12 -0
  65. package/package.json +8 -8
  66. package/src/Avatar/Avatar.tsx +1 -1
  67. package/src/Popover/Popover.stories.tsx +1 -1
  68. package/src/Prebuilt/components/Chat/Chat.tsx +1 -1
  69. package/src/Prebuilt/components/Chat/ChatFooter.tsx +1 -1
  70. package/src/Prebuilt/components/Footer/WhiteboardToggle.tsx +11 -4
  71. package/src/Prebuilt/components/HMSVideo/HMSVideo.jsx +3 -3
  72. package/src/Prebuilt/components/MoreSettings/SplitComponents/DesktopOptions.tsx +3 -0
  73. package/src/Prebuilt/components/MoreSettings/SplitComponents/MwebOptions.tsx +14 -1
  74. package/src/Prebuilt/components/Notifications/DeviceChangeNotifications.tsx +18 -0
  75. package/src/Prebuilt/components/Notifications/ErrorNotifications.tsx +56 -0
  76. package/src/Prebuilt/components/Notifications/MessageNotifications.tsx +24 -0
  77. package/src/Prebuilt/components/Notifications/Notifications.tsx +13 -171
  78. package/src/Prebuilt/components/Notifications/PeerNotifications.tsx +9 -2
  79. package/src/Prebuilt/components/Notifications/PollNotificationModal.tsx +71 -0
  80. package/src/Prebuilt/components/Notifications/ReconnectNotifications.tsx +1 -5
  81. package/src/Prebuilt/components/Notifications/RoleChangeNotification.tsx +24 -0
  82. package/src/Prebuilt/components/Notifications/TrackBulkUnmuteModal.tsx +7 -5
  83. package/src/Prebuilt/components/Notifications/TrackNotifications.tsx +23 -1
  84. package/src/Prebuilt/components/Notifications/TrackUnmuteModal.tsx +13 -5
  85. package/src/Prebuilt/components/Preview/PreviewJoin.tsx +3 -2
  86. package/src/Prebuilt/components/StatsForNerds.jsx +122 -9
  87. package/src/Prebuilt/components/VideoLayouts/GridLayout.tsx +0 -1
  88. package/src/Prebuilt/components/VideoLayouts/ProminenceLayout.tsx +2 -2
  89. package/src/Prebuilt/components/VirtualBackground/VBOption.tsx +3 -1
  90. package/src/Prebuilt/components/VirtualBackground/VBPicker.tsx +6 -0
  91. package/src/Prebuilt/layouts/HLSView.jsx +3 -3
  92. package/src/Prebuilt/layouts/PDFView.jsx +1 -0
  93. package/src/Prebuilt/layouts/VideoStreamingSection.tsx +82 -86
  94. package/src/Prebuilt/layouts/WaitingView.tsx +2 -2
  95. package/dist/HLSView-HYI6LLL6.js +0 -1652
  96. package/dist/HLSView-HYI6LLL6.js.map +0 -7
  97. package/dist/HLSView-S4NJF7Q2.css +0 -2780
  98. package/dist/HLSView-S4NJF7Q2.css.map +0 -7
  99. package/dist/chunk-LRJSQMZ4.js +0 -34759
  100. package/dist/chunk-LRJSQMZ4.js.map +0 -7
@@ -5,11 +5,7 @@ import { ToastConfig } from '../Toast/ToastConfig';
5
5
  // @ts-ignore: No implicit Any
6
6
  import { ToastManager } from '../Toast/ToastManager';
7
7
 
8
- const notificationTypes = [
9
- HMSNotificationTypes.RECONNECTED,
10
- HMSNotificationTypes.RECONNECTING,
11
- HMSNotificationTypes.ERROR,
12
- ];
8
+ const notificationTypes = [HMSNotificationTypes.RECONNECTED, HMSNotificationTypes.RECONNECTING];
13
9
  let notificationId: string | null = null;
14
10
 
15
11
  export const ReconnectNotifications = () => {
@@ -0,0 +1,24 @@
1
+ import { useEffect } from 'react';
2
+ import { HMSNotificationTypes, useHMSNotifications } from '@100mslive/react-sdk';
3
+ import { useUpdateRoomLayout } from '../../provider/roomLayoutProvider';
4
+ // @ts-ignore: No implicit Any
5
+ import { ToastManager } from '../Toast/ToastManager';
6
+
7
+ export const RoleChangeNotification = () => {
8
+ const notification = useHMSNotifications(HMSNotificationTypes.ROLE_UPDATED);
9
+ const updateRoomLayoutForRole = useUpdateRoomLayout();
10
+
11
+ useEffect(() => {
12
+ if (!notification?.data) {
13
+ return;
14
+ }
15
+ if (notification.data?.isLocal && notification.data?.roleName) {
16
+ ToastManager.addToast({
17
+ title: `You are now a ${notification.data.roleName}`,
18
+ });
19
+ updateRoomLayoutForRole?.(notification.data.roleName);
20
+ }
21
+ }, [notification]);
22
+
23
+ return null;
24
+ };
@@ -9,14 +9,16 @@ import { MicOnIcon } from '@100mslive/react-icons';
9
9
  // @ts-ignore: No implicit Any
10
10
  import { RequestDialog } from '../../primitives/DialogContent';
11
11
 
12
+ const notificationTypes = [
13
+ HMSNotificationTypes.CHANGE_MULTI_TRACK_STATE_REQUEST,
14
+ HMSNotificationTypes.ROOM_ENDED,
15
+ HMSNotificationTypes.REMOVED_FROM_ROOM,
16
+ ];
17
+
12
18
  export const TrackBulkUnmuteModal = () => {
13
19
  const hmsActions = useHMSActions();
14
20
  const [muteNotification, setMuteNotification] = useState<HMSChangeMultiTrackStateRequest | null>(null);
15
- const notification = useHMSNotifications([
16
- HMSNotificationTypes.CHANGE_MULTI_TRACK_STATE_REQUEST,
17
- HMSNotificationTypes.ROOM_ENDED,
18
- HMSNotificationTypes.REMOVED_FROM_ROOM,
19
- ]);
21
+ const notification = useHMSNotifications(notificationTypes);
20
22
 
21
23
  useEffect(() => {
22
24
  switch (notification?.type) {
@@ -1,17 +1,39 @@
1
1
  import { useEffect } from 'react';
2
2
  import { HMSNotificationTypes, useHMSNotifications } from '@100mslive/react-sdk';
3
+ // @ts-ignore: No implicit Any
4
+ import { ToastManager } from '../Toast/ToastManager';
3
5
 
4
6
  const notificationTypes = [
5
7
  HMSNotificationTypes.TRACK_ADDED,
6
8
  HMSNotificationTypes.TRACK_REMOVED,
7
9
  HMSNotificationTypes.TRACK_MUTED,
8
10
  HMSNotificationTypes.TRACK_UNMUTED,
11
+ HMSNotificationTypes.CHANGE_TRACK_STATE_REQUEST,
9
12
  ];
13
+
10
14
  export const TrackNotifications = () => {
11
15
  const notification = useHMSNotifications(notificationTypes);
12
16
  useEffect(() => {
13
17
  if (notification) {
14
- console.debug(`[${notification.type}]`, notification);
18
+ switch (notification.type) {
19
+ case HMSNotificationTypes.TRACK_ADDED:
20
+ case HMSNotificationTypes.TRACK_REMOVED:
21
+ case HMSNotificationTypes.TRACK_MUTED:
22
+ case HMSNotificationTypes.TRACK_UNMUTED:
23
+ console.debug(`[${notification.type}]`, notification);
24
+ break;
25
+ case HMSNotificationTypes.CHANGE_TRACK_STATE_REQUEST:
26
+ {
27
+ const track = notification.data?.track;
28
+ if (!notification.data.enabled) {
29
+ ToastManager.addToast({
30
+ title: `Your ${track.source} ${track.type} was muted by
31
+ ${notification.data.requestedBy?.name}.`,
32
+ });
33
+ }
34
+ }
35
+ break;
36
+ }
15
37
  }
16
38
  }, [notification]);
17
39
 
@@ -8,20 +8,28 @@ import {
8
8
  import { MicOnIcon } from '@100mslive/react-icons';
9
9
  // @ts-ignore: No implicit Any
10
10
  import { RequestDialog } from '../../primitives/DialogContent';
11
+ // @ts-ignore: No implicit Any
12
+ import { ToastManager } from '../Toast/ToastManager';
13
+
14
+ const notificationTypes = [
15
+ HMSNotificationTypes.CHANGE_TRACK_STATE_REQUEST,
16
+ HMSNotificationTypes.ROOM_ENDED,
17
+ HMSNotificationTypes.REMOVED_FROM_ROOM,
18
+ ];
11
19
 
12
20
  export const TrackUnmuteModal = () => {
13
21
  const hmsActions = useHMSActions();
14
- const notification = useHMSNotifications([
15
- HMSNotificationTypes.CHANGE_TRACK_STATE_REQUEST,
16
- HMSNotificationTypes.ROOM_ENDED,
17
- HMSNotificationTypes.REMOVED_FROM_ROOM,
18
- ]);
22
+ const notification = useHMSNotifications(notificationTypes);
19
23
  const [muteNotification, setMuteNotification] = useState<HMSChangeTrackStateRequest | null>(null);
20
24
 
21
25
  useEffect(() => {
22
26
  switch (notification?.type) {
23
27
  case HMSNotificationTypes.REMOVED_FROM_ROOM:
24
28
  case HMSNotificationTypes.ROOM_ENDED:
29
+ ToastManager.addToast({
30
+ title: `${notification.message}.
31
+ ${notification.data.reason && `Reason: ${notification.data.reason}`}`,
32
+ });
25
33
  setMuteNotification(null);
26
34
  break;
27
35
  case HMSNotificationTypes.CHANGE_TRACK_STATE_REQUEST:
@@ -61,7 +61,7 @@ const useLocalTileAspectRatio = () => {
61
61
  } else {
62
62
  aspectRatio = isMobile ? 9 / 16 : 16 / 9;
63
63
  }
64
- return aspectRatio;
64
+ return aspectRatio.toString();
65
65
  };
66
66
 
67
67
  const PreviewJoin = ({
@@ -113,6 +113,7 @@ const PreviewJoin = ({
113
113
  const { elements = {} } = useRoomLayoutPreviewScreen();
114
114
  const { preview_header: previewHeader = {}, virtual_background } = elements || {};
115
115
  const aspectRatio = useLocalTileAspectRatio();
116
+
116
117
  useEffect(() => {
117
118
  if (authToken) {
118
119
  if (skipPreview) {
@@ -158,7 +159,7 @@ const PreviewJoin = ({
158
159
  </Flex>
159
160
  </Flex>
160
161
  {toggleVideo ? <PreviewTile name={name} error={previewError} /> : null}
161
- <Box css={{ w: '100%', maxWidth: `${Math.max(aspectRatio, 1) * 340}px` }}>
162
+ <Box css={{ w: '100%', maxWidth: `${Math.max(parseFloat(aspectRatio), 1) * 340}px` }}>
162
163
  <PreviewControls hideSettings={!toggleVideo && !toggleAudio} vbEnabled={!!virtual_background} />
163
164
  <PreviewForm
164
165
  name={name}
@@ -1,35 +1,45 @@
1
1
  import React, { useEffect, useMemo, useRef, useState } from 'react';
2
+ import { useMedia } from 'react-use';
2
3
  import { match, P } from 'ts-pattern';
3
4
  import {
4
5
  selectHMSStats,
5
6
  selectLocalPeerID,
6
7
  selectPeersMap,
7
8
  selectTracksMap,
9
+ useHMSActions,
8
10
  useHMSStatsStore,
9
11
  useHMSStore,
10
12
  } from '@100mslive/react-sdk';
13
+ import { Accordion } from '../../Accordion';
11
14
  import { HorizontalDivider } from '../../Divider';
12
15
  import { Dropdown } from '../../Dropdown';
13
16
  import { Label } from '../../Label';
14
17
  import { Box, Flex } from '../../Layout';
15
18
  import { Dialog } from '../../Modal';
19
+ import { Sheet } from '../../Sheet';
16
20
  import { formatBytes } from '../../Stats';
17
21
  import { Switch } from '../../Switch';
18
22
  import { Text } from '../../Text';
23
+ import { config as cssConfig } from '../../Theme';
19
24
  import { DialogDropdownTrigger } from '../primitives/DropdownTrigger';
20
25
  import { useSetUiSettings } from './AppData/useUISettings';
21
26
  import { useDropdownSelection } from './hooks/useDropdownSelection';
22
27
  import { UI_SETTINGS } from '../common/constants';
23
28
 
24
- export const StatsForNerds = ({ onOpenChange }) => {
29
+ export const StatsForNerds = ({ open, onOpenChange }) => {
30
+ const mediaQueryLg = cssConfig.media.md;
31
+ const isMobile = useMedia(mediaQueryLg);
32
+
25
33
  const tracksWithLabels = useTracksWithLabel();
26
34
  const statsOptions = useMemo(
27
35
  () => [{ id: 'local-peer', label: 'Local Peer Stats' }, ...tracksWithLabels],
28
36
  [tracksWithLabels],
29
37
  );
38
+ const hmsActions = useHMSActions();
39
+ const details = hmsActions.getDebugInfo();
30
40
  const [selectedStat, setSelectedStat] = useState(statsOptions[0]);
31
41
  const [showStatsOnTiles, setShowStatsOnTiles] = useSetUiSettings(UI_SETTINGS.showStatsOnTiles);
32
- const [open, setOpen] = useState(false);
42
+ const [openDropdown, setOpenDropdown] = useState(false);
33
43
  const ref = useRef();
34
44
  const selectionBg = useDropdownSelection();
35
45
 
@@ -39,14 +49,92 @@ export const StatsForNerds = ({ onOpenChange }) => {
39
49
  }
40
50
  }, [tracksWithLabels, selectedStat]);
41
51
 
42
- return (
43
- <Dialog.Root defaultOpen onOpenChange={onOpenChange}>
52
+ return isMobile ? (
53
+ <Sheet.Root open={open} onOpenChange={onOpenChange}>
54
+ <Sheet.Content
55
+ css={{
56
+ bg: '$surface_dim',
57
+ overflowY: 'auto',
58
+ px: '$4',
59
+ }}
60
+ >
61
+ <Sheet.Title css={{ py: '$10', px: '$8', alignItems: 'center' }}>
62
+ <Flex justify="between">
63
+ <Flex align="center" css={{ mb: '$1' }}>
64
+ <Text variant="h6" inline>
65
+ Stats For Nerds
66
+ </Text>
67
+ </Flex>
68
+ <Dialog.DefaultClose data-testid="stats_dialog_close_icon" />
69
+ </Flex>
70
+ </Sheet.Title>
71
+ <HorizontalDivider />
72
+ <Flex justify="start" gap={4} css={{ m: '$10 0' }}>
73
+ <Switch checked={showStatsOnTiles} onCheckedChange={setShowStatsOnTiles} />
74
+ <Text variant="body2" css={{ fontWeight: '$semiBold' }}>
75
+ Show Stats on Tiles
76
+ </Text>
77
+ </Flex>
78
+ {/* Select */}
79
+ <Flex
80
+ direction="column"
81
+ css={{
82
+ mb: '$12',
83
+ position: 'relative',
84
+ minWidth: 0,
85
+ }}
86
+ >
87
+ <Label variant="body2" css={{ c: '$on_surface_high' }}>
88
+ Stats For
89
+ </Label>
90
+ <Dropdown.Root data-testid="dialog_select_Stats For" open={openDropdown} onOpenChange={setOpenDropdown}>
91
+ <DialogDropdownTrigger
92
+ title={selectedStat.label || 'Select Stats'}
93
+ css={{ mt: '$4' }}
94
+ titleCSS={{ mx: 0 }}
95
+ open={openDropdown}
96
+ ref={ref}
97
+ />
98
+ <Dropdown.Portal>
99
+ <Dropdown.Content align="start" sideOffset={8} css={{ w: ref.current?.clientWidth, zIndex: 1000 }}>
100
+ {statsOptions.map(option => {
101
+ const isSelected = option.id === selectedStat.id && option.layer === selectedStat.layer;
102
+ return (
103
+ <Dropdown.Item
104
+ key={`${option.id}-${option.layer || ''}`}
105
+ onClick={() => {
106
+ setSelectedStat(option);
107
+ }}
108
+ css={{
109
+ px: '$9',
110
+ bg: isSelected ? selectionBg : undefined,
111
+ c: isSelected ? '$on_primary_high' : '$on_primary_high',
112
+ }}
113
+ >
114
+ {option.label}
115
+ </Dropdown.Item>
116
+ );
117
+ })}
118
+ </Dropdown.Content>
119
+ </Dropdown.Portal>
120
+ </Dropdown.Root>
121
+ </Flex>
122
+ {/* Stats */}
123
+ {selectedStat.id === 'local-peer' ? (
124
+ <LocalPeerStats />
125
+ ) : (
126
+ <TrackStats trackID={selectedStat.id} layer={selectedStat.layer} local={selectedStat.local} />
127
+ )}
128
+ </Sheet.Content>
129
+ </Sheet.Root>
130
+ ) : (
131
+ <Dialog.Root open={open} onOpenChange={onOpenChange}>
44
132
  <Dialog.Portal>
45
133
  <Dialog.Overlay />
46
134
  <Dialog.Content
47
135
  css={{
48
136
  width: 'min(500px, 95%)',
49
- maxHeight: '100%',
137
+ height: 'min(656px, 90%)',
50
138
  overflowY: 'auto',
51
139
  }}
52
140
  >
@@ -70,6 +158,7 @@ export const StatsForNerds = ({ onOpenChange }) => {
70
158
  </Text>
71
159
  </Flex>
72
160
  {/* Select */}
161
+
73
162
  <Flex
74
163
  direction="column"
75
164
  css={{
@@ -81,12 +170,12 @@ export const StatsForNerds = ({ onOpenChange }) => {
81
170
  <Label variant="body2" css={{ c: '$on_surface_high' }}>
82
171
  Stats For
83
172
  </Label>
84
- <Dropdown.Root data-testid="dialog_select_Stats For" open={open} onOpenChange={setOpen}>
173
+ <Dropdown.Root data-testid="dialog_select_Stats For" open={openDropdown} onOpenChange={setOpenDropdown}>
85
174
  <DialogDropdownTrigger
86
175
  title={selectedStat.label || 'Select Stats'}
87
176
  css={{ mt: '$4' }}
88
177
  titleCSS={{ mx: 0 }}
89
- open={open}
178
+ open={openDropdown}
90
179
  ref={ref}
91
180
  />
92
181
  <Dropdown.Portal>
@@ -119,6 +208,9 @@ export const StatsForNerds = ({ onOpenChange }) => {
119
208
  ) : (
120
209
  <TrackStats trackID={selectedStat.id} layer={selectedStat.layer} local={selectedStat.local} />
121
210
  )}
211
+ <Flex justify="start" gap={4} css={{ m: '$10 0', w: '100%' }}>
212
+ <DebugInfo details={details} />
213
+ </Flex>
122
214
  </Dialog.Content>
123
215
  </Dialog.Portal>
124
216
  </Dialog.Root>
@@ -229,8 +321,29 @@ const TrackStats = ({ trackID, layer, local }) => {
229
321
  );
230
322
  };
231
323
 
232
- const StatsRow = React.memo(({ label, value }) => (
233
- <Box css={{ bg: '$surface_bright', w: 'calc(50% - $6)', p: '$8', r: '$3' }}>
324
+ const DebugInfo = ({ details }) => {
325
+ return (
326
+ <Accordion.Root type="single" collapsible css={{ w: '100%' }}>
327
+ <Accordion.Item value="Debug Info">
328
+ <Accordion.Header>
329
+ <Label variant="body2" css={{ c: '$on_surface_high' }}>
330
+ Debug Info
331
+ </Label>
332
+ </Accordion.Header>
333
+ <Accordion.Content>
334
+ <Flex css={{ flexWrap: 'wrap', mt: '$10', gap: '$10' }}>
335
+ <StatsRow css={{ w: '100%' }} label="Websocket URL" value={details?.websocketURL} />
336
+ <StatsRow css={{ w: '100%' }} label="Init Endpoint" value={details?.initEndpoint} />
337
+ <StatsRow css={{ w: '100%' }} label="Enabled flags" value={details?.enabledFlags?.join(', ')} />
338
+ </Flex>
339
+ </Accordion.Content>
340
+ </Accordion.Item>
341
+ </Accordion.Root>
342
+ );
343
+ };
344
+
345
+ const StatsRow = React.memo(({ label, value, css }) => (
346
+ <Box css={{ bg: '$surface_bright', w: 'calc(50% - $6)', p: '$8', r: '$3', ...css }}>
234
347
  <Text
235
348
  variant="overline"
236
349
  css={{
@@ -9,7 +9,6 @@ import {
9
9
  useHMSStore,
10
10
  useHMSVanillaStore,
11
11
  } from '@100mslive/react-sdk';
12
- // @ts-ignore: No implicit Any
13
12
  import { EqualProminence } from './EqualProminence';
14
13
  import { RoleProminence } from './RoleProminence';
15
14
  import { ScreenshareLayout } from './ScreenshareLayout';
@@ -70,9 +70,9 @@ const SecondarySection = ({
70
70
  rootCSS={{
71
71
  padding: 0,
72
72
  maxWidth: 240,
73
- aspectRatio: 16 / 9,
73
+ aspectRatio: '16 / 9',
74
74
  ...(hasSidebar ? { w: '100%' } : { h: '100%' }),
75
- '@md': { aspectRatio: 1 },
75
+ '@md': { aspectRatio: '1' },
76
76
  }}
77
77
  objectFit="contain"
78
78
  {...tileLayoutProps}
@@ -25,7 +25,9 @@ const Root = ({
25
25
  bg: '$surface_bright',
26
26
  border: `4px solid ${isActive ? '$primary_default' : '$surface_dim'}`,
27
27
  cursor: 'pointer',
28
- '&:hover': { border: '4px solid $primary_dim' },
28
+ '@media (hover:hover)': {
29
+ '&:hover': { border: '4px solid $primary_dim' },
30
+ },
29
31
  ...(mediaURL ? { height: '$20', backgroundImage: `url("${mediaURL}")`, backgroundSize: 'cover' } : {}),
30
32
  }}
31
33
  onClick={async () => {
@@ -180,6 +180,9 @@ export const VBPicker = ({ backgroundMedia = [] }: { backgroundMedia: VirtualBac
180
180
  onClick: async () => {
181
181
  await VBHandler.removeEffects();
182
182
  hmsActions.setAppData(APP_DATA.background, HMSVirtualBackgroundTypes.NONE);
183
+ if (isMobile) {
184
+ toggleVB();
185
+ }
183
186
  },
184
187
  supported: true,
185
188
  },
@@ -235,6 +238,9 @@ export const VBPicker = ({ backgroundMedia = [] }: { backgroundMedia: VirtualBac
235
238
  onClick: async () => {
236
239
  await VBHandler?.setBackground(mediaURL);
237
240
  hmsActions.setAppData(APP_DATA.background, mediaURL);
241
+ if (isMobile) {
242
+ toggleVB();
243
+ }
238
244
  },
239
245
  supported: true,
240
246
  }))}
@@ -46,7 +46,6 @@ const toastMap = {};
46
46
  const ToggleChat = ({ isFullScreen = false }) => {
47
47
  const { elements } = useRoomLayoutConferencingScreen();
48
48
  const sidepane = useHMSStore(selectAppData(APP_DATA.sidePane));
49
- const toggleChat = useSidepaneToggle(SIDE_PANE_OPTIONS.CHAT);
50
49
  const showChat = !!elements?.chat;
51
50
  const isMobile = useMedia(config.media.md);
52
51
  const hmsActions = useHMSActions();
@@ -57,7 +56,7 @@ const ToggleChat = ({ isFullScreen = false }) => {
57
56
  hmsActions.setAppData(APP_DATA.sidePane, '');
58
57
  })
59
58
  .with({ isMobile: true, showChat: true, sidepane: P.when(value => !value) }, () => {
60
- toggleChat();
59
+ hmsActions.setAppData(APP_DATA.sidePane, SIDE_PANE_OPTIONS.CHAT);
61
60
  })
62
61
  .with({ showChat: false, isMobile: true, sidepane: SIDE_PANE_OPTIONS.CHAT }, () => {
63
62
  hmsActions.setAppData(APP_DATA.sidePane, '');
@@ -65,7 +64,7 @@ const ToggleChat = ({ isFullScreen = false }) => {
65
64
  .otherwise(() => {
66
65
  //do nothing
67
66
  });
68
- }, [sidepane, isMobile, toggleChat, showChat, hmsActions, isFullScreen]);
67
+ }, [sidepane, isMobile, showChat, hmsActions, isFullScreen]);
69
68
  return null;
70
69
  };
71
70
  const HLSView = () => {
@@ -286,6 +285,7 @@ const HLSView = () => {
286
285
  hlsPlayer.reset();
287
286
  };
288
287
  }
288
+ // eslint-disable-next-line react-hooks/exhaustive-deps
289
289
  }, [hlsUrl, vanillaStore, hmsActions]);
290
290
 
291
291
  /**
@@ -19,6 +19,7 @@ export const PDFView = () => {
19
19
  return () => {
20
20
  resetConfig();
21
21
  };
22
+ // eslint-disable-next-line react-hooks/exhaustive-deps
22
23
  }, []);
23
24
  useEffect(() => {
24
25
  (async () => {
@@ -1,4 +1,4 @@
1
- import React, { Suspense, useEffect, useState } from 'react';
1
+ import React, { useEffect, useState } from 'react';
2
2
  import { ControlPosition } from 'react-draggable';
3
3
  import { useMedia } from 'react-use';
4
4
  import {
@@ -15,16 +15,16 @@ import {
15
15
  useHMSStore,
16
16
  } from '@100mslive/react-sdk';
17
17
  import { PeopleAddIcon, ShareScreenIcon } from '@100mslive/react-icons';
18
- import FullPageProgress from '../components/FullPageProgress';
19
18
  import { GridLayout } from '../components/VideoLayouts/GridLayout';
20
19
  import { Box, Flex } from '../../Layout';
21
20
  import { config } from '../../Theme';
22
21
  // @ts-ignore: No implicit Any
23
22
  import { EmbedView } from './EmbedView';
24
23
  // @ts-ignore: No implicit Any
24
+ import HLSView from './HLSView';
25
+ // @ts-ignore: No implicit Any
25
26
  import { PDFView } from './PDFView';
26
27
  import SidePane from './SidePane';
27
- // @ts-ignore: No implicit Any
28
28
  import { WaitingView } from './WaitingView';
29
29
  import { CaptionsViewer } from '../plugins/CaptionsViewer';
30
30
  // @ts-ignore: No implicit Any
@@ -32,8 +32,6 @@ import { usePDFConfig, useUrlToEmbed } from '../components/AppData/useUISettings
32
32
  import { useCloseScreenshareWhiteboard } from '../components/hooks/useCloseScreenshareWhiteboard';
33
33
  import { useLandscapeHLSStream, useMobileHLSStream, useWaitingRoomInfo } from '../common/hooks';
34
34
  import { SESSION_STORE_KEY } from '../common/constants';
35
- // @ts-ignore: No implicit Any
36
- const HLSView = React.lazy(() => import('./HLSView'));
37
35
 
38
36
  export const VideoStreamingSection = ({
39
37
  screenType,
@@ -79,90 +77,88 @@ export const VideoStreamingSection = ({
79
77
  }
80
78
 
81
79
  return (
82
- <Suspense fallback={<FullPageProgress />}>
83
- <Flex
80
+ <Flex
81
+ css={{
82
+ size: '100%',
83
+ position: 'relative',
84
+ gap: isMobileHLSStream || isLandscapeHLSStream ? '0' : '$4',
85
+ }}
86
+ direction={match<Record<string, boolean>, 'row' | 'column'>({ isLandscapeHLSStream, isMobileHLSStream })
87
+ .with({ isLandscapeHLSStream: true }, () => 'row')
88
+ .with({ isMobileHLSStream: true }, () => 'column')
89
+ .otherwise(() => 'row')}
90
+ >
91
+ {match({
92
+ screenType,
93
+ isNotAllowedToPublish,
94
+ isScreenOnlyPublishParams,
95
+ hasSubscribedRolePublishing,
96
+ isSharingScreen,
97
+ pdfAnnotatorActive,
98
+ urlToIframe,
99
+ })
100
+ .with(
101
+ {
102
+ screenType: 'hls_live_streaming',
103
+ },
104
+ () => <HLSView />,
105
+ )
106
+ .when(
107
+ ({ isNotAllowedToPublish, hasSubscribedRolePublishing }) =>
108
+ isNotAllowedToPublish && !hasSubscribedRolePublishing,
109
+ () => (
110
+ <WaitingView
111
+ title="Waiting for Host to join"
112
+ subtitle="Sit back and relax"
113
+ icon={<PeopleAddIcon width="56px" height="56px" style={{ color: 'white' }} />}
114
+ />
115
+ ),
116
+ )
117
+ .when(
118
+ ({ isScreenOnlyPublishParams, isSharingScreen, hasSubscribedRolePublishing }) =>
119
+ isScreenOnlyPublishParams && !isSharingScreen && !hasSubscribedRolePublishing,
120
+ () => (
121
+ <WaitingView
122
+ title="Ready to present"
123
+ subtitle="Select the Screenshare button to start presenting"
124
+ icon={<ShareScreenIcon width="56px" height="56px" style={{ color: 'white' }} />}
125
+ />
126
+ ),
127
+ )
128
+ .when(
129
+ ({ pdfAnnotatorActive }) => !!pdfAnnotatorActive,
130
+ () => <PDFView />,
131
+ )
132
+ .when(
133
+ ({ urlToIframe }) => !!urlToIframe,
134
+ () => <EmbedView />,
135
+ )
136
+
137
+ .otherwise(() => {
138
+ // @ts-ignore
139
+ return <GridLayout {...(elements as DefaultConferencingScreen_Elements)?.video_tile_layout?.grid} />;
140
+ })}
141
+ <CaptionsViewer setDefaultPosition={setCaptionPosition} defaultPosition={captionPosition} />
142
+ <Box
84
143
  css={{
85
- size: '100%',
144
+ flex: match({ isLandscapeHLSStream, isMobileHLSStream })
145
+ .with({ isLandscapeHLSStream: true }, () => '1 1 0')
146
+ .with({ isMobileHLSStream: true }, () => '2 1 0')
147
+ .otherwise(() => undefined),
86
148
  position: 'relative',
87
- gap: isMobileHLSStream || isLandscapeHLSStream ? '0' : '$4',
149
+ height: !isMobileHLSStream ? '100%' : undefined,
150
+ maxHeight: '100%',
151
+ '&:empty': { display: 'none' },
152
+ overflowY: 'clip',
88
153
  }}
89
- direction={match<Record<string, boolean>, 'row' | 'column'>({ isLandscapeHLSStream, isMobileHLSStream })
90
- .with({ isLandscapeHLSStream: true }, () => 'row')
91
- .with({ isMobileHLSStream: true }, () => 'column')
92
- .otherwise(() => 'row')}
93
154
  >
94
- {match({
95
- screenType,
96
- isNotAllowedToPublish,
97
- isScreenOnlyPublishParams,
98
- hasSubscribedRolePublishing,
99
- isSharingScreen,
100
- pdfAnnotatorActive,
101
- urlToIframe,
102
- })
103
- .with(
104
- {
105
- screenType: 'hls_live_streaming',
106
- },
107
- () => <HLSView />,
108
- )
109
- .when(
110
- ({ isNotAllowedToPublish, hasSubscribedRolePublishing }) =>
111
- isNotAllowedToPublish && !hasSubscribedRolePublishing,
112
- () => (
113
- <WaitingView
114
- title="Waiting for Host to join"
115
- subtitle="Sit back and relax"
116
- icon={<PeopleAddIcon width="56px" height="56px" style={{ color: 'white' }} />}
117
- />
118
- ),
119
- )
120
- .when(
121
- ({ isScreenOnlyPublishParams, isSharingScreen, hasSubscribedRolePublishing }) =>
122
- isScreenOnlyPublishParams && !isSharingScreen && !hasSubscribedRolePublishing,
123
- () => (
124
- <WaitingView
125
- title="Ready to present"
126
- subtitle="Select the Screenshare button to start presenting"
127
- icon={<ShareScreenIcon width="56px" height="56px" style={{ color: 'white' }} />}
128
- />
129
- ),
130
- )
131
- .when(
132
- ({ pdfAnnotatorActive }) => !!pdfAnnotatorActive,
133
- () => <PDFView />,
134
- )
135
- .when(
136
- ({ urlToIframe }) => !!urlToIframe,
137
- () => <EmbedView />,
138
- )
139
-
140
- .otherwise(() => {
141
- // @ts-ignore
142
- return <GridLayout {...(elements as DefaultConferencingScreen_Elements)?.video_tile_layout?.grid} />;
143
- })}
144
- <CaptionsViewer setDefaultPosition={setCaptionPosition} defaultPosition={captionPosition} />
145
- <Box
146
- css={{
147
- flex: match({ isLandscapeHLSStream, isMobileHLSStream })
148
- .with({ isLandscapeHLSStream: true }, () => '1 1 0')
149
- .with({ isMobileHLSStream: true }, () => '2 1 0')
150
- .otherwise(() => undefined),
151
- position: 'relative',
152
- height: !isMobileHLSStream ? '100%' : undefined,
153
- maxHeight: '100%',
154
- '&:empty': { display: 'none' },
155
- overflowY: 'clip',
156
- }}
157
- >
158
- <SidePane
159
- screenType={screenType}
160
- // @ts-ignore
161
- tileProps={(elements as DefaultConferencingScreen_Elements)?.video_tile_layout?.grid}
162
- hideControls={hideControls}
163
- />
164
- </Box>
165
- </Flex>
166
- </Suspense>
155
+ <SidePane
156
+ screenType={screenType}
157
+ // @ts-ignore
158
+ tileProps={(elements as DefaultConferencingScreen_Elements)?.video_tile_layout?.grid}
159
+ hideControls={hideControls}
160
+ />
161
+ </Box>
162
+ </Flex>
167
163
  );
168
164
  };