@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,67 @@
|
|
1
|
+
import React, { useState } from 'react';
|
2
|
+
import { ChevronDownIcon, ChevronUpIcon, CrossIcon } from '@100mslive/react-icons';
|
3
|
+
import { Box, Dropdown, Flex, IconButton, Text, textEllipsis } from '../../../';
|
4
|
+
import { ChatSelector } from './ChatSelector';
|
5
|
+
import { useSidepaneToggle } from '../AppData/useSidepane';
|
6
|
+
import { SIDE_PANE_OPTIONS } from '../../common/constants';
|
7
|
+
|
8
|
+
export const ChatHeader = React.memo(({ selection, selectorOpen, onToggle, onSelect, role, peerId }) => {
|
9
|
+
const [open, setOpen] = useState(false);
|
10
|
+
const toggleChat = useSidepaneToggle(SIDE_PANE_OPTIONS.CHAT);
|
11
|
+
return (
|
12
|
+
<Flex
|
13
|
+
onClick={onToggle}
|
14
|
+
align="center"
|
15
|
+
css={{
|
16
|
+
color: '$textPrimary',
|
17
|
+
h: '$16',
|
18
|
+
mb: '$2',
|
19
|
+
}}
|
20
|
+
>
|
21
|
+
<Text variant="h6">Chat </Text>
|
22
|
+
<Dropdown.Root open={open} onOpenChange={value => setOpen(value)}>
|
23
|
+
<Dropdown.Trigger
|
24
|
+
asChild
|
25
|
+
data-testid="participant_list_filter"
|
26
|
+
css={{
|
27
|
+
border: '1px solid $textDisabled',
|
28
|
+
r: '$0',
|
29
|
+
p: '$2 $4',
|
30
|
+
ml: '$8',
|
31
|
+
}}
|
32
|
+
tabIndex={0}
|
33
|
+
>
|
34
|
+
<Flex align="center">
|
35
|
+
<Text variant="sm" css={{ ...textEllipsis(80) }}>
|
36
|
+
{selection}
|
37
|
+
</Text>
|
38
|
+
<Box css={{ ml: '$2', color: '$textDisabled' }}>
|
39
|
+
{open ? <ChevronUpIcon width={14} height={14} /> : <ChevronDownIcon width={14} height={14} />}
|
40
|
+
</Box>
|
41
|
+
</Flex>
|
42
|
+
</Dropdown.Trigger>
|
43
|
+
<Dropdown.Content
|
44
|
+
css={{
|
45
|
+
w: '$64',
|
46
|
+
overflow: 'hidden',
|
47
|
+
maxHeight: 'unset',
|
48
|
+
}}
|
49
|
+
align="start"
|
50
|
+
sideOffset={8}
|
51
|
+
>
|
52
|
+
<ChatSelector onSelect={onSelect} role={role} peerId={peerId} />
|
53
|
+
</Dropdown.Content>
|
54
|
+
</Dropdown.Root>
|
55
|
+
<IconButton
|
56
|
+
css={{ ml: 'auto' }}
|
57
|
+
onClick={e => {
|
58
|
+
e.stopPropagation();
|
59
|
+
selectorOpen ? onToggle() : toggleChat();
|
60
|
+
}}
|
61
|
+
data-testid="close_chat"
|
62
|
+
>
|
63
|
+
<CrossIcon />
|
64
|
+
</IconButton>
|
65
|
+
</Flex>
|
66
|
+
);
|
67
|
+
});
|
@@ -0,0 +1,162 @@
|
|
1
|
+
import React, { Fragment, useMemo, useState } from 'react';
|
2
|
+
import { useMeasure } from 'react-use';
|
3
|
+
import { FixedSizeList } from 'react-window';
|
4
|
+
import {
|
5
|
+
selectMessagesUnreadCountByPeerID,
|
6
|
+
selectMessagesUnreadCountByRole,
|
7
|
+
selectRemotePeers,
|
8
|
+
selectUnreadHMSMessagesCount,
|
9
|
+
useHMSStore,
|
10
|
+
} from '@100mslive/react-sdk';
|
11
|
+
import { CheckIcon } from '@100mslive/react-icons';
|
12
|
+
import { Box, Dropdown, Flex, HorizontalDivider, Text, Tooltip } from '../../../';
|
13
|
+
import { ParticipantSearch } from '../Header/ParticipantList';
|
14
|
+
import { useFilteredRoles } from '../../common/hooks';
|
15
|
+
|
16
|
+
const ChatDotIcon = () => {
|
17
|
+
return <Box css={{ size: '$6', bg: '$brandDefault', mx: '$2', r: '$round' }} />;
|
18
|
+
};
|
19
|
+
|
20
|
+
const SelectorItem = ({ value, active, onClick, unreadCount }) => {
|
21
|
+
return (
|
22
|
+
<Dropdown.Item data-testid="chat_members" css={{ align: 'center', px: '$10' }} onClick={onClick}>
|
23
|
+
<Text variant="sm">{value}</Text>
|
24
|
+
<Flex align="center" css={{ ml: 'auto', color: '$textPrimary' }}>
|
25
|
+
{unreadCount > 0 && (
|
26
|
+
<Tooltip title={`${unreadCount} unread`}>
|
27
|
+
<Box css={{ mr: active ? '$3' : 0 }}>
|
28
|
+
<ChatDotIcon />
|
29
|
+
</Box>
|
30
|
+
</Tooltip>
|
31
|
+
)}
|
32
|
+
{active && <CheckIcon width={16} height={16} />}
|
33
|
+
</Flex>
|
34
|
+
</Dropdown.Item>
|
35
|
+
);
|
36
|
+
};
|
37
|
+
|
38
|
+
const SelectorHeader = React.memo(({ children }) => {
|
39
|
+
return (
|
40
|
+
<Box css={{ flexShrink: 0 }}>
|
41
|
+
<HorizontalDivider space={4} />
|
42
|
+
<Text variant="md" css={{ p: '$4 $10', fontWeight: '$semiBold' }}>
|
43
|
+
{children}
|
44
|
+
</Text>
|
45
|
+
</Box>
|
46
|
+
);
|
47
|
+
});
|
48
|
+
|
49
|
+
const Everyone = React.memo(({ onSelect, active }) => {
|
50
|
+
const unreadCount = useHMSStore(selectUnreadHMSMessagesCount);
|
51
|
+
return (
|
52
|
+
<SelectorItem
|
53
|
+
value="Everyone"
|
54
|
+
active={active}
|
55
|
+
unreadCount={unreadCount}
|
56
|
+
onClick={() => {
|
57
|
+
onSelect({ role: '', peerId: '', selection: 'Everyone' });
|
58
|
+
}}
|
59
|
+
/>
|
60
|
+
);
|
61
|
+
});
|
62
|
+
|
63
|
+
const RoleItem = React.memo(({ onSelect, role, active }) => {
|
64
|
+
const unreadCount = useHMSStore(selectMessagesUnreadCountByRole(role));
|
65
|
+
return (
|
66
|
+
<SelectorItem
|
67
|
+
value={role}
|
68
|
+
active={active}
|
69
|
+
unreadCount={unreadCount}
|
70
|
+
onClick={() => {
|
71
|
+
onSelect({ role: role, selection: role });
|
72
|
+
}}
|
73
|
+
/>
|
74
|
+
);
|
75
|
+
});
|
76
|
+
|
77
|
+
const PeerItem = ({ onSelect, peerId, name, active }) => {
|
78
|
+
const unreadCount = useHMSStore(selectMessagesUnreadCountByPeerID(peerId));
|
79
|
+
return (
|
80
|
+
<SelectorItem
|
81
|
+
value={name}
|
82
|
+
active={active}
|
83
|
+
unreadCount={unreadCount}
|
84
|
+
onClick={() => {
|
85
|
+
onSelect({ role: '', peerId, selection: name });
|
86
|
+
}}
|
87
|
+
/>
|
88
|
+
);
|
89
|
+
};
|
90
|
+
|
91
|
+
const VirtualizedSelectItemList = ({ peers, selectedRole, selectedPeerId, searchValue, onSelect }) => {
|
92
|
+
const [ref, { width, height }] = useMeasure();
|
93
|
+
const roles = useFilteredRoles();
|
94
|
+
const filteredPeers = useMemo(
|
95
|
+
() =>
|
96
|
+
peers.filter(
|
97
|
+
// search should be empty or search phrase should be included in name
|
98
|
+
peer => !searchValue || peer.name.toLowerCase().includes(searchValue.toLowerCase()),
|
99
|
+
),
|
100
|
+
[peers, searchValue],
|
101
|
+
);
|
102
|
+
|
103
|
+
const listItems = useMemo(() => {
|
104
|
+
const selectItems = [<Everyone onSelect={onSelect} active={!selectedRole && !selectedPeerId} />];
|
105
|
+
|
106
|
+
roles.length > 0 && selectItems.push(<SelectorHeader>Roles</SelectorHeader>);
|
107
|
+
roles.forEach(userRole =>
|
108
|
+
selectItems.push(
|
109
|
+
<RoleItem key={userRole} active={selectedRole === userRole} role={userRole} onSelect={onSelect} />,
|
110
|
+
),
|
111
|
+
);
|
112
|
+
|
113
|
+
filteredPeers.length > 0 && selectItems.push(<SelectorHeader>Participants</SelectorHeader>);
|
114
|
+
filteredPeers.forEach(peer =>
|
115
|
+
selectItems.push(
|
116
|
+
<PeerItem
|
117
|
+
key={peer.id}
|
118
|
+
name={peer.name}
|
119
|
+
peerId={peer.id}
|
120
|
+
active={peer.id === selectedPeerId}
|
121
|
+
onSelect={onSelect}
|
122
|
+
/>,
|
123
|
+
),
|
124
|
+
);
|
125
|
+
|
126
|
+
return selectItems;
|
127
|
+
}, [onSelect, selectedRole, selectedPeerId, roles, filteredPeers]);
|
128
|
+
|
129
|
+
return (
|
130
|
+
<Dropdown.Group ref={ref} css={{ height: '$64', overflowY: 'auto' }}>
|
131
|
+
<FixedSizeList itemSize={52} itemCount={listItems.length} width={width} height={height}>
|
132
|
+
{({ index, style }) => (
|
133
|
+
<div style={style} key={index}>
|
134
|
+
{listItems[index]}
|
135
|
+
</div>
|
136
|
+
)}
|
137
|
+
</FixedSizeList>
|
138
|
+
</Dropdown.Group>
|
139
|
+
);
|
140
|
+
};
|
141
|
+
|
142
|
+
export const ChatSelector = ({ role, peerId, onSelect }) => {
|
143
|
+
const peers = useHMSStore(selectRemotePeers);
|
144
|
+
const [search, setSearch] = useState('');
|
145
|
+
|
146
|
+
return (
|
147
|
+
<Fragment>
|
148
|
+
{peers.length > 0 && (
|
149
|
+
<Box css={{ px: '$8' }}>
|
150
|
+
<ParticipantSearch onSearch={setSearch} placeholder="Search participants" />
|
151
|
+
</Box>
|
152
|
+
)}
|
153
|
+
<VirtualizedSelectItemList
|
154
|
+
selectedRole={role}
|
155
|
+
selectedPeerId={peerId}
|
156
|
+
onSelect={onSelect}
|
157
|
+
peers={peers}
|
158
|
+
searchValue={search}
|
159
|
+
/>
|
160
|
+
</Fragment>
|
161
|
+
);
|
162
|
+
};
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import { useEffect, useRef } from 'react';
|
2
|
+
|
3
|
+
export const useEmojiPickerStyles = showing => {
|
4
|
+
const ref = useRef(null);
|
5
|
+
useEffect(() => {
|
6
|
+
if (showing) {
|
7
|
+
setTimeout(() => {
|
8
|
+
const root = ref.current?.querySelector('em-emoji-picker')?.shadowRoot;
|
9
|
+
const style = document.createElement('style');
|
10
|
+
style.textContent = `
|
11
|
+
#root {
|
12
|
+
--em-rgb-color: var(--hms-ui-colors-textPrimary);
|
13
|
+
--em-rgb-input: var(--hms-ui-colors-textPrimary);
|
14
|
+
--em-color-border: var(--hms-ui-colors-surfaceDefault);
|
15
|
+
--color-b: var(--hms-ui-colors-textPrimary);
|
16
|
+
--rgb-background: transparent;
|
17
|
+
color: var(--hms-ui-colors-textPrimary);
|
18
|
+
font-family: var(--hms-ui-fonts-sans);
|
19
|
+
}
|
20
|
+
.sticky {
|
21
|
+
background-color: var(--hms-ui-colors-surfaceLight);
|
22
|
+
}
|
23
|
+
`;
|
24
|
+
root?.appendChild(style);
|
25
|
+
}, 0);
|
26
|
+
}
|
27
|
+
}, [showing]);
|
28
|
+
|
29
|
+
return ref;
|
30
|
+
};
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import {
|
2
|
+
selectMessagesUnreadCountByPeerID,
|
3
|
+
selectMessagesUnreadCountByRole,
|
4
|
+
selectUnreadHMSMessagesCount,
|
5
|
+
useHMSStore,
|
6
|
+
} from '@100mslive/react-sdk';
|
7
|
+
|
8
|
+
export const useUnreadCount = ({ role, peerId }) => {
|
9
|
+
const unreadCountSelector = role
|
10
|
+
? selectMessagesUnreadCountByRole(role)
|
11
|
+
: peerId
|
12
|
+
? selectMessagesUnreadCountByPeerID(peerId)
|
13
|
+
: selectUnreadHMSMessagesCount;
|
14
|
+
|
15
|
+
const unreadCount = useHMSStore(unreadCountSelector);
|
16
|
+
return unreadCount;
|
17
|
+
};
|
@@ -0,0 +1,80 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { selectConnectionQualityByPeerID, useHMSStore } from '@100mslive/react-sdk';
|
3
|
+
import { PoorConnectivityIcon } from '@100mslive/react-icons';
|
4
|
+
import { styled, Tooltip, useTheme } from '../../../';
|
5
|
+
import { getColor, getTooltipText } from './connectionQualityUtils';
|
6
|
+
|
7
|
+
const Wrapper = styled('span', {
|
8
|
+
width: '28px',
|
9
|
+
height: '28px',
|
10
|
+
display: 'flex',
|
11
|
+
alignItems: 'center',
|
12
|
+
justifyContent: 'center',
|
13
|
+
backgroundColor: '$transparentBg',
|
14
|
+
borderRadius: '$round',
|
15
|
+
variants: {
|
16
|
+
isTile: {
|
17
|
+
true: {
|
18
|
+
width: 'unset',
|
19
|
+
height: 'unset',
|
20
|
+
},
|
21
|
+
},
|
22
|
+
},
|
23
|
+
});
|
24
|
+
|
25
|
+
export const ConnectionIndicator = ({ peerId, isTile = false }) => {
|
26
|
+
const downlinkQuality = useHMSStore(selectConnectionQualityByPeerID(peerId))?.downlinkQuality;
|
27
|
+
const { theme } = useTheme();
|
28
|
+
const defaultColor = theme.colors.bgTertiary;
|
29
|
+
if (downlinkQuality === -1 || downlinkQuality === undefined) {
|
30
|
+
return null;
|
31
|
+
}
|
32
|
+
if (downlinkQuality === 0) {
|
33
|
+
return (
|
34
|
+
<Tooltip title={getTooltipText(downlinkQuality)}>
|
35
|
+
<Wrapper isTile={isTile} css={{ color: '#ED4C5A' }} data-testid="tile_network">
|
36
|
+
<PoorConnectivityIcon />
|
37
|
+
</Wrapper>
|
38
|
+
</Tooltip>
|
39
|
+
);
|
40
|
+
}
|
41
|
+
const size = isTile ? 12 : 16;
|
42
|
+
return (
|
43
|
+
<Tooltip title={getTooltipText(downlinkQuality)}>
|
44
|
+
<Wrapper isTile={isTile} data-testid="tile_network">
|
45
|
+
<svg
|
46
|
+
width={size}
|
47
|
+
height={size}
|
48
|
+
viewBox="0 0 14 12"
|
49
|
+
xmlns="http://www.w3.org/2000/svg"
|
50
|
+
xmlSpace="preserve"
|
51
|
+
style={{
|
52
|
+
fillRule: 'evenodd',
|
53
|
+
clipRule: 'evenodd',
|
54
|
+
strokeLinejoin: 'round',
|
55
|
+
strokeMiterlimit: 2,
|
56
|
+
}}
|
57
|
+
>
|
58
|
+
<path
|
59
|
+
d="M6.875 0c2.549.035 4.679.902 6.445 2.648.366.362.45.796.216 1.096-.239.306-.714.34-1.142.072a2.28 2.28 0 0 1-.341-.271C9.24.862 4.924.775 1.992 3.346c-.284.249-.594.419-.983.393-.272-.019-.49-.135-.613-.388-.125-.261-.05-.498.114-.713.073-.092.156-.177.245-.254C2.516.804 4.591.039 6.875 0Z"
|
60
|
+
fill={getColor(4, downlinkQuality, defaultColor)}
|
61
|
+
transform="translate(-.333)"
|
62
|
+
/>
|
63
|
+
<path
|
64
|
+
d="M7.056 2.964c1.756.035 3.208.7 4.499 1.763.162.134.277.315.354.512.098.251.114.503-.075.72-.193.222-.452.259-.725.198-.293-.066-.518-.247-.738-.443a4.859 4.859 0 0 0-6.198-.26c-.166.127-.318.271-.475.409-.242.211-.513.343-.843.317-.43-.034-.679-.397-.561-.81.062-.211.181-.4.345-.546 1.265-1.162 2.733-1.836 4.417-1.86Z"
|
65
|
+
fill={getColor(3, downlinkQuality, defaultColor)}
|
66
|
+
transform="translate(-.333)"
|
67
|
+
/>
|
68
|
+
<path
|
69
|
+
d="M7.384,6.052C8.293,6.068 9.157,6.449 9.783,7.108C10.005,7.339 10.157,7.6 10.07,7.942C9.959,8.377 9.435,8.581 9.071,8.243C7.935,7.191 6.356,7.183 5.152,8.183C4.816,8.462 4.6,8.485 4.332,8.27C4.063,8.055 3.998,7.691 4.177,7.358C4.273,7.179 4.414,7.038 4.57,6.911C5.26,6.349 6.149,6.05 7.384,6.052L7.384,6.052Z"
|
70
|
+
fill={getColor(2, downlinkQuality, defaultColor)}
|
71
|
+
/>
|
72
|
+
<path
|
73
|
+
d="M8.214,9.941C8.214,10.234 8.097,10.515 7.888,10.721C7.68,10.928 7.398,11.042 7.104,11.039C6.471,11.036 5.982,10.541 5.993,9.912C6.004,9.259 6.499,8.766 7.133,8.779C7.744,8.791 8.22,9.301 8.214,9.941Z"
|
74
|
+
fill={getColor(1, downlinkQuality, defaultColor)}
|
75
|
+
/>
|
76
|
+
</svg>
|
77
|
+
</Wrapper>
|
78
|
+
</Tooltip>
|
79
|
+
);
|
80
|
+
};
|
@@ -0,0 +1,40 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { styled, Text, textEllipsis } from '../../../';
|
3
|
+
import { ConnectionIndicator } from './ConnectionIndicator';
|
4
|
+
|
5
|
+
const TileConnection = ({ name, peerId, hideLabel, width }) => {
|
6
|
+
return (
|
7
|
+
<Wrapper>
|
8
|
+
{!hideLabel ? (
|
9
|
+
<Text
|
10
|
+
css={{
|
11
|
+
c: '$textHighEmp',
|
12
|
+
...textEllipsis(width - 60),
|
13
|
+
}}
|
14
|
+
variant="xs"
|
15
|
+
>
|
16
|
+
{name}
|
17
|
+
</Text>
|
18
|
+
) : null}
|
19
|
+
<ConnectionIndicator isTile peerId={peerId} />
|
20
|
+
</Wrapper>
|
21
|
+
);
|
22
|
+
};
|
23
|
+
|
24
|
+
const Wrapper = styled('div', {
|
25
|
+
display: 'flex',
|
26
|
+
alignItems: 'center',
|
27
|
+
justifyContent: 'space-between',
|
28
|
+
position: 'absolute',
|
29
|
+
bottom: '$2',
|
30
|
+
left: '$2',
|
31
|
+
backgroundColor: '$backgroundDark',
|
32
|
+
borderRadius: '$1',
|
33
|
+
maxWidth: '85%',
|
34
|
+
zIndex: 1,
|
35
|
+
'& p,span': {
|
36
|
+
p: '$2 $3',
|
37
|
+
},
|
38
|
+
});
|
39
|
+
|
40
|
+
export default TileConnection;
|
@@ -0,0 +1,39 @@
|
|
1
|
+
const connectionTooltip = {
|
2
|
+
0: 'Reconnecting',
|
3
|
+
1: 'Very Bad Connection',
|
4
|
+
2: 'Bad Connection',
|
5
|
+
3: 'Moderate Connection',
|
6
|
+
4: 'Good Connection',
|
7
|
+
5: 'Excellent Connection',
|
8
|
+
};
|
9
|
+
connectionTooltip[-1] = 'Network Unknown';
|
10
|
+
|
11
|
+
/**
|
12
|
+
* @param connectionScore -> 1-5 connection score for network quality
|
13
|
+
*/
|
14
|
+
export const getTooltipText = connectionScore => {
|
15
|
+
return connectionTooltip[connectionScore];
|
16
|
+
};
|
17
|
+
|
18
|
+
/**
|
19
|
+
* position is needed here as we don't want all the dots/arcs to be colored,
|
20
|
+
* the non colored ones will be passed in the default color. If user is
|
21
|
+
* disconnected(score=0), no dot/arc will be colored.
|
22
|
+
* @param position -> 1 to 5
|
23
|
+
* @param connectionScore -> 0 to 5, 0 means disconnected
|
24
|
+
* @param defaultColor -> color for components not taking the connection color
|
25
|
+
*/
|
26
|
+
export const getColor = (position, connectionScore, defaultColor) => {
|
27
|
+
const shouldBeColored = position <= connectionScore;
|
28
|
+
if (!shouldBeColored) {
|
29
|
+
return defaultColor;
|
30
|
+
}
|
31
|
+
if (connectionScore >= 4) {
|
32
|
+
return '#37F28D';
|
33
|
+
} else if (connectionScore >= 3) {
|
34
|
+
return '#FAC919';
|
35
|
+
} else if (connectionScore >= 1) {
|
36
|
+
return '#ED4C5A';
|
37
|
+
}
|
38
|
+
return defaultColor;
|
39
|
+
};
|
@@ -0,0 +1,138 @@
|
|
1
|
+
import React, { Fragment, useCallback, useMemo, useState } from 'react';
|
2
|
+
import data from '@emoji-mart/data/sets/14/apple.json';
|
3
|
+
import { init } from 'emoji-mart';
|
4
|
+
import {
|
5
|
+
selectAvailableRoleNames,
|
6
|
+
selectIsConnectedToRoom,
|
7
|
+
selectLocalPeerID,
|
8
|
+
selectLocalPeerRoleName,
|
9
|
+
useCustomEvent,
|
10
|
+
useHMSActions,
|
11
|
+
useHMSStore,
|
12
|
+
useRecordingStreaming,
|
13
|
+
} from '@100mslive/react-sdk';
|
14
|
+
import { EmojiIcon } from '@100mslive/react-icons';
|
15
|
+
import { Dropdown } from '../../Dropdown';
|
16
|
+
import { Box, Flex } from '../../Layout';
|
17
|
+
import { Text } from '../../Text';
|
18
|
+
import { styled } from '../../Theme';
|
19
|
+
import { Tooltip } from '../../Tooltip';
|
20
|
+
import IconButton from '../IconButton';
|
21
|
+
import { useHLSViewerRole } from './AppData/useUISettings';
|
22
|
+
import { useDropdownList } from './hooks/useDropdownList';
|
23
|
+
import { useIsFeatureEnabled } from './hooks/useFeatures';
|
24
|
+
import { EMOJI_REACTION_TYPE, FEATURE_LIST, HLS_TIMED_METADATA_DOC_URL } from '../common/constants';
|
25
|
+
|
26
|
+
init({ data });
|
27
|
+
|
28
|
+
// When changing emojis in the grid, keep in mind that the payload used in sendHLSTimedMetadata has a limit of 100 characters. Using bigger emoji Ids can cause the limit to be exceeded.
|
29
|
+
const emojiReactionList = [
|
30
|
+
[{ emojiId: '+1' }, { emojiId: '-1' }, { emojiId: 'wave' }, { emojiId: 'clap' }, { emojiId: 'fire' }],
|
31
|
+
[{ emojiId: 'tada' }, { emojiId: 'heart_eyes' }, { emojiId: 'joy' }, { emojiId: 'open_mouth' }, { emojiId: 'sob' }],
|
32
|
+
];
|
33
|
+
|
34
|
+
export const EmojiReaction = () => {
|
35
|
+
const [open, setOpen] = useState(false);
|
36
|
+
const hmsActions = useHMSActions();
|
37
|
+
const isConnected = useHMSStore(selectIsConnectedToRoom);
|
38
|
+
const roles = useHMSStore(selectAvailableRoleNames);
|
39
|
+
const localPeerRole = useHMSStore(selectLocalPeerRoleName);
|
40
|
+
const localPeerId = useHMSStore(selectLocalPeerID);
|
41
|
+
const hlsViewerRole = useHLSViewerRole();
|
42
|
+
const { isStreamingOn } = useRecordingStreaming();
|
43
|
+
const isFeatureEnabled = useIsFeatureEnabled(FEATURE_LIST.EMOJI_REACTION);
|
44
|
+
const filteredRoles = useMemo(() => roles.filter(role => role !== hlsViewerRole), [roles, hlsViewerRole]);
|
45
|
+
useDropdownList({ open: open, name: 'EmojiReaction' });
|
46
|
+
|
47
|
+
const onEmojiEvent = useCallback(data => {
|
48
|
+
window.showFlyingEmoji(data?.emojiId, data?.senderId);
|
49
|
+
}, []);
|
50
|
+
|
51
|
+
const { sendEvent } = useCustomEvent({
|
52
|
+
type: EMOJI_REACTION_TYPE,
|
53
|
+
onEvent: onEmojiEvent,
|
54
|
+
});
|
55
|
+
|
56
|
+
const sendReaction = async emojiId => {
|
57
|
+
const data = {
|
58
|
+
type: EMOJI_REACTION_TYPE,
|
59
|
+
emojiId: emojiId,
|
60
|
+
senderId: localPeerId,
|
61
|
+
};
|
62
|
+
sendEvent(data, { roleNames: filteredRoles });
|
63
|
+
if (isStreamingOn) {
|
64
|
+
await hmsActions.sendHLSTimedMetadata([
|
65
|
+
{
|
66
|
+
payload: JSON.stringify(data),
|
67
|
+
duration: 2,
|
68
|
+
},
|
69
|
+
]);
|
70
|
+
}
|
71
|
+
};
|
72
|
+
|
73
|
+
if (!isConnected || localPeerRole === hlsViewerRole || !isFeatureEnabled) {
|
74
|
+
return null;
|
75
|
+
}
|
76
|
+
return (
|
77
|
+
<Fragment>
|
78
|
+
<Dropdown.Root open={open} onOpenChange={setOpen}>
|
79
|
+
<Dropdown.Trigger asChild data-testid="emoji_reaction_btn">
|
80
|
+
<IconButton>
|
81
|
+
<Tooltip title="Emoji reaction">
|
82
|
+
<Box>
|
83
|
+
<EmojiIcon />
|
84
|
+
</Box>
|
85
|
+
</Tooltip>
|
86
|
+
</IconButton>
|
87
|
+
</Dropdown.Trigger>
|
88
|
+
<Dropdown.Content sideOffset={5} align="center" css={{ p: '$8', bg: '$surfaceDefault' }}>
|
89
|
+
{emojiReactionList.map((emojiLine, index) => (
|
90
|
+
<Flex key={index} justify="between" css={{ mb: '$8' }}>
|
91
|
+
{emojiLine.map(emoji => (
|
92
|
+
<EmojiContainer key={emoji.emojiId} onClick={() => sendReaction(emoji.emojiId)}>
|
93
|
+
<em-emoji id={emoji.emojiId} size="100%" set="apple"></em-emoji>
|
94
|
+
</EmojiContainer>
|
95
|
+
))}
|
96
|
+
</Flex>
|
97
|
+
))}
|
98
|
+
<div style={{ textAlign: 'center' }}>
|
99
|
+
<Text
|
100
|
+
variant="sm"
|
101
|
+
inline={true}
|
102
|
+
css={{
|
103
|
+
color: '$textSecondary',
|
104
|
+
}}
|
105
|
+
>
|
106
|
+
Reactions will be timed for Live Streaming viewers.{' '}
|
107
|
+
</Text>
|
108
|
+
<Text
|
109
|
+
variant="sm"
|
110
|
+
inline={true}
|
111
|
+
css={{
|
112
|
+
color: '$primaryLight',
|
113
|
+
fontWeight: '$semiBold',
|
114
|
+
}}
|
115
|
+
>
|
116
|
+
<a href={HLS_TIMED_METADATA_DOC_URL} target="_blank" rel="noopener noreferrer">
|
117
|
+
{'Learn more ->'}
|
118
|
+
</a>
|
119
|
+
</Text>
|
120
|
+
</div>
|
121
|
+
</Dropdown.Content>
|
122
|
+
</Dropdown.Root>
|
123
|
+
</Fragment>
|
124
|
+
);
|
125
|
+
};
|
126
|
+
|
127
|
+
const EmojiContainer = styled('span', {
|
128
|
+
position: 'relative',
|
129
|
+
cursor: 'pointer',
|
130
|
+
width: '$16',
|
131
|
+
height: '$16',
|
132
|
+
p: '$4',
|
133
|
+
'&:hover': {
|
134
|
+
p: '7px',
|
135
|
+
bg: '$surfaceLighter',
|
136
|
+
borderRadius: '$1',
|
137
|
+
},
|
138
|
+
});
|
@@ -0,0 +1,105 @@
|
|
1
|
+
import React, { Component } from 'react';
|
2
|
+
import { logMessage } from 'zipyai';
|
3
|
+
import { CopyIcon } from '@100mslive/react-icons';
|
4
|
+
import { Button } from '../../Button';
|
5
|
+
import { Box, Flex } from '../../Layout';
|
6
|
+
import { Text } from '../../Text';
|
7
|
+
import { Tooltip } from '../../Tooltip';
|
8
|
+
import { ErrorWithSupportLink } from './AuthToken';
|
9
|
+
|
10
|
+
export class ErrorBoundary extends Component {
|
11
|
+
constructor(props) {
|
12
|
+
super(props);
|
13
|
+
this.state = { error: null, errorInfo: null, isErrorCopied: false };
|
14
|
+
}
|
15
|
+
|
16
|
+
componentDidCatch(error, errorInfo) {
|
17
|
+
console.error(`react error boundary - ${error.message}`, error, errorInfo);
|
18
|
+
// Catch errors in any components below and re-render with error message
|
19
|
+
this.setState(
|
20
|
+
{
|
21
|
+
error: error?.message,
|
22
|
+
errorInfo: errorInfo,
|
23
|
+
},
|
24
|
+
() => {
|
25
|
+
logMessage(`uiError - ${this.state.error} - ${JSON.stringify(this.state.errorInfo)}`);
|
26
|
+
},
|
27
|
+
);
|
28
|
+
}
|
29
|
+
|
30
|
+
render() {
|
31
|
+
if (this.state.errorInfo) {
|
32
|
+
return (
|
33
|
+
<Flex
|
34
|
+
align="center"
|
35
|
+
justify="center"
|
36
|
+
css={{
|
37
|
+
size: '100%',
|
38
|
+
height: '100vh',
|
39
|
+
width: '100%',
|
40
|
+
color: '$textPrimary',
|
41
|
+
backgroundColor: 'black',
|
42
|
+
}}
|
43
|
+
>
|
44
|
+
<Box css={{ position: 'relative', overflow: 'hidden', r: '$3', height: '100%', width: '100%' }}>
|
45
|
+
<Flex
|
46
|
+
direction="column"
|
47
|
+
css={{
|
48
|
+
position: 'absolute',
|
49
|
+
size: '100%',
|
50
|
+
top: '33.33%',
|
51
|
+
left: 0,
|
52
|
+
}}
|
53
|
+
>
|
54
|
+
<div style={{ margin: '1.5rem', width: '100%' }}>
|
55
|
+
<Text>Something went wrong</Text>
|
56
|
+
<Text>Message: ${this.state.error}</Text>
|
57
|
+
<br />
|
58
|
+
{ErrorWithSupportLink(`Please reload to see if it works.`)}
|
59
|
+
</div>
|
60
|
+
<Flex>
|
61
|
+
<Tooltip title="Reload page">
|
62
|
+
<Button
|
63
|
+
onClick={() => {
|
64
|
+
window.location.reload();
|
65
|
+
}}
|
66
|
+
css={{ mx: '$8' }}
|
67
|
+
data-testid="join_again_btn"
|
68
|
+
>
|
69
|
+
Reload
|
70
|
+
</Button>
|
71
|
+
</Tooltip>
|
72
|
+
<Tooltip title="Copy error details to clipboard">
|
73
|
+
<Button
|
74
|
+
onClick={() => {
|
75
|
+
const { error, errorInfo } = this.state;
|
76
|
+
navigator.clipboard.writeText(
|
77
|
+
JSON.stringify({
|
78
|
+
error,
|
79
|
+
errorInfo,
|
80
|
+
}),
|
81
|
+
);
|
82
|
+
this.setState({ isErrorCopied: true });
|
83
|
+
}}
|
84
|
+
css={{ mx: '$8' }}
|
85
|
+
data-testid="join_again_btn"
|
86
|
+
>
|
87
|
+
<CopyIcon /> {this.state.isErrorCopied ? 'Copied' : 'Copy Details'}
|
88
|
+
</Button>
|
89
|
+
</Tooltip>
|
90
|
+
</Flex>
|
91
|
+
|
92
|
+
<details style={{ whiteSpace: 'pre-wrap', margin: '1.5rem' }}>
|
93
|
+
<Text>{this.state.error && this.state.error.toString()}</Text>
|
94
|
+
<br />
|
95
|
+
<Text>{JSON.stringify(this.state.errorInfo)}</Text>
|
96
|
+
</details>
|
97
|
+
</Flex>
|
98
|
+
</Box>
|
99
|
+
</Flex>
|
100
|
+
);
|
101
|
+
}
|
102
|
+
|
103
|
+
return this.props.children;
|
104
|
+
}
|
105
|
+
}
|