@100mslive/roomkit-react 0.1.5 → 0.1.6-alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (232) hide show
  1. package/dist/{HLSView-P57IRMAR.js → HLSView-HNVYG5VE.js} +309 -151
  2. package/dist/HLSView-HNVYG5VE.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/Chat/ChatFooter.d.ts +7 -0
  7. package/dist/Prebuilt/components/Connection/ConnectionIndicator.d.ts +6 -0
  8. package/dist/Prebuilt/components/Connection/TileConnection.d.ts +10 -0
  9. package/dist/Prebuilt/components/Footer/ChatToggle.d.ts +4 -0
  10. package/dist/Prebuilt/components/Footer/Footer.d.ts +6 -0
  11. package/dist/Prebuilt/components/Footer/RoleAccordion.d.ts +14 -0
  12. package/dist/Prebuilt/components/Footer/RoleOptions.d.ts +6 -0
  13. package/dist/Prebuilt/components/Header/Header.d.ts +2 -0
  14. package/dist/Prebuilt/components/Header/StreamActions.d.ts +11 -0
  15. package/dist/Prebuilt/components/InsetTile.d.ts +2 -0
  16. package/dist/Prebuilt/components/Leave/DesktopLeaveRoom.d.ts +8 -0
  17. package/dist/Prebuilt/components/Leave/EndSessionContent.d.ts +9 -0
  18. package/dist/Prebuilt/components/Leave/LeaveAtoms.d.ts +2196 -0
  19. package/dist/Prebuilt/components/Leave/LeaveCard.d.ts +11 -0
  20. package/dist/Prebuilt/components/Leave/LeaveRoom.d.ts +5 -0
  21. package/dist/Prebuilt/components/Leave/LeaveSessionContent.d.ts +8 -0
  22. package/dist/Prebuilt/components/Leave/MwebLeaveRoom.d.ts +8 -0
  23. package/dist/Prebuilt/components/MoreSettings/MoreSettings.d.ts +6 -0
  24. package/dist/Prebuilt/components/MoreSettings/SplitComponents/DesktopOptions.d.ts +6 -0
  25. package/dist/Prebuilt/components/MoreSettings/SplitComponents/MwebOptions.d.ts +6 -0
  26. package/dist/Prebuilt/components/Pagination.d.ts +6 -0
  27. package/dist/Prebuilt/components/Preview/PreviewContainer.d.ts +3 -0
  28. package/dist/Prebuilt/components/Preview/PreviewForm.d.ts +10 -0
  29. package/dist/Prebuilt/components/Preview/PreviewJoin.d.ts +16 -0
  30. package/dist/Prebuilt/components/RoleChangeRequestModal.d.ts +2 -0
  31. package/dist/Prebuilt/components/SecondaryTiles.d.ts +3 -0
  32. package/dist/Prebuilt/components/VideoLayouts/EqualProminence.d.ts +3 -0
  33. package/dist/Prebuilt/components/VideoLayouts/Grid.d.ts +6 -0
  34. package/dist/Prebuilt/components/VideoLayouts/GridLayout.d.ts +12 -0
  35. package/dist/Prebuilt/components/VideoLayouts/ProminenceLayout.d.ts +15 -0
  36. package/dist/Prebuilt/components/VideoLayouts/RoleProminence.d.ts +3 -0
  37. package/dist/Prebuilt/components/VideoLayouts/ScreenshareLayout.d.ts +3 -0
  38. package/dist/Prebuilt/components/VideoLayouts/interface.d.ts +9 -0
  39. package/dist/Prebuilt/components/hooks/useAutoStartStreaming.d.ts +1 -0
  40. package/dist/Prebuilt/components/hooks/useRedirectToLeave.d.ts +3 -0
  41. package/dist/Prebuilt/components/hooks/useRoleProminencePeers.d.ts +5 -0
  42. package/dist/Prebuilt/components/hooks/useTileLayout.d.ts +13 -0
  43. package/dist/Prebuilt/components/hooks/useVideoTileLayout.d.ts +13 -0
  44. package/dist/Prebuilt/layouts/SidePane.d.ts +9 -0
  45. package/dist/Prebuilt/layouts/VideoStreamingSection.d.ts +7 -0
  46. package/dist/Prebuilt/plugins/whiteboard/ToggleWhiteboard.d.ts +5 -0
  47. package/dist/Prebuilt/provider/roomLayoutProvider/hooks/useFetchRoomLayout.d.ts +1 -0
  48. package/dist/Prebuilt/provider/roomLayoutProvider/hooks/useInsetEnabled.d.ts +1 -0
  49. package/dist/Prebuilt/provider/roomLayoutProvider/hooks/useRoomLayoutScreen.d.ts +17 -0
  50. package/dist/Prebuilt/provider/roomLayoutProvider/index.d.ts +6 -1
  51. package/dist/{VirtualBackground-GGCQJ5JM.js → VirtualBackground-UM2FOUHQ.js} +5 -11
  52. package/dist/VirtualBackground-UM2FOUHQ.js.map +7 -0
  53. package/dist/{chunk-P5X32KOD.js → chunk-364HP22I.js} +8 -5
  54. package/dist/chunk-364HP22I.js.map +7 -0
  55. package/dist/{chunk-OSM4QEQG.js → chunk-LYSAET4G.js} +3742 -5462
  56. package/dist/chunk-LYSAET4G.js.map +7 -0
  57. package/dist/chunk-POE7H4IE.js +898 -0
  58. package/dist/chunk-POE7H4IE.js.map +7 -0
  59. package/dist/conference-UWLJHMB2.js +5727 -0
  60. package/dist/conference-UWLJHMB2.js.map +7 -0
  61. package/dist/index.cjs.js +9655 -15326
  62. package/dist/index.cjs.js.map +4 -4
  63. package/dist/index.js +2 -2
  64. package/dist/meta.cjs.json +2513 -3456
  65. package/dist/meta.esbuild.json +2807 -3838
  66. package/package.json +8 -7
  67. package/src/Button/Button.tsx +2 -2
  68. package/src/Prebuilt/App.tsx +58 -53
  69. package/src/Prebuilt/{AppContext.jsx → AppContext.tsx} +11 -3
  70. package/src/Prebuilt/IconButton.jsx +11 -0
  71. package/src/Prebuilt/Prebuilt.stories.tsx +1 -0
  72. package/src/Prebuilt/common/{PeersSorter.js → PeersSorter.ts} +16 -11
  73. package/src/Prebuilt/common/constants.js +4 -114
  74. package/src/Prebuilt/common/hooks.js +34 -1
  75. package/src/Prebuilt/common/utils.js +1 -9
  76. package/src/Prebuilt/components/AppData/AppData.jsx +11 -15
  77. package/src/Prebuilt/components/AppData/useUISettings.js +6 -10
  78. package/src/Prebuilt/components/AudioVideoToggle.jsx +10 -2
  79. package/src/Prebuilt/components/AuthToken.jsx +11 -42
  80. package/src/Prebuilt/components/Chat/Chat.jsx +75 -27
  81. package/src/Prebuilt/components/Chat/ChatBody.jsx +95 -36
  82. package/src/Prebuilt/components/Chat/ChatFooter.tsx +199 -0
  83. package/src/Prebuilt/components/Chat/ChatParticipantHeader.jsx +84 -0
  84. package/src/Prebuilt/components/Chat/ChatSelector.jsx +16 -17
  85. package/src/Prebuilt/components/Chat/ChatSelectorContainer.jsx +81 -0
  86. package/src/Prebuilt/components/Chat/useEmojiPickerStyles.js +5 -4
  87. package/src/Prebuilt/components/Connection/{ConnectionIndicator.jsx → ConnectionIndicator.tsx} +12 -4
  88. package/src/Prebuilt/components/Connection/TileConnection.tsx +71 -0
  89. package/src/Prebuilt/components/EmojiReaction.jsx +19 -22
  90. package/src/Prebuilt/components/Footer/{ChatToggle.jsx → ChatToggle.tsx} +13 -9
  91. package/src/Prebuilt/components/Footer/Footer.tsx +98 -0
  92. package/src/Prebuilt/components/Footer/ParticipantList.jsx +187 -179
  93. package/src/Prebuilt/components/Footer/RoleAccordion.tsx +94 -0
  94. package/src/Prebuilt/components/Footer/RoleOptions.tsx +155 -0
  95. package/src/Prebuilt/components/FullPageProgress.jsx +3 -3
  96. package/src/Prebuilt/components/HMSVideo/Controls.jsx +3 -2
  97. package/src/Prebuilt/components/HMSVideo/HLSQualitySelector.jsx +63 -18
  98. package/src/Prebuilt/components/HMSVideo/HMSVideo.jsx +2 -2
  99. package/src/Prebuilt/components/HMSVideo/PlayButton.jsx +1 -1
  100. package/src/Prebuilt/components/HMSVideo/VideoProgress.jsx +5 -6
  101. package/src/Prebuilt/components/HMSVideo/VideoTime.jsx +3 -3
  102. package/src/Prebuilt/components/HMSVideo/VolumeControl.jsx +38 -9
  103. package/src/Prebuilt/components/Header/{ConferencingHeader.jsx → Header.tsx} +9 -7
  104. package/src/Prebuilt/components/Header/HeaderComponents.jsx +13 -4
  105. package/src/Prebuilt/components/Header/{StreamActions.jsx → StreamActions.tsx} +54 -67
  106. package/src/Prebuilt/components/Header/common.jsx +5 -2
  107. package/src/Prebuilt/components/Header/index.tsx +1 -0
  108. package/src/Prebuilt/components/IconButtonWithOptions/IconButtonWithOptions.jsx +23 -4
  109. package/src/Prebuilt/components/InsetTile.tsx +128 -0
  110. package/src/Prebuilt/components/{MoreSettings/SplitComponents/DesktopLeaveRoom.jsx → Leave/DesktopLeaveRoom.tsx} +67 -25
  111. package/src/Prebuilt/components/{EndSessionContent.jsx → Leave/EndSessionContent.tsx} +18 -11
  112. package/src/Prebuilt/components/Leave/LeaveAtoms.tsx +26 -0
  113. package/src/Prebuilt/components/Leave/LeaveCard.tsx +36 -0
  114. package/src/Prebuilt/components/Leave/LeaveRoom.tsx +66 -0
  115. package/src/Prebuilt/components/{LeaveSessionContent.jsx → Leave/LeaveSessionContent.tsx} +20 -6
  116. package/src/Prebuilt/components/{MoreSettings/SplitComponents/MwebLeaveRoom.jsx → Leave/MwebLeaveRoom.tsx} +43 -18
  117. package/src/Prebuilt/components/MetaActions.jsx +15 -23
  118. package/src/Prebuilt/components/MoreSettings/ActionTile.jsx +5 -0
  119. package/src/Prebuilt/components/MoreSettings/ChangeNameContent.jsx +16 -7
  120. package/src/Prebuilt/components/MoreSettings/ChangeNameModal.jsx +1 -1
  121. package/src/Prebuilt/components/MoreSettings/FullScreenItem.jsx +1 -4
  122. package/src/Prebuilt/components/MoreSettings/MoreSettings.tsx +27 -0
  123. package/src/Prebuilt/components/MoreSettings/SplitComponents/DesktopOptions.tsx +216 -0
  124. package/src/Prebuilt/components/MoreSettings/SplitComponents/{MwebOptions.jsx → MwebOptions.tsx} +107 -45
  125. package/src/Prebuilt/components/Notifications/HLSFailureModal.jsx +3 -1
  126. package/src/Prebuilt/components/Notifications/Notifications.jsx +46 -30
  127. package/src/Prebuilt/components/Notifications/PeerNotifications.jsx +14 -2
  128. package/src/Prebuilt/components/Notifications/PermissionErrorModal.jsx +10 -4
  129. package/src/Prebuilt/components/Notifications/ReconnectNotifications.jsx +5 -11
  130. package/src/Prebuilt/components/PIP/PIPComponent.jsx +7 -16
  131. package/src/Prebuilt/components/PIP/PIPManager.js +1 -0
  132. package/src/Prebuilt/components/Pagination.tsx +60 -0
  133. package/src/Prebuilt/components/Playlist/Playlist.jsx +1 -6
  134. package/src/Prebuilt/components/PostLeave.jsx +7 -7
  135. package/src/Prebuilt/components/Preview/{PreviewContainer.jsx → PreviewContainer.tsx} +16 -15
  136. package/src/Prebuilt/components/Preview/{PreviewForm.jsx → PreviewForm.tsx} +16 -8
  137. package/src/Prebuilt/components/Preview/{PreviewJoin.jsx → PreviewJoin.tsx} +48 -22
  138. package/src/Prebuilt/components/RaiseHand.jsx +0 -7
  139. package/src/Prebuilt/components/RoleChangeRequestModal.tsx +119 -0
  140. package/src/Prebuilt/components/ScreenshareDisplay.jsx +4 -10
  141. package/src/Prebuilt/components/ScreenshareTile.jsx +43 -36
  142. package/src/Prebuilt/components/SecondaryTiles.tsx +36 -0
  143. package/src/Prebuilt/components/Settings/LayoutSettings.jsx +2 -12
  144. package/src/Prebuilt/components/Settings/NotificationSettings.jsx +3 -9
  145. package/src/Prebuilt/components/Settings/SettingsModal.jsx +3 -9
  146. package/src/Prebuilt/components/StatsForNerds.jsx +3 -1
  147. package/src/Prebuilt/components/TileMenu/TileMenu.jsx +16 -17
  148. package/src/Prebuilt/components/TileMenu/TileMenuContent.jsx +33 -27
  149. package/src/Prebuilt/components/Toast/ToastConfig.jsx +58 -15
  150. package/src/Prebuilt/components/VideoLayouts/EqualProminence.tsx +65 -0
  151. package/src/Prebuilt/components/VideoLayouts/Grid.tsx +43 -0
  152. package/src/Prebuilt/components/VideoLayouts/GridLayout.tsx +110 -0
  153. package/src/Prebuilt/components/VideoLayouts/ProminenceLayout.tsx +74 -0
  154. package/src/Prebuilt/components/VideoLayouts/RoleProminence.tsx +59 -0
  155. package/src/Prebuilt/components/VideoLayouts/ScreenshareLayout.tsx +52 -0
  156. package/src/Prebuilt/components/VideoLayouts/interface.ts +10 -0
  157. package/src/Prebuilt/components/VideoTile.jsx +116 -74
  158. package/src/Prebuilt/components/conference.jsx +86 -85
  159. package/src/Prebuilt/components/hooks/useAutoStartStreaming.tsx +57 -0
  160. package/src/Prebuilt/components/hooks/useMetadata.jsx +19 -3
  161. package/src/Prebuilt/components/hooks/useRedirectToLeave.tsx +34 -0
  162. package/src/Prebuilt/components/hooks/useRoleProminencePeers.tsx +38 -0
  163. package/src/Prebuilt/components/hooks/useTileLayout.tsx +127 -0
  164. package/src/Prebuilt/components/hooks/useVideoTileLayout.ts +26 -0
  165. package/src/Prebuilt/components/pdfAnnotator/pdfFileOptions.jsx +5 -72
  166. package/src/Prebuilt/components/pdfAnnotator/submitPdf.jsx +4 -45
  167. package/src/Prebuilt/components/pdfAnnotator/uploadedFile.jsx +2 -17
  168. package/src/Prebuilt/components/peerTileUtils.jsx +1 -1
  169. package/src/Prebuilt/images/empty-chat.svg +12 -0
  170. package/src/Prebuilt/layouts/EmbedView.jsx +17 -50
  171. package/src/Prebuilt/layouts/HLSView.jsx +138 -51
  172. package/src/Prebuilt/layouts/PDFView.jsx +1 -11
  173. package/src/Prebuilt/layouts/SidePane.tsx +108 -0
  174. package/src/Prebuilt/layouts/VideoStreamingSection.tsx +96 -0
  175. package/src/Prebuilt/layouts/WhiteboardView.jsx +10 -34
  176. package/src/Prebuilt/plugins/FlyingEmoji.jsx +14 -2
  177. package/src/Prebuilt/plugins/VirtualBackground/VirtualBackground.jsx +1 -4
  178. package/src/Prebuilt/plugins/whiteboard/{ToggleWhiteboard.jsx → ToggleWhiteboard.tsx} +5 -9
  179. package/src/Prebuilt/primitives/DialogContent.jsx +15 -11
  180. package/src/Prebuilt/provider/roomLayoutProvider/constants/index.ts +17 -2
  181. package/src/Prebuilt/provider/roomLayoutProvider/hooks/useFetchRoomLayout.ts +36 -13
  182. package/src/Prebuilt/provider/roomLayoutProvider/hooks/useInsetEnabled.ts +10 -0
  183. package/src/Prebuilt/provider/roomLayoutProvider/hooks/useRoomLayoutScreen.ts +65 -0
  184. package/src/Prebuilt/provider/roomLayoutProvider/index.tsx +17 -6
  185. package/src/Prebuilt/services/FeatureFlags.jsx +0 -1
  186. package/src/VideoTile/StyledVideoTile.tsx +1 -0
  187. package/dist/HLSView-P57IRMAR.js.map +0 -7
  188. package/dist/PinnedTrackView-4FYJEBTB.js +0 -102
  189. package/dist/PinnedTrackView-4FYJEBTB.js.map +0 -7
  190. package/dist/VirtualBackground-GGCQJ5JM.js.map +0 -7
  191. package/dist/chunk-IVTWKQI3.js +0 -827
  192. package/dist/chunk-IVTWKQI3.js.map +0 -7
  193. package/dist/chunk-OSM4QEQG.js.map +0 -7
  194. package/dist/chunk-P5X32KOD.js.map +0 -7
  195. package/dist/chunk-RVCZPPTL.js +0 -1100
  196. package/dist/chunk-RVCZPPTL.js.map +0 -7
  197. package/dist/conference-P6I6ESVF.js +0 -8995
  198. package/dist/conference-P6I6ESVF.js.map +0 -7
  199. package/src/Prebuilt/components/AudioLevel/BeamSpeakerLabelsLogging.jsx +0 -16
  200. package/src/Prebuilt/components/Chat/ChatFooter.jsx +0 -150
  201. package/src/Prebuilt/components/Chat/ChatHeader.jsx +0 -67
  202. package/src/Prebuilt/components/Connection/TileConnection.jsx +0 -39
  203. package/src/Prebuilt/components/EqualProminence.jsx +0 -180
  204. package/src/Prebuilt/components/FirstPersonDisplay.jsx +0 -50
  205. package/src/Prebuilt/components/Footer/Footer.jsx +0 -73
  206. package/src/Prebuilt/components/Header/Header.jsx +0 -8
  207. package/src/Prebuilt/components/Header/StreamingHeader.jsx +0 -54
  208. package/src/Prebuilt/components/LeaveCard.jsx +0 -19
  209. package/src/Prebuilt/components/LeaveRoom.jsx +0 -94
  210. package/src/Prebuilt/components/MoreSettings/MoreSettings.jsx +0 -10
  211. package/src/Prebuilt/components/MoreSettings/SplitComponents/DesktopOptions.jsx +0 -219
  212. package/src/Prebuilt/components/Notifications/MessageNotifications.jsx +0 -25
  213. package/src/Prebuilt/components/Pagination.jsx +0 -29
  214. package/src/Prebuilt/components/RoleChangeRequestModal.jsx +0 -26
  215. package/src/Prebuilt/components/VideoList.jsx +0 -73
  216. package/src/Prebuilt/components/gridView.jsx +0 -85
  217. package/src/Prebuilt/components/hooks/useFeatures.js +0 -22
  218. package/src/Prebuilt/components/hooks/useNavigation.js +0 -19
  219. package/src/Prebuilt/components/hooks/useSkipPreview.jsx +0 -20
  220. package/src/Prebuilt/components/pdfAnnotator/pdfErrorView.jsx +0 -29
  221. package/src/Prebuilt/images/Logo.svg +0 -8
  222. package/src/Prebuilt/layouts/ActiveSpeakerView.jsx +0 -34
  223. package/src/Prebuilt/layouts/InsetView.jsx +0 -260
  224. package/src/Prebuilt/layouts/PinnedTrackView.jsx +0 -59
  225. package/src/Prebuilt/layouts/SidePane.jsx +0 -52
  226. package/src/Prebuilt/layouts/mainGridView.jsx +0 -98
  227. package/src/Prebuilt/layouts/mainView.jsx +0 -141
  228. package/src/Prebuilt/layouts/screenShareView.jsx +0 -183
  229. /package/{src/Prebuilt/components/Header/index.jsx → dist/Prebuilt/components/Header/index.d.ts} +0 -0
  230. /package/src/Prebuilt/components/{ScreenShare.jsx → ScreenShareToggle.jsx} +0 -0
  231. /package/src/{assets → Prebuilt/images}/android-perm-1.png +0 -0
  232. /package/src/{assets → Prebuilt/images}/ios-perm-0.png +0 -0
@@ -1,94 +0,0 @@
1
- import React from 'react';
2
- import { useParams } from 'react-router-dom';
3
- import { useMedia } from 'react-use';
4
- import { selectIsConnectedToRoom, selectPermissions, useHMSActions, useHMSStore } from '@100mslive/react-sdk';
5
- import { DesktopLeaveRoom } from './MoreSettings/SplitComponents/DesktopLeaveRoom';
6
- import { MwebLeaveRoom } from './MoreSettings/SplitComponents/MwebLeaveRoom';
7
- import { PictureInPicture } from './PIP/PIPManager';
8
- import { ToastManager } from './Toast/ToastManager';
9
- import { IconButton } from '../../IconButton';
10
- import { config as cssConfig, styled } from '../../Theme';
11
- import { useHMSPrebuiltContext } from '../AppContext';
12
- import { useNavigation } from './hooks/useNavigation';
13
-
14
- export const LeaveRoom = () => {
15
- const navigate = useNavigation();
16
- const params = useParams();
17
- const isConnected = useHMSStore(selectIsConnectedToRoom);
18
- const permissions = useHMSStore(selectPermissions);
19
- const isMobile = useMedia(cssConfig.media.md);
20
- const hmsActions = useHMSActions();
21
- const { showLeave, onLeave } = useHMSPrebuiltContext();
22
-
23
- const stopStream = async () => {
24
- try {
25
- console.log('Stopping HLS stream');
26
- await hmsActions.stopHLSStreaming();
27
- ToastManager.addToast({ title: 'Stopping the stream' });
28
- } catch (e) {
29
- console.error('Error stopping stream', e);
30
- ToastManager.addToast({ title: 'Error in stopping the stream', type: 'error' });
31
- }
32
- };
33
-
34
- const redirectToLeavePage = () => {
35
- if (showLeave) {
36
- if (params.role) {
37
- navigate('/leave/' + params.roomId + '/' + params.role);
38
- } else {
39
- navigate('/leave/' + params.roomId);
40
- }
41
- }
42
- PictureInPicture.stop().catch(() => console.error('stopping pip'));
43
- ToastManager.clearAllToast();
44
- onLeave?.();
45
- };
46
-
47
- const leaveRoom = () => {
48
- hmsActions.leave();
49
- redirectToLeavePage();
50
- };
51
-
52
- // const endRoom = () => {
53
- // hmsActions.endRoom(false, 'End Room');
54
- // redirectToLeavePage();
55
- // };
56
-
57
- if (!permissions || !isConnected) {
58
- return null;
59
- }
60
- return isMobile ? (
61
- <MwebLeaveRoom leaveIconButton={LeaveIconButton} leaveRoom={leaveRoom} stopStream={stopStream} />
62
- ) : (
63
- <DesktopLeaveRoom
64
- leaveIconButton={LeaveIconButton}
65
- menuTriggerButton={MenuTriggerButton}
66
- leaveRoom={leaveRoom}
67
- stopStream={stopStream}
68
- />
69
- );
70
- };
71
-
72
- const LeaveIconButton = styled(IconButton, {
73
- color: '$on_primary_high',
74
- h: '$14',
75
- px: '$4',
76
- r: '$1',
77
- bg: '$alert_error_default',
78
- '&:not([disabled]):hover': {
79
- bg: '$alert_error_bright',
80
- },
81
- '&:not([disabled]):active': {
82
- bg: '$alert_error_default',
83
- },
84
- '@md': {
85
- mx: 0,
86
- },
87
- });
88
-
89
- const MenuTriggerButton = styled(LeaveIconButton, {
90
- borderLeft: '1px solid $alert_error_dim',
91
- borderTopLeftRadius: 0,
92
- borderBottomLeftRadius: 0,
93
- px: '$2',
94
- });
@@ -1,10 +0,0 @@
1
- import React from 'react';
2
- import { useMedia } from 'react-use';
3
- import { DesktopOptions } from './SplitComponents/DesktopOptions';
4
- import { MwebOptions } from './SplitComponents/MwebOptions';
5
- import { config as cssConfig } from '../../../';
6
-
7
- export const MoreSettings = () => {
8
- const isMobile = useMedia(cssConfig.media.md);
9
- return isMobile ? <MwebOptions /> : <DesktopOptions />;
10
- };
@@ -1,219 +0,0 @@
1
- import React, { Fragment, useState } from 'react';
2
- import { HMSHLSPlayer } from '@100mslive/hls-player';
3
- import {
4
- selectAppData,
5
- selectLocalPeerID,
6
- selectLocalPeerRoleName,
7
- useHMSActions,
8
- useHMSStore,
9
- } from '@100mslive/react-sdk';
10
- import { BrbIcon, CheckIcon, DragHandleIcon, HandIcon, InfoIcon, PipIcon, SettingsIcon } from '@100mslive/react-icons';
11
- import { Checkbox, Dropdown, Flex, Text, Tooltip } from '../../../../';
12
- import IconButton from '../../../IconButton';
13
- import { PIP } from '../../PIP';
14
- import { RoleChangeModal } from '../../RoleChangeModal';
15
- import SettingsModal from '../../Settings/SettingsModal';
16
- import StartRecording from '../../Settings/StartRecording';
17
- import { StatsForNerds } from '../../StatsForNerds';
18
- import { BulkRoleChangeModal } from '.././BulkRoleChangeModal';
19
- import { FullScreenItem } from '.././FullScreenItem';
20
- import { MuteAllModal } from '.././MuteAllModal';
21
- import { useHLSViewerRole } from '../../AppData/useUISettings';
22
- import { useDropdownList } from '../../hooks/useDropdownList';
23
- import { useIsFeatureEnabled } from '../../hooks/useFeatures';
24
- import { useMyMetadata } from '../../hooks/useMetadata';
25
- import { useShowStreamingUI } from '../../../common/hooks';
26
- import { FeatureFlags } from '../../../services/FeatureFlags';
27
- import { APP_DATA, FEATURE_LIST, isMacOS } from '../../../common/constants';
28
-
29
- const MODALS = {
30
- CHANGE_NAME: 'changeName',
31
- SELF_ROLE_CHANGE: 'selfRoleChange',
32
- MORE_SETTINGS: 'moreSettings',
33
- START_RECORDING: 'startRecording',
34
- DEVICE_SETTINGS: 'deviceSettings',
35
- STATS_FOR_NERDS: 'statsForNerds',
36
- BULK_ROLE_CHANGE: 'bulkRoleChange',
37
- MUTE_ALL: 'muteAll',
38
- EMBED_URL: 'embedUrl',
39
- };
40
-
41
- export const DesktopOptions = () => {
42
- const localPeerId = useHMSStore(selectLocalPeerID);
43
- const localPeerRole = useHMSStore(selectLocalPeerRoleName);
44
- const hmsActions = useHMSActions();
45
- const enablHlsStats = useHMSStore(selectAppData(APP_DATA.hlsStats));
46
- const isSFNEnabled = useIsFeatureEnabled(FEATURE_LIST.STARTS_FOR_NERDS);
47
- const [openModals, setOpenModals] = useState(new Set());
48
- const { isHandRaised, isBRBOn, toggleHandRaise, toggleBRB } = useMyMetadata();
49
- const isHandRaiseEnabled = useIsFeatureEnabled(FEATURE_LIST.HAND_RAISE);
50
- const isBRBEnabled = useIsFeatureEnabled(FEATURE_LIST.BRB);
51
- const showStreamingUI = useShowStreamingUI();
52
- const hlsViewerRole = useHLSViewerRole();
53
- const isHlsViewer = hlsViewerRole === localPeerRole;
54
- const isPIPEnabled = useIsFeatureEnabled(FEATURE_LIST.PICTURE_IN_PICTURE);
55
-
56
- useDropdownList({ open: openModals.size > 0, name: 'MoreSettings' });
57
-
58
- const updateState = (modalName, value) => {
59
- setOpenModals(modals => {
60
- const copy = new Set(modals);
61
- if (value) {
62
- // avoiding extra set state trigger which removes currently open dialog by clearing set.
63
- copy.clear();
64
- copy.add(modalName);
65
- } else {
66
- copy.delete(modalName);
67
- }
68
- return copy;
69
- });
70
- };
71
-
72
- return (
73
- <Fragment>
74
- <Dropdown.Root
75
- open={openModals.has(MODALS.MORE_SETTINGS)}
76
- onOpenChange={value => updateState(MODALS.MORE_SETTINGS, value)}
77
- modal={false}
78
- >
79
- <Dropdown.Trigger asChild data-testid="more_settings_btn">
80
- <IconButton>
81
- <Tooltip title="More options">
82
- <DragHandleIcon />
83
- </Tooltip>
84
- </IconButton>
85
- </Dropdown.Trigger>
86
-
87
- <Dropdown.Content
88
- sideOffset={5}
89
- align="end"
90
- css={{
91
- py: '$0',
92
- maxHeight: 'unset',
93
- '@md': { w: '$64' },
94
- "div[role='separator']:first-child": {
95
- display: 'none',
96
- },
97
- }}
98
- >
99
- {isHandRaiseEnabled && !showStreamingUI ? (
100
- <Dropdown.Item onClick={toggleHandRaise} data-testid="raise_hand_btn">
101
- <HandIcon />
102
- <Text variant="sm" css={{ ml: '$4', color: '$on_surface_high' }}>
103
- Raise Hand
104
- </Text>
105
- <Flex justify="end" css={{ color: '$on_surface_high', flexGrow: '1' }}>
106
- {isHandRaised ? <CheckIcon /> : null}
107
- </Flex>
108
- </Dropdown.Item>
109
- ) : null}
110
-
111
- {isBRBEnabled && !showStreamingUI ? (
112
- <Dropdown.Item onClick={toggleBRB} data-testid="brb_btn">
113
- <BrbIcon />
114
- <Text variant="sm" css={{ ml: '$4', color: '$on_surface_high' }}>
115
- Be Right Back
116
- </Text>
117
- <Flex justify="end" css={{ color: '$on_surface_high', flexGrow: '1' }}>
118
- {isBRBOn ? <CheckIcon /> : null}
119
- </Flex>
120
- </Dropdown.Item>
121
- ) : null}
122
-
123
- {(isBRBEnabled || isHandRaiseEnabled) && !showStreamingUI ? (
124
- <Dropdown.ItemSeparator css={{ mx: '0' }} />
125
- ) : null}
126
-
127
- {isPIPEnabled && !isHlsViewer ? (
128
- <Dropdown.Item>
129
- <PIP
130
- content={
131
- <Flex css={{ w: '100%' }}>
132
- <PipIcon />
133
- <Text variant="sm" css={{ ml: '$4' }}>
134
- Picture in picture mode
135
- </Text>
136
- </Flex>
137
- }
138
- />
139
- </Dropdown.Item>
140
- ) : null}
141
-
142
- <FullScreenItem />
143
- {/* {isAllowedToPublish.screen && isEmbedEnabled && (
144
- <EmbedUrl setShowOpenUrl={() => updateState(MODALS.EMBED_URL, true)} />
145
- )} */}
146
-
147
- <Dropdown.ItemSeparator css={{ mx: 0 }} />
148
-
149
- <Dropdown.Item onClick={() => updateState(MODALS.DEVICE_SETTINGS, true)} data-testid="device_settings_btn">
150
- <SettingsIcon />
151
- <Text variant="sm" css={{ ml: '$4' }}>
152
- Settings
153
- </Text>
154
- </Dropdown.Item>
155
-
156
- {FeatureFlags.enableStatsForNerds &&
157
- isSFNEnabled &&
158
- (localPeerRole === 'hls-viewer' ? (
159
- HMSHLSPlayer.isSupported() ? (
160
- <Dropdown.Item
161
- onClick={() => hmsActions.setAppData(APP_DATA.hlsStats, !enablHlsStats)}
162
- data-testid="hls_stats"
163
- >
164
- <Checkbox.Root
165
- css={{ margin: '$2' }}
166
- checked={enablHlsStats}
167
- onCheckedChange={() => hmsActions.setAppData(APP_DATA.hlsStats, !enablHlsStats)}
168
- >
169
- <Checkbox.Indicator>
170
- <CheckIcon width={16} height={16} />
171
- </Checkbox.Indicator>
172
- </Checkbox.Root>
173
- <Flex justify="between" css={{ width: '100%' }}>
174
- <Text variant="sm" css={{ ml: '$4' }}>
175
- Show HLS Stats
176
- </Text>
177
-
178
- <Text variant="sm" css={{ ml: '$4' }}>
179
- {`${isMacOS ? '⌘' : 'ctrl'} + ]`}
180
- </Text>
181
- </Flex>
182
- </Dropdown.Item>
183
- ) : null
184
- ) : (
185
- <Dropdown.Item
186
- onClick={() => updateState(MODALS.STATS_FOR_NERDS, true)}
187
- data-testid="stats_for_nreds_btn"
188
- >
189
- <InfoIcon />
190
- <Text variant="sm" css={{ ml: '$4' }}>
191
- Stats for Nerds
192
- </Text>
193
- </Dropdown.Item>
194
- ))}
195
- </Dropdown.Content>
196
- </Dropdown.Root>
197
- {openModals.has(MODALS.BULK_ROLE_CHANGE) && (
198
- <BulkRoleChangeModal onOpenChange={value => updateState(MODALS.BULK_ROLE_CHANGE, value)} />
199
- )}
200
- {openModals.has(MODALS.MUTE_ALL) && <MuteAllModal onOpenChange={value => updateState(MODALS.MUTE_ALL, value)} />}
201
-
202
- {openModals.has(MODALS.START_RECORDING) && (
203
- <StartRecording open onOpenChange={value => updateState(MODALS.START_RECORDING, value)} />
204
- )}
205
- {openModals.has(MODALS.DEVICE_SETTINGS) && (
206
- <SettingsModal open onOpenChange={value => updateState(MODALS.DEVICE_SETTINGS, value)} />
207
- )}
208
- {FeatureFlags.enableStatsForNerds && openModals.has(MODALS.STATS_FOR_NERDS) && (
209
- <StatsForNerds open onOpenChange={value => updateState(MODALS.STATS_FOR_NERDS, value)} />
210
- )}
211
- {openModals.has(MODALS.SELF_ROLE_CHANGE) && (
212
- <RoleChangeModal peerId={localPeerId} onOpenChange={value => updateState(MODALS.SELF_ROLE_CHANGE, value)} />
213
- )}
214
- {/* {openModals.has(MODALS.EMBED_URL) && (
215
- <EmbedUrlModal onOpenChange={value => updateState(MODALS.EMBED_URL, value)} />
216
- )} */}
217
- </Fragment>
218
- );
219
- };
@@ -1,25 +0,0 @@
1
- import { useEffect } from 'react';
2
- import { HMSNotificationTypes, useHMSNotifications } from '@100mslive/react-sdk';
3
- import { ToastBatcher } from '../Toast/ToastBatcher';
4
- import { useIsHeadless, useSubscribedNotifications } from '../AppData/useUISettings';
5
- import { useIsFeatureEnabled } from '../hooks/useFeatures';
6
- import { FEATURE_LIST, SUBSCRIBED_NOTIFICATIONS } from '../../common/constants';
7
-
8
- export const MessageNotifications = () => {
9
- const notification = useHMSNotifications(HMSNotificationTypes.NEW_MESSAGE);
10
- const isChatEnabled = useIsFeatureEnabled(FEATURE_LIST.CHAT);
11
- const isNewMessageSubscribed = useSubscribedNotifications(SUBSCRIBED_NOTIFICATIONS.NEW_MESSAGE);
12
- const isHeadless = useIsHeadless();
13
- useEffect(() => {
14
- if (!notification) {
15
- return;
16
- }
17
- console.debug(`[${notification.type}]`, notification);
18
- if (!isNewMessageSubscribed || notification.data?.ignored || !isChatEnabled) {
19
- return;
20
- }
21
- ToastBatcher.showToast({ notification });
22
- }, [notification, isNewMessageSubscribed, isHeadless, isChatEnabled]);
23
-
24
- return null;
25
- };
@@ -1,29 +0,0 @@
1
- import React from 'react';
2
- import { ChevronLeftIcon, ChevronRightIcon } from '@100mslive/react-icons';
3
- import { StyledPagination } from '../../Pagination';
4
-
5
- export const Pagination = ({ page, onPageChange, numPages }) => {
6
- const disableLeft = page === 0;
7
- const disableRight = page === numPages - 1;
8
- const nextPage = () => {
9
- onPageChange(Math.min(page + 1, numPages - 1));
10
- };
11
- const prevPage = () => {
12
- onPageChange(Math.max(page - 1, 0));
13
- };
14
- return (
15
- <StyledPagination.Root>
16
- <StyledPagination.Chevron disabled={disableLeft} onClick={prevPage}>
17
- <ChevronLeftIcon width={16} height={16} style={{ cursor: disableLeft ? 'not-allowed' : 'pointer' }} />
18
- </StyledPagination.Chevron>
19
- <StyledPagination.Dots>
20
- {[...Array(numPages)].map((_, i) => (
21
- <StyledPagination.Dot key={i} active={page === i} onClick={() => onPageChange(i)} />
22
- ))}
23
- </StyledPagination.Dots>
24
- <StyledPagination.Chevron disabled={disableRight} onClick={nextPage}>
25
- <ChevronRightIcon width={16} height={16} style={{ cursor: disableRight ? 'not-allowed' : 'pointer' }} />
26
- </StyledPagination.Chevron>
27
- </StyledPagination.Root>
28
- );
29
- };
@@ -1,26 +0,0 @@
1
- import React from 'react';
2
- import { selectRoleChangeRequest, useHMSActions, useHMSStore } from '@100mslive/react-sdk';
3
- import { RequestDialog } from '../primitives/DialogContent';
4
- import { useIsHeadless } from './AppData/useUISettings';
5
-
6
- export const RoleChangeRequestModal = () => {
7
- const hmsActions = useHMSActions();
8
- const isHeadless = useIsHeadless();
9
- const roleChangeRequest = useHMSStore(selectRoleChangeRequest);
10
-
11
- if (!roleChangeRequest?.role || isHeadless) {
12
- return null;
13
- }
14
-
15
- return (
16
- <RequestDialog
17
- title="Role Change Request"
18
- onOpenChange={value => !value && hmsActions.rejectChangeRole(roleChangeRequest)}
19
- body={`${roleChangeRequest?.requestedBy?.name} has requested you to change your role to ${roleChangeRequest?.role?.name}.`}
20
- onAction={() => {
21
- hmsActions.acceptChangeRole(roleChangeRequest);
22
- }}
23
- actionText="Accept"
24
- />
25
- );
26
- };
@@ -1,73 +0,0 @@
1
- import React, { Fragment, useEffect, useState } from 'react';
2
- import { useVideoList } from '@100mslive/react-sdk';
3
- import { useTheme } from '../../Theme';
4
- import { StyledVideoList } from '../../VideoList';
5
- import { Pagination } from './Pagination';
6
- import ScreenshareTile from './ScreenshareTile';
7
- import VideoTile from './VideoTile';
8
- import { useAppConfig } from './AppData/useAppConfig';
9
- import { useIsHeadless } from './AppData/useUISettings';
10
-
11
- const List = ({ maxTileCount, peers, maxColCount, maxRowCount, includeScreenShareForPeer }) => {
12
- const { aspectRatio } = useTheme();
13
- const tileOffset = useAppConfig('headlessConfig', 'tileOffset');
14
- const isHeadless = useIsHeadless();
15
-
16
- const { ref, pagesWithTiles } = useVideoList({
17
- peers,
18
- maxTileCount,
19
- maxColCount,
20
- maxRowCount,
21
- includeScreenShareForPeer,
22
- aspectRatio,
23
- offsetY: getOffset({ isHeadless, tileOffset }),
24
- });
25
- const [page, setPage] = useState(0);
26
- useEffect(() => {
27
- // currentPageIndex should not exceed pages length
28
- if (page >= pagesWithTiles.length) {
29
- setPage(0);
30
- }
31
- }, [pagesWithTiles.length, page]);
32
- return (
33
- <StyledVideoList.Root ref={ref}>
34
- <StyledVideoList.Container css={{ flexWrap: 'wrap', placeContent: 'center' }}>
35
- {pagesWithTiles && pagesWithTiles.length > 0
36
- ? pagesWithTiles[page]?.map(tile => {
37
- if (tile.width === 0 || tile.height === 0) {
38
- return null;
39
- }
40
- return (
41
- <Fragment key={tile.track?.id || tile.peer.id}>
42
- {tile.track?.source === 'screen' ? (
43
- <ScreenshareTile width={tile.width} height={tile.height} peerId={tile.peer.id} />
44
- ) : (
45
- <VideoTile
46
- width={tile.width}
47
- height={tile.height}
48
- peerId={tile.peer?.id}
49
- trackId={tile.track?.id}
50
- />
51
- )}
52
- </Fragment>
53
- );
54
- })
55
- : null}
56
- </StyledVideoList.Container>
57
- {!isHeadless && pagesWithTiles.length > 1 ? (
58
- <Pagination page={page} onPageChange={setPage} numPages={pagesWithTiles.length} />
59
- ) : null}
60
- </StyledVideoList.Root>
61
- );
62
- };
63
-
64
- const VideoList = React.memo(List);
65
-
66
- const getOffset = ({ tileOffset, isHeadless }) => {
67
- if (!isHeadless || isNaN(Number(tileOffset))) {
68
- return 32;
69
- }
70
- return Number(tileOffset);
71
- };
72
-
73
- export default VideoList;
@@ -1,85 +0,0 @@
1
- import React, { Fragment } from 'react';
2
- import { useMedia } from 'react-use';
3
- import { Box, Flex } from '../../Layout';
4
- import { config as cssConfig } from '../../Theme';
5
- import { FirstPersonDisplay } from './FirstPersonDisplay';
6
- import { Image } from './Image';
7
- import VideoList from './VideoList';
8
- import { useAppConfig } from './AppData/useAppConfig';
9
- import { useIsHeadless } from './AppData/useUISettings';
10
-
11
- const MAX_TILES_FOR_MOBILE = 4;
12
-
13
- /**
14
- * the below variables are for showing webinar etc. related image if required on certain meeting urls
15
- */
16
- const webinarProps = JSON.parse(process.env.REACT_APP_WEBINAR_PROPS || '{}');
17
- const eventRoomIDs = webinarProps?.ROOM_IDS || [];
18
- const eventsImg = webinarProps?.IMAGE_FILE || ''; // the image to show in center
19
- // the link to navigate to when user clicks on the image
20
- const webinarInfoLink = webinarProps?.LINK_HREF || 'https://100ms.live/';
21
-
22
- // The center of the screen shows bigger tiles
23
- export const GridCenterView = ({ peers, maxTileCount }) => {
24
- const mediaQueryLg = cssConfig.media.md;
25
- const limitMaxTiles = useMedia(mediaQueryLg);
26
-
27
- const headlessConfig = useAppConfig('headlessConfig');
28
- const isHeadless = useIsHeadless();
29
- return (
30
- <Fragment>
31
- <Box
32
- css={{
33
- flex: '1 1 0',
34
- height: '100%',
35
- mx: isHeadless && Number(headlessConfig?.tileOffset) === 0 ? '0' : '$8',
36
- '@md': { flex: '2 1 0' },
37
- }}
38
- >
39
- {peers && peers.length > 0 ? (
40
- <VideoList peers={peers} maxTileCount={limitMaxTiles ? MAX_TILES_FOR_MOBILE : maxTileCount} />
41
- ) : eventRoomIDs.some(id => window.location.href.includes(id)) ? (
42
- <Box
43
- css={{
44
- display: 'grid',
45
- placeItems: 'center',
46
- size: '100%',
47
- p: '$12',
48
- }}
49
- >
50
- <a href={webinarInfoLink} target="_blank" rel="noreferrer">
51
- <Image css={{ p: '$4', boxShadow: '$sm' }} alt="Event template" src={eventsImg} />
52
- </a>
53
- </Box>
54
- ) : (
55
- <FirstPersonDisplay />
56
- )}
57
- </Box>
58
- </Fragment>
59
- );
60
- };
61
-
62
- // Side pane shows smaller tiles
63
- export const GridSidePaneView = ({ peers }) => {
64
- const headlessConfig = useAppConfig('headlessConfig');
65
- const isHeadless = useIsHeadless();
66
- return (
67
- <Flex
68
- direction="column"
69
- css={{
70
- flex: '0 0 20%',
71
- mx: isHeadless && Number(headlessConfig?.tileOffset) === 0 ? '0' : '$8',
72
- '@lg': {
73
- flex: '0 0 25%',
74
- },
75
- '@md': {
76
- flex: '1 1 0',
77
- },
78
- }}
79
- >
80
- <Flex css={{ flex: '1 1 0' }} align="end">
81
- {peers && peers.length > 0 && <VideoList peers={peers} maxColCount={1} />}
82
- </Flex>
83
- </Flex>
84
- );
85
- };
@@ -1,22 +0,0 @@
1
- import { selectTemplateAppData, useHMSStore } from '@100mslive/react-sdk';
2
-
3
- export const useFeatures = () => {
4
- let features = useHMSStore(selectTemplateAppData)?.features;
5
- return features && typeof features === 'string' ? features.split(',') : undefined;
6
- };
7
-
8
- export const useIsFeatureEnabled = key => {
9
- let features = useFeatures();
10
- return features ? features.includes(key) : true;
11
- };
12
-
13
- export const useRolePreference = () => {
14
- let preference = useHMSStore(selectTemplateAppData)?.rolePreference;
15
- try {
16
- preference = JSON.parse(preference || '{}');
17
- return preference;
18
- } catch (e) {
19
- console.log('role preference parse error', e);
20
- return undefined;
21
- }
22
- };
@@ -1,19 +0,0 @@
1
- import { useCallback } from 'react';
2
- import { useNavigate } from 'react-router-dom';
3
- import { getRoutePrefix } from '../../common/utils';
4
-
5
- export const useNavigation = () => {
6
- const navigate = useNavigate();
7
- const navigation = useCallback(
8
- path => {
9
- const prefix = getRoutePrefix();
10
- let route = path;
11
- if (prefix && !path.startsWith(prefix)) {
12
- route = `${prefix}${path}`;
13
- }
14
- navigate(route);
15
- },
16
- [navigate],
17
- );
18
- return navigation;
19
- };
@@ -1,20 +0,0 @@
1
- import { useEffect } from 'react';
2
- import { useSearchParam } from 'react-use';
3
- import { useSetUiSettings } from '../AppData/useUISettings';
4
- import { QUERY_PARAM_SKIP_PREVIEW, QUERY_PARAM_SKIP_PREVIEW_HEADFUL, UI_SETTINGS } from '../../common/constants';
5
-
6
- export const useSkipPreview = () => {
7
- // way to skip preview for automated tests, beam recording and streaming
8
- const beamInToken = useSearchParam('token') === 'beam_recording'; // old format to remove
9
- // use this field to join directly for quick testing while in local
10
- const directJoinHeadfulFromEnv = process.env.REACT_APP_HEADLESS_JOIN === 'true';
11
- const directJoinHeadful = useSearchParam(QUERY_PARAM_SKIP_PREVIEW_HEADFUL) === 'true' || directJoinHeadfulFromEnv;
12
- let skipPreview = useSearchParam(QUERY_PARAM_SKIP_PREVIEW) === 'true';
13
- skipPreview = skipPreview || beamInToken || directJoinHeadful;
14
- const [, setIsHeadless] = useSetUiSettings(UI_SETTINGS.isHeadless);
15
- useEffect(() => {
16
- !directJoinHeadful && setIsHeadless(skipPreview);
17
- }, [directJoinHeadful, skipPreview]); //eslint-disable-line
18
-
19
- return skipPreview;
20
- };
@@ -1,29 +0,0 @@
1
- import React from 'react';
2
- import { InfoIcon } from '@100mslive/react-icons';
3
- import { Text } from '../../../';
4
- import { DialogRow } from '../../primitives/DialogContent';
5
-
6
- export const PdfErrorView = ({ isPDFUrlValid }) => {
7
- return (
8
- !isPDFUrlValid && (
9
- <DialogRow
10
- css={{
11
- mt: '-$8',
12
- color: '$alert_error_default',
13
- justifyContent: 'start',
14
- }}
15
- >
16
- <InfoIcon width="12px" height="12px" />
17
- <Text
18
- variant="caption"
19
- css={{
20
- pl: '$1',
21
- color: '$alert_error_default',
22
- }}
23
- >
24
- Please enter a valid PDF URL
25
- </Text>
26
- </DialogRow>
27
- )
28
- );
29
- };
@@ -1,8 +0,0 @@
1
- <svg width="32" height="42" viewBox="0 0 32 42" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <rect x="14.528" y="5.91187" width="2.944" height="30.176" fill="#538DFF"/>
3
- <rect x="22.2692" y="7.19727" width="2.944" height="30.176" transform="rotate(30 22.2692 7.19727)" fill="#538DFF"/>
4
- <rect x="31.088" y="19.5278" width="2.944" height="30.176" transform="rotate(90 31.088 19.5278)" fill="#538DFF"/>
5
- <rect x="29.8026" y="27.269" width="2.944" height="30.176" transform="rotate(120 29.8026 27.269)" fill="#538DFF"/>
6
- <rect x="24.8188" y="33.3304" width="2.944" height="30.176" transform="rotate(150 24.8188 33.3304)" fill="#538DFF"/>
7
- <rect x="28.3306" y="12.181" width="2.944" height="30.176" transform="rotate(60 28.3306 12.181)" fill="#538DFF"/>
8
- </svg>