@stream-io/video-react-sdk 1.41.0 → 2.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -6
- package/dist/{embedded-BackgroundFilters-folwWrgs.cjs.js → background-filters-DMStbSEg.cjs.js} +97 -71
- package/dist/background-filters-DMStbSEg.cjs.js.map +1 -0
- package/dist/{background-filters-folwWrgs.cjs.js → embedded-BackgroundFilters-DMStbSEg.cjs.js} +97 -71
- package/dist/embedded-BackgroundFilters-DMStbSEg.cjs.js.map +1 -0
- package/dist/embedded.cjs.js +2 -2
- package/dist/embedded.cjs.js.map +1 -1
- package/dist/esm/embedded.js +3 -0
- package/dist/esm/embedded.js.map +1 -0
- package/dist/esm/index.js +92 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/src/components/Avatar/Avatar.js +14 -0
- package/dist/esm/src/components/Avatar/Avatar.js.map +1 -0
- package/dist/{background-filters-D2U5UBbH.es.js → esm/src/components/BackgroundFilters/BackgroundFilters.js} +97 -71
- package/dist/esm/src/components/BackgroundFilters/BackgroundFilters.js.map +1 -0
- package/dist/esm/src/components/BackgroundFilters/BackgroundFiltersProvider.js +33 -0
- package/dist/esm/src/components/BackgroundFilters/BackgroundFiltersProvider.js.map +1 -0
- package/dist/esm/src/components/Button/CompositeButton.js +29 -0
- package/dist/esm/src/components/Button/CompositeButton.js.map +1 -0
- package/dist/esm/src/components/Button/IconButton.js +18 -0
- package/dist/esm/src/components/Button/IconButton.js.map +1 -0
- package/dist/esm/src/components/Button/TextButton.js +8 -0
- package/dist/esm/src/components/Button/TextButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/AcceptCallButton.js +28 -0
- package/dist/esm/src/components/CallControls/AcceptCallButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/CallControls.js +21 -0
- package/dist/esm/src/components/CallControls/CallControls.js.map +1 -0
- package/dist/esm/src/components/CallControls/CallStatsButton.js +18 -0
- package/dist/esm/src/components/CallControls/CallStatsButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/CancelCallButton.js +78 -0
- package/dist/esm/src/components/CallControls/CancelCallButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/ReactionsButton.js +61 -0
- package/dist/esm/src/components/CallControls/ReactionsButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/RecordCallButton.js +64 -0
- package/dist/esm/src/components/CallControls/RecordCallButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/ScreenShareButton.js +44 -0
- package/dist/esm/src/components/CallControls/ScreenShareButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/ToggleAudioButton.js +72 -0
- package/dist/esm/src/components/CallControls/ToggleAudioButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js +27 -0
- package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/ToggleVideoButton.js +81 -0
- package/dist/esm/src/components/CallControls/ToggleVideoButton.js.map +1 -0
- package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js +23 -0
- package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js.map +1 -0
- package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js +15 -0
- package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js.map +1 -0
- package/dist/esm/src/components/CallParticipantsList/CallParticipantListing.js +7 -0
- package/dist/esm/src/components/CallParticipantsList/CallParticipantListing.js.map +1 -0
- package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js +46 -0
- package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js.map +1 -0
- package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js +81 -0
- package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js.map +1 -0
- package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js +10 -0
- package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js.map +1 -0
- package/dist/esm/src/components/CallPreview/CallPreview.js +24 -0
- package/dist/esm/src/components/CallPreview/CallPreview.js.map +1 -0
- package/dist/esm/src/components/CallRecordingList/CallRecordingList.js +12 -0
- package/dist/esm/src/components/CallRecordingList/CallRecordingList.js.map +1 -0
- package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js +12 -0
- package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js.map +1 -0
- package/dist/esm/src/components/CallRecordingList/CallRecordingListItem.js +14 -0
- package/dist/esm/src/components/CallRecordingList/CallRecordingListItem.js.map +1 -0
- package/dist/esm/src/components/CallRecordingList/EmptyCallRecordingListing.js +8 -0
- package/dist/esm/src/components/CallRecordingList/EmptyCallRecordingListing.js.map +1 -0
- package/dist/esm/src/components/CallRecordingList/LoadingCallRecordingListing.js +10 -0
- package/dist/esm/src/components/CallRecordingList/LoadingCallRecordingListing.js.map +1 -0
- package/dist/esm/src/components/CallStats/CallStats.js +180 -0
- package/dist/esm/src/components/CallStats/CallStats.js.map +1 -0
- package/dist/{latency-chart-Bj5OSYzg.es.js → esm/src/components/CallStats/CallStatsLatencyChart.js} +1 -1
- package/dist/esm/src/components/CallStats/CallStatsLatencyChart.js.map +1 -0
- package/dist/esm/src/components/DeviceSettings/AudioVolumeIndicator.js +27 -0
- package/dist/esm/src/components/DeviceSettings/AudioVolumeIndicator.js.map +1 -0
- package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js +42 -0
- package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js.map +1 -0
- package/dist/esm/src/components/DeviceSettings/DeviceSelector.js +67 -0
- package/dist/esm/src/components/DeviceSettings/DeviceSelector.js.map +1 -0
- package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js +26 -0
- package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js.map +1 -0
- package/dist/esm/src/components/DeviceSettings/DeviceSelectorVideo.js +15 -0
- package/dist/esm/src/components/DeviceSettings/DeviceSelectorVideo.js.map +1 -0
- package/dist/esm/src/components/DeviceSettings/DeviceSettings.js +26 -0
- package/dist/esm/src/components/DeviceSettings/DeviceSettings.js.map +1 -0
- package/dist/esm/src/components/DeviceSettings/DeviceVideoPreviewItem.js +42 -0
- package/dist/esm/src/components/DeviceSettings/DeviceVideoPreviewItem.js.map +1 -0
- package/dist/esm/src/components/DeviceSettings/SpeakerTest.js +57 -0
- package/dist/esm/src/components/DeviceSettings/SpeakerTest.js.map +1 -0
- package/dist/esm/src/components/DropdownSelect/DropdownSelect.js +79 -0
- package/dist/esm/src/components/DropdownSelect/DropdownSelect.js.map +1 -0
- package/dist/esm/src/components/Icon/Icon.js +7 -0
- package/dist/esm/src/components/Icon/Icon.js.map +1 -0
- package/dist/esm/src/components/LoadingIndicator/LoadingIndicator.js +9 -0
- package/dist/esm/src/components/LoadingIndicator/LoadingIndicator.js.map +1 -0
- package/dist/esm/src/components/Menu/GenericMenu.js +19 -0
- package/dist/esm/src/components/Menu/GenericMenu.js.map +1 -0
- package/dist/esm/src/components/Menu/MenuToggle.js +75 -0
- package/dist/esm/src/components/Menu/MenuToggle.js.map +1 -0
- package/dist/esm/src/components/NoiseCancellation/NoiseCancellationProvider.js +96 -0
- package/dist/esm/src/components/NoiseCancellation/NoiseCancellationProvider.js.map +1 -0
- package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js +23 -0
- package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js.map +1 -0
- package/dist/esm/src/components/Notification/Notification.js +31 -0
- package/dist/esm/src/components/Notification/Notification.js.map +1 -0
- package/dist/esm/src/components/Notification/PermissionNotification.js +32 -0
- package/dist/esm/src/components/Notification/PermissionNotification.js.map +1 -0
- package/dist/esm/src/components/Notification/RecordingInProgressNotification.js +23 -0
- package/dist/esm/src/components/Notification/RecordingInProgressNotification.js.map +1 -0
- package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js +14 -0
- package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js.map +1 -0
- package/dist/esm/src/components/Permissions/PermissionRequests.js +99 -0
- package/dist/esm/src/components/Permissions/PermissionRequests.js.map +1 -0
- package/dist/esm/src/components/Reaction/Reaction.js +32 -0
- package/dist/esm/src/components/Reaction/Reaction.js.map +1 -0
- package/dist/esm/src/components/RingingCall/RingingCall.js +48 -0
- package/dist/esm/src/components/RingingCall/RingingCall.js.map +1 -0
- package/dist/esm/src/components/RingingCall/RingingCallControls.js +34 -0
- package/dist/esm/src/components/RingingCall/RingingCallControls.js.map +1 -0
- package/dist/esm/src/components/Search/SearchInput.js +27 -0
- package/dist/esm/src/components/Search/SearchInput.js.map +1 -0
- package/dist/esm/src/components/Search/SearchResults.js +15 -0
- package/dist/esm/src/components/Search/SearchResults.js.map +1 -0
- package/dist/esm/src/components/Search/hooks/useSearch.js +38 -0
- package/dist/esm/src/components/Search/hooks/useSearch.js.map +1 -0
- package/dist/esm/src/components/StreamTheme/StreamTheme.js +9 -0
- package/dist/esm/src/components/StreamTheme/StreamTheme.js.map +1 -0
- package/dist/esm/src/components/Tooltip/Tooltip.js +29 -0
- package/dist/esm/src/components/Tooltip/Tooltip.js.map +1 -0
- package/dist/esm/src/components/Tooltip/WithTooltip.js +15 -0
- package/dist/esm/src/components/Tooltip/WithTooltip.js.map +1 -0
- package/dist/esm/src/components/Tooltip/hooks/useEnterLeaveHandlers.js +17 -0
- package/dist/esm/src/components/Tooltip/hooks/useEnterLeaveHandlers.js.map +1 -0
- package/dist/esm/src/components/VideoPreview/VideoPreview.js +37 -0
- package/dist/esm/src/components/VideoPreview/VideoPreview.js.map +1 -0
- package/dist/esm/src/core/components/Audio/Audio.js +22 -0
- package/dist/esm/src/core/components/Audio/Audio.js.map +1 -0
- package/dist/esm/src/core/components/Audio/ParticipantsAudio.js +23 -0
- package/dist/esm/src/core/components/Audio/ParticipantsAudio.js.map +1 -0
- package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js +150 -0
- package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js.map +1 -0
- package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js +79 -0
- package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js.map +1 -0
- package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js +80 -0
- package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js.map +1 -0
- package/dist/esm/src/core/components/CallLayout/PipLayout/Host.js +13 -0
- package/dist/esm/src/core/components/CallLayout/PipLayout/Host.js.map +1 -0
- package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js +57 -0
- package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js.map +1 -0
- package/dist/esm/src/core/components/CallLayout/PipLayout/index.js +8 -0
- package/dist/esm/src/core/components/CallLayout/PipLayout/index.js.map +1 -0
- package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js +103 -0
- package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js.map +1 -0
- package/dist/esm/src/core/components/CallLayout/hooks.js +62 -0
- package/dist/esm/src/core/components/CallLayout/hooks.js.map +1 -0
- package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js +94 -0
- package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js.map +1 -0
- package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js +97 -0
- package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js.map +1 -0
- package/dist/esm/src/core/components/ParticipantView/ParticipantView.js +65 -0
- package/dist/esm/src/core/components/ParticipantView/ParticipantView.js.map +1 -0
- package/dist/esm/src/core/components/ParticipantView/ParticipantViewContext.js +7 -0
- package/dist/esm/src/core/components/ParticipantView/ParticipantViewContext.js.map +1 -0
- package/dist/esm/src/core/components/StreamCall/StreamCall.js +8 -0
- package/dist/esm/src/core/components/StreamCall/StreamCall.js.map +1 -0
- package/dist/esm/src/core/components/StreamVideo/StreamVideo.js +11 -0
- package/dist/esm/src/core/components/StreamVideo/StreamVideo.js.map +1 -0
- package/dist/esm/src/core/components/Video/BaseVideo.js +41 -0
- package/dist/esm/src/core/components/Video/BaseVideo.js.map +1 -0
- package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js +21 -0
- package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js.map +1 -0
- package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js +12 -0
- package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js.map +1 -0
- package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js +12 -0
- package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js.map +1 -0
- package/dist/esm/src/core/components/Video/Video.js +88 -0
- package/dist/esm/src/core/components/Video/Video.js.map +1 -0
- package/dist/esm/src/core/hooks/useCalculateHardLimit.js +59 -0
- package/dist/esm/src/core/hooks/useCalculateHardLimit.js.map +1 -0
- package/dist/esm/src/core/hooks/usePictureInPictureState.js +24 -0
- package/dist/esm/src/core/hooks/usePictureInPictureState.js.map +1 -0
- package/dist/esm/src/core/hooks/useTrackElementVisibility.js +14 -0
- package/dist/esm/src/core/hooks/useTrackElementVisibility.js.map +1 -0
- package/dist/esm/src/embedded/EmbeddedClientProvider.js +83 -0
- package/dist/esm/src/embedded/EmbeddedClientProvider.js.map +1 -0
- package/dist/esm/src/embedded/call/CallControls.js +65 -0
- package/dist/esm/src/embedded/call/CallControls.js.map +1 -0
- package/dist/esm/src/embedded/call/CallHeader.js +57 -0
- package/dist/esm/src/embedded/call/CallHeader.js.map +1 -0
- package/dist/esm/src/embedded/call/CallLayout.js +63 -0
- package/dist/esm/src/embedded/call/CallLayout.js.map +1 -0
- package/dist/esm/src/embedded/call/CallStateRouter.js +87 -0
- package/dist/esm/src/embedded/call/CallStateRouter.js.map +1 -0
- package/dist/esm/src/embedded/call/EmbeddedCall.js +12 -0
- package/dist/esm/src/embedded/call/EmbeddedCall.js.map +1 -0
- package/dist/esm/src/embedded/context/ConfigurationContext.js +21 -0
- package/dist/esm/src/embedded/context/ConfigurationContext.js.map +1 -0
- package/dist/esm/src/embedded/hooks/useCallDuration.js +32 -0
- package/dist/esm/src/embedded/hooks/useCallDuration.js.map +1 -0
- package/dist/esm/src/embedded/hooks/useEmbeddedClient.js +40 -0
- package/dist/esm/src/embedded/hooks/useEmbeddedClient.js.map +1 -0
- package/dist/esm/src/embedded/hooks/useInitializeCall.js +39 -0
- package/dist/esm/src/embedded/hooks/useInitializeCall.js.map +1 -0
- package/dist/esm/src/embedded/hooks/useInitializeVideoClient.js +93 -0
- package/dist/esm/src/embedded/hooks/useInitializeVideoClient.js.map +1 -0
- package/dist/esm/src/embedded/hooks/useIsLivestreamPaused.js +42 -0
- package/dist/esm/src/embedded/hooks/useIsLivestreamPaused.js.map +1 -0
- package/dist/esm/src/embedded/hooks/useLayout.js +122 -0
- package/dist/esm/src/embedded/hooks/useLayout.js.map +1 -0
- package/dist/esm/src/embedded/hooks/useNoiseCancellationLoader.js +48 -0
- package/dist/esm/src/embedded/hooks/useNoiseCancellationLoader.js.map +1 -0
- package/dist/esm/src/embedded/hooks/useWakeLock.js +34 -0
- package/dist/esm/src/embedded/hooks/useWakeLock.js.map +1 -0
- package/dist/esm/src/embedded/livestream/EmbeddedLivestream.js +11 -0
- package/dist/esm/src/embedded/livestream/EmbeddedLivestream.js.map +1 -0
- package/dist/esm/src/embedded/livestream/LivestreamUI.js +17 -0
- package/dist/esm/src/embedded/livestream/LivestreamUI.js.map +1 -0
- package/dist/esm/src/embedded/livestream/host/HostLayout.js +76 -0
- package/dist/esm/src/embedded/livestream/host/HostLayout.js.map +1 -0
- package/dist/esm/src/embedded/livestream/host/HostStateRouter.js +110 -0
- package/dist/esm/src/embedded/livestream/host/HostStateRouter.js.map +1 -0
- package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js +74 -0
- package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js.map +1 -0
- package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js +109 -0
- package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js.map +1 -0
- package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js +105 -0
- package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js.map +1 -0
- package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js +65 -0
- package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js.map +1 -0
- package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js +34 -0
- package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js.map +1 -0
- package/dist/esm/src/embedded/shared/CallFeedback/CallFeedback.js +35 -0
- package/dist/esm/src/embedded/shared/CallFeedback/CallFeedback.js.map +1 -0
- package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js +18 -0
- package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js.map +1 -0
- package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js +37 -0
- package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js.map +1 -0
- package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js +34 -0
- package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js.map +1 -0
- package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js +56 -0
- package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js.map +1 -0
- package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js +42 -0
- package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js.map +1 -0
- package/dist/esm/src/embedded/shared/JoinError/JoinError.js +34 -0
- package/dist/esm/src/embedded/shared/JoinError/JoinError.js.map +1 -0
- package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js +44 -0
- package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js.map +1 -0
- package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js +31 -0
- package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js.map +1 -0
- package/dist/esm/src/embedded/shared/Lobby/Lobby.js +45 -0
- package/dist/esm/src/embedded/shared/Lobby/Lobby.js.map +1 -0
- package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js +40 -0
- package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js.map +1 -0
- package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js +41 -0
- package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js.map +1 -0
- package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js +50 -0
- package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js.map +1 -0
- package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js +31 -0
- package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js.map +1 -0
- package/dist/esm/src/hooks/useDeviceList.js +40 -0
- package/dist/esm/src/hooks/useDeviceList.js.map +1 -0
- package/dist/esm/src/hooks/useDragToScroll.js +116 -0
- package/dist/esm/src/hooks/useDragToScroll.js.map +1 -0
- package/dist/esm/src/hooks/useFloatingUIPreset.js +34 -0
- package/dist/esm/src/hooks/useFloatingUIPreset.js.map +1 -0
- package/dist/esm/src/hooks/useLoopbackRecording.js +138 -0
- package/dist/esm/src/hooks/useLoopbackRecording.js.map +1 -0
- package/dist/esm/src/hooks/useModeration.js +135 -0
- package/dist/esm/src/hooks/useModeration.js.map +1 -0
- package/dist/esm/src/hooks/usePersistedDevicePreferences.js +16 -0
- package/dist/esm/src/hooks/usePersistedDevicePreferences.js.map +1 -0
- package/dist/esm/src/hooks/useRequestPermission.js +41 -0
- package/dist/esm/src/hooks/useRequestPermission.js.map +1 -0
- package/dist/esm/src/hooks/useScrollPosition.js +66 -0
- package/dist/esm/src/hooks/useScrollPosition.js.map +1 -0
- package/dist/esm/src/translations/en.json.js +177 -0
- package/dist/esm/src/translations/en.json.js.map +1 -0
- package/dist/esm/src/translations/index.js +6 -0
- package/dist/esm/src/translations/index.js.map +1 -0
- package/dist/esm/src/utilities/applyElementToRef.js +10 -0
- package/dist/esm/src/utilities/applyElementToRef.js.map +1 -0
- package/dist/esm/src/utilities/callControlHandler.js +29 -0
- package/dist/esm/src/utilities/callControlHandler.js.map +1 -0
- package/dist/esm/src/utilities/chunk.js +7 -0
- package/dist/esm/src/utilities/chunk.js.map +1 -0
- package/dist/esm/src/utilities/filter.js +94 -0
- package/dist/esm/src/utilities/filter.js.map +1 -0
- package/dist/esm/src/utilities/isComponentType.js +10 -0
- package/dist/esm/src/utilities/isComponentType.js.map +1 -0
- package/dist/esm/src/utilities/normalizeString.js +11 -0
- package/dist/esm/src/utilities/normalizeString.js.map +1 -0
- package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js +105 -0
- package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js.map +1 -0
- package/dist/index.cjs.js +136 -3
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/src/hooks/index.d.ts +1 -0
- package/dist/src/hooks/useLoopbackRecording.d.ts +23 -0
- package/index.ts +4 -0
- package/package.json +15 -11
- package/src/components/BackgroundFilters/BackgroundFilters.tsx +139 -103
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useLoopbackRecording.ts +207 -0
- package/dist/background-filters-D2U5UBbH.es.js.map +0 -1
- package/dist/background-filters-folwWrgs.cjs.js.map +0 -1
- package/dist/embedded-BackgroundFilters-D2U5UBbH.es.js +0 -420
- package/dist/embedded-BackgroundFilters-D2U5UBbH.es.js.map +0 -1
- package/dist/embedded-BackgroundFilters-folwWrgs.cjs.js.map +0 -1
- package/dist/embedded-CallStatsLatencyChart-Bj5OSYzg.es.js +0 -57
- package/dist/embedded-CallStatsLatencyChart-Bj5OSYzg.es.js.map +0 -1
- package/dist/embedded.es.js +0 -3536
- package/dist/embedded.es.js.map +0 -1
- package/dist/index.es.js +0 -3291
- package/dist/index.es.js.map +0 -1
- package/dist/latency-chart-Bj5OSYzg.es.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamCall.js","sources":["../../../../../../../../src/core/components/StreamCall/StreamCall.tsx"],"sourcesContent":["import { ComponentType, PropsWithChildren } from 'react';\nimport {\n StreamCallProvider,\n StreamCallProviderProps,\n} from '@stream-io/video-react-bindings';\n\n// re-exporting the StreamCallProvider as StreamCall\nexport const StreamCall: ComponentType<\n PropsWithChildren<StreamCallProviderProps>\n> = StreamCallProvider;\n\nStreamCall.displayName = 'StreamCall';\n"],"names":[],"mappings":";;AAMA;AACO,MAAM,UAAU,GAEnB;AAEJ,UAAU,CAAC,WAAW,GAAG,YAAY;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { StreamVideoProvider } from '@stream-io/video-react-bindings';
|
|
3
|
+
import { translations } from '../../../translations/index.js';
|
|
4
|
+
|
|
5
|
+
const StreamVideo = (props) => {
|
|
6
|
+
return (jsx(StreamVideoProvider, { translationsOverrides: translations, ...props }));
|
|
7
|
+
};
|
|
8
|
+
StreamVideo.displayName = 'StreamVideo';
|
|
9
|
+
|
|
10
|
+
export { StreamVideo };
|
|
11
|
+
//# sourceMappingURL=StreamVideo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamVideo.js","sources":["../../../../../../../../src/core/components/StreamVideo/StreamVideo.tsx"],"sourcesContent":["import {\n StreamVideoProps,\n StreamVideoProvider,\n} from '@stream-io/video-react-bindings';\nimport { PropsWithChildren } from 'react';\nimport { translations } from '../../../translations';\n\nexport const StreamVideo = (props: PropsWithChildren<StreamVideoProps>) => {\n return (\n <StreamVideoProvider translationsOverrides={translations} {...props} />\n );\n};\n\nStreamVideo.displayName = 'StreamVideo';\n"],"names":["_jsx"],"mappings":";;;;AAOO,MAAM,WAAW,GAAG,CAAC,KAA0C,KAAI;IACxE,QACEA,GAAA,CAAC,mBAAmB,EAAA,EAAC,qBAAqB,EAAE,YAAY,EAAA,GAAM,KAAK,EAAA,CAAI;AAE3E;AAEA,WAAW,CAAC,WAAW,GAAG,aAAa;;;;"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { forwardRef, useState, useEffect } from 'react';
|
|
3
|
+
import { Browsers } from '@stream-io/video-client';
|
|
4
|
+
import { applyElementToRef } from '../../../utilities/applyElementToRef.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @description Extends video element with `stream` property
|
|
8
|
+
* (`srcObject`) to reactively handle stream changes
|
|
9
|
+
*/
|
|
10
|
+
const BaseVideo = forwardRef(function BaseVideoRender({ stream, ...rest }, ref) {
|
|
11
|
+
const [videoElement, setVideoElement] = useState(null);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (!videoElement || !stream)
|
|
14
|
+
return;
|
|
15
|
+
if (stream === videoElement.srcObject)
|
|
16
|
+
return;
|
|
17
|
+
videoElement.srcObject = stream;
|
|
18
|
+
let timeoutId;
|
|
19
|
+
if (Browsers.isSafari() || Browsers.isFirefox()) {
|
|
20
|
+
// Firefox and Safari have some timing issue
|
|
21
|
+
timeoutId = setTimeout(() => {
|
|
22
|
+
videoElement.srcObject = stream;
|
|
23
|
+
videoElement.play().catch((e) => {
|
|
24
|
+
console.error(`Failed to play stream`, e);
|
|
25
|
+
});
|
|
26
|
+
}, 0);
|
|
27
|
+
}
|
|
28
|
+
return () => {
|
|
29
|
+
clearTimeout(timeoutId);
|
|
30
|
+
videoElement.pause();
|
|
31
|
+
videoElement.srcObject = null;
|
|
32
|
+
};
|
|
33
|
+
}, [stream, videoElement]);
|
|
34
|
+
return (jsx("video", { autoPlay: true, playsInline: true, ...rest, ref: (element) => {
|
|
35
|
+
applyElementToRef(ref, element);
|
|
36
|
+
setVideoElement(element);
|
|
37
|
+
} }));
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
export { BaseVideo };
|
|
41
|
+
//# sourceMappingURL=BaseVideo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseVideo.js","sources":["../../../../../../../../src/core/components/Video/BaseVideo.tsx"],"sourcesContent":["import { ComponentPropsWithRef, forwardRef, useEffect, useState } from 'react';\nimport { Browsers } from '@stream-io/video-client';\n\nimport { applyElementToRef } from '../../../utilities';\n\nexport type BaseVideoProps = ComponentPropsWithRef<'video'> & {\n stream?: MediaStream;\n};\n\n/**\n * @description Extends video element with `stream` property\n * (`srcObject`) to reactively handle stream changes\n */\nexport const BaseVideo = forwardRef<HTMLVideoElement, BaseVideoProps>(\n function BaseVideoRender({ stream, ...rest }, ref) {\n const [videoElement, setVideoElement] = useState<HTMLVideoElement | null>(\n null,\n );\n\n useEffect(() => {\n if (!videoElement || !stream) return;\n if (stream === videoElement.srcObject) return;\n\n videoElement.srcObject = stream;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (Browsers.isSafari() || Browsers.isFirefox()) {\n // Firefox and Safari have some timing issue\n timeoutId = setTimeout(() => {\n videoElement.srcObject = stream;\n videoElement.play().catch((e) => {\n console.error(`Failed to play stream`, e);\n });\n }, 0);\n }\n\n return () => {\n clearTimeout(timeoutId);\n videoElement.pause();\n videoElement.srcObject = null;\n };\n }, [stream, videoElement]);\n\n return (\n <video\n autoPlay\n playsInline\n {...rest}\n ref={(element) => {\n applyElementToRef(ref, element);\n setVideoElement(element);\n }}\n />\n );\n },\n);\n"],"names":["_jsx"],"mappings":";;;;;AASA;;;AAGG;AACI,MAAM,SAAS,GAAG,UAAU,CACjC,SAAS,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,EAAA;IAC/C,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAC9C,IAAI,CACL;IAED,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM;YAAE;AAC9B,QAAA,IAAI,MAAM,KAAK,YAAY,CAAC,SAAS;YAAE;AAEvC,QAAA,YAAY,CAAC,SAAS,GAAG,MAAM;AAC/B,QAAA,IAAI,SAAoD;QACxD,IAAI,QAAQ,CAAC,QAAQ,EAAE,IAAI,QAAQ,CAAC,SAAS,EAAE,EAAE;;AAE/C,YAAA,SAAS,GAAG,UAAU,CAAC,MAAK;AAC1B,gBAAA,YAAY,CAAC,SAAS,GAAG,MAAM;gBAC/B,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAI;AAC9B,oBAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC,CAAC;AAC3C,gBAAA,CAAC,CAAC;YACJ,CAAC,EAAE,CAAC,CAAC;QACP;AAEA,QAAA,OAAO,MAAK;YACV,YAAY,CAAC,SAAS,CAAC;YACvB,YAAY,CAAC,KAAK,EAAE;AACpB,YAAA,YAAY,CAAC,SAAS,GAAG,IAAI;AAC/B,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAE1B,IAAA,QACEA,GAAA,CAAA,OAAA,EAAA,EACE,QAAQ,EAAA,IAAA,EACR,WAAW,EAAA,IAAA,EAAA,GACP,IAAI,EACR,GAAG,EAAE,CAAC,OAAO,KAAI;AACf,YAAA,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC;YAC/B,eAAe,CAAC,OAAO,CAAC;QAC1B,CAAC,EAAA,CACD;AAEN,CAAC;;;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { forwardRef, useState } from 'react';
|
|
3
|
+
|
|
4
|
+
const BaseVideoPlaceholder = forwardRef(function DefaultVideoPlaceholder({ participant, style, children }, ref) {
|
|
5
|
+
const [error, setError] = useState(false);
|
|
6
|
+
const name = participant.name || participant.userId;
|
|
7
|
+
return (jsxs("div", { className: "str-video__video-placeholder", style: style, ref: ref, children: [(!participant.image || error) &&
|
|
8
|
+
(name ? (jsx(InitialsFallback, { name: name })) : (jsx("div", { className: "str-video__video-placeholder__no-video-label", children: children }))), participant.image && !error && (jsx("img", { onError: () => setError(true), alt: name, className: "str-video__video-placeholder__avatar", src: participant.image }))] }));
|
|
9
|
+
});
|
|
10
|
+
const InitialsFallback = (props) => {
|
|
11
|
+
const { name } = props;
|
|
12
|
+
const initials = name
|
|
13
|
+
.split(' ')
|
|
14
|
+
.slice(0, 2)
|
|
15
|
+
.map((n) => n[0])
|
|
16
|
+
.join('');
|
|
17
|
+
return (jsx("div", { className: "str-video__video-placeholder__initials-fallback", children: initials }));
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export { BaseVideoPlaceholder };
|
|
21
|
+
//# sourceMappingURL=BaseVideoPlaceholder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseVideoPlaceholder.js","sources":["../../../../../../../../src/core/components/Video/BaseVideoPlaceholder.tsx"],"sourcesContent":["import { ComponentProps, RefAttributes, forwardRef, useState } from 'react';\nimport type { StreamVideoParticipant } from '@stream-io/video-client';\n\nexport type BaseVideoPlaceholderProps = {\n participant: StreamVideoParticipant;\n} & RefAttributes<HTMLDivElement> &\n ComponentProps<'div'>;\n\nexport const BaseVideoPlaceholder = forwardRef<\n HTMLDivElement,\n BaseVideoPlaceholderProps\n>(function DefaultVideoPlaceholder({ participant, style, children }, ref) {\n const [error, setError] = useState(false);\n const name = participant.name || participant.userId;\n return (\n <div className=\"str-video__video-placeholder\" style={style} ref={ref}>\n {(!participant.image || error) &&\n (name ? (\n <InitialsFallback name={name} />\n ) : (\n <div className=\"str-video__video-placeholder__no-video-label\">\n {children}\n </div>\n ))}\n {participant.image && !error && (\n <img\n onError={() => setError(true)}\n alt={name}\n className=\"str-video__video-placeholder__avatar\"\n src={participant.image}\n />\n )}\n </div>\n );\n});\n\nconst InitialsFallback = (props: { name: string }) => {\n const { name } = props;\n const initials = name\n .split(' ')\n .slice(0, 2)\n .map((n) => n[0])\n .join('');\n return (\n <div className=\"str-video__video-placeholder__initials-fallback\">\n {initials}\n </div>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":";;;AAQO,MAAM,oBAAoB,GAAG,UAAU,CAG5C,SAAS,uBAAuB,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAA;IACtE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IACzC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,MAAM;IACnD,QACEA,cAAK,SAAS,EAAC,8BAA8B,EAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,aACjE,CAAC,CAAC,WAAW,CAAC,KAAK,IAAI,KAAK;AAC3B,iBAAC,IAAI,IACHC,GAAA,CAAC,gBAAgB,EAAA,EAAC,IAAI,EAAE,IAAI,EAAA,CAAI,KAEhCA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,8CAA8C,EAAA,QAAA,EAC1D,QAAQ,EAAA,CACL,CACP,CAAC,EACH,WAAW,CAAC,KAAK,IAAI,CAAC,KAAK,KAC1BA,GAAA,CAAA,KAAA,EAAA,EACE,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,EAC7B,GAAG,EAAE,IAAI,EACT,SAAS,EAAC,sCAAsC,EAChD,GAAG,EAAE,WAAW,CAAC,KAAK,EAAA,CACtB,CACH,CAAA,EAAA,CACG;AAEV,CAAC;AAED,MAAM,gBAAgB,GAAG,CAAC,KAAuB,KAAI;AACnD,IAAA,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK;IACtB,MAAM,QAAQ,GAAG;SACd,KAAK,CAAC,GAAG;AACT,SAAA,KAAK,CAAC,CAAC,EAAE,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACf,IAAI,CAAC,EAAE,CAAC;IACX,QACEA,aAAK,SAAS,EAAC,iDAAiD,EAAA,QAAA,EAC7D,QAAQ,EAAA,CACL;AAEV,CAAC;;;;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { useI18n } from '@stream-io/video-react-bindings';
|
|
4
|
+
import { BaseVideoPlaceholder } from './BaseVideoPlaceholder.js';
|
|
5
|
+
|
|
6
|
+
const DefaultPictureInPicturePlaceholder = forwardRef(function DefaultPictureInPicturePlaceholderRender(props, ref) {
|
|
7
|
+
const { t } = useI18n();
|
|
8
|
+
return (jsx(BaseVideoPlaceholder, { ref: ref, ...props, children: t('Video is playing in a popup') }));
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
export { DefaultPictureInPicturePlaceholder };
|
|
12
|
+
//# sourceMappingURL=DefaultPictureInPicturePlaceholder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefaultPictureInPicturePlaceholder.js","sources":["../../../../../../../../src/core/components/Video/DefaultPictureInPicturePlaceholder.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport {\n BaseVideoPlaceholder,\n type BaseVideoPlaceholderProps,\n} from './BaseVideoPlaceholder';\n\nexport type PictureInPicturePlaceholderProps = BaseVideoPlaceholderProps;\n\nexport const DefaultPictureInPicturePlaceholder = forwardRef<\n HTMLDivElement,\n PictureInPicturePlaceholderProps\n>(function DefaultPictureInPicturePlaceholderRender(props, ref) {\n const { t } = useI18n();\n return (\n <BaseVideoPlaceholder ref={ref} {...props}>\n {t('Video is playing in a popup')}\n </BaseVideoPlaceholder>\n );\n});\n"],"names":["_jsx"],"mappings":";;;;;AASO,MAAM,kCAAkC,GAAG,UAAU,CAG1D,SAAS,wCAAwC,CAAC,KAAK,EAAE,GAAG,EAAA;AAC5D,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE;AACvB,IAAA,QACEA,GAAA,CAAC,oBAAoB,EAAA,EAAC,GAAG,EAAE,GAAG,EAAA,GAAM,KAAK,EAAA,QAAA,EACtC,CAAC,CAAC,6BAA6B,CAAC,EAAA,CACZ;AAE3B,CAAC;;;;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { useI18n } from '@stream-io/video-react-bindings';
|
|
4
|
+
import { BaseVideoPlaceholder } from './BaseVideoPlaceholder.js';
|
|
5
|
+
|
|
6
|
+
const DefaultVideoPlaceholder = forwardRef(function DefaultVideoPlaceholderRender(props, ref) {
|
|
7
|
+
const { t } = useI18n();
|
|
8
|
+
return (jsx(BaseVideoPlaceholder, { ref: ref, ...props, children: t('Video is disabled') }));
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
export { DefaultVideoPlaceholder };
|
|
12
|
+
//# sourceMappingURL=DefaultVideoPlaceholder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefaultVideoPlaceholder.js","sources":["../../../../../../../../src/core/components/Video/DefaultVideoPlaceholder.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { useI18n } from '@stream-io/video-react-bindings';\nimport {\n BaseVideoPlaceholder,\n type BaseVideoPlaceholderProps,\n} from './BaseVideoPlaceholder';\n\nexport type VideoPlaceholderProps = BaseVideoPlaceholderProps;\n\nexport const DefaultVideoPlaceholder = forwardRef<\n HTMLDivElement,\n VideoPlaceholderProps\n>(function DefaultVideoPlaceholderRender(props, ref) {\n const { t } = useI18n();\n return (\n <BaseVideoPlaceholder ref={ref} {...props}>\n {t('Video is disabled')}\n </BaseVideoPlaceholder>\n );\n});\n"],"names":["_jsx"],"mappings":";;;;;AASO,MAAM,uBAAuB,GAAG,UAAU,CAG/C,SAAS,6BAA6B,CAAC,KAAK,EAAE,GAAG,EAAA;AACjD,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE;AACvB,IAAA,QACEA,GAAA,CAAC,oBAAoB,EAAA,EAAC,GAAG,EAAE,GAAG,EAAA,GAAM,KAAK,EAAA,QAAA,EACtC,CAAC,CAAC,mBAAmB,CAAC,EAAA,CACF;AAE3B,CAAC;;;;"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useLayoutEffect, useEffect } from 'react';
|
|
3
|
+
import { hasVideo, hasScreenShare, VisibilityState, hasPausedTrack } from '@stream-io/video-client';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import { DefaultVideoPlaceholder } from './DefaultVideoPlaceholder.js';
|
|
6
|
+
import { useCall } from '@stream-io/video-react-bindings';
|
|
7
|
+
import { usePictureInPictureState } from '../../hooks/usePictureInPictureState.js';
|
|
8
|
+
import { DefaultPictureInPicturePlaceholder } from './DefaultPictureInPicturePlaceholder.js';
|
|
9
|
+
|
|
10
|
+
const ABSOLUTE_POSITION_STYLE = { position: 'absolute' };
|
|
11
|
+
const Video = ({ enabled = true, mirror, trackType, participant, className, VideoPlaceholder = DefaultVideoPlaceholder, PictureInPicturePlaceholder = DefaultPictureInPicturePlaceholder, refs, ...rest }) => {
|
|
12
|
+
const { sessionId, videoStream, screenShareStream, viewportVisibilityState, isLocalParticipant, userId, } = participant;
|
|
13
|
+
const call = useCall();
|
|
14
|
+
const [videoElement, setVideoElement] = useState(null);
|
|
15
|
+
// start with true, will flip once the video starts playing
|
|
16
|
+
const [isVideoPaused, setIsVideoPaused] = useState(true);
|
|
17
|
+
const [isWideMode, setIsWideMode] = useState(true);
|
|
18
|
+
const isPiP = usePictureInPictureState(videoElement ?? undefined);
|
|
19
|
+
const stream = trackType === 'videoTrack'
|
|
20
|
+
? videoStream
|
|
21
|
+
: trackType === 'screenShareTrack'
|
|
22
|
+
? screenShareStream
|
|
23
|
+
: undefined;
|
|
24
|
+
useLayoutEffect(() => {
|
|
25
|
+
if (!call || !videoElement || trackType === 'none')
|
|
26
|
+
return;
|
|
27
|
+
const cleanup = call.bindVideoElement(videoElement, sessionId, trackType);
|
|
28
|
+
return () => {
|
|
29
|
+
cleanup?.();
|
|
30
|
+
};
|
|
31
|
+
}, [call, trackType, sessionId, videoElement]);
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (!stream || !videoElement)
|
|
34
|
+
return;
|
|
35
|
+
const [track] = stream.getVideoTracks();
|
|
36
|
+
if (!track)
|
|
37
|
+
return;
|
|
38
|
+
const handlePlayPause = () => {
|
|
39
|
+
setIsVideoPaused(videoElement.paused);
|
|
40
|
+
const { width = 0, height = 0 } = track.getSettings();
|
|
41
|
+
setIsWideMode(width >= height);
|
|
42
|
+
};
|
|
43
|
+
// playback may have started before we had a chance to
|
|
44
|
+
// attach the 'play/pause' event listener, so we set the state
|
|
45
|
+
// here to make sure it's in sync
|
|
46
|
+
setIsVideoPaused(videoElement.paused);
|
|
47
|
+
videoElement.addEventListener('play', handlePlayPause);
|
|
48
|
+
videoElement.addEventListener('pause', handlePlayPause);
|
|
49
|
+
track.addEventListener('unmute', handlePlayPause);
|
|
50
|
+
return () => {
|
|
51
|
+
videoElement.removeEventListener('play', handlePlayPause);
|
|
52
|
+
videoElement.removeEventListener('pause', handlePlayPause);
|
|
53
|
+
track.removeEventListener('unmute', handlePlayPause);
|
|
54
|
+
// reset the 'pause' state once we unmount the video element
|
|
55
|
+
setIsVideoPaused(true);
|
|
56
|
+
};
|
|
57
|
+
}, [stream, videoElement]);
|
|
58
|
+
if (!call)
|
|
59
|
+
return null;
|
|
60
|
+
const isPublishingTrack = trackType === 'videoTrack'
|
|
61
|
+
? hasVideo(participant)
|
|
62
|
+
: trackType === 'screenShareTrack'
|
|
63
|
+
? hasScreenShare(participant)
|
|
64
|
+
: false;
|
|
65
|
+
const isInvisible = trackType === 'none' ||
|
|
66
|
+
viewportVisibilityState?.[trackType] === VisibilityState.INVISIBLE;
|
|
67
|
+
const hasNoVideoOrInvisible = !enabled ||
|
|
68
|
+
!isPublishingTrack ||
|
|
69
|
+
isInvisible ||
|
|
70
|
+
hasPausedTrack(participant, trackType);
|
|
71
|
+
const mirrorVideo = mirror === undefined
|
|
72
|
+
? isLocalParticipant && trackType === 'videoTrack'
|
|
73
|
+
: mirror;
|
|
74
|
+
const isScreenShareTrack = trackType === 'screenShareTrack';
|
|
75
|
+
return (jsxs(Fragment, { children: [!hasNoVideoOrInvisible && (jsx("video", { ...rest, className: clsx('str-video__video', className, {
|
|
76
|
+
'str-video__video--not-playing': isVideoPaused,
|
|
77
|
+
'str-video__video--tall': !isWideMode,
|
|
78
|
+
'str-video__video--mirror': mirrorVideo,
|
|
79
|
+
'str-video__video--screen-share': isScreenShareTrack,
|
|
80
|
+
}), "data-user-id": userId, "data-session-id": sessionId, ref: (element) => {
|
|
81
|
+
setVideoElement(element);
|
|
82
|
+
refs?.setVideoElement?.(element);
|
|
83
|
+
} })), isPiP && PictureInPicturePlaceholder && (jsx(PictureInPicturePlaceholder, { style: ABSOLUTE_POSITION_STYLE, participant: participant })), (hasNoVideoOrInvisible || isVideoPaused) && VideoPlaceholder && (jsx(VideoPlaceholder, { style: ABSOLUTE_POSITION_STYLE, participant: participant, ref: refs?.setVideoPlaceholderElement }))] }));
|
|
84
|
+
};
|
|
85
|
+
Video.displayName = 'Video';
|
|
86
|
+
|
|
87
|
+
export { Video };
|
|
88
|
+
//# sourceMappingURL=Video.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Video.js","sources":["../../../../../../../../src/core/components/Video/Video.tsx"],"sourcesContent":["import {\n ComponentPropsWithoutRef,\n ComponentType,\n CSSProperties,\n useEffect,\n useLayoutEffect,\n useState,\n} from 'react';\nimport {\n hasPausedTrack,\n hasScreenShare,\n hasVideo,\n StreamVideoParticipant,\n VideoTrackType,\n VisibilityState,\n} from '@stream-io/video-client';\nimport clsx from 'clsx';\nimport {\n DefaultVideoPlaceholder,\n VideoPlaceholderProps,\n} from './DefaultVideoPlaceholder';\nimport { useCall } from '@stream-io/video-react-bindings';\nimport { usePictureInPictureState } from '../../hooks/usePictureInPictureState';\nimport {\n DefaultPictureInPicturePlaceholder,\n PictureInPicturePlaceholderProps,\n} from './DefaultPictureInPicturePlaceholder';\n\nconst ABSOLUTE_POSITION_STYLE: CSSProperties = { position: 'absolute' };\n\nexport type VideoProps = ComponentPropsWithoutRef<'video'> & {\n /**\n * Pass false to disable rendering video and render fallback\n * even if the participant has published video.\n * @default true\n */\n enabled?: boolean;\n /**\n * Forces the video to be mirrored or unmirrored. By default, video track\n * from the local participant is mirrored, and all other videos are not mirrored.\n */\n mirror?: boolean;\n /**\n * The track type to display.\n */\n trackType: VideoTrackType | 'none';\n /**\n * The participant represented by this video element.\n */\n participant: StreamVideoParticipant;\n /**\n * Override the default UI that's visible when a participant turned off their video.\n * Set it to `null` if you wish to disable the video placeholder.\n *\n * @default DefaultVideoPlaceholder\n */\n VideoPlaceholder?: ComponentType<VideoPlaceholderProps> | null;\n /**\n * Override the default UI that's dispayed in place of the video when it's playing\n * in picture-in-picture. Set it to `null` if you wish to display the browser's default\n * placeholder.\n *\n * @default DefaultPictureInPicturePlaceholder\n */\n PictureInPicturePlaceholder?: ComponentType<PictureInPicturePlaceholderProps> | null;\n /**\n /**\n * An object with setRef functions\n * meant for exposing some of the internal elements of this component.\n */\n refs?: {\n /**\n * The video element that's used to play the video stream.\n * @param element the video element.\n */\n setVideoElement?: (element: HTMLVideoElement | null) => void;\n /**\n * The video placeholder element that's used when the video stream is not playing.\n * @param element the video placeholder element.\n */\n setVideoPlaceholderElement?: (element: HTMLDivElement | null) => void;\n setPictureInPicturePlaceholderElement?: (\n element: HTMLDivElement | null,\n ) => void;\n };\n};\n\nexport const Video = ({\n enabled = true,\n mirror,\n trackType,\n participant,\n className,\n VideoPlaceholder = DefaultVideoPlaceholder,\n PictureInPicturePlaceholder = DefaultPictureInPicturePlaceholder,\n refs,\n ...rest\n}: VideoProps) => {\n const {\n sessionId,\n videoStream,\n screenShareStream,\n viewportVisibilityState,\n isLocalParticipant,\n userId,\n } = participant;\n\n const call = useCall();\n const [videoElement, setVideoElement] = useState<HTMLVideoElement | null>(\n null,\n );\n // start with true, will flip once the video starts playing\n const [isVideoPaused, setIsVideoPaused] = useState(true);\n const [isWideMode, setIsWideMode] = useState(true);\n const isPiP = usePictureInPictureState(videoElement ?? undefined);\n\n const stream =\n trackType === 'videoTrack'\n ? videoStream\n : trackType === 'screenShareTrack'\n ? screenShareStream\n : undefined;\n\n useLayoutEffect(() => {\n if (!call || !videoElement || trackType === 'none') return;\n\n const cleanup = call.bindVideoElement(videoElement, sessionId, trackType);\n\n return () => {\n cleanup?.();\n };\n }, [call, trackType, sessionId, videoElement]);\n\n useEffect(() => {\n if (!stream || !videoElement) return;\n\n const [track] = stream.getVideoTracks();\n if (!track) return;\n\n const handlePlayPause = () => {\n setIsVideoPaused(videoElement.paused);\n\n const { width = 0, height = 0 } = track.getSettings();\n setIsWideMode(width >= height);\n };\n\n // playback may have started before we had a chance to\n // attach the 'play/pause' event listener, so we set the state\n // here to make sure it's in sync\n setIsVideoPaused(videoElement.paused);\n\n videoElement.addEventListener('play', handlePlayPause);\n videoElement.addEventListener('pause', handlePlayPause);\n track.addEventListener('unmute', handlePlayPause);\n return () => {\n videoElement.removeEventListener('play', handlePlayPause);\n videoElement.removeEventListener('pause', handlePlayPause);\n track.removeEventListener('unmute', handlePlayPause);\n\n // reset the 'pause' state once we unmount the video element\n setIsVideoPaused(true);\n };\n }, [stream, videoElement]);\n\n if (!call) return null;\n\n const isPublishingTrack =\n trackType === 'videoTrack'\n ? hasVideo(participant)\n : trackType === 'screenShareTrack'\n ? hasScreenShare(participant)\n : false;\n\n const isInvisible =\n trackType === 'none' ||\n viewportVisibilityState?.[trackType] === VisibilityState.INVISIBLE;\n\n const hasNoVideoOrInvisible =\n !enabled ||\n !isPublishingTrack ||\n isInvisible ||\n hasPausedTrack(participant, trackType);\n const mirrorVideo =\n mirror === undefined\n ? isLocalParticipant && trackType === 'videoTrack'\n : mirror;\n const isScreenShareTrack = trackType === 'screenShareTrack';\n return (\n <>\n {!hasNoVideoOrInvisible && (\n <video\n {...rest}\n className={clsx('str-video__video', className, {\n 'str-video__video--not-playing': isVideoPaused,\n 'str-video__video--tall': !isWideMode,\n 'str-video__video--mirror': mirrorVideo,\n 'str-video__video--screen-share': isScreenShareTrack,\n })}\n data-user-id={userId}\n data-session-id={sessionId}\n ref={(element) => {\n setVideoElement(element);\n refs?.setVideoElement?.(element);\n }}\n />\n )}\n {isPiP && PictureInPicturePlaceholder && (\n <PictureInPicturePlaceholder\n style={ABSOLUTE_POSITION_STYLE}\n participant={participant}\n />\n )}\n {/* TODO: add condition to \"hold\" the placeholder until track unmutes as well */}\n {(hasNoVideoOrInvisible || isVideoPaused) && VideoPlaceholder && (\n <VideoPlaceholder\n style={ABSOLUTE_POSITION_STYLE}\n participant={participant}\n ref={refs?.setVideoPlaceholderElement}\n />\n )}\n </>\n );\n};\n\nVideo.displayName = 'Video';\n"],"names":["_jsxs","_Fragment","_jsx"],"mappings":";;;;;;;;;AA4BA,MAAM,uBAAuB,GAAkB,EAAE,QAAQ,EAAE,UAAU,EAAE;AA2DhE,MAAM,KAAK,GAAG,CAAC,EACpB,OAAO,GAAG,IAAI,EACd,MAAM,EACN,SAAS,EACT,WAAW,EACX,SAAS,EACT,gBAAgB,GAAG,uBAAuB,EAC1C,2BAA2B,GAAG,kCAAkC,EAChE,IAAI,EACJ,GAAG,IAAI,EACI,KAAI;AACf,IAAA,MAAM,EACJ,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,MAAM,GACP,GAAG,WAAW;AAEf,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE;IACtB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAC9C,IAAI,CACL;;IAED,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;IACxD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;IAClD,MAAM,KAAK,GAAG,wBAAwB,CAAC,YAAY,IAAI,SAAS,CAAC;AAEjE,IAAA,MAAM,MAAM,GACV,SAAS,KAAK;AACZ,UAAE;UACA,SAAS,KAAK;AACd,cAAE;cACA,SAAS;IAEjB,eAAe,CAAC,MAAK;QACnB,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,IAAI,SAAS,KAAK,MAAM;YAAE;AAEpD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC;AAEzE,QAAA,OAAO,MAAK;YACV,OAAO,IAAI;AACb,QAAA,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAE9C,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY;YAAE;QAE9B,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,cAAc,EAAE;AACvC,QAAA,IAAI,CAAC,KAAK;YAAE;QAEZ,MAAM,eAAe,GAAG,MAAK;AAC3B,YAAA,gBAAgB,CAAC,YAAY,CAAC,MAAM,CAAC;AAErC,YAAA,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE;AACrD,YAAA,aAAa,CAAC,KAAK,IAAI,MAAM,CAAC;AAChC,QAAA,CAAC;;;;AAKD,QAAA,gBAAgB,CAAC,YAAY,CAAC,MAAM,CAAC;AAErC,QAAA,YAAY,CAAC,gBAAgB,CAAC,MAAM,EAAE,eAAe,CAAC;AACtD,QAAA,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,eAAe,CAAC;AACvD,QAAA,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,eAAe,CAAC;AACjD,QAAA,OAAO,MAAK;AACV,YAAA,YAAY,CAAC,mBAAmB,CAAC,MAAM,EAAE,eAAe,CAAC;AACzD,YAAA,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,eAAe,CAAC;AAC1D,YAAA,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,eAAe,CAAC;;YAGpD,gBAAgB,CAAC,IAAI,CAAC;AACxB,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAE1B,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;AAEtB,IAAA,MAAM,iBAAiB,GACrB,SAAS,KAAK;AACZ,UAAE,QAAQ,CAAC,WAAW;UACpB,SAAS,KAAK;AACd,cAAE,cAAc,CAAC,WAAW;cAC1B,KAAK;AAEb,IAAA,MAAM,WAAW,GACf,SAAS,KAAK,MAAM;QACpB,uBAAuB,GAAG,SAAS,CAAC,KAAK,eAAe,CAAC,SAAS;IAEpE,MAAM,qBAAqB,GACzB,CAAC,OAAO;AACR,QAAA,CAAC,iBAAiB;QAClB,WAAW;AACX,QAAA,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC;AACxC,IAAA,MAAM,WAAW,GACf,MAAM,KAAK;AACT,UAAE,kBAAkB,IAAI,SAAS,KAAK;UACpC,MAAM;AACZ,IAAA,MAAM,kBAAkB,GAAG,SAAS,KAAK,kBAAkB;AAC3D,IAAA,QACEA,IAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CACG,CAAC,qBAAqB,KACrBC,GAAA,CAAA,OAAA,EAAA,EAAA,GACM,IAAI,EACR,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,SAAS,EAAE;AAC7C,oBAAA,+BAA+B,EAAE,aAAa;oBAC9C,wBAAwB,EAAE,CAAC,UAAU;AACrC,oBAAA,0BAA0B,EAAE,WAAW;AACvC,oBAAA,gCAAgC,EAAE,kBAAkB;iBACrD,CAAC,EAAA,cAAA,EACY,MAAM,EAAA,iBAAA,EACH,SAAS,EAC1B,GAAG,EAAE,CAAC,OAAO,KAAI;oBACf,eAAe,CAAC,OAAO,CAAC;AACxB,oBAAA,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC;gBAClC,CAAC,EAAA,CACD,CACH,EACA,KAAK,IAAI,2BAA2B,KACnCA,GAAA,CAAC,2BAA2B,EAAA,EAC1B,KAAK,EAAE,uBAAuB,EAC9B,WAAW,EAAE,WAAW,GACxB,CACH,EAEA,CAAC,qBAAqB,IAAI,aAAa,KAAK,gBAAgB,KAC3DA,GAAA,CAAC,gBAAgB,EAAA,EACf,KAAK,EAAE,uBAAuB,EAC9B,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,IAAI,EAAE,0BAA0B,EAAA,CACrC,CACH,CAAA,EAAA,CACA;AAEP;AAEA,KAAK,CAAC,WAAW,GAAG,OAAO;;;;"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
const useCalculateHardLimit = (
|
|
4
|
+
/**
|
|
5
|
+
* Element that stretches to 100% of the whole layout component
|
|
6
|
+
*/
|
|
7
|
+
wrapperElement,
|
|
8
|
+
/**
|
|
9
|
+
* Element that directly hosts individual `ParticipantView` (or wrapper) elements
|
|
10
|
+
*/
|
|
11
|
+
hostElement, limit) => {
|
|
12
|
+
const [calculatedLimit, setCalculatedLimit] = useState({
|
|
13
|
+
vertical: typeof limit === 'number' ? limit : null,
|
|
14
|
+
horizontal: typeof limit === 'number' ? limit : null,
|
|
15
|
+
});
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
if (!hostElement ||
|
|
18
|
+
!wrapperElement ||
|
|
19
|
+
typeof limit === 'number' ||
|
|
20
|
+
typeof limit === 'undefined')
|
|
21
|
+
return;
|
|
22
|
+
let childWidth = null;
|
|
23
|
+
let childHeight = null;
|
|
24
|
+
const resizeObserver = new ResizeObserver((entries, observer) => {
|
|
25
|
+
// this part should ideally run as little times as possible
|
|
26
|
+
// get child measurements and disconnect
|
|
27
|
+
// does not consider dynamically sized children
|
|
28
|
+
// this hook is for SpeakerLayout use only, where children in the bar are fixed size
|
|
29
|
+
if (entries.length > 1) {
|
|
30
|
+
const child = hostElement.firstChild;
|
|
31
|
+
if (child) {
|
|
32
|
+
childHeight = child.clientHeight;
|
|
33
|
+
childWidth = child.clientWidth;
|
|
34
|
+
observer.unobserve(hostElement);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// keep the state at { vertical: 1, horizontal: 1 }
|
|
38
|
+
// until we get the proper child measurements
|
|
39
|
+
if (childHeight === null || childWidth === null)
|
|
40
|
+
return;
|
|
41
|
+
const vertical = Math.floor(wrapperElement.clientHeight / childHeight);
|
|
42
|
+
const horizontal = Math.floor(wrapperElement.clientWidth / childWidth);
|
|
43
|
+
setCalculatedLimit((pv) => {
|
|
44
|
+
if (pv.vertical !== vertical || pv.horizontal !== horizontal)
|
|
45
|
+
return { vertical, horizontal };
|
|
46
|
+
return pv;
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
resizeObserver.observe(wrapperElement);
|
|
50
|
+
resizeObserver.observe(hostElement);
|
|
51
|
+
return () => {
|
|
52
|
+
resizeObserver.disconnect();
|
|
53
|
+
};
|
|
54
|
+
}, [hostElement, limit, wrapperElement]);
|
|
55
|
+
return calculatedLimit;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export { useCalculateHardLimit };
|
|
59
|
+
//# sourceMappingURL=useCalculateHardLimit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCalculateHardLimit.js","sources":["../../../../../../../src/core/hooks/useCalculateHardLimit.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nexport const useCalculateHardLimit = (\n /**\n * Element that stretches to 100% of the whole layout component\n */\n wrapperElement: HTMLDivElement | null,\n /**\n * Element that directly hosts individual `ParticipantView` (or wrapper) elements\n */\n hostElement: HTMLDivElement | null,\n limit?: 'dynamic' | number,\n) => {\n const [calculatedLimit, setCalculatedLimit] = useState<{\n vertical: number | null;\n horizontal: number | null;\n }>({\n vertical: typeof limit === 'number' ? limit : null,\n horizontal: typeof limit === 'number' ? limit : null,\n });\n\n useEffect(() => {\n if (\n !hostElement ||\n !wrapperElement ||\n typeof limit === 'number' ||\n typeof limit === 'undefined'\n )\n return;\n\n let childWidth: number | null = null;\n let childHeight: number | null = null;\n\n const resizeObserver = new ResizeObserver((entries, observer) => {\n // this part should ideally run as little times as possible\n // get child measurements and disconnect\n // does not consider dynamically sized children\n // this hook is for SpeakerLayout use only, where children in the bar are fixed size\n if (entries.length > 1) {\n const child = hostElement.firstChild as HTMLElement | null;\n\n if (child) {\n childHeight = child.clientHeight;\n childWidth = child.clientWidth;\n observer.unobserve(hostElement);\n }\n }\n\n // keep the state at { vertical: 1, horizontal: 1 }\n // until we get the proper child measurements\n if (childHeight === null || childWidth === null) return;\n\n const vertical = Math.floor(wrapperElement.clientHeight / childHeight);\n const horizontal = Math.floor(wrapperElement.clientWidth / childWidth);\n\n setCalculatedLimit((pv) => {\n if (pv.vertical !== vertical || pv.horizontal !== horizontal)\n return { vertical, horizontal };\n return pv;\n });\n });\n\n resizeObserver.observe(wrapperElement);\n resizeObserver.observe(hostElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [hostElement, limit, wrapperElement]);\n\n return calculatedLimit;\n};\n"],"names":[],"mappings":";;AAEO,MAAM,qBAAqB,GAAG;AACnC;;AAEG;AACH,cAAqC;AACrC;;AAEG;AACH,WAAkC,EAClC,KAA0B,KACxB;AACF,IAAA,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAGnD;AACD,QAAA,QAAQ,EAAE,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,IAAI;AAClD,QAAA,UAAU,EAAE,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,IAAI;AACrD,KAAA,CAAC;IAEF,SAAS,CAAC,MAAK;AACb,QAAA,IACE,CAAC,WAAW;AACZ,YAAA,CAAC,cAAc;YACf,OAAO,KAAK,KAAK,QAAQ;YACzB,OAAO,KAAK,KAAK,WAAW;YAE5B;QAEF,IAAI,UAAU,GAAkB,IAAI;QACpC,IAAI,WAAW,GAAkB,IAAI;QAErC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAI;;;;;AAK9D,YAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AACtB,gBAAA,MAAM,KAAK,GAAG,WAAW,CAAC,UAAgC;gBAE1D,IAAI,KAAK,EAAE;AACT,oBAAA,WAAW,GAAG,KAAK,CAAC,YAAY;AAChC,oBAAA,UAAU,GAAG,KAAK,CAAC,WAAW;AAC9B,oBAAA,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC;gBACjC;YACF;;;AAIA,YAAA,IAAI,WAAW,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI;gBAAE;AAEjD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,GAAG,WAAW,CAAC;AACtE,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,GAAG,UAAU,CAAC;AAEtE,YAAA,kBAAkB,CAAC,CAAC,EAAE,KAAI;gBACxB,IAAI,EAAE,CAAC,QAAQ,KAAK,QAAQ,IAAI,EAAE,CAAC,UAAU,KAAK,UAAU;AAC1D,oBAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE;AACjC,gBAAA,OAAO,EAAE;AACX,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC;AACtC,QAAA,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC;AAEnC,QAAA,OAAO,MAAK;YACV,cAAc,CAAC,UAAU,EAAE;AAC7B,QAAA,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;AAExC,IAAA,OAAO,eAAe;AACxB;;;;"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
function usePictureInPictureState(videoElement) {
|
|
4
|
+
const [isPiP, setIsPiP] = useState(document.pictureInPictureElement === videoElement);
|
|
5
|
+
if (!videoElement && isPiP)
|
|
6
|
+
setIsPiP(false);
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
if (!videoElement)
|
|
9
|
+
return;
|
|
10
|
+
const handlePiP = () => {
|
|
11
|
+
setIsPiP(document.pictureInPictureElement === videoElement);
|
|
12
|
+
};
|
|
13
|
+
videoElement.addEventListener('enterpictureinpicture', handlePiP);
|
|
14
|
+
videoElement.addEventListener('leavepictureinpicture', handlePiP);
|
|
15
|
+
return () => {
|
|
16
|
+
videoElement.removeEventListener('enterpictureinpicture', handlePiP);
|
|
17
|
+
videoElement.removeEventListener('leavepictureinpicture', handlePiP);
|
|
18
|
+
};
|
|
19
|
+
}, [videoElement]);
|
|
20
|
+
return isPiP;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { usePictureInPictureState };
|
|
24
|
+
//# sourceMappingURL=usePictureInPictureState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePictureInPictureState.js","sources":["../../../../../../../src/core/hooks/usePictureInPictureState.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nexport function usePictureInPictureState(videoElement?: HTMLVideoElement) {\n const [isPiP, setIsPiP] = useState(\n document.pictureInPictureElement === videoElement,\n );\n\n if (!videoElement && isPiP) setIsPiP(false);\n\n useEffect(() => {\n if (!videoElement) return;\n\n const handlePiP = () => {\n setIsPiP(document.pictureInPictureElement === videoElement);\n };\n\n videoElement.addEventListener('enterpictureinpicture', handlePiP);\n videoElement.addEventListener('leavepictureinpicture', handlePiP);\n\n return () => {\n videoElement.removeEventListener('enterpictureinpicture', handlePiP);\n videoElement.removeEventListener('leavepictureinpicture', handlePiP);\n };\n }, [videoElement]);\n\n return isPiP;\n}\n"],"names":[],"mappings":";;AAEM,SAAU,wBAAwB,CAAC,YAA+B,EAAA;AACtE,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAChC,QAAQ,CAAC,uBAAuB,KAAK,YAAY,CAClD;IAED,IAAI,CAAC,YAAY,IAAI,KAAK;QAAE,QAAQ,CAAC,KAAK,CAAC;IAE3C,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,YAAY;YAAE;QAEnB,MAAM,SAAS,GAAG,MAAK;AACrB,YAAA,QAAQ,CAAC,QAAQ,CAAC,uBAAuB,KAAK,YAAY,CAAC;AAC7D,QAAA,CAAC;AAED,QAAA,YAAY,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,SAAS,CAAC;AACjE,QAAA,YAAY,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,SAAS,CAAC;AAEjE,QAAA,OAAO,MAAK;AACV,YAAA,YAAY,CAAC,mBAAmB,CAAC,uBAAuB,EAAE,SAAS,CAAC;AACpE,YAAA,YAAY,CAAC,mBAAmB,CAAC,uBAAuB,EAAE,SAAS,CAAC;AACtE,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;AAElB,IAAA,OAAO,KAAK;AACd;;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { useCall } from '@stream-io/video-react-bindings';
|
|
3
|
+
|
|
4
|
+
const useTrackElementVisibility = ({ trackedElement, sessionId, trackType, }) => {
|
|
5
|
+
const call = useCall();
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
if (!trackedElement || !call || trackType === 'none')
|
|
8
|
+
return;
|
|
9
|
+
return call.trackElementVisibility(trackedElement, sessionId, trackType);
|
|
10
|
+
}, [trackedElement, call, sessionId, trackType]);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export { useTrackElementVisibility };
|
|
14
|
+
//# sourceMappingURL=useTrackElementVisibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTrackElementVisibility.js","sources":["../../../../../../../src/core/hooks/useTrackElementVisibility.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { VideoTrackType } from '@stream-io/video-client';\nimport { useCall } from '@stream-io/video-react-bindings';\n\nexport const useTrackElementVisibility = <T extends HTMLElement>({\n trackedElement,\n sessionId,\n trackType,\n}: {\n trackedElement: T | null;\n sessionId: string;\n trackType: VideoTrackType | 'none';\n}) => {\n const call = useCall();\n useEffect(() => {\n if (!trackedElement || !call || trackType === 'none') return;\n return call.trackElementVisibility(trackedElement, sessionId, trackType);\n }, [trackedElement, call, sessionId, trackType]);\n};\n"],"names":[],"mappings":";;;AAIO,MAAM,yBAAyB,GAAG,CAAwB,EAC/D,cAAc,EACd,SAAS,EACT,SAAS,GAKV,KAAI;AACH,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE;IACtB,SAAS,CAAC,MAAK;QACb,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,IAAI,SAAS,KAAK,MAAM;YAAE;QACtD,OAAO,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,SAAS,EAAE,SAAS,CAAC;IAC1E,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAClD;;;;"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useCallback } from 'react';
|
|
3
|
+
import { useEffectEvent } from '@stream-io/video-react-bindings';
|
|
4
|
+
import '../core/components/Audio/Audio.js';
|
|
5
|
+
import '../core/components/Audio/ParticipantsAudio.js';
|
|
6
|
+
import '@stream-io/video-client';
|
|
7
|
+
import '../core/components/ParticipantView/ParticipantViewContext.js';
|
|
8
|
+
import '../components/Menu/MenuToggle.js';
|
|
9
|
+
import 'clsx';
|
|
10
|
+
import '../core/components/ParticipantView/ParticipantView.js';
|
|
11
|
+
import '../core/components/ParticipantView/DefaultParticipantViewUI.js';
|
|
12
|
+
import { StreamCall } from '../core/components/StreamCall/StreamCall.js';
|
|
13
|
+
import { StreamVideo } from '../core/components/StreamVideo/StreamVideo.js';
|
|
14
|
+
import '../core/components/Video/BaseVideo.js';
|
|
15
|
+
import '../core/components/Video/Video.js';
|
|
16
|
+
import '../core/components/CallLayout/LivestreamLayout.js';
|
|
17
|
+
import '../core/components/CallLayout/PaginatedGridLayout.js';
|
|
18
|
+
import '../core/components/CallLayout/SpeakerLayout.js';
|
|
19
|
+
import '../core/components/CallLayout/PipLayout/Pip.js';
|
|
20
|
+
import '../core/components/CallLayout/PipLayout/Host.js';
|
|
21
|
+
import '../core/components/CallLayout/PipLayout/Grid.js';
|
|
22
|
+
import { BackgroundFiltersProvider } from '../components/BackgroundFilters/BackgroundFiltersProvider.js';
|
|
23
|
+
import '../components/Button/CompositeButton.js';
|
|
24
|
+
import '../components/Button/IconButton.js';
|
|
25
|
+
import '@floating-ui/react';
|
|
26
|
+
import '../components/CallControls/RecordCallButton.js';
|
|
27
|
+
import '../components/CallControls/ReactionsButton.js';
|
|
28
|
+
import '../components/DeviceSettings/DeviceSettings.js';
|
|
29
|
+
import '../components/DropdownSelect/DropdownSelect.js';
|
|
30
|
+
import '../components/CallControls/CancelCallButton.js';
|
|
31
|
+
import '../components/CallControls/CallStatsButton.js';
|
|
32
|
+
import '../components/CallParticipantsList/CallParticipantsList.js';
|
|
33
|
+
import '../components/CallParticipantsList/CallParticipantListingItem.js';
|
|
34
|
+
import { LoadingIndicator } from '../components/LoadingIndicator/LoadingIndicator.js';
|
|
35
|
+
import '../components/CallStats/CallStats.js';
|
|
36
|
+
import { NoiseCancellationProvider } from '../components/NoiseCancellation/NoiseCancellationProvider.js';
|
|
37
|
+
import '../components/RingingCall/RingingCall.js';
|
|
38
|
+
import '../components/Permissions/PermissionRequests.js';
|
|
39
|
+
import { StreamTheme } from '../components/StreamTheme/StreamTheme.js';
|
|
40
|
+
import '../core/components/Video/DefaultVideoPlaceholder.js';
|
|
41
|
+
import { ConfigurationProvider } from './context/ConfigurationContext.js';
|
|
42
|
+
import './shared/Lobby/ToggleMicButton.js';
|
|
43
|
+
import './shared/Lobby/ToggleCameraButton.js';
|
|
44
|
+
import { useEmbeddedClient } from './hooks/useEmbeddedClient.js';
|
|
45
|
+
|
|
46
|
+
const NoiseCancellationWrapper = ({ noiseCancellation, children, }) => {
|
|
47
|
+
if (!noiseCancellation) {
|
|
48
|
+
return jsx(Fragment, { children: children });
|
|
49
|
+
}
|
|
50
|
+
return (jsx(NoiseCancellationProvider, { noiseCancellation: noiseCancellation, children: children }));
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Shared provider wrapper for embedded components.
|
|
54
|
+
* Handles client/call initialization and wraps children with all necessary providers.
|
|
55
|
+
*/
|
|
56
|
+
const EmbeddedClientProvider = ({ apiKey, user, callId, callType, token, tokenProvider, logLevel, onError, layout, theme, children, }) => {
|
|
57
|
+
const [showError, setShowError] = useState(false);
|
|
58
|
+
const onErrorStable = useEffectEvent(onError ?? console.error);
|
|
59
|
+
const handleError = useCallback((error) => {
|
|
60
|
+
setShowError(true);
|
|
61
|
+
onErrorStable(error);
|
|
62
|
+
}, [onErrorStable]);
|
|
63
|
+
const { client, call, noiseCancellation, noiseCancellationReady } = useEmbeddedClient({
|
|
64
|
+
apiKey,
|
|
65
|
+
user,
|
|
66
|
+
callId,
|
|
67
|
+
callType,
|
|
68
|
+
token,
|
|
69
|
+
tokenProvider,
|
|
70
|
+
logLevel,
|
|
71
|
+
handleError,
|
|
72
|
+
});
|
|
73
|
+
if (showError) {
|
|
74
|
+
return (jsx(StreamTheme, { className: "str-video__embedded", children: jsx("div", { className: "str-video__embedded-error", children: jsx("p", { className: "str-video__embedded-error__message", children: "An error occurred while initializing the client. Please try again later." }) }) }));
|
|
75
|
+
}
|
|
76
|
+
if (!call || !client || !noiseCancellationReady) {
|
|
77
|
+
return (jsx(StreamTheme, { className: "str-video__embedded", children: jsx(LoadingIndicator, { className: "str-video__embedded-loading" }) }));
|
|
78
|
+
}
|
|
79
|
+
return (jsx(StreamVideo, { client: client, children: jsx(StreamCall, { call: call, children: jsx(ConfigurationProvider, { layout: layout, onError: onErrorStable, children: jsx(BackgroundFiltersProvider, { children: jsx(NoiseCancellationWrapper, { noiseCancellation: noiseCancellation, children: jsx(StreamTheme, { className: "str-video__embedded", style: theme, children: children }) }) }) }) }) }));
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export { EmbeddedClientProvider };
|
|
83
|
+
//# sourceMappingURL=EmbeddedClientProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmbeddedClientProvider.js","sources":["../../../../../../src/embedded/EmbeddedClientProvider.tsx"],"sourcesContent":["import { useCallback, useState, type ReactNode } from 'react';\nimport type { INoiseCancellation } from '@stream-io/audio-filters-web';\nimport { useEffectEvent as useEffectEventShim } from '@stream-io/video-react-bindings';\n\nimport { StreamCall, StreamVideo } from '../core';\nimport {\n StreamTheme,\n BackgroundFiltersProvider,\n NoiseCancellationProvider,\n} from '../components';\nimport { ConfigurationProvider } from './context';\nimport { useEmbeddedClient } from './hooks';\nimport type { LogLevel, TokenProvider } from '@stream-io/video-client';\nimport type { EmbeddedUser, LayoutOption } from './types';\nimport { LoadingIndicator } from '../components';\n\nexport interface EmbeddedClientProviderProps {\n apiKey: string;\n user: EmbeddedUser;\n callId: string;\n callType: string;\n token?: string;\n tokenProvider?: TokenProvider;\n logLevel?: LogLevel;\n onError?: (error: any) => void;\n layout?: LayoutOption;\n theme?: Record<string, string>;\n children: ReactNode;\n}\n\nconst NoiseCancellationWrapper = ({\n noiseCancellation,\n children,\n}: {\n noiseCancellation?: INoiseCancellation;\n children: ReactNode;\n}) => {\n if (!noiseCancellation) {\n return <>{children}</>;\n }\n\n return (\n <NoiseCancellationProvider noiseCancellation={noiseCancellation}>\n {children}\n </NoiseCancellationProvider>\n );\n};\n\n/**\n * Shared provider wrapper for embedded components.\n * Handles client/call initialization and wraps children with all necessary providers.\n */\nexport const EmbeddedClientProvider = ({\n apiKey,\n user,\n callId,\n callType,\n token,\n tokenProvider,\n logLevel,\n onError,\n layout,\n theme,\n children,\n}: EmbeddedClientProviderProps) => {\n const [showError, setShowError] = useState<boolean>(false);\n\n const onErrorStable = useEffectEventShim(onError ?? console.error);\n const handleError = useCallback(\n (error: any) => {\n setShowError(true);\n onErrorStable(error);\n },\n [onErrorStable],\n );\n\n const { client, call, noiseCancellation, noiseCancellationReady } =\n useEmbeddedClient({\n apiKey,\n user,\n callId,\n callType,\n token,\n tokenProvider,\n logLevel,\n handleError,\n });\n\n if (showError) {\n return (\n <StreamTheme className=\"str-video__embedded\">\n <div className=\"str-video__embedded-error\">\n <p className=\"str-video__embedded-error__message\">\n An error occurred while initializing the client. Please try again\n later.\n </p>\n </div>\n </StreamTheme>\n );\n }\n\n if (!call || !client || !noiseCancellationReady) {\n return (\n <StreamTheme className=\"str-video__embedded\">\n <LoadingIndicator className=\"str-video__embedded-loading\" />\n </StreamTheme>\n );\n }\n\n return (\n <StreamVideo client={client}>\n <StreamCall call={call}>\n <ConfigurationProvider layout={layout} onError={onErrorStable}>\n <BackgroundFiltersProvider>\n <NoiseCancellationWrapper noiseCancellation={noiseCancellation}>\n <StreamTheme className=\"str-video__embedded\" style={theme}>\n {children}\n </StreamTheme>\n </NoiseCancellationWrapper>\n </BackgroundFiltersProvider>\n </ConfigurationProvider>\n </StreamCall>\n </StreamVideo>\n );\n};\n"],"names":["_jsx","_Fragment","useEffectEventShim"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,MAAM,wBAAwB,GAAG,CAAC,EAChC,iBAAiB,EACjB,QAAQ,GAIT,KAAI;IACH,IAAI,CAAC,iBAAiB,EAAE;QACtB,OAAOA,GAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAI;IACxB;IAEA,QACED,GAAA,CAAC,yBAAyB,EAAA,EAAC,iBAAiB,EAAE,iBAAiB,EAAA,QAAA,EAC5D,QAAQ,EAAA,CACiB;AAEhC,CAAC;AAED;;;AAGG;AACI,MAAM,sBAAsB,GAAG,CAAC,EACrC,MAAM,EACN,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,KAAK,EACL,aAAa,EACb,QAAQ,EACR,OAAO,EACP,MAAM,EACN,KAAK,EACL,QAAQ,GACoB,KAAI;IAChC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC;IAE1D,MAAM,aAAa,GAAGE,cAAkB,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;AAClE,IAAA,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,KAAU,KAAI;QACb,YAAY,CAAC,IAAI,CAAC;QAClB,aAAa,CAAC,KAAK,CAAC;AACtB,IAAA,CAAC,EACD,CAAC,aAAa,CAAC,CAChB;IAED,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,GAC/D,iBAAiB,CAAC;QAChB,MAAM;QACN,IAAI;QACJ,MAAM;QACN,QAAQ;QACR,KAAK;QACL,aAAa;QACb,QAAQ;QACR,WAAW;AACZ,KAAA,CAAC;IAEJ,IAAI,SAAS,EAAE;QACb,QACEF,IAAC,WAAW,EAAA,EAAC,SAAS,EAAC,qBAAqB,YAC1CA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,2BAA2B,EAAA,QAAA,EACxCA,WAAG,SAAS,EAAC,oCAAoC,EAAA,QAAA,EAAA,0EAAA,EAAA,CAG7C,EAAA,CACA,EAAA,CACM;IAElB;IAEA,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,sBAAsB,EAAE;AAC/C,QAAA,QACEA,GAAA,CAAC,WAAW,EAAA,EAAC,SAAS,EAAC,qBAAqB,EAAA,QAAA,EAC1CA,GAAA,CAAC,gBAAgB,IAAC,SAAS,EAAC,6BAA6B,EAAA,CAAG,EAAA,CAChD;IAElB;IAEA,QACEA,GAAA,CAAC,WAAW,EAAA,EAAC,MAAM,EAAE,MAAM,EAAA,QAAA,EACzBA,GAAA,CAAC,UAAU,EAAA,EAAC,IAAI,EAAE,IAAI,EAAA,QAAA,EACpBA,GAAA,CAAC,qBAAqB,EAAA,EAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAA,QAAA,EAC3DA,GAAA,CAAC,yBAAyB,EAAA,EAAA,QAAA,EACxBA,GAAA,CAAC,wBAAwB,EAAA,EAAC,iBAAiB,EAAE,iBAAiB,EAAA,QAAA,EAC5DA,GAAA,CAAC,WAAW,EAAA,EAAC,SAAS,EAAC,qBAAqB,EAAC,KAAK,EAAE,KAAK,EAAA,QAAA,EACtD,QAAQ,EAAA,CACG,EAAA,CACW,EAAA,CACD,EAAA,CACN,EAAA,CACb,EAAA,CACD;AAElB;;;;"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { OwnCapability } from '@stream-io/video-client';
|
|
3
|
+
import { useI18n, useCallStateHooks, Restricted } from '@stream-io/video-react-bindings';
|
|
4
|
+
import 'react';
|
|
5
|
+
import 'clsx';
|
|
6
|
+
import '../../components/BackgroundFilters/BackgroundFiltersProvider.js';
|
|
7
|
+
import { CompositeButton } from '../../components/Button/CompositeButton.js';
|
|
8
|
+
import '../../components/Button/IconButton.js';
|
|
9
|
+
import '@floating-ui/react';
|
|
10
|
+
import { MicCaptureErrorNotification } from '../../components/Notification/MicCaptureErrorNotification.js';
|
|
11
|
+
import { RecordCallConfirmationButton } from '../../components/CallControls/RecordCallButton.js';
|
|
12
|
+
import { ReactionsButton } from '../../components/CallControls/ReactionsButton.js';
|
|
13
|
+
import { ScreenShareButton } from '../../components/CallControls/ScreenShareButton.js';
|
|
14
|
+
import { ToggleAudioPublishingButton } from '../../components/CallControls/ToggleAudioButton.js';
|
|
15
|
+
import { ToggleVideoPublishingButton } from '../../components/CallControls/ToggleVideoButton.js';
|
|
16
|
+
import { CancelCallConfirmButton } from '../../components/CallControls/CancelCallButton.js';
|
|
17
|
+
import '../../components/CallControls/CallStatsButton.js';
|
|
18
|
+
import { Icon } from '../../components/Icon/Icon.js';
|
|
19
|
+
import '../../components/DeviceSettings/DeviceSettings.js';
|
|
20
|
+
import '../../components/DropdownSelect/DropdownSelect.js';
|
|
21
|
+
import '../../components/Menu/MenuToggle.js';
|
|
22
|
+
import { DeviceSelectorAudioInput, DeviceSelectorAudioOutput } from '../../components/DeviceSettings/DeviceSelectorAudio.js';
|
|
23
|
+
import { WithTooltip } from '../../components/Tooltip/WithTooltip.js';
|
|
24
|
+
import '../../components/CallParticipantsList/CallParticipantsList.js';
|
|
25
|
+
import '../../components/CallParticipantsList/CallParticipantListingItem.js';
|
|
26
|
+
import '../../components/CallStats/CallStats.js';
|
|
27
|
+
import '../../components/NoiseCancellation/NoiseCancellationProvider.js';
|
|
28
|
+
import '../../components/RingingCall/RingingCall.js';
|
|
29
|
+
import '../../components/Permissions/PermissionRequests.js';
|
|
30
|
+
import '../../core/components/Video/Video.js';
|
|
31
|
+
import '../../core/components/Video/BaseVideo.js';
|
|
32
|
+
import '../../core/components/Video/DefaultVideoPlaceholder.js';
|
|
33
|
+
import '../../core/components/Audio/Audio.js';
|
|
34
|
+
import '../../core/components/Audio/ParticipantsAudio.js';
|
|
35
|
+
import '../../core/components/ParticipantView/ParticipantViewContext.js';
|
|
36
|
+
import '../../core/components/ParticipantView/ParticipantView.js';
|
|
37
|
+
import '../../core/components/ParticipantView/DefaultParticipantViewUI.js';
|
|
38
|
+
import '../../core/components/StreamCall/StreamCall.js';
|
|
39
|
+
import '../../core/components/StreamVideo/StreamVideo.js';
|
|
40
|
+
import '../../core/components/CallLayout/LivestreamLayout.js';
|
|
41
|
+
import '../../core/components/CallLayout/PaginatedGridLayout.js';
|
|
42
|
+
import '../../core/components/CallLayout/SpeakerLayout.js';
|
|
43
|
+
import '../../core/components/CallLayout/PipLayout/Pip.js';
|
|
44
|
+
import '../../core/components/CallLayout/PipLayout/Host.js';
|
|
45
|
+
import '../../core/components/CallLayout/PipLayout/Grid.js';
|
|
46
|
+
import '../context/ConfigurationContext.js';
|
|
47
|
+
import { CameraMenuWithBlur } from '../shared/BlurToggleButton/BlurToggleButton.js';
|
|
48
|
+
import '../shared/Lobby/ToggleMicButton.js';
|
|
49
|
+
import '../shared/Lobby/ToggleCameraButton.js';
|
|
50
|
+
import { useCallDuration } from '../hooks/useCallDuration.js';
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Renders the active call control bar
|
|
54
|
+
*/
|
|
55
|
+
const CallControls = ({ showParticipants, onToggleParticipants, }) => {
|
|
56
|
+
const { t } = useI18n();
|
|
57
|
+
const { useCallSession } = useCallStateHooks();
|
|
58
|
+
const session = useCallSession();
|
|
59
|
+
const startedAt = session?.started_at;
|
|
60
|
+
const { elapsed } = useCallDuration(startedAt);
|
|
61
|
+
return (jsxs("div", { className: "str-video__embedded-call-controls str-video__call-controls", children: [jsxs("div", { className: "str-video__call-controls--group str-video__call-controls--options", children: [jsx(Restricted, { requiredGrants: [OwnCapability.CREATE_REACTION], children: jsx("div", { className: "str-video__embedded-mobile", children: jsx(ReactionsButton, {}) }) }), startedAt && (jsxs("div", { className: "str-video__embedded-call-duration str-video__embedded-desktop", children: [jsx(Icon, { icon: "verified", className: "str-video__embedded-call-duration__icon" }), jsx("span", { className: "str-video__embedded-call-duration__time", children: elapsed })] }))] }), jsxs("div", { className: "str-video__call-controls--group str-video__call-controls--media", children: [jsx(Restricted, { requiredGrants: [OwnCapability.SEND_AUDIO], hasPermissionsOnly: true, children: jsx(MicCaptureErrorNotification, { children: jsx(ToggleAudioPublishingButton, { Menu: jsxs(Fragment, { children: [jsx(DeviceSelectorAudioInput, { visualType: "list", title: t('Microphone') }), jsx(DeviceSelectorAudioOutput, { visualType: "list", title: t('Speaker') })] }), menuPlacement: "top" }) }) }), jsx(Restricted, { requiredGrants: [OwnCapability.SEND_VIDEO], hasPermissionsOnly: true, children: jsx(ToggleVideoPublishingButton, { Menu: jsx(CameraMenuWithBlur, {}), menuPlacement: "top" }) }), jsx(Restricted, { requiredGrants: [OwnCapability.CREATE_REACTION], children: jsx("div", { className: "str-video__embedded-desktop", children: jsx(ReactionsButton, {}) }) }), jsx(Restricted, { requiredGrants: [OwnCapability.SCREENSHARE], children: jsx("div", { className: "str-video__embedded-desktop", children: jsx(ScreenShareButton, {}) }) }), jsx(RecordCallConfirmationButton, {}), jsx("div", { className: "str-video__embedded-desktop", children: jsx(CancelCallConfirmButton, {}) })] }), jsx("div", { className: "str-video__call-controls--group str-video__call-controls--sidebar", children: jsx(WithTooltip, { title: t('Participants'), children: jsx(CompositeButton, { active: showParticipants, "aria-label": t('Participants'), "aria-pressed": showParticipants, onClick: onToggleParticipants, children: jsx(Icon, { icon: "participants" }) }) }) })] }));
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export { CallControls };
|
|
65
|
+
//# sourceMappingURL=CallControls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallControls.js","sources":["../../../../../../../src/embedded/call/CallControls.tsx"],"sourcesContent":["import { OwnCapability } from '@stream-io/video-client';\nimport {\n Restricted,\n useCallStateHooks,\n useI18n,\n} from '@stream-io/video-react-bindings';\nimport {\n CancelCallConfirmButton,\n CompositeButton,\n DeviceSelectorAudioInput,\n DeviceSelectorAudioOutput,\n Icon,\n MicCaptureErrorNotification,\n ReactionsButton,\n RecordCallConfirmationButton,\n ScreenShareButton,\n ToggleAudioPublishingButton,\n ToggleVideoPublishingButton,\n WithTooltip,\n} from '../../components';\n\nimport { useCallDuration } from '../hooks';\nimport { CameraMenuWithBlur } from '../shared';\n\ninterface CallControlsProps {\n showParticipants: boolean;\n onToggleParticipants: () => void;\n}\n\n/**\n * Renders the active call control bar\n */\nexport const CallControls = ({\n showParticipants,\n onToggleParticipants,\n}: CallControlsProps) => {\n const { t } = useI18n();\n const { useCallSession } = useCallStateHooks();\n const session = useCallSession();\n const startedAt = session?.started_at;\n const { elapsed } = useCallDuration(startedAt);\n\n return (\n <div className=\"str-video__embedded-call-controls str-video__call-controls\">\n <div className=\"str-video__call-controls--group str-video__call-controls--options\">\n <Restricted requiredGrants={[OwnCapability.CREATE_REACTION]}>\n <div className=\"str-video__embedded-mobile\">\n <ReactionsButton />\n </div>\n </Restricted>\n {startedAt && (\n <div className=\"str-video__embedded-call-duration str-video__embedded-desktop\">\n <Icon\n icon=\"verified\"\n className=\"str-video__embedded-call-duration__icon\"\n />\n <span className=\"str-video__embedded-call-duration__time\">\n {elapsed}\n </span>\n </div>\n )}\n </div>\n <div className=\"str-video__call-controls--group str-video__call-controls--media\">\n <Restricted\n requiredGrants={[OwnCapability.SEND_AUDIO]}\n hasPermissionsOnly\n >\n <MicCaptureErrorNotification>\n <ToggleAudioPublishingButton\n Menu={\n <>\n <DeviceSelectorAudioInput\n visualType=\"list\"\n title={t('Microphone')}\n />\n <DeviceSelectorAudioOutput\n visualType=\"list\"\n title={t('Speaker')}\n />\n </>\n }\n menuPlacement=\"top\"\n />\n </MicCaptureErrorNotification>\n </Restricted>\n <Restricted\n requiredGrants={[OwnCapability.SEND_VIDEO]}\n hasPermissionsOnly\n >\n <ToggleVideoPublishingButton\n Menu={<CameraMenuWithBlur />}\n menuPlacement=\"top\"\n />\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.CREATE_REACTION]}>\n <div className=\"str-video__embedded-desktop\">\n <ReactionsButton />\n </div>\n </Restricted>\n <Restricted requiredGrants={[OwnCapability.SCREENSHARE]}>\n <div className=\"str-video__embedded-desktop\">\n <ScreenShareButton />\n </div>\n </Restricted>\n <RecordCallConfirmationButton />\n <div className=\"str-video__embedded-desktop\">\n <CancelCallConfirmButton />\n </div>\n </div>\n <div className=\"str-video__call-controls--group str-video__call-controls--sidebar\">\n <WithTooltip title={t('Participants')}>\n <CompositeButton\n active={showParticipants}\n aria-label={t('Participants')}\n aria-pressed={showParticipants}\n onClick={onToggleParticipants}\n >\n <Icon icon=\"participants\" />\n </CompositeButton>\n </WithTooltip>\n </div>\n </div>\n );\n};\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}
|