@100mslive/roomkit-react 0.1.1 → 0.1.2-alpha.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (242) hide show
  1. package/README.md +18 -0
  2. package/dist/Accordion/Accordion.d.ts +62 -138
  3. package/dist/Accordion/index.d.ts +62 -138
  4. package/dist/{ActiveSpeakerView-G32BDM5F.js → ActiveSpeakerView-4XPIRZOK.js} +6 -6
  5. package/dist/{ActiveSpeakerView-LW4WDBC6.css → ActiveSpeakerView-ADEYHQMU.css} +2 -2
  6. package/dist/{PinnedTrackView-OAA4HAID.css.map → ActiveSpeakerView-ADEYHQMU.css.map} +2 -2
  7. package/dist/Avatar/Avatar.d.ts +31 -69
  8. package/dist/Button/Button.d.ts +31 -69
  9. package/dist/Checkbox/Checkbox.d.ts +62 -138
  10. package/dist/Collapsible/Collapsible.d.ts +93 -207
  11. package/dist/Divider/Divider.d.ts +62 -138
  12. package/dist/Dropdown/Dropdown.d.ts +372 -828
  13. package/dist/Fieldset/Fieldset.d.ts +31 -69
  14. package/dist/Footer/Footer.d.ts +248 -552
  15. package/dist/{HLSView-DIQQF2PP.css → HLSView-DWEEMZ6Z.css} +2 -2
  16. package/dist/{HLSView-DIQQF2PP.css.map → HLSView-DWEEMZ6Z.css.map} +2 -2
  17. package/dist/{HLSView-ZYNT3HJD.js → HLSView-I26CVF5U.js} +16 -16
  18. package/dist/HLSView-I26CVF5U.js.map +7 -0
  19. package/dist/IconButton/IconButton.d.ts +31 -69
  20. package/dist/Input/Input.d.ts +189 -417
  21. package/dist/Label/Label.d.ts +31 -69
  22. package/dist/Layout/Box.d.ts +31 -69
  23. package/dist/Layout/Flex.d.ts +31 -69
  24. package/dist/Link/Link.d.ts +31 -69
  25. package/dist/Modal/Dialog.d.ts +248 -552
  26. package/dist/Modal/DialogContent.d.ts +217 -483
  27. package/dist/Pagination/StyledPagination.d.ts +124 -276
  28. package/dist/{PinnedTrackView-OAA4HAID.css → PinnedTrackView-5DPVVOZW.css} +2 -2
  29. package/dist/{conference-LE4T3ZNF.css.map → PinnedTrackView-5DPVVOZW.css.map} +2 -2
  30. package/dist/{PinnedTrackView-GTXL2UTS.js → PinnedTrackView-GGTCNH5V.js} +6 -6
  31. package/dist/Popover/index.d.ts +93 -207
  32. package/dist/Prebuilt/provider/roomLayoutProvider/constants/index.d.ts +2 -0
  33. package/dist/Prebuilt/provider/roomLayoutProvider/hooks/useFetchRoomLayout.d.ts +9 -0
  34. package/dist/Prebuilt/provider/roomLayoutProvider/index.d.ts +9 -0
  35. package/dist/Progress/index.d.ts +62 -138
  36. package/dist/RadioGroup/RadioGroup.d.ts +93 -207
  37. package/dist/ReactSelect/ReactSelect.d.ts +310 -690
  38. package/dist/Select/Select.d.ts +93 -207
  39. package/dist/Slider/Slider.d.ts +31 -69
  40. package/dist/Stats/StyledStats.d.ts +186 -414
  41. package/dist/Switch/Switch.d.ts +31 -69
  42. package/dist/Tabs/Tabs.d.ts +124 -276
  43. package/dist/Text/Text.d.ts +31 -69
  44. package/dist/Theme/ThemeProvider.d.ts +63 -140
  45. package/dist/Theme/base.config.d.ts +31 -53
  46. package/dist/Theme/index.d.ts +0 -1
  47. package/dist/Theme/stitches.config.d.ts +404 -915
  48. package/dist/TileMenu/StyledMenuTile.d.ts +217 -483
  49. package/dist/Toast/Toast.d.ts +187 -415
  50. package/dist/Video/Video.d.ts +31 -69
  51. package/dist/VideoList/StyledVideoList.d.ts +93 -207
  52. package/dist/VideoTile/StyledVideoTile.d.ts +279 -621
  53. package/dist/{VirtualBackground-HWU22Q6S.js → VirtualBackground-ZRRE4DUA.js} +4 -3
  54. package/dist/{VirtualBackground-HWU22Q6S.js.map → VirtualBackground-ZRRE4DUA.js.map} +2 -2
  55. package/dist/{chunk-4VY5NUK7.js → chunk-4ISMCWQA.js} +49 -146
  56. package/dist/chunk-4ISMCWQA.js.map +7 -0
  57. package/dist/{chunk-TEHZYXCJ.js → chunk-KKLZ7K2L.js} +167 -164
  58. package/dist/chunk-KKLZ7K2L.js.map +7 -0
  59. package/dist/chunk-LUND6FLY.js +8626 -0
  60. package/dist/chunk-LUND6FLY.js.map +7 -0
  61. package/dist/chunk-MYK3T45M.js +58 -0
  62. package/dist/chunk-MYK3T45M.js.map +7 -0
  63. package/dist/{chunk-A2PNZIK7.js → chunk-THORW2WT.js} +4 -4
  64. package/dist/{chunk-A2PNZIK7.js.map → chunk-THORW2WT.js.map} +1 -1
  65. package/dist/{conference-YHO2J3Z6.js → conference-5TDUAQ6K.js} +593 -532
  66. package/dist/conference-5TDUAQ6K.js.map +7 -0
  67. package/dist/{conference-LE4T3ZNF.css → conference-BDCDGBIS.css} +2 -2
  68. package/dist/{ActiveSpeakerView-LW4WDBC6.css.map → conference-BDCDGBIS.css.map} +2 -2
  69. package/dist/index.cjs.css +1 -1
  70. package/dist/index.cjs.css.map +2 -2
  71. package/dist/index.cjs.js +2952 -2662
  72. package/dist/index.cjs.js.map +4 -4
  73. package/dist/index.css +1 -1
  74. package/dist/index.css.map +2 -2
  75. package/dist/index.js +4 -8
  76. package/dist/meta.cjs.json +750 -484
  77. package/dist/meta.esbuild.json +844 -581
  78. package/dist/{transcription-L6VBK75V.js → transcription-PYTSSAOB.js} +3 -3
  79. package/package.json +13 -9
  80. package/src/Accordion/Accordion.tsx +3 -3
  81. package/src/AudioLevel/AudioLevel.tsx +1 -1
  82. package/src/Avatar/Avatar.tsx +8 -3
  83. package/src/Button/Button.tsx +76 -20
  84. package/src/Checkbox/Checkbox.tsx +4 -4
  85. package/src/Collapsible/Collapsible.tsx +1 -1
  86. package/src/Divider/Divider.tsx +2 -2
  87. package/src/Divider/HorizontalDivider.stories.tsx +2 -2
  88. package/src/Divider/VerticalDivider.stories.tsx +1 -1
  89. package/src/Dropdown/Dropdown.stories.tsx +3 -3
  90. package/src/Dropdown/Dropdown.tsx +16 -14
  91. package/src/IconButton/IconButton.tsx +8 -7
  92. package/src/Input/Input.tsx +9 -8
  93. package/src/Input/PasswordInput.stories.tsx +2 -2
  94. package/src/Label/Label.tsx +1 -1
  95. package/src/Link/Link.tsx +4 -4
  96. package/src/Loading/Loading.tsx +7 -10
  97. package/src/Modal/Dialog.stories.tsx +2 -2
  98. package/src/Modal/DialogContent.tsx +3 -3
  99. package/src/Pagination/StyledPagination.tsx +4 -4
  100. package/src/Popover/Popover.stories.tsx +5 -5
  101. package/src/Popover/index.tsx +1 -1
  102. package/src/Prebuilt/App.jsx +101 -68
  103. package/src/Prebuilt/IconButton.jsx +2 -2
  104. package/src/Prebuilt/Prebuilt.stories.tsx +8 -2
  105. package/src/Prebuilt/common/constants.js +0 -1
  106. package/src/Prebuilt/common/utils.js +0 -6
  107. package/src/Prebuilt/components/AppData/AppData.jsx +7 -4
  108. package/src/Prebuilt/components/AppData/useUISettings.js +0 -4
  109. package/src/Prebuilt/components/AudioVideoToggle.jsx +73 -20
  110. package/src/Prebuilt/components/BottomActionSheet/BottomActionSheet.jsx +1 -1
  111. package/src/Prebuilt/components/Chat/Chat.jsx +6 -2
  112. package/src/Prebuilt/components/Chat/ChatBody.jsx +13 -11
  113. package/src/Prebuilt/components/Chat/ChatFooter.jsx +2 -2
  114. package/src/Prebuilt/components/Chat/ChatHeader.jsx +3 -3
  115. package/src/Prebuilt/components/Chat/ChatSelector.jsx +2 -2
  116. package/src/Prebuilt/components/Chat/useEmojiPickerStyles.js +6 -6
  117. package/src/Prebuilt/components/Chip.jsx +24 -0
  118. package/src/Prebuilt/components/Connection/ConnectionIndicator.jsx +6 -6
  119. package/src/Prebuilt/components/Connection/TileConnection.jsx +2 -2
  120. package/src/Prebuilt/components/Connection/connectionQualityUtils.js +4 -4
  121. package/src/Prebuilt/components/EmojiReaction.jsx +13 -10
  122. package/src/Prebuilt/components/ErrorBoundary.jsx +2 -2
  123. package/src/Prebuilt/components/FullPageProgress.jsx +5 -3
  124. package/src/Prebuilt/components/GoLiveButton.jsx +1 -4
  125. package/src/Prebuilt/components/HMSVideo/HLSQualitySelector.jsx +2 -2
  126. package/src/Prebuilt/components/HMSVideo/PlayButton.jsx +1 -1
  127. package/src/Prebuilt/components/HMSVideo/VideoProgress.jsx +3 -3
  128. package/src/Prebuilt/components/HMSVideo/VideoTime.jsx +3 -1
  129. package/src/Prebuilt/components/HMSVideo/VolumeControl.jsx +1 -1
  130. package/src/Prebuilt/components/Header/AdditionalRoomState.jsx +17 -17
  131. package/src/Prebuilt/components/Header/AmbientMusic.jsx +1 -1
  132. package/src/Prebuilt/components/Header/ConferencingHeader.jsx +4 -6
  133. package/src/Prebuilt/components/Header/HeaderComponents.jsx +10 -5
  134. package/src/Prebuilt/components/Header/ParticipantFilter.jsx +2 -2
  135. package/src/Prebuilt/components/Header/ParticipantList.jsx +2 -2
  136. package/src/Prebuilt/components/Header/StreamActions.jsx +9 -19
  137. package/src/Prebuilt/components/Header/StreamingHeader.jsx +5 -6
  138. package/src/Prebuilt/components/HlsStatsOverlay.jsx +2 -2
  139. package/src/Prebuilt/components/IconButtonWithOptions/IconButtonWithOptions.jsx +102 -0
  140. package/src/Prebuilt/components/IconButtonWithOptions/IconButtonWithOptions.stories.tsx +40 -0
  141. package/src/Prebuilt/components/LeaveRoom.jsx +11 -11
  142. package/src/Prebuilt/components/MetaActions.jsx +2 -2
  143. package/src/Prebuilt/components/MoreSettings/BulkRoleChangeModal.jsx +2 -2
  144. package/src/Prebuilt/components/MoreSettings/ChangeSelfRole.jsx +1 -1
  145. package/src/Prebuilt/components/MoreSettings/MoreSettings.jsx +1 -0
  146. package/src/Prebuilt/components/Notifications/HLSFailureModal.jsx +69 -0
  147. package/src/Prebuilt/components/Notifications/Notifications.jsx +1 -3
  148. package/src/Prebuilt/components/Notifications/PermissionErrorModal.jsx +108 -26
  149. package/src/Prebuilt/components/Notifications/ReconnectNotifications.jsx +1 -1
  150. package/src/Prebuilt/components/PIP/pipUtils.js +2 -2
  151. package/src/Prebuilt/components/Playlist/Playlist.jsx +4 -4
  152. package/src/Prebuilt/components/Playlist/PlaylistControls.jsx +3 -3
  153. package/src/Prebuilt/components/Playlist/PlaylistItem.jsx +3 -3
  154. package/src/Prebuilt/components/Playlist/VideoPlayer.jsx +4 -4
  155. package/src/Prebuilt/components/PostLeave.jsx +4 -4
  156. package/src/Prebuilt/components/Preview/PreviewContainer.jsx +17 -6
  157. package/src/Prebuilt/components/Preview/PreviewForm.jsx +74 -0
  158. package/src/Prebuilt/components/Preview/PreviewJoin.jsx +100 -37
  159. package/src/Prebuilt/components/RoleChangeModal.jsx +3 -3
  160. package/src/Prebuilt/components/ScreenshareDisplay.jsx +2 -2
  161. package/src/Prebuilt/components/Settings/DeviceSettings.jsx +3 -9
  162. package/src/Prebuilt/components/Settings/SettingsModal.jsx +8 -32
  163. package/src/Prebuilt/components/Settings/StartRecording.jsx +4 -12
  164. package/src/Prebuilt/components/Settings/SwitchWithLabel.jsx +2 -3
  165. package/src/Prebuilt/components/Settings/common.js +26 -0
  166. package/src/Prebuilt/components/StatsForNerds.jsx +5 -5
  167. package/src/Prebuilt/components/Streaming/Common.jsx +11 -11
  168. package/src/Prebuilt/components/Streaming/HLSStreaming.jsx +6 -12
  169. package/src/Prebuilt/components/Streaming/RTMPStreaming.jsx +4 -6
  170. package/src/Prebuilt/components/Streaming/StreamingLanding.jsx +4 -4
  171. package/src/Prebuilt/components/TileMenu.jsx +7 -7
  172. package/src/Prebuilt/components/Toast/ToastConfig.jsx +12 -20
  173. package/src/Prebuilt/components/conference.jsx +9 -2
  174. package/src/Prebuilt/components/hooks/useDropdownSelection.jsx +1 -4
  175. package/src/Prebuilt/components/pdfAnnotator/pdfErrorView.jsx +2 -2
  176. package/src/Prebuilt/components/pdfAnnotator/pdfFileOptions.jsx +1 -1
  177. package/src/Prebuilt/components/pdfAnnotator/pdfHeader.jsx +1 -1
  178. package/src/Prebuilt/components/pdfAnnotator/pdfInfo.jsx +2 -2
  179. package/src/Prebuilt/components/pdfAnnotator/shareScreenOptions.jsx +12 -20
  180. package/src/Prebuilt/components/pdfAnnotator/uploadedFile.jsx +4 -4
  181. package/src/Prebuilt/images/Logo.svg +8 -0
  182. package/src/Prebuilt/images/first_person.png +0 -0
  183. package/src/Prebuilt/images/rtmp.png +0 -0
  184. package/src/Prebuilt/index.d.ts +6 -1
  185. package/src/Prebuilt/layouts/HLSView.jsx +1 -1
  186. package/src/Prebuilt/layouts/InsetView.jsx +0 -3
  187. package/src/Prebuilt/layouts/NonPublisherView.jsx +2 -2
  188. package/src/Prebuilt/layouts/SidePane.jsx +1 -1
  189. package/src/Prebuilt/layouts/WaitingView.jsx +2 -2
  190. package/src/Prebuilt/layouts/mainView.jsx +42 -5
  191. package/src/Prebuilt/plugins/FlyingEmoji.jsx +2 -2
  192. package/src/Prebuilt/plugins/VirtualBackground/VirtualBackground.jsx +1 -0
  193. package/src/Prebuilt/plugins/whiteboard/ToggleWhiteboard.jsx +1 -3
  194. package/src/Prebuilt/primitives/DialogContent.jsx +4 -4
  195. package/src/Prebuilt/primitives/DropdownTrigger.jsx +3 -3
  196. package/src/Prebuilt/provider/roomLayoutProvider/constants/index.ts +33 -0
  197. package/src/Prebuilt/provider/roomLayoutProvider/hooks/useFetchRoomLayout.ts +57 -0
  198. package/src/Prebuilt/provider/roomLayoutProvider/index.tsx +26 -0
  199. package/src/Progress/index.tsx +2 -2
  200. package/src/RadioGroup/RadioGroup.tsx +3 -3
  201. package/src/ReactSelect/ReactSelect.stories.tsx +7 -7
  202. package/src/ReactSelect/ReactSelect.tsx +8 -8
  203. package/src/Select/Select.tsx +6 -6
  204. package/src/Slider/Slider.tsx +5 -5
  205. package/src/Stats/Stats.tsx +12 -2
  206. package/src/Stats/StyledStats.tsx +3 -3
  207. package/src/Switch/Switch.tsx +5 -5
  208. package/src/Tabs/Tabs.stories.tsx +2 -2
  209. package/src/Tabs/Tabs.tsx +2 -2
  210. package/src/Text/Text.tsx +2 -2
  211. package/src/Theme/ThemeProvider.tsx +4 -7
  212. package/src/Theme/ThemeStory.jsx +17 -19
  213. package/src/Theme/base.config.ts +31 -59
  214. package/src/Theme/index.tsx +0 -1
  215. package/src/Theme/stitches.config.ts +2 -7
  216. package/src/TileMenu/StyledMenuTile.tsx +9 -8
  217. package/src/Toast/Toast.tsx +10 -9
  218. package/src/Tooltip/Tooltip.stories.tsx +1 -1
  219. package/src/Tooltip/Tooltip.tsx +4 -4
  220. package/src/Video/Video.tsx +1 -1
  221. package/src/VideoTile/StyledVideoTile.tsx +12 -12
  222. package/src/assets/android-perm-0.png +0 -0
  223. package/src/assets/android-perm-1.png +0 -0
  224. package/src/assets/ios-perm-0.png +0 -0
  225. package/src/fixtures/chats.ts +1 -1
  226. package/dist/HLSView-ZYNT3HJD.js.map +0 -7
  227. package/dist/Theme/themes.d.ts +0 -64
  228. package/dist/chunk-4VY5NUK7.js.map +0 -7
  229. package/dist/chunk-BSQIN5RC.js +0 -65
  230. package/dist/chunk-BSQIN5RC.js.map +0 -7
  231. package/dist/chunk-TEHZYXCJ.js.map +0 -7
  232. package/dist/chunk-ZET2HMGS.js +0 -8331
  233. package/dist/chunk-ZET2HMGS.js.map +0 -7
  234. package/dist/conference-YHO2J3Z6.js.map +0 -7
  235. package/src/Prebuilt/components/Preview/PreviewName.jsx +0 -37
  236. package/src/Prebuilt/components/Streaming/RTMPIcon.jsx +0 -69
  237. package/src/Prebuilt/hms.js +0 -7
  238. package/src/Prebuilt/plugins/confetti.jsx +0 -60
  239. package/src/Theme/themes.ts +0 -70
  240. /package/dist/{ActiveSpeakerView-G32BDM5F.js.map → ActiveSpeakerView-4XPIRZOK.js.map} +0 -0
  241. /package/dist/{PinnedTrackView-GTXL2UTS.js.map → PinnedTrackView-GGTCNH5V.js.map} +0 -0
  242. /package/dist/{transcription-L6VBK75V.js.map → transcription-PYTSSAOB.js.map} +0 -0
@@ -1,16 +1,14 @@
1
1
  import React from 'react';
2
- import { Flex, VerticalDivider } from '../../../';
3
- import { Logo, SpeakerTag } from './HeaderComponents';
2
+ import { Flex } from '../../../';
3
+ import { SpeakerTag } from './HeaderComponents';
4
4
  import { ParticipantCount } from './ParticipantList';
5
5
  import { StreamActions } from './StreamActions';
6
6
 
7
- export const ConferencingHeader = ({ isPreview }) => {
7
+ export const ConferencingHeader = () => {
8
8
  return (
9
9
  <Flex justify="between" align="center" css={{ position: 'relative', height: '100%' }}>
10
10
  <Flex align="center" css={{ position: 'absolute', left: '$10' }}>
11
- <Logo />
12
- <VerticalDivider css={{ ml: '$8' }} />
13
- {!isPreview ? <SpeakerTag /> : null}
11
+ <SpeakerTag />
14
12
  </Flex>
15
13
 
16
14
  <Flex
@@ -3,13 +3,17 @@ import { useMedia } from 'react-use';
3
3
  import { selectDominantSpeaker, selectIsConnectedToRoom, useHMSStore } from '@100mslive/react-sdk';
4
4
  import { VolumeOneIcon } from '@100mslive/react-icons';
5
5
  import { config as cssConfig, Flex, styled, Text, textEllipsis } from '../../../';
6
- import { useLogo } from '../AppData/useUISettings';
6
+ import { useRoomLayout } from '../../provider/roomLayoutProvider';
7
7
  import { isStreamingKit } from '../../common/utils';
8
8
 
9
9
  export const SpeakerTag = () => {
10
10
  const dominantSpeaker = useHMSStore(selectDominantSpeaker);
11
11
  return dominantSpeaker && dominantSpeaker.name ? (
12
- <Flex align="center" justify="center" css={{ flex: '1 1 0', color: '$textPrimary', '@md': { display: 'none' } }}>
12
+ <Flex
13
+ align="center"
14
+ justify="center"
15
+ css={{ flex: '1 1 0', color: '$on_primary_high', '@md': { display: 'none' } }}
16
+ >
13
17
  <VolumeOneIcon />
14
18
  <Text variant="md" css={{ ...textEllipsis(200), ml: '$2' }} title={dominantSpeaker.name}>
15
19
  {dominantSpeaker.name}
@@ -22,20 +26,21 @@ export const SpeakerTag = () => {
22
26
 
23
27
  const LogoImg = styled('img', {
24
28
  maxHeight: '$14',
25
- p: '$2',
26
29
  w: 'auto',
30
+ objectFit: 'contain',
27
31
  '@md': {
28
32
  maxHeight: '$12',
29
33
  },
30
34
  });
31
35
 
32
36
  export const Logo = () => {
33
- const logo = useLogo();
37
+ const roomLayout = useRoomLayout();
38
+ const logo = roomLayout?.logo?.url;
34
39
  const isMobile = useMedia(cssConfig.media.md);
35
40
  const isConnected = useHMSStore(selectIsConnectedToRoom);
36
41
  // Hide logo for now as there is not enough space
37
42
  if (isConnected && isMobile && isStreamingKit()) {
38
43
  return null;
39
44
  }
40
- return logo ? <LogoImg src={logo} alt="Brand Logo" width={132} height={40} /> : null;
45
+ return logo ? <LogoImg src={logo} alt="Brand Logo" /> : null;
41
46
  };
@@ -19,7 +19,7 @@ export const ParticipantFilter = ({ selection, onSelection, isConnected, roles }
19
19
  asChild
20
20
  data-testid="participant_list_filter"
21
21
  css={{
22
- border: '1px solid $textDisabled',
22
+ border: '1px solid $on_surface_low',
23
23
  r: '$0',
24
24
  p: '$2 $4',
25
25
  }}
@@ -29,7 +29,7 @@ export const ParticipantFilter = ({ selection, onSelection, isConnected, roles }
29
29
  <Text variant="sm" css={{ ...textEllipsis(80) }}>
30
30
  {selectionValue || 'Everyone'}
31
31
  </Text>
32
- <Box css={{ ml: '$2', color: '$textDisabled' }}>
32
+ <Box css={{ ml: '$2', color: '$on_surface_low' }}>
33
33
  {open ? <ChevronUpIcon width={14} height={14} /> : <ChevronDownIcon width={14} height={14} />}
34
34
  </Box>
35
35
  </Flex>
@@ -258,7 +258,7 @@ const ParticipantMoreActions = ({ onRoleChange, peerId }) => {
258
258
  }}
259
259
  >
260
260
  <RemoveUserIcon />
261
- <Text css={{ ml: '$4', color: '$error' }}>Remove Participant</Text>
261
+ <Text css={{ ml: '$4', color: '$alert_error_default' }}>Remove Participant</Text>
262
262
  </Dropdown.Item>
263
263
  )}
264
264
  </Dropdown.Content>
@@ -313,7 +313,7 @@ export const ParticipantSearch = ({ onSearch, placeholder }) => {
313
313
  left: '$4',
314
314
  top: '$2',
315
315
  transform: 'translateY(50%)',
316
- color: '$textMedEmp',
316
+ color: '$on_surface_medium',
317
317
  }}
318
318
  >
319
319
  <SearchIcon />
@@ -1,9 +1,10 @@
1
- import React, { Fragment, useEffect, useState } from 'react';
1
+ import React, { Fragment, useState } from 'react';
2
2
  import { useMedia } from 'react-use';
3
3
  import {
4
- selectAppData,
4
+ HMSRoomState,
5
5
  selectIsConnectedToRoom,
6
6
  selectPermissions,
7
+ selectRoomState,
7
8
  useHMSActions,
8
9
  useHMSStore,
9
10
  useRecordingStreaming,
@@ -15,7 +16,7 @@ import { ResolutionInput } from '../Streaming/ResolutionInput';
15
16
  import { getResolution } from '../Streaming/RTMPStreaming';
16
17
  import { ToastManager } from '../Toast/ToastManager';
17
18
  import { AdditionalRoomState, getRecordingText } from './AdditionalRoomState';
18
- import { useSidepaneState, useSidepaneToggle } from '../AppData/useSidepane';
19
+ import { useSidepaneToggle } from '../AppData/useSidepane';
19
20
  import { useSetAppDataByKey } from '../AppData/useUISettings';
20
21
  import { APP_DATA, RTMP_RECORD_DEFAULT_RESOLUTION, SIDE_PANE_OPTIONS } from '../../common/constants';
21
22
 
@@ -26,7 +27,7 @@ export const LiveStatus = () => {
26
27
  }
27
28
  return (
28
29
  <Flex align="center">
29
- <Box css={{ w: '$4', h: '$4', r: '$round', bg: '$error', mr: '$2' }} />
30
+ <Box css={{ w: '$4', h: '$4', r: '$round', bg: '$alert_error_default', mr: '$2' }} />
30
31
  <Text>
31
32
  Live
32
33
  <Text as="span" css={{ '@md': { display: 'none' } }}>
@@ -61,7 +62,7 @@ export const RecordingStatus = () => {
61
62
  >
62
63
  <Box
63
64
  css={{
64
- color: '$error',
65
+ color: '$alert_error_default',
65
66
  }}
66
67
  >
67
68
  <RecordIcon width={24} height={24} />
@@ -72,16 +73,6 @@ export const RecordingStatus = () => {
72
73
 
73
74
  const EndStream = () => {
74
75
  const toggleStreaming = useSidepaneToggle(SIDE_PANE_OPTIONS.STREAMING);
75
- const sidePane = useSidepaneState();
76
- useEffect(() => {
77
- if (window && !sidePane) {
78
- const userStartedStream = window.sessionStorage.getItem('userStartedStream');
79
- if (userStartedStream === 'true') {
80
- toggleStreaming();
81
- window.sessionStorage.setItem('userStartedStream', '');
82
- }
83
- }
84
- }, [sidePane, toggleStreaming]);
85
76
 
86
77
  return (
87
78
  <Button data-testid="end_stream" variant="danger" icon onClick={toggleStreaming}>
@@ -93,7 +84,6 @@ const EndStream = () => {
93
84
 
94
85
  const StartRecording = () => {
95
86
  const permissions = useHMSStore(selectPermissions);
96
- const recordingUrl = useHMSStore(selectAppData(APP_DATA.recordingUrl));
97
87
  const [resolution, setResolution] = useState(RTMP_RECORD_DEFAULT_RESOLUTION);
98
88
  const [open, setOpen] = useState(false);
99
89
  const [recordingStarted, setRecordingState] = useSetAppDataByKey(APP_DATA.recordingStarted);
@@ -115,7 +105,7 @@ const StartRecording = () => {
115
105
  </Popover.Trigger>
116
106
  <Popover.Portal>
117
107
  <Popover.Content align="end" sideOffset={8} css={{ w: '$64' }}>
118
- <Text variant="body" css={{ color: '$textMedEmp' }}>
108
+ <Text variant="body" css={{ color: '$on_surface_medium' }}>
119
109
  Are you sure you want to end the recording?
120
110
  </Text>
121
111
  <Button
@@ -175,7 +165,6 @@ const StartRecording = () => {
175
165
  try {
176
166
  setRecordingState(true);
177
167
  await hmsActions.startRTMPOrRecording({
178
- meetingURL: recordingUrl,
179
168
  resolution: getResolution(resolution),
180
169
  record: true,
181
170
  });
@@ -208,12 +197,13 @@ export const StreamActions = () => {
208
197
  const permissions = useHMSStore(selectPermissions);
209
198
  const isMobile = useMedia(cssConfig.media.md);
210
199
  const { isStreamingOn } = useRecordingStreaming();
200
+ const roomState = useHMSStore(selectRoomState);
211
201
 
212
202
  return (
213
203
  <Flex align="center" css={{ gap: '$4' }}>
214
204
  <AdditionalRoomState />
215
205
  <Flex align="center" css={{ gap: '$4', '@md': { display: 'none' } }}>
216
- <LiveStatus />
206
+ {roomState !== HMSRoomState.Preview ? <LiveStatus /> : null}
217
207
  <RecordingStatus />
218
208
  </Flex>
219
209
  {isConnected && !isMobile ? <StartRecording /> : null}
@@ -4,11 +4,11 @@ import { config as cssConfig, Flex } from '../../../';
4
4
  import { EmojiReaction } from '../EmojiReaction';
5
5
  import { LeaveRoom } from '../LeaveRoom';
6
6
  import MetaActions from '../MetaActions';
7
- import { Logo, SpeakerTag } from './HeaderComponents';
7
+ import { SpeakerTag } from './HeaderComponents';
8
8
  import { ParticipantCount } from './ParticipantList';
9
9
  import { LiveStatus, RecordingStatus, StreamActions } from './StreamActions';
10
10
 
11
- export const StreamingHeader = ({ isPreview }) => {
11
+ export const StreamingHeader = () => {
12
12
  const isMobile = useMedia(cssConfig.media.md);
13
13
  return (
14
14
  <Flex justify="between" align="center" css={{ position: 'relative', height: '100%' }}>
@@ -19,15 +19,14 @@ export const StreamingHeader = ({ isPreview }) => {
19
19
  left: '$10',
20
20
  }}
21
21
  >
22
- <Logo />
23
- {isMobile && (
22
+ {isMobile ? (
24
23
  <Flex align="center" gap={2}>
25
24
  <LeaveRoom />
26
25
  <LiveStatus />
27
26
  <RecordingStatus />
28
27
  </Flex>
29
- )}
30
- {!isPreview ? <SpeakerTag /> : null}
28
+ ) : null}
29
+ <SpeakerTag />
31
30
  </Flex>
32
31
 
33
32
  <Flex
@@ -13,7 +13,7 @@ export function HlsStatsOverlay({ hlsStatsState, onClose }) {
13
13
  marginLeft: '$8',
14
14
  padding: '$8 $8 $10',
15
15
  zIndex: 10,
16
- backgroundColor: 'rgba(55,59,66, 0.84)',
16
+ backgroundColor: '$surface_brighter',
17
17
  borderRadius: '$1',
18
18
  }}
19
19
  direction="column"
@@ -44,7 +44,7 @@ export function HlsStatsOverlay({ hlsStatsState, onClose }) {
44
44
  <HlsStatsRow label="distance from live">
45
45
  {getDurationFromSeconds(hlsStatsState.distanceFromLive / 1000)}
46
46
  </HlsStatsRow>
47
- <HlsStatsRow label="Dropped frames">{`${hlsStatsState?.droppedFrames}`}</HlsStatsRow>
47
+ <HlsStatsRow label="Dropped frames">{hlsStatsState?.droppedFrames}</HlsStatsRow>
48
48
  </Flex>
49
49
  );
50
50
  }
@@ -0,0 +1,102 @@
1
+ import { VerticalMenuIcon } from '@100mslive/react-icons';
2
+ import { Dropdown } from '../../../Dropdown';
3
+ import { Box, Flex } from '../../../Layout';
4
+ import { styled } from '../../../Theme';
5
+ import { Tooltip } from '../../../Tooltip';
6
+ import IconButton from '../../IconButton';
7
+
8
+ const IconSection = styled(IconButton, {
9
+ w: 'unset',
10
+ h: '$14',
11
+ p: '$4',
12
+ r: '$1',
13
+ borderTopRightRadius: 0,
14
+ borderColor: '$border_default',
15
+ borderBottomRightRadius: 0,
16
+ '@md': {
17
+ mx: 0,
18
+ borderTopRightRadius: '$1',
19
+ borderBottomRightRadius: '$1',
20
+ },
21
+ });
22
+
23
+ const OptionsSection = styled(IconButton, {
24
+ w: 'unset',
25
+ h: '$14',
26
+ p: '$4',
27
+ r: '$1',
28
+ borderTopLeftRadius: 0,
29
+ borderColor: '$border_default',
30
+ borderBottomLeftRadius: 0,
31
+ borderLeftWidth: 0,
32
+ '&:not([disabled]):focus-visible': {
33
+ boxShadow: 'none',
34
+ },
35
+ '@md': {
36
+ display: 'none',
37
+ },
38
+ });
39
+
40
+ export const IconButtonWithOptions = ({
41
+ tooltipMessage = '',
42
+ icon,
43
+ options = [],
44
+ active,
45
+ onClick = () => {
46
+ return;
47
+ },
48
+ key = '',
49
+ }) => {
50
+ const bgCss = { backgroundColor: active ? '$transparent' : '$secondary_dim' };
51
+ const iconCss = { color: active ? '$on_surface_high' : '$on_primary_high' };
52
+ return (
53
+ <Flex>
54
+ <IconSection css={bgCss} onClick={onClick} key={key}>
55
+ <Tooltip disabled={!tooltipMessage} title={tooltipMessage}>
56
+ <Flex align="center" justify="center" css={iconCss}>
57
+ {icon}
58
+ </Flex>
59
+ </Tooltip>
60
+ </IconSection>
61
+ <Dropdown.Root>
62
+ <Dropdown.Trigger asChild>
63
+ <OptionsSection css={bgCss}>
64
+ <Tooltip title="View Options">
65
+ <Box css={iconCss}>
66
+ <VerticalMenuIcon />
67
+ </Box>
68
+ </Tooltip>
69
+ </OptionsSection>
70
+ </Dropdown.Trigger>
71
+ <Dropdown.Content
72
+ sideOffset={5}
73
+ align="center"
74
+ css={{
75
+ w: '$64',
76
+ maxHeight: '$96',
77
+ p: 0,
78
+ border: 'none',
79
+ }}
80
+ >
81
+ {options.map((option, index) => (
82
+ <Dropdown.Item
83
+ key={option.title}
84
+ css={{
85
+ flexDirection: 'column',
86
+ alignItems: 'flex-start',
87
+ backgroundColor: option.active ? '$surface_bright' : '$surface_dim',
88
+ borderTop: index === 0 ? 'none' : '1px solid $border_default',
89
+ '&:hover': {
90
+ cursor: 'pointer',
91
+ },
92
+ p: '0',
93
+ }}
94
+ >
95
+ {option.content}
96
+ </Dropdown.Item>
97
+ ))}
98
+ </Dropdown.Content>
99
+ </Dropdown.Root>
100
+ </Flex>
101
+ );
102
+ };
@@ -0,0 +1,40 @@
1
+ import React from 'react';
2
+ import { Meta } from '@storybook/react';
3
+ import { MicIcon } from '@100mslive/react-icons';
4
+ import { Box } from '../../../Layout';
5
+ import { Text } from '../../../Text';
6
+ import { IconButtonWithOptions } from './IconButtonWithOptions';
7
+
8
+ export default {
9
+ title: 'Components/IconButtonWithOptions',
10
+ component: IconButtonWithOptions,
11
+ argTypes: {
12
+ tooltipMessage: { control: 'text' },
13
+ icon: { control: 'object' },
14
+ options: { control: 'object' },
15
+ active: { control: 'boolean' },
16
+ onClick: { control: 'function' },
17
+ key: { control: 'string' },
18
+ },
19
+ } as Meta;
20
+
21
+ const Template = args => (
22
+ <Box css={{ ml: '$20', bg: '$background_dim', p: '$8' }}>
23
+ <IconButtonWithOptions {...args} />
24
+ </Box>
25
+ );
26
+
27
+ export const Default = Template.bind({});
28
+ Default.args = {
29
+ tooltipMessage: 'Click me!',
30
+ icon: <MicIcon height={32} width={32} />,
31
+ options: [
32
+ { title: 'Option 1', content: <Text>Some content</Text> },
33
+ { title: 'Option 2', content: <Text>Some more content</Text> },
34
+ ],
35
+ active: true,
36
+ onClick: () => {
37
+ return;
38
+ },
39
+ key: '',
40
+ };
@@ -89,7 +89,7 @@ export const LeaveRoom = () => {
89
89
  asChild
90
90
  css={{
91
91
  '&[data-state="open"]': {
92
- bg: '$errorDark',
92
+ bg: '$alert_error_dim',
93
93
  },
94
94
  }}
95
95
  >
@@ -106,27 +106,27 @@ export const LeaveRoom = () => {
106
106
  data-testid="end_room_btn"
107
107
  >
108
108
  <Flex gap={4}>
109
- <Box css={{ color: '$error' }}>
109
+ <Box css={{ color: '$alert_error_default' }}>
110
110
  <AlertTriangleIcon />
111
111
  </Box>
112
112
  <Flex direction="column" align="start">
113
- <Text variant="lg" css={{ c: '$error' }}>
113
+ <Text variant="lg" css={{ c: '$alert_error_default' }}>
114
114
  End Room for All
115
115
  </Text>
116
- <Text variant="sm" css={{ c: '$textMedEmp', mt: '$2' }}>
116
+ <Text variant="sm" css={{ c: '$on_surface_medium', mt: '$2' }}>
117
117
  Warning: You can’t undo this action
118
118
  </Text>
119
119
  </Flex>
120
120
  </Flex>
121
121
  </Dropdown.Item>
122
- <Dropdown.Item css={{ bg: '$surfaceDefault' }} onClick={leaveRoom} data-testid="just_leave_btn">
122
+ <Dropdown.Item css={{ bg: '$surface_default' }} onClick={leaveRoom} data-testid="just_leave_btn">
123
123
  <Flex gap={4}>
124
124
  <Box>
125
125
  <ExitIcon />
126
126
  </Box>
127
127
  <Flex direction="column" align="start">
128
128
  <Text variant="lg">Leave {isStreamKit ? 'Studio' : 'Room'}</Text>
129
- <Text variant="sm" css={{ c: '$textMedEmp', mt: '$2' }}>
129
+ <Text variant="sm" css={{ c: '$on_surface_medium', mt: '$2' }}>
130
130
  You can always rejoin later
131
131
  </Text>
132
132
  </Flex>
@@ -174,16 +174,16 @@ export const LeaveRoom = () => {
174
174
  };
175
175
 
176
176
  const LeaveIconButton = styled(IconButton, {
177
- color: '$white',
177
+ color: '$on_primary_high',
178
178
  h: '$14',
179
179
  px: '$8',
180
180
  r: '$1',
181
- bg: '$error',
181
+ bg: '$alert_error_default',
182
182
  '&:not([disabled]):hover': {
183
- bg: '$errorTint',
183
+ bg: '$alert_error_default',
184
184
  },
185
185
  '&:not([disabled]):active': {
186
- bg: '$errorTint',
186
+ bg: '$alert_error_default',
187
187
  },
188
188
  '@md': {
189
189
  px: '$4',
@@ -192,7 +192,7 @@ const LeaveIconButton = styled(IconButton, {
192
192
  });
193
193
 
194
194
  const MenuTriggerButton = styled(LeaveIconButton, {
195
- borderLeft: '1px solid $errorDark',
195
+ borderLeft: '1px solid $alert_error_dim',
196
196
  borderTopLeftRadius: 0,
197
197
  borderBottomLeftRadius: 0,
198
198
  px: '$3',
@@ -25,14 +25,14 @@ const MetaActions = ({ isMobile = false, compact = false }) => {
25
25
  <IconButton
26
26
  onClick={toggleHandRaise}
27
27
  active={!isHandRaised}
28
- data-testid={`${isMobile ? 'raise_hand_btn_mobile' : 'raise_hand_btn'}`}
28
+ data-testid={isMobile ? 'raise_hand_btn_mobile' : 'raise_hand_btn'}
29
29
  >
30
30
  <HandIcon />
31
31
  </IconButton>
32
32
  </Tooltip>
33
33
  )}
34
34
  {isBRBEnabled && (
35
- <Tooltip title={`${isBRBOn ? `I'm back` : `I'll be right back`}`}>
35
+ <Tooltip title={isBRBOn ? `I'm back` : `I'll be right back`}>
36
36
  <IconButton onClick={toggleBRB} active={!isBRBOn} data-testid="brb_btn">
37
37
  <BrbIcon />
38
38
  </IconButton>
@@ -121,7 +121,7 @@ export const BulkRoleChangeModal = ({ onOpenChange }) => {
121
121
  </DialogRow>
122
122
  <DialogRow>
123
123
  {errorMessage && (
124
- <Flex gap={2} css={{ c: '$error', w: '70%', ml: 'auto' }}>
124
+ <Flex gap={2} css={{ c: '$alert_error_default', w: '70%', ml: 'auto' }}>
125
125
  <AlertTriangleIcon />
126
126
  <Text css={{ c: 'inherit' }}>{errorMessage}</Text>
127
127
  </Flex>
@@ -129,7 +129,7 @@ export const BulkRoleChangeModal = ({ onOpenChange }) => {
129
129
  </DialogRow>
130
130
  <DialogRow justify="end">
131
131
  <Button variant="primary" onClick={changeBulkRole} disabled={!(selectedRole && selectedBulkRole.length > 0)}>
132
- {isSubmiting && <Loading css={{ color: '$textSecondary' }} />}
132
+ {isSubmiting && <Loading css={{ color: '$on_primary_medium' }} />}
133
133
  Apply
134
134
  </Button>
135
135
  </DialogRow>
@@ -43,7 +43,7 @@ export const ChangeSelfRole = ({ onClick }) => {
43
43
  </Text>
44
44
  <ArrowRightIcon />
45
45
  </Dropdown.TriggerItem>
46
- <Dropdown.SubMenuContent sideOffset={8} alignOffset={-5} css={{ '@md': { w: '$64' } }}>
46
+ <Dropdown.SubMenuContent sideOffset={8} alignOffset={-5} css={{ py: '$0', '@md': { w: '$64' } }}>
47
47
  {availableSelfChangeRoles.map(role => (
48
48
  <Dropdown.Item
49
49
  key={role}
@@ -99,6 +99,7 @@ export const MoreSettings = () => {
99
99
  sideOffset={5}
100
100
  align="center"
101
101
  css={{
102
+ py: '$0',
102
103
  maxHeight: '$96',
103
104
  '@md': { w: '$64' },
104
105
  "div[role='separator']:first-child": {
@@ -0,0 +1,69 @@
1
+ import React, { useCallback, useState } from 'react';
2
+ import { selectHLSState, useHMSActions, useHMSStore } from '@100mslive/react-sdk';
3
+ import { Button } from '../../../Button';
4
+ import { Flex } from '../../../Layout';
5
+ import { Dialog } from '../../../Modal';
6
+ import { Text } from '../../../Text';
7
+ import { useSetAppDataByKey } from '../AppData/useUISettings';
8
+ import { APP_DATA } from '../../common/constants';
9
+
10
+ export function HLSFailureModal() {
11
+ const { hlsError } = useHMSStore(selectHLSState).error || false;
12
+ const [openModal, setOpenModal] = useState(!!hlsError);
13
+ const hmsActions = useHMSActions();
14
+ const [isHLSStarted, setHLSStarted] = useSetAppDataByKey(APP_DATA.hlsStarted);
15
+ const startHLS = useCallback(async () => {
16
+ try {
17
+ if (isHLSStarted) {
18
+ return;
19
+ }
20
+ setHLSStarted(true);
21
+ await hmsActions.startHLSStreaming({});
22
+ } catch (error) {
23
+ if (error.message.includes('invalid input')) {
24
+ await startHLS();
25
+ return;
26
+ }
27
+ setHLSStarted(false);
28
+ }
29
+ }, [hmsActions, isHLSStarted, setHLSStarted]);
30
+
31
+ return hlsError ? (
32
+ <Dialog.Root
33
+ open={openModal}
34
+ onOpenChange={value => {
35
+ if (!value) {
36
+ setOpenModal(false);
37
+ }
38
+ }}
39
+ >
40
+ <Dialog.Portal>
41
+ <Dialog.Overlay />
42
+ <Dialog.Content css={{ w: 'min(360px, 90%)' }}>
43
+ <Dialog.Title
44
+ css={{
45
+ display: 'flex',
46
+ alignItems: 'center',
47
+ justifyContent: 'space-between',
48
+ borderBottom: '1px solid $border_default',
49
+ mt: '$4',
50
+ }}
51
+ >
52
+ <Text variant="h6" css={{ fontWeight: '$semiBold' }}>
53
+ Failed to Go Live
54
+ </Text>
55
+ </Dialog.Title>
56
+ <Text variant="sm" css={{ mb: '$10', color: '$on_surface_medium' }}>
57
+ Something went wrong and your live broadcast failed. Please try again.
58
+ </Text>
59
+ <Flex align="center" justify="between" css={{ w: '100%', gap: '$8' }}>
60
+ <Button outlined variant="standard" css={{ w: '100%' }} onClick={() => setOpenModal(false)}>
61
+ Dismiss
62
+ </Button>
63
+ <Button css={{ w: '100%' }}>Go Live</Button>
64
+ </Flex>
65
+ </Dialog.Content>
66
+ </Dialog.Portal>
67
+ </Dialog.Root>
68
+ ) : null;
69
+ }
@@ -59,8 +59,6 @@ export function Notifications() {
59
59
  inlineAction: true,
60
60
  action: (
61
61
  <Button
62
- as="div"
63
- variant="primary"
64
62
  onClick={() => {
65
63
  ToastManager.removeToast(toastId);
66
64
  window.location.reload();
@@ -81,7 +79,7 @@ export function Notifications() {
81
79
  }, 2000);
82
80
  return;
83
81
  }
84
- // Autoplay error or user denied screen share(cancelled browser pop-up)
82
+ // Autoplay error or user denied screen share (cancelled browser pop-up)
85
83
  if (notification.data?.code === 3008 || notification.data?.code === 3001 || notification.data?.code === 3011) {
86
84
  return;
87
85
  }