@100mslive/roomkit-react 0.1.20-alpha.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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 />