@100mslive/roomkit-react 0.1.4 → 0.1.6-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 (197) hide show
  1. package/dist/{HLSView-CTAJQUU4.js → HLSView-PY2FKWX3.js} +191 -123
  2. package/dist/HLSView-PY2FKWX3.js.map +7 -0
  3. package/dist/Prebuilt/App.d.ts +3 -0
  4. package/dist/Prebuilt/AppContext.d.ts +13 -0
  5. package/dist/Prebuilt/common/PeersSorter.d.ts +21 -0
  6. package/dist/Prebuilt/components/Footer/Footer.d.ts +6 -0
  7. package/dist/Prebuilt/components/Header/Header.d.ts +2 -0
  8. package/dist/Prebuilt/components/InsetTile.d.ts +2 -0
  9. package/dist/Prebuilt/components/Leave/DesktopLeaveRoom.d.ts +7 -0
  10. package/dist/Prebuilt/components/Leave/EndSessionContent.d.ts +8 -0
  11. package/dist/Prebuilt/components/Leave/LeaveAtoms.d.ts +2196 -0
  12. package/dist/Prebuilt/components/Leave/LeaveCard.d.ts +12 -0
  13. package/dist/Prebuilt/components/Leave/LeaveRoom.d.ts +5 -0
  14. package/dist/Prebuilt/components/Leave/LeaveSessionContent.d.ts +6 -0
  15. package/dist/Prebuilt/components/Leave/MwebLeaveRoom.d.ts +7 -0
  16. package/dist/Prebuilt/components/MoreSettings/MoreSettings.d.ts +6 -0
  17. package/dist/Prebuilt/components/MoreSettings/SplitComponents/DesktopOptions.d.ts +6 -0
  18. package/dist/Prebuilt/components/Pagination.d.ts +6 -0
  19. package/dist/Prebuilt/components/Preview/PreviewForm.d.ts +10 -0
  20. package/dist/Prebuilt/components/SecondaryTiles.d.ts +3 -0
  21. package/dist/Prebuilt/components/VideoLayouts/EqualProminence.d.ts +3 -0
  22. package/dist/Prebuilt/components/VideoLayouts/Grid.d.ts +5 -0
  23. package/dist/Prebuilt/components/VideoLayouts/GridLayout.d.ts +10 -0
  24. package/dist/Prebuilt/components/VideoLayouts/ProminenceLayout.d.ts +12 -0
  25. package/dist/Prebuilt/components/VideoLayouts/RoleProminence.d.ts +3 -0
  26. package/dist/Prebuilt/components/VideoLayouts/ScreenshareLayout.d.ts +3 -0
  27. package/dist/Prebuilt/components/VideoLayouts/interface.d.ts +8 -0
  28. package/dist/Prebuilt/components/hooks/useRoleProminencePeers.d.ts +5 -0
  29. package/dist/Prebuilt/components/hooks/useTileLayout.d.ts +12 -0
  30. package/dist/Prebuilt/components/hooks/useVideoTileLayout.d.ts +11 -0
  31. package/dist/Prebuilt/layouts/SidePane.d.ts +6 -0
  32. package/dist/Prebuilt/layouts/VideoStreamingSection.d.ts +6 -0
  33. package/dist/Prebuilt/plugins/whiteboard/ToggleWhiteboard.d.ts +5 -0
  34. package/dist/Prebuilt/provider/roomLayoutProvider/hooks/useFetchRoomLayout.d.ts +1 -0
  35. package/dist/Prebuilt/provider/roomLayoutProvider/hooks/useInsetEnabled.d.ts +1 -0
  36. package/dist/Prebuilt/provider/roomLayoutProvider/hooks/useRoomLayoutScreen.d.ts +17 -0
  37. package/dist/Prebuilt/provider/roomLayoutProvider/index.d.ts +6 -1
  38. package/dist/{VirtualBackground-GGGBJYVY.js → VirtualBackground-AYDHYLIZ.js} +5 -11
  39. package/dist/VirtualBackground-AYDHYLIZ.js.map +7 -0
  40. package/dist/{chunk-TJNDX446.js → chunk-E2M2ZSOL.js} +8 -5
  41. package/dist/chunk-E2M2ZSOL.js.map +7 -0
  42. package/dist/chunk-GQD2AGWW.js +888 -0
  43. package/dist/chunk-GQD2AGWW.js.map +7 -0
  44. package/dist/{chunk-L2SX7GBO.js → chunk-RXTHJUMZ.js} +2462 -4738
  45. package/dist/chunk-RXTHJUMZ.js.map +7 -0
  46. package/dist/conference-V2XZGTKU.js +5927 -0
  47. package/dist/conference-V2XZGTKU.js.map +7 -0
  48. package/dist/index.cjs.js +9414 -15534
  49. package/dist/index.cjs.js.map +4 -4
  50. package/dist/index.js +2 -2
  51. package/dist/meta.cjs.json +2156 -3347
  52. package/dist/meta.esbuild.json +2601 -3885
  53. package/package.json +7 -7
  54. package/src/Button/Button.tsx +2 -2
  55. package/src/Prebuilt/App.tsx +49 -33
  56. package/src/Prebuilt/{AppContext.jsx → AppContext.tsx} +11 -3
  57. package/src/Prebuilt/IconButton.jsx +1 -0
  58. package/src/Prebuilt/Prebuilt.stories.tsx +1 -0
  59. package/src/Prebuilt/common/{PeersSorter.js → PeersSorter.ts} +15 -10
  60. package/src/Prebuilt/common/constants.js +3 -112
  61. package/src/Prebuilt/common/hooks.js +34 -1
  62. package/src/Prebuilt/common/utils.js +0 -8
  63. package/src/Prebuilt/components/AppData/AppData.jsx +3 -13
  64. package/src/Prebuilt/components/AppData/useUISettings.js +0 -4
  65. package/src/Prebuilt/components/AudioVideoToggle.jsx +6 -0
  66. package/src/Prebuilt/components/AuthToken.jsx +11 -42
  67. package/src/Prebuilt/components/Chat/Chat.jsx +57 -26
  68. package/src/Prebuilt/components/Chat/ChatBody.jsx +92 -32
  69. package/src/Prebuilt/components/Chat/ChatFooter.jsx +72 -48
  70. package/src/Prebuilt/components/Chat/ChatParticipantHeader.jsx +73 -0
  71. package/src/Prebuilt/components/Chat/ChatSelector.jsx +16 -17
  72. package/src/Prebuilt/components/Chat/ChatSelectorContainer.jsx +81 -0
  73. package/src/Prebuilt/components/Connection/TileConnection.jsx +30 -12
  74. package/src/Prebuilt/components/EmojiReaction.jsx +18 -17
  75. package/src/Prebuilt/components/Footer/ChatToggle.jsx +1 -7
  76. package/src/Prebuilt/components/Footer/Footer.tsx +89 -0
  77. package/src/Prebuilt/components/Footer/ParticipantList.jsx +213 -173
  78. package/src/Prebuilt/components/Footer/RoleAccordion.jsx +78 -0
  79. package/src/Prebuilt/components/HMSVideo/Controls.jsx +2 -2
  80. package/src/Prebuilt/components/HMSVideo/HLSQualitySelector.jsx +33 -10
  81. package/src/Prebuilt/components/HMSVideo/PlayButton.jsx +1 -1
  82. package/src/Prebuilt/components/HMSVideo/VideoTime.jsx +3 -3
  83. package/src/Prebuilt/components/HMSVideo/VolumeControl.jsx +38 -9
  84. package/src/Prebuilt/components/Header/{ConferencingHeader.jsx → Header.tsx} +9 -7
  85. package/src/Prebuilt/components/Header/HeaderComponents.jsx +13 -4
  86. package/src/Prebuilt/components/Header/StreamActions.jsx +33 -60
  87. package/src/Prebuilt/components/Header/index.tsx +1 -0
  88. package/src/Prebuilt/components/IconButtonWithOptions/IconButtonWithOptions.jsx +17 -3
  89. package/src/Prebuilt/components/InsetTile.tsx +122 -0
  90. package/src/Prebuilt/components/{MoreSettings/SplitComponents/DesktopLeaveRoom.jsx → Leave/DesktopLeaveRoom.tsx} +50 -18
  91. package/src/Prebuilt/components/{EndSessionContent.jsx → Leave/EndSessionContent.tsx} +19 -9
  92. package/src/Prebuilt/components/Leave/LeaveAtoms.tsx +26 -0
  93. package/src/Prebuilt/components/{LeaveCard.jsx → Leave/LeaveCard.tsx} +22 -3
  94. package/src/Prebuilt/components/Leave/LeaveRoom.tsx +63 -0
  95. package/src/Prebuilt/components/{LeaveSessionContent.jsx → Leave/LeaveSessionContent.tsx} +13 -5
  96. package/src/Prebuilt/components/{MoreSettings/SplitComponents/MwebLeaveRoom.jsx → Leave/MwebLeaveRoom.tsx} +38 -13
  97. package/src/Prebuilt/components/MetaActions.jsx +15 -23
  98. package/src/Prebuilt/components/MoreSettings/ActionTile.jsx +5 -0
  99. package/src/Prebuilt/components/MoreSettings/ChangeNameContent.jsx +12 -7
  100. package/src/Prebuilt/components/MoreSettings/ChangeNameModal.jsx +1 -1
  101. package/src/Prebuilt/components/MoreSettings/FullScreenItem.jsx +1 -4
  102. package/src/Prebuilt/components/MoreSettings/MoreSettings.tsx +27 -0
  103. package/src/Prebuilt/components/MoreSettings/SplitComponents/{DesktopOptions.jsx → DesktopOptions.tsx} +86 -75
  104. package/src/Prebuilt/components/MoreSettings/SplitComponents/MwebOptions.jsx +20 -19
  105. package/src/Prebuilt/components/Notifications/HLSFailureModal.jsx +3 -1
  106. package/src/Prebuilt/components/Notifications/Notifications.jsx +18 -11
  107. package/src/Prebuilt/components/Notifications/PeerNotifications.jsx +14 -2
  108. package/src/Prebuilt/components/Notifications/PermissionErrorModal.jsx +10 -4
  109. package/src/Prebuilt/components/PIP/PIPComponent.jsx +7 -16
  110. package/src/Prebuilt/components/PIP/PIPManager.js +1 -0
  111. package/src/Prebuilt/components/{Pagination.jsx → Pagination.tsx} +35 -6
  112. package/src/Prebuilt/components/Playlist/Playlist.jsx +1 -6
  113. package/src/Prebuilt/components/PostLeave.jsx +7 -7
  114. package/src/Prebuilt/components/Preview/PreviewContainer.jsx +5 -13
  115. package/src/Prebuilt/components/Preview/{PreviewForm.jsx → PreviewForm.tsx} +14 -4
  116. package/src/Prebuilt/components/Preview/PreviewJoin.jsx +9 -7
  117. package/src/Prebuilt/components/RaiseHand.jsx +0 -7
  118. package/src/Prebuilt/components/RoleChangeRequestModal.jsx +82 -6
  119. package/src/Prebuilt/components/ScreenshareDisplay.jsx +4 -10
  120. package/src/Prebuilt/components/ScreenshareTile.jsx +41 -33
  121. package/src/Prebuilt/components/SecondaryTiles.tsx +34 -0
  122. package/src/Prebuilt/components/Settings/LayoutSettings.jsx +2 -12
  123. package/src/Prebuilt/components/Settings/NotificationSettings.jsx +3 -9
  124. package/src/Prebuilt/components/Settings/SettingsModal.jsx +3 -9
  125. package/src/Prebuilt/components/StatsForNerds.jsx +3 -1
  126. package/src/Prebuilt/components/TileMenu/TileMenu.jsx +15 -16
  127. package/src/Prebuilt/components/TileMenu/TileMenuContent.jsx +21 -19
  128. package/src/Prebuilt/components/Toast/ToastConfig.jsx +53 -11
  129. package/src/Prebuilt/components/VideoLayouts/EqualProminence.tsx +62 -0
  130. package/src/Prebuilt/components/VideoLayouts/Grid.tsx +41 -0
  131. package/src/Prebuilt/components/VideoLayouts/GridLayout.tsx +92 -0
  132. package/src/Prebuilt/components/VideoLayouts/ProminenceLayout.tsx +60 -0
  133. package/src/Prebuilt/components/VideoLayouts/RoleProminence.tsx +56 -0
  134. package/src/Prebuilt/components/VideoLayouts/ScreenshareLayout.tsx +36 -0
  135. package/src/Prebuilt/components/VideoLayouts/interface.ts +9 -0
  136. package/src/Prebuilt/components/VideoTile.jsx +93 -43
  137. package/src/Prebuilt/components/conference.jsx +24 -20
  138. package/src/Prebuilt/components/hooks/useMetadata.jsx +7 -0
  139. package/src/Prebuilt/components/hooks/useRoleProminencePeers.tsx +38 -0
  140. package/src/Prebuilt/components/hooks/useTileLayout.tsx +121 -0
  141. package/src/Prebuilt/components/hooks/useVideoTileLayout.ts +22 -0
  142. package/src/Prebuilt/components/pdfAnnotator/pdfFileOptions.jsx +5 -72
  143. package/src/Prebuilt/components/pdfAnnotator/submitPdf.jsx +4 -45
  144. package/src/Prebuilt/components/pdfAnnotator/uploadedFile.jsx +2 -17
  145. package/src/Prebuilt/components/peerTileUtils.jsx +1 -1
  146. package/src/Prebuilt/images/empty-chat.svg +12 -0
  147. package/src/Prebuilt/layouts/EmbedView.jsx +17 -40
  148. package/src/Prebuilt/layouts/HLSView.jsx +83 -66
  149. package/src/Prebuilt/layouts/PDFView.jsx +1 -11
  150. package/src/Prebuilt/layouts/SidePane.tsx +96 -0
  151. package/src/Prebuilt/layouts/{mainView.jsx → VideoStreamingSection.tsx} +38 -47
  152. package/src/Prebuilt/layouts/WhiteboardView.jsx +10 -34
  153. package/src/Prebuilt/plugins/VirtualBackground/VirtualBackground.jsx +1 -4
  154. package/src/Prebuilt/plugins/whiteboard/{ToggleWhiteboard.jsx → ToggleWhiteboard.tsx} +5 -9
  155. package/src/Prebuilt/primitives/DialogContent.jsx +15 -11
  156. package/src/Prebuilt/provider/roomLayoutProvider/constants/index.ts +17 -2
  157. package/src/Prebuilt/provider/roomLayoutProvider/hooks/useFetchRoomLayout.ts +36 -13
  158. package/src/Prebuilt/provider/roomLayoutProvider/hooks/useInsetEnabled.ts +10 -0
  159. package/src/Prebuilt/provider/roomLayoutProvider/hooks/useRoomLayoutScreen.ts +65 -0
  160. package/src/Prebuilt/provider/roomLayoutProvider/index.tsx +17 -6
  161. package/dist/HLSView-CTAJQUU4.js.map +0 -7
  162. package/dist/PinnedTrackView-CQKONH4O.js +0 -102
  163. package/dist/PinnedTrackView-CQKONH4O.js.map +0 -7
  164. package/dist/VirtualBackground-GGGBJYVY.js.map +0 -7
  165. package/dist/chunk-I2FJWE74.js +0 -827
  166. package/dist/chunk-I2FJWE74.js.map +0 -7
  167. package/dist/chunk-L2SX7GBO.js.map +0 -7
  168. package/dist/chunk-NOKIGB6Y.js +0 -1100
  169. package/dist/chunk-NOKIGB6Y.js.map +0 -7
  170. package/dist/chunk-TJNDX446.js.map +0 -7
  171. package/dist/conference-OEO7VOJD.js +0 -8995
  172. package/dist/conference-OEO7VOJD.js.map +0 -7
  173. package/src/Prebuilt/components/Chat/ChatHeader.jsx +0 -67
  174. package/src/Prebuilt/components/EqualProminence.jsx +0 -180
  175. package/src/Prebuilt/components/FirstPersonDisplay.jsx +0 -50
  176. package/src/Prebuilt/components/Footer/Footer.jsx +0 -73
  177. package/src/Prebuilt/components/Header/Header.jsx +0 -8
  178. package/src/Prebuilt/components/Header/StreamingHeader.jsx +0 -54
  179. package/src/Prebuilt/components/LeaveRoom.jsx +0 -94
  180. package/src/Prebuilt/components/MoreSettings/MoreSettings.jsx +0 -10
  181. package/src/Prebuilt/components/Notifications/MessageNotifications.jsx +0 -25
  182. package/src/Prebuilt/components/gridView.jsx +0 -85
  183. package/src/Prebuilt/components/hooks/useFeatures.js +0 -22
  184. package/src/Prebuilt/components/hooks/useNavigation.js +0 -19
  185. package/src/Prebuilt/components/hooks/useSkipPreview.jsx +0 -20
  186. package/src/Prebuilt/components/pdfAnnotator/pdfErrorView.jsx +0 -29
  187. package/src/Prebuilt/images/Logo.svg +0 -8
  188. package/src/Prebuilt/layouts/ActiveSpeakerView.jsx +0 -34
  189. package/src/Prebuilt/layouts/InsetView.jsx +0 -260
  190. package/src/Prebuilt/layouts/PinnedTrackView.jsx +0 -59
  191. package/src/Prebuilt/layouts/SidePane.jsx +0 -52
  192. package/src/Prebuilt/layouts/mainGridView.jsx +0 -98
  193. package/src/Prebuilt/layouts/screenShareView.jsx +0 -183
  194. /package/{src/Prebuilt/components/Header/index.jsx → dist/Prebuilt/components/Header/index.d.ts} +0 -0
  195. /package/src/Prebuilt/components/{ScreenShare.jsx → ScreenShareToggle.jsx} +0 -0
  196. /package/src/{assets → Prebuilt/images}/android-perm-1.png +0 -0
  197. /package/src/{assets → Prebuilt/images}/ios-perm-0.png +0 -0
@@ -1,8 +1,7 @@
1
- import React, { Suspense, useRef, useState } from 'react';
1
+ import React, { useRef, useState } from 'react';
2
2
  import { useClickAway } from 'react-use';
3
3
  import {
4
4
  selectIsConnectedToRoom,
5
- selectIsLocalVideoEnabled,
6
5
  selectPeerCount,
7
6
  selectPermissions,
8
7
  useHMSActions,
@@ -13,7 +12,7 @@ import { CrossIcon, DragHandleIcon, EmojiIcon, PeopleIcon, RecordIcon, SettingsI
13
12
  import { Box, Loading, Tooltip } from '../../../../';
14
13
  import { Sheet } from '../../../../Sheet';
15
14
  import IconButton from '../../../IconButton';
16
- import { EmojiCard } from '../../Footer/EmojiCard';
15
+ import { EmojiReaction } from '../../EmojiReaction';
17
16
  import { StopRecordingInSheet } from '../../Header/StreamActions';
18
17
  import SettingsModal from '../../Settings/SettingsModal';
19
18
  import { ToastManager } from '../../Toast/ToastManager';
@@ -25,7 +24,7 @@ import { useDropdownList } from '../../hooks/useDropdownList';
25
24
  import { getFormattedCount } from '../../../common/utils';
26
25
  import { SIDE_PANE_OPTIONS } from '../../../common/constants';
27
26
 
28
- const VirtualBackground = React.lazy(() => import('../../../plugins/VirtualBackground/VirtualBackground'));
27
+ // const VirtualBackground = React.lazy(() => import('../../../plugins/VirtualBackground/VirtualBackground'));
29
28
 
30
29
  const MODALS = {
31
30
  CHANGE_NAME: 'changeName',
@@ -39,7 +38,7 @@ const MODALS = {
39
38
  EMBED_URL: 'embedUrl',
40
39
  };
41
40
 
42
- export const MwebOptions = () => {
41
+ export const MwebOptions = ({ elements }) => {
43
42
  const hmsActions = useHMSActions();
44
43
  const permissions = useHMSStore(selectPermissions);
45
44
  const isConnected = useHMSStore(selectIsConnectedToRoom);
@@ -55,9 +54,9 @@ export const MwebOptions = () => {
55
54
  const toggleParticipants = useSidepaneToggle(SIDE_PANE_OPTIONS.PARTICIPANTS);
56
55
  const peerCount = useHMSStore(selectPeerCount);
57
56
  const emojiCardRef = useRef(null);
58
- const isVideoOn = useHMSStore(selectIsLocalVideoEnabled);
57
+ // const isVideoOn = useHMSStore(selectIsLocalVideoEnabled);
59
58
 
60
- useDropdownList({ open: openModals.size > 0, name: 'MoreSettings' });
59
+ useDropdownList({ open: openModals.size > 0 || openOptionsSheet || openSettingsSheet, name: 'MoreSettings' });
61
60
 
62
61
  const updateState = (modalName, value) => {
63
62
  setOpenModals(modals => {
@@ -127,21 +126,23 @@ export const MwebOptions = () => {
127
126
  <ActionTile.Title>Participants</ActionTile.Title>
128
127
  </ActionTile.Root>
129
128
 
130
- {isVideoOn ? (
129
+ {/* {isVideoOn ? (
131
130
  <Suspense fallback="">
132
131
  <VirtualBackground asActionTile onVBClick={() => setOpenOptionsSheet(false)} />
133
132
  </Suspense>
134
- ) : null}
133
+ ) : null} */}
135
134
 
136
- <ActionTile.Root
137
- onClick={() => {
138
- setShowEmojiCard(true);
139
- setOpenOptionsSheet(false);
140
- }}
141
- >
142
- <EmojiIcon />
143
- <ActionTile.Title>Emoji Reactions</ActionTile.Title>
144
- </ActionTile.Root>
135
+ {elements?.emoji_reactions && (
136
+ <ActionTile.Root
137
+ onClick={() => {
138
+ setShowEmojiCard(true);
139
+ setOpenOptionsSheet(false);
140
+ }}
141
+ >
142
+ <EmojiIcon />
143
+ <ActionTile.Title>Emoji Reactions</ActionTile.Title>
144
+ </ActionTile.Root>
145
+ )}
145
146
 
146
147
  <ActionTile.Root
147
148
  onClick={() => {
@@ -235,7 +236,7 @@ export const MwebOptions = () => {
235
236
  mx: '$4',
236
237
  }}
237
238
  >
238
- <EmojiCard />
239
+ <EmojiReaction />
239
240
  </Box>
240
241
  )}
241
242
  {showRecordingOn && (
@@ -60,7 +60,9 @@ export function HLSFailureModal() {
60
60
  <Button outlined variant="standard" css={{ w: '100%' }} onClick={() => setOpenModal(false)}>
61
61
  Dismiss
62
62
  </Button>
63
- <Button css={{ w: '100%' }}>Go Live</Button>
63
+ <Button css={{ w: '100%' }} onClick={startHLS}>
64
+ Go Live
65
+ </Button>
64
66
  </Flex>
65
67
  </Dialog.Content>
66
68
  </Dialog.Portal>
@@ -1,28 +1,35 @@
1
1
  /* eslint-disable no-case-declarations */
2
2
  import React, { useEffect } from 'react';
3
- import { HMSNotificationTypes, useHMSNotifications } from '@100mslive/react-sdk';
3
+ import { useNavigate } from 'react-router-dom';
4
+ import {
5
+ HMSNotificationTypes,
6
+ HMSRoomState,
7
+ selectRoomState,
8
+ useHMSNotifications,
9
+ useHMSStore,
10
+ } from '@100mslive/react-sdk';
4
11
  import { Button } from '../../../';
12
+ import { useUpdateRoomLayout } from '../../provider/roomLayoutProvider';
5
13
  import { ToastBatcher } from '../Toast/ToastBatcher';
6
14
  import { ToastManager } from '../Toast/ToastManager';
7
15
  import { AutoplayBlockedModal } from './AutoplayBlockedModal';
8
16
  import { InitErrorModal } from './InitErrorModal';
9
- import { MessageNotifications } from './MessageNotifications';
10
17
  import { PeerNotifications } from './PeerNotifications';
11
18
  import { PermissionErrorModal } from './PermissionErrorModal';
12
19
  import { ReconnectNotifications } from './ReconnectNotifications';
13
20
  import { TrackBulkUnmuteModal } from './TrackBulkUnmuteModal';
14
21
  import { TrackNotifications } from './TrackNotifications';
15
22
  import { TrackUnmuteModal } from './TrackUnmuteModal';
16
- import { useHLSViewerRole, useIsHeadless, useSubscribedNotifications } from '../AppData/useUISettings';
17
- import { useNavigation } from '../hooks/useNavigation';
23
+ import { useIsHeadless, useSubscribedNotifications } from '../AppData/useUISettings';
18
24
  import { getMetadata } from '../../common/utils';
19
25
 
20
26
  export function Notifications() {
21
27
  const notification = useHMSNotifications();
22
- const navigate = useNavigation();
23
- const HLS_VIEWER_ROLE = useHLSViewerRole();
28
+ const navigate = useNavigate();
24
29
  const subscribedNotifications = useSubscribedNotifications() || {};
25
30
  const isHeadless = useIsHeadless();
31
+ const roomState = useHMSStore(selectRoomState);
32
+ const updateRoomLayoutForRole = useUpdateRoomLayout();
26
33
 
27
34
  useEffect(() => {
28
35
  if (!notification) {
@@ -30,6 +37,9 @@ export function Notifications() {
30
37
  }
31
38
  switch (notification.type) {
32
39
  case HMSNotificationTypes.METADATA_UPDATED:
40
+ if (roomState !== HMSRoomState.Connected) {
41
+ return;
42
+ }
33
43
  // Don't toast message when metadata is updated and raiseHand is false.
34
44
  // Don't toast message in case of local peer.
35
45
  const metadata = getMetadata(notification.data?.metadata);
@@ -90,13 +100,11 @@ export function Notifications() {
90
100
  });
91
101
  break;
92
102
  case HMSNotificationTypes.ROLE_UPDATED:
93
- if (notification.data.roleName === HLS_VIEWER_ROLE) {
94
- return;
95
- }
96
103
  if (notification.data?.isLocal) {
97
104
  ToastManager.addToast({
98
105
  title: `You are now a ${notification.data.roleName}`,
99
106
  });
107
+ updateRoomLayoutForRole(notification.data.roleName);
100
108
  }
101
109
  break;
102
110
  case HMSNotificationTypes.CHANGE_TRACK_STATE_REQUEST:
@@ -129,7 +137,7 @@ export function Notifications() {
129
137
  break;
130
138
  }
131
139
  // eslint-disable-next-line react-hooks/exhaustive-deps
132
- }, [notification, subscribedNotifications.ERROR, subscribedNotifications.METADATA_UPDATED, HLS_VIEWER_ROLE]);
140
+ }, [notification, subscribedNotifications.ERROR, subscribedNotifications.METADATA_UPDATED]);
133
141
 
134
142
  return (
135
143
  <>
@@ -140,7 +148,6 @@ export function Notifications() {
140
148
  <ReconnectNotifications />
141
149
  <AutoplayBlockedModal />
142
150
  <PermissionErrorModal />
143
- <MessageNotifications />
144
151
  <InitErrorModal notification={notification} />
145
152
  </>
146
153
  );
@@ -1,5 +1,11 @@
1
1
  import { useEffect } from 'react';
2
- import { HMSNotificationTypes, useHMSNotifications } from '@100mslive/react-sdk';
2
+ import {
3
+ HMSNotificationTypes,
4
+ HMSRoomState,
5
+ selectRoomState,
6
+ useHMSNotifications,
7
+ useHMSStore,
8
+ } from '@100mslive/react-sdk';
3
9
  import { ToastBatcher } from '../Toast/ToastBatcher';
4
10
  import { useSubscribedNotifications } from '../AppData/useUISettings';
5
11
  import { isInternalRole } from '../../common/utils';
@@ -15,10 +21,15 @@ export const PeerNotifications = () => {
15
21
  const notification = useHMSNotifications(notificationTypes);
16
22
  const isPeerJoinSubscribed = useSubscribedNotifications(SUBSCRIBED_NOTIFICATIONS.PEER_JOINED);
17
23
  const isPeerLeftSubscribed = useSubscribedNotifications(SUBSCRIBED_NOTIFICATIONS.PEER_LEFT);
24
+ const roomState = useHMSStore(selectRoomState);
18
25
  useEffect(() => {
26
+ if (roomState !== HMSRoomState.Connected) {
27
+ return;
28
+ }
19
29
  if (!notification || (notification?.data?.roleName && isInternalRole(notification.data.roleName))) {
20
30
  return;
21
31
  }
32
+
22
33
  console.debug(`[${notification.type}]`, notification);
23
34
  switch (notification.type) {
24
35
  case HMSNotificationTypes.PEER_LIST:
@@ -39,8 +50,9 @@ export const PeerNotifications = () => {
39
50
  default:
40
51
  return;
41
52
  }
53
+
42
54
  ToastBatcher.showToast({ notification });
43
- }, [notification, isPeerJoinSubscribed, isPeerLeftSubscribed]);
55
+ }, [notification, isPeerJoinSubscribed, isPeerLeftSubscribed, roomState]);
44
56
 
45
57
  return null;
46
58
  };
@@ -2,8 +2,8 @@ import React, { useEffect, useState } from 'react';
2
2
  import { useMedia } from 'react-use';
3
3
  import { HMSNotificationTypes, useHMSNotifications } from '@100mslive/react-sdk';
4
4
  import { Button, config as cssConfig, Dialog, Flex, Text } from '../../../';
5
- import androidPermissionAlert from '../../../assets/android-perm-1.png';
6
- import iosPermissions from '../../../assets/ios-perm-0.png';
5
+ import androidPermissionAlert from '../../images/android-perm-1.png';
6
+ import iosPermissions from '../../images/ios-perm-0.png';
7
7
  import { isAndroid, isIOS } from '../../common/constants';
8
8
 
9
9
  export function PermissionErrorModal() {
@@ -47,11 +47,17 @@ export function PermissionErrorModal() {
47
47
  borderBottom: '1px solid $border_default',
48
48
  }}
49
49
  >
50
- {isMobile && isIOS ? <img style={{ maxWidth: '100%', maxHeight: '100%' }} src={iosPermissions} /> : null}
50
+ {isMobile && isIOS ? (
51
+ <img style={{ maxWidth: '100%', maxHeight: '100%' }} src={iosPermissions} alt="iOS Permission flow" />
52
+ ) : null}
51
53
 
52
54
  {/* Images for android */}
53
55
  {isMobile && isAndroid ? (
54
- <img src={androidPermissionAlert} style={{ maxWidth: '100%', maxHeight: '100%' }} />
56
+ <img
57
+ src={androidPermissionAlert}
58
+ style={{ maxWidth: '100%', maxHeight: '100%' }}
59
+ alt="Android Permission flow "
60
+ />
55
61
  ) : null}
56
62
 
57
63
  <Text variant="h6">We can't access your {deviceType}</Text>
@@ -1,31 +1,20 @@
1
1
  import React, { useCallback, useEffect, useState } from 'react';
2
- import {
3
- selectLocalPeerRoleName,
4
- selectPeers,
5
- selectTracksMap,
6
- useHMSActions,
7
- useHMSStore,
8
- useHMSVanillaStore,
9
- } from '@100mslive/react-sdk';
2
+ import { selectPeers, selectTracksMap, useHMSActions, useHMSStore, useHMSVanillaStore } from '@100mslive/react-sdk';
10
3
  import { PipIcon } from '@100mslive/react-icons';
11
4
  import { Flex, Tooltip } from '../../../';
12
5
  import IconButton from '../../IconButton';
13
6
  import { PictureInPicture } from './PIPManager';
14
7
  import { MediaSession } from './SetupMediaSession';
15
8
  import { usePinnedTrack } from '../AppData/useUISettings';
16
- import { useIsFeatureEnabled } from '../hooks/useFeatures';
17
- import { DEFAULT_HLS_VIEWER_ROLE, FEATURE_LIST } from '../../common/constants';
18
9
 
19
10
  /**
20
11
  * shows a button which when clicked shows some videos in PIP, clicking
21
12
  * again turns it off.
22
13
  */
23
14
  const PIPComponent = ({ content = null }) => {
24
- const localPeerRole = useHMSStore(selectLocalPeerRoleName);
25
15
  const [isPipOn, setIsPipOn] = useState(PictureInPicture.isOn());
26
16
  const hmsActions = useHMSActions();
27
17
  const store = useHMSVanillaStore();
28
- const isFeatureEnabled = useIsFeatureEnabled(FEATURE_LIST.PICTURE_IN_PICTURE);
29
18
 
30
19
  const onPipToggle = useCallback(() => {
31
20
  if (!isPipOn) {
@@ -36,7 +25,7 @@ const PIPComponent = ({ content = null }) => {
36
25
  }
37
26
  }, [hmsActions, isPipOn, store]);
38
27
 
39
- if (!PictureInPicture.isSupported() || localPeerRole === DEFAULT_HLS_VIEWER_ROLE || !isFeatureEnabled) {
28
+ if (!PictureInPicture.isSupported()) {
40
29
  return null;
41
30
  }
42
31
  return (
@@ -66,8 +55,8 @@ export const ActivatedPIP = () => {
66
55
  const pinnedTrack = usePinnedTrack();
67
56
 
68
57
  useEffect(() => {
69
- PictureInPicture.listenToStateChange(isPipOn => {
70
- if (!isPipOn) {
58
+ function updatePIP() {
59
+ if (!PictureInPicture.isOn()) {
71
60
  return;
72
61
  }
73
62
  let pipPeers = storePeers;
@@ -77,7 +66,9 @@ export const ActivatedPIP = () => {
77
66
  PictureInPicture.updatePeersAndTracks(pipPeers, tracksMap).catch(err => {
78
67
  console.error('error in updating pip', err);
79
68
  });
80
- });
69
+ }
70
+ PictureInPicture.listenToStateChange(updatePIP);
71
+ updatePIP();
81
72
  }, [storePeers, tracksMap, pinnedTrack]);
82
73
 
83
74
  return <></>;
@@ -107,6 +107,7 @@ class PipManager {
107
107
  this.pipVideo?.removeEventListener(LEAVE_EVENT_NAME, this.stop);
108
108
  if (this.timeoutRef) {
109
109
  workerTimers.clearTimeout(this.timeoutRef);
110
+ this.timeoutRef = null;
110
111
  }
111
112
  if (this.isOn()) {
112
113
  this.exitPIP();
@@ -1,24 +1,53 @@
1
- import React from 'react';
1
+ import React, { useEffect } from 'react';
2
2
  import { ChevronLeftIcon, ChevronRightIcon } from '@100mslive/react-icons';
3
3
  import { StyledPagination } from '../../Pagination';
4
4
 
5
- export const Pagination = ({ page, onPageChange, numPages }) => {
5
+ export const Pagination = ({
6
+ page,
7
+ onPageChange,
8
+ numPages,
9
+ }: {
10
+ page: number;
11
+ onPageChange: (page: number) => void;
12
+ numPages: number;
13
+ }) => {
6
14
  const disableLeft = page === 0;
7
15
  const disableRight = page === numPages - 1;
8
- const nextPage = () => {
16
+ const nextPage = (e: React.SyntheticEvent) => {
17
+ e.stopPropagation();
9
18
  onPageChange(Math.min(page + 1, numPages - 1));
10
19
  };
11
- const prevPage = () => {
20
+ const prevPage = (e: React.SyntheticEvent) => {
21
+ e.stopPropagation();
12
22
  onPageChange(Math.max(page - 1, 0));
13
23
  };
24
+
25
+ useEffect(() => {
26
+ // currentPageIndex should not exceed pages length
27
+ if (page >= numPages) {
28
+ onPageChange(Math.max(0, numPages - 1));
29
+ }
30
+ }, [numPages, onPageChange, page]);
31
+
32
+ if (numPages <= 1) {
33
+ return null;
34
+ }
35
+
14
36
  return (
15
- <StyledPagination.Root>
37
+ <StyledPagination.Root css={{ flexShrink: 0 }}>
16
38
  <StyledPagination.Chevron disabled={disableLeft} onClick={prevPage}>
17
39
  <ChevronLeftIcon width={16} height={16} style={{ cursor: disableLeft ? 'not-allowed' : 'pointer' }} />
18
40
  </StyledPagination.Chevron>
19
41
  <StyledPagination.Dots>
20
42
  {[...Array(numPages)].map((_, i) => (
21
- <StyledPagination.Dot key={i} active={page === i} onClick={() => onPageChange(i)} />
43
+ <StyledPagination.Dot
44
+ key={i}
45
+ active={page === i}
46
+ onClick={e => {
47
+ e.stopPropagation();
48
+ onPageChange(i);
49
+ }}
50
+ />
22
51
  ))}
23
52
  </StyledPagination.Dots>
24
53
  <StyledPagination.Chevron disabled={disableRight} onClick={nextPage}>
@@ -5,9 +5,7 @@ import { Box, Dropdown, Flex, Text, Tooltip } from '../../../';
5
5
  import IconButton from '../../IconButton';
6
6
  import { AudioPlaylistControls } from './PlaylistControls';
7
7
  import { PlaylistItem } from './PlaylistItem';
8
- import { useIsFeatureEnabled } from '../hooks/useFeatures';
9
8
  import { usePlaylist } from '../hooks/usePlaylist';
10
- import { FEATURE_LIST } from '../../common/constants';
11
9
 
12
10
  const BrowseAndPlayFromLocal = ({ type, actions }) => {
13
11
  return (
@@ -44,10 +42,7 @@ export const Playlist = ({ type }) => {
44
42
  const [open, setOpen] = useState(false);
45
43
  const [collapse, setCollapse] = useState(false);
46
44
  const isAllowedToPublish = useHMSStore(selectIsAllowedToPublish);
47
- const isFeatureEnabled = useIsFeatureEnabled(
48
- isAudioPlaylist ? FEATURE_LIST.AUDIO_PLAYLIST : FEATURE_LIST.VIDEO_PLAYLIST,
49
- );
50
- if (!isAllowedToPublish.screen || playlist.length === 0 || !isFeatureEnabled) {
45
+ if (!isAllowedToPublish.screen || playlist.length === 0) {
51
46
  return null;
52
47
  }
53
48
 
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { useParams } from 'react-router-dom';
2
+ import { useNavigate, useParams } from 'react-router-dom';
3
3
  import { ExitIcon } from '@100mslive/react-icons';
4
4
  import { ToastManager } from './Toast/ToastManager';
5
5
  import { Button } from '../../Button';
@@ -7,14 +7,14 @@ import { Box, Flex } from '../../Layout';
7
7
  import { Text } from '../../Text';
8
8
  import { useHMSPrebuiltContext } from '../AppContext';
9
9
  import { Header } from './Header';
10
- import { useNavigation } from './hooks/useNavigation';
10
+ import { useRoomLayoutPreviewScreen } from '../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
11
11
  import { defaultPreviewPreference, UserPreferencesKeys, useUserPreferences } from './hooks/useUserPreferences';
12
- import { getRoutePrefix } from '../common/utils';
13
12
  import { textEllipsis } from '../../utils';
14
13
 
15
14
  const PostLeave = () => {
16
- const navigate = useNavigation();
17
- const { showPreview, roomCode } = useHMSPrebuiltContext();
15
+ const navigate = useNavigate();
16
+ const { isPreviewScreenEnabled } = useRoomLayoutPreviewScreen();
17
+ const { roomCode } = useHMSPrebuiltContext();
18
18
  const { roomId, role } = useParams();
19
19
  const [previewPreference] = useUserPreferences(UserPreferencesKeys.PREVIEW, defaultPreviewPreference);
20
20
  return (
@@ -32,7 +32,7 @@ const PostLeave = () => {
32
32
  👋
33
33
  </Text>
34
34
  <Text variant="h4" css={{ color: '$on_surface_high', fontWeight: '$semiBold', mt: '$12' }}>
35
- You left the {getRoutePrefix() ? 'stream' : 'room'}
35
+ You left the room
36
36
  </Text>
37
37
  <Text
38
38
  variant="body1"
@@ -57,7 +57,7 @@ const PostLeave = () => {
57
57
  </Text>
58
58
  <Button
59
59
  onClick={() => {
60
- let redirectUrl = `${showPreview ? '/preview/' : '/meeting/'}${roomCode || roomId}`;
60
+ let redirectUrl = `${isPreviewScreenEnabled ? '/preview/' : '/meeting/'}${roomCode || roomId}`;
61
61
  if (role && roomId) redirectUrl += '/' + role;
62
62
  navigate(redirectUrl);
63
63
  ToastManager.clearAllToast();
@@ -1,20 +1,19 @@
1
1
  import React from 'react';
2
- import { useParams } from 'react-router-dom';
2
+ import { useNavigate, useParams } from 'react-router-dom';
3
3
  import { useSearchParam } from 'react-use';
4
4
  import { Flex } from '../../../';
5
5
  import { useHMSPrebuiltContext } from '../../AppContext';
6
- import SidePane from '../../layouts/SidePane';
7
6
  import { useRoomLayout } from '../../provider/roomLayoutProvider';
8
7
  import FullPageProgress from '../FullPageProgress';
9
8
  import PreviewJoin from './PreviewJoin';
9
+ import { useRoomLayoutPreviewScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
10
10
  import { useAuthToken } from '../AppData/useUISettings';
11
- import { useNavigation } from '../hooks/useNavigation';
12
- import { useSkipPreview } from '../hooks/useSkipPreview';
13
11
  import { QUERY_PARAM_PREVIEW_AS_ROLE } from '../../common/constants';
14
12
 
15
13
  const PreviewContainer = () => {
16
- const navigate = useNavigation();
17
- const skipPreview = useSkipPreview();
14
+ const navigate = useNavigate();
15
+ const { isPreviewScreenEnabled } = useRoomLayoutPreviewScreen();
16
+ const skipPreview = !isPreviewScreenEnabled;
18
17
  const previewAsRole = useSearchParam(QUERY_PARAM_PREVIEW_AS_ROLE);
19
18
  const { userName } = useHMSPrebuiltContext();
20
19
  const initialName = userName || (skipPreview ? 'Beam' : '');
@@ -42,13 +41,6 @@ const PreviewContainer = () => {
42
41
  ) : (
43
42
  <FullPageProgress />
44
43
  )}
45
- <SidePane
46
- css={{
47
- position: 'unset',
48
- mr: '$10',
49
- '@lg': { position: 'fixed', mr: '$0' },
50
- }}
51
- />
52
44
  </Flex>
53
45
  </Flex>
54
46
  );
@@ -1,11 +1,12 @@
1
1
  import React from 'react';
2
2
  import { useMedia } from 'react-use';
3
+ import { JoinForm_JoinBtnType } from '@100mslive/types-prebuilt/elements/join_form';
3
4
  import { selectPermissions, useHMSStore, useRecordingStreaming } from '@100mslive/react-sdk';
4
5
  import { RadioIcon } from '@100mslive/react-icons';
5
6
  import { Button, config as cssConfig, Flex, Input, styled } from '../../..';
6
7
  import { useRoomLayout } from '../../provider/roomLayoutProvider';
8
+ // @ts-ignore: No implicit Any
7
9
  import { PreviewSettings } from './PreviewJoin';
8
- import { useShowStreamingUI } from '../../common/hooks';
9
10
 
10
11
  const PreviewForm = ({
11
12
  name,
@@ -14,8 +15,15 @@ const PreviewForm = ({
14
15
  enableJoin,
15
16
  cannotPublishVideo = false,
16
17
  cannotPublishAudio = false,
18
+ }: {
19
+ name: string;
20
+ onChange: (name: string) => void;
21
+ onJoin: () => void;
22
+ enableJoin: boolean;
23
+ cannotPublishVideo: boolean;
24
+ cannotPublishAudio: boolean;
17
25
  }) => {
18
- const formSubmit = e => {
26
+ const formSubmit = (e: React.SyntheticEvent) => {
19
27
  e.preventDefault();
20
28
  };
21
29
  const mediaQueryLg = cssConfig.media.md;
@@ -24,8 +32,10 @@ const PreviewForm = ({
24
32
  const permissions = useHMSStore(selectPermissions);
25
33
  const layout = useRoomLayout();
26
34
  const { join_form: joinForm = {} } = layout?.screens?.preview?.default?.elements || {};
27
- const showStreamingUI = useShowStreamingUI();
28
- const showGoLive = showStreamingUI && !isHLSRunning && permissions?.hlsStreaming;
35
+ const showGoLive =
36
+ joinForm?.join_btn_type === JoinForm_JoinBtnType.JOIN_BTN_TYPE_JOIN_AND_GO_LIVE &&
37
+ !isHLSRunning &&
38
+ permissions?.hlsStreaming;
29
39
 
30
40
  return (
31
41
  <Form
@@ -12,7 +12,7 @@ import {
12
12
  useRecordingStreaming,
13
13
  } from '@100mslive/react-sdk';
14
14
  import { MicOffIcon, SettingsIcon } from '@100mslive/react-icons';
15
- import { Avatar, Box, Flex, flexCenter, styled, StyledVideoTile, Text, useBorderAudioLevel, Video } from '../../../';
15
+ import { Avatar, Box, Flex, flexCenter, styled, StyledVideoTile, Text, Video } from '../../../';
16
16
  import { useHMSPrebuiltContext } from '../../AppContext';
17
17
  import IconButton from '../../IconButton';
18
18
  import { useRoomLayout } from '../../provider/roomLayoutProvider';
@@ -22,6 +22,7 @@ import TileConnection from '../Connection/TileConnection';
22
22
  import FullPageProgress from '../FullPageProgress';
23
23
  import { Logo } from '../Header/HeaderComponents';
24
24
  import SettingsModal from '../Settings/SettingsModal';
25
+ import { AudioLevel } from '../VideoTile';
25
26
  import PreviewForm from './PreviewForm';
26
27
  import { useAuthToken, useUISettings } from '../AppData/useUISettings';
27
28
  import { defaultPreviewPreference, UserPreferencesKeys, useUserPreferences } from '../hooks/useUserPreferences';
@@ -170,9 +171,8 @@ const Container = styled('div', {
170
171
  px: '$10',
171
172
  });
172
173
 
173
- const PreviewTile = ({ name, error }) => {
174
+ export const PreviewTile = ({ name, error }) => {
174
175
  const localPeer = useHMSStore(selectLocalPeer);
175
- const borderAudioRef = useBorderAudioLevel(localPeer?.audioTrack);
176
176
  const { isLocalAudioEnabled, toggleAudio } = useAVToggle();
177
177
  const isVideoOn = useHMSStore(selectIsLocalVideoEnabled);
178
178
  const mirrorLocalVideo = useUISettings(UI_SETTINGS.mirrorLocalVideo);
@@ -189,11 +189,11 @@ const PreviewTile = ({ name, error }) => {
189
189
  overflow: 'clip',
190
190
  '@md': {
191
191
  aspectRatio: 9 / 16,
192
- width: 'min(275px, 70vw)',
192
+ width: 'min(220px, 70vw)',
193
193
  maxWidth: '100%',
194
+ my: '$4',
194
195
  },
195
196
  }}
196
- ref={borderAudioRef}
197
197
  >
198
198
  {localPeer ? (
199
199
  <>
@@ -216,12 +216,14 @@ const PreviewTile = ({ name, error }) => {
216
216
  <StyledVideoTile.AudioIndicator size="medium">
217
217
  <MicOffIcon />
218
218
  </StyledVideoTile.AudioIndicator>
219
- ) : null}
219
+ ) : (
220
+ <AudioLevel trackId={localPeer.audioTrack} />
221
+ )}
220
222
  </StyledVideoTile.Container>
221
223
  );
222
224
  };
223
225
 
224
- const PreviewControls = ({ hideSettings }) => {
226
+ export const PreviewControls = ({ hideSettings }) => {
225
227
  const isVideoOn = useHMSStore(selectIsLocalVideoEnabled);
226
228
  return (
227
229
  <Flex
@@ -3,20 +3,13 @@ import { selectLocalPeer, selectPeerMetadata, useHMSStore } from '@100mslive/rea
3
3
  import { HandIcon } from '@100mslive/react-icons';
4
4
  import { Tooltip } from '../../Tooltip';
5
5
  import IconButton from '../IconButton';
6
- import { useIsFeatureEnabled } from './hooks/useFeatures';
7
6
  import { useMyMetadata } from './hooks/useMetadata';
8
- import { FEATURE_LIST } from '../common/constants';
9
7
 
10
8
  export const RaiseHand = () => {
11
- const isHandRaiseEnabled = useIsFeatureEnabled(FEATURE_LIST.HAND_RAISE);
12
9
  const { toggleHandRaise } = useMyMetadata();
13
10
  const localPeer = useHMSStore(selectLocalPeer);
14
11
  const isHandRaised = useHMSStore(selectPeerMetadata(localPeer.id))?.isHandRaised || false;
15
12
 
16
- if (!isHandRaiseEnabled) {
17
- return null;
18
- }
19
-
20
13
  return (
21
14
  <Tooltip title={isHandRaised ? 'Lower hand' : 'Raise hand'}>
22
15
  <IconButton active={!isHandRaised} onClick={toggleHandRaise}>