@100mslive/roomkit-react 0.1.1 → 0.1.2-alpha.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 (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
  }