@100mslive/roomkit-react 0.1.20-alpha.1 → 0.2.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 (83) hide show
  1. package/README.md +27 -2
  2. package/dist/{HLSView-PJLISGG4.js → HLSView-ULB4DC6B.js} +2 -2
  3. package/dist/Input/Input.d.ts +3 -3
  4. package/dist/Prebuilt/components/Chat/ChatActions.d.ts +2 -1
  5. package/dist/Prebuilt/components/Polls/CreateQuestions/DeleteQuestionModal.d.ts +6 -0
  6. package/dist/Prebuilt/components/Polls/CreateQuestions/QuestionForm.d.ts +22 -0
  7. package/dist/Prebuilt/components/Polls/CreateQuestions/SavedQuestion.d.ts +11 -0
  8. package/dist/Prebuilt/components/Polls/Voting/StandardVoting.d.ts +5 -0
  9. package/dist/Prebuilt/components/Polls/Voting/TimedVoting.d.ts +5 -0
  10. package/dist/Prebuilt/components/Polls/Voting/Voting.d.ts +5 -0
  11. package/dist/Prebuilt/components/Polls/common/Line.d.ts +2 -0
  12. package/dist/Prebuilt/components/Polls/common/OptionInputWithDelete.d.ts +8 -0
  13. package/dist/Prebuilt/components/Polls/common/StatusIndicator.d.ts +4 -0
  14. package/dist/Prebuilt/components/Polls/common/VoteCount.d.ts +4 -0
  15. package/dist/Prebuilt/components/Polls/common/VoteProgress.d.ts +6 -0
  16. package/dist/Prebuilt/components/Polls/common/VoterList.d.ts +4 -0
  17. package/dist/Prebuilt/components/TileMenu/utils.d.ts +5 -0
  18. package/dist/Prebuilt/components/hooks/usePinnedBy.d.ts +1 -0
  19. package/dist/Prebuilt/components/hooks/{useSetPinnedMessages.d.ts → usePinnedMessages.d.ts} +6 -1
  20. package/dist/TextArea/TextArea.d.ts +441 -0
  21. package/dist/TextArea/index.d.ts +1 -0
  22. package/dist/Toast/Toast.d.ts +1 -1
  23. package/dist/{chunk-QENB2CO7.js → chunk-GVA4I77Z.js} +2803 -2743
  24. package/dist/chunk-GVA4I77Z.js.map +7 -0
  25. package/dist/index.cjs.js +3038 -2969
  26. package/dist/index.cjs.js.map +4 -4
  27. package/dist/index.d.ts +1 -0
  28. package/dist/index.js +3 -1
  29. package/dist/meta.cjs.json +475 -388
  30. package/dist/meta.esbuild.json +485 -396
  31. package/package.json +7 -8
  32. package/src/Button/Button.tsx +4 -4
  33. package/src/Input/Input.tsx +1 -1
  34. package/src/Prebuilt/App.tsx +2 -0
  35. package/src/Prebuilt/components/Chat/ChatActions.tsx +25 -8
  36. package/src/Prebuilt/components/Chat/ChatBody.tsx +64 -21
  37. package/src/Prebuilt/components/Chat/ChatFooter.tsx +1 -0
  38. package/src/Prebuilt/components/Chat/PinnedMessage.tsx +2 -2
  39. package/src/Prebuilt/components/Header/AdditionalRoomState.jsx +1 -38
  40. package/src/Prebuilt/components/Header/StreamActions.tsx +1 -1
  41. package/src/Prebuilt/components/Polls/CreatePollQuiz/PollsQuizMenu.jsx +11 -1
  42. package/src/Prebuilt/components/Polls/CreateQuestions/{DeleteQuestionModal.jsx → DeleteQuestionModal.tsx} +9 -1
  43. package/src/Prebuilt/components/Polls/CreateQuestions/{QuestionForm.jsx → QuestionForm.tsx} +71 -30
  44. package/src/Prebuilt/components/Polls/CreateQuestions/{SavedQuestion.jsx → SavedQuestion.tsx} +24 -15
  45. package/src/Prebuilt/components/Polls/Voting/LeaderboardSummary.tsx +1 -1
  46. package/src/Prebuilt/components/Polls/Voting/QuestionCard.jsx +61 -80
  47. package/src/Prebuilt/components/Polls/Voting/{StandardVoting.jsx → StandardVoting.tsx} +3 -7
  48. package/src/Prebuilt/components/Polls/Voting/{TimedVoting.jsx → TimedVoting.tsx} +4 -7
  49. package/src/Prebuilt/components/Polls/Voting/{Voting.jsx → Voting.tsx} +4 -3
  50. package/src/Prebuilt/components/Polls/common/Line.tsx +4 -0
  51. package/src/Prebuilt/components/Polls/common/{OptionInputWithDelete.jsx → OptionInputWithDelete.tsx} +14 -2
  52. package/src/Prebuilt/components/Polls/common/SingleChoiceOptions.jsx +1 -1
  53. package/src/Prebuilt/components/Polls/common/{StatusIndicator.jsx → StatusIndicator.tsx} +1 -2
  54. package/src/Prebuilt/components/Polls/common/{VoteCount.jsx → VoteCount.tsx} +1 -2
  55. package/src/Prebuilt/components/Polls/common/{VoteProgress.jsx → VoteProgress.tsx} +3 -2
  56. package/src/Prebuilt/components/Polls/common/{VoterList.jsx → VoterList.tsx} +1 -1
  57. package/src/Prebuilt/components/TileMenu/TileMenu.jsx +3 -1
  58. package/src/Prebuilt/components/TileMenu/TileMenuContent.tsx +15 -3
  59. package/src/Prebuilt/components/TileMenu/utils.ts +7 -0
  60. package/src/Prebuilt/components/VideoLayouts/GridLayout.tsx +7 -3
  61. package/src/Prebuilt/components/VideoTile.jsx +2 -4
  62. package/src/Prebuilt/components/hooks/usePinnedBy.tsx +22 -0
  63. package/src/Prebuilt/components/hooks/{useSetPinnedMessages.ts → usePinnedMessages.ts} +2 -2
  64. package/src/Prebuilt/components/hooks/useUnreadPollQuizPresent.tsx +1 -4
  65. package/src/Prebuilt/layouts/VideoStreamingSection.tsx +0 -1
  66. package/src/TextArea/TextArea.tsx +30 -0
  67. package/src/TextArea/index.tsx +1 -0
  68. package/src/index.ts +1 -0
  69. package/src/store/StorybookSDK.ts +3 -1
  70. package/dist/Prebuilt/plugins/whiteboard/ToggleWhiteboard.d.ts +0 -5
  71. package/dist/chunk-QENB2CO7.js.map +0 -7
  72. package/src/Prebuilt/components/Polls/common/Votes.jsx +0 -72
  73. package/src/Prebuilt/layouts/WhiteboardView.jsx +0 -40
  74. package/src/Prebuilt/plugins/whiteboard/PusherCommunicationProvider.js +0 -110
  75. package/src/Prebuilt/plugins/whiteboard/README.md +0 -29
  76. package/src/Prebuilt/plugins/whiteboard/ToggleWhiteboard.tsx +0 -37
  77. package/src/Prebuilt/plugins/whiteboard/Whiteboard.css +0 -12
  78. package/src/Prebuilt/plugins/whiteboard/Whiteboard.jsx +0 -11
  79. package/src/Prebuilt/plugins/whiteboard/WhiteboardEvents.js +0 -8
  80. package/src/Prebuilt/plugins/whiteboard/index.js +0 -3
  81. package/src/Prebuilt/plugins/whiteboard/useMultiplayerState.js +0 -212
  82. package/src/Prebuilt/plugins/whiteboard/useWhiteboardMetadata.js +0 -47
  83. /package/dist/{HLSView-PJLISGG4.js.map → HLSView-ULB4DC6B.js.map} +0 -0
package/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "prebuilt",
11
11
  "roomkit"
12
12
  ],
13
- "version": "0.1.20-alpha.1",
13
+ "version": "0.2.0",
14
14
  "author": "100ms",
15
15
  "license": "MIT",
16
16
  "files": [
@@ -76,10 +76,10 @@
76
76
  "react": ">=17.0.2 <19.0.0"
77
77
  },
78
78
  "dependencies": {
79
- "@100mslive/hls-player": "0.1.29-alpha.1",
80
- "@100mslive/hms-virtual-background": "1.11.29-alpha.1",
81
- "@100mslive/react-icons": "0.8.29-alpha.1",
82
- "@100mslive/react-sdk": "0.8.29-alpha.1",
79
+ "@100mslive/hls-player": "0.2.0",
80
+ "@100mslive/hms-virtual-background": "1.12.0",
81
+ "@100mslive/react-icons": "0.9.0",
82
+ "@100mslive/react-sdk": "0.9.0",
83
83
  "@100mslive/types-prebuilt": "0.12.5",
84
84
  "@emoji-mart/data": "^1.0.6",
85
85
  "@emoji-mart/react": "^1.0.1",
@@ -100,9 +100,8 @@
100
100
  "@radix-ui/react-tooltip": "1.0.6",
101
101
  "@stitches/react": "^1.2.8",
102
102
  "emoji-mart": "^5.2.2",
103
- "eventemitter2": "^6.4.7",
103
+ "eventemitter2": "^6.4.9",
104
104
  "lodash.merge": "^4.6.2",
105
- "pusher-js": "^7.0.3",
106
105
  "qrcode.react": "^3.1.0",
107
106
  "react-draggable": "^4.4.5",
108
107
  "react-intersection-observer": "^9.4.3",
@@ -115,5 +114,5 @@
115
114
  "uuid": "^8.3.2",
116
115
  "worker-timers": "^7.0.40"
117
116
  },
118
- "gitHead": "19be8b8d757300a9405078f1ceea21ba95e3b9e1"
117
+ "gitHead": "4141fa5d88b73328867609b0ceaa5a5ac67135d0"
119
118
  }
@@ -139,10 +139,10 @@ const StyledButton = styled('button', {
139
139
  variants: {
140
140
  variant: {
141
141
  standard: getButtonVariants(
142
- '$surface_brighter',
143
- '$surface_bright',
144
- '$surface_default',
145
- '$surface_dim',
142
+ '$secondary_default',
143
+ '$secondary_bright',
144
+ '$secondary_dim',
145
+ '$secondary_disabled',
146
146
  '$on_surface_high',
147
147
  '$on_surface_low',
148
148
  ),
@@ -23,7 +23,7 @@ export const Input = styled('input', {
23
23
  color: '$on_surface_medium',
24
24
  },
25
25
  variants: {
26
- alert_error_default: {
26
+ error: {
27
27
  true: {
28
28
  '&:focus': {
29
29
  boxShadow: '0 0 0 3px $colors$alert_error_default',
@@ -25,6 +25,7 @@ import { Notifications } from './components/Notifications';
25
25
  import { PreviewScreen } from './components/Preview/PreviewScreen';
26
26
  // @ts-ignore: No implicit Any
27
27
  import { ToastContainer } from './components/Toast/ToastContainer';
28
+ import { VBHandler } from './components/VirtualBackground/VBHandler';
28
29
  import { RoomLayoutContext, RoomLayoutProvider, useRoomLayout } from './provider/roomLayoutProvider';
29
30
  import { DialogContainerProvider } from '../context/DialogContext';
30
31
  import { Box } from '../Layout';
@@ -124,6 +125,7 @@ export const HMSPrebuilt = React.forwardRef<HMSPrebuiltRefType, HMSPrebuiltProps
124
125
  // leave room when component unmounts
125
126
  useEffect(
126
127
  () => () => {
128
+ VBHandler.reset();
127
129
  reactiveStore?.current?.hmsActions.leave();
128
130
  },
129
131
  [],
@@ -7,6 +7,7 @@ import {
7
7
  EyeCloseIcon,
8
8
  PeopleRemoveIcon,
9
9
  PinIcon,
10
+ ReplyGroupIcon,
10
11
  ReplyIcon,
11
12
  VerticalMenuIcon,
12
13
  } from '@100mslive/react-icons';
@@ -21,7 +22,7 @@ import { ToastManager } from '../Toast/ToastManager';
21
22
  import { MwebChatOption } from './MwebChatOption';
22
23
  import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
23
24
  import { useChatBlacklist, useIsPeerBlacklisted } from '../hooks/useChatBlacklist';
24
- import { useSetPinnedMessages } from '../hooks/useSetPinnedMessages';
25
+ import { usePinnedMessages } from '../hooks/usePinnedMessages';
25
26
  import { SESSION_STORE_KEY } from '../../common/constants';
26
27
 
27
28
  const iconStyle = { height: '1.125rem', width: '1.125rem' };
@@ -36,6 +37,7 @@ const tooltipBoxCSS = {
36
37
  export const ChatActions = ({
37
38
  showPinAction,
38
39
  onReply,
40
+ onReplyGroup,
39
41
  showReply,
40
42
  message,
41
43
  sentByLocalPeer,
@@ -45,6 +47,7 @@ export const ChatActions = ({
45
47
  }: {
46
48
  showPinAction: boolean;
47
49
  onReply: () => void;
50
+ onReplyGroup: () => void;
48
51
  showReply: boolean;
49
52
  message: HMSMessage;
50
53
  sentByLocalPeer: boolean;
@@ -53,16 +56,15 @@ export const ChatActions = ({
53
56
  setOpenSheet: (value: boolean) => void;
54
57
  }) => {
55
58
  const { elements } = useRoomLayoutConferencingScreen();
56
- const { can_hide_message, can_block_user } = elements?.chat?.real_time_controls || {
57
- can_hide_message: false,
58
- can_block_user: false,
59
- };
59
+ const { can_hide_message = false, can_block_user = false } = elements?.chat?.real_time_controls || {};
60
+ const { roles_whitelist = [] } = elements?.chat || {};
61
+
60
62
  const [open, setOpen] = useState(false);
61
63
  const actions = useHMSActions();
62
64
  const canRemoveOthers = useHMSStore(selectPermissions)?.removeOthers;
63
65
  const { blacklistItem: blacklistPeer } = useChatBlacklist(SESSION_STORE_KEY.CHAT_PEER_BLACKLIST);
64
66
  const localPeerName = useHMSStore(selectLocalPeerName);
65
- const { setPinnedMessages, unpinBlacklistedMessages } = useSetPinnedMessages();
67
+ const { setPinnedMessages, unpinBlacklistedMessages } = usePinnedMessages();
66
68
 
67
69
  const { blacklistItem: blacklistMessage, blacklistedIDs: blacklistedMessageIDs } = useChatBlacklist(
68
70
  SESSION_STORE_KEY.CHAT_MESSAGE_BLACKLIST,
@@ -104,12 +106,19 @@ export const ChatActions = ({
104
106
  }
105
107
  > = {
106
108
  reply: {
107
- text: message.recipientRoles?.length ? 'Reply to group' : 'Reply privately',
108
- tooltipText: message.recipientRoles?.length ? 'Reply to group' : 'Reply privately',
109
+ text: 'Reply privately',
110
+ tooltipText: 'Reply privately',
109
111
  icon: <ReplyIcon style={iconStyle} />,
110
112
  onClick: onReply,
111
113
  show: showReply,
112
114
  },
115
+ replyGroup: {
116
+ text: 'Reply to group',
117
+ tooltipText: 'Reply to group',
118
+ icon: <ReplyGroupIcon style={iconStyle} />,
119
+ onClick: onReplyGroup,
120
+ show: !!message.senderRole && roles_whitelist.includes(message.senderRole),
121
+ },
113
122
  pin: {
114
123
  text: 'Pin message',
115
124
  tooltipText: 'Pin',
@@ -213,6 +222,7 @@ export const ChatActions = ({
213
222
  p: '$2',
214
223
  opacity: open ? 1 : 0,
215
224
  position: 'absolute',
225
+ top: 0,
216
226
  right: 0,
217
227
  zIndex: 1,
218
228
  '@md': { opacity: 1 },
@@ -225,6 +235,13 @@ export const ChatActions = ({
225
235
  </IconButton>
226
236
  </Tooltip>
227
237
  ) : null}
238
+ {options.replyGroup.show ? (
239
+ <Tooltip boxCss={tooltipBoxCSS} title={options.replyGroup.tooltipText}>
240
+ <IconButton data-testid="reply_group_message_btn" onClick={options.replyGroup.onClick}>
241
+ {options.replyGroup.icon}
242
+ </IconButton>
243
+ </Tooltip>
244
+ ) : null}
228
245
  {options.pin.show ? (
229
246
  <Tooltip boxCss={tooltipBoxCSS} title={options.pin.tooltipText}>
230
247
  <IconButton data-testid="pin_message_btn" onClick={options.pin.onClick}>
@@ -8,6 +8,7 @@ import {
8
8
  HMSRoleName,
9
9
  selectHMSMessages,
10
10
  selectLocalPeerID,
11
+ selectLocalPeerName,
11
12
  selectLocalPeerRoleName,
12
13
  selectPeerNameByID,
13
14
  selectSessionStore,
@@ -16,6 +17,7 @@ import {
16
17
  useHMSStore,
17
18
  useHMSVanillaStore,
18
19
  } from '@100mslive/react-sdk';
20
+ import { SolidPinIcon } from '@100mslive/react-icons';
19
21
  import { Box, Flex } from '../../../Layout';
20
22
  import { Text } from '../../../Text';
21
23
  import { config as cssConfig, styled } from '../../../Theme';
@@ -25,6 +27,7 @@ import { EmptyChat } from './EmptyChat';
25
27
  import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
26
28
  // @ts-ignore: No implicit Any
27
29
  import { useSetSubscribedChatSelector } from '../AppData/useUISettings';
30
+ import { usePinnedBy } from '../hooks/usePinnedBy';
28
31
  import { CHAT_SELECTOR, SESSION_STORE_KEY } from '../../common/constants';
29
32
 
30
33
  const formatTime = (date: Date) => {
@@ -45,13 +48,25 @@ function getRowHeight(index: number) {
45
48
  }
46
49
 
47
50
  const setRowHeight = (index: number, id: string, size: number) => {
48
- if (rowHeights[index]?.id === id && rowHeights[index]?.size) {
51
+ if (rowHeights[index]?.id === id && rowHeights[index]?.size === size) {
49
52
  return;
50
53
  }
51
54
  listInstance?.resetAfterIndex(Math.max(index - 1, 0));
52
55
  Object.assign(rowHeights, { [index]: { size, id } });
53
56
  };
54
57
 
58
+ const getMessageBackgroundColor = (
59
+ messageType: string,
60
+ selectedPeerID: string,
61
+ selectedRole: string,
62
+ isOverlay: boolean,
63
+ ) => {
64
+ if (messageType && !(selectedPeerID || selectedRole)) {
65
+ return isOverlay ? 'rgba(0, 0, 0, 0.64)' : '$surface_default';
66
+ }
67
+ return '';
68
+ };
69
+
55
70
  const MessageTypeContainer = ({ left, right }: { left?: string; right?: string }) => {
56
71
  return (
57
72
  <Flex
@@ -166,7 +181,6 @@ const ChatMessage = React.memo(
166
181
  const rowRef = useRef<HTMLDivElement | null>(null);
167
182
  const isMobile = useMedia(cssConfig.media.md);
168
183
  const isPrivateChatEnabled = !!elements?.chat?.private_chat_enabled;
169
- const roleWhiteList = elements?.chat?.roles_whitelist || [];
170
184
  const isOverlay = elements?.chat?.is_overlay && isMobile;
171
185
  const localPeerId = useHMSStore(selectLocalPeerID);
172
186
  const [selectedRole, setRoleSelector] = useSetSubscribedChatSelector(CHAT_SELECTOR.ROLE);
@@ -177,13 +191,7 @@ const ChatMessage = React.memo(
177
191
  });
178
192
  const [openSheet, setOpenSheet] = useState(false);
179
193
  const showPinAction = !!elements?.chat?.allow_pinning_messages;
180
- let showReply = false;
181
- if (message.recipientRoles && roleWhiteList.includes(message.recipientRoles[0])) {
182
- showReply = true;
183
- } else if (message.sender !== selectedPeer.id && message.sender !== localPeerId && isPrivateChatEnabled) {
184
- showReply = true;
185
- }
186
-
194
+ const showReply = message.sender !== selectedPeer.id && message.sender !== localPeerId && isPrivateChatEnabled;
187
195
  useLayoutEffect(() => {
188
196
  if (rowRef.current) {
189
197
  setRowHeight(index, message.id, rowRef.current.clientHeight);
@@ -208,12 +216,7 @@ const ChatMessage = React.memo(
208
216
  flexWrap: 'wrap',
209
217
  position: 'relative',
210
218
  // Theme independent color, token should not be used for transparent chat
211
- bg:
212
- messageType && !(selectedPeer.id || selectedRole)
213
- ? isOverlay
214
- ? 'rgba(0, 0, 0, 0.64)'
215
- : '$surface_default'
216
- : undefined,
219
+ background: getMessageBackgroundColor(messageType, selectedPeer.id, selectedRole, !!isOverlay),
217
220
  r: '$1',
218
221
  p: '$4',
219
222
  userSelect: 'none',
@@ -231,6 +234,7 @@ const ChatMessage = React.memo(
231
234
  }
232
235
  }}
233
236
  >
237
+ <PinnedBy messageId={message.id} index={index} rowRef={rowRef} />
234
238
  <Text
235
239
  css={{
236
240
  color: isOverlay ? '#FFF' : '$on_surface_high',
@@ -258,7 +262,7 @@ const ChatMessage = React.memo(
258
262
  variant="sub2"
259
263
  css={{ color: isOverlay ? '#FFF' : '$on_surface_high', fontWeight: '$semiBold' }}
260
264
  >
261
- {message.senderName}
265
+ {message.sender === localPeerId ? `${message.senderName} (You)` : message.senderName}
262
266
  </SenderName>
263
267
  </Tooltip>
264
268
  )}
@@ -291,12 +295,13 @@ const ChatMessage = React.memo(
291
295
  message={message}
292
296
  sentByLocalPeer={message.sender === localPeerId}
293
297
  onReply={() => {
294
- if (message.recipientRoles?.length) {
295
- setRoleSelector(message.recipientRoles[0]);
298
+ setRoleSelector('');
299
+ setPeerSelector({ id: message.sender, name: message.senderName });
300
+ }}
301
+ onReplyGroup={() => {
302
+ if (message.senderRole) {
303
+ setRoleSelector(message.senderRole);
296
304
  setPeerSelector({});
297
- } else {
298
- setRoleSelector('');
299
- setPeerSelector({ id: message.sender, name: message.senderName });
300
305
  }
301
306
  }}
302
307
  showReply={showReply}
@@ -424,3 +429,41 @@ export const ChatBody = React.forwardRef<VariableSizeList, { scrollToBottom: (co
424
429
  return <VirtualizedChatMessages messages={filteredMessages} ref={listRef} scrollToBottom={scrollToBottom} />;
425
430
  },
426
431
  );
432
+
433
+ const PinnedBy = ({
434
+ messageId,
435
+ index,
436
+ rowRef,
437
+ }: {
438
+ messageId: string;
439
+ index: number;
440
+ rowRef?: React.MutableRefObject<HTMLDivElement | null>;
441
+ }) => {
442
+ const pinnedBy = usePinnedBy(messageId);
443
+ const localPeerName = useHMSStore(selectLocalPeerName);
444
+
445
+ useLayoutEffect(() => {
446
+ if (rowRef?.current) {
447
+ if (pinnedBy) {
448
+ rowRef.current.style.background =
449
+ 'linear-gradient(277deg, var(--hms-ui-colors-surface_default) 0%, var(--hms-ui-colors-surface_dim) 60.87%)';
450
+ } else {
451
+ rowRef.current.style.background = '';
452
+ }
453
+ setRowHeight(index, messageId, rowRef?.current.clientHeight);
454
+ }
455
+ }, [index, messageId, pinnedBy, rowRef]);
456
+
457
+ if (!pinnedBy) {
458
+ return null;
459
+ }
460
+
461
+ return (
462
+ <Flex align="center" css={{ gap: '$2', mb: '$2', color: '$on_surface_low' }}>
463
+ <SolidPinIcon height={12} width={12} />
464
+ <Text variant="xs" css={{ color: 'inherit' }}>
465
+ Pinned by {localPeerName === pinnedBy ? 'you' : pinnedBy}
466
+ </Text>
467
+ </Flex>
468
+ );
469
+ };
@@ -214,6 +214,7 @@ export const ChatFooter = ({ onSend, children }: { onSend: (count: number) => vo
214
214
  '&:valid ~ .send-msg': { color: '$on_surface_high' },
215
215
  '& ~ .send-msg': { color: '$on_surface_low' },
216
216
  '&::placeholder': { color: '$on_surface_medium' },
217
+ border: 'none',
217
218
  }}
218
219
  placeholder={message_placeholder}
219
220
  ref={inputRef}
@@ -11,7 +11,7 @@ import { ArrowNavigation } from './ArrowNavigation';
11
11
  import { AnnotisedMessage } from './ChatBody';
12
12
  import { StickIndicator } from './StickIndicator';
13
13
  import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
14
- import { useSetPinnedMessages } from '../hooks/useSetPinnedMessages';
14
+ import { usePinnedMessages } from '../hooks/usePinnedMessages';
15
15
  import { SESSION_STORE_KEY } from '../../common/constants';
16
16
 
17
17
  const PINNED_MESSAGE_LENGTH = 75;
@@ -19,7 +19,7 @@ const PINNED_MESSAGE_LENGTH = 75;
19
19
  export const PinnedMessage = () => {
20
20
  const pinnedMessages = useHMSStore(selectSessionStore(SESSION_STORE_KEY.PINNED_MESSAGES));
21
21
  const [pinnedMessageIndex, setPinnedMessageIndex] = useState(0);
22
- const { removePinnedMessage } = useSetPinnedMessages();
22
+ const { removePinnedMessage } = usePinnedMessages();
23
23
  const isMobile = useMedia(cssConfig.media.md);
24
24
 
25
25
  const { elements } = useRoomLayoutConferencingScreen();
@@ -5,12 +5,10 @@ import {
5
5
  ChevronDownIcon,
6
6
  ChevronUpIcon,
7
7
  MusicIcon,
8
- PencilDrawIcon,
9
8
  ShareScreenIcon,
10
9
  VideoPlayerIcon,
11
10
  } from '@100mslive/react-icons';
12
11
  import { Box, Dropdown, Flex, Text, Tooltip } from '../../../';
13
- import { useWhiteboardMetadata } from '../../plugins/whiteboard/useWhiteboardMetadata';
14
12
  import { useUISettings } from '../AppData/useUISettings';
15
13
  import { usePlaylistMusic } from '../hooks/usePlaylistMusic';
16
14
  import { useScreenshareAudio } from '../hooks/useScreenshareAudio';
@@ -57,16 +55,9 @@ export const AdditionalRoomState = () => {
57
55
  const { screenSharingPeerName, screenSharingPeerId, screenShareVideoTrackId } = useScreenShare();
58
56
 
59
57
  const isVideoScreenSharingOn = !!screenShareVideoTrackId;
60
- const { whiteboardOwner, amIWhiteboardOwner, toggleWhiteboard } = useWhiteboardMetadata();
61
58
  const shouldShowScreenShareState = isAudioOnly && isVideoScreenSharingOn;
62
59
  const shouldShowVideoState = isAudioOnly && isVideoPlayListPlaying;
63
- if (
64
- isPlaylistInactive &&
65
- isAudioshareInactive &&
66
- !shouldShowScreenShareState &&
67
- !shouldShowVideoState &&
68
- !whiteboardOwner
69
- ) {
60
+ if (isPlaylistInactive && isAudioshareInactive && !shouldShowScreenShareState && !shouldShowVideoState) {
70
61
  return null;
71
62
  }
72
63
 
@@ -112,13 +103,6 @@ export const AdditionalRoomState = () => {
112
103
  </Flex>
113
104
  </Tooltip>
114
105
  )}
115
- {whiteboardOwner && (
116
- <Tooltip title="Whiteboard">
117
- <Flex align="center" css={{ color: '$on_primary_high', mx: '$2' }}>
118
- <PencilDrawIcon width={24} height={24} />
119
- </Flex>
120
- </Tooltip>
121
- )}
122
106
  <Box css={{ '@lg': { display: 'none' }, color: '$on_surface_low' }}>
123
107
  {open ? <ChevronUpIcon /> : <ChevronDownIcon />}
124
108
  </Box>
@@ -190,27 +174,6 @@ export const AdditionalRoomState = () => {
190
174
  </Text>
191
175
  </Dropdown.Item>
192
176
  )}
193
- {whiteboardOwner && (
194
- <Dropdown.Item css={{ color: '$on_primary_high' }}>
195
- <PencilDrawIcon width={24} height={24} />
196
- <Text variant="sm" css={{ ml: '$2', flex: '1 1 0' }}>
197
- Whiteboard Owner - {whiteboardOwner.name}
198
- {amIWhiteboardOwner && '(You)'}
199
- </Text>
200
- {amIWhiteboardOwner && (
201
- <Text
202
- variant="sm"
203
- css={{ color: '$alert_error_default', ml: '$2', cursor: 'pointer' }}
204
- onClick={e => {
205
- e.preventDefault();
206
- toggleWhiteboard();
207
- }}
208
- >
209
- Stop
210
- </Text>
211
- )}
212
- </Dropdown.Item>
213
- )}
214
177
  </Dropdown.Content>
215
178
  </Dropdown.Root>
216
179
  );
@@ -1,6 +1,6 @@
1
1
  import React, { useCallback, useEffect, useRef, useState } from 'react';
2
2
  import { useMedia } from 'react-use';
3
- import { HMSRecordingState } from '@100mslive/hms-video';
3
+ import { HMSRecordingState } from '@100mslive/hms-video-store';
4
4
  import {
5
5
  HMSRoomState,
6
6
  selectHLSState,
@@ -1,5 +1,5 @@
1
1
  // @ts-check
2
- import React, { useMemo, useState } from 'react';
2
+ import React, { useEffect, useMemo, useRef, useState } from 'react';
3
3
  import {
4
4
  selectLocalPeerRoleName,
5
5
  selectPermissions,
@@ -74,6 +74,14 @@ const AddMenu = () => {
74
74
  const { setPollState } = usePollViewState();
75
75
  const [interactionType, setInteractionType] = useState(INTERACTION_TYPE.POLL);
76
76
 
77
+ const inputRef = useRef(null);
78
+
79
+ useEffect(() => {
80
+ if (inputRef.current) {
81
+ inputRef.current.focus();
82
+ }
83
+ }, [interactionType]);
84
+
77
85
  const handleCreate = id => {
78
86
  setPollState({
79
87
  [POLL_STATE.pollInView]: id,
@@ -117,7 +125,9 @@ const AddMenu = () => {
117
125
  <Flex direction="column">
118
126
  <Text variant="body2" css={{ mb: '$4' }}>{`Name this ${interactionType.toLowerCase()}`}</Text>
119
127
  <Input
128
+ ref={inputRef}
120
129
  type="text"
130
+ placeholder="Enter a name to continue"
121
131
  value={title}
122
132
  onChange={event => setTitle(event.target.value)}
123
133
  css={{
@@ -5,7 +5,15 @@ import { Box, Flex } from '../../../../Layout';
5
5
  import { Dialog } from '../../../../Modal';
6
6
  import { Text } from '../../../../Text';
7
7
 
8
- export const DeleteQuestionModal = ({ open, setOpen, removeQuestion }) => {
8
+ export const DeleteQuestionModal = ({
9
+ open,
10
+ setOpen,
11
+ removeQuestion,
12
+ }: {
13
+ open: boolean;
14
+ setOpen: React.Dispatch<React.SetStateAction<boolean>>;
15
+ removeQuestion: () => void;
16
+ }) => {
9
17
  return (
10
18
  <Dialog.Root open={open}>
11
19
  <Dialog.Overlay />