@100mslive/roomkit-react 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +1 -0
- package/dist/Accordion/Accordion.d.ts +964 -0
- package/dist/Accordion/index.d.ts +979 -0
- package/dist/ActiveSpeakerView-H3VYXANB.js +39 -0
- package/dist/ActiveSpeakerView-H3VYXANB.js.map +7 -0
- package/dist/ActiveSpeakerView-REZLWPPI.css +11 -0
- package/dist/ActiveSpeakerView-REZLWPPI.css.map +7 -0
- package/dist/AudioLevel/AudioLevel.d.ts +8 -0
- package/dist/AudioLevel/index.d.ts +1 -0
- package/dist/Avatar/Avatar.d.ts +487 -0
- package/dist/Avatar/getAvatarBg.d.ts +7 -0
- package/dist/Avatar/index.d.ts +1 -0
- package/dist/Button/Button.d.ts +488 -0
- package/dist/Button/index.d.ts +1 -0
- package/dist/Checkbox/Checkbox.d.ts +958 -0
- package/dist/Checkbox/index.d.ts +1 -0
- package/dist/Collapsible/Collapsible.d.ts +1434 -0
- package/dist/Collapsible/index.d.ts +1 -0
- package/dist/Divider/Divider.d.ts +958 -0
- package/dist/Divider/index.d.ts +1 -0
- package/dist/Dropdown/Dropdown.d.ts +5728 -0
- package/dist/Dropdown/index.d.ts +1 -0
- package/dist/Fieldset/Fieldset.d.ts +477 -0
- package/dist/Fieldset/index.d.ts +1 -0
- package/dist/Footer/Footer.d.ts +3834 -0
- package/dist/Footer/index.d.ts +1 -0
- package/dist/HLSView-3RDXRV7Y.js +689 -0
- package/dist/HLSView-3RDXRV7Y.js.map +7 -0
- package/dist/HLSView-6BVBCQM7.css +11 -0
- package/dist/HLSView-6BVBCQM7.css.map +7 -0
- package/dist/IconButton/IconButton.d.ts +479 -0
- package/dist/IconButton/index.d.ts +1 -0
- package/dist/Input/Input.d.ts +2917 -0
- package/dist/Input/index.d.ts +1 -0
- package/dist/Label/Label.d.ts +479 -0
- package/dist/Label/index.d.ts +1 -0
- package/dist/Layout/Box.d.ts +477 -0
- package/dist/Layout/Flex.d.ts +482 -0
- package/dist/Layout/index.d.ts +2 -0
- package/dist/Link/Link.d.ts +489 -0
- package/dist/Link/index.d.ts +2 -0
- package/dist/Loading/Loading.d.ts +14 -0
- package/dist/Loading/index.d.ts +1 -0
- package/dist/Modal/Dialog.d.ts +3826 -0
- package/dist/Modal/DialogContent.d.ts +3343 -0
- package/dist/Modal/index.d.ts +1 -0
- package/dist/Pagination/StyledPagination.d.ts +1918 -0
- package/dist/Pagination/index.d.ts +1 -0
- package/dist/PinnedTrackView-453PELNU.js +70 -0
- package/dist/PinnedTrackView-453PELNU.js.map +7 -0
- package/dist/PinnedTrackView-QQ5FDXJX.css +11 -0
- package/dist/PinnedTrackView-QQ5FDXJX.css.map +7 -0
- package/dist/Popover/index.d.ts +1436 -0
- package/dist/Progress/index.d.ts +957 -0
- package/dist/QRCode/QRCode.d.ts +3 -0
- package/dist/QRCode/index.d.ts +1 -0
- package/dist/RadioGroup/RadioGroup.d.ts +1435 -0
- package/dist/RadioGroup/index.d.ts +1 -0
- package/dist/ReactSelect/ReactSelect.d.ts +4778 -0
- package/dist/ReactSelect/index.d.ts +1 -0
- package/dist/Select/Select.d.ts +1437 -0
- package/dist/Select/index.d.ts +1 -0
- package/dist/Slider/Slider.d.ts +488 -0
- package/dist/Slider/index.d.ts +1 -0
- package/dist/Stats/Stats.d.ts +19 -0
- package/dist/Stats/StyledStats.d.ts +2872 -0
- package/dist/Stats/formatBytes.d.ts +1 -0
- package/dist/Stats/index.d.ts +1 -0
- package/dist/Switch/Switch.d.ts +482 -0
- package/dist/Switch/index.d.ts +1 -0
- package/dist/Tabs/Tabs.d.ts +1912 -0
- package/dist/Tabs/index.d.ts +1 -0
- package/dist/Text/Text.d.ts +605 -0
- package/dist/Text/index.d.ts +1 -0
- package/dist/Theme/ThemeProvider.d.ts +397 -0
- package/dist/Theme/base.config.d.ts +417 -0
- package/dist/Theme/index.d.ts +3 -0
- package/dist/Theme/stitches.config.d.ts +4702 -0
- package/dist/Theme/themes.d.ts +64 -0
- package/dist/Theme/useSSR.d.ts +6 -0
- package/dist/TileMenu/StyledMenuTile.d.ts +3351 -0
- package/dist/TileMenu/TileMenu.d.ts +6 -0
- package/dist/TileMenu/index.d.ts +1 -0
- package/dist/Toast/Toast.d.ts +2881 -0
- package/dist/Toast/index.d.ts +1 -0
- package/dist/Tooltip/Tooltip.d.ts +14 -0
- package/dist/Tooltip/index.d.ts +1 -0
- package/dist/Video/Video.d.ts +499 -0
- package/dist/Video/index.d.ts +1 -0
- package/dist/VideoList/StyledVideoList.d.ts +1438 -0
- package/dist/VideoList/index.d.ts +2 -0
- package/dist/VideoList/videoListUtils.d.ts +1 -0
- package/dist/VideoTile/StyledVideoTile.d.ts +4309 -0
- package/dist/VideoTile/index.d.ts +1 -0
- package/dist/VirtualBackground-LHYBWUT5.js +158 -0
- package/dist/VirtualBackground-LHYBWUT5.js.map +7 -0
- package/dist/chunk-7YUYZ64D.js +6843 -0
- package/dist/chunk-7YUYZ64D.js.map +7 -0
- package/dist/chunk-HCAGFNXW.js +8270 -0
- package/dist/chunk-HCAGFNXW.js.map +7 -0
- package/dist/chunk-KYYP6ZVK.js +907 -0
- package/dist/chunk-KYYP6ZVK.js.map +7 -0
- package/dist/chunk-ULXGBUSC.js +65 -0
- package/dist/chunk-ULXGBUSC.js.map +7 -0
- package/dist/chunk-XRJXE6UO.js +243 -0
- package/dist/chunk-XRJXE6UO.js.map +7 -0
- package/dist/conference-IDNRO4WK.js +3812 -0
- package/dist/conference-IDNRO4WK.js.map +7 -0
- package/dist/conference-KN6OKGDU.css +11 -0
- package/dist/conference-KN6OKGDU.css.map +7 -0
- package/dist/fixtures/chats.d.ts +4 -0
- package/dist/fixtures/peers.d.ts +3 -0
- package/dist/fixtures/tracks.d.ts +2 -0
- package/dist/index.cjs.css +11 -0
- package/dist/index.cjs.css.map +7 -0
- package/dist/index.cjs.js +22987 -0
- package/dist/index.cjs.js.map +7 -0
- package/dist/index.css +11 -0
- package/dist/index.css.map +7 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.js +133 -0
- package/dist/index.js.map +7 -0
- package/dist/meta.cjs.json +13085 -0
- package/dist/meta.esbuild.json +13693 -0
- package/dist/transcription-BTSB7FZH.js +356 -0
- package/dist/transcription-BTSB7FZH.js.map +7 -0
- package/dist/utils/animations.d.ts +92 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/styles.d.ts +21 -0
- package/package.json +116 -0
- package/src/Accordion/Accordion.stories.tsx +50 -0
- package/src/Accordion/Accordion.tsx +88 -0
- package/src/Accordion/index.ts +8 -0
- package/src/AudioLevel/AudioLevel.tsx +34 -0
- package/src/AudioLevel/index.ts +1 -0
- package/src/Avatar/Avatar.stories.tsx +33 -0
- package/src/Avatar/Avatar.tsx +55 -0
- package/src/Avatar/getAvatarBg.ts +46 -0
- package/src/Avatar/index.ts +1 -0
- package/src/Button/Button.mdx +43 -0
- package/src/Button/Button.stories.tsx +52 -0
- package/src/Button/Button.tsx +144 -0
- package/src/Button/index.tsx +1 -0
- package/src/Chat/Chat.mdx +39 -0
- package/src/Chat/Chat.stories.tsx +39 -0
- package/src/Checkbox/Checkbox.stories.tsx +61 -0
- package/src/Checkbox/Checkbox.tsx +33 -0
- package/src/Checkbox/index.tsx +1 -0
- package/src/Collapsible/Collapsible.tsx +34 -0
- package/src/Collapsible/index.tsx +1 -0
- package/src/Divider/Divider.tsx +45 -0
- package/src/Divider/HorizontalDivider.stories.tsx +34 -0
- package/src/Divider/VerticalDivider.stories.tsx +40 -0
- package/src/Divider/index.ts +1 -0
- package/src/Dropdown/Dropdown.stories.tsx +94 -0
- package/src/Dropdown/Dropdown.tsx +142 -0
- package/src/Dropdown/index.tsx +1 -0
- package/src/Fieldset/Fieldset.stories.tsx +29 -0
- package/src/Fieldset/Fieldset.tsx +11 -0
- package/src/Fieldset/index.tsx +1 -0
- package/src/Footer/Footer.stories.tsx +61 -0
- package/src/Footer/Footer.tsx +47 -0
- package/src/Footer/index.tsx +1 -0
- package/src/IconButton/IconButton.tsx +45 -0
- package/src/IconButton/index.tsx +1 -0
- package/src/Icons/Icons.stories.mdx +10 -0
- package/src/Icons/IconsList.jsx +17 -0
- package/src/Input/Input.stories.tsx +25 -0
- package/src/Input/Input.tsx +105 -0
- package/src/Input/PasswordInput.stories.tsx +53 -0
- package/src/Input/index.tsx +1 -0
- package/src/Introduction/Integrating.stories.mdx +100 -0
- package/src/Introduction/Introduction.stories.mdx +9 -0
- package/src/Label/Label.tsx +8 -0
- package/src/Label/index.ts +1 -0
- package/src/Layout/Box.tsx +3 -0
- package/src/Layout/Flex.tsx +76 -0
- package/src/Layout/index.tsx +2 -0
- package/src/Link/Link.stories.tsx +18 -0
- package/src/Link/Link.tsx +54 -0
- package/src/Link/index.tsx +2 -0
- package/src/Loading/Loading.mdx +15 -0
- package/src/Loading/Loading.stories.tsx +37 -0
- package/src/Loading/Loading.tsx +33 -0
- package/src/Loading/index.ts +1 -0
- package/src/Modal/Dialog.mdx +19 -0
- package/src/Modal/Dialog.stories.tsx +68 -0
- package/src/Modal/Dialog.tsx +26 -0
- package/src/Modal/DialogContent.tsx +63 -0
- package/src/Modal/index.ts +1 -0
- package/src/Pagination/StyledPagination.stories.tsx +80 -0
- package/src/Pagination/StyledPagination.tsx +68 -0
- package/src/Pagination/index.tsx +1 -0
- package/src/Popover/Popover.mdx +9 -0
- package/src/Popover/Popover.stories.tsx +95 -0
- package/src/Popover/index.tsx +26 -0
- package/src/Prebuilt/App.jsx +273 -0
- package/src/Prebuilt/AppContext.jsx +21 -0
- package/src/Prebuilt/IconButton.jsx +19 -0
- package/src/Prebuilt/Prebuilt.stories.tsx +20 -0
- package/src/Prebuilt/common/PeersSorter.js +89 -0
- package/src/Prebuilt/common/constants.js +208 -0
- package/src/Prebuilt/common/hooks.js +47 -0
- package/src/Prebuilt/common/roles.js +4 -0
- package/src/Prebuilt/common/useSortedPeers.js +28 -0
- package/src/Prebuilt/common/utils.js +91 -0
- package/src/Prebuilt/components/AppData/AppData.jsx +189 -0
- package/src/Prebuilt/components/AppData/useAppConfig.js +7 -0
- package/src/Prebuilt/components/AppData/useAppLayout.js +6 -0
- package/src/Prebuilt/components/AppData/useChatState.js +18 -0
- package/src/Prebuilt/components/AppData/useSidepane.js +49 -0
- package/src/Prebuilt/components/AppData/useUISettings.js +164 -0
- package/src/Prebuilt/components/AudioLevel/BeamSpeakerLabelsLogging.jsx +16 -0
- package/src/Prebuilt/components/AudioVideoToggle.jsx +67 -0
- package/src/Prebuilt/components/AuthToken.jsx +133 -0
- package/src/Prebuilt/components/BottomActionSheet/BottomActionSheet.jsx +96 -0
- package/src/Prebuilt/components/BottomActionSheet/BottomActionSheet.stories.tsx +46 -0
- package/src/Prebuilt/components/Chat/Chat.jsx +155 -0
- package/src/Prebuilt/components/Chat/ChatBody.jsx +370 -0
- package/src/Prebuilt/components/Chat/ChatFooter.jsx +150 -0
- package/src/Prebuilt/components/Chat/ChatHeader.jsx +67 -0
- package/src/Prebuilt/components/Chat/ChatSelector.jsx +162 -0
- package/src/Prebuilt/components/Chat/useEmojiPickerStyles.js +30 -0
- package/src/Prebuilt/components/Chat/useUnreadCount.js +17 -0
- package/src/Prebuilt/components/Connection/ConnectionIndicator.jsx +80 -0
- package/src/Prebuilt/components/Connection/TileConnection.jsx +40 -0
- package/src/Prebuilt/components/Connection/connectionQualityUtils.js +39 -0
- package/src/Prebuilt/components/EmojiReaction.jsx +138 -0
- package/src/Prebuilt/components/ErrorBoundary.jsx +105 -0
- package/src/Prebuilt/components/FirstPersonDisplay.jsx +50 -0
- package/src/Prebuilt/components/Footer/ChatToggle.jsx +27 -0
- package/src/Prebuilt/components/Footer/ConferencingFooter.jsx +104 -0
- package/src/Prebuilt/components/Footer/StreamingFooter.jsx +71 -0
- package/src/Prebuilt/components/Footer.jsx +8 -0
- package/src/Prebuilt/components/FullPageProgress.jsx +11 -0
- package/src/Prebuilt/components/GoLiveButton.jsx +45 -0
- package/src/Prebuilt/components/HMSVideo/Controls.jsx +21 -0
- package/src/Prebuilt/components/HMSVideo/FullscreenButton.jsx +18 -0
- package/src/Prebuilt/components/HMSVideo/HLSAutoplayBlockedPrompt.jsx +35 -0
- package/src/Prebuilt/components/HMSVideo/HLSQualitySelector.jsx +82 -0
- package/src/Prebuilt/components/HMSVideo/HMSVIdeoUtils.js +27 -0
- package/src/Prebuilt/components/HMSVideo/HMSVideo.jsx +11 -0
- package/src/Prebuilt/components/HMSVideo/PlayButton.jsx +13 -0
- package/src/Prebuilt/components/HMSVideo/VideoProgress.jsx +77 -0
- package/src/Prebuilt/components/HMSVideo/VideoTime.jsx +31 -0
- package/src/Prebuilt/components/HMSVideo/VolumeControl.jsx +39 -0
- package/src/Prebuilt/components/HMSVideo/index.js +19 -0
- package/src/Prebuilt/components/Header/AdditionalRoomState.jsx +217 -0
- package/src/Prebuilt/components/Header/AmbientMusic.jsx +88 -0
- package/src/Prebuilt/components/Header/ConferencingHeader.jsx +29 -0
- package/src/Prebuilt/components/Header/Header.jsx +8 -0
- package/src/Prebuilt/components/Header/HeaderComponents.jsx +41 -0
- package/src/Prebuilt/components/Header/ParticipantFilter.jsx +91 -0
- package/src/Prebuilt/components/Header/ParticipantList.jsx +337 -0
- package/src/Prebuilt/components/Header/StreamActions.jsx +225 -0
- package/src/Prebuilt/components/Header/StreamingHeader.jsx +55 -0
- package/src/Prebuilt/components/Header/index.jsx +1 -0
- package/src/Prebuilt/components/HlsStatsOverlay.jsx +101 -0
- package/src/Prebuilt/components/Image.jsx +7 -0
- package/src/Prebuilt/components/Input/KeyboardInputManager.js +107 -0
- package/src/Prebuilt/components/LeaveRoom.jsx +202 -0
- package/src/Prebuilt/components/MetaActions.jsx +45 -0
- package/src/Prebuilt/components/MoreSettings/BulkRoleChangeModal.jsx +139 -0
- package/src/Prebuilt/components/MoreSettings/ChangeNameModal.jsx +92 -0
- package/src/Prebuilt/components/MoreSettings/ChangeSelfRole.jsx +67 -0
- package/src/Prebuilt/components/MoreSettings/EmbedUrl.jsx +106 -0
- package/src/Prebuilt/components/MoreSettings/FullScreenItem.jsx +29 -0
- package/src/Prebuilt/components/MoreSettings/MoreSettings.jsx +225 -0
- package/src/Prebuilt/components/MoreSettings/MuteAllModal.jsx +90 -0
- package/src/Prebuilt/components/Notifications/AutoplayBlockedModal.jsx +38 -0
- package/src/Prebuilt/components/Notifications/InitErrorModal.jsx +39 -0
- package/src/Prebuilt/components/Notifications/MessageNotifications.jsx +25 -0
- package/src/Prebuilt/components/Notifications/Notifications.jsx +151 -0
- package/src/Prebuilt/components/Notifications/PeerNotifications.jsx +45 -0
- package/src/Prebuilt/components/Notifications/PermissionErrorModal.jsx +67 -0
- package/src/Prebuilt/components/Notifications/ReconnectNotifications.jsx +69 -0
- package/src/Prebuilt/components/Notifications/TrackBulkUnmuteModal.jsx +51 -0
- package/src/Prebuilt/components/Notifications/TrackNotifications.jsx +19 -0
- package/src/Prebuilt/components/Notifications/TrackUnmuteModal.jsx +49 -0
- package/src/Prebuilt/components/Notifications/index.jsx +1 -0
- package/src/Prebuilt/components/PIP/PIPComponent.jsx +82 -0
- package/src/Prebuilt/components/PIP/PIPManager.js +296 -0
- package/src/Prebuilt/components/PIP/SetupMediaSession.js +60 -0
- package/src/Prebuilt/components/PIP/index.jsx +11 -0
- package/src/Prebuilt/components/PIP/pip.test.js +72 -0
- package/src/Prebuilt/components/PIP/pipUtils.js +183 -0
- package/src/Prebuilt/components/Pagination.jsx +29 -0
- package/src/Prebuilt/components/Playlist/Playlist.jsx +129 -0
- package/src/Prebuilt/components/Playlist/PlaylistControls.jsx +172 -0
- package/src/Prebuilt/components/Playlist/PlaylistItem.jsx +51 -0
- package/src/Prebuilt/components/Playlist/VideoPlayer.jsx +95 -0
- package/src/Prebuilt/components/PostLeave.jsx +76 -0
- package/src/Prebuilt/components/Preview/PreviewContainer.jsx +51 -0
- package/src/Prebuilt/components/Preview/PreviewJoin.jsx +196 -0
- package/src/Prebuilt/components/Preview/PreviewName.jsx +37 -0
- package/src/Prebuilt/components/RoleChangeModal.jsx +185 -0
- package/src/Prebuilt/components/RoleChangeRequestModal.jsx +26 -0
- package/src/Prebuilt/components/ScreenShare.jsx +45 -0
- package/src/Prebuilt/components/ScreenshareDisplay.jsx +45 -0
- package/src/Prebuilt/components/ScreenshareHintModal.jsx +37 -0
- package/src/Prebuilt/components/ScreenshareTile.jsx +91 -0
- package/src/Prebuilt/components/Settings/DeviceSettings.jsx +220 -0
- package/src/Prebuilt/components/Settings/LayoutSettings.jsx +91 -0
- package/src/Prebuilt/components/Settings/NotificationSettings.jsx +61 -0
- package/src/Prebuilt/components/Settings/SettingsModal.jsx +171 -0
- package/src/Prebuilt/components/Settings/StartRecording.jsx +130 -0
- package/src/Prebuilt/components/Settings/SwitchWithLabel.jsx +40 -0
- package/src/Prebuilt/components/Settings/common.js +15 -0
- package/src/Prebuilt/components/ShareMenuIcon.jsx +26 -0
- package/src/Prebuilt/components/StatsForNerds.jsx +250 -0
- package/src/Prebuilt/components/Streaming/Common.jsx +132 -0
- package/src/Prebuilt/components/Streaming/HLSStreaming.jsx +226 -0
- package/src/Prebuilt/components/Streaming/RTMPIcon.jsx +24 -0
- package/src/Prebuilt/components/Streaming/RTMPStreaming.jsx +336 -0
- package/src/Prebuilt/components/Streaming/ResolutionInput.jsx +88 -0
- package/src/Prebuilt/components/Streaming/StreamingLanding.jsx +76 -0
- package/src/Prebuilt/components/TileMenu.jsx +275 -0
- package/src/Prebuilt/components/Toast/Toast.jsx +17 -0
- package/src/Prebuilt/components/Toast/ToastBatcher.js +57 -0
- package/src/Prebuilt/components/Toast/ToastConfig.jsx +134 -0
- package/src/Prebuilt/components/Toast/ToastContainer.jsx +30 -0
- package/src/Prebuilt/components/Toast/ToastManager.js +44 -0
- package/src/Prebuilt/components/VideoList.jsx +101 -0
- package/src/Prebuilt/components/VideoTile.jsx +177 -0
- package/src/Prebuilt/components/conference.jsx +164 -0
- package/src/Prebuilt/components/gridView.jsx +85 -0
- package/src/Prebuilt/components/hooks/useDropdownList.jsx +23 -0
- package/src/Prebuilt/components/hooks/useDropdownSelection.jsx +6 -0
- package/src/Prebuilt/components/hooks/useFeatures.js +22 -0
- package/src/Prebuilt/components/hooks/useFullscreen.js +43 -0
- package/src/Prebuilt/components/hooks/useMetadata.jsx +52 -0
- package/src/Prebuilt/components/hooks/useNavigation.js +19 -0
- package/src/Prebuilt/components/hooks/usePlaylist.js +25 -0
- package/src/Prebuilt/components/hooks/usePlaylistMusic.js +35 -0
- package/src/Prebuilt/components/hooks/useScreenshareAudio.js +28 -0
- package/src/Prebuilt/components/hooks/useSetPinnedMessage.js +38 -0
- package/src/Prebuilt/components/hooks/useSkipPreview.jsx +20 -0
- package/src/Prebuilt/components/hooks/useUserPreferences.jsx +25 -0
- package/src/Prebuilt/components/init/Init.jsx +58 -0
- package/src/Prebuilt/components/init/initUtils.js +90 -0
- package/src/Prebuilt/components/pdfAnnotator/pdfErrorView.jsx +29 -0
- package/src/Prebuilt/components/pdfAnnotator/pdfFileOptions.jsx +108 -0
- package/src/Prebuilt/components/pdfAnnotator/pdfHeader.jsx +31 -0
- package/src/Prebuilt/components/pdfAnnotator/pdfInfo.jsx +32 -0
- package/src/Prebuilt/components/pdfAnnotator/shareScreenOptions.jsx +233 -0
- package/src/Prebuilt/components/pdfAnnotator/submitPdf.jsx +89 -0
- package/src/Prebuilt/components/pdfAnnotator/uploadedFile.jsx +85 -0
- package/src/Prebuilt/components/peerTileUtils.jsx +27 -0
- package/src/Prebuilt/hms.js +7 -0
- package/src/Prebuilt/images/first_person.png +0 -0
- package/src/Prebuilt/index.d.ts +15 -0
- package/src/Prebuilt/index.js +2 -0
- package/src/Prebuilt/layouts/ActiveSpeakerView.jsx +34 -0
- package/src/Prebuilt/layouts/EmbedView.jsx +141 -0
- package/src/Prebuilt/layouts/HLSView.jsx +290 -0
- package/src/Prebuilt/layouts/InsetView.jsx +222 -0
- package/src/Prebuilt/layouts/NonPublisherView.jsx +51 -0
- package/src/Prebuilt/layouts/PDFView.jsx +122 -0
- package/src/Prebuilt/layouts/PinnedTrackView.jsx +59 -0
- package/src/Prebuilt/layouts/SidePane.jsx +51 -0
- package/src/Prebuilt/layouts/WaitingView.jsx +51 -0
- package/src/Prebuilt/layouts/WhiteboardView.jsx +66 -0
- package/src/Prebuilt/layouts/mainGridView.jsx +98 -0
- package/src/Prebuilt/layouts/mainView.jsx +113 -0
- package/src/Prebuilt/layouts/screenShareView.jsx +185 -0
- package/src/Prebuilt/plugins/FlyingEmoji.jsx +132 -0
- package/src/Prebuilt/plugins/RemoteStopScreenshare.jsx +18 -0
- package/src/Prebuilt/plugins/VirtualBackground/VirtualBackground.jsx +90 -0
- package/src/Prebuilt/plugins/VirtualBackground/vbutils.js +66 -0
- package/src/Prebuilt/plugins/confetti.jsx +60 -0
- package/src/Prebuilt/plugins/transcription/Transcriber.js +216 -0
- package/src/Prebuilt/plugins/transcription/TranscriptionButton.jsx +138 -0
- package/src/Prebuilt/plugins/transcription/index.jsx +1 -0
- package/src/Prebuilt/plugins/whiteboard/PusherCommunicationProvider.js +110 -0
- package/src/Prebuilt/plugins/whiteboard/README.md +29 -0
- package/src/Prebuilt/plugins/whiteboard/ToggleWhiteboard.jsx +43 -0
- package/src/Prebuilt/plugins/whiteboard/Whiteboard.css +12 -0
- package/src/Prebuilt/plugins/whiteboard/Whiteboard.jsx +11 -0
- package/src/Prebuilt/plugins/whiteboard/WhiteboardEvents.js +8 -0
- package/src/Prebuilt/plugins/whiteboard/index.js +3 -0
- package/src/Prebuilt/plugins/whiteboard/useMultiplayerState.js +212 -0
- package/src/Prebuilt/plugins/whiteboard/useWhiteboardMetadata.js +47 -0
- package/src/Prebuilt/primitives/DialogContent.jsx +280 -0
- package/src/Prebuilt/primitives/DropdownTrigger.jsx +46 -0
- package/src/Prebuilt/services/FeatureFlags.jsx +47 -0
- package/src/Prebuilt/services/tokenService.js +49 -0
- package/src/Progress/index.tsx +17 -0
- package/src/QRCode/QRCode.mdx +9 -0
- package/src/QRCode/QRCode.stories.tsx +29 -0
- package/src/QRCode/QRCode.tsx +6 -0
- package/src/QRCode/index.tsx +1 -0
- package/src/RadioGroup/RadioGroup.stories.tsx +32 -0
- package/src/RadioGroup/RadioGroup.tsx +33 -0
- package/src/RadioGroup/index.tsx +1 -0
- package/src/ReactSelect/ReactSelect.stories.tsx +83 -0
- package/src/ReactSelect/ReactSelect.tsx +97 -0
- package/src/ReactSelect/index.ts +1 -0
- package/src/Select/Select.stories.tsx +33 -0
- package/src/Select/Select.tsx +63 -0
- package/src/Select/index.ts +1 -0
- package/src/Slider/Slider.stories.tsx +21 -0
- package/src/Slider/Slider.tsx +70 -0
- package/src/Slider/index.ts +1 -0
- package/src/Stats/Stats.tsx +211 -0
- package/src/Stats/StyledStats.tsx +57 -0
- package/src/Stats/formatBytes.ts +19 -0
- package/src/Stats/index.tsx +1 -0
- package/src/Switch/Switch.mdx +11 -0
- package/src/Switch/Switch.stories.tsx +46 -0
- package/src/Switch/Switch.tsx +52 -0
- package/src/Switch/index.ts +1 -0
- package/src/Tabs/Tabs.stories.tsx +77 -0
- package/src/Tabs/Tabs.tsx +41 -0
- package/src/Tabs/index.tsx +1 -0
- package/src/Text/Text.stories.tsx +21 -0
- package/src/Text/Text.tsx +149 -0
- package/src/Text/index.tsx +1 -0
- package/src/Theme/Theme.stories.mdx +8 -0
- package/src/Theme/ThemeProvider.tsx +104 -0
- package/src/Theme/ThemeStory.jsx +58 -0
- package/src/Theme/base.config.ts +264 -0
- package/src/Theme/index.tsx +3 -0
- package/src/Theme/stitches.config.ts +100 -0
- package/src/Theme/themes.ts +70 -0
- package/src/Theme/useSSR.tsx +24 -0
- package/src/TileMenu/StyledMenuTile.tsx +101 -0
- package/src/TileMenu/TileMenu.tsx +96 -0
- package/src/TileMenu/index.tsx +1 -0
- package/src/Toast/AppToast.stories.tsx +56 -0
- package/src/Toast/Toast.mdx +19 -0
- package/src/Toast/Toast.stories.tsx +57 -0
- package/src/Toast/Toast.tsx +168 -0
- package/src/Toast/index.tsx +1 -0
- package/src/Tooltip/Tooltip.stories.tsx +62 -0
- package/src/Tooltip/Tooltip.tsx +79 -0
- package/src/Tooltip/index.ts +1 -0
- package/src/Video/UseVideo.mdx +22 -0
- package/src/Video/UseVideo.stories.tsx +26 -0
- package/src/Video/Video.mdx +24 -0
- package/src/Video/Video.stories.tsx +27 -0
- package/src/Video/Video.tsx +61 -0
- package/src/Video/index.tsx +1 -0
- package/src/VideoList/StyledVideoList.tsx +39 -0
- package/src/VideoList/VideoList.stories.tsx +92 -0
- package/src/VideoList/index.tsx +2 -0
- package/src/VideoList/videoListUtils.tsx +20 -0
- package/src/VideoTile/StyledVideoTile.tsx +148 -0
- package/src/VideoTile/VideoTile.mdx +28 -0
- package/src/VideoTile/VideoTile.stories.tsx +32 -0
- package/src/VideoTile/index.tsx +1 -0
- package/src/fixtures/chats.ts +25 -0
- package/src/fixtures/peers.ts +24 -0
- package/src/fixtures/tracks.ts +11 -0
- package/src/index.ts +38 -0
- package/src/store/SetupFakeStore.ts +33 -0
- package/src/store/StorybookSDK.ts +229 -0
- package/src/utils/animations.ts +90 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/styles.ts +22 -0
@@ -0,0 +1,89 @@
|
|
1
|
+
import { selectDominantSpeaker } from '@100mslive/hms-video-store';
|
2
|
+
|
3
|
+
class PeersSorter {
|
4
|
+
listeners = new Set();
|
5
|
+
storeUnsubscribe;
|
6
|
+
|
7
|
+
constructor(store) {
|
8
|
+
this.store = store;
|
9
|
+
this.peers = new Map();
|
10
|
+
this.lruPeers = new Set();
|
11
|
+
this.speaker = undefined;
|
12
|
+
}
|
13
|
+
|
14
|
+
setPeersAndTilesPerPage = ({ peers, tilesPerPage }) => {
|
15
|
+
this.tilesPerPage = tilesPerPage;
|
16
|
+
const peerIds = new Set(peers.map(peer => peer.id));
|
17
|
+
// remove existing peers which are no longer provided
|
18
|
+
this.peers.forEach((_, key) => {
|
19
|
+
if (!peerIds.has(key)) {
|
20
|
+
this.peers.delete(key);
|
21
|
+
}
|
22
|
+
});
|
23
|
+
this.lruPeers = new Set([...this.lruPeers].filter(peerId => peerIds.has(peerId)));
|
24
|
+
peers.forEach(peer => {
|
25
|
+
this.peers.set(peer.id, peer);
|
26
|
+
if (this.lruPeers.size < tilesPerPage) {
|
27
|
+
this.lruPeers.add(peer.id);
|
28
|
+
}
|
29
|
+
});
|
30
|
+
if (!this.storeUnsubscribe) {
|
31
|
+
this.storeUnsubscribe = this.store.subscribe(this.onDominantSpeakerChange, selectDominantSpeaker);
|
32
|
+
}
|
33
|
+
this.moveSpeakerToFront(this.speaker);
|
34
|
+
};
|
35
|
+
|
36
|
+
onUpdate = cb => {
|
37
|
+
this.listeners.add(cb);
|
38
|
+
};
|
39
|
+
|
40
|
+
stop = () => {
|
41
|
+
this.updateListeners();
|
42
|
+
this.listeners.clear();
|
43
|
+
this.storeUnsubscribe?.();
|
44
|
+
};
|
45
|
+
|
46
|
+
moveSpeakerToFront = speaker => {
|
47
|
+
if (!speaker) {
|
48
|
+
this.updateListeners();
|
49
|
+
return;
|
50
|
+
}
|
51
|
+
if (this.lruPeers.has(speaker.id) && this.lruPeers.size <= this.tilesPerPage) {
|
52
|
+
this.updateListeners();
|
53
|
+
return;
|
54
|
+
}
|
55
|
+
// delete to insert at beginning
|
56
|
+
this.lruPeers.delete(speaker.id);
|
57
|
+
let lruPeerArray = Array.from(this.lruPeers);
|
58
|
+
while (lruPeerArray.length >= this.tilesPerPage) {
|
59
|
+
lruPeerArray.pop();
|
60
|
+
}
|
61
|
+
this.lruPeers = new Set([speaker.id, ...lruPeerArray]);
|
62
|
+
this.updateListeners();
|
63
|
+
};
|
64
|
+
|
65
|
+
onDominantSpeakerChange = speaker => {
|
66
|
+
if (speaker && speaker.id !== this?.speaker?.id) {
|
67
|
+
this.speaker = speaker;
|
68
|
+
this.moveSpeakerToFront(speaker);
|
69
|
+
}
|
70
|
+
};
|
71
|
+
|
72
|
+
updateListeners = () => {
|
73
|
+
const orderedPeers = [];
|
74
|
+
this.lruPeers.forEach(key => {
|
75
|
+
const peer = this.peers.get(key);
|
76
|
+
if (peer) {
|
77
|
+
orderedPeers.push(peer);
|
78
|
+
}
|
79
|
+
});
|
80
|
+
this.peers.forEach(peer => {
|
81
|
+
if (!this.lruPeers.has(peer.id) && peer) {
|
82
|
+
orderedPeers.push(peer);
|
83
|
+
}
|
84
|
+
});
|
85
|
+
this.listeners.forEach(listener => listener?.(orderedPeers));
|
86
|
+
};
|
87
|
+
}
|
88
|
+
|
89
|
+
export default PeersSorter;
|
@@ -0,0 +1,208 @@
|
|
1
|
+
import { parsedUserAgent } from '@100mslive/react-sdk';
|
2
|
+
|
3
|
+
export const defaultAudioList = [
|
4
|
+
{
|
5
|
+
name: 'Audio1',
|
6
|
+
id: 'audio1',
|
7
|
+
metadata: {
|
8
|
+
description: 'Artist1',
|
9
|
+
},
|
10
|
+
url: 'https://bc-public-static-assets.s3.ap-south-1.amazonaws.com/webapp/playlist/audio1.mp3',
|
11
|
+
type: 'audio',
|
12
|
+
},
|
13
|
+
{
|
14
|
+
name: 'Audio2',
|
15
|
+
id: 'audio2',
|
16
|
+
metadata: {
|
17
|
+
description: 'Artist2',
|
18
|
+
},
|
19
|
+
url: 'https://bc-public-static-assets.s3.ap-south-1.amazonaws.com/webapp/playlist/audio2.mp3',
|
20
|
+
type: 'audio',
|
21
|
+
},
|
22
|
+
{
|
23
|
+
name: 'Audio3',
|
24
|
+
id: 'audio3',
|
25
|
+
metadata: {
|
26
|
+
description: 'Artist3',
|
27
|
+
},
|
28
|
+
url: 'https://bc-public-static-assets.s3.ap-south-1.amazonaws.com/webapp/playlist/audio3.mp3',
|
29
|
+
type: 'audio',
|
30
|
+
},
|
31
|
+
{
|
32
|
+
name: 'Audio4',
|
33
|
+
id: 'audio4',
|
34
|
+
metadata: {
|
35
|
+
description: 'Artist4',
|
36
|
+
},
|
37
|
+
url: 'https://bc-public-static-assets.s3.ap-south-1.amazonaws.com/webapp/playlist/audio4.mp3',
|
38
|
+
type: 'audio',
|
39
|
+
},
|
40
|
+
{
|
41
|
+
name: 'Audio5',
|
42
|
+
id: 'audio5',
|
43
|
+
metadata: {
|
44
|
+
description: 'Artist5',
|
45
|
+
},
|
46
|
+
url: 'https://bc-public-static-assets.s3.ap-south-1.amazonaws.com/webapp/playlist/audio5.mp3',
|
47
|
+
type: 'audio',
|
48
|
+
},
|
49
|
+
{
|
50
|
+
name: 'Audio6',
|
51
|
+
id: 'audio6',
|
52
|
+
metadata: {
|
53
|
+
description: 'Artist6',
|
54
|
+
},
|
55
|
+
url: 'https://bc-public-static-assets.s3.ap-south-1.amazonaws.com/webapp/playlist/audio6.mp3',
|
56
|
+
type: 'audio',
|
57
|
+
},
|
58
|
+
];
|
59
|
+
|
60
|
+
export const defaultVideoList = [
|
61
|
+
{
|
62
|
+
name: 'Video1',
|
63
|
+
id: 'video1',
|
64
|
+
metadata: {
|
65
|
+
description: 'Artist1',
|
66
|
+
},
|
67
|
+
url: 'https://bc-public-static-assets.s3.ap-south-1.amazonaws.com/webapp/playlist/video1.mp4',
|
68
|
+
type: 'video',
|
69
|
+
},
|
70
|
+
{
|
71
|
+
name: 'Video2',
|
72
|
+
id: 'video2',
|
73
|
+
metadata: {
|
74
|
+
description: 'Artist2',
|
75
|
+
},
|
76
|
+
url: 'https://bc-public-static-assets.s3.ap-south-1.amazonaws.com/webapp/playlist/video2.mp4',
|
77
|
+
type: 'video',
|
78
|
+
},
|
79
|
+
{
|
80
|
+
name: 'Video3',
|
81
|
+
id: 'video3',
|
82
|
+
metadata: {
|
83
|
+
description: 'Artist2',
|
84
|
+
},
|
85
|
+
url: 'https://bc-public-static-assets.s3.ap-south-1.amazonaws.com/webapp/playlist/video3.mp4',
|
86
|
+
type: 'video',
|
87
|
+
},
|
88
|
+
];
|
89
|
+
|
90
|
+
export const DEFAULT_HLS_ROLE_KEY = 'HLS_VIEWER_ROLE';
|
91
|
+
export const DEFAULT_HLS_VIEWER_ROLE = 'hls-viewer';
|
92
|
+
export const DEFAULT_WAITING_VIEWER_ROLE = 'waiting-room';
|
93
|
+
export const QUERY_PARAM_SKIP_PREVIEW = 'skip_preview';
|
94
|
+
export const QUERY_PARAM_SKIP_PREVIEW_HEADFUL = 'skip_preview_headful';
|
95
|
+
export const QUERY_PARAM_NAME = 'name';
|
96
|
+
export const QUERY_PARAM_VIEW_MODE = 'ui_mode';
|
97
|
+
export const QUERY_PARAM_AUTH_TOKEN = 'auth_token';
|
98
|
+
export const QUERY_PARAM_PREVIEW_AS_ROLE = 'preview_as_role';
|
99
|
+
export const UI_MODE_ACTIVE_SPEAKER = 'activespeaker';
|
100
|
+
export const UI_MODE_GRID = 'grid';
|
101
|
+
export const MAX_TOASTS = 5;
|
102
|
+
export const RTMP_RECORD_RESOLUTION_MIN = 480;
|
103
|
+
export const RTMP_RECORD_RESOLUTION_MAX = 1280;
|
104
|
+
export const RTMP_RECORD_DEFAULT_RESOLUTION = {
|
105
|
+
width: 1280,
|
106
|
+
height: 720,
|
107
|
+
};
|
108
|
+
export const EMOJI_REACTION_TYPE = 'EMOJI_REACTION';
|
109
|
+
|
110
|
+
export const CHAT_SELECTOR = {
|
111
|
+
PEER_ID: 'peer_id',
|
112
|
+
ROLE: 'role',
|
113
|
+
};
|
114
|
+
|
115
|
+
export const APP_DATA = {
|
116
|
+
uiSettings: 'uiSettings',
|
117
|
+
chatOpen: 'chatOpen',
|
118
|
+
chatSelector: 'chatSelector',
|
119
|
+
chatDraft: 'chatDraft',
|
120
|
+
appConfig: 'appConfig',
|
121
|
+
recordingUrl: 'recordingUrl',
|
122
|
+
sidePane: 'sidePane',
|
123
|
+
hlsStats: 'hlsStats',
|
124
|
+
hlsViewerRole: 'hlsViewerRole',
|
125
|
+
waitingViewerRole: 'waitingViewerRole',
|
126
|
+
subscribedNotifications: 'subscribedNotifications',
|
127
|
+
logo: 'logo',
|
128
|
+
tokenEndpoint: 'tokenEndpoint',
|
129
|
+
appLayout: 'appLayout',
|
130
|
+
hlsStarted: 'hlsStarted',
|
131
|
+
rtmpStarted: 'rtmpStarted',
|
132
|
+
recordingStarted: 'recordingStarted',
|
133
|
+
embedConfig: 'embedConfig',
|
134
|
+
pinnedTrackId: 'pinnedTrackId',
|
135
|
+
dropdownList: 'dropdownList',
|
136
|
+
authToken: 'authToken',
|
137
|
+
pdfConfig: 'pdfConfig',
|
138
|
+
};
|
139
|
+
export const UI_SETTINGS = {
|
140
|
+
isAudioOnly: 'isAudioOnly',
|
141
|
+
isHeadless: 'isHeadless',
|
142
|
+
maxTileCount: 'maxTileCount',
|
143
|
+
uiViewMode: 'uiViewMode',
|
144
|
+
showStatsOnTiles: 'showStatsOnTiles',
|
145
|
+
enableAmbientMusic: 'enableAmbientMusic',
|
146
|
+
mirrorLocalVideo: 'mirrorLocalVideo',
|
147
|
+
activeSpeakerSorting: 'activeSpeakerSorting',
|
148
|
+
hideLocalVideo: 'hideLocalVideo',
|
149
|
+
};
|
150
|
+
|
151
|
+
export const SIDE_PANE_OPTIONS = {
|
152
|
+
PARTICIPANTS: 'Participants',
|
153
|
+
CHAT: 'Chat',
|
154
|
+
STREAMING: 'STREAMING',
|
155
|
+
TILES: 'TILES',
|
156
|
+
SCREEN_TILES: 'SCREEN_TILES',
|
157
|
+
};
|
158
|
+
|
159
|
+
export const SUBSCRIBED_NOTIFICATIONS = {
|
160
|
+
PEER_JOINED: 'PEER_JOINED',
|
161
|
+
PEER_LEFT: 'PEER_LEFT',
|
162
|
+
METADATA_UPDATED: 'METADATA_UPDATED',
|
163
|
+
NEW_MESSAGE: 'NEW_MESSAGE',
|
164
|
+
ERROR: 'ERROR',
|
165
|
+
};
|
166
|
+
|
167
|
+
export const CREATE_ROOM_DOC_URL = 'https://github.com/100mslive/100ms-web/wiki/Creating-and-joining-a-room';
|
168
|
+
export const HLS_TIMED_METADATA_DOC_URL =
|
169
|
+
'https://www.100ms.live/docs/javascript/v2/how--to-guides/record-and-live-stream/hls/hls-timed-metadata';
|
170
|
+
|
171
|
+
export const REMOTE_STOP_SCREENSHARE_TYPE = 'REMOTE_STOP_SCREENSHARE';
|
172
|
+
|
173
|
+
export const isChrome = parsedUserAgent.getBrowser()?.name?.toLowerCase() === 'chrome';
|
174
|
+
export const isFirefox = parsedUserAgent.getBrowser()?.name?.toLowerCase() === 'firefox';
|
175
|
+
export const isSafari = parsedUserAgent.getBrowser()?.name?.toLowerCase() === 'safari';
|
176
|
+
export const isIOS = parsedUserAgent.getOS()?.name?.toLowerCase() === 'ios';
|
177
|
+
export const isMacOS = parsedUserAgent.getOS()?.name?.toLowerCase() === 'mac os';
|
178
|
+
export const isAndroid = parsedUserAgent.getOS()?.name?.toLowerCase() === 'android';
|
179
|
+
export const isIPadOS = false;
|
180
|
+
// typeof navigator !== "undefined" &&
|
181
|
+
// navigator?.maxTouchPoints &&
|
182
|
+
// navigator?.maxTouchPoints > 2 &&
|
183
|
+
// navigator?.userAgent?.match(/Mac/);
|
184
|
+
|
185
|
+
export const FEATURE_LIST = {
|
186
|
+
AUDIO_ONLY_SCREENSHARE: 'audioscreenshare',
|
187
|
+
AUDIO_PLAYLIST: 'audioplaylist',
|
188
|
+
VIDEO_PLAYLIST: 'videoplaylist',
|
189
|
+
EMOJI_REACTION: 'emojireaction',
|
190
|
+
AUDIO_PLUGINS: 'audioplugins',
|
191
|
+
VIDEO_PLUGINS: 'videoplugins',
|
192
|
+
WHITEBOARD: 'whiteboard',
|
193
|
+
CHANGE_NAME: 'changename',
|
194
|
+
FULLSCREEN: 'fullscreen',
|
195
|
+
PICTURE_IN_PICTURE: 'pip',
|
196
|
+
STARTS_FOR_NERDS: 'statsfornerds',
|
197
|
+
EMBED_URL: 'embedurl',
|
198
|
+
BRB: 'brb',
|
199
|
+
HAND_RAISE: 'handraise',
|
200
|
+
CHAT: 'chat',
|
201
|
+
PIN_TILE: 'pintile',
|
202
|
+
};
|
203
|
+
|
204
|
+
export const SESSION_STORE_KEY = {
|
205
|
+
TRANSCRIPTION_STATE: 'transcriptionState',
|
206
|
+
PINNED_MESSAGE: 'pinnedMessage',
|
207
|
+
SPOTLIGHT: 'spotlight',
|
208
|
+
};
|
@@ -0,0 +1,47 @@
|
|
1
|
+
// @ts-check
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
3
|
+
import { selectAvailableRoleNames, selectIsConnectedToRoom, selectPeerCount, useHMSStore } from '@100mslive/react-sdk';
|
4
|
+
import { isInternalRole } from './utils';
|
5
|
+
|
6
|
+
/**
|
7
|
+
* Hook to execute a callback when alone in room(after a certain 5d of time)
|
8
|
+
* @param {number} thresholdMs The threshold(in ms) after which the callback is executed,
|
9
|
+
* starting from the instant when alone in room.
|
10
|
+
* note: the cb is not called when another peer joins during this period.
|
11
|
+
*/
|
12
|
+
export const useWhenAloneInRoom = (thresholdMs = 5 * 60 * 1000) => {
|
13
|
+
const isConnected = useHMSStore(selectIsConnectedToRoom);
|
14
|
+
const peerCount = useHMSStore(selectPeerCount);
|
15
|
+
const [aloneForLong, setAloneForLong] = useState(false);
|
16
|
+
const cbTimeout = useRef(null);
|
17
|
+
const alone = isConnected && peerCount === 1;
|
18
|
+
|
19
|
+
useEffect(() => {
|
20
|
+
if (alone && !cbTimeout.current) {
|
21
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
22
|
+
// @ts-ignore
|
23
|
+
cbTimeout.current = setTimeout(() => {
|
24
|
+
setAloneForLong(true);
|
25
|
+
}, thresholdMs);
|
26
|
+
} else if (!alone) {
|
27
|
+
cbTimeout.current && clearTimeout(cbTimeout.current);
|
28
|
+
cbTimeout.current = null;
|
29
|
+
setAloneForLong(false);
|
30
|
+
}
|
31
|
+
}, [alone, thresholdMs]);
|
32
|
+
|
33
|
+
useEffect(() => {
|
34
|
+
return () => {
|
35
|
+
if (cbTimeout.current) {
|
36
|
+
clearTimeout(cbTimeout.current);
|
37
|
+
}
|
38
|
+
};
|
39
|
+
}, []);
|
40
|
+
|
41
|
+
return { alone, aloneForLong };
|
42
|
+
};
|
43
|
+
|
44
|
+
export const useFilteredRoles = () => {
|
45
|
+
const roles = useHMSStore(selectAvailableRoleNames).filter(role => !isInternalRole(role));
|
46
|
+
return roles;
|
47
|
+
};
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import { useEffect, useRef, useState } from 'react';
|
2
|
+
import { useHMSVanillaStore } from '@100mslive/react-sdk';
|
3
|
+
import PeersSorter from './PeersSorter';
|
4
|
+
import { useActiveSpeakerSorting } from '../components/AppData/useUISettings';
|
5
|
+
|
6
|
+
function useSortedPeers({ peers, maxTileCount = 9 }) {
|
7
|
+
const [sortedPeers, setSortedPeers] = useState([]);
|
8
|
+
const store = useHMSVanillaStore();
|
9
|
+
const activeSpeakerSorting = useActiveSpeakerSorting();
|
10
|
+
const peerSortedRef = useRef(new PeersSorter(store));
|
11
|
+
peerSortedRef.current.onUpdate(setSortedPeers);
|
12
|
+
|
13
|
+
useEffect(() => {
|
14
|
+
const peersSorter = peerSortedRef.current;
|
15
|
+
if (peers?.length > 0 && maxTileCount && activeSpeakerSorting) {
|
16
|
+
peersSorter.setPeersAndTilesPerPage({
|
17
|
+
peers,
|
18
|
+
tilesPerPage: maxTileCount,
|
19
|
+
});
|
20
|
+
} else if (!activeSpeakerSorting) {
|
21
|
+
peersSorter.stop();
|
22
|
+
}
|
23
|
+
}, [maxTileCount, peers, activeSpeakerSorting]);
|
24
|
+
|
25
|
+
return activeSpeakerSorting ? sortedPeers : peers;
|
26
|
+
}
|
27
|
+
|
28
|
+
export default useSortedPeers;
|
@@ -0,0 +1,91 @@
|
|
1
|
+
import { QUERY_PARAM_SKIP_PREVIEW } from './constants';
|
2
|
+
|
3
|
+
// eslint-disable-next-line complexity
|
4
|
+
export function shadeColor(color, percent) {
|
5
|
+
let R = parseInt(color.substring(1, 3), 16);
|
6
|
+
let G = parseInt(color.substring(3, 5), 16);
|
7
|
+
let B = parseInt(color.substring(5, 7), 16);
|
8
|
+
|
9
|
+
R = Math.floor((R * (100 + percent)) / 100);
|
10
|
+
G = Math.floor((G * (100 + percent)) / 100);
|
11
|
+
B = Math.floor((B * (100 + percent)) / 100);
|
12
|
+
|
13
|
+
R = R < 255 ? R : 255;
|
14
|
+
G = G < 255 ? G : 255;
|
15
|
+
B = B < 255 ? B : 255;
|
16
|
+
|
17
|
+
const RR = R.toString(16).length === 1 ? `0${R.toString(16)}` : R.toString(16);
|
18
|
+
const GG = G.toString(16).length === 1 ? `0${G.toString(16)}` : G.toString(16);
|
19
|
+
const BB = B.toString(16).length === 1 ? `0${B.toString(16)}` : B.toString(16);
|
20
|
+
|
21
|
+
return `#${RR}${GG}${BB}`;
|
22
|
+
}
|
23
|
+
|
24
|
+
/**
|
25
|
+
* TODO: this is currently an O(N**2) function, don't use with peer lists, it's currently
|
26
|
+
* being used to find intersection between list of role names where the complexity shouldn't matter much.
|
27
|
+
*/
|
28
|
+
export const arrayIntersection = (a, b) => {
|
29
|
+
if (a === undefined || b === undefined) {
|
30
|
+
return [];
|
31
|
+
}
|
32
|
+
// ensure "a" is the bigger array
|
33
|
+
if (b.length > a.length) {
|
34
|
+
let t = b;
|
35
|
+
b = a;
|
36
|
+
a = t;
|
37
|
+
}
|
38
|
+
return a.filter(function (e) {
|
39
|
+
return b.indexOf(e) > -1;
|
40
|
+
});
|
41
|
+
};
|
42
|
+
|
43
|
+
export const getMetadata = metadataString => {
|
44
|
+
try {
|
45
|
+
return metadataString === '' ? {} : JSON.parse(metadataString);
|
46
|
+
} catch (error) {
|
47
|
+
return {};
|
48
|
+
}
|
49
|
+
};
|
50
|
+
|
51
|
+
export const metadataProps = function (peer) {
|
52
|
+
return {
|
53
|
+
isHandRaised: getMetadata(peer.metadata)?.isHandRaised,
|
54
|
+
};
|
55
|
+
};
|
56
|
+
|
57
|
+
export const isScreenshareSupported = () => {
|
58
|
+
return typeof navigator.mediaDevices.getDisplayMedia !== 'undefined';
|
59
|
+
};
|
60
|
+
|
61
|
+
export const getDefaultMeetingUrl = () => {
|
62
|
+
return `${window.location.href.replace('meeting', 'preview')}?${QUERY_PARAM_SKIP_PREVIEW}=true`;
|
63
|
+
};
|
64
|
+
|
65
|
+
export const getRoutePrefix = () => {
|
66
|
+
return window.location.pathname.startsWith('/streaming') ? '/streaming' : '';
|
67
|
+
};
|
68
|
+
|
69
|
+
export const isStreamingKit = () => {
|
70
|
+
return window.location.pathname.startsWith('/streaming');
|
71
|
+
};
|
72
|
+
|
73
|
+
export const isInternalRole = role => role && role.startsWith('__internal');
|
74
|
+
|
75
|
+
export const metadataPayloadParser = payload => {
|
76
|
+
try {
|
77
|
+
const data = window.atob(payload);
|
78
|
+
const parsedData = JSON.parse(data);
|
79
|
+
return parsedData;
|
80
|
+
} catch (e) {
|
81
|
+
return { payload };
|
82
|
+
}
|
83
|
+
};
|
84
|
+
|
85
|
+
// For bottom action sheet, returns updated height based on drag
|
86
|
+
export const getUpdatedHeight = (e, MINIMUM_HEIGHT) => {
|
87
|
+
const heightToPercentage = 100 - ((e?.touches?.[0] || e).pageY / window.innerHeight) * 100;
|
88
|
+
// Snap to top if height > 80%, should be at least 40vh
|
89
|
+
const sheetHeightInVH = Math.max(MINIMUM_HEIGHT, heightToPercentage > 80 ? 100 : heightToPercentage);
|
90
|
+
return `${sheetHeightInVH}vh`;
|
91
|
+
};
|
@@ -0,0 +1,189 @@
|
|
1
|
+
import React, { useEffect } from 'react';
|
2
|
+
import { useSearchParam } from 'react-use';
|
3
|
+
import {
|
4
|
+
HMSRoomState,
|
5
|
+
selectAvailableRoleNames,
|
6
|
+
selectHLSState,
|
7
|
+
selectIsConnectedToRoom,
|
8
|
+
selectLocalPeerRoleName,
|
9
|
+
selectRolesMap,
|
10
|
+
selectRoomState,
|
11
|
+
selectRTMPState,
|
12
|
+
useHMSActions,
|
13
|
+
useHMSStore,
|
14
|
+
useRecordingStreaming,
|
15
|
+
} from '@100mslive/react-sdk';
|
16
|
+
import { normalizeAppPolicyConfig } from '../init/initUtils';
|
17
|
+
import { UserPreferencesKeys, useUserPreferences } from '../hooks/useUserPreferences';
|
18
|
+
import { useIsSidepaneTypeOpen, useSidepaneReset, useSidepaneState, useSidepaneToggle } from './useSidepane';
|
19
|
+
import { useSetAppDataByKey } from './useUISettings';
|
20
|
+
import { getMetadata } from '../../common/utils';
|
21
|
+
import {
|
22
|
+
APP_DATA,
|
23
|
+
CHAT_SELECTOR,
|
24
|
+
DEFAULT_HLS_ROLE_KEY,
|
25
|
+
DEFAULT_HLS_VIEWER_ROLE,
|
26
|
+
DEFAULT_WAITING_VIEWER_ROLE,
|
27
|
+
QUERY_PARAM_VIEW_MODE,
|
28
|
+
SIDE_PANE_OPTIONS,
|
29
|
+
UI_MODE_ACTIVE_SPEAKER,
|
30
|
+
UI_MODE_GRID,
|
31
|
+
UI_SETTINGS,
|
32
|
+
} from '../../common/constants';
|
33
|
+
|
34
|
+
export const getAppDetails = appDetails => {
|
35
|
+
try {
|
36
|
+
return !appDetails ? {} : JSON.parse(appDetails);
|
37
|
+
} catch (error) {
|
38
|
+
return {};
|
39
|
+
}
|
40
|
+
};
|
41
|
+
|
42
|
+
const initialAppData = {
|
43
|
+
[APP_DATA.uiSettings]: {
|
44
|
+
[UI_SETTINGS.isAudioOnly]: false,
|
45
|
+
[UI_SETTINGS.isHeadless]: false,
|
46
|
+
[UI_SETTINGS.maxTileCount]: 9,
|
47
|
+
[UI_SETTINGS.showStatsOnTiles]: false,
|
48
|
+
[UI_SETTINGS.enableAmbientMusic]: false,
|
49
|
+
[UI_SETTINGS.uiViewMode]: UI_MODE_GRID,
|
50
|
+
[UI_SETTINGS.mirrorLocalVideo]: true,
|
51
|
+
[UI_SETTINGS.activeSpeakerSorting]: process.env.REACT_APP_ENV === 'qa',
|
52
|
+
[UI_SETTINGS.hideLocalVideo]: false,
|
53
|
+
},
|
54
|
+
[APP_DATA.subscribedNotifications]: {
|
55
|
+
PEER_JOINED: false,
|
56
|
+
PEER_LEFT: false,
|
57
|
+
NEW_MESSAGE: true,
|
58
|
+
ERROR: true,
|
59
|
+
METADATA_UPDATED: true,
|
60
|
+
},
|
61
|
+
[APP_DATA.chatOpen]: false,
|
62
|
+
[APP_DATA.chatSelector]: {
|
63
|
+
[CHAT_SELECTOR.ROLE]: '',
|
64
|
+
[CHAT_SELECTOR.PEER_ID]: '',
|
65
|
+
},
|
66
|
+
[APP_DATA.chatDraft]: '',
|
67
|
+
[APP_DATA.sidePane]: '',
|
68
|
+
[APP_DATA.hlsStarted]: false,
|
69
|
+
[APP_DATA.rtmpStarted]: false,
|
70
|
+
[APP_DATA.recordingStarted]: false,
|
71
|
+
[APP_DATA.hlsViewerRole]: DEFAULT_HLS_VIEWER_ROLE,
|
72
|
+
[APP_DATA.waitingViewerRole]: DEFAULT_WAITING_VIEWER_ROLE,
|
73
|
+
[APP_DATA.dropdownList]: [],
|
74
|
+
[APP_DATA.authToken]: '',
|
75
|
+
};
|
76
|
+
|
77
|
+
export const AppData = React.memo(({ appDetails, logo, recordingUrl, tokenEndpoint }) => {
|
78
|
+
const hmsActions = useHMSActions();
|
79
|
+
const isConnected = useHMSStore(selectIsConnectedToRoom);
|
80
|
+
const sidePane = useSidepaneState();
|
81
|
+
const resetSidePane = useSidepaneReset();
|
82
|
+
const [preferences = {}] = useUserPreferences(UserPreferencesKeys.UI_SETTINGS);
|
83
|
+
const roleNames = useHMSStore(selectAvailableRoleNames);
|
84
|
+
const rolesMap = useHMSStore(selectRolesMap);
|
85
|
+
const localPeerRole = useHMSStore(selectLocalPeerRoleName);
|
86
|
+
const isDefaultModeActiveSpeaker = useSearchParam(QUERY_PARAM_VIEW_MODE) === UI_MODE_ACTIVE_SPEAKER;
|
87
|
+
|
88
|
+
useEffect(() => {
|
89
|
+
if (!isConnected && sidePane && sidePane !== SIDE_PANE_OPTIONS.PARTICIPANTS) {
|
90
|
+
resetSidePane();
|
91
|
+
}
|
92
|
+
}, [isConnected, sidePane, resetSidePane]);
|
93
|
+
|
94
|
+
useEffect(() => {
|
95
|
+
hmsActions.initAppData(initialAppData);
|
96
|
+
}, [hmsActions]);
|
97
|
+
|
98
|
+
useEffect(() => {
|
99
|
+
const uiSettings = preferences || {};
|
100
|
+
const updatedSettings = {
|
101
|
+
...uiSettings,
|
102
|
+
[UI_SETTINGS.uiViewMode]: isDefaultModeActiveSpeaker
|
103
|
+
? UI_MODE_ACTIVE_SPEAKER
|
104
|
+
: uiSettings.uiViewMode || UI_MODE_GRID,
|
105
|
+
};
|
106
|
+
hmsActions.setAppData(APP_DATA.uiSettings, updatedSettings, true);
|
107
|
+
}, [preferences, isDefaultModeActiveSpeaker, hmsActions]);
|
108
|
+
|
109
|
+
useEffect(() => {
|
110
|
+
const appData = {
|
111
|
+
[APP_DATA.recordingUrl]: recordingUrl,
|
112
|
+
[APP_DATA.tokenEndpoint]: tokenEndpoint,
|
113
|
+
[APP_DATA.logo]: logo,
|
114
|
+
[APP_DATA.hlsViewerRole]: getMetadata(appDetails)[DEFAULT_HLS_ROLE_KEY] || DEFAULT_HLS_VIEWER_ROLE,
|
115
|
+
[APP_DATA.appConfig]: getAppDetails(appDetails),
|
116
|
+
};
|
117
|
+
for (const key in appData) {
|
118
|
+
hmsActions.setAppData([key], appData[key]);
|
119
|
+
}
|
120
|
+
}, [appDetails, logo, recordingUrl, tokenEndpoint, hmsActions]);
|
121
|
+
|
122
|
+
useEffect(() => {
|
123
|
+
if (!preferences.subscribedNotifications) {
|
124
|
+
return;
|
125
|
+
}
|
126
|
+
hmsActions.setAppData(APP_DATA.subscribedNotifications, preferences.subscribedNotifications, true);
|
127
|
+
}, [preferences.subscribedNotifications, hmsActions]);
|
128
|
+
|
129
|
+
useEffect(() => {
|
130
|
+
if (localPeerRole) {
|
131
|
+
const config = normalizeAppPolicyConfig(roleNames, rolesMap);
|
132
|
+
hmsActions.setAppData(APP_DATA.appLayout, config[localPeerRole]);
|
133
|
+
}
|
134
|
+
}, [roleNames, rolesMap, localPeerRole, hmsActions]);
|
135
|
+
|
136
|
+
return <ResetStreamingStart />;
|
137
|
+
});
|
138
|
+
|
139
|
+
/**
|
140
|
+
* reset hlsStarted, rtmpStarted values when streaming starts
|
141
|
+
*/
|
142
|
+
const ResetStreamingStart = () => {
|
143
|
+
const { isHLSRunning, isRTMPRunning, isBrowserRecordingOn } = useRecordingStreaming();
|
144
|
+
const hlsError = useHMSStore(selectHLSState).error;
|
145
|
+
const rtmpError = useHMSStore(selectRTMPState).error;
|
146
|
+
const roomState = useHMSStore(selectRoomState);
|
147
|
+
const [hlsStarted, setHLSStarted] = useSetAppDataByKey(APP_DATA.hlsStarted);
|
148
|
+
const [recordingStarted, setRecordingStarted] = useSetAppDataByKey(APP_DATA.recordingStarted);
|
149
|
+
const [rtmpStarted, setRTMPStarted] = useSetAppDataByKey(APP_DATA.rtmpStarted);
|
150
|
+
const toggleStreaming = useSidepaneToggle(SIDE_PANE_OPTIONS.STREAMING);
|
151
|
+
const isStreamingOpen = useIsSidepaneTypeOpen(SIDE_PANE_OPTIONS.STREAMING);
|
152
|
+
|
153
|
+
useEffect(() => {
|
154
|
+
if (isBrowserRecordingOn && recordingStarted) {
|
155
|
+
setRecordingStarted(false);
|
156
|
+
}
|
157
|
+
}, [isBrowserRecordingOn, recordingStarted, setRecordingStarted]);
|
158
|
+
/**
|
159
|
+
* Reset on leave
|
160
|
+
*/
|
161
|
+
useEffect(() => {
|
162
|
+
if (roomState === HMSRoomState.Disconnected) {
|
163
|
+
setHLSStarted(false);
|
164
|
+
setRecordingStarted(false);
|
165
|
+
setRTMPStarted(false);
|
166
|
+
}
|
167
|
+
}, [roomState, setHLSStarted, setRTMPStarted, setRecordingStarted]);
|
168
|
+
useEffect(() => {
|
169
|
+
if (isHLSRunning || hlsError) {
|
170
|
+
if (hlsStarted) {
|
171
|
+
setHLSStarted(false);
|
172
|
+
if (isStreamingOpen) {
|
173
|
+
toggleStreaming();
|
174
|
+
}
|
175
|
+
}
|
176
|
+
}
|
177
|
+
}, [isHLSRunning, hlsStarted, setHLSStarted, hlsError, isStreamingOpen, toggleStreaming]);
|
178
|
+
useEffect(() => {
|
179
|
+
if (isRTMPRunning || rtmpError || isBrowserRecordingOn) {
|
180
|
+
if (rtmpStarted) {
|
181
|
+
setRTMPStarted(false);
|
182
|
+
if (isStreamingOpen) {
|
183
|
+
toggleStreaming();
|
184
|
+
}
|
185
|
+
}
|
186
|
+
}
|
187
|
+
}, [isRTMPRunning, setRTMPStarted, rtmpStarted, rtmpError, isBrowserRecordingOn, isStreamingOpen, toggleStreaming]);
|
188
|
+
return null;
|
189
|
+
};
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import { selectAppDataByPath, useHMSStore } from '@100mslive/react-sdk';
|
2
|
+
import { APP_DATA } from '../../common/constants';
|
3
|
+
|
4
|
+
export const useAppConfig = (...path) => {
|
5
|
+
const appConfig = useHMSStore(selectAppDataByPath(APP_DATA.appConfig, ...path));
|
6
|
+
return appConfig;
|
7
|
+
};
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import { useCallback } from 'react';
|
2
|
+
import { selectAppData, useHMSActions, useHMSStore } from '@100mslive/react-sdk';
|
3
|
+
import { APP_DATA } from '../../common/constants';
|
4
|
+
|
5
|
+
export const useChatDraftMessage = () => {
|
6
|
+
const hmsActions = useHMSActions();
|
7
|
+
let chatDraftMessage = useHMSStore(selectAppData(APP_DATA.chatDraft));
|
8
|
+
if (chatDraftMessage === undefined || chatDraftMessage === null) {
|
9
|
+
chatDraftMessage = '';
|
10
|
+
}
|
11
|
+
const setDraftMessage = useCallback(
|
12
|
+
message => {
|
13
|
+
hmsActions.setAppData(APP_DATA.chatDraft, message, true);
|
14
|
+
},
|
15
|
+
[hmsActions],
|
16
|
+
);
|
17
|
+
return [chatDraftMessage, setDraftMessage];
|
18
|
+
};
|