@stream-io/video-react-sdk 1.43.2 → 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 +18 -19
- 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,180 +0,0 @@
|
|
|
1
|
-
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
-
import { lazy, useState, useRef, useEffect, Suspense } from 'react';
|
|
3
|
-
import clsx from 'clsx';
|
|
4
|
-
import { SfuModels } from '@stream-io/video-client';
|
|
5
|
-
import { useI18n, useCallStateHooks } from '@stream-io/video-react-bindings';
|
|
6
|
-
import { useFloating, useHover, useInteractions } from '@floating-ui/react';
|
|
7
|
-
import { Icon } from '../Icon/Icon.js';
|
|
8
|
-
|
|
9
|
-
const CallStatsLatencyChart = lazy(() => import('./CallStatsLatencyChart.js'));
|
|
10
|
-
var Status;
|
|
11
|
-
(function (Status) {
|
|
12
|
-
Status["GOOD"] = "Good";
|
|
13
|
-
Status["OK"] = "Ok";
|
|
14
|
-
Status["BAD"] = "Bad";
|
|
15
|
-
})(Status || (Status = {}));
|
|
16
|
-
const CallStats = (props) => {
|
|
17
|
-
const { latencyLowBound = 75, latencyHighBound = 400, audioJitterLowBound = 10, audioJitterHighBound = 30, videoJitterLowBound = 20, videoJitterHighBound = 50, showCodecInfo = false, LatencyChartSuspenseFallback = null, } = props;
|
|
18
|
-
const [latencyBuffer, setLatencyBuffer] = useState(() => {
|
|
19
|
-
const now = Date.now();
|
|
20
|
-
return Array.from({ length: 20 }, (_, i) => ({ x: now + i, y: 0 }));
|
|
21
|
-
});
|
|
22
|
-
const { t } = useI18n();
|
|
23
|
-
const [publishBitrate, setPublishBitrate] = useState('-');
|
|
24
|
-
const [subscribeBitrate, setSubscribeBitrate] = useState('-');
|
|
25
|
-
const [publishAudioBitrate, setPublishAudioBitrate] = useState('-');
|
|
26
|
-
const [subscribeAudioBitrate, setSubscribeAudioBitrate] = useState('-');
|
|
27
|
-
const previousStats = useRef(undefined);
|
|
28
|
-
const { useCallStatsReport } = useCallStateHooks();
|
|
29
|
-
const callStatsReport = useCallStatsReport();
|
|
30
|
-
useEffect(() => {
|
|
31
|
-
if (!callStatsReport)
|
|
32
|
-
return;
|
|
33
|
-
if (!previousStats.current) {
|
|
34
|
-
previousStats.current = callStatsReport;
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
const previousCallStatsReport = previousStats.current;
|
|
38
|
-
setPublishBitrate(() => {
|
|
39
|
-
return calculatePublishBitrate(previousCallStatsReport, callStatsReport);
|
|
40
|
-
});
|
|
41
|
-
setSubscribeBitrate(() => {
|
|
42
|
-
return calculateSubscribeBitrate(previousCallStatsReport, callStatsReport);
|
|
43
|
-
});
|
|
44
|
-
setPublishAudioBitrate(() => {
|
|
45
|
-
return calculatePublishAudioBitrate(previousCallStatsReport, callStatsReport);
|
|
46
|
-
});
|
|
47
|
-
setSubscribeAudioBitrate(() => {
|
|
48
|
-
return calculateSubscribeAudioBitrate(previousCallStatsReport, callStatsReport);
|
|
49
|
-
});
|
|
50
|
-
setLatencyBuffer((latencyBuf) => {
|
|
51
|
-
const newLatencyBuffer = latencyBuf.slice(-19);
|
|
52
|
-
newLatencyBuffer.push({
|
|
53
|
-
x: callStatsReport.timestamp,
|
|
54
|
-
y: callStatsReport.publisherStats.averageRoundTripTimeInMs ||
|
|
55
|
-
callStatsReport.publisherAudioStats.averageRoundTripTimeInMs,
|
|
56
|
-
});
|
|
57
|
-
return newLatencyBuffer;
|
|
58
|
-
});
|
|
59
|
-
previousStats.current = callStatsReport;
|
|
60
|
-
}, [callStatsReport]);
|
|
61
|
-
const latencyComparison = {
|
|
62
|
-
lowBound: latencyLowBound,
|
|
63
|
-
highBound: latencyHighBound,
|
|
64
|
-
value: callStatsReport?.publisherStats.averageRoundTripTimeInMs || 0,
|
|
65
|
-
};
|
|
66
|
-
const audioJitterComparison = {
|
|
67
|
-
lowBound: audioJitterLowBound,
|
|
68
|
-
highBound: audioJitterHighBound,
|
|
69
|
-
};
|
|
70
|
-
const videoJitterComparison = {
|
|
71
|
-
lowBound: videoJitterLowBound,
|
|
72
|
-
highBound: videoJitterHighBound,
|
|
73
|
-
};
|
|
74
|
-
return (jsx("div", { className: "str-video__call-stats", children: callStatsReport && (jsxs(Fragment, { children: [jsxs("div", { className: "str-video__call-stats__header", children: [jsxs("h3", { className: "str-video__call-stats__heading", children: [jsx(Icon, { className: "str-video__call-stats__icon", icon: "call-latency" }), t('Call Latency')] }), jsx("p", { className: "str-video__call-stats__description", children: t('Very high latency values may reduce call quality, cause lag, and make the call less enjoyable.') })] }), jsx("div", { className: "str-video__call-stats__latencychart", children: jsx(Suspense, { fallback: LatencyChartSuspenseFallback, children: jsx(CallStatsLatencyChart, { values: latencyBuffer }) }) }), jsxs("div", { className: "str-video__call-stats__header", children: [jsxs("h3", { className: "str-video__call-stats__heading", children: [jsx(Icon, { className: "str-video__call-stats__icon", icon: "network-quality" }), t('Video performance')] }), jsx("p", { className: "str-video__call-stats__description", children: t('Review the key data points below to assess call performance') })] }), jsxs("div", { className: "str-video__call-stats__card-container", children: [jsx(StatCard, { label: t('Region'), value: callStatsReport.datacenter }), jsx(StatCard, { label: t('Latency'), value: `${callStatsReport.publisherStats.averageRoundTripTimeInMs} ms.`, comparison: latencyComparison }), jsx(StatCard, { label: t('Receive jitter'), value: `${callStatsReport.subscriberStats.averageJitterInMs} ms.`, comparison: {
|
|
75
|
-
...videoJitterComparison,
|
|
76
|
-
value: callStatsReport.subscriberStats.averageJitterInMs,
|
|
77
|
-
} }), jsx(StatCard, { label: t('Publish jitter'), value: `${callStatsReport.publisherStats.averageJitterInMs} ms.`, comparison: {
|
|
78
|
-
...videoJitterComparison,
|
|
79
|
-
value: callStatsReport.publisherStats.averageJitterInMs,
|
|
80
|
-
} }), jsx(StatCard, { label: `${t('Publish resolution')}${showCodecInfo ? formatCodec(callStatsReport) : ''}`, value: toFrameSize(callStatsReport.publisherStats) }), jsx(StatCard, { label: t('Publish quality drop reason'), value: callStatsReport.publisherStats.qualityLimitationReasons }), jsx(StatCard, { label: t('Receiving resolution'), value: toFrameSize(callStatsReport.subscriberStats) }), jsx(StatCard, { label: t('Receive quality drop reason'), value: callStatsReport.subscriberStats.qualityLimitationReasons }), jsx(StatCard, { label: t('Publish bitrate'), value: publishBitrate }), jsx(StatCard, { label: t('Receiving bitrate'), value: subscribeBitrate })] }), jsxs("div", { className: "str-video__call-stats__header", children: [jsxs("h3", { className: "str-video__call-stats__heading", children: [jsx(Icon, { className: "str-video__call-stats__icon", icon: "mic" }), t('Audio Performance')] }), jsx("p", { className: "str-video__call-stats__description", children: t('Review the key audio data points below to assess audio performance') })] }), jsxs("div", { className: "str-video__call-stats__card-container", children: [jsx(StatCard, { label: t('Latency'), value: `${callStatsReport.publisherAudioStats.averageRoundTripTimeInMs} ms.`, comparison: latencyComparison }), jsx(StatCard, { label: t('Audio codec'), value: formatAudioCodec(callStatsReport) }), jsx(StatCard, { label: t('Audio bitrate (publish)'), value: publishAudioBitrate }), jsx(StatCard, { label: t('Audio bitrate (receive)'), value: subscribeAudioBitrate }), jsx(StatCard, { label: t('Audio jitter (publish)'), value: `${callStatsReport.publisherAudioStats.averageJitterInMs} ms.`, comparison: {
|
|
81
|
-
...audioJitterComparison,
|
|
82
|
-
value: callStatsReport.publisherAudioStats.averageJitterInMs,
|
|
83
|
-
} }), jsx(StatCard, { label: t('Audio jitter (receive)'), value: `${callStatsReport.subscriberAudioStats.averageJitterInMs} ms.`, comparison: {
|
|
84
|
-
...audioJitterComparison,
|
|
85
|
-
value: callStatsReport.subscriberAudioStats.averageJitterInMs,
|
|
86
|
-
} })] })] })) }));
|
|
87
|
-
};
|
|
88
|
-
const StatCardExplanation = (props) => {
|
|
89
|
-
const { description } = props;
|
|
90
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
91
|
-
const { refs, floatingStyles, context } = useFloating({
|
|
92
|
-
open: isOpen,
|
|
93
|
-
onOpenChange: setIsOpen,
|
|
94
|
-
});
|
|
95
|
-
const hover = useHover(context);
|
|
96
|
-
const { getReferenceProps, getFloatingProps } = useInteractions([hover]);
|
|
97
|
-
return (jsxs(Fragment, { children: [jsx("div", { className: "str-video__call-explanation", ref: refs.setReference, ...getReferenceProps(), children: jsx(Icon, { className: "str-video__call-explanation__icon", icon: "info" }) }), isOpen && (jsx("div", { className: "str-video__call-explanation__description", ref: refs.setFloating, style: floatingStyles, ...getFloatingProps(), children: description }))] }));
|
|
98
|
-
};
|
|
99
|
-
const StatsTag = (props) => {
|
|
100
|
-
const { children, status } = props;
|
|
101
|
-
return (jsx("div", { className: clsx('str-video__call-stats__tag', {
|
|
102
|
-
'str-video__call-stats__tag--good': status === Status.GOOD,
|
|
103
|
-
'str-video__call-stats__tag--ok': status === Status.OK,
|
|
104
|
-
'str-video__call-stats__tag--bad': status === Status.BAD,
|
|
105
|
-
}), children: jsx("div", { className: "str-video__call-stats__tag__text", children: children }) }));
|
|
106
|
-
};
|
|
107
|
-
const StatCard = (props) => {
|
|
108
|
-
const { label, value, description, comparison } = props;
|
|
109
|
-
const { t } = useI18n();
|
|
110
|
-
const status = comparison ? toStatus(comparison) : undefined;
|
|
111
|
-
return (jsxs("div", { className: "str-video__call-stats__card", children: [jsxs("div", { className: "str-video__call-stats__card-content", children: [jsxs("div", { className: "str-video__call-stats__card-label", children: [label, description && jsx(StatCardExplanation, { description: description })] }), jsx("div", { className: "str-video__call-stats__card-value", children: value })] }), status && jsx(StatsTag, { status: status, children: t(status) })] }));
|
|
112
|
-
};
|
|
113
|
-
const toStatus = (config) => {
|
|
114
|
-
const { value, lowBound, highBound } = config;
|
|
115
|
-
if (value <= lowBound)
|
|
116
|
-
return Status.GOOD;
|
|
117
|
-
if (value >= lowBound && value <= highBound)
|
|
118
|
-
return Status.OK;
|
|
119
|
-
if (value >= highBound)
|
|
120
|
-
return Status.BAD;
|
|
121
|
-
return Status.GOOD;
|
|
122
|
-
};
|
|
123
|
-
const toFrameSize = (stats) => {
|
|
124
|
-
const { highestFrameWidth: w, highestFrameHeight: h, highestFramesPerSecond: fps, } = stats;
|
|
125
|
-
let size = `-`;
|
|
126
|
-
if (w && h) {
|
|
127
|
-
size = `${w}x${h}`;
|
|
128
|
-
if (fps) {
|
|
129
|
-
size += `@${fps}fps.`;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return size;
|
|
133
|
-
};
|
|
134
|
-
const formatCodec = (callStatsReport) => {
|
|
135
|
-
const { codecPerTrackType } = callStatsReport.publisherStats;
|
|
136
|
-
if (!codecPerTrackType || !codecPerTrackType[SfuModels.TrackType.VIDEO]) {
|
|
137
|
-
return '';
|
|
138
|
-
}
|
|
139
|
-
const [, name] = codecPerTrackType[SfuModels.TrackType.VIDEO].split('/');
|
|
140
|
-
return name ? ` (${name})` : '';
|
|
141
|
-
};
|
|
142
|
-
const formatAudioCodec = (callStatsReport) => {
|
|
143
|
-
const { codecPerTrackType } = callStatsReport.publisherAudioStats;
|
|
144
|
-
if (!codecPerTrackType || !codecPerTrackType[SfuModels.TrackType.AUDIO]) {
|
|
145
|
-
return '';
|
|
146
|
-
}
|
|
147
|
-
const [, name] = codecPerTrackType[SfuModels.TrackType.AUDIO].split('/');
|
|
148
|
-
return name ?? '';
|
|
149
|
-
};
|
|
150
|
-
const calculatePublishBitrate = (previousCallStatsReport, callStatsReport) => {
|
|
151
|
-
const { publisherStats: { totalBytesSent: previousTotalBytesSent, timestamp: previousTimestamp, }, } = previousCallStatsReport;
|
|
152
|
-
const { publisherStats: { totalBytesSent, timestamp }, } = callStatsReport;
|
|
153
|
-
const bytesSent = totalBytesSent - previousTotalBytesSent;
|
|
154
|
-
const timeElapsed = timestamp - previousTimestamp;
|
|
155
|
-
return `${((bytesSent * 8) / timeElapsed).toFixed(2)} kbps`;
|
|
156
|
-
};
|
|
157
|
-
const calculateSubscribeBitrate = (previousCallStatsReport, callStatsReport) => {
|
|
158
|
-
const { subscriberStats: { totalBytesReceived: previousTotalBytesReceived, timestamp: previousTimestamp, }, } = previousCallStatsReport;
|
|
159
|
-
const { subscriberStats: { totalBytesReceived, timestamp }, } = callStatsReport;
|
|
160
|
-
const bytesReceived = totalBytesReceived - previousTotalBytesReceived;
|
|
161
|
-
const timeElapsed = timestamp - previousTimestamp;
|
|
162
|
-
return `${((bytesReceived * 8) / timeElapsed).toFixed(2)} kbps`;
|
|
163
|
-
};
|
|
164
|
-
const calculatePublishAudioBitrate = (previousCallStatsReport, callStatsReport) => {
|
|
165
|
-
const previousAudioStats = previousCallStatsReport.publisherAudioStats;
|
|
166
|
-
const audioStats = callStatsReport.publisherAudioStats;
|
|
167
|
-
const bytesSent = audioStats.totalBytesSent - previousAudioStats.totalBytesSent;
|
|
168
|
-
const timeElapsed = audioStats.timestamp - previousAudioStats.timestamp;
|
|
169
|
-
return `${((bytesSent * 8) / timeElapsed).toFixed(2)} kbps`;
|
|
170
|
-
};
|
|
171
|
-
const calculateSubscribeAudioBitrate = (previousCallStatsReport, callStatsReport) => {
|
|
172
|
-
const previousAudioStats = previousCallStatsReport.subscriberAudioStats;
|
|
173
|
-
const audioStats = callStatsReport.subscriberAudioStats;
|
|
174
|
-
const bytesReceived = audioStats.totalBytesReceived - previousAudioStats.totalBytesReceived;
|
|
175
|
-
const timeElapsed = audioStats.timestamp - previousAudioStats.timestamp;
|
|
176
|
-
return `${((bytesReceived * 8) / timeElapsed).toFixed(2)} kbps`;
|
|
177
|
-
};
|
|
178
|
-
|
|
179
|
-
export { CallStats, StatCard };
|
|
180
|
-
//# sourceMappingURL=CallStats.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CallStats.js","sources":["../../../../../../../src/components/CallStats/CallStats.tsx"],"sourcesContent":["import { lazy, ReactNode, Suspense, useEffect, useRef, useState } from 'react';\nimport clsx from 'clsx';\nimport {\n AggregatedStatsReport,\n CallStatsReport,\n SfuModels,\n} from '@stream-io/video-client';\nimport { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';\nimport { useFloating, useHover, useInteractions } from '@floating-ui/react';\nimport { Icon } from '../Icon';\n\nconst CallStatsLatencyChart = lazy(() => import('./CallStatsLatencyChart'));\n\nenum Status {\n GOOD = 'Good',\n OK = 'Ok',\n BAD = 'Bad',\n}\n\nexport type CallStatsProps = {\n latencyLowBound?: number;\n latencyHighBound?: number;\n audioJitterLowBound?: number;\n audioJitterHighBound?: number;\n videoJitterLowBound?: number;\n videoJitterHighBound?: number;\n showCodecInfo?: boolean;\n LatencyChartSuspenseFallback?: ReactNode;\n};\n\nexport const CallStats = (props: CallStatsProps) => {\n const {\n latencyLowBound = 75,\n latencyHighBound = 400,\n audioJitterLowBound = 10,\n audioJitterHighBound = 30,\n videoJitterLowBound = 20,\n videoJitterHighBound = 50,\n showCodecInfo = false,\n LatencyChartSuspenseFallback = null,\n } = props;\n const [latencyBuffer, setLatencyBuffer] = useState<\n Array<{ x: number; y: number }>\n >(() => {\n const now = Date.now();\n return Array.from({ length: 20 }, (_, i) => ({ x: now + i, y: 0 }));\n });\n\n const { t } = useI18n();\n const [publishBitrate, setPublishBitrate] = useState('-');\n const [subscribeBitrate, setSubscribeBitrate] = useState('-');\n const [publishAudioBitrate, setPublishAudioBitrate] = useState('-');\n const [subscribeAudioBitrate, setSubscribeAudioBitrate] = useState('-');\n const previousStats = useRef<CallStatsReport>(undefined);\n const { useCallStatsReport } = useCallStateHooks();\n const callStatsReport = useCallStatsReport();\n\n useEffect(() => {\n if (!callStatsReport) return;\n if (!previousStats.current) {\n previousStats.current = callStatsReport;\n return;\n }\n const previousCallStatsReport = previousStats.current;\n setPublishBitrate(() => {\n return calculatePublishBitrate(previousCallStatsReport, callStatsReport);\n });\n setSubscribeBitrate(() => {\n return calculateSubscribeBitrate(\n previousCallStatsReport,\n callStatsReport,\n );\n });\n setPublishAudioBitrate(() => {\n return calculatePublishAudioBitrate(\n previousCallStatsReport,\n callStatsReport,\n );\n });\n setSubscribeAudioBitrate(() => {\n return calculateSubscribeAudioBitrate(\n previousCallStatsReport,\n callStatsReport,\n );\n });\n\n setLatencyBuffer((latencyBuf) => {\n const newLatencyBuffer = latencyBuf.slice(-19);\n newLatencyBuffer.push({\n x: callStatsReport.timestamp,\n y:\n callStatsReport.publisherStats.averageRoundTripTimeInMs ||\n callStatsReport.publisherAudioStats.averageRoundTripTimeInMs,\n });\n return newLatencyBuffer;\n });\n\n previousStats.current = callStatsReport;\n }, [callStatsReport]);\n\n const latencyComparison = {\n lowBound: latencyLowBound,\n highBound: latencyHighBound,\n value: callStatsReport?.publisherStats.averageRoundTripTimeInMs || 0,\n };\n\n const audioJitterComparison = {\n lowBound: audioJitterLowBound,\n highBound: audioJitterHighBound,\n };\n\n const videoJitterComparison = {\n lowBound: videoJitterLowBound,\n highBound: videoJitterHighBound,\n };\n\n return (\n <div className=\"str-video__call-stats\">\n {callStatsReport && (\n <>\n <div className=\"str-video__call-stats__header\">\n <h3 className=\"str-video__call-stats__heading\">\n <Icon\n className=\"str-video__call-stats__icon\"\n icon=\"call-latency\"\n />\n {t('Call Latency')}\n </h3>\n <p className=\"str-video__call-stats__description\">\n {t(\n 'Very high latency values may reduce call quality, cause lag, and make the call less enjoyable.',\n )}\n </p>\n </div>\n\n <div className=\"str-video__call-stats__latencychart\">\n <Suspense fallback={LatencyChartSuspenseFallback}>\n <CallStatsLatencyChart values={latencyBuffer} />\n </Suspense>\n </div>\n\n <div className=\"str-video__call-stats__header\">\n <h3 className=\"str-video__call-stats__heading\">\n <Icon\n className=\"str-video__call-stats__icon\"\n icon=\"network-quality\"\n />\n {t('Video performance')}\n </h3>\n <p className=\"str-video__call-stats__description\">\n {t('Review the key data points below to assess call performance')}\n </p>\n </div>\n\n <div className=\"str-video__call-stats__card-container\">\n <StatCard label={t('Region')} value={callStatsReport.datacenter} />\n <StatCard\n label={t('Latency')}\n value={`${callStatsReport.publisherStats.averageRoundTripTimeInMs} ms.`}\n comparison={latencyComparison}\n />\n <StatCard\n label={t('Receive jitter')}\n value={`${callStatsReport.subscriberStats.averageJitterInMs} ms.`}\n comparison={{\n ...videoJitterComparison,\n value: callStatsReport.subscriberStats.averageJitterInMs,\n }}\n />\n <StatCard\n label={t('Publish jitter')}\n value={`${callStatsReport.publisherStats.averageJitterInMs} ms.`}\n comparison={{\n ...videoJitterComparison,\n value: callStatsReport.publisherStats.averageJitterInMs,\n }}\n />\n <StatCard\n label={`${t('Publish resolution')}${showCodecInfo ? formatCodec(callStatsReport) : ''}`}\n value={toFrameSize(callStatsReport.publisherStats)}\n />\n <StatCard\n label={t('Publish quality drop reason')}\n value={callStatsReport.publisherStats.qualityLimitationReasons}\n />\n <StatCard\n label={t('Receiving resolution')}\n value={toFrameSize(callStatsReport.subscriberStats)}\n />\n <StatCard\n label={t('Receive quality drop reason')}\n value={callStatsReport.subscriberStats.qualityLimitationReasons}\n />\n <StatCard label={t('Publish bitrate')} value={publishBitrate} />\n <StatCard label={t('Receiving bitrate')} value={subscribeBitrate} />\n </div>\n\n <div className=\"str-video__call-stats__header\">\n <h3 className=\"str-video__call-stats__heading\">\n <Icon className=\"str-video__call-stats__icon\" icon=\"mic\" />\n {t('Audio Performance')}\n </h3>\n <p className=\"str-video__call-stats__description\">\n {t(\n 'Review the key audio data points below to assess audio performance',\n )}\n </p>\n </div>\n\n <div className=\"str-video__call-stats__card-container\">\n <StatCard\n label={t('Latency')}\n value={`${callStatsReport.publisherAudioStats.averageRoundTripTimeInMs} ms.`}\n comparison={latencyComparison}\n />\n <StatCard\n label={t('Audio codec')}\n value={formatAudioCodec(callStatsReport)}\n />\n <StatCard\n label={t('Audio bitrate (publish)')}\n value={publishAudioBitrate}\n />\n <StatCard\n label={t('Audio bitrate (receive)')}\n value={subscribeAudioBitrate}\n />\n <StatCard\n label={t('Audio jitter (publish)')}\n value={`${callStatsReport.publisherAudioStats.averageJitterInMs} ms.`}\n comparison={{\n ...audioJitterComparison,\n value: callStatsReport.publisherAudioStats.averageJitterInMs,\n }}\n />\n <StatCard\n label={t('Audio jitter (receive)')}\n value={`${callStatsReport.subscriberAudioStats.averageJitterInMs} ms.`}\n comparison={{\n ...audioJitterComparison,\n value: callStatsReport.subscriberAudioStats.averageJitterInMs,\n }}\n />\n </div>\n </>\n )}\n </div>\n );\n};\n\nconst StatCardExplanation = (props: { description: string }) => {\n const { description } = props;\n const [isOpen, setIsOpen] = useState(false);\n\n const { refs, floatingStyles, context } = useFloating({\n open: isOpen,\n onOpenChange: setIsOpen,\n });\n\n const hover = useHover(context);\n\n const { getReferenceProps, getFloatingProps } = useInteractions([hover]);\n\n return (\n <>\n <div\n className=\"str-video__call-explanation\"\n ref={refs.setReference}\n {...getReferenceProps()}\n >\n <Icon className=\"str-video__call-explanation__icon\" icon=\"info\" />\n </div>\n {isOpen && (\n <div\n className=\"str-video__call-explanation__description\"\n ref={refs.setFloating}\n style={floatingStyles}\n {...getFloatingProps()}\n >\n {description}\n </div>\n )}\n </>\n );\n};\n\nconst StatsTag = (props: { children: ReactNode; status: Status }) => {\n const { children, status } = props;\n return (\n <div\n className={clsx('str-video__call-stats__tag', {\n 'str-video__call-stats__tag--good': status === Status.GOOD,\n 'str-video__call-stats__tag--ok': status === Status.OK,\n 'str-video__call-stats__tag--bad': status === Status.BAD,\n })}\n >\n <div className=\"str-video__call-stats__tag__text\">{children}</div>\n </div>\n );\n};\n\nexport const StatCard = (props: {\n label: string;\n value: string | ReactNode;\n description?: string;\n comparison?: { value: number; highBound: number; lowBound: number };\n}) => {\n const { label, value, description, comparison } = props;\n\n const { t } = useI18n();\n const status = comparison ? toStatus(comparison) : undefined;\n\n return (\n <div className=\"str-video__call-stats__card\">\n <div className=\"str-video__call-stats__card-content\">\n <div className=\"str-video__call-stats__card-label\">\n {label}\n {description && <StatCardExplanation description={description} />}\n </div>\n <div className=\"str-video__call-stats__card-value\">{value}</div>\n </div>\n {status && <StatsTag status={status}>{t(status)}</StatsTag>}\n </div>\n );\n};\n\nconst toStatus = (config: {\n value: number;\n lowBound: number;\n highBound: number;\n}): Status => {\n const { value, lowBound, highBound } = config;\n if (value <= lowBound) return Status.GOOD;\n if (value >= lowBound && value <= highBound) return Status.OK;\n if (value >= highBound) return Status.BAD;\n return Status.GOOD;\n};\n\nconst toFrameSize = (stats: AggregatedStatsReport) => {\n const {\n highestFrameWidth: w,\n highestFrameHeight: h,\n highestFramesPerSecond: fps,\n } = stats;\n let size = `-`;\n if (w && h) {\n size = `${w}x${h}`;\n if (fps) {\n size += `@${fps}fps.`;\n }\n }\n return size;\n};\n\nconst formatCodec = (callStatsReport: CallStatsReport): string => {\n const { codecPerTrackType } = callStatsReport.publisherStats;\n if (!codecPerTrackType || !codecPerTrackType[SfuModels.TrackType.VIDEO]) {\n return '';\n }\n const [, name] = codecPerTrackType[SfuModels.TrackType.VIDEO].split('/');\n return name ? ` (${name})` : '';\n};\n\nconst formatAudioCodec = (callStatsReport: CallStatsReport): string => {\n const { codecPerTrackType } = callStatsReport.publisherAudioStats;\n if (!codecPerTrackType || !codecPerTrackType[SfuModels.TrackType.AUDIO]) {\n return '';\n }\n const [, name] = codecPerTrackType[SfuModels.TrackType.AUDIO].split('/');\n return name ?? '';\n};\n\nconst calculatePublishBitrate = (\n previousCallStatsReport: CallStatsReport,\n callStatsReport: CallStatsReport,\n) => {\n const {\n publisherStats: {\n totalBytesSent: previousTotalBytesSent,\n timestamp: previousTimestamp,\n },\n } = previousCallStatsReport;\n\n const {\n publisherStats: { totalBytesSent, timestamp },\n } = callStatsReport;\n\n const bytesSent = totalBytesSent - previousTotalBytesSent;\n const timeElapsed = timestamp - previousTimestamp;\n return `${((bytesSent * 8) / timeElapsed).toFixed(2)} kbps`;\n};\n\nconst calculateSubscribeBitrate = (\n previousCallStatsReport: CallStatsReport,\n callStatsReport: CallStatsReport,\n) => {\n const {\n subscriberStats: {\n totalBytesReceived: previousTotalBytesReceived,\n timestamp: previousTimestamp,\n },\n } = previousCallStatsReport;\n\n const {\n subscriberStats: { totalBytesReceived, timestamp },\n } = callStatsReport;\n\n const bytesReceived = totalBytesReceived - previousTotalBytesReceived;\n const timeElapsed = timestamp - previousTimestamp;\n return `${((bytesReceived * 8) / timeElapsed).toFixed(2)} kbps`;\n};\n\nconst calculatePublishAudioBitrate = (\n previousCallStatsReport: CallStatsReport,\n callStatsReport: CallStatsReport,\n) => {\n const previousAudioStats = previousCallStatsReport.publisherAudioStats;\n const audioStats = callStatsReport.publisherAudioStats;\n\n const bytesSent =\n audioStats.totalBytesSent - previousAudioStats.totalBytesSent;\n const timeElapsed = audioStats.timestamp - previousAudioStats.timestamp;\n\n return `${((bytesSent * 8) / timeElapsed).toFixed(2)} kbps`;\n};\n\nconst calculateSubscribeAudioBitrate = (\n previousCallStatsReport: CallStatsReport,\n callStatsReport: CallStatsReport,\n) => {\n const previousAudioStats = previousCallStatsReport.subscriberAudioStats;\n const audioStats = callStatsReport.subscriberAudioStats;\n\n const bytesReceived =\n audioStats.totalBytesReceived - previousAudioStats.totalBytesReceived;\n const timeElapsed = audioStats.timestamp - previousAudioStats.timestamp;\n\n return `${((bytesReceived * 8) / timeElapsed).toFixed(2)} kbps`;\n};\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { Chart, CategoryScale, LinearScale, LineElement, PointElement } from 'chart.js';
|
|
3
|
-
import { Line } from 'react-chartjs-2';
|
|
4
|
-
import { useMemo } from 'react';
|
|
5
|
-
|
|
6
|
-
// NOTE: this is a side effect by definition, but this component is
|
|
7
|
-
// isolated in a separate chunk, and it won't affect the rest of the app.
|
|
8
|
-
// See CallStats.tsx for more details.
|
|
9
|
-
Chart.register(CategoryScale, LinearScale, LineElement, PointElement);
|
|
10
|
-
const CallStatsLatencyChart = (props) => {
|
|
11
|
-
const { values } = props;
|
|
12
|
-
let max = 0;
|
|
13
|
-
const data = {
|
|
14
|
-
labels: values.map((point) => {
|
|
15
|
-
const date = new Date(point.x * 1000);
|
|
16
|
-
return `${date.getHours()}:${date.getMinutes()}`;
|
|
17
|
-
}),
|
|
18
|
-
datasets: [
|
|
19
|
-
{
|
|
20
|
-
data: values.map((point) => {
|
|
21
|
-
const { y } = point;
|
|
22
|
-
max = Math.max(max, y);
|
|
23
|
-
return point;
|
|
24
|
-
}),
|
|
25
|
-
borderColor: '#00e2a1',
|
|
26
|
-
backgroundColor: '#00e2a1',
|
|
27
|
-
},
|
|
28
|
-
],
|
|
29
|
-
};
|
|
30
|
-
const options = useMemo(() => getLineOptions(max), [max]);
|
|
31
|
-
return (jsx("div", { className: "str-video__call-stats-line-chart-container", children: jsx(Line, { options: options, data: data, className: "str-video__call-stats__latencychart" }) }));
|
|
32
|
-
};
|
|
33
|
-
const getLineOptions = (max) => ({
|
|
34
|
-
maintainAspectRatio: false,
|
|
35
|
-
animation: { duration: 0 },
|
|
36
|
-
elements: {
|
|
37
|
-
line: { borderWidth: 1 },
|
|
38
|
-
point: { radius: 2 },
|
|
39
|
-
},
|
|
40
|
-
scales: {
|
|
41
|
-
y: {
|
|
42
|
-
position: 'right',
|
|
43
|
-
stacked: true,
|
|
44
|
-
min: 0,
|
|
45
|
-
max: Math.max(180, Math.ceil((max + 10) / 10) * 10),
|
|
46
|
-
grid: { display: true, color: '#979ca0' },
|
|
47
|
-
ticks: { stepSize: 30 },
|
|
48
|
-
},
|
|
49
|
-
x: {
|
|
50
|
-
grid: { display: false },
|
|
51
|
-
ticks: { display: false },
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
export { CallStatsLatencyChart as default };
|
|
57
|
-
//# sourceMappingURL=CallStatsLatencyChart.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CallStatsLatencyChart.js","sources":["../../../../../../../src/components/CallStats/CallStatsLatencyChart.tsx"],"sourcesContent":["import {\n CategoryScale,\n Chart as ChartJS,\n ChartData,\n ChartOptions,\n LinearScale,\n LineElement,\n PointElement,\n} from 'chart.js';\nimport { Line } from 'react-chartjs-2';\nimport { useMemo } from 'react';\n\n// NOTE: this is a side effect by definition, but this component is\n// isolated in a separate chunk, and it won't affect the rest of the app.\n// See CallStats.tsx for more details.\nChartJS.register(CategoryScale, LinearScale, LineElement, PointElement);\n\nconst CallStatsLatencyChart = (props: {\n values: Array<{ x: number; y: number }>;\n}) => {\n const { values } = props;\n let max = 0;\n const data: ChartData<'line'> = {\n labels: values.map((point) => {\n const date = new Date(point.x * 1000);\n return `${date.getHours()}:${date.getMinutes()}`;\n }),\n datasets: [\n {\n data: values.map((point) => {\n const { y } = point;\n max = Math.max(max, y);\n return point;\n }),\n borderColor: '#00e2a1',\n backgroundColor: '#00e2a1',\n },\n ],\n };\n\n const options = useMemo(() => getLineOptions(max), [max]);\n return (\n <div className=\"str-video__call-stats-line-chart-container\">\n <Line\n options={options}\n data={data}\n className=\"str-video__call-stats__latencychart\"\n />\n </div>\n );\n};\n\nexport default CallStatsLatencyChart;\n\nconst getLineOptions = (max: number): ChartOptions<'line'> => ({\n maintainAspectRatio: false,\n animation: { duration: 0 },\n elements: {\n line: { borderWidth: 1 },\n point: { radius: 2 },\n },\n scales: {\n y: {\n position: 'right',\n stacked: true,\n min: 0,\n max: Math.max(180, Math.ceil((max + 10) / 10) * 10),\n grid: { display: true, color: '#979ca0' },\n ticks: { stepSize: 30 },\n },\n x: {\n grid: { display: false },\n ticks: { display: false },\n },\n },\n});\n"],"names":["ChartJS","_jsx"],"mappings":";;;;;AAYA;AACA;AACA;AACAA,KAAO,CAAC,QAAQ,CAAC,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC;AAEvE,MAAM,qBAAqB,GAAG,CAAC,KAE9B,KAAI;AACH,IAAA,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK;IACxB,IAAI,GAAG,GAAG,CAAC;AACX,IAAA,MAAM,IAAI,GAAsB;QAC9B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;YAC3B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;YACrC,OAAO,CAAA,EAAG,IAAI,CAAC,QAAQ,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,UAAU,EAAE,CAAA,CAAE;AAClD,QAAA,CAAC,CAAC;AACF,QAAA,QAAQ,EAAE;AACR,YAAA;gBACE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;AACzB,oBAAA,MAAM,EAAE,CAAC,EAAE,GAAG,KAAK;oBACnB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;AACtB,oBAAA,OAAO,KAAK;AACd,gBAAA,CAAC,CAAC;AACF,gBAAA,WAAW,EAAE,SAAS;AACtB,gBAAA,eAAe,EAAE,SAAS;AAC3B,aAAA;AACF,SAAA;KACF;AAED,IAAA,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACzD,QACEC,aAAK,SAAS,EAAC,4CAA4C,EAAA,QAAA,EACzDA,GAAA,CAAC,IAAI,EAAA,EACH,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,SAAS,EAAC,qCAAqC,EAAA,CAC/C,EAAA,CACE;AAEV;AAIA,MAAM,cAAc,GAAG,CAAC,GAAW,MAA4B;AAC7D,IAAA,mBAAmB,EAAE,KAAK;AAC1B,IAAA,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;AAC1B,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE;AACxB,QAAA,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;AACrB,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,CAAC,EAAE;AACD,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC;YACnD,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AACzC,YAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;AACxB,SAAA;AACD,QAAA,CAAC,EAAE;AACD,YAAA,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;AACxB,YAAA,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;AAC1B,SAAA;AACF,KAAA;AACF,CAAA,CAAC;;;;"}
|
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
var Joining = "Joining";
|
|
2
|
-
var Mic = "Mic";
|
|
3
|
-
var Ringing = "Ringing";
|
|
4
|
-
var Speakers = "Speakers";
|
|
5
|
-
var Video = "Video";
|
|
6
|
-
var Live = "Live";
|
|
7
|
-
var Reactions = "Reactions";
|
|
8
|
-
var Statistics = "Statistics";
|
|
9
|
-
var Invite = "Invite";
|
|
10
|
-
var Join = "Join";
|
|
11
|
-
var You = "You";
|
|
12
|
-
var Me = "Me";
|
|
13
|
-
var Unknown = "Unknown";
|
|
14
|
-
var Default = "Default";
|
|
15
|
-
var Refresh = "Refresh";
|
|
16
|
-
var Allow = "Allow";
|
|
17
|
-
var Revoke = "Revoke";
|
|
18
|
-
var Dismiss = "Dismiss";
|
|
19
|
-
var Pinned = "Pinned";
|
|
20
|
-
var Unpin = "Unpin";
|
|
21
|
-
var Pin = "Pin";
|
|
22
|
-
var Block = "Block";
|
|
23
|
-
var Kick = "Kick";
|
|
24
|
-
var Enter = "Enter";
|
|
25
|
-
var Leave = "Leave";
|
|
26
|
-
var Participants = "Participants";
|
|
27
|
-
var Anonymous = ", and ({{ count }}) anonymous";
|
|
28
|
-
var Speaker = "Speaker";
|
|
29
|
-
var Microphone = "Microphone";
|
|
30
|
-
var Backstage = "Backstage";
|
|
31
|
-
var en = {
|
|
32
|
-
Joining: Joining,
|
|
33
|
-
Mic: Mic,
|
|
34
|
-
"No internet connection": "No internet connection",
|
|
35
|
-
"Re-connecting": "Re-connecting",
|
|
36
|
-
Ringing: Ringing,
|
|
37
|
-
"Screen Share": "Screen Share",
|
|
38
|
-
"Select a Camera": "Select a Camera",
|
|
39
|
-
"Select a Mic": "Select a Mic",
|
|
40
|
-
"Select Speakers": "Select Speakers",
|
|
41
|
-
Speakers: Speakers,
|
|
42
|
-
Video: Video,
|
|
43
|
-
"You are muted. Unmute to speak.": "You are muted. Unmute to speak.",
|
|
44
|
-
"Background filters performance is degraded. Consider disabling filters for better performance.": "Background filters performance is degraded. Consider disabling filters for better performance.",
|
|
45
|
-
Live: Live,
|
|
46
|
-
"Livestream starts soon": "Livestream starts soon",
|
|
47
|
-
"Livestream starts at {{ time }}": "Livestream starts at {{ time }}",
|
|
48
|
-
"{{ count }} participants joined early_one": "{{ count }} participant joined early",
|
|
49
|
-
"{{ count }} participants joined early_other": "{{ count }} participants joined early",
|
|
50
|
-
"You can now speak.": "You can now speak.",
|
|
51
|
-
"Awaiting for an approval to speak.": "Awaiting for an approval to speak.",
|
|
52
|
-
"You can no longer speak.": "You can no longer speak.",
|
|
53
|
-
"You can now share your video.": "You can now share your video.",
|
|
54
|
-
"Awaiting for an approval to share your video.": "Awaiting for an approval to share your video.",
|
|
55
|
-
"You can no longer share your video.": "You can no longer share your video.",
|
|
56
|
-
"Waiting for recording to stop...": "Waiting for recording to stop...",
|
|
57
|
-
"Waiting for recording to start...": "Waiting for recording to start...",
|
|
58
|
-
"Record call": "Record call",
|
|
59
|
-
Reactions: Reactions,
|
|
60
|
-
Statistics: Statistics,
|
|
61
|
-
"You can now share your screen.": "You can now share your screen.",
|
|
62
|
-
"Awaiting for an approval to share screen.": "Awaiting for an approval to share screen.",
|
|
63
|
-
"You can no longer share your screen.": "You can no longer share your screen.",
|
|
64
|
-
"Share screen": "Share screen",
|
|
65
|
-
"Incoming Call...": "Incoming Call...",
|
|
66
|
-
"Calling...": "Calling...",
|
|
67
|
-
"Mute All": "Mute All",
|
|
68
|
-
Invite: Invite,
|
|
69
|
-
Join: Join,
|
|
70
|
-
You: You,
|
|
71
|
-
Me: Me,
|
|
72
|
-
Unknown: Unknown,
|
|
73
|
-
"Toggle device menu": "Toggle device menu",
|
|
74
|
-
Default: Default,
|
|
75
|
-
"Call Recordings": "Call Recordings",
|
|
76
|
-
Refresh: Refresh,
|
|
77
|
-
"Check your browser video permissions": "Check your browser video permissions",
|
|
78
|
-
"Video publishing is disabled by the system": "Video publishing is disabled by the system",
|
|
79
|
-
"You have no permission to share your video": "You have no permission to share your video",
|
|
80
|
-
"You have no permission to share your audio": "You have no permission to share your audio",
|
|
81
|
-
"You are presenting your screen": "You are presenting your screen",
|
|
82
|
-
"Stop Screen Sharing": "Stop Screen Sharing",
|
|
83
|
-
"Audio is blocked by your system": "Audio is blocked by your system",
|
|
84
|
-
"Click or tap to play audio": "Click or tap to play audio",
|
|
85
|
-
Allow: Allow,
|
|
86
|
-
Revoke: Revoke,
|
|
87
|
-
Dismiss: Dismiss,
|
|
88
|
-
"Microphone on": "Microphone on",
|
|
89
|
-
"Microphone off": "Microphone off",
|
|
90
|
-
"Microphone is paused by your system": "Microphone is paused by your system",
|
|
91
|
-
"Camera on": "Camera on",
|
|
92
|
-
"Camera off": "Camera off",
|
|
93
|
-
"Camera is paused by your system": "Camera is paused by your system",
|
|
94
|
-
"No camera found": "No camera found",
|
|
95
|
-
"Video is disabled": "Video is disabled",
|
|
96
|
-
Pinned: Pinned,
|
|
97
|
-
Unpin: Unpin,
|
|
98
|
-
Pin: Pin,
|
|
99
|
-
"Pin for everyone": "Pin for everyone",
|
|
100
|
-
"Unpin for everyone": "Unpin for everyone",
|
|
101
|
-
Block: Block,
|
|
102
|
-
Kick: Kick,
|
|
103
|
-
"Turn off video": "Turn off video",
|
|
104
|
-
"Turn off screen share": "Turn off screen share",
|
|
105
|
-
"Mute audio": "Mute audio",
|
|
106
|
-
"Mute screen share audio": "Mute screen share audio",
|
|
107
|
-
"Allow audio": "Allow audio",
|
|
108
|
-
"Allow video": "Allow video",
|
|
109
|
-
"Allow screen sharing": "Allow screen sharing",
|
|
110
|
-
"Disable audio": "Disable audio",
|
|
111
|
-
"Disable video": "Disable video",
|
|
112
|
-
"Disable screen sharing": "Disable screen sharing",
|
|
113
|
-
Enter: Enter,
|
|
114
|
-
Leave: Leave,
|
|
115
|
-
"Leave call": "Leave call",
|
|
116
|
-
"End call for all": "End call for all",
|
|
117
|
-
"{{ direction }} fullscreen": "{{ direction }} fullscreen",
|
|
118
|
-
"{{ direction }} picture-in-picture": "{{ direction }} picture-in-picture",
|
|
119
|
-
"Dominant Speaker": "Dominant Speaker",
|
|
120
|
-
"Poor connection quality": "Poor connection quality. Please check your internet connection.",
|
|
121
|
-
"Video paused due to insufficient bandwidth": "Video paused due to insufficient bandwidth",
|
|
122
|
-
"Audio is connecting...": "Audio is connecting...",
|
|
123
|
-
"Video is connecting...": "Video is connecting...",
|
|
124
|
-
Participants: Participants,
|
|
125
|
-
Anonymous: Anonymous,
|
|
126
|
-
"No participants found": "No participants found",
|
|
127
|
-
"Participants ({{ numberOfParticipants }})": "Participants ({{ numberOfParticipants }})",
|
|
128
|
-
"{{ userName }} is sharing their screen": "{{ userName }} is sharing their screen",
|
|
129
|
-
"{{ userName }} is requesting to speak": "{{ userName }} is requesting to speak",
|
|
130
|
-
"{{ userName }} is requesting to share their camera": "{{ userName }} is requesting to share their camera",
|
|
131
|
-
"{{ userName }} is requesting to present their screen": "{{ userName }} is requesting to present their screen",
|
|
132
|
-
"{{ userName }} is requesting permission: {{ permission }}": "{{ userName }} is requesting permission: {{ permission }}",
|
|
133
|
-
"Applying...": "Applying...",
|
|
134
|
-
"Disable blur": "Disable blur",
|
|
135
|
-
"Blur background": "Blur background",
|
|
136
|
-
"Migrating...": "Migrating...",
|
|
137
|
-
"Reconnecting...": "Reconnecting...",
|
|
138
|
-
"You are offline. Check your internet connection.": "You are offline. Check your internet connection.",
|
|
139
|
-
"Failed to restore connection. Please try again.": "Failed to restore connection. Please try again.",
|
|
140
|
-
"Failed to join. Please try again.": "Failed to join. Please try again.",
|
|
141
|
-
"Set up your call before joining": "Set up your call before joining",
|
|
142
|
-
"Please grant your browser permission to access your camera and microphone.": "Please grant your browser permission to access your camera and microphone.",
|
|
143
|
-
"Start call": "Start call",
|
|
144
|
-
Speaker: Speaker,
|
|
145
|
-
Microphone: Microphone,
|
|
146
|
-
Backstage: Backstage,
|
|
147
|
-
"Go Live": "Go Live",
|
|
148
|
-
"Stop Live": "End Live",
|
|
149
|
-
"Enter Backstage": "Enter Backstage",
|
|
150
|
-
"Prepare your livestream": "Prepare your livestream",
|
|
151
|
-
"Ready to go live": "Ready to go live",
|
|
152
|
-
"Stream is ready!": "Stream is ready!",
|
|
153
|
-
"Waiting for the livestream to start": "Waiting for the livestream to start",
|
|
154
|
-
"{{ count }} waiting": "{{ count }} waiting",
|
|
155
|
-
"Join Stream": "Join Stream",
|
|
156
|
-
"Join automatically when stream starts": "Join automatically when stream starts",
|
|
157
|
-
"Display name": "Display name",
|
|
158
|
-
"Permission needed": "Permission needed",
|
|
159
|
-
"Call ended": "Call ended",
|
|
160
|
-
"Rejoin call": "Rejoin call",
|
|
161
|
-
"Left by mistake?": "Left by mistake?",
|
|
162
|
-
"Help us improve": "Help us improve",
|
|
163
|
-
"Leave feedback": "Leave feedback",
|
|
164
|
-
"Failed to rejoin. Please try again.": "Failed to rejoin. Please try again.",
|
|
165
|
-
"Share your feedback": "Share your feedback",
|
|
166
|
-
"Tell us about your experience...": "Tell us about your experience...",
|
|
167
|
-
"Submit feedback": "Submit feedback",
|
|
168
|
-
"Feedback message": "Feedback message",
|
|
169
|
-
"How was your call quality?": "How was your call quality?",
|
|
170
|
-
"Rate {{ count }} star_one": "Rate {{ count }} star",
|
|
171
|
-
"Rate {{ count }} star_other": "Rate {{ count }} stars",
|
|
172
|
-
"Thank you!": "Thank you!",
|
|
173
|
-
"Your feedback helps improve call quality.": "Your feedback helps improve call quality."
|
|
174
|
-
};
|
|
175
|
-
|
|
176
|
-
export { Allow, Anonymous, Backstage, Block, Default, Dismiss, Enter, Invite, Join, Joining, Kick, Leave, Live, Me, Mic, Microphone, Participants, Pin, Pinned, Reactions, Refresh, Revoke, Ringing, Speaker, Speakers, Statistics, Unknown, Unpin, Video, You, en as default };
|
|
177
|
-
//# sourceMappingURL=en.json.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../../src/translations/index.ts"],"sourcesContent":["import en from './en.json';\n\nexport const translations = { en };\n"],"names":[],"mappings":";;AAEO,MAAM,YAAY,GAAG,EAAE,EAAE;;;;"}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var chart_js = require('chart.js');
|
|
5
|
-
var reactChartjs2 = require('react-chartjs-2');
|
|
6
|
-
var react = require('react');
|
|
7
|
-
|
|
8
|
-
// NOTE: this is a side effect by definition, but this component is
|
|
9
|
-
// isolated in a separate chunk, and it won't affect the rest of the app.
|
|
10
|
-
// See CallStats.tsx for more details.
|
|
11
|
-
chart_js.Chart.register(chart_js.CategoryScale, chart_js.LinearScale, chart_js.LineElement, chart_js.PointElement);
|
|
12
|
-
const CallStatsLatencyChart = (props) => {
|
|
13
|
-
const { values } = props;
|
|
14
|
-
let max = 0;
|
|
15
|
-
const data = {
|
|
16
|
-
labels: values.map((point) => {
|
|
17
|
-
const date = new Date(point.x * 1000);
|
|
18
|
-
return `${date.getHours()}:${date.getMinutes()}`;
|
|
19
|
-
}),
|
|
20
|
-
datasets: [
|
|
21
|
-
{
|
|
22
|
-
data: values.map((point) => {
|
|
23
|
-
const { y } = point;
|
|
24
|
-
max = Math.max(max, y);
|
|
25
|
-
return point;
|
|
26
|
-
}),
|
|
27
|
-
borderColor: '#00e2a1',
|
|
28
|
-
backgroundColor: '#00e2a1',
|
|
29
|
-
},
|
|
30
|
-
],
|
|
31
|
-
};
|
|
32
|
-
const options = react.useMemo(() => getLineOptions(max), [max]);
|
|
33
|
-
return (jsxRuntime.jsx("div", { className: "str-video__call-stats-line-chart-container", children: jsxRuntime.jsx(reactChartjs2.Line, { options: options, data: data, className: "str-video__call-stats__latencychart" }) }));
|
|
34
|
-
};
|
|
35
|
-
const getLineOptions = (max) => ({
|
|
36
|
-
maintainAspectRatio: false,
|
|
37
|
-
animation: { duration: 0 },
|
|
38
|
-
elements: {
|
|
39
|
-
line: { borderWidth: 1 },
|
|
40
|
-
point: { radius: 2 },
|
|
41
|
-
},
|
|
42
|
-
scales: {
|
|
43
|
-
y: {
|
|
44
|
-
position: 'right',
|
|
45
|
-
stacked: true,
|
|
46
|
-
min: 0,
|
|
47
|
-
max: Math.max(180, Math.ceil((max + 10) / 10) * 10),
|
|
48
|
-
grid: { display: true, color: '#979ca0' },
|
|
49
|
-
ticks: { stepSize: 30 },
|
|
50
|
-
},
|
|
51
|
-
x: {
|
|
52
|
-
grid: { display: false },
|
|
53
|
-
ticks: { display: false },
|
|
54
|
-
},
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
exports.default = CallStatsLatencyChart;
|
|
59
|
-
//# sourceMappingURL=latency-chart-CpL1M_s0.cjs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"latency-chart-CpL1M_s0.cjs.js","sources":["../../src/components/CallStats/CallStatsLatencyChart.tsx"],"sourcesContent":["import {\n CategoryScale,\n Chart as ChartJS,\n ChartData,\n ChartOptions,\n LinearScale,\n LineElement,\n PointElement,\n} from 'chart.js';\nimport { Line } from 'react-chartjs-2';\nimport { useMemo } from 'react';\n\n// NOTE: this is a side effect by definition, but this component is\n// isolated in a separate chunk, and it won't affect the rest of the app.\n// See CallStats.tsx for more details.\nChartJS.register(CategoryScale, LinearScale, LineElement, PointElement);\n\nconst CallStatsLatencyChart = (props: {\n values: Array<{ x: number; y: number }>;\n}) => {\n const { values } = props;\n let max = 0;\n const data: ChartData<'line'> = {\n labels: values.map((point) => {\n const date = new Date(point.x * 1000);\n return `${date.getHours()}:${date.getMinutes()}`;\n }),\n datasets: [\n {\n data: values.map((point) => {\n const { y } = point;\n max = Math.max(max, y);\n return point;\n }),\n borderColor: '#00e2a1',\n backgroundColor: '#00e2a1',\n },\n ],\n };\n\n const options = useMemo(() => getLineOptions(max), [max]);\n return (\n <div className=\"str-video__call-stats-line-chart-container\">\n <Line\n options={options}\n data={data}\n className=\"str-video__call-stats__latencychart\"\n />\n </div>\n );\n};\n\nexport default CallStatsLatencyChart;\n\nconst getLineOptions = (max: number): ChartOptions<'line'> => ({\n maintainAspectRatio: false,\n animation: { duration: 0 },\n elements: {\n line: { borderWidth: 1 },\n point: { radius: 2 },\n },\n scales: {\n y: {\n position: 'right',\n stacked: true,\n min: 0,\n max: Math.max(180, Math.ceil((max + 10) / 10) * 10),\n grid: { display: true, color: '#979ca0' },\n ticks: { stepSize: 30 },\n },\n x: {\n grid: { display: false },\n ticks: { display: false },\n },\n },\n});\n"],"names":["ChartJS","CategoryScale","LinearScale","LineElement","PointElement","useMemo","_jsx","Line"],"mappings":";;;;;;;AAYA;AACA;AACA;AACAA,cAAO,CAAC,QAAQ,CAACC,sBAAa,EAAEC,oBAAW,EAAEC,oBAAW,EAAEC,qBAAY,CAAC;AAEvE,MAAM,qBAAqB,GAAG,CAAC,KAE9B,KAAI;AACH,IAAA,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK;IACxB,IAAI,GAAG,GAAG,CAAC;AACX,IAAA,MAAM,IAAI,GAAsB;QAC9B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;YAC3B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;YACrC,OAAO,CAAA,EAAG,IAAI,CAAC,QAAQ,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,UAAU,EAAE,CAAA,CAAE;AAClD,QAAA,CAAC,CAAC;AACF,QAAA,QAAQ,EAAE;AACR,YAAA;gBACE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;AACzB,oBAAA,MAAM,EAAE,CAAC,EAAE,GAAG,KAAK;oBACnB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;AACtB,oBAAA,OAAO,KAAK;AACd,gBAAA,CAAC,CAAC;AACF,gBAAA,WAAW,EAAE,SAAS;AACtB,gBAAA,eAAe,EAAE,SAAS;AAC3B,aAAA;AACF,SAAA;KACF;AAED,IAAA,MAAM,OAAO,GAAGC,aAAO,CAAC,MAAM,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACzD,QACEC,wBAAK,SAAS,EAAC,4CAA4C,EAAA,QAAA,EACzDA,cAAA,CAACC,kBAAI,EAAA,EACH,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,SAAS,EAAC,qCAAqC,EAAA,CAC/C,EAAA,CACE;AAEV;AAIA,MAAM,cAAc,GAAG,CAAC,GAAW,MAA4B;AAC7D,IAAA,mBAAmB,EAAE,KAAK;AAC1B,IAAA,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;AAC1B,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE;AACxB,QAAA,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;AACrB,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,CAAC,EAAE;AACD,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC;YACnD,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AACzC,YAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;AACxB,SAAA;AACD,QAAA,CAAC,EAAE;AACD,YAAA,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;AACxB,YAAA,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;AAC1B,SAAA;AACF,KAAA;AACF,CAAA,CAAC;;;;"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { ReactNode } from 'react';
|
|
2
|
-
export type CallStatsProps = {
|
|
3
|
-
latencyLowBound?: number;
|
|
4
|
-
latencyHighBound?: number;
|
|
5
|
-
audioJitterLowBound?: number;
|
|
6
|
-
audioJitterHighBound?: number;
|
|
7
|
-
videoJitterLowBound?: number;
|
|
8
|
-
videoJitterHighBound?: number;
|
|
9
|
-
showCodecInfo?: boolean;
|
|
10
|
-
LatencyChartSuspenseFallback?: ReactNode;
|
|
11
|
-
};
|
|
12
|
-
export declare const CallStats: (props: CallStatsProps) => import("react").JSX.Element;
|
|
13
|
-
export declare const StatCard: (props: {
|
|
14
|
-
label: string;
|
|
15
|
-
value: string | ReactNode;
|
|
16
|
-
description?: string;
|
|
17
|
-
comparison?: {
|
|
18
|
-
value: number;
|
|
19
|
-
highBound: number;
|
|
20
|
-
lowBound: number;
|
|
21
|
-
};
|
|
22
|
-
}) => import("react").JSX.Element;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './CallStats';
|