@100mslive/roomkit-react 0.4.3-alpha.2 → 0.4.3-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Prebuilt/App.d.ts +0 -1
- package/dist/Prebuilt/AppContext.d.ts +0 -1
- package/dist/index.cjs.css +194 -219
- package/dist/index.cjs.css.map +3 -3
- package/dist/index.cjs.js +8 -56
- package/dist/index.cjs.js.map +3 -3
- package/dist/index.css +194 -219
- package/dist/index.css.map +3 -3
- package/dist/index.js +8 -56
- package/dist/index.js.map +3 -3
- package/dist/meta.cjs.json +23 -41
- package/dist/meta.esbuild.json +23 -41
- package/package.json +8 -9
- package/src/Accordion/Accordion.tsx +0 -88
- package/src/Accordion/index.ts +0 -8
- package/src/AudioLevel/AudioLevel.tsx +0 -84
- package/src/AudioLevel/audio-level.png +0 -0
- package/src/AudioLevel/index.ts +0 -2
- package/src/AudioLevel/useBorderAudioLevel.tsx +0 -34
- package/src/Avatar/Avatar.tsx +0 -60
- package/src/Avatar/getAvatarBg.ts +0 -50
- package/src/Avatar/index.ts +0 -1
- package/src/Button/Button.tsx +0 -210
- package/src/Button/index.tsx +0 -1
- package/src/Checkbox/Checkbox.tsx +0 -35
- package/src/Checkbox/index.tsx +0 -1
- package/src/Collapsible/Collapsible.tsx +0 -34
- package/src/Collapsible/index.tsx +0 -1
- package/src/Diagnostics/AudioTest.tsx +0 -188
- package/src/Diagnostics/BrowserTest.tsx +0 -141
- package/src/Diagnostics/ConnectivityTest.tsx +0 -383
- package/src/Diagnostics/DeviceSelector.jsx +0 -71
- package/src/Diagnostics/Diagnostics.tsx +0 -190
- package/src/Diagnostics/DiagnosticsContext.ts +0 -46
- package/src/Diagnostics/VideoTest.tsx +0 -72
- package/src/Diagnostics/components.tsx +0 -70
- package/src/Diagnostics/index.ts +0 -1
- package/src/Divider/Divider.tsx +0 -45
- package/src/Divider/index.ts +0 -1
- package/src/Dropdown/Dropdown.tsx +0 -145
- package/src/Dropdown/index.tsx +0 -1
- package/src/Fieldset/Fieldset.tsx +0 -11
- package/src/Fieldset/index.tsx +0 -1
- package/src/Footer/Footer.tsx +0 -47
- package/src/Footer/index.tsx +0 -1
- package/src/IconButton/IconButton.tsx +0 -43
- package/src/IconButton/index.tsx +0 -1
- package/src/Input/Input.tsx +0 -109
- package/src/Input/index.tsx +0 -1
- package/src/Label/Label.tsx +0 -8
- package/src/Label/index.ts +0 -1
- package/src/Layout/Box.tsx +0 -3
- package/src/Layout/Flex.tsx +0 -76
- package/src/Layout/index.tsx +0 -2
- package/src/Link/Link.tsx +0 -54
- package/src/Link/index.tsx +0 -2
- package/src/Loading/Loading.tsx +0 -30
- package/src/Loading/index.ts +0 -1
- package/src/Modal/Dialog.tsx +0 -57
- package/src/Modal/DialogContent.tsx +0 -65
- package/src/Modal/index.ts +0 -1
- package/src/Pagination/StyledPagination.tsx +0 -70
- package/src/Pagination/index.tsx +0 -1
- package/src/Popover/index.tsx +0 -34
- package/src/Prebuilt/App.tsx +0 -323
- package/src/Prebuilt/AppContext.tsx +0 -34
- package/src/Prebuilt/AppStateContext.tsx +0 -95
- package/src/Prebuilt/IconButton.tsx +0 -26
- package/src/Prebuilt/common/PeersSorter.ts +0 -111
- package/src/Prebuilt/common/constants.ts +0 -151
- package/src/Prebuilt/common/hooks.ts +0 -257
- package/src/Prebuilt/common/utils.js +0 -185
- package/src/Prebuilt/components/AppData/AppData.tsx +0 -208
- package/src/Prebuilt/components/AppData/useChatState.js +0 -18
- package/src/Prebuilt/components/AppData/useSheet.ts +0 -33
- package/src/Prebuilt/components/AppData/useSidepane.js +0 -99
- package/src/Prebuilt/components/AppData/useSidepaneResetOnLayoutUpdate.tsx +0 -22
- package/src/Prebuilt/components/AppData/useUISettings.js +0 -212
- package/src/Prebuilt/components/AudioVideoToggle.tsx +0 -411
- package/src/Prebuilt/components/AuthToken.tsx +0 -148
- package/src/Prebuilt/components/CaptionIcon.tsx +0 -27
- package/src/Prebuilt/components/Chat/ArrowNavigation.tsx +0 -44
- package/src/Prebuilt/components/Chat/Chat.tsx +0 -190
- package/src/Prebuilt/components/Chat/ChatActions.tsx +0 -314
- package/src/Prebuilt/components/Chat/ChatBody.tsx +0 -493
- package/src/Prebuilt/components/Chat/ChatFooter.tsx +0 -316
- package/src/Prebuilt/components/Chat/ChatSelector.tsx +0 -228
- package/src/Prebuilt/components/Chat/ChatSelectorContainer.tsx +0 -158
- package/src/Prebuilt/components/Chat/ChatStates.tsx +0 -73
- package/src/Prebuilt/components/Chat/EmptyChat.tsx +0 -58
- package/src/Prebuilt/components/Chat/MwebChatOption.tsx +0 -24
- package/src/Prebuilt/components/Chat/PinnedMessage.tsx +0 -140
- package/src/Prebuilt/components/Chat/StickIndicator.tsx +0 -24
- package/src/Prebuilt/components/Chat/useEmojiPickerStyles.js +0 -32
- package/src/Prebuilt/components/Chat/useUnreadCount.ts +0 -19
- package/src/Prebuilt/components/Chat/utils.ts +0 -11
- package/src/Prebuilt/components/ChatSettings.tsx +0 -68
- package/src/Prebuilt/components/Chip.tsx +0 -40
- package/src/Prebuilt/components/ConferenceScreen.tsx +0 -205
- package/src/Prebuilt/components/Connection/ConnectionIndicator.tsx +0 -89
- package/src/Prebuilt/components/Connection/TileConnection.tsx +0 -93
- package/src/Prebuilt/components/Connection/connectionQualityUtils.js +0 -37
- package/src/Prebuilt/components/EmojiReaction.jsx +0 -100
- package/src/Prebuilt/components/EndCallFeedback/Feedback.tsx +0 -71
- package/src/Prebuilt/components/EndCallFeedback/FeedbackForm.tsx +0 -381
- package/src/Prebuilt/components/EndCallFeedback/ThankyouView.tsx +0 -64
- package/src/Prebuilt/components/ErrorBoundary.jsx +0 -102
- package/src/Prebuilt/components/Footer/ChatToggle.tsx +0 -53
- package/src/Prebuilt/components/Footer/EmojiCard.jsx +0 -34
- package/src/Prebuilt/components/Footer/Footer.tsx +0 -115
- package/src/Prebuilt/components/Footer/PaginatedParticipants.tsx +0 -124
- package/src/Prebuilt/components/Footer/ParticipantList.tsx +0 -478
- package/src/Prebuilt/components/Footer/PollsToggle.tsx +0 -37
- package/src/Prebuilt/components/Footer/RoleAccordion.tsx +0 -183
- package/src/Prebuilt/components/Footer/RoleOptions.tsx +0 -215
- package/src/Prebuilt/components/Footer/WhiteboardToggle.tsx +0 -52
- package/src/Prebuilt/components/FullPageProgress.tsx +0 -22
- package/src/Prebuilt/components/HMSVideo/Controls.jsx +0 -22
- package/src/Prebuilt/components/HMSVideo/FullscreenButton.tsx +0 -13
- package/src/Prebuilt/components/HMSVideo/HLSAutoplayBlockedPrompt.tsx +0 -72
- package/src/Prebuilt/components/HMSVideo/HLSCaptionSelector.tsx +0 -15
- package/src/Prebuilt/components/HMSVideo/HLSQualitySelector.tsx +0 -248
- package/src/Prebuilt/components/HMSVideo/HMSVideo.jsx +0 -75
- package/src/Prebuilt/components/HMSVideo/MwebHLSViewTitle.tsx +0 -86
- package/src/Prebuilt/components/HMSVideo/PlayPauseButton.tsx +0 -27
- package/src/Prebuilt/components/HMSVideo/PlayPauseSeekControls.tsx +0 -158
- package/src/Prebuilt/components/HMSVideo/PlayerContext.tsx +0 -15
- package/src/Prebuilt/components/HMSVideo/SeekControl.tsx +0 -22
- package/src/Prebuilt/components/HMSVideo/VideoProgress.tsx +0 -100
- package/src/Prebuilt/components/HMSVideo/VideoTime.tsx +0 -52
- package/src/Prebuilt/components/HMSVideo/VolumeControl.tsx +0 -70
- package/src/Prebuilt/components/HMSVideo/index.ts +0 -24
- package/src/Prebuilt/components/HMSVideo/utils.ts +0 -37
- package/src/Prebuilt/components/Header/Header.tsx +0 -52
- package/src/Prebuilt/components/Header/HeaderComponents.jsx +0 -57
- package/src/Prebuilt/components/Header/ParticipantFilter.jsx +0 -89
- package/src/Prebuilt/components/Header/RoomDetailsHeader.tsx +0 -51
- package/src/Prebuilt/components/Header/StreamActions.tsx +0 -297
- package/src/Prebuilt/components/Header/common.jsx +0 -196
- package/src/Prebuilt/components/Header/index.tsx +0 -1
- package/src/Prebuilt/components/HlsStatsOverlay.jsx +0 -89
- package/src/Prebuilt/components/IconButtonWithOptions/IconButtonWithOptions.tsx +0 -167
- package/src/Prebuilt/components/Input/KeyboardInputManager.js +0 -107
- package/src/Prebuilt/components/InsetTile.tsx +0 -136
- package/src/Prebuilt/components/LayoutModeSelector.tsx +0 -112
- package/src/Prebuilt/components/Leave/DesktopLeaveRoom.tsx +0 -166
- package/src/Prebuilt/components/Leave/EndSessionContent.tsx +0 -64
- package/src/Prebuilt/components/Leave/LeaveAtoms.tsx +0 -26
- package/src/Prebuilt/components/Leave/LeaveCard.tsx +0 -36
- package/src/Prebuilt/components/Leave/LeaveRoom.tsx +0 -82
- package/src/Prebuilt/components/Leave/LeaveSessionContent.tsx +0 -61
- package/src/Prebuilt/components/Leave/MwebLeaveRoom.tsx +0 -135
- package/src/Prebuilt/components/LeaveScreen.tsx +0 -71
- package/src/Prebuilt/components/MoreSettings/ActionTile.jsx +0 -60
- package/src/Prebuilt/components/MoreSettings/BulkRoleChangeModal.jsx +0 -139
- package/src/Prebuilt/components/MoreSettings/CaptionContent.tsx +0 -143
- package/src/Prebuilt/components/MoreSettings/CaptionModal.tsx +0 -37
- package/src/Prebuilt/components/MoreSettings/ChangeNameContent.tsx +0 -123
- package/src/Prebuilt/components/MoreSettings/ChangeNameModal.tsx +0 -78
- package/src/Prebuilt/components/MoreSettings/EmbedUrl.jsx +0 -81
- package/src/Prebuilt/components/MoreSettings/FullScreenItem.tsx +0 -26
- package/src/Prebuilt/components/MoreSettings/MoreSettings.tsx +0 -29
- package/src/Prebuilt/components/MoreSettings/MuteAllContent.tsx +0 -81
- package/src/Prebuilt/components/MoreSettings/MuteAllModal.tsx +0 -72
- package/src/Prebuilt/components/MoreSettings/SplitComponents/DesktopOptions.tsx +0 -282
- package/src/Prebuilt/components/MoreSettings/SplitComponents/MwebOptions.tsx +0 -387
- package/src/Prebuilt/components/MoreSettings/constants.ts +0 -14
- package/src/Prebuilt/components/MwebLandscapePrompt.tsx +0 -81
- package/src/Prebuilt/components/Notifications/AutoplayBlockedModal.tsx +0 -39
- package/src/Prebuilt/components/Notifications/ChatNotifications.tsx +0 -34
- package/src/Prebuilt/components/Notifications/DeviceChangeNotifications.tsx +0 -18
- package/src/Prebuilt/components/Notifications/DeviceInUseError.tsx +0 -86
- package/src/Prebuilt/components/Notifications/ErrorNotifications.tsx +0 -56
- package/src/Prebuilt/components/Notifications/HLSFailureModal.tsx +0 -71
- package/src/Prebuilt/components/Notifications/HandRaisedNotifications.tsx +0 -78
- package/src/Prebuilt/components/Notifications/InitErrorModal.tsx +0 -42
- package/src/Prebuilt/components/Notifications/MessageNotifications.tsx +0 -24
- package/src/Prebuilt/components/Notifications/Notifications.tsx +0 -65
- package/src/Prebuilt/components/Notifications/PeerNotifications.tsx +0 -52
- package/src/Prebuilt/components/Notifications/PermissionErrorModal.tsx +0 -144
- package/src/Prebuilt/components/Notifications/PollNotificationModal.tsx +0 -71
- package/src/Prebuilt/components/Notifications/ReconnectNotifications.tsx +0 -33
- package/src/Prebuilt/components/Notifications/RoleChangeNotification.tsx +0 -24
- package/src/Prebuilt/components/Notifications/TrackBulkUnmuteModal.tsx +0 -61
- package/src/Prebuilt/components/Notifications/TrackNotifications.tsx +0 -41
- package/src/Prebuilt/components/Notifications/TrackUnmuteModal.tsx +0 -63
- package/src/Prebuilt/components/Notifications/TranscriptionNotifications.tsx +0 -58
- package/src/Prebuilt/components/Notifications/index.tsx +0 -1
- package/src/Prebuilt/components/PIP/PIPChat.tsx +0 -292
- package/src/Prebuilt/components/PIP/PIPChatOption.tsx +0 -18
- package/src/Prebuilt/components/PIP/PIPComponent.tsx +0 -90
- package/src/Prebuilt/components/PIP/PIPManager.ts +0 -335
- package/src/Prebuilt/components/PIP/PIPProvider.tsx +0 -56
- package/src/Prebuilt/components/PIP/PIPWindow.tsx +0 -13
- package/src/Prebuilt/components/PIP/SetupMediaSession.js +0 -60
- package/src/Prebuilt/components/PIP/context.ts +0 -10
- package/src/Prebuilt/components/PIP/index.jsx +0 -6
- package/src/Prebuilt/components/PIP/pip.test.js +0 -72
- package/src/Prebuilt/components/PIP/pipUtils.js +0 -183
- package/src/Prebuilt/components/PIP/usePIPChat.tsx +0 -105
- package/src/Prebuilt/components/PIP/usePIPWindow.tsx +0 -12
- package/src/Prebuilt/components/Pagination.tsx +0 -60
- package/src/Prebuilt/components/Polls/CreatePollQuiz/PollsQuizMenu.tsx +0 -248
- package/src/Prebuilt/components/Polls/CreateQuestions/CreateQuestions.jsx +0 -142
- package/src/Prebuilt/components/Polls/CreateQuestions/DeleteQuestionModal.tsx +0 -74
- package/src/Prebuilt/components/Polls/CreateQuestions/QuestionForm.tsx +0 -324
- package/src/Prebuilt/components/Polls/CreateQuestions/SavedQuestion.tsx +0 -64
- package/src/Prebuilt/components/Polls/Polls.tsx +0 -31
- package/src/Prebuilt/components/Polls/Voting/LeaderboardEntry.tsx +0 -76
- package/src/Prebuilt/components/Polls/Voting/LeaderboardSummary.tsx +0 -116
- package/src/Prebuilt/components/Polls/Voting/PeerParticipationSummary.tsx +0 -60
- package/src/Prebuilt/components/Polls/Voting/QuestionCard.jsx +0 -221
- package/src/Prebuilt/components/Polls/Voting/StandardVoting.tsx +0 -47
- package/src/Prebuilt/components/Polls/Voting/StatisticBox.tsx +0 -20
- package/src/Prebuilt/components/Polls/Voting/TimedVoting.tsx +0 -55
- package/src/Prebuilt/components/Polls/Voting/Voting.tsx +0 -143
- package/src/Prebuilt/components/Polls/Voting/useQuizSummary.tsx +0 -50
- package/src/Prebuilt/components/Polls/common/Line.tsx +0 -4
- package/src/Prebuilt/components/Polls/common/MultipleChoiceOptions.jsx +0 -115
- package/src/Prebuilt/components/Polls/common/OptionInputWithDelete.tsx +0 -38
- package/src/Prebuilt/components/Polls/common/SingleChoiceOptions.jsx +0 -140
- package/src/Prebuilt/components/Polls/common/StatusIndicator.tsx +0 -35
- package/src/Prebuilt/components/Polls/common/VoteCount.tsx +0 -15
- package/src/Prebuilt/components/Polls/common/VoteProgress.tsx +0 -18
- package/src/Prebuilt/components/Polls/common/constants.ts +0 -5
- package/src/Prebuilt/components/Polls/common/utils.ts +0 -22
- package/src/Prebuilt/components/Preview/PreviewForm.tsx +0 -94
- package/src/Prebuilt/components/Preview/PreviewJoin.tsx +0 -292
- package/src/Prebuilt/components/Preview/PreviewScreen.tsx +0 -38
- package/src/Prebuilt/components/PreviousRoleInMetadata.tsx +0 -20
- package/src/Prebuilt/components/RaiseHand.tsx +0 -30
- package/src/Prebuilt/components/RemoveParticipant.tsx +0 -35
- package/src/Prebuilt/components/RoleChangeModal.tsx +0 -188
- package/src/Prebuilt/components/RoleChangeRequest/RequestPrompt.tsx +0 -75
- package/src/Prebuilt/components/RoleChangeRequest/RoleChangeRequestModal.tsx +0 -94
- package/src/Prebuilt/components/RoomDetails/Duration.tsx +0 -26
- package/src/Prebuilt/components/RoomDetails/RoomDetailsPane.tsx +0 -63
- package/src/Prebuilt/components/RoomDetails/RoomDetailsRow.tsx +0 -23
- package/src/Prebuilt/components/RoomDetails/RoomDetailsSheet.tsx +0 -45
- package/src/Prebuilt/components/ScreenShareToggle.jsx +0 -58
- package/src/Prebuilt/components/ScreenshareDisplay.tsx +0 -39
- package/src/Prebuilt/components/ScreenshareTile.tsx +0 -134
- package/src/Prebuilt/components/SecondaryTiles.tsx +0 -81
- package/src/Prebuilt/components/Settings/DeviceSettings.jsx +0 -208
- package/src/Prebuilt/components/Settings/LayoutSettings.tsx +0 -74
- package/src/Prebuilt/components/Settings/NotificationSettings.tsx +0 -66
- package/src/Prebuilt/components/Settings/SettingsModal.jsx +0 -301
- package/src/Prebuilt/components/Settings/StartRecording.jsx +0 -101
- package/src/Prebuilt/components/Settings/SwitchWithLabel.tsx +0 -53
- package/src/Prebuilt/components/Settings/common.ts +0 -16
- package/src/Prebuilt/components/ShareMenuIcon.jsx +0 -27
- package/src/Prebuilt/components/SidePaneTabs.tsx +0 -214
- package/src/Prebuilt/components/StatsForNerds.jsx +0 -373
- package/src/Prebuilt/components/Streaming/Common.jsx +0 -143
- package/src/Prebuilt/components/Streaming/ResolutionInput.jsx +0 -88
- package/src/Prebuilt/components/TileMenu/TileMenu.tsx +0 -148
- package/src/Prebuilt/components/TileMenu/TileMenuContent.tsx +0 -393
- package/src/Prebuilt/components/TileMenu/utils.ts +0 -7
- package/src/Prebuilt/components/Toast/Toast.jsx +0 -17
- package/src/Prebuilt/components/Toast/ToastBatcher.js +0 -64
- package/src/Prebuilt/components/Toast/ToastConfig.jsx +0 -177
- package/src/Prebuilt/components/Toast/ToastContainer.jsx +0 -30
- package/src/Prebuilt/components/Toast/ToastManager.js +0 -44
- package/src/Prebuilt/components/VideoLayouts/EqualProminence.tsx +0 -62
- package/src/Prebuilt/components/VideoLayouts/Grid.tsx +0 -43
- package/src/Prebuilt/components/VideoLayouts/GridLayout.tsx +0 -155
- package/src/Prebuilt/components/VideoLayouts/ProminenceLayout.tsx +0 -91
- package/src/Prebuilt/components/VideoLayouts/RoleProminence.tsx +0 -66
- package/src/Prebuilt/components/VideoLayouts/ScreenshareLayout.tsx +0 -74
- package/src/Prebuilt/components/VideoLayouts/WhiteboardLayout.tsx +0 -93
- package/src/Prebuilt/components/VideoLayouts/interface.ts +0 -11
- package/src/Prebuilt/components/VideoTile.tsx +0 -203
- package/src/Prebuilt/components/VirtualBackground/VBCollection.tsx +0 -52
- package/src/Prebuilt/components/VirtualBackground/VBHandler.tsx +0 -130
- package/src/Prebuilt/components/VirtualBackground/VBOption.tsx +0 -57
- package/src/Prebuilt/components/VirtualBackground/VBPicker.tsx +0 -252
- package/src/Prebuilt/components/VirtualBackground/VBToggle.tsx +0 -50
- package/src/Prebuilt/components/hooks/useAudioOutputTest.tsx +0 -20
- package/src/Prebuilt/components/hooks/useAutoStartStreaming.tsx +0 -70
- package/src/Prebuilt/components/hooks/useChatBlacklist.ts +0 -29
- package/src/Prebuilt/components/hooks/useCloseScreenshareWhiteboard.tsx +0 -17
- package/src/Prebuilt/components/hooks/useDropdownList.ts +0 -24
- package/src/Prebuilt/components/hooks/useDropdownSelection.jsx +0 -3
- package/src/Prebuilt/components/hooks/useFullscreen.ts +0 -46
- package/src/Prebuilt/components/hooks/useGroupOnStageActions.tsx +0 -54
- package/src/Prebuilt/components/hooks/useMetadata.tsx +0 -56
- package/src/Prebuilt/components/hooks/usePeerOnStageActions.tsx +0 -49
- package/src/Prebuilt/components/hooks/usePinnedBy.tsx +0 -22
- package/src/Prebuilt/components/hooks/usePinnedMessages.ts +0 -78
- package/src/Prebuilt/components/hooks/usePlaylist.js +0 -25
- package/src/Prebuilt/components/hooks/usePlaylistMusic.js +0 -35
- package/src/Prebuilt/components/hooks/useRedirectToLeave.tsx +0 -23
- package/src/Prebuilt/components/hooks/useRoleProminencePeers.tsx +0 -39
- package/src/Prebuilt/components/hooks/useScreenshareAudio.js +0 -28
- package/src/Prebuilt/components/hooks/useTileLayout.tsx +0 -128
- package/src/Prebuilt/components/hooks/useUnreadPollQuizPresent.tsx +0 -17
- package/src/Prebuilt/components/hooks/useUserPreferences.jsx +0 -26
- package/src/Prebuilt/components/hooks/useVideoTileLayout.ts +0 -26
- package/src/Prebuilt/components/init/Init.jsx +0 -31
- package/src/Prebuilt/components/pdfAnnotator/pdfFileOptions.jsx +0 -42
- package/src/Prebuilt/components/pdfAnnotator/pdfHeader.jsx +0 -31
- package/src/Prebuilt/components/pdfAnnotator/pdfInfo.jsx +0 -32
- package/src/Prebuilt/components/pdfAnnotator/shareScreenOptions.jsx +0 -211
- package/src/Prebuilt/components/pdfAnnotator/submitPdf.jsx +0 -48
- package/src/Prebuilt/components/pdfAnnotator/uploadedFile.jsx +0 -71
- package/src/Prebuilt/components/peerTileUtils.tsx +0 -42
- package/src/Prebuilt/images/android-perm-1.png +0 -0
- package/src/Prebuilt/images/empty-chat.svg +0 -12
- package/src/Prebuilt/images/ios-perm-0.png +0 -0
- package/src/Prebuilt/images/pdf-share.png +0 -0
- package/src/Prebuilt/images/rtmp.png +0 -0
- package/src/Prebuilt/images/screen-share.png +0 -0
- package/src/Prebuilt/images/transaction_error.svg +0 -12
- package/src/Prebuilt/index.ts +0 -1
- package/src/Prebuilt/layouts/EmbedView.jsx +0 -94
- package/src/Prebuilt/layouts/HLSView.jsx +0 -794
- package/src/Prebuilt/layouts/PDFView.jsx +0 -67
- package/src/Prebuilt/layouts/Sheet.tsx +0 -14
- package/src/Prebuilt/layouts/SidePane.tsx +0 -241
- package/src/Prebuilt/layouts/VideoStreamingSection.tsx +0 -164
- package/src/Prebuilt/layouts/WaitingView.tsx +0 -52
- package/src/Prebuilt/plugins/CaptionsViewer.tsx +0 -261
- package/src/Prebuilt/plugins/FlyingEmoji.jsx +0 -154
- package/src/Prebuilt/plugins/RemoteStopScreenshare.jsx +0 -18
- package/src/Prebuilt/plugins/transcription/Transcriber.js +0 -216
- package/src/Prebuilt/plugins/transcription/TranscriptionButton.jsx +0 -138
- package/src/Prebuilt/plugins/transcription/index.jsx +0 -1
- package/src/Prebuilt/primitives/DialogContent.jsx +0 -285
- package/src/Prebuilt/primitives/DropdownTrigger.jsx +0 -46
- package/src/Prebuilt/provider/roomLayoutProvider/constants/index.ts +0 -60
- package/src/Prebuilt/provider/roomLayoutProvider/hooks/useFetchRoomLayout.ts +0 -88
- package/src/Prebuilt/provider/roomLayoutProvider/hooks/useInsetEnabled.ts +0 -10
- package/src/Prebuilt/provider/roomLayoutProvider/hooks/useRoomLayoutScreen.ts +0 -112
- package/src/Prebuilt/provider/roomLayoutProvider/index.tsx +0 -53
- package/src/Prebuilt/services/FeatureFlags.jsx +0 -46
- package/src/Progress/index.tsx +0 -17
- package/src/QRCode/QRCode.tsx +0 -6
- package/src/QRCode/index.tsx +0 -1
- package/src/RadioGroup/RadioGroup.tsx +0 -33
- package/src/RadioGroup/index.tsx +0 -1
- package/src/ReactSelect/ReactSelect.tsx +0 -97
- package/src/ReactSelect/index.ts +0 -1
- package/src/Select/Select.tsx +0 -63
- package/src/Select/index.ts +0 -1
- package/src/Sheet/Sheet.tsx +0 -122
- package/src/Sheet/index.ts +0 -1
- package/src/Slider/Slider.tsx +0 -70
- package/src/Slider/index.ts +0 -1
- package/src/Stats/Stats.tsx +0 -243
- package/src/Stats/StyledStats.tsx +0 -57
- package/src/Stats/formatBytes.ts +0 -19
- package/src/Stats/index.tsx +0 -2
- package/src/Stats/useQoE.ts +0 -79
- package/src/Switch/Switch.tsx +0 -52
- package/src/Switch/index.ts +0 -1
- package/src/Tabs/Tabs.tsx +0 -41
- package/src/Tabs/index.tsx +0 -1
- package/src/Text/Text.tsx +0 -149
- package/src/Text/index.tsx +0 -1
- package/src/TextArea/TextArea.tsx +0 -30
- package/src/TextArea/index.tsx +0 -1
- package/src/Theme/ThemeProvider.tsx +0 -98
- package/src/Theme/base.config.ts +0 -236
- package/src/Theme/index.tsx +0 -2
- package/src/Theme/stitches.config.ts +0 -88
- package/src/Theme/useSSR.tsx +0 -24
- package/src/TileMenu/StyledMenuTile.tsx +0 -105
- package/src/TileMenu/TileMenu.tsx +0 -98
- package/src/TileMenu/index.tsx +0 -1
- package/src/Toast/Toast.tsx +0 -170
- package/src/Toast/index.tsx +0 -1
- package/src/Tooltip/Tooltip.tsx +0 -79
- package/src/Tooltip/index.ts +0 -1
- package/src/Video/Video.tsx +0 -61
- package/src/Video/index.tsx +0 -1
- package/src/VideoList/StyledVideoList.tsx +0 -39
- package/src/VideoList/index.tsx +0 -2
- package/src/VideoList/videoListUtils.tsx +0 -20
- package/src/VideoTile/StyledVideoTile.tsx +0 -146
- package/src/VideoTile/index.tsx +0 -1
- package/src/context/DialogContext.tsx +0 -13
- package/src/fixtures/chats.ts +0 -25
- package/src/fixtures/peers.ts +0 -27
- package/src/fixtures/tracks.ts +0 -11
- package/src/hooks/useDialogContainerSelector.tsx +0 -7
- package/src/index.ts +0 -41
- package/src/store/SetupFakeStore.ts +0 -33
- package/src/store/StorybookSDK.ts +0 -231
- package/src/utils/animations.ts +0 -114
- package/src/utils/index.ts +0 -2
- package/src/utils/styles.ts +0 -22
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
import * as workerTimers from 'worker-timers';
|
|
2
|
-
import { HMSActions, HMSPeer, HMSTrack, HMSVideoTrack } from '@100mslive/react-sdk';
|
|
3
|
-
// @ts-ignore: No implicit any
|
|
4
|
-
import { drawVideoElementsOnCanvas, dummyChangeInCanvas, resetPIPCanvasColors } from './pipUtils';
|
|
5
|
-
import { isIOS, isMacOS, isSafari } from '../../common/constants';
|
|
6
|
-
const MAX_NUMBER_OF_TILES_IN_PIP = 4;
|
|
7
|
-
const DEFAULT_FPS = 30;
|
|
8
|
-
const DEFAULT_CANVAS_WIDTH = 480;
|
|
9
|
-
const DEFAULT_CANVAS_HEIGHT = 320;
|
|
10
|
-
const LEAVE_EVENT_NAME = 'leavepictureinpicture';
|
|
11
|
-
|
|
12
|
-
enum PIPStates {
|
|
13
|
-
starting = 'starting',
|
|
14
|
-
started = 'started',
|
|
15
|
-
stopping = 'stopping',
|
|
16
|
-
stopped = 'stopped',
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* video elements are stitched together as a canvas which is converted to
|
|
21
|
-
* another video element converted to PIP.
|
|
22
|
-
* The task is split into two parts -
|
|
23
|
-
* 1. a function which gets hit when the input changes and updates the tracks
|
|
24
|
-
* to show
|
|
25
|
-
* 2. an independent loop which updates the canvas periodically based on the current
|
|
26
|
-
* tracks which should be shown.
|
|
27
|
-
*/
|
|
28
|
-
class PipManager {
|
|
29
|
-
private listeners = new Set<(value: boolean) => void>();
|
|
30
|
-
private canvas: HTMLCanvasElement | null = null;
|
|
31
|
-
private pipVideo: HTMLVideoElement | null = null;
|
|
32
|
-
private hmsActions: HMSActions | null = null;
|
|
33
|
-
private timeoutRef = 0;
|
|
34
|
-
private videoElements: HTMLVideoElement[] = [];
|
|
35
|
-
private onStateChange: ((value: boolean) => void) | null = null;
|
|
36
|
-
private tracksToShow: Array<string> = [];
|
|
37
|
-
private state: PIPStates = PIPStates.stopped;
|
|
38
|
-
|
|
39
|
-
constructor() {
|
|
40
|
-
this.reset();
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
listenToStateChange(cb: (value: boolean) => void) {
|
|
44
|
-
this.listeners.add(cb);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* @private
|
|
49
|
-
*/
|
|
50
|
-
reset() {
|
|
51
|
-
console.debug('resetting PIP state');
|
|
52
|
-
resetPIPCanvasColors();
|
|
53
|
-
this.canvas = null; // where stitching will take place
|
|
54
|
-
this.pipVideo = null; // the element which will be sent in PIP
|
|
55
|
-
this.timeoutRef = 0; // setTimeout reference so it can be cancelled
|
|
56
|
-
this.hmsActions = null; // for attaching detaching
|
|
57
|
-
this.videoElements = []; // for attaching tracks
|
|
58
|
-
this.tracksToShow = [];
|
|
59
|
-
this.onStateChange = null; // for user of this class to listen to changes
|
|
60
|
-
this.state = PIPStates.stopped;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* check if PIP is supported in this browser env
|
|
65
|
-
*/
|
|
66
|
-
isSupported() {
|
|
67
|
-
return !!document.pictureInPictureEnabled && !isIOS && !(isMacOS && isSafari);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* check if pip is currently turned on
|
|
72
|
-
*/
|
|
73
|
-
isOn() {
|
|
74
|
-
return !!document.pictureInPictureElement;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* request browser to start pip and start the render loop updating the pip
|
|
79
|
-
* video element with peer tracks.
|
|
80
|
-
* @param hmsActions
|
|
81
|
-
* @param onStateChangeFn {function(bool):void} callback called to notify change in pip state
|
|
82
|
-
*/
|
|
83
|
-
async start(hmsActions: HMSActions, onStateChangeFn: (value: boolean) => void): Promise<void> {
|
|
84
|
-
if (!this.isSupported()) {
|
|
85
|
-
throw new Error('pip is not supported on this browser');
|
|
86
|
-
}
|
|
87
|
-
console.debug('starting PIP, current state', this.state);
|
|
88
|
-
if (this.state === PIPStates.started) {
|
|
89
|
-
await this.stop(); // if anything is already running
|
|
90
|
-
} else if (this.state === PIPStates.starting) {
|
|
91
|
-
return; // ignore double clicks
|
|
92
|
-
}
|
|
93
|
-
this.state = PIPStates.starting;
|
|
94
|
-
try {
|
|
95
|
-
await this.init(hmsActions, onStateChangeFn);
|
|
96
|
-
// when user closes pip, call internal stop
|
|
97
|
-
this.pipVideo?.addEventListener(LEAVE_EVENT_NAME, this.stop);
|
|
98
|
-
this.renderLoop();
|
|
99
|
-
if (!this.isOn()) {
|
|
100
|
-
await this.requestPIP();
|
|
101
|
-
}
|
|
102
|
-
console.debug('pip started');
|
|
103
|
-
this.state = PIPStates.started;
|
|
104
|
-
this.onStateChange?.(true);
|
|
105
|
-
this.callListeners(true);
|
|
106
|
-
} catch (err) {
|
|
107
|
-
console.error('error in request pip', err);
|
|
108
|
-
this.state = PIPStates.stopped;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
stop = async () => {
|
|
113
|
-
if (this.state === PIPStates.stopped) {
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
this.state = PIPStates.stopping;
|
|
117
|
-
this.pipVideo?.removeEventListener(LEAVE_EVENT_NAME, this.stop);
|
|
118
|
-
if (this.timeoutRef) {
|
|
119
|
-
workerTimers.clearTimeout(this.timeoutRef);
|
|
120
|
-
this.timeoutRef = 0;
|
|
121
|
-
}
|
|
122
|
-
if (this.isOn()) {
|
|
123
|
-
this.exitPIP();
|
|
124
|
-
}
|
|
125
|
-
// detach all to avoid bandwidth consumption
|
|
126
|
-
await this.detachOldAttachNewTracks(this.tracksToShow, []);
|
|
127
|
-
this.onStateChange?.(false); // notify parent about this
|
|
128
|
-
this.callListeners(false);
|
|
129
|
-
this.reset(); // cleanup
|
|
130
|
-
this.state = PIPStates.stopped;
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* @param peers {Array} All Remote Peers present in call.
|
|
135
|
-
* @param tracksMap {Object} map of track id to track
|
|
136
|
-
* */
|
|
137
|
-
async updatePeersAndTracks(peers: HMSPeer[], tracksMap: Record<string, HMSTrack>) {
|
|
138
|
-
if (!this.canvas) {
|
|
139
|
-
console.log('no canvas to render video to');
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
const newTracksToShowUnordered = this.pickTracksToShow(peers, tracksMap);
|
|
143
|
-
const currentTracksShowing = this.tracksToShow;
|
|
144
|
-
this.tracksToShow = this.orderNewTracksToShow(newTracksToShowUnordered, currentTracksShowing);
|
|
145
|
-
try {
|
|
146
|
-
await this.detachOldAttachNewTracks(currentTracksShowing, this.tracksToShow, tracksMap);
|
|
147
|
-
} catch (error) {
|
|
148
|
-
console.error('error in detaching/attaching tracks', error);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// ------- Private function --------------
|
|
153
|
-
/**
|
|
154
|
-
* @private {boolean} on - whether pip is on/off
|
|
155
|
-
*/
|
|
156
|
-
callListeners = (on: boolean) => {
|
|
157
|
-
this.listeners.forEach(listener => listener?.(on));
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* @private
|
|
162
|
-
*/
|
|
163
|
-
async init(hmsActions: HMSActions, onStateChangeFn: (value: boolean) => void) {
|
|
164
|
-
await this.initMediaElements();
|
|
165
|
-
this.hmsActions = hmsActions;
|
|
166
|
-
this.onStateChange = onStateChangeFn;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
async initMediaElements() {
|
|
170
|
-
if (!this.canvas) {
|
|
171
|
-
const { canvas, pipVideo } = this.initializeCanvasAndVideoElement();
|
|
172
|
-
this.canvas = canvas; // where stitching will take place
|
|
173
|
-
this.pipVideo = pipVideo; // the element which will be sent in PIP
|
|
174
|
-
this.videoElements = this.initializeVideoElements(); // for attaching tracks
|
|
175
|
-
const videoPlayPromise = this.pipVideo.play();
|
|
176
|
-
dummyChangeInCanvas(this.canvas);
|
|
177
|
-
await videoPlayPromise;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
initializeCanvasAndVideoElement() {
|
|
182
|
-
const canvas = document.createElement('canvas');
|
|
183
|
-
canvas.width = DEFAULT_CANVAS_WIDTH;
|
|
184
|
-
canvas.height = DEFAULT_CANVAS_HEIGHT;
|
|
185
|
-
const pipVideo = document.createElement('video');
|
|
186
|
-
pipVideo.width = DEFAULT_CANVAS_WIDTH;
|
|
187
|
-
pipVideo.height = DEFAULT_CANVAS_HEIGHT;
|
|
188
|
-
pipVideo.muted = true;
|
|
189
|
-
pipVideo.srcObject = canvas.captureStream();
|
|
190
|
-
return { canvas, pipVideo };
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
initializeVideoElements() {
|
|
194
|
-
const videoElements = [];
|
|
195
|
-
for (let i = 0; i < MAX_NUMBER_OF_TILES_IN_PIP; i++) {
|
|
196
|
-
const videoElement = document.createElement('video');
|
|
197
|
-
videoElement.autoplay = true;
|
|
198
|
-
videoElement.playsInline = true;
|
|
199
|
-
videoElements.push(videoElement);
|
|
200
|
-
}
|
|
201
|
-
return videoElements;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* render loop is responsible for rendering the video elements on canvas/pip.
|
|
206
|
-
* in each loop current video elements are stitched and painted on canvas
|
|
207
|
-
*/
|
|
208
|
-
renderLoop() {
|
|
209
|
-
const delay = 1000 / DEFAULT_FPS;
|
|
210
|
-
this.timeoutRef = workerTimers.setTimeout(() => {
|
|
211
|
-
if (this.state === PIPStates.stopping || this.state === PIPStates.stopped) {
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
if (this.state === PIPStates.started) {
|
|
215
|
-
drawVideoElementsOnCanvas(this.videoElements, this.canvas);
|
|
216
|
-
}
|
|
217
|
-
this.renderLoop();
|
|
218
|
-
}, delay);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
async requestPIP() {
|
|
222
|
-
try {
|
|
223
|
-
if (this.isOn()) {
|
|
224
|
-
this.exitPIP(); // is this really needed?
|
|
225
|
-
}
|
|
226
|
-
if (!this.pipVideo) {
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
await this.pipVideo.requestPictureInPicture();
|
|
230
|
-
} catch (error) {
|
|
231
|
-
console.error('error in requestpip', error, 'state', this.state);
|
|
232
|
-
throw error;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
exitPIP() {
|
|
237
|
-
document.exitPictureInPicture();
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* Logic - pick only enabled video tracks
|
|
242
|
-
* @param peers {Array<any>}
|
|
243
|
-
* @param tracksMap {Record<string, any>}
|
|
244
|
-
*/
|
|
245
|
-
pickTracksToShow(peers: HMSPeer[], tracksMap: Record<string, HMSTrack>) {
|
|
246
|
-
const tracksToShow = new Set<string>();
|
|
247
|
-
for (const peer of peers) {
|
|
248
|
-
if (tracksToShow.size === MAX_NUMBER_OF_TILES_IN_PIP) {
|
|
249
|
-
break;
|
|
250
|
-
} else if (peer.videoTrack && this.showTrack(tracksMap[peer.videoTrack] as HMSVideoTrack)) {
|
|
251
|
-
tracksToShow.add(peer.videoTrack);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
return Array.from(tracksToShow);
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* there has to be a smart reordering of new tracks based on currently showing
|
|
259
|
-
* ones to reduce unnecessary displacement. If someone was showing up both
|
|
260
|
-
* earlier and now, it's a better UX to keep their position same instead
|
|
261
|
-
* of letting it change.
|
|
262
|
-
* The returned array is a shuffled version of newTracks with position of
|
|
263
|
-
* tracks present in the old tracks intact.
|
|
264
|
-
* eg. old = [1,5,9,3], new = [3,8,2,9], result = [8,2,9,3]
|
|
265
|
-
* @param oldTracks {Array}
|
|
266
|
-
* @param newTracks {Array}
|
|
267
|
-
* @return {Array}
|
|
268
|
-
*/
|
|
269
|
-
orderNewTracksToShow(newTracks: string[], oldTracks: string[]) {
|
|
270
|
-
const betterNewTracks: Array<string> = new Array(newTracks.length);
|
|
271
|
-
const leftOvers: Array<string> = [];
|
|
272
|
-
// put the common ones in right position
|
|
273
|
-
newTracks.forEach(track => {
|
|
274
|
-
const oldPosition = oldTracks.indexOf(track);
|
|
275
|
-
if (oldPosition !== -1 && oldPosition < newTracks.length) {
|
|
276
|
-
// if track is there currently and we can put it on the same position
|
|
277
|
-
betterNewTracks[oldPosition] = track;
|
|
278
|
-
} else {
|
|
279
|
-
leftOvers.push(track);
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
// put the left overs in remaining empty positions
|
|
283
|
-
for (let i = 0; i < newTracks.length; i++) {
|
|
284
|
-
if (!betterNewTracks[i]) {
|
|
285
|
-
const newEntry = leftOvers.shift();
|
|
286
|
-
if (newEntry) {
|
|
287
|
-
betterNewTracks[i] = newEntry;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
return Array.from(new Set(betterNewTracks));
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
private showTrack(track: HMSVideoTrack | undefined) {
|
|
295
|
-
return track && track.enabled && !track.degraded;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
/**
|
|
299
|
-
* call detach for tracks which no longer need to be shown and attach for
|
|
300
|
-
* new ones which are to be shown now.
|
|
301
|
-
* Note: oldTracks and newTracks are not necessarily of same length
|
|
302
|
-
* @param oldTracks {Array<String>}
|
|
303
|
-
* @param newTracks {Array<String>}
|
|
304
|
-
* @param tracksMap {Record<String, any>}
|
|
305
|
-
*/
|
|
306
|
-
// eslint-disable-next-line complexity
|
|
307
|
-
async detachOldAttachNewTracks(
|
|
308
|
-
oldTracks: Array<string>,
|
|
309
|
-
newTracks: Array<string>,
|
|
310
|
-
tracksMap: Record<string, HMSTrack> | null = null,
|
|
311
|
-
) {
|
|
312
|
-
const numTracks = Math.max(oldTracks.length, newTracks.length);
|
|
313
|
-
for (let i = 0; i < numTracks; i++) {
|
|
314
|
-
if (oldTracks[i] === newTracks[i]) {
|
|
315
|
-
continue; // it would already have been attached previously
|
|
316
|
-
} else if (oldTracks[i]) {
|
|
317
|
-
// old track is there but not equal to new track, detach
|
|
318
|
-
// no need to call detach if we know for sure track is no longer in store
|
|
319
|
-
if (!tracksMap || tracksMap[oldTracks[i]]) {
|
|
320
|
-
await this.hmsActions?.detachVideo(oldTracks[i], this.videoElements[i]);
|
|
321
|
-
}
|
|
322
|
-
if (this.videoElements[i]) {
|
|
323
|
-
// even if old track got removed from the room, element needs to be cleaned up
|
|
324
|
-
this.videoElements[i].srcObject = null;
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
if (newTracks[i]) {
|
|
328
|
-
await this.hmsActions?.attachVideo(newTracks[i], this.videoElements[i]);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
export const PictureInPicture = new PipManager();
|
|
335
|
-
// PictureInPicture.initMediaElements().catch(console.error); // for safari, init early
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import React, { useCallback, useMemo, useState } from 'react';
|
|
2
|
-
import { PIPContext } from './context';
|
|
3
|
-
|
|
4
|
-
type PIPProviderProps = {
|
|
5
|
-
children: React.ReactNode;
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
export const PIPProvider = ({ children }: PIPProviderProps) => {
|
|
9
|
-
// Detect if the feature is available.
|
|
10
|
-
const isSupported = 'documentPictureInPicture' in window;
|
|
11
|
-
|
|
12
|
-
// Expose pipWindow that is currently active
|
|
13
|
-
const [pipWindow, setPipWindow] = useState<Window | null>(null);
|
|
14
|
-
|
|
15
|
-
// Close pipWidnow programmatically
|
|
16
|
-
const closePipWindow = useCallback(() => {
|
|
17
|
-
if (pipWindow != null) {
|
|
18
|
-
pipWindow.close();
|
|
19
|
-
setPipWindow(null);
|
|
20
|
-
}
|
|
21
|
-
}, [pipWindow]);
|
|
22
|
-
|
|
23
|
-
// Open new pipWindow
|
|
24
|
-
const requestPipWindow = useCallback(
|
|
25
|
-
async (width: number, height: number) => {
|
|
26
|
-
// We don't want to allow multiple requests.
|
|
27
|
-
if (pipWindow != null) {
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
// @ts-ignore for documentPIP
|
|
31
|
-
const pip = await window.documentPictureInPicture.requestWindow({
|
|
32
|
-
width,
|
|
33
|
-
height,
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
// Detect when window is closed by user
|
|
37
|
-
pip.addEventListener('pagehide', () => {
|
|
38
|
-
setPipWindow(null);
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
setPipWindow(pip);
|
|
42
|
-
},
|
|
43
|
-
[pipWindow],
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
const value = useMemo(() => {
|
|
47
|
-
return {
|
|
48
|
-
isSupported,
|
|
49
|
-
pipWindow,
|
|
50
|
-
requestPipWindow,
|
|
51
|
-
closePipWindow,
|
|
52
|
-
};
|
|
53
|
-
}, [closePipWindow, isSupported, pipWindow, requestPipWindow]);
|
|
54
|
-
|
|
55
|
-
return <PIPContext.Provider value={value}>{children}</PIPContext.Provider>;
|
|
56
|
-
};
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { createPortal } from 'react-dom';
|
|
3
|
-
|
|
4
|
-
type PIPWindowProps = {
|
|
5
|
-
pipWindow: Window;
|
|
6
|
-
children: React.ReactNode;
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
export const PIPWindow = ({ pipWindow, children }: PIPWindowProps) => {
|
|
10
|
-
pipWindow.document.body.style.margin = '0';
|
|
11
|
-
pipWindow.document.body.style.overflow = 'clip';
|
|
12
|
-
return createPortal(children, pipWindow.document.body);
|
|
13
|
-
};
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { selectIsLocalAudioEnabled, selectIsLocalVideoEnabled } from '@100mslive/react-sdk';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Media Session API allows for handling control actions on top of pip
|
|
5
|
-
* https://web.dev/media-session/#video-conferencing-actions
|
|
6
|
-
*/
|
|
7
|
-
class SetupMediaSession {
|
|
8
|
-
setup = (actions, store) => {
|
|
9
|
-
this.actions = actions;
|
|
10
|
-
this.store = store;
|
|
11
|
-
this.initState();
|
|
12
|
-
this.setUpHandlers();
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
initState = () => {
|
|
16
|
-
const isMicActive = this.store.getState(selectIsLocalAudioEnabled);
|
|
17
|
-
const isCamActive = this.store.getState(selectIsLocalVideoEnabled);
|
|
18
|
-
navigator.mediaSession?.setMicrophoneActive?.(isMicActive);
|
|
19
|
-
navigator.mediaSession?.setCameraActive?.(isCamActive);
|
|
20
|
-
|
|
21
|
-
this.store.subscribe(isMicActive => {
|
|
22
|
-
navigator.mediaSession?.setMicrophoneActive?.(isMicActive);
|
|
23
|
-
}, selectIsLocalAudioEnabled);
|
|
24
|
-
|
|
25
|
-
this.store.subscribe(isCamActive => {
|
|
26
|
-
navigator.mediaSession?.setCameraActive?.(isCamActive);
|
|
27
|
-
}, selectIsLocalVideoEnabled);
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
toggleMic = async () => {
|
|
31
|
-
console.log('toggle mic clicked in pip');
|
|
32
|
-
const current = this.store.getState(selectIsLocalAudioEnabled);
|
|
33
|
-
await this.actions.setLocalAudioEnabled(!current);
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
toggleCam = async () => {
|
|
37
|
-
console.log('toggle cam clicked in pip');
|
|
38
|
-
const current = this.store.getState(selectIsLocalVideoEnabled);
|
|
39
|
-
await this.actions.setLocalVideoEnabled(!current);
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
leave = () => {
|
|
43
|
-
console.log('leave called from pip');
|
|
44
|
-
this.actions.leave();
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
setUpHandlers = () => {
|
|
48
|
-
if (navigator.mediaSession) {
|
|
49
|
-
try {
|
|
50
|
-
navigator.mediaSession.setActionHandler('togglemicrophone', this.toggleMic);
|
|
51
|
-
navigator.mediaSession.setActionHandler('togglecamera', this.toggleCam);
|
|
52
|
-
navigator.mediaSession.setActionHandler('hangup', this.leave);
|
|
53
|
-
} catch (err) {
|
|
54
|
-
console.error('error in setting media session handlers', err);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export const MediaSession = new SetupMediaSession();
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { createContext } from 'react';
|
|
2
|
-
|
|
3
|
-
export type PIPContextType = {
|
|
4
|
-
isSupported: boolean;
|
|
5
|
-
pipWindow: Window | null;
|
|
6
|
-
requestPipWindow: (width: number, height: number) => Promise<void>;
|
|
7
|
-
closePipWindow: () => void;
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
export const PIPContext = createContext<PIPContextType | undefined>(undefined);
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { PictureInPicture } from './PIPManager';
|
|
2
|
-
|
|
3
|
-
describe('pip manager tests', () => {
|
|
4
|
-
/**
|
|
5
|
-
* Ensure that if a track is showing in both before and after, it's at the
|
|
6
|
-
* same position.
|
|
7
|
-
*/
|
|
8
|
-
test('merging old and new tracks to show avoids shuffling', () => {
|
|
9
|
-
const makeTestData = (oldArr, newArr, result) => {
|
|
10
|
-
return { oldArr, newArr, result };
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
const examples = [
|
|
14
|
-
makeTestData([1, 5, 9, 3], [3, 8, 2, 9], [8, 2, 9, 3]),
|
|
15
|
-
makeTestData([1, 3, 5], [5, 3, 1], [1, 3, 5]),
|
|
16
|
-
makeTestData([2, 7, 9, 4], [9, 2, 4, 6], [2, 6, 9, 4]),
|
|
17
|
-
makeTestData([1, 2, 3], [4, 5, 6], [4, 5, 6]),
|
|
18
|
-
makeTestData([1, 2], [4, 5, 2, 1], [1, 2, 4, 5]),
|
|
19
|
-
makeTestData([4, 1, 2, 3], [1, 3], [3, 1]),
|
|
20
|
-
makeTestData([4, 5, 1, 3], [1, 3], [1, 3]),
|
|
21
|
-
makeTestData([], [1, 3], [1, 3]),
|
|
22
|
-
makeTestData([1, 3], [], []),
|
|
23
|
-
makeTestData([1], [4, 2, 1, 3], [1, 4, 2, 3]),
|
|
24
|
-
makeTestData([4, 2, 1, 3], [1], [1]),
|
|
25
|
-
makeTestData([], [], []),
|
|
26
|
-
];
|
|
27
|
-
|
|
28
|
-
examples.forEach(example => {
|
|
29
|
-
expect(PictureInPicture.orderNewTracksToShow(example.newArr, example.oldArr)).toEqual(example.result);
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* It's very important that detach is properly called for old tracks to guarantee
|
|
35
|
-
* no unnecessary bandwidth consumption.
|
|
36
|
-
* For simplicity's sake currently, detach/attach is done if position of
|
|
37
|
-
* the track changes as well. That is earlier it was showing on third position
|
|
38
|
-
* but not it's on second position(because there are only two tracks left to show).
|
|
39
|
-
*/
|
|
40
|
-
test('attach and detach are called properly after tracks in view changes', async () => {
|
|
41
|
-
const makeTestData = (oldTracks, newTracks, detachFor, attachFor) => {
|
|
42
|
-
return { oldTracks, newTracks, detachFor, attachFor };
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
let attachCalledFor = [];
|
|
46
|
-
let detachCalledFor = [];
|
|
47
|
-
PictureInPicture.hmsActions = {
|
|
48
|
-
attachVideo: jest.fn(track => attachCalledFor.push(track)),
|
|
49
|
-
detachVideo: jest.fn(track => detachCalledFor.push(track)),
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
const examples = [
|
|
53
|
-
makeTestData([1, 2], [3, 4], [1, 2], [3, 4]),
|
|
54
|
-
makeTestData([1, 2], [1, 2], [], []),
|
|
55
|
-
makeTestData([1, 5, 9, 3], [8, 2, 9, 3], [1, 5], [8, 2]),
|
|
56
|
-
makeTestData([1, 5, 9], [6, 5, 9], [1], [6]),
|
|
57
|
-
makeTestData([], [1, 3], [], [1, 3]),
|
|
58
|
-
makeTestData([1, 3], [], [1, 3], []),
|
|
59
|
-
makeTestData([1], [4, 2, 1, 3], [1], [4, 2, 1, 3]),
|
|
60
|
-
makeTestData([4, 2, 1, 3], [1], [4, 2, 1, 3], [1]),
|
|
61
|
-
makeTestData([], [], [], []),
|
|
62
|
-
];
|
|
63
|
-
|
|
64
|
-
for (let example of examples) {
|
|
65
|
-
attachCalledFor = [];
|
|
66
|
-
detachCalledFor = [];
|
|
67
|
-
await PictureInPicture.detachOldAttachNewTracks(example.oldTracks, example.newTracks);
|
|
68
|
-
expect(attachCalledFor).toEqual(example.attachFor);
|
|
69
|
-
expect(detachCalledFor).toEqual(example.detachFor);
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
});
|