@stream-io/video-react-sdk 2.0.0-beta.0 → 2.0.0-beta.1
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 +24 -0
- package/dist/css/embedded.css +2592 -1498
- package/dist/css/embedded.css.map +1 -1
- package/dist/css/styles.css +2388 -1222
- package/dist/css/styles.css.map +1 -1
- package/dist/embedded.cjs.js +535 -476
- package/dist/embedded.cjs.js.map +1 -1
- package/dist/esm/index.js +10 -7
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/src/components/Avatar/Avatar.js +13 -5
- package/dist/esm/src/components/Avatar/Avatar.js.map +1 -1
- package/dist/esm/src/components/Badge/Badge.js +21 -0
- package/dist/esm/src/components/Badge/Badge.js.map +1 -0
- package/dist/esm/src/components/Button/Button.js +10 -0
- package/dist/esm/src/components/Button/Button.js.map +1 -0
- package/dist/esm/src/components/Button/CompositeButton.js +10 -17
- package/dist/esm/src/components/Button/CompositeButton.js.map +1 -1
- package/dist/esm/src/components/Button/IconButton.js +3 -9
- package/dist/esm/src/components/Button/IconButton.js.map +1 -1
- package/dist/esm/src/components/CallControls/AcceptCallButton.js +3 -2
- package/dist/esm/src/components/CallControls/AcceptCallButton.js.map +1 -1
- package/dist/esm/src/components/CallControls/CallControls.js +3 -0
- package/dist/esm/src/components/CallControls/CallControls.js.map +1 -1
- package/dist/esm/src/components/CallControls/CancelCallButton.js +11 -6
- package/dist/esm/src/components/CallControls/CancelCallButton.js.map +1 -1
- package/dist/esm/src/components/CallControls/ReactionsButton.js +7 -3
- package/dist/esm/src/components/CallControls/ReactionsButton.js.map +1 -1
- package/dist/esm/src/components/CallControls/RecordCallButton.js +17 -11
- package/dist/esm/src/components/CallControls/RecordCallButton.js.map +1 -1
- package/dist/esm/src/components/CallControls/ScreenShareButton.js +11 -4
- package/dist/esm/src/components/CallControls/ScreenShareButton.js.map +1 -1
- package/dist/esm/src/components/CallControls/ToggleAudioButton.js +28 -17
- package/dist/esm/src/components/CallControls/ToggleAudioButton.js.map +1 -1
- package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js +9 -4
- package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js.map +1 -1
- package/dist/esm/src/components/CallControls/ToggleVideoButton.js +32 -23
- package/dist/esm/src/components/CallControls/ToggleVideoButton.js.map +1 -1
- package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js +3 -3
- package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js.map +1 -1
- package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js +8 -3
- package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js.map +1 -1
- package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js +20 -7
- package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js.map +1 -1
- package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js +8 -5
- package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js.map +1 -1
- package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js +5 -2
- package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js.map +1 -1
- package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js +7 -3
- package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js.map +1 -1
- package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js +1 -1
- package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js.map +1 -1
- package/dist/esm/src/components/DeviceSettings/DeviceSelector.js +1 -1
- package/dist/esm/src/components/DeviceSettings/DeviceSelector.js.map +1 -1
- package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js +2 -2
- package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js.map +1 -1
- package/dist/esm/src/components/DeviceSettings/DeviceSettings.js +8 -5
- package/dist/esm/src/components/DeviceSettings/DeviceSettings.js.map +1 -1
- package/dist/esm/src/components/DeviceSettings/SpeakerTest.js +10 -4
- package/dist/esm/src/components/DeviceSettings/SpeakerTest.js.map +1 -1
- package/dist/esm/src/components/DropdownSelect/DropdownSelect.js +1 -1
- package/dist/esm/src/components/DropdownSelect/DropdownSelect.js.map +1 -1
- package/dist/esm/src/components/Menu/GenericMenu.js +2 -1
- package/dist/esm/src/components/Menu/GenericMenu.js.map +1 -1
- package/dist/esm/src/components/Menu/MenuToggle.js +3 -0
- package/dist/esm/src/components/Menu/MenuToggle.js.map +1 -1
- package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js +6 -3
- package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js.map +1 -1
- package/dist/esm/src/components/Notification/Notification.js +12 -3
- package/dist/esm/src/components/Notification/Notification.js.map +1 -1
- package/dist/esm/src/components/Notification/PermissionNotification.js +2 -2
- package/dist/esm/src/components/Notification/PermissionNotification.js.map +1 -1
- package/dist/esm/src/components/Notification/RecordingInProgressNotification.js +7 -3
- package/dist/esm/src/components/Notification/RecordingInProgressNotification.js.map +1 -1
- package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js +7 -2
- package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js.map +1 -1
- package/dist/esm/src/components/Permissions/PermissionRequests.js +13 -12
- package/dist/esm/src/components/Permissions/PermissionRequests.js.map +1 -1
- package/dist/esm/src/components/RingingCall/RingingCall.js +38 -14
- package/dist/esm/src/components/RingingCall/RingingCall.js.map +1 -1
- package/dist/esm/src/components/RingingCall/RingingCallControls.js +7 -3
- package/dist/esm/src/components/RingingCall/RingingCallControls.js.map +1 -1
- package/dist/esm/src/components/Search/SearchInput.js +1 -1
- package/dist/esm/src/components/Search/SearchInput.js.map +1 -1
- package/dist/esm/src/components/StreamTheme/StreamTheme.js +2 -2
- package/dist/esm/src/components/StreamTheme/StreamTheme.js.map +1 -1
- package/dist/esm/src/components/Tooltip/Tooltip.js +8 -8
- package/dist/esm/src/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/esm/src/components/VideoPreview/VideoPreview.js +36 -5
- package/dist/esm/src/components/VideoPreview/VideoPreview.js.map +1 -1
- package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js +38 -12
- package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js.map +1 -1
- package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js +9 -5
- package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js.map +1 -1
- package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js +9 -6
- package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js.map +1 -1
- package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js +9 -6
- package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js.map +1 -1
- package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js +11 -6
- package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js.map +1 -1
- package/dist/esm/src/core/components/ParticipantView/ConnectionQualityIndicator.js +25 -0
- package/dist/esm/src/core/components/ParticipantView/ConnectionQualityIndicator.js.map +1 -0
- package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js +17 -13
- package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js.map +1 -1
- package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js +13 -8
- package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js.map +1 -1
- package/dist/esm/src/core/components/StreamVideo/StreamVideo.js +24 -3
- package/dist/esm/src/core/components/StreamVideo/StreamVideo.js.map +1 -1
- package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js +3 -13
- package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js.map +1 -1
- package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js +4 -2
- package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js.map +1 -1
- package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js +4 -2
- package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js.map +1 -1
- package/dist/esm/src/embedded/EmbeddedClientProvider.js +7 -4
- package/dist/esm/src/embedded/EmbeddedClientProvider.js.map +1 -1
- package/dist/esm/src/embedded/call/CallControls.js +10 -6
- package/dist/esm/src/embedded/call/CallControls.js.map +1 -1
- package/dist/esm/src/embedded/call/CallHeader.js +10 -7
- package/dist/esm/src/embedded/call/CallHeader.js.map +1 -1
- package/dist/esm/src/embedded/call/CallLayout.js +8 -5
- package/dist/esm/src/embedded/call/CallLayout.js.map +1 -1
- package/dist/esm/src/embedded/call/CallStateRouter.js +7 -4
- package/dist/esm/src/embedded/call/CallStateRouter.js.map +1 -1
- package/dist/esm/src/embedded/hooks/useLayout.js +7 -4
- package/dist/esm/src/embedded/hooks/useLayout.js.map +1 -1
- package/dist/esm/src/embedded/livestream/host/HostLayout.js +12 -7
- package/dist/esm/src/embedded/livestream/host/HostLayout.js.map +1 -1
- package/dist/esm/src/embedded/livestream/host/HostStateRouter.js +12 -7
- package/dist/esm/src/embedded/livestream/host/HostStateRouter.js.map +1 -1
- package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js +9 -6
- package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js.map +1 -1
- package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js +12 -9
- package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js.map +1 -1
- package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js +7 -4
- package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js.map +1 -1
- package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js +13 -9
- package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js.map +1 -1
- package/dist/esm/src/embedded/shared/CallDuration/CallDuration.js +40 -0
- package/dist/esm/src/embedded/shared/CallDuration/CallDuration.js.map +1 -0
- package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js +8 -6
- package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js.map +1 -1
- package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js +26 -2
- package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js.map +1 -1
- package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js +12 -6
- package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js.map +1 -1
- package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js +8 -6
- package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js.map +1 -1
- package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js +15 -14
- package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js.map +1 -1
- package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js +4 -0
- package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js.map +1 -1
- package/dist/esm/src/embedded/shared/JoinError/JoinError.js +8 -6
- package/dist/esm/src/embedded/shared/JoinError/JoinError.js.map +1 -1
- package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js +11 -7
- package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js.map +1 -1
- package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js +6 -4
- package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js.map +1 -1
- package/dist/esm/src/embedded/shared/Lobby/Lobby.js +10 -9
- package/dist/esm/src/embedded/shared/Lobby/Lobby.js.map +1 -1
- package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js +6 -4
- package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js.map +1 -1
- package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js +8 -6
- package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js.map +1 -1
- package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js +11 -9
- package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js.map +1 -1
- package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js +6 -4
- package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js.map +1 -1
- package/dist/esm/src/hooks/useDeviceList.js +4 -2
- package/dist/esm/src/hooks/useDeviceList.js.map +1 -1
- package/dist/esm/src/i18n/Streami18n.js +58 -0
- package/dist/esm/src/i18n/Streami18n.js.map +1 -0
- package/dist/esm/src/i18n/TranslationContext.js +42 -0
- package/dist/esm/src/i18n/TranslationContext.js.map +1 -0
- package/dist/esm/src/i18n/runtimeDefaults.js +20 -0
- package/dist/esm/src/i18n/runtimeDefaults.js.map +1 -0
- package/dist/esm/src/i18n/useStreami18n.js +49 -0
- package/dist/esm/src/i18n/useStreami18n.js.map +1 -0
- package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js +4 -0
- package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js.map +1 -1
- package/dist/index.cjs.js +559 -623
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/src/components/Avatar/Avatar.d.ts +9 -4
- package/dist/src/components/Badge/Badge.d.ts +23 -0
- package/dist/src/components/Badge/index.d.ts +1 -0
- package/dist/src/components/Button/Button.d.ts +16 -0
- package/dist/src/components/Button/CompositeButton.d.ts +6 -3
- package/dist/src/components/Button/IconButton.d.ts +7 -7
- package/dist/src/components/Button/index.d.ts +2 -2
- package/dist/src/components/CallControls/CancelCallButton.d.ts +3 -1
- package/dist/src/components/CallControls/ToggleAudioButton.d.ts +3 -3
- package/dist/src/components/CallControls/ToggleAudioOutputButton.d.ts +2 -2
- package/dist/src/components/CallControls/ToggleVideoButton.d.ts +3 -3
- package/dist/src/components/CallControls/index.d.ts +0 -1
- package/dist/src/components/Menu/GenericMenu.d.ts +1 -0
- package/dist/src/components/Notification/Notification.d.ts +2 -1
- package/dist/src/components/StreamTheme/StreamTheme.d.ts +2 -1
- package/dist/src/components/VideoPreview/VideoPreview.d.ts +6 -1
- package/dist/src/components/index.d.ts +1 -1
- package/dist/src/core/components/ParticipantView/ConnectionQualityIndicator.d.ts +10 -0
- package/dist/src/core/components/ParticipantView/index.d.ts +1 -0
- package/dist/src/core/components/StreamVideo/StreamVideo.d.ts +18 -2
- package/dist/src/embedded/shared/CallDuration/CallDuration.d.ts +9 -0
- package/dist/src/embedded/shared/index.d.ts +1 -0
- package/dist/src/i18n/Streami18n.d.ts +56 -0
- package/dist/src/i18n/TranslationContext.d.ts +30 -0
- package/dist/src/i18n/index.d.ts +16 -0
- package/dist/src/i18n/keys.d.ts +164 -0
- package/dist/src/i18n/runtimeDefaults.d.ts +17 -0
- package/dist/src/i18n/types.d.ts +45 -0
- package/dist/src/i18n/useStreami18n.d.ts +19 -0
- package/index.ts +1 -1
- package/package.json +18 -13
- package/src/components/Avatar/Avatar.tsx +53 -19
- package/src/components/Badge/Badge.tsx +48 -0
- package/src/components/Badge/index.ts +1 -0
- package/src/components/Button/Button.tsx +49 -0
- package/src/components/Button/CompositeButton.tsx +82 -73
- package/src/components/Button/IconButton.tsx +19 -29
- package/src/components/Button/index.ts +2 -2
- package/src/components/CallControls/AcceptCallButton.tsx +3 -1
- package/src/components/CallControls/CancelCallButton.tsx +32 -24
- package/src/components/CallControls/ReactionsButton.tsx +7 -3
- package/src/components/CallControls/RecordCallButton.tsx +50 -23
- package/src/components/CallControls/ScreenShareButton.tsx +27 -6
- package/src/components/CallControls/ToggleAudioButton.tsx +62 -61
- package/src/components/CallControls/ToggleAudioOutputButton.tsx +7 -4
- package/src/components/CallControls/ToggleVideoButton.tsx +66 -66
- package/src/components/CallControls/index.ts +0 -1
- package/src/components/CallParticipantsList/BlockedUserListing.tsx +9 -2
- package/src/components/CallParticipantsList/CallParticipantListHeader.tsx +10 -3
- package/src/components/CallParticipantsList/CallParticipantListingItem.tsx +33 -8
- package/src/components/CallParticipantsList/CallParticipantsList.tsx +21 -5
- package/src/components/CallParticipantsList/EmptyParticipantSearchList.tsx +2 -2
- package/src/components/CallRecordingList/CallRecordingListHeader.tsx +11 -3
- package/src/components/DeviceSettings/DeviceAudioPreviewItem.tsx +3 -1
- package/src/components/DeviceSettings/DeviceSelector.tsx +1 -1
- package/src/components/DeviceSettings/DeviceSelectorAudio.tsx +2 -7
- package/src/components/DeviceSettings/DeviceSettings.tsx +14 -5
- package/src/components/DeviceSettings/SpeakerTest.tsx +7 -2
- package/src/components/DropdownSelect/DropdownSelect.tsx +3 -1
- package/src/components/Menu/GenericMenu.tsx +4 -0
- package/src/components/Notification/MicCaptureErrorNotification.tsx +7 -2
- package/src/components/Notification/Notification.tsx +20 -4
- package/src/components/Notification/PermissionNotification.tsx +2 -0
- package/src/components/Notification/RecordingInProgressNotification.tsx +5 -6
- package/src/components/Notification/SpeakingWhileMutedNotification.tsx +8 -2
- package/src/components/Permissions/PermissionRequests.tsx +50 -43
- package/src/components/RingingCall/RingingCall.tsx +40 -14
- package/src/components/RingingCall/RingingCallControls.tsx +2 -1
- package/src/components/Search/SearchInput.tsx +2 -3
- package/src/components/StreamTheme/StreamTheme.tsx +3 -1
- package/src/components/Tooltip/Tooltip.tsx +3 -10
- package/src/components/VideoPreview/VideoPreview.tsx +50 -5
- package/src/components/index.ts +1 -1
- package/src/core/components/CallLayout/LivestreamLayout.tsx +48 -18
- package/src/core/components/CallLayout/PaginatedGridLayout.tsx +14 -0
- package/src/core/components/CallLayout/PipLayout/Grid.tsx +10 -2
- package/src/core/components/CallLayout/PipLayout/Pip.tsx +6 -2
- package/src/core/components/CallLayout/SpeakerLayout.tsx +27 -0
- package/src/core/components/CallLayout/partcipantFilter.test.ts +38 -31
- package/src/core/components/ParticipantView/ConnectionQualityIndicator.tsx +54 -0
- package/src/core/components/ParticipantView/DefaultParticipantViewUI.tsx +60 -27
- package/src/core/components/ParticipantView/ParticipantActionsContextMenu.tsx +63 -22
- package/src/core/components/ParticipantView/index.ts +1 -0
- package/src/core/components/StreamVideo/StreamVideo.tsx +39 -4
- package/src/core/components/Video/BaseVideoPlaceholder.tsx +13 -30
- package/src/core/components/Video/DefaultPictureInPicturePlaceholder.tsx +5 -2
- package/src/core/components/Video/DefaultVideoPlaceholder.tsx +2 -2
- package/src/embedded/call/CallControls.tsx +9 -18
- package/src/embedded/call/CallHeader.tsx +3 -12
- package/src/embedded/call/CallLayout.tsx +1 -1
- package/src/embedded/livestream/host/HostLayout.tsx +26 -20
- package/src/embedded/livestream/host/HostStateRouter.tsx +12 -8
- package/src/embedded/livestream/viewer/ViewerLayout.tsx +8 -11
- package/src/embedded/livestream/viewer/ViewerLobby.tsx +31 -15
- package/src/embedded/shared/BlurToggleButton/BlurToggleButton.tsx +18 -12
- package/src/embedded/shared/CallDuration/CallDuration.tsx +32 -0
- package/src/embedded/shared/CallFeedback/CallEndedScreen.tsx +27 -13
- package/src/embedded/shared/CallFeedback/RatingScreen.tsx +20 -12
- package/src/embedded/shared/CallFeedback/StarRating.tsx +10 -3
- package/src/embedded/shared/CallFeedback/ThankYouScreen.tsx +6 -3
- package/src/embedded/shared/ConnectionNotification/ConnectionNotification.tsx +21 -14
- package/src/embedded/shared/JoinError/JoinError.tsx +7 -6
- package/src/embedded/shared/Lobby/DeviceControls.tsx +25 -3
- package/src/embedded/shared/Lobby/Lobby.tsx +19 -22
- package/src/embedded/shared/Lobby/ToggleMicButton.tsx +10 -3
- package/src/embedded/shared/Lobby/VideoPreviewFallbacks.tsx +4 -2
- package/src/embedded/shared/index.ts +1 -0
- package/src/hooks/useDeviceList.tsx +2 -2
- package/src/i18n/Streami18n.ts +67 -0
- package/src/i18n/TranslationContext.tsx +55 -0
- package/src/i18n/index.ts +22 -0
- package/src/i18n/keys.ts +169 -0
- package/src/i18n/runtimeDefaults.ts +17 -0
- package/src/i18n/types.ts +78 -0
- package/src/i18n/useStreami18n.ts +66 -0
- package/src/utilities/filter.test.ts +132 -124
- package/src/utilities/normalizeString.test.ts +50 -48
- package/dist/embedded-CallStatsLatencyChart-CpL1M_s0.cjs.js +0 -59
- package/dist/embedded-CallStatsLatencyChart-CpL1M_s0.cjs.js.map +0 -1
- package/dist/esm/src/components/Button/TextButton.js +0 -8
- package/dist/esm/src/components/Button/TextButton.js.map +0 -1
- package/dist/esm/src/components/CallControls/CallStatsButton.js +0 -18
- package/dist/esm/src/components/CallControls/CallStatsButton.js.map +0 -1
- package/dist/esm/src/components/CallStats/CallStats.js +0 -180
- package/dist/esm/src/components/CallStats/CallStats.js.map +0 -1
- package/dist/esm/src/components/CallStats/CallStatsLatencyChart.js +0 -57
- package/dist/esm/src/components/CallStats/CallStatsLatencyChart.js.map +0 -1
- package/dist/esm/src/translations/en.json.js +0 -177
- package/dist/esm/src/translations/en.json.js.map +0 -1
- package/dist/esm/src/translations/index.js +0 -6
- package/dist/esm/src/translations/index.js.map +0 -1
- package/dist/latency-chart-CpL1M_s0.cjs.js +0 -59
- package/dist/latency-chart-CpL1M_s0.cjs.js.map +0 -1
- package/dist/src/components/Button/TextButton.d.ts +0 -2
- package/dist/src/components/CallControls/CallStatsButton.d.ts +0 -4
- package/dist/src/components/CallStats/CallStats.d.ts +0 -22
- package/dist/src/components/CallStats/CallStatsLatencyChart.d.ts +0 -7
- package/dist/src/components/CallStats/index.d.ts +0 -1
- package/dist/src/translations/index.d.ts +0 -146
- package/src/components/Button/TextButton.tsx +0 -12
- package/src/components/CallControls/CallStatsButton.tsx +0 -37
- package/src/components/CallStats/CallStats.tsx +0 -439
- package/src/components/CallStats/CallStatsLatencyChart.tsx +0 -76
- package/src/components/CallStats/index.ts +0 -1
- package/src/translations/en.json +0 -154
- package/src/translations/index.ts +0 -3
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
export declare const translations: {
|
|
2
|
-
en: {
|
|
3
|
-
Joining: string;
|
|
4
|
-
Mic: string;
|
|
5
|
-
"No internet connection": string;
|
|
6
|
-
"Re-connecting": string;
|
|
7
|
-
Ringing: string;
|
|
8
|
-
"Screen Share": string;
|
|
9
|
-
"Select a Camera": string;
|
|
10
|
-
"Select a Mic": string;
|
|
11
|
-
"Select Speakers": string;
|
|
12
|
-
Speakers: string;
|
|
13
|
-
Video: string;
|
|
14
|
-
"You are muted. Unmute to speak.": string;
|
|
15
|
-
"Background filters performance is degraded. Consider disabling filters for better performance.": string;
|
|
16
|
-
Live: string;
|
|
17
|
-
"Livestream starts soon": string;
|
|
18
|
-
"Livestream starts at {{ time }}": string;
|
|
19
|
-
"{{ count }} participants joined early_one": string;
|
|
20
|
-
"{{ count }} participants joined early_other": string;
|
|
21
|
-
"You can now speak.": string;
|
|
22
|
-
"Awaiting for an approval to speak.": string;
|
|
23
|
-
"You can no longer speak.": string;
|
|
24
|
-
"You can now share your video.": string;
|
|
25
|
-
"Awaiting for an approval to share your video.": string;
|
|
26
|
-
"You can no longer share your video.": string;
|
|
27
|
-
"Waiting for recording to stop...": string;
|
|
28
|
-
"Waiting for recording to start...": string;
|
|
29
|
-
"Record call": string;
|
|
30
|
-
Reactions: string;
|
|
31
|
-
Statistics: string;
|
|
32
|
-
"You can now share your screen.": string;
|
|
33
|
-
"Awaiting for an approval to share screen.": string;
|
|
34
|
-
"You can no longer share your screen.": string;
|
|
35
|
-
"Share screen": string;
|
|
36
|
-
"Incoming Call...": string;
|
|
37
|
-
"Calling...": string;
|
|
38
|
-
"Mute All": string;
|
|
39
|
-
Invite: string;
|
|
40
|
-
Join: string;
|
|
41
|
-
You: string;
|
|
42
|
-
Me: string;
|
|
43
|
-
Unknown: string;
|
|
44
|
-
"Toggle device menu": string;
|
|
45
|
-
Default: string;
|
|
46
|
-
"Call Recordings": string;
|
|
47
|
-
Refresh: string;
|
|
48
|
-
"Check your browser video permissions": string;
|
|
49
|
-
"Video publishing is disabled by the system": string;
|
|
50
|
-
"You have no permission to share your video": string;
|
|
51
|
-
"You have no permission to share your audio": string;
|
|
52
|
-
"You are presenting your screen": string;
|
|
53
|
-
"Stop Screen Sharing": string;
|
|
54
|
-
"Audio is blocked by your system": string;
|
|
55
|
-
"Click or tap to play audio": string;
|
|
56
|
-
Allow: string;
|
|
57
|
-
Revoke: string;
|
|
58
|
-
Dismiss: string;
|
|
59
|
-
"Microphone on": string;
|
|
60
|
-
"Microphone off": string;
|
|
61
|
-
"Microphone is paused by your system": string;
|
|
62
|
-
"Camera on": string;
|
|
63
|
-
"Camera off": string;
|
|
64
|
-
"Camera is paused by your system": string;
|
|
65
|
-
"No camera found": string;
|
|
66
|
-
"Video is disabled": string;
|
|
67
|
-
Pinned: string;
|
|
68
|
-
Unpin: string;
|
|
69
|
-
Pin: string;
|
|
70
|
-
"Pin for everyone": string;
|
|
71
|
-
"Unpin for everyone": string;
|
|
72
|
-
Block: string;
|
|
73
|
-
Kick: string;
|
|
74
|
-
"Turn off video": string;
|
|
75
|
-
"Turn off screen share": string;
|
|
76
|
-
"Mute audio": string;
|
|
77
|
-
"Mute screen share audio": string;
|
|
78
|
-
"Allow audio": string;
|
|
79
|
-
"Allow video": string;
|
|
80
|
-
"Allow screen sharing": string;
|
|
81
|
-
"Disable audio": string;
|
|
82
|
-
"Disable video": string;
|
|
83
|
-
"Disable screen sharing": string;
|
|
84
|
-
Enter: string;
|
|
85
|
-
Leave: string;
|
|
86
|
-
"Leave call": string;
|
|
87
|
-
"End call for all": string;
|
|
88
|
-
"{{ direction }} fullscreen": string;
|
|
89
|
-
"{{ direction }} picture-in-picture": string;
|
|
90
|
-
"Dominant Speaker": string;
|
|
91
|
-
"Poor connection quality": string;
|
|
92
|
-
"Video paused due to insufficient bandwidth": string;
|
|
93
|
-
"Audio is connecting...": string;
|
|
94
|
-
"Video is connecting...": string;
|
|
95
|
-
Participants: string;
|
|
96
|
-
Anonymous: string;
|
|
97
|
-
"No participants found": string;
|
|
98
|
-
"Participants ({{ numberOfParticipants }})": string;
|
|
99
|
-
"{{ userName }} is sharing their screen": string;
|
|
100
|
-
"{{ userName }} is requesting to speak": string;
|
|
101
|
-
"{{ userName }} is requesting to share their camera": string;
|
|
102
|
-
"{{ userName }} is requesting to present their screen": string;
|
|
103
|
-
"{{ userName }} is requesting permission: {{ permission }}": string;
|
|
104
|
-
"Applying...": string;
|
|
105
|
-
"Disable blur": string;
|
|
106
|
-
"Blur background": string;
|
|
107
|
-
"Migrating...": string;
|
|
108
|
-
"Reconnecting...": string;
|
|
109
|
-
"You are offline. Check your internet connection.": string;
|
|
110
|
-
"Failed to restore connection. Please try again.": string;
|
|
111
|
-
"Failed to join. Please try again.": string;
|
|
112
|
-
"Set up your call before joining": string;
|
|
113
|
-
"Please grant your browser permission to access your camera and microphone.": string;
|
|
114
|
-
"Start call": string;
|
|
115
|
-
Speaker: string;
|
|
116
|
-
Microphone: string;
|
|
117
|
-
Backstage: string;
|
|
118
|
-
"Go Live": string;
|
|
119
|
-
"Stop Live": string;
|
|
120
|
-
"Enter Backstage": string;
|
|
121
|
-
"Prepare your livestream": string;
|
|
122
|
-
"Ready to go live": string;
|
|
123
|
-
"Stream is ready!": string;
|
|
124
|
-
"Waiting for the livestream to start": string;
|
|
125
|
-
"{{ count }} waiting": string;
|
|
126
|
-
"Join Stream": string;
|
|
127
|
-
"Join automatically when stream starts": string;
|
|
128
|
-
"Display name": string;
|
|
129
|
-
"Permission needed": string;
|
|
130
|
-
"Call ended": string;
|
|
131
|
-
"Rejoin call": string;
|
|
132
|
-
"Left by mistake?": string;
|
|
133
|
-
"Help us improve": string;
|
|
134
|
-
"Leave feedback": string;
|
|
135
|
-
"Failed to rejoin. Please try again.": string;
|
|
136
|
-
"Share your feedback": string;
|
|
137
|
-
"Tell us about your experience...": string;
|
|
138
|
-
"Submit feedback": string;
|
|
139
|
-
"Feedback message": string;
|
|
140
|
-
"How was your call quality?": string;
|
|
141
|
-
"Rate {{ count }} star_one": string;
|
|
142
|
-
"Rate {{ count }} star_other": string;
|
|
143
|
-
"Thank you!": string;
|
|
144
|
-
"Your feedback helps improve call quality.": string;
|
|
145
|
-
};
|
|
146
|
-
};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { ComponentProps } from 'react';
|
|
2
|
-
|
|
3
|
-
export const TextButton = ({
|
|
4
|
-
children,
|
|
5
|
-
...rest
|
|
6
|
-
}: Omit<ComponentProps<'button'>, 'ref' | 'className'>) => {
|
|
7
|
-
return (
|
|
8
|
-
<button {...rest} className="str-video__text-button">
|
|
9
|
-
{children}
|
|
10
|
-
</button>
|
|
11
|
-
);
|
|
12
|
-
};
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { forwardRef } from 'react';
|
|
2
|
-
import { useI18n } from '@stream-io/video-react-bindings';
|
|
3
|
-
|
|
4
|
-
import { CallStats } from '../CallStats';
|
|
5
|
-
import { CompositeButton } from '../Button/';
|
|
6
|
-
import { MenuToggle, ToggleMenuButtonProps } from '../Menu';
|
|
7
|
-
import { Icon } from '../Icon';
|
|
8
|
-
|
|
9
|
-
export type CallStatsButtonProps = {
|
|
10
|
-
caption?: string;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export const CallStatsButton = () => (
|
|
14
|
-
<MenuToggle placement="top-end" ToggleButton={ToggleMenuButton}>
|
|
15
|
-
<CallStats />
|
|
16
|
-
</MenuToggle>
|
|
17
|
-
);
|
|
18
|
-
|
|
19
|
-
const ToggleMenuButton = forwardRef<
|
|
20
|
-
HTMLDivElement,
|
|
21
|
-
ToggleMenuButtonProps<HTMLDivElement> & CallStatsButtonProps
|
|
22
|
-
>(function ToggleMenuButtonRender(props, ref) {
|
|
23
|
-
const { t } = useI18n();
|
|
24
|
-
const { caption, menuShown } = props;
|
|
25
|
-
|
|
26
|
-
return (
|
|
27
|
-
<CompositeButton
|
|
28
|
-
ref={ref}
|
|
29
|
-
active={menuShown}
|
|
30
|
-
caption={caption}
|
|
31
|
-
title={caption || t('Statistics')}
|
|
32
|
-
data-testid="stats-button"
|
|
33
|
-
>
|
|
34
|
-
<Icon icon="stats" />
|
|
35
|
-
</CompositeButton>
|
|
36
|
-
);
|
|
37
|
-
});
|
|
@@ -1,439 +0,0 @@
|
|
|
1
|
-
import { lazy, ReactNode, Suspense, useEffect, useRef, useState } from 'react';
|
|
2
|
-
import clsx from 'clsx';
|
|
3
|
-
import {
|
|
4
|
-
AggregatedStatsReport,
|
|
5
|
-
CallStatsReport,
|
|
6
|
-
SfuModels,
|
|
7
|
-
} from '@stream-io/video-client';
|
|
8
|
-
import { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';
|
|
9
|
-
import { useFloating, useHover, useInteractions } from '@floating-ui/react';
|
|
10
|
-
import { Icon } from '../Icon';
|
|
11
|
-
|
|
12
|
-
const CallStatsLatencyChart = lazy(() => import('./CallStatsLatencyChart'));
|
|
13
|
-
|
|
14
|
-
enum Status {
|
|
15
|
-
GOOD = 'Good',
|
|
16
|
-
OK = 'Ok',
|
|
17
|
-
BAD = 'Bad',
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export type CallStatsProps = {
|
|
21
|
-
latencyLowBound?: number;
|
|
22
|
-
latencyHighBound?: number;
|
|
23
|
-
audioJitterLowBound?: number;
|
|
24
|
-
audioJitterHighBound?: number;
|
|
25
|
-
videoJitterLowBound?: number;
|
|
26
|
-
videoJitterHighBound?: number;
|
|
27
|
-
showCodecInfo?: boolean;
|
|
28
|
-
LatencyChartSuspenseFallback?: ReactNode;
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
export const CallStats = (props: CallStatsProps) => {
|
|
32
|
-
const {
|
|
33
|
-
latencyLowBound = 75,
|
|
34
|
-
latencyHighBound = 400,
|
|
35
|
-
audioJitterLowBound = 10,
|
|
36
|
-
audioJitterHighBound = 30,
|
|
37
|
-
videoJitterLowBound = 20,
|
|
38
|
-
videoJitterHighBound = 50,
|
|
39
|
-
showCodecInfo = false,
|
|
40
|
-
LatencyChartSuspenseFallback = null,
|
|
41
|
-
} = props;
|
|
42
|
-
const [latencyBuffer, setLatencyBuffer] = useState<
|
|
43
|
-
Array<{ x: number; y: number }>
|
|
44
|
-
>(() => {
|
|
45
|
-
const now = Date.now();
|
|
46
|
-
return Array.from({ length: 20 }, (_, i) => ({ x: now + i, y: 0 }));
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
const { t } = useI18n();
|
|
50
|
-
const [publishBitrate, setPublishBitrate] = useState('-');
|
|
51
|
-
const [subscribeBitrate, setSubscribeBitrate] = useState('-');
|
|
52
|
-
const [publishAudioBitrate, setPublishAudioBitrate] = useState('-');
|
|
53
|
-
const [subscribeAudioBitrate, setSubscribeAudioBitrate] = useState('-');
|
|
54
|
-
const previousStats = useRef<CallStatsReport>(undefined);
|
|
55
|
-
const { useCallStatsReport } = useCallStateHooks();
|
|
56
|
-
const callStatsReport = useCallStatsReport();
|
|
57
|
-
|
|
58
|
-
useEffect(() => {
|
|
59
|
-
if (!callStatsReport) return;
|
|
60
|
-
if (!previousStats.current) {
|
|
61
|
-
previousStats.current = callStatsReport;
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
const previousCallStatsReport = previousStats.current;
|
|
65
|
-
setPublishBitrate(() => {
|
|
66
|
-
return calculatePublishBitrate(previousCallStatsReport, callStatsReport);
|
|
67
|
-
});
|
|
68
|
-
setSubscribeBitrate(() => {
|
|
69
|
-
return calculateSubscribeBitrate(
|
|
70
|
-
previousCallStatsReport,
|
|
71
|
-
callStatsReport,
|
|
72
|
-
);
|
|
73
|
-
});
|
|
74
|
-
setPublishAudioBitrate(() => {
|
|
75
|
-
return calculatePublishAudioBitrate(
|
|
76
|
-
previousCallStatsReport,
|
|
77
|
-
callStatsReport,
|
|
78
|
-
);
|
|
79
|
-
});
|
|
80
|
-
setSubscribeAudioBitrate(() => {
|
|
81
|
-
return calculateSubscribeAudioBitrate(
|
|
82
|
-
previousCallStatsReport,
|
|
83
|
-
callStatsReport,
|
|
84
|
-
);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
setLatencyBuffer((latencyBuf) => {
|
|
88
|
-
const newLatencyBuffer = latencyBuf.slice(-19);
|
|
89
|
-
newLatencyBuffer.push({
|
|
90
|
-
x: callStatsReport.timestamp,
|
|
91
|
-
y:
|
|
92
|
-
callStatsReport.publisherStats.averageRoundTripTimeInMs ||
|
|
93
|
-
callStatsReport.publisherAudioStats.averageRoundTripTimeInMs,
|
|
94
|
-
});
|
|
95
|
-
return newLatencyBuffer;
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
previousStats.current = callStatsReport;
|
|
99
|
-
}, [callStatsReport]);
|
|
100
|
-
|
|
101
|
-
const latencyComparison = {
|
|
102
|
-
lowBound: latencyLowBound,
|
|
103
|
-
highBound: latencyHighBound,
|
|
104
|
-
value: callStatsReport?.publisherStats.averageRoundTripTimeInMs || 0,
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
const audioJitterComparison = {
|
|
108
|
-
lowBound: audioJitterLowBound,
|
|
109
|
-
highBound: audioJitterHighBound,
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
const videoJitterComparison = {
|
|
113
|
-
lowBound: videoJitterLowBound,
|
|
114
|
-
highBound: videoJitterHighBound,
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
return (
|
|
118
|
-
<div className="str-video__call-stats">
|
|
119
|
-
{callStatsReport && (
|
|
120
|
-
<>
|
|
121
|
-
<div className="str-video__call-stats__header">
|
|
122
|
-
<h3 className="str-video__call-stats__heading">
|
|
123
|
-
<Icon
|
|
124
|
-
className="str-video__call-stats__icon"
|
|
125
|
-
icon="call-latency"
|
|
126
|
-
/>
|
|
127
|
-
{t('Call Latency')}
|
|
128
|
-
</h3>
|
|
129
|
-
<p className="str-video__call-stats__description">
|
|
130
|
-
{t(
|
|
131
|
-
'Very high latency values may reduce call quality, cause lag, and make the call less enjoyable.',
|
|
132
|
-
)}
|
|
133
|
-
</p>
|
|
134
|
-
</div>
|
|
135
|
-
|
|
136
|
-
<div className="str-video__call-stats__latencychart">
|
|
137
|
-
<Suspense fallback={LatencyChartSuspenseFallback}>
|
|
138
|
-
<CallStatsLatencyChart values={latencyBuffer} />
|
|
139
|
-
</Suspense>
|
|
140
|
-
</div>
|
|
141
|
-
|
|
142
|
-
<div className="str-video__call-stats__header">
|
|
143
|
-
<h3 className="str-video__call-stats__heading">
|
|
144
|
-
<Icon
|
|
145
|
-
className="str-video__call-stats__icon"
|
|
146
|
-
icon="network-quality"
|
|
147
|
-
/>
|
|
148
|
-
{t('Video performance')}
|
|
149
|
-
</h3>
|
|
150
|
-
<p className="str-video__call-stats__description">
|
|
151
|
-
{t('Review the key data points below to assess call performance')}
|
|
152
|
-
</p>
|
|
153
|
-
</div>
|
|
154
|
-
|
|
155
|
-
<div className="str-video__call-stats__card-container">
|
|
156
|
-
<StatCard label={t('Region')} value={callStatsReport.datacenter} />
|
|
157
|
-
<StatCard
|
|
158
|
-
label={t('Latency')}
|
|
159
|
-
value={`${callStatsReport.publisherStats.averageRoundTripTimeInMs} ms.`}
|
|
160
|
-
comparison={latencyComparison}
|
|
161
|
-
/>
|
|
162
|
-
<StatCard
|
|
163
|
-
label={t('Receive jitter')}
|
|
164
|
-
value={`${callStatsReport.subscriberStats.averageJitterInMs} ms.`}
|
|
165
|
-
comparison={{
|
|
166
|
-
...videoJitterComparison,
|
|
167
|
-
value: callStatsReport.subscriberStats.averageJitterInMs,
|
|
168
|
-
}}
|
|
169
|
-
/>
|
|
170
|
-
<StatCard
|
|
171
|
-
label={t('Publish jitter')}
|
|
172
|
-
value={`${callStatsReport.publisherStats.averageJitterInMs} ms.`}
|
|
173
|
-
comparison={{
|
|
174
|
-
...videoJitterComparison,
|
|
175
|
-
value: callStatsReport.publisherStats.averageJitterInMs,
|
|
176
|
-
}}
|
|
177
|
-
/>
|
|
178
|
-
<StatCard
|
|
179
|
-
label={`${t('Publish resolution')}${showCodecInfo ? formatCodec(callStatsReport) : ''}`}
|
|
180
|
-
value={toFrameSize(callStatsReport.publisherStats)}
|
|
181
|
-
/>
|
|
182
|
-
<StatCard
|
|
183
|
-
label={t('Publish quality drop reason')}
|
|
184
|
-
value={callStatsReport.publisherStats.qualityLimitationReasons}
|
|
185
|
-
/>
|
|
186
|
-
<StatCard
|
|
187
|
-
label={t('Receiving resolution')}
|
|
188
|
-
value={toFrameSize(callStatsReport.subscriberStats)}
|
|
189
|
-
/>
|
|
190
|
-
<StatCard
|
|
191
|
-
label={t('Receive quality drop reason')}
|
|
192
|
-
value={callStatsReport.subscriberStats.qualityLimitationReasons}
|
|
193
|
-
/>
|
|
194
|
-
<StatCard label={t('Publish bitrate')} value={publishBitrate} />
|
|
195
|
-
<StatCard label={t('Receiving bitrate')} value={subscribeBitrate} />
|
|
196
|
-
</div>
|
|
197
|
-
|
|
198
|
-
<div className="str-video__call-stats__header">
|
|
199
|
-
<h3 className="str-video__call-stats__heading">
|
|
200
|
-
<Icon className="str-video__call-stats__icon" icon="mic" />
|
|
201
|
-
{t('Audio Performance')}
|
|
202
|
-
</h3>
|
|
203
|
-
<p className="str-video__call-stats__description">
|
|
204
|
-
{t(
|
|
205
|
-
'Review the key audio data points below to assess audio performance',
|
|
206
|
-
)}
|
|
207
|
-
</p>
|
|
208
|
-
</div>
|
|
209
|
-
|
|
210
|
-
<div className="str-video__call-stats__card-container">
|
|
211
|
-
<StatCard
|
|
212
|
-
label={t('Latency')}
|
|
213
|
-
value={`${callStatsReport.publisherAudioStats.averageRoundTripTimeInMs} ms.`}
|
|
214
|
-
comparison={latencyComparison}
|
|
215
|
-
/>
|
|
216
|
-
<StatCard
|
|
217
|
-
label={t('Audio codec')}
|
|
218
|
-
value={formatAudioCodec(callStatsReport)}
|
|
219
|
-
/>
|
|
220
|
-
<StatCard
|
|
221
|
-
label={t('Audio bitrate (publish)')}
|
|
222
|
-
value={publishAudioBitrate}
|
|
223
|
-
/>
|
|
224
|
-
<StatCard
|
|
225
|
-
label={t('Audio bitrate (receive)')}
|
|
226
|
-
value={subscribeAudioBitrate}
|
|
227
|
-
/>
|
|
228
|
-
<StatCard
|
|
229
|
-
label={t('Audio jitter (publish)')}
|
|
230
|
-
value={`${callStatsReport.publisherAudioStats.averageJitterInMs} ms.`}
|
|
231
|
-
comparison={{
|
|
232
|
-
...audioJitterComparison,
|
|
233
|
-
value: callStatsReport.publisherAudioStats.averageJitterInMs,
|
|
234
|
-
}}
|
|
235
|
-
/>
|
|
236
|
-
<StatCard
|
|
237
|
-
label={t('Audio jitter (receive)')}
|
|
238
|
-
value={`${callStatsReport.subscriberAudioStats.averageJitterInMs} ms.`}
|
|
239
|
-
comparison={{
|
|
240
|
-
...audioJitterComparison,
|
|
241
|
-
value: callStatsReport.subscriberAudioStats.averageJitterInMs,
|
|
242
|
-
}}
|
|
243
|
-
/>
|
|
244
|
-
</div>
|
|
245
|
-
</>
|
|
246
|
-
)}
|
|
247
|
-
</div>
|
|
248
|
-
);
|
|
249
|
-
};
|
|
250
|
-
|
|
251
|
-
const StatCardExplanation = (props: { description: string }) => {
|
|
252
|
-
const { description } = props;
|
|
253
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
254
|
-
|
|
255
|
-
const { refs, floatingStyles, context } = useFloating({
|
|
256
|
-
open: isOpen,
|
|
257
|
-
onOpenChange: setIsOpen,
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
const hover = useHover(context);
|
|
261
|
-
|
|
262
|
-
const { getReferenceProps, getFloatingProps } = useInteractions([hover]);
|
|
263
|
-
|
|
264
|
-
return (
|
|
265
|
-
<>
|
|
266
|
-
<div
|
|
267
|
-
className="str-video__call-explanation"
|
|
268
|
-
ref={refs.setReference}
|
|
269
|
-
{...getReferenceProps()}
|
|
270
|
-
>
|
|
271
|
-
<Icon className="str-video__call-explanation__icon" icon="info" />
|
|
272
|
-
</div>
|
|
273
|
-
{isOpen && (
|
|
274
|
-
<div
|
|
275
|
-
className="str-video__call-explanation__description"
|
|
276
|
-
ref={refs.setFloating}
|
|
277
|
-
style={floatingStyles}
|
|
278
|
-
{...getFloatingProps()}
|
|
279
|
-
>
|
|
280
|
-
{description}
|
|
281
|
-
</div>
|
|
282
|
-
)}
|
|
283
|
-
</>
|
|
284
|
-
);
|
|
285
|
-
};
|
|
286
|
-
|
|
287
|
-
const StatsTag = (props: { children: ReactNode; status: Status }) => {
|
|
288
|
-
const { children, status } = props;
|
|
289
|
-
return (
|
|
290
|
-
<div
|
|
291
|
-
className={clsx('str-video__call-stats__tag', {
|
|
292
|
-
'str-video__call-stats__tag--good': status === Status.GOOD,
|
|
293
|
-
'str-video__call-stats__tag--ok': status === Status.OK,
|
|
294
|
-
'str-video__call-stats__tag--bad': status === Status.BAD,
|
|
295
|
-
})}
|
|
296
|
-
>
|
|
297
|
-
<div className="str-video__call-stats__tag__text">{children}</div>
|
|
298
|
-
</div>
|
|
299
|
-
);
|
|
300
|
-
};
|
|
301
|
-
|
|
302
|
-
export const StatCard = (props: {
|
|
303
|
-
label: string;
|
|
304
|
-
value: string | ReactNode;
|
|
305
|
-
description?: string;
|
|
306
|
-
comparison?: { value: number; highBound: number; lowBound: number };
|
|
307
|
-
}) => {
|
|
308
|
-
const { label, value, description, comparison } = props;
|
|
309
|
-
|
|
310
|
-
const { t } = useI18n();
|
|
311
|
-
const status = comparison ? toStatus(comparison) : undefined;
|
|
312
|
-
|
|
313
|
-
return (
|
|
314
|
-
<div className="str-video__call-stats__card">
|
|
315
|
-
<div className="str-video__call-stats__card-content">
|
|
316
|
-
<div className="str-video__call-stats__card-label">
|
|
317
|
-
{label}
|
|
318
|
-
{description && <StatCardExplanation description={description} />}
|
|
319
|
-
</div>
|
|
320
|
-
<div className="str-video__call-stats__card-value">{value}</div>
|
|
321
|
-
</div>
|
|
322
|
-
{status && <StatsTag status={status}>{t(status)}</StatsTag>}
|
|
323
|
-
</div>
|
|
324
|
-
);
|
|
325
|
-
};
|
|
326
|
-
|
|
327
|
-
const toStatus = (config: {
|
|
328
|
-
value: number;
|
|
329
|
-
lowBound: number;
|
|
330
|
-
highBound: number;
|
|
331
|
-
}): Status => {
|
|
332
|
-
const { value, lowBound, highBound } = config;
|
|
333
|
-
if (value <= lowBound) return Status.GOOD;
|
|
334
|
-
if (value >= lowBound && value <= highBound) return Status.OK;
|
|
335
|
-
if (value >= highBound) return Status.BAD;
|
|
336
|
-
return Status.GOOD;
|
|
337
|
-
};
|
|
338
|
-
|
|
339
|
-
const toFrameSize = (stats: AggregatedStatsReport) => {
|
|
340
|
-
const {
|
|
341
|
-
highestFrameWidth: w,
|
|
342
|
-
highestFrameHeight: h,
|
|
343
|
-
highestFramesPerSecond: fps,
|
|
344
|
-
} = stats;
|
|
345
|
-
let size = `-`;
|
|
346
|
-
if (w && h) {
|
|
347
|
-
size = `${w}x${h}`;
|
|
348
|
-
if (fps) {
|
|
349
|
-
size += `@${fps}fps.`;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
return size;
|
|
353
|
-
};
|
|
354
|
-
|
|
355
|
-
const formatCodec = (callStatsReport: CallStatsReport): string => {
|
|
356
|
-
const { codecPerTrackType } = callStatsReport.publisherStats;
|
|
357
|
-
if (!codecPerTrackType || !codecPerTrackType[SfuModels.TrackType.VIDEO]) {
|
|
358
|
-
return '';
|
|
359
|
-
}
|
|
360
|
-
const [, name] = codecPerTrackType[SfuModels.TrackType.VIDEO].split('/');
|
|
361
|
-
return name ? ` (${name})` : '';
|
|
362
|
-
};
|
|
363
|
-
|
|
364
|
-
const formatAudioCodec = (callStatsReport: CallStatsReport): string => {
|
|
365
|
-
const { codecPerTrackType } = callStatsReport.publisherAudioStats;
|
|
366
|
-
if (!codecPerTrackType || !codecPerTrackType[SfuModels.TrackType.AUDIO]) {
|
|
367
|
-
return '';
|
|
368
|
-
}
|
|
369
|
-
const [, name] = codecPerTrackType[SfuModels.TrackType.AUDIO].split('/');
|
|
370
|
-
return name ?? '';
|
|
371
|
-
};
|
|
372
|
-
|
|
373
|
-
const calculatePublishBitrate = (
|
|
374
|
-
previousCallStatsReport: CallStatsReport,
|
|
375
|
-
callStatsReport: CallStatsReport,
|
|
376
|
-
) => {
|
|
377
|
-
const {
|
|
378
|
-
publisherStats: {
|
|
379
|
-
totalBytesSent: previousTotalBytesSent,
|
|
380
|
-
timestamp: previousTimestamp,
|
|
381
|
-
},
|
|
382
|
-
} = previousCallStatsReport;
|
|
383
|
-
|
|
384
|
-
const {
|
|
385
|
-
publisherStats: { totalBytesSent, timestamp },
|
|
386
|
-
} = callStatsReport;
|
|
387
|
-
|
|
388
|
-
const bytesSent = totalBytesSent - previousTotalBytesSent;
|
|
389
|
-
const timeElapsed = timestamp - previousTimestamp;
|
|
390
|
-
return `${((bytesSent * 8) / timeElapsed).toFixed(2)} kbps`;
|
|
391
|
-
};
|
|
392
|
-
|
|
393
|
-
const calculateSubscribeBitrate = (
|
|
394
|
-
previousCallStatsReport: CallStatsReport,
|
|
395
|
-
callStatsReport: CallStatsReport,
|
|
396
|
-
) => {
|
|
397
|
-
const {
|
|
398
|
-
subscriberStats: {
|
|
399
|
-
totalBytesReceived: previousTotalBytesReceived,
|
|
400
|
-
timestamp: previousTimestamp,
|
|
401
|
-
},
|
|
402
|
-
} = previousCallStatsReport;
|
|
403
|
-
|
|
404
|
-
const {
|
|
405
|
-
subscriberStats: { totalBytesReceived, timestamp },
|
|
406
|
-
} = callStatsReport;
|
|
407
|
-
|
|
408
|
-
const bytesReceived = totalBytesReceived - previousTotalBytesReceived;
|
|
409
|
-
const timeElapsed = timestamp - previousTimestamp;
|
|
410
|
-
return `${((bytesReceived * 8) / timeElapsed).toFixed(2)} kbps`;
|
|
411
|
-
};
|
|
412
|
-
|
|
413
|
-
const calculatePublishAudioBitrate = (
|
|
414
|
-
previousCallStatsReport: CallStatsReport,
|
|
415
|
-
callStatsReport: CallStatsReport,
|
|
416
|
-
) => {
|
|
417
|
-
const previousAudioStats = previousCallStatsReport.publisherAudioStats;
|
|
418
|
-
const audioStats = callStatsReport.publisherAudioStats;
|
|
419
|
-
|
|
420
|
-
const bytesSent =
|
|
421
|
-
audioStats.totalBytesSent - previousAudioStats.totalBytesSent;
|
|
422
|
-
const timeElapsed = audioStats.timestamp - previousAudioStats.timestamp;
|
|
423
|
-
|
|
424
|
-
return `${((bytesSent * 8) / timeElapsed).toFixed(2)} kbps`;
|
|
425
|
-
};
|
|
426
|
-
|
|
427
|
-
const calculateSubscribeAudioBitrate = (
|
|
428
|
-
previousCallStatsReport: CallStatsReport,
|
|
429
|
-
callStatsReport: CallStatsReport,
|
|
430
|
-
) => {
|
|
431
|
-
const previousAudioStats = previousCallStatsReport.subscriberAudioStats;
|
|
432
|
-
const audioStats = callStatsReport.subscriberAudioStats;
|
|
433
|
-
|
|
434
|
-
const bytesReceived =
|
|
435
|
-
audioStats.totalBytesReceived - previousAudioStats.totalBytesReceived;
|
|
436
|
-
const timeElapsed = audioStats.timestamp - previousAudioStats.timestamp;
|
|
437
|
-
|
|
438
|
-
return `${((bytesReceived * 8) / timeElapsed).toFixed(2)} kbps`;
|
|
439
|
-
};
|