@100mslive/roomkit-react 0.2.8-alpha.1 → 0.2.8-alpha.10

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 (105) hide show
  1. package/dist/HLSView-FBEGJ3L7.js +1396 -0
  2. package/dist/HLSView-FBEGJ3L7.js.map +7 -0
  3. package/dist/Prebuilt/common/hooks.d.ts +3 -0
  4. package/dist/Prebuilt/components/Chat/MwebChatOption.d.ts +1 -1
  5. package/dist/Prebuilt/components/HMSVideo/FullscreenButton.d.ts +5 -0
  6. package/dist/Prebuilt/components/HMSVideo/HLSAutoplayBlockedPrompt.d.ts +5 -0
  7. package/dist/Prebuilt/components/HMSVideo/HLSCaptionSelector.d.ts +1 -2
  8. package/dist/Prebuilt/components/HMSVideo/HLSQualitySelector.d.ts +13 -0
  9. package/dist/Prebuilt/components/HMSVideo/MwebHLSViewTitle.d.ts +2 -0
  10. package/dist/Prebuilt/components/HMSVideo/PlayButton.d.ts +6 -0
  11. package/dist/Prebuilt/components/HMSVideo/PlayPauseButton.d.ts +6 -0
  12. package/dist/Prebuilt/components/HMSVideo/PlayerContext.d.ts +8 -0
  13. package/dist/Prebuilt/components/HMSVideo/SeekControls.d.ts +7 -0
  14. package/dist/Prebuilt/components/HMSVideo/VideoProgress.d.ts +5 -0
  15. package/dist/Prebuilt/components/HMSVideo/VideoTime.d.ts +2 -0
  16. package/dist/Prebuilt/components/HMSVideo/VolumeControl.d.ts +2 -0
  17. package/dist/Prebuilt/components/HMSVideo/index.d.ts +26 -0
  18. package/dist/Prebuilt/components/HMSVideo/utils.d.ts +8 -0
  19. package/dist/Prebuilt/components/Leave/DesktopLeaveRoom.d.ts +2 -1
  20. package/dist/Prebuilt/components/Leave/LeaveRoom.d.ts +2 -1
  21. package/dist/Prebuilt/components/Leave/MwebLeaveRoom.d.ts +2 -3
  22. package/dist/Prebuilt/components/MwebLandscapePrompt.d.ts +1 -1
  23. package/dist/Prebuilt/components/RaiseHand.d.ts +5 -0
  24. package/dist/Prebuilt/components/SidePaneTabs.d.ts +1 -1
  25. package/dist/Sheet/Sheet.d.ts +1 -0
  26. package/dist/{chunk-ERIM35YN.js → chunk-R2JJJQR3.js} +1539 -1173
  27. package/dist/chunk-R2JJJQR3.js.map +7 -0
  28. package/dist/index.cjs.js +2709 -1898
  29. package/dist/index.cjs.js.map +4 -4
  30. package/dist/index.js +1 -1
  31. package/dist/meta.cjs.json +777 -290
  32. package/dist/meta.esbuild.json +796 -298
  33. package/package.json +7 -6
  34. package/src/Button/Button.tsx +4 -4
  35. package/src/Fieldset/Fieldset.tsx +1 -1
  36. package/src/Input/PasswordInput.stories.tsx +1 -1
  37. package/src/Pagination/StyledPagination.stories.tsx +2 -2
  38. package/src/Prebuilt/IconButton.tsx +1 -1
  39. package/src/Prebuilt/common/hooks.ts +21 -0
  40. package/src/Prebuilt/components/AppData/useSidepane.js +34 -7
  41. package/src/Prebuilt/components/AuthToken.jsx +1 -1
  42. package/src/Prebuilt/components/Chat/Chat.tsx +41 -1
  43. package/src/Prebuilt/components/Chat/ChatFooter.tsx +33 -13
  44. package/src/Prebuilt/components/Chat/MwebChatOption.tsx +1 -1
  45. package/src/Prebuilt/components/ConferenceScreen.tsx +48 -7
  46. package/src/Prebuilt/components/EmojiReaction.jsx +33 -23
  47. package/src/Prebuilt/components/Footer/Footer.tsx +0 -1
  48. package/src/Prebuilt/components/Footer/RoleOptions.tsx +138 -125
  49. package/src/Prebuilt/components/HMSVideo/Controls.jsx +1 -1
  50. package/src/Prebuilt/components/HMSVideo/FullscreenButton.tsx +13 -0
  51. package/src/Prebuilt/components/HMSVideo/HLSAutoplayBlockedPrompt.tsx +72 -0
  52. package/src/Prebuilt/components/HMSVideo/HLSCaptionSelector.tsx +4 -2
  53. package/src/Prebuilt/components/HMSVideo/HLSQualitySelector.tsx +248 -0
  54. package/src/Prebuilt/components/HMSVideo/HMSVideo.jsx +17 -7
  55. package/src/Prebuilt/components/HMSVideo/MwebHLSViewTitle.tsx +84 -0
  56. package/src/Prebuilt/components/HMSVideo/PlayButton.tsx +27 -0
  57. package/src/Prebuilt/components/HMSVideo/PlayPauseButton.tsx +27 -0
  58. package/src/Prebuilt/components/HMSVideo/PlayerContext.tsx +15 -0
  59. package/src/Prebuilt/components/HMSVideo/SeekControls.tsx +22 -0
  60. package/src/Prebuilt/components/HMSVideo/VideoProgress.tsx +95 -0
  61. package/src/Prebuilt/components/HMSVideo/VideoTime.tsx +43 -0
  62. package/src/Prebuilt/components/HMSVideo/{VolumeControl.jsx → VolumeControl.tsx} +6 -4
  63. package/src/Prebuilt/components/HMSVideo/{index.js → index.ts} +6 -2
  64. package/src/Prebuilt/components/HMSVideo/{HMSVIdeoUtils.js → utils.ts} +5 -5
  65. package/src/Prebuilt/components/Header/StreamActions.tsx +1 -1
  66. package/src/Prebuilt/components/IconButtonWithOptions/IconButtonWithOptions.tsx +1 -1
  67. package/src/Prebuilt/components/Leave/DesktopLeaveRoom.tsx +50 -46
  68. package/src/Prebuilt/components/Leave/LeaveRoom.tsx +15 -4
  69. package/src/Prebuilt/components/Leave/MwebLeaveRoom.tsx +46 -27
  70. package/src/Prebuilt/components/MoreSettings/MoreSettings.tsx +3 -1
  71. package/src/Prebuilt/components/MoreSettings/SplitComponents/DesktopOptions.tsx +37 -31
  72. package/src/Prebuilt/components/MoreSettings/SplitComponents/MwebOptions.tsx +12 -8
  73. package/src/Prebuilt/components/MwebLandscapePrompt.tsx +14 -3
  74. package/src/Prebuilt/components/Notifications/HandRaisedNotifications.tsx +5 -2
  75. package/src/Prebuilt/components/Notifications/PeerNotifications.tsx +1 -1
  76. package/src/Prebuilt/components/Polls/Voting/QuestionCard.jsx +19 -8
  77. package/src/Prebuilt/components/Polls/Voting/Voting.tsx +3 -2
  78. package/src/Prebuilt/components/Polls/common/OptionInputWithDelete.tsx +1 -1
  79. package/src/Prebuilt/components/Polls/common/utils.ts +2 -2
  80. package/src/Prebuilt/components/RaiseHand.tsx +24 -0
  81. package/src/Prebuilt/components/RoomDetails/RoomDetailsPane.tsx +41 -14
  82. package/src/Prebuilt/components/SidePaneTabs.tsx +56 -48
  83. package/src/Prebuilt/components/StatsForNerds.jsx +14 -6
  84. package/src/Prebuilt/components/Streaming/Common.jsx +1 -1
  85. package/src/Prebuilt/components/TileMenu/TileMenuContent.tsx +2 -2
  86. package/src/Prebuilt/components/Toast/ToastBatcher.js +8 -1
  87. package/src/Prebuilt/components/Toast/ToastConfig.jsx +17 -0
  88. package/src/Prebuilt/components/pdfAnnotator/shareScreenOptions.jsx +2 -2
  89. package/src/Prebuilt/components/pdfAnnotator/uploadedFile.jsx +1 -1
  90. package/src/Prebuilt/layouts/HLSView.jsx +359 -178
  91. package/src/Prebuilt/layouts/SidePane.tsx +145 -59
  92. package/src/Prebuilt/layouts/VideoStreamingSection.tsx +22 -2
  93. package/src/Prebuilt/primitives/DialogContent.jsx +1 -1
  94. package/src/Prebuilt/provider/roomLayoutProvider/index.tsx +1 -1
  95. package/src/Sheet/Sheet.tsx +7 -3
  96. package/dist/HLSView-SJCF34GE.js +0 -987
  97. package/dist/HLSView-SJCF34GE.js.map +0 -7
  98. package/dist/chunk-ERIM35YN.js.map +0 -7
  99. package/src/Prebuilt/components/HMSVideo/FullscreenButton.jsx +0 -18
  100. package/src/Prebuilt/components/HMSVideo/HLSAutoplayBlockedPrompt.jsx +0 -35
  101. package/src/Prebuilt/components/HMSVideo/HLSQualitySelector.jsx +0 -127
  102. package/src/Prebuilt/components/HMSVideo/PlayButton.jsx +0 -13
  103. package/src/Prebuilt/components/HMSVideo/VideoProgress.jsx +0 -76
  104. package/src/Prebuilt/components/HMSVideo/VideoTime.jsx +0 -33
  105. package/src/Prebuilt/components/RaiseHand.jsx +0 -17
@@ -1,16 +1,15 @@
1
1
  import React, { useEffect, useState } from 'react';
2
2
  import { useMedia } from 'react-use';
3
3
  import { DefaultConferencingScreen_Elements } from '@100mslive/types-prebuilt';
4
+ import { match } from 'ts-pattern';
4
5
  import { selectPeerCount, useHMSStore } from '@100mslive/react-sdk';
5
6
  import { CrossIcon } from '@100mslive/react-icons';
6
- // @ts-ignore: No implicit Any
7
7
  import { Chat } from './Chat/Chat';
8
8
  import { PaginatedParticipants } from './Footer/PaginatedParticipants';
9
9
  import { ParticipantList } from './Footer/ParticipantList';
10
10
  import { Box, config as cssConfig, Flex, IconButton, Tabs, Text } from '../..';
11
11
  import { Tooltip } from '../../Tooltip';
12
12
  import { ChatSettings } from './ChatSettings';
13
- // @ts-ignore: No implicit Any
14
13
  import { useRoomLayoutConferencingScreen } from '../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
15
14
  // @ts-ignore: No implicit Any
16
15
  import { useIsSidepaneTypeOpen, useSidepaneReset, useSidepaneToggle } from './AppData/useSidepane';
@@ -19,12 +18,15 @@ import { getFormattedCount } from '../common/utils';
19
18
  import { SIDE_PANE_OPTIONS } from '../common/constants';
20
19
 
21
20
  const tabTriggerCSS = {
22
- color: '$on_surface_high',
21
+ color: '$on_surface_low',
23
22
  p: '$4',
24
23
  fontWeight: '$semiBold',
25
24
  fontSize: '$sm',
26
25
  w: '100%',
27
26
  justifyContent: 'center',
27
+ '&[data-state="active"]': {
28
+ color: '$on_surface_high',
29
+ },
28
30
  };
29
31
 
30
32
  const ParticipantCount = ({ count }: { count: number }) => {
@@ -39,19 +41,19 @@ const ParticipantCount = ({ count }: { count: number }) => {
39
41
 
40
42
  export const SidePaneTabs = React.memo<{
41
43
  active: 'Participants | Chat';
42
- hideControls?: boolean;
43
- }>(({ active = SIDE_PANE_OPTIONS.CHAT, hideControls }) => {
44
+ hideTab?: boolean;
45
+ }>(({ active = SIDE_PANE_OPTIONS.CHAT, hideTab = false }) => {
44
46
  const toggleChat = useSidepaneToggle(SIDE_PANE_OPTIONS.CHAT);
45
47
  const toggleParticipants = useSidepaneToggle(SIDE_PANE_OPTIONS.PARTICIPANTS);
46
48
  const resetSidePane = useSidepaneReset();
47
49
  const [activeTab, setActiveTab] = useState(active);
48
50
  const [activeRole, setActiveRole] = useState('');
49
51
  const peerCount = useHMSStore(selectPeerCount);
50
- const { elements } = useRoomLayoutConferencingScreen();
52
+ const { elements, screenType } = useRoomLayoutConferencingScreen();
51
53
  const chat_title = elements?.chat?.chat_title || 'Chat';
52
54
  const showChat = !!elements?.chat;
53
55
  const showParticipants = !!elements?.participant_list;
54
- const hideTabs = !(showChat && showParticipants);
56
+ const hideTabs = !(showChat && showParticipants) || hideTab;
55
57
  const isMobile = useMedia(cssConfig.media.md);
56
58
  const isOverlayChat = !!elements?.chat?.is_overlay && isMobile;
57
59
  const { off_stage_roles = [] } = (elements as DefaultConferencingScreen_Elements)?.on_stage_exp || {};
@@ -59,13 +61,16 @@ export const SidePaneTabs = React.memo<{
59
61
  const showChatSettings = showChat && isChatOpen && (!isMobile || !isOverlayChat);
60
62
 
61
63
  useEffect(() => {
62
- if (activeTab === SIDE_PANE_OPTIONS.CHAT && !showChat && showParticipants) {
63
- setActiveTab(SIDE_PANE_OPTIONS.PARTICIPANTS);
64
- } else if (activeTab === SIDE_PANE_OPTIONS.PARTICIPANTS && showChat && !showParticipants) {
65
- setActiveTab(SIDE_PANE_OPTIONS.CHAT);
66
- } else if (!showChat && !showParticipants) {
67
- resetSidePane();
68
- }
64
+ match({ activeTab, showChat, showParticipants })
65
+ .with({ activeTab: SIDE_PANE_OPTIONS.CHAT, showChat: false, showParticipants: true }, () => {
66
+ setActiveTab(SIDE_PANE_OPTIONS.PARTICIPANTS);
67
+ })
68
+ .with({ activeTab: SIDE_PANE_OPTIONS.PARTICIPANTS, showChat: true, showParticipants: false }, () => {
69
+ setActiveTab(SIDE_PANE_OPTIONS.CHAT);
70
+ })
71
+ .with({ showChat: false, showParticipants: false }, () => {
72
+ resetSidePane();
73
+ });
69
74
  }, [showChat, activeTab, showParticipants, resetSidePane]);
70
75
 
71
76
  useEffect(() => {
@@ -79,7 +84,6 @@ export const SidePaneTabs = React.memo<{
79
84
  css={{
80
85
  color: '$on_primary_high',
81
86
  h: '100%',
82
- marginTop: hideControls && isOverlayChat ? '$17' : '0',
83
87
  transition: 'margin 0.3s ease-in-out',
84
88
  position: 'relative',
85
89
  }}
@@ -97,20 +101,27 @@ export const SidePaneTabs = React.memo<{
97
101
  css={{
98
102
  color: '$on_primary_high',
99
103
  h: '100%',
100
- marginTop: hideControls && isOverlayChat ? '$17' : '0',
101
104
  transition: 'margin 0.3s ease-in-out',
102
105
  }}
103
106
  >
104
- {isOverlayChat && isChatOpen && showChat ? (
105
- <Chat />
106
- ) : (
107
- <>
108
- {hideTabs ? (
107
+ {match({ isOverlayChat, isChatOpen, showChat, hideTabs })
108
+ .with({ isOverlayChat: true, isChatOpen: true, showChat: true }, () => <Chat />)
109
+ .with({ hideTabs: true }, () => {
110
+ return (
109
111
  <>
110
- <Flex justify="between" css={{ w: '100%' }}>
111
- <Text variant="sm" css={{ fontWeight: '$semiBold', p: '$4', c: '$on_surface_high', pr: '$12' }}>
112
- {showChat ? (
113
- chat_title
112
+ <Flex justify="between" css={{ w: '100%', '&:empty': { display: 'none' } }}>
113
+ <Text
114
+ variant="sm"
115
+ css={{
116
+ fontWeight: '$semiBold',
117
+ p: '$4',
118
+ c: '$on_surface_high',
119
+ pr: '$12',
120
+ '&:empty': { display: 'none' },
121
+ }}
122
+ >
123
+ {activeTab === SIDE_PANE_OPTIONS.CHAT ? (
124
+ screenType !== 'hls_live_streaming' && chat_title
114
125
  ) : (
115
126
  <span>
116
127
  Participants&nbsp;
@@ -122,7 +133,12 @@ export const SidePaneTabs = React.memo<{
122
133
  {showChatSettings ? <ChatSettings /> : null}
123
134
  {isOverlayChat && isChatOpen ? null : (
124
135
  <IconButton
125
- css={{ my: '$1', color: '$on_surface_medium', '&:hover': { color: '$on_surface_high' } }}
136
+ css={{
137
+ my: '$1',
138
+ color: '$on_surface_medium',
139
+ '&:hover': { color: '$on_surface_high' },
140
+ '&:empty': { display: 'none' },
141
+ }}
126
142
  onClick={e => {
127
143
  e.stopPropagation();
128
144
  if (activeTab === SIDE_PANE_OPTIONS.CHAT) {
@@ -133,14 +149,21 @@ export const SidePaneTabs = React.memo<{
133
149
  }}
134
150
  data-testid="close_chat"
135
151
  >
136
- <CrossIcon />
152
+ {screenType === 'hls_live_streaming' && isChatOpen ? null : <CrossIcon />}
137
153
  </IconButton>
138
154
  )}
139
155
  </Flex>
140
156
  </Flex>
141
- {showChat ? <Chat /> : <ParticipantList offStageRoles={off_stage_roles} onActive={setActiveRole} />}
157
+ {activeTab === SIDE_PANE_OPTIONS.CHAT ? (
158
+ <Chat />
159
+ ) : (
160
+ <ParticipantList offStageRoles={off_stage_roles} onActive={setActiveRole} />
161
+ )}
142
162
  </>
143
- ) : (
163
+ );
164
+ })
165
+ .otherwise(() => {
166
+ return (
144
167
  <Tabs.Root
145
168
  value={activeTab}
146
169
  onValueChange={setActiveTab}
@@ -151,24 +174,10 @@ export const SidePaneTabs = React.memo<{
151
174
  >
152
175
  <Flex css={{ w: '100%' }}>
153
176
  <Tabs.List css={{ flexGrow: 1, borderRadius: '$2', bg: '$surface_default' }}>
154
- <Tabs.Trigger
155
- value={SIDE_PANE_OPTIONS.CHAT}
156
- onClick={toggleChat}
157
- css={{
158
- ...tabTriggerCSS,
159
- color: activeTab !== SIDE_PANE_OPTIONS.CHAT ? '$on_surface_low' : '$on_surface_high',
160
- }}
161
- >
177
+ <Tabs.Trigger value={SIDE_PANE_OPTIONS.CHAT} onClick={toggleChat} css={tabTriggerCSS}>
162
178
  {chat_title}
163
179
  </Tabs.Trigger>
164
- <Tabs.Trigger
165
- value={SIDE_PANE_OPTIONS.PARTICIPANTS}
166
- onClick={toggleParticipants}
167
- css={{
168
- ...tabTriggerCSS,
169
- color: activeTab !== SIDE_PANE_OPTIONS.PARTICIPANTS ? '$on_surface_low' : '$on_surface_high',
170
- }}
171
- >
180
+ <Tabs.Trigger value={SIDE_PANE_OPTIONS.PARTICIPANTS} onClick={toggleParticipants} css={tabTriggerCSS}>
172
181
  Participants&nbsp;
173
182
  <ParticipantCount count={peerCount} />
174
183
  </Tabs.Trigger>
@@ -198,9 +207,8 @@ export const SidePaneTabs = React.memo<{
198
207
  <Chat />
199
208
  </Tabs.Content>
200
209
  </Tabs.Root>
201
- )}
202
- </>
203
- )}
210
+ );
211
+ })}
204
212
  </Flex>
205
213
  );
206
214
  });
@@ -1,4 +1,5 @@
1
1
  import React, { useEffect, useMemo, useRef, useState } from 'react';
2
+ import { match, P } from 'ts-pattern';
2
3
  import {
3
4
  selectHMSStats,
4
5
  selectLocalPeerID,
@@ -188,11 +189,15 @@ const LocalPeerStats = () => {
188
189
  };
189
190
 
190
191
  const TrackStats = ({ trackID, layer, local }) => {
191
- const selector = layer
192
- ? selectHMSStats.localVideoTrackStatsByLayer(layer)(trackID)
193
- : local
194
- ? selectHMSStats.localAudioTrackStatsByID(trackID)
195
- : selectHMSStats.trackStatsByID(trackID);
192
+ const selector = match({ trackID, layer, local })
193
+ .with(
194
+ {
195
+ layer: P.when(layer => !!layer),
196
+ },
197
+ () => selectHMSStats.localVideoTrackStatsByLayer(layer)(trackID),
198
+ )
199
+ .with({ local: P.when(local => !!local) }, () => selectHMSStats.localAudioTrackStatsByID(trackID))
200
+ .otherwise(() => selectHMSStats.trackStatsByID(trackID));
196
201
  const stats = useHMSStatsStore(selector);
197
202
  if (!stats) {
198
203
  return null;
@@ -215,7 +220,10 @@ const TrackStats = ({ trackID, layer, local }) => {
215
220
  {!inbound && <StatsRow label="Quality Limitation Reason" value={stats.qualityLimitationReason} />}
216
221
  </>
217
222
  )}
218
- <StatsRow label="Round Trip Time" value={stats.roundTripTime ? `${stats.roundTripTime * 1000} ms` : '-'} />
223
+ <StatsRow
224
+ label="Round Trip Time"
225
+ value={stats.roundTripTime ? `${(stats.roundTripTime * 1000).toFixed(3)} ms` : '-'}
226
+ />
219
227
  </Flex>
220
228
  );
221
229
  };
@@ -20,7 +20,7 @@ export const StreamCard = ({ title, subtitle, Icon, imgSrc = '', css = {}, onCli
20
20
  onClick={onClick}
21
21
  >
22
22
  <Text css={{ alignSelf: 'center', p: '$4' }}>
23
- {imgSrc ? <img src={imgSrc} height={40} width={40} /> : <Icon width={40} height={40} />}
23
+ {imgSrc ? <img src={imgSrc} height={40} width={40} alt="Streaming" /> : <Icon width={40} height={40} />}
24
24
  </Text>
25
25
  <Box css={{ flex: '1 1 0', mx: '$8' }}>
26
26
  <Text variant="h6" css={{ mb: '$4' }}>
@@ -289,7 +289,7 @@ export const TileMenuContent = ({
289
289
  data-testid={isVideoEnabled ? 'mute_video_participant_btn' : 'unmute_video_participant_btn'}
290
290
  >
291
291
  {isVideoEnabled ? <VideoOnIcon height={20} width={20} /> : <VideoOffIcon height={20} width={20} />}
292
- <span>{isVideoEnabled ? 'Mute' : 'Request Unmute'}</span>
292
+ <span>{isVideoEnabled ? 'Mute Video' : 'Request to Unmute Video'}</span>
293
293
  </StyledMenuTile.ItemButton>
294
294
  ) : null}
295
295
 
@@ -304,7 +304,7 @@ export const TileMenuContent = ({
304
304
  data-testid={isAudioEnabled ? 'mute_audio_participant_btn' : 'unmute_audio_participant_btn'}
305
305
  >
306
306
  {isAudioEnabled ? <MicOnIcon height={20} width={20} /> : <MicOffIcon height={20} width={20} />}
307
- <span>{isAudioEnabled ? 'Mute' : 'Request Unmute'}</span>
307
+ <span>{isAudioEnabled ? 'Mute Audio' : 'Request to Unmute Audio'}</span>
308
308
  </StyledMenuTile.ItemButton>
309
309
  ) : null}
310
310
 
@@ -3,6 +3,7 @@ import { ToastManager } from './ToastManager';
3
3
 
4
4
  export const ToastBatcher = {
5
5
  toastsType: new Map(),
6
+ toastCache: {},
6
7
  showToastInternal({ notification, duration, type }) {
7
8
  let notificationType = type;
8
9
  if (!type) {
@@ -40,7 +41,13 @@ export const ToastBatcher = {
40
41
  },
41
42
  showToast({ notification, duration = 3000, type }) {
42
43
  try {
43
- this.showToastInternal({ notification, duration, type });
44
+ if (!this.toastCache[notification.id]) {
45
+ this.showToastInternal({ notification, duration, type });
46
+ }
47
+ this.toastCache[notification.id] = true;
48
+ if (Object.keys(this.toastCache).length > 100) {
49
+ this.toastCache = {};
50
+ }
44
51
  } catch (err) {
45
52
  console.debug('Notifications', err);
46
53
  }
@@ -123,6 +123,23 @@ export const ToastConfig = {
123
123
  },
124
124
  },
125
125
  RAISE_HAND: {
126
+ single: notification => {
127
+ return {
128
+ title: `${notification.data?.name} raised hand`,
129
+ icon: <HandIcon />,
130
+ };
131
+ },
132
+ multiple: notifications => {
133
+ const count = new Set(notifications.map(notification => notification.data?.id)).size;
134
+ return {
135
+ title: `${notifications[notifications.length - 1].data?.name} ${
136
+ count > 1 ? `${count} and others` : ''
137
+ } raised hand`,
138
+ icon: <HandIcon />,
139
+ };
140
+ },
141
+ },
142
+ RAISE_HAND_HLS: {
126
143
  single: notification => {
127
144
  return {
128
145
  title: `${notification.data?.name} raised hand`,
@@ -61,7 +61,7 @@ export function ShareScreenOptions() {
61
61
  pt: '$10',
62
62
  pb: '$6',
63
63
  '&:hover': {
64
- bg: '$transparent',
64
+ bg: 'transparent',
65
65
  cursor: 'default',
66
66
  },
67
67
  }}
@@ -78,7 +78,7 @@ export function ShareScreenOptions() {
78
78
  pt: '$6',
79
79
  pb: '$10',
80
80
  '&:hover': {
81
- bg: '$transparent',
81
+ bg: 'transparent',
82
82
  cursor: 'default',
83
83
  },
84
84
  }}
@@ -36,7 +36,7 @@ export const UploadedFile = ({ pdfFile, setPDFFile, onOpenChange }) => {
36
36
  w: '100%',
37
37
  '&:focus': {
38
38
  boxShadow: '0 0 0 1px $colors$primary_default',
39
- border: '1px solid $transparent',
39
+ border: '1px solid transparent',
40
40
  },
41
41
  mb: 0,
42
42
  mt: '$6',