agora-appbuilder-core 4.0.0-api.5 → 4.0.0-api.6
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/package.json +2 -2
- package/template/.bundle/config +2 -0
- package/template/Gemfile +4 -0
- package/template/Gulpfile.js +29 -29
- package/template/_eslintrc.js +3 -3
- package/template/_gitignore +12 -11
- package/template/_package-lock.json +26471 -22749
- package/template/_prettierrc.js +2 -2
- package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +30 -10
- package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +19 -0
- package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +1 -0
- package/template/agora-rn-uikit/src/Controls/Icons.ts +45 -0
- package/template/agora-rn-uikit/src/Controls/Local/EndCall.tsx +6 -4
- package/template/agora-rn-uikit/src/Controls/Local/FullScreen.tsx +3 -1
- package/template/agora-rn-uikit/src/Controls/Local/LocalAudioMute.tsx +1 -0
- package/template/agora-rn-uikit/src/Controls/Local/LocalVideoMute.tsx +1 -0
- package/template/agora-rn-uikit/src/Controls/Local/SwitchCamera.tsx +1 -0
- package/template/agora-rn-uikit/src/Controls/Remote/RemoteAudioMute.tsx +1 -0
- package/template/agora-rn-uikit/src/Controls/Remote/RemoteSwap.tsx +3 -1
- package/template/agora-rn-uikit/src/Controls/Remote/RemoteVideoMute.tsx +1 -0
- package/template/agora-rn-uikit/src/Reducer/ActiveSpeaker.ts +30 -0
- package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +3 -1
- package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +3 -1
- package/template/agora-rn-uikit/src/Reducer/LocalPermissionState.ts +1 -1
- package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +3 -3
- package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +5 -4
- package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +1 -1
- package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +8 -5
- package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +1 -1
- package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +1 -1
- package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +1 -1
- package/template/agora-rn-uikit/src/Reducer/UserPin.ts +18 -1
- package/template/agora-rn-uikit/src/Reducer/UserSecondaryPin.ts +23 -0
- package/template/agora-rn-uikit/src/Reducer/index.ts +2 -0
- package/template/agora-rn-uikit/src/Rtc/Create.tsx +47 -21
- package/template/agora-rn-uikit/src/Rtc/Join.tsx +37 -15
- package/template/agora-rn-uikit/src/RtcConfigure.tsx +122 -12
- package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +32 -4
- package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +21 -2
- package/template/agora-rn-uikit/src/Views/MinVideoView.tsx +2 -0
- package/template/android/app/build.gradle +59 -156
- package/template/android/app/src/debug/AndroidManifest.xml +6 -1
- package/template/android/app/src/debug/java/com/helloworld/ReactNativeFlipper.java +7 -4
- package/template/android/app/src/main/AndroidManifest.xml +6 -19
- package/template/android/app/src/main/assets/fonts/icomoon.ttf +0 -0
- package/template/android/app/src/main/java/com/helloworld/MainActivity.java +17 -0
- package/template/android/app/src/main/java/com/helloworld/MainApplication.java +19 -36
- package/template/android/app/src/release/java/com/helloworld/ReactNativeFlipper.java +20 -0
- package/template/android/build.gradle +19 -33
- package/template/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/template/android/gradle/wrapper/gradle-wrapper.properties +3 -2
- package/template/android/gradle.properties +18 -4
- package/template/android/gradlew +165 -104
- package/template/android/gradlew.bat +12 -23
- package/template/android/settings.gradle +1 -0
- package/template/bridge/rtc/webNg/RtcEngine.ts +131 -16
- package/template/bridge/rtc/webNg/index.ts +72 -1
- package/template/bridge/rtm/web/index.ts +5 -3
- package/template/configTransform.js +16 -1
- package/template/customization-api/action-library.ts +0 -8
- package/template/customization-api/app-state.ts +11 -2
- package/template/customization-api/customEvents.ts +6 -1
- package/template/customization-api/index.ts +4 -0
- package/template/customization-api/sub-components.ts +6 -3
- package/template/customization-api/temp.ts +50 -0
- package/template/customization-api/typeDefinition.ts +26 -14
- package/template/customization-api/types.ts +26 -0
- package/template/customization-api/utils.ts +2 -0
- package/template/customization-implementation/index.ts +0 -1
- package/template/defaultConfig.js +72 -0
- package/template/global.d.ts +13 -1
- package/template/index.js +0 -4
- package/template/index.web.js +0 -5
- package/template/index.wsdk.tsx +1 -19
- package/template/ios/.xcode.env +11 -0
- package/template/ios/HelloWorld/AppDelegate.h +2 -4
- package/template/ios/HelloWorld/AppDelegate.mm +42 -0
- package/template/ios/HelloWorld/Info.plist +1 -1
- package/template/ios/HelloWorld/main.m +2 -1
- package/template/ios/HelloWorld.xcodeproj/project.pbxproj +529 -17
- package/template/ios/HelloWorld.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/template/ios/HelloWorld.xcworkspace/contents.xcworkspacedata +10 -0
- package/template/ios/HelloWorld.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/template/ios/HelloWorldTests/HelloWorldTests.m +14 -13
- package/template/ios/HelloWorldTests/Info.plist +2 -2
- package/template/ios/Podfile +53 -20
- package/template/ios/Podfile.lock +873 -0
- package/template/ios/ScreenSharing/Info.plist +15 -0
- package/template/ios/ScreenSharing/SampleHandler.h +9 -0
- package/template/ios/ScreenSharing/SampleHandler.m +70 -0
- package/template/jest.config.js +4 -0
- package/template/metro.config.js +7 -32
- package/template/package.json +52 -39
- package/template/react-native-toast-message/index.d.ts +3 -1
- package/template/react-native-toast-message/index.js +1 -0
- package/template/react-native-toast-message/src/components/base/index.js +20 -32
- package/template/react-native-toast-message/src/components/base/styles.js +18 -21
- package/template/react-native-toast-message/src/components/checkbox.js +24 -19
- package/template/react-native-toast-message/src/index.js +3 -1
- package/template/react-native-toast-message/src/index.sdk.tsx +4 -1
- package/template/src/App.tsx +13 -85
- package/template/src/AppRoutes.tsx +77 -0
- package/template/src/AppWrapper.tsx +38 -33
- package/template/src/SDKAppWrapper.tsx +79 -43
- package/template/src/app-state/useNoiseSupression.native.tsx +67 -0
- package/template/src/app-state/useNoiseSupression.tsx +107 -0
- package/template/src/app-state/useVideoQuality.tsx +39 -0
- package/template/src/assets/font-styles.css +171 -3
- package/template/src/assets/fonts/icomoon.ttf +0 -0
- package/template/src/assets/selection.json +1 -1
- package/template/src/atoms/ActionMenu.tsx +50 -11
- package/template/src/atoms/Avatar.tsx +51 -0
- package/template/src/atoms/Card.tsx +21 -8
- package/template/src/atoms/Carousel.native.tsx +105 -0
- package/template/src/atoms/Carousel.tsx +103 -0
- package/template/src/atoms/Checkbox.tsx +98 -0
- package/template/src/atoms/CircularProgress.tsx +0 -1
- package/template/src/atoms/ClipboardIconButton.tsx +91 -0
- package/template/src/atoms/CustomIcon.tsx +45 -0
- package/template/src/atoms/DropDownMulti.tsx +349 -0
- package/template/src/atoms/Dropdown.tsx +3 -3
- package/template/src/atoms/IconButton.tsx +52 -9
- package/template/src/atoms/ImageIcon.tsx +6 -3
- package/template/src/atoms/InlineNotification.tsx +81 -0
- package/template/src/atoms/MeetingLink.tsx +160 -0
- package/template/src/atoms/ParticipantsCount.tsx +18 -7
- package/template/src/atoms/Popup.tsx +49 -27
- package/template/src/atoms/PrimaryButton.tsx +19 -5
- package/template/src/atoms/RecordingInfo.tsx +2 -2
- package/template/src/atoms/SecondaryButton.tsx +2 -0
- package/template/src/atoms/Spacer.tsx +1 -0
- package/template/src/atoms/TertiaryButton.tsx +35 -5
- package/template/src/atoms/TextInput.tsx +2 -1
- package/template/src/atoms/Toolbar.tsx +64 -30
- package/template/src/atoms/ToolbarItem.tsx +11 -5
- package/template/src/atoms/ToolbarPreset.tsx +13 -2
- package/template/src/atoms/Tooltip.tsx +26 -4
- package/template/src/auth/AuthProvider.tsx +500 -0
- package/template/src/auth/AuthRoute.tsx +94 -0
- package/template/src/auth/IDPAuth.electron.tsx +31 -0
- package/template/src/auth/IDPAuth.tsx +67 -0
- package/template/src/auth/IDPLogoutComponent.tsx +158 -0
- package/template/src/auth/UserCancelPopup.tsx +115 -0
- package/template/src/auth/config.ts +52 -0
- package/template/src/auth/openIDPURL.electron.tsx +39 -0
- package/template/src/auth/openIDPURL.native.tsx +51 -0
- package/template/src/auth/openIDPURL.tsx +20 -0
- package/template/src/auth/useIDPAuth.electron.tsx +65 -0
- package/template/src/auth/useIDPAuth.native.tsx +70 -0
- package/template/src/auth/useIDPAuth.tsx +63 -0
- package/template/src/auth/useTokenAuth.tsx +194 -0
- package/template/src/components/Chat.tsx +5 -8
- package/template/src/components/ChatContext.ts +4 -0
- package/template/src/components/ColorConfigure.tsx +0 -1
- package/template/src/components/CommonStyles.ts +9 -2
- package/template/src/components/Controls.tsx +659 -52
- package/template/src/components/DeviceConfigure.tsx +362 -156
- package/template/src/components/DeviceContext.tsx +2 -0
- package/template/src/components/EventsConfigure.tsx +713 -109
- package/template/src/components/GraphQLProvider.tsx +62 -36
- package/template/src/components/GridVideo.tsx +23 -13
- package/template/src/components/HostControlView.tsx +11 -14
- package/template/src/components/JoinPhrase.tsx +0 -1
- package/template/src/components/Leftbar.tsx +4 -3
- package/template/src/components/Navbar.tsx +110 -42
- package/template/src/components/NavbarMobile.tsx +47 -36
- package/template/src/components/Navigation.native.tsx +1 -15
- package/template/src/{subComponents/screenshare/ScreenshareButton.native.tsx → components/Navigation.sdk.tsx} +17 -3
- package/template/src/components/Navigation.tsx +1 -15
- package/template/src/components/ParticipantsView.tsx +56 -48
- package/template/src/components/PinnedVideo.tsx +188 -114
- package/template/src/components/Precall.native.tsx +169 -67
- package/template/src/components/Precall.tsx +237 -71
- package/template/src/components/RTMConfigure.tsx +167 -55
- package/template/src/components/Rightbar.tsx +4 -3
- package/template/src/components/Router.electron.ts +1 -0
- package/template/src/components/Router.native.ts +1 -0
- package/template/src/components/Router.sdk.ts +1 -0
- package/template/src/components/Router.ts +1 -0
- package/template/src/components/SdkApiContext.tsx +179 -27
- package/template/src/components/SdkMuteToggleListener.tsx +88 -0
- package/template/src/components/SessionContext.tsx +0 -1
- package/template/src/components/Settings.tsx +25 -3
- package/template/src/components/SettingsView.tsx +44 -9
- package/template/src/components/Share.tsx +149 -71
- package/template/src/components/StorageContext.tsx +19 -5
- package/template/src/components/ToastComponent.tsx +3 -0
- package/template/src/components/WhiteboardLayout.tsx +291 -0
- package/template/src/components/chat-messages/useChatMessages.tsx +420 -207
- package/template/src/components/common/Error.tsx +2 -0
- package/template/src/components/common/Logo.tsx +2 -2
- package/template/src/components/contexts/LiveStreamDataContext.tsx +5 -4
- package/template/src/components/contexts/ScreenShareContext.tsx +15 -1
- package/template/src/components/contexts/WaitingRoomContext.tsx +50 -0
- package/template/src/components/contexts/WhiteboardContext.tsx +54 -54
- package/template/src/components/disable-chat/useDisableChat.tsx +32 -0
- package/template/src/components/livestream/LiveStreamContext.tsx +262 -177
- package/template/src/components/livestream/Types.ts +34 -18
- package/template/src/components/livestream/views/LiveStreamAttendeeLandingTile.tsx +295 -0
- package/template/src/components/livestream/views/LiveStreamControls.tsx +2 -4
- package/template/src/components/meeting-info-invite/MeetingInfo.tsx +82 -0
- package/template/src/components/meeting-info-invite/MeetingInfoCardHeader.tsx +86 -0
- package/template/src/components/meeting-info-invite/MeetingInfoGridTile.tsx +218 -0
- package/template/src/components/meeting-info-invite/MeetingInfoLinks.tsx +122 -0
- package/template/src/components/participants/AllAudienceParticipants.tsx +4 -5
- package/template/src/components/participants/AllHostParticipants.tsx +5 -6
- package/template/src/components/participants/Participant.tsx +40 -9
- package/template/src/components/participants/ParticipantSectionTitle.tsx +5 -2
- package/template/src/components/participants/ScreenshareParticipants.tsx +15 -17
- package/template/src/components/participants/UserActionMenuOptions.tsx +157 -49
- package/template/src/components/participants/WaitingRoomParticipants.tsx +74 -0
- package/template/src/components/popups/InvitePopup.tsx +110 -45
- package/template/src/components/popups/StartScreenSharePopup.native.tsx +182 -0
- package/template/src/components/popups/StartScreenSharePopup.tsx +6 -0
- package/template/src/components/popups/StopRecordingPopup.tsx +11 -5
- package/template/src/components/popups/StopScreenSharePopup.native.tsx +135 -0
- package/template/src/components/popups/StopScreenSharePopup.tsx +6 -0
- package/template/src/components/popups/WhiteboardClearAllPopup.tsx +123 -0
- package/template/src/components/precall/LocalMute.tsx +69 -45
- package/template/src/components/precall/PermissionHelper.tsx +52 -24
- package/template/src/components/precall/PreCallSettings.tsx +1 -0
- package/template/src/components/precall/VideoFallback.tsx +173 -0
- package/template/src/components/precall/VideoPreview.native.tsx +16 -50
- package/template/src/components/precall/VideoPreview.tsx +27 -162
- package/template/src/components/precall/index.tsx +2 -0
- package/template/src/components/precall/joinCallBtn.native.tsx +10 -3
- package/template/src/components/precall/joinCallBtn.tsx +11 -2
- package/template/src/components/precall/joinWaitingRoomBtn.native.tsx +210 -0
- package/template/src/components/precall/joinWaitingRoomBtn.tsx +250 -0
- package/template/src/components/precall/meetingTitle.tsx +35 -9
- package/template/src/components/precall/selectDevice.tsx +5 -5
- package/template/src/components/precall/textInput.tsx +16 -18
- package/template/src/components/precall/usePreCall.tsx +14 -4
- package/template/src/components/room-info/useRoomInfo.tsx +34 -0
- package/template/src/components/useShareLink.tsx +24 -59
- package/template/src/components/useUserPreference.tsx +73 -10
- package/template/src/components/useVideoCall.tsx +76 -3
- package/template/src/components/virtual-background/VBButton.tsx +64 -0
- package/template/src/components/virtual-background/VBCard.native.tsx +282 -0
- package/template/src/components/virtual-background/VBCard.tsx +272 -0
- package/template/src/components/virtual-background/VBPanel.tsx +279 -0
- package/template/src/components/virtual-background/VButils.native.ts +37 -0
- package/template/src/components/virtual-background/VButils.ts +104 -0
- package/template/src/components/virtual-background/VideoPreview.native.tsx +43 -0
- package/template/src/components/virtual-background/VideoPreview.tsx +106 -0
- package/template/src/components/virtual-background/imagePaths.ts +87 -0
- package/template/src/components/virtual-background/images/beachImageBase64.ts +1 -0
- package/template/src/components/virtual-background/images/bedroomImageBase64.ts +1 -0
- package/template/src/components/virtual-background/images/bookImageBase64.ts +1 -0
- package/template/src/components/virtual-background/images/earthImageBase64.ts +1 -0
- package/template/src/components/virtual-background/images/index.ts +37 -0
- package/template/src/components/virtual-background/images/lampImageBase64.ts +1 -0
- package/template/src/components/virtual-background/images/mountainsImageBase64.ts +1 -0
- package/template/src/components/virtual-background/images/office1ImageBase64.ts +1 -0
- package/template/src/components/virtual-background/images/officeImageBase64.ts +1 -0
- package/template/src/components/virtual-background/images/plantsImageBase64.ts +1 -0
- package/template/src/components/virtual-background/images/skyImageBase64.ts +1 -0
- package/template/src/components/virtual-background/images/wallImageBase64.ts +1 -0
- package/template/src/components/virtual-background/useVB.native.tsx +188 -0
- package/template/src/components/virtual-background/useVB.tsx +267 -0
- package/template/src/components/whiteboard/StrokeWidthTool.tsx +137 -0
- package/template/src/components/whiteboard/WhiteboardButton.tsx +93 -0
- package/template/src/components/whiteboard/WhiteboardCanvas.tsx +99 -0
- package/template/src/components/whiteboard/WhiteboardConfigure.native.tsx +137 -0
- package/template/src/components/whiteboard/WhiteboardConfigure.tsx +441 -0
- package/template/src/components/whiteboard/WhiteboardCursor.tsx +152 -0
- package/template/src/components/whiteboard/WhiteboardToolBox.tsx +1246 -0
- package/template/src/components/whiteboard/WhiteboardView.native.tsx +109 -0
- package/template/src/components/whiteboard/WhiteboardView.tsx +81 -0
- package/template/src/components/whiteboard/WhiteboardWidget.tsx +674 -0
- package/template/src/components/whiteboard/WhiteboardWrapper.tsx +38 -0
- package/template/src/language/default-labels/commonLabels.ts +51 -14
- package/template/src/language/default-labels/createScreenLabels.ts +97 -17
- package/template/src/language/default-labels/joinScreenLabels.ts +45 -6
- package/template/src/language/default-labels/precallScreenLabels.ts +145 -23
- package/template/src/language/default-labels/shareLinkScreenLabels.ts +85 -37
- package/template/src/language/default-labels/videoCallScreenLabels.ts +1137 -158
- package/template/src/pages/Create.tsx +125 -80
- package/template/src/pages/Join.tsx +76 -34
- package/template/src/pages/Login.tsx +26 -0
- package/template/src/pages/VideoCall.tsx +229 -114
- package/template/src/pages/video-call/ActionSheet.native.tsx +54 -7
- package/template/src/pages/video-call/ActionSheet.tsx +55 -16
- package/template/src/pages/video-call/ActionSheetContent.tsx +366 -291
- package/template/src/pages/video-call/ActionSheetHandle.tsx +7 -1
- package/template/src/pages/video-call/DefaultLayouts.ts +11 -5
- package/template/src/pages/video-call/NameWithMicIcon.tsx +17 -9
- package/template/src/pages/video-call/PinchableView.tsx +119 -0
- package/template/src/pages/video-call/RenderComponent.tsx +12 -3
- package/template/src/pages/video-call/SidePanelHeader.tsx +208 -6
- package/template/src/pages/video-call/VideoCallMobileView.tsx +140 -106
- package/template/src/pages/video-call/VideoCallScreen.native.tsx +3 -2
- package/template/src/pages/video-call/VideoCallScreen.tsx +113 -66
- package/template/src/pages/video-call/VideoComponent.tsx +53 -5
- package/template/src/pages/video-call/VideoRenderer.tsx +309 -52
- package/template/src/pages/video-call/VisibilitySensor.tsx +104 -0
- package/template/src/pages/video-call/ZoomableWrapper.native.tsx +34 -0
- package/template/src/pages/video-call/ZoomableWrapper.tsx +5 -0
- package/template/src/pages/video-call/index.ts +2 -0
- package/template/src/rtm/RTMEngine.ts +9 -4
- package/template/src/rtm-events/constants.ts +20 -0
- package/template/src/rtm-events-api/Events.ts +2 -0
- package/template/src/rtm-events-api/LocalEvents.ts +8 -0
- package/template/src/selection.json +1 -0
- package/template/src/subComponents/ChatBubble.tsx +81 -64
- package/template/src/subComponents/ChatContainer.tsx +20 -13
- package/template/src/subComponents/ChatInput.ios.tsx +11 -2
- package/template/src/subComponents/ChatInput.tsx +12 -3
- package/template/src/subComponents/Checkbox.native.tsx +46 -46
- package/template/src/subComponents/Checkbox.tsx +7 -6
- package/template/src/subComponents/CopyJoinInfo.tsx +26 -11
- package/template/src/subComponents/EndcallPopup.tsx +83 -12
- package/template/src/subComponents/LanguageSelector.tsx +34 -30
- package/template/src/subComponents/LayoutIconButton.tsx +30 -8
- package/template/src/subComponents/LayoutIconDropdown.tsx +19 -3
- package/template/src/subComponents/Loading.tsx +60 -0
- package/template/src/subComponents/LocalAudioMute.tsx +106 -30
- package/template/src/subComponents/LocalEndCall.tsx +91 -15
- package/template/src/subComponents/LocalSwitchCamera.tsx +50 -11
- package/template/src/subComponents/LocalVideoMute.tsx +126 -32
- package/template/src/subComponents/LogoutButton.tsx +1 -1
- package/template/src/subComponents/NetworkQualityPill.tsx +14 -31
- package/template/src/subComponents/Recording.tsx +23 -6
- package/template/src/subComponents/RemoteAudioMute.tsx +3 -3
- package/template/src/subComponents/RemoteMutePopup.tsx +55 -14
- package/template/src/subComponents/RemoteVideoMute.tsx +3 -3
- package/template/src/subComponents/RemoveMeetingPopup.tsx +19 -6
- package/template/src/subComponents/RemoveScreensharePopup.tsx +20 -5
- package/template/src/subComponents/ScreenShareNotice.tsx +11 -6
- package/template/src/subComponents/SelectDevice.tsx +98 -32
- package/template/src/subComponents/SidePanelEnum.tsx +2 -0
- package/template/src/subComponents/SidePanelHeader.tsx +97 -63
- package/template/src/subComponents/ToastConfig.tsx +70 -61
- package/template/src/subComponents/caption/Caption.tsx +130 -0
- package/template/src/subComponents/caption/CaptionContainer.tsx +302 -0
- package/template/src/subComponents/caption/CaptionIcon.tsx +111 -0
- package/template/src/subComponents/caption/CaptionText.tsx +182 -0
- package/template/src/subComponents/caption/DownloadTranscriptBtn.tsx +65 -0
- package/template/src/subComponents/caption/LanguageSelectorPopup.tsx +192 -0
- package/template/src/subComponents/caption/Transcript.tsx +449 -0
- package/template/src/subComponents/caption/TranscriptIcon.tsx +123 -0
- package/template/src/subComponents/caption/TranscriptText.tsx +98 -0
- package/template/src/subComponents/caption/index.ts +3 -0
- package/template/src/subComponents/caption/proto/ptoto.js +91 -0
- package/template/src/subComponents/caption/proto/test.proto +23 -0
- package/template/src/subComponents/caption/useCaption.tsx +123 -0
- package/template/src/subComponents/caption/useCaptionWidth.ts +27 -0
- package/template/src/subComponents/caption/useSTTAPI.tsx +179 -0
- package/template/src/subComponents/caption/useStreamMessageUtils.native.ts +211 -0
- package/template/src/subComponents/caption/useStreamMessageUtils.ts +235 -0
- package/template/src/subComponents/caption/useTranscriptDownload.native.ts +68 -0
- package/template/src/subComponents/caption/useTranscriptDownload.ts +52 -0
- package/template/src/subComponents/caption/utils.ts +125 -0
- package/template/src/subComponents/chat/ChatParticipants.tsx +53 -17
- package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +11 -13
- package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +33 -9
- package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +1 -0
- package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +10 -6
- package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +28 -19
- package/template/src/subComponents/recording/useRecording.tsx +49 -20
- package/template/src/subComponents/recording/useRecordingLayoutQuery.tsx +0 -1
- package/template/src/subComponents/screenshare/ScreenshareButton.tsx +29 -10
- package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +270 -66
- package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +182 -95
- package/template/src/subComponents/screenshare/useScreenshare.tsx +2 -0
- package/template/src/subComponents/waiting-rooms/WaitingRoomControls.tsx +85 -0
- package/template/src/subComponents/waiting-rooms/useWaitingRoomAPI.ts +75 -0
- package/template/src/theme/index.ts +9 -0
- package/template/src/utils/SdkEvents.ts +14 -0
- package/template/src/utils/SdkMethodEvents.ts +23 -3
- package/template/src/utils/axiomLogger.ts +117 -0
- package/template/src/utils/book.jpg +0 -0
- package/template/src/utils/common.tsx +118 -6
- package/template/src/utils/endCallEveryOne.ts +7 -0
- package/template/src/utils/getCustomRoute.ts +7 -0
- package/template/src/utils/index.tsx +23 -0
- package/template/src/utils/useActionSheet.tsx +50 -0
- package/template/src/utils/useActiveSpeaker.ts +3 -7
- package/template/src/utils/useAppState.ts +17 -0
- package/template/src/utils/useAsyncEffect.ts +138 -0
- package/template/src/utils/useCreateRoom.ts +8 -12
- package/template/src/utils/useDisableButton.tsx +37 -0
- package/template/src/utils/useFindActiveSpeaker.native.ts +4 -0
- package/template/src/utils/useFindActiveSpeaker.ts +335 -0
- package/template/src/utils/useIsLocalUserSpeaking.native.ts +4 -0
- package/template/src/utils/useIsLocalUserSpeaking.ts +98 -0
- package/template/src/utils/useJoinRoom.ts +97 -36
- package/template/src/utils/useMuteToggleLocal.ts +114 -96
- package/template/src/utils/useString.ts +13 -3
- package/template/static.d.ts +42 -0
- package/template/tsconfig_rsdk_index.json +3 -3
- package/template/tsconfig_wsdk_index.json +1 -1
- package/template/web/index.html +20 -0
- package/template/webpack.commons.js +21 -10
- package/template/webpack.web.config.js +7 -3
- package/template/_buckconfig +0 -6
- package/template/_gitattributes +0 -1
- package/template/android/app/_BUCK +0 -55
- package/template/android/app/build_defs.bzl +0 -19
- package/template/ios/HelloWorld/AppDelegate.m +0 -74
- package/template/src/components/OAuth.electron.tsx +0 -41
- package/template/src/components/OAuth.native.tsx +0 -55
- package/template/src/components/OAuth.tsx +0 -30
- package/template/src/components/OAuthConfig.ts +0 -77
- package/template/src/components/Settings.native.tsx +0 -21
- package/template/src/components/StoreToken.tsx +0 -39
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import createRetryFetch from 'fetch-retry';
|
|
2
|
+
import isSDK from './isSDK';
|
|
3
|
+
import {isAndroid, isWeb, isIOS} from './common';
|
|
4
|
+
|
|
5
|
+
/* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cyclic_object_value#examples */
|
|
6
|
+
export function getCircularReplacer() {
|
|
7
|
+
const ancestors = [];
|
|
8
|
+
return function (key, value) {
|
|
9
|
+
if (typeof value !== 'object' || value === null) {
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
// `this` is the object that value is contained in,
|
|
13
|
+
// i.e., its direct parent.
|
|
14
|
+
while (ancestors.length > 0 && ancestors[ancestors.length - 1] !== this) {
|
|
15
|
+
ancestors.pop();
|
|
16
|
+
}
|
|
17
|
+
if (ancestors.includes(value)) {
|
|
18
|
+
return '[Circular]';
|
|
19
|
+
}
|
|
20
|
+
ancestors.push(value);
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const fetchRetry = createRetryFetch(fetch, {
|
|
26
|
+
retries: 23,
|
|
27
|
+
retryDelay: function (attempt) {
|
|
28
|
+
return Math.pow(2, attempt) * 1000; // 1000, 2000, 4000
|
|
29
|
+
},
|
|
30
|
+
retryOn: function (attempt, error, response) {
|
|
31
|
+
// retry on any network error, or 4xx or 5xx status codes
|
|
32
|
+
if (error !== null || response.status > 400) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const sendLogs = (p: any[]) => {
|
|
39
|
+
fetchRetry(
|
|
40
|
+
'https://axiom-queue.appbuilder.workers.dev?dataset=app-builder-core',
|
|
41
|
+
// "&strategy=queue", // to send logs to a specific dataset [default: queue]
|
|
42
|
+
{
|
|
43
|
+
method: 'POST',
|
|
44
|
+
headers: new Headers({
|
|
45
|
+
'Content-Type': 'application/json',
|
|
46
|
+
}),
|
|
47
|
+
body: JSON.stringify(p, getCircularReplacer()),
|
|
48
|
+
},
|
|
49
|
+
);
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export const createAxiomLogger = () => {
|
|
53
|
+
const queue: any[] = [];
|
|
54
|
+
let batchId = 0;
|
|
55
|
+
let timeout: number | null = null;
|
|
56
|
+
|
|
57
|
+
const sendInterval = 45000; // 45s
|
|
58
|
+
|
|
59
|
+
const flush = () => {
|
|
60
|
+
if (timeout !== null) {
|
|
61
|
+
clearTimeout(timeout);
|
|
62
|
+
timeout = null;
|
|
63
|
+
}
|
|
64
|
+
if (queue.length === 0) return;
|
|
65
|
+
sendLogs(queue);
|
|
66
|
+
queue.length = 0;
|
|
67
|
+
batchId = batchId + 1;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const log = (logContent: {[key: string]: any}) => {
|
|
71
|
+
logContent.batchId = batchId;
|
|
72
|
+
queue.push(logContent);
|
|
73
|
+
if (queue.length >= 1000) {
|
|
74
|
+
flush();
|
|
75
|
+
} else {
|
|
76
|
+
if (timeout === null) {
|
|
77
|
+
// @ts-ignore
|
|
78
|
+
timeout = setTimeout(() => {
|
|
79
|
+
flush();
|
|
80
|
+
}, sendInterval);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
return [log, flush] as const;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export const setupLogger = () => {
|
|
89
|
+
const [log, flush] = createAxiomLogger();
|
|
90
|
+
|
|
91
|
+
const _console_log = console.log;
|
|
92
|
+
|
|
93
|
+
console.log = (...args: any[]) => {
|
|
94
|
+
log({
|
|
95
|
+
data: args,
|
|
96
|
+
_time: Date.now(),
|
|
97
|
+
projectId: $config.APP_ID,
|
|
98
|
+
service: 'app-builder-core',
|
|
99
|
+
env: isSDK()
|
|
100
|
+
? 'SDK'
|
|
101
|
+
: isWeb()
|
|
102
|
+
? 'Web'
|
|
103
|
+
: isAndroid()
|
|
104
|
+
? 'Android'
|
|
105
|
+
: isIOS()
|
|
106
|
+
? 'Ios'
|
|
107
|
+
: 'Electron',
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
isWeb() &&
|
|
111
|
+
window.addEventListener('beforeunload', () => {
|
|
112
|
+
flush();
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
_console_log(...args);
|
|
116
|
+
};
|
|
117
|
+
};
|
|
Binary file
|
|
@@ -30,11 +30,8 @@ const isValidReactComponent = <T,>(Component?: React.ComponentType<T>) =>
|
|
|
30
30
|
|
|
31
31
|
const useHasBrandLogo = () => () => !!$config.LOGO;
|
|
32
32
|
|
|
33
|
-
const shouldAuthenticate: boolean =
|
|
34
|
-
|
|
35
|
-
$config.ENABLE_GOOGLE_OAUTH ||
|
|
36
|
-
$config.ENABLE_MICROSOFT_OAUTH ||
|
|
37
|
-
$config.ENABLE_SLACK_OAUTH;
|
|
33
|
+
const shouldAuthenticate: boolean = false;
|
|
34
|
+
// $config.ENABLE_TOKEN_AUTH || $config.ENABLE_IDP_AUTH;
|
|
38
35
|
|
|
39
36
|
//for our internal usage don't check Platform - electron and web will same kind ui checks. thats why we have isWeb for external usage
|
|
40
37
|
const isWebInternal = () => ReactNativePlatform.OS === 'web';
|
|
@@ -175,13 +172,15 @@ const BREAKPOINTS = {
|
|
|
175
172
|
|
|
176
173
|
const useIsDesktop = () => {
|
|
177
174
|
const {width, height} = useWindowDimensions();
|
|
178
|
-
return (from: 'default' | 'toolbar' | 'popup' = 'default') => {
|
|
175
|
+
return (from: 'default' | 'toolbar' | 'popup' | 'large' = 'default') => {
|
|
179
176
|
if (from === 'default') {
|
|
180
177
|
return width > height ? true : false;
|
|
181
178
|
} else if (from === 'toolbar') {
|
|
182
179
|
return width > BREAKPOINTS.xl;
|
|
183
180
|
} else if (from === 'popup') {
|
|
184
181
|
return width > BREAKPOINTS.md;
|
|
182
|
+
} else if (from === 'large') {
|
|
183
|
+
return width > BREAKPOINTS.lg;
|
|
185
184
|
}
|
|
186
185
|
return width >= BREAKPOINTS.xl;
|
|
187
186
|
};
|
|
@@ -205,6 +204,109 @@ const useResponsive = () => {
|
|
|
205
204
|
}
|
|
206
205
|
};
|
|
207
206
|
};
|
|
207
|
+
|
|
208
|
+
const processDeepLinkURI = (url: string): string => {
|
|
209
|
+
return url
|
|
210
|
+
.replace(`${$config.PRODUCT_ID.toLowerCase()}://my-host`, '')
|
|
211
|
+
.replace($config.FRONTEND_ENDPOINT, '');
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
const getParamFromURL = (url, param) => {
|
|
215
|
+
const include = url.includes(param);
|
|
216
|
+
|
|
217
|
+
if (!include) return null;
|
|
218
|
+
|
|
219
|
+
const params = url.split(/([&,?,=])/);
|
|
220
|
+
const index = params.indexOf(param);
|
|
221
|
+
const value = params[index + 2];
|
|
222
|
+
return value;
|
|
223
|
+
};
|
|
224
|
+
const throttleFn = (fn: Function, wait: number = 300) => {
|
|
225
|
+
let inThrottle: boolean,
|
|
226
|
+
lastFn: ReturnType<typeof setTimeout>,
|
|
227
|
+
lastTime: number;
|
|
228
|
+
return function (this: any) {
|
|
229
|
+
const context = this,
|
|
230
|
+
args = arguments;
|
|
231
|
+
if (!inThrottle) {
|
|
232
|
+
fn.apply(context, args);
|
|
233
|
+
lastTime = Date.now();
|
|
234
|
+
inThrottle = true;
|
|
235
|
+
} else {
|
|
236
|
+
clearTimeout(lastFn);
|
|
237
|
+
lastFn = setTimeout(() => {
|
|
238
|
+
if (Date.now() - lastTime >= wait) {
|
|
239
|
+
fn.apply(context, args);
|
|
240
|
+
lastTime = Date.now();
|
|
241
|
+
}
|
|
242
|
+
}, Math.max(wait - (Date.now() - lastTime), 0));
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
const debounceFn = (fn: Function, ms = 300) => {
|
|
248
|
+
let timeoutId: ReturnType<typeof setTimeout>;
|
|
249
|
+
return function (this: any, ...args: any[]) {
|
|
250
|
+
clearTimeout(timeoutId);
|
|
251
|
+
timeoutId = setTimeout(() => fn.apply(this, args), ms);
|
|
252
|
+
};
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
const capitalizeFirstLetter = (word: string): string => {
|
|
256
|
+
return word.charAt(0).toUpperCase() + word.slice(1);
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
const CustomToolbarSort = (a, b) =>
|
|
260
|
+
(a.hasOwnProperty('order') ? a.order : 999999) -
|
|
261
|
+
(b.hasOwnProperty('order') ? b.order : 999999);
|
|
262
|
+
|
|
263
|
+
const randomString = (
|
|
264
|
+
length = 5,
|
|
265
|
+
chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
|
|
266
|
+
) => {
|
|
267
|
+
var result = '';
|
|
268
|
+
for (var i = length; i > 0; --i)
|
|
269
|
+
result += chars[Math.floor(Math.random() * chars.length)];
|
|
270
|
+
return result;
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
function randomIntFromInterval(min, max) {
|
|
274
|
+
// min and max included
|
|
275
|
+
return Math.floor(Math.random() * (max - min + 1) + min);
|
|
276
|
+
}
|
|
277
|
+
function getOS() {
|
|
278
|
+
let userAgent = window.navigator.userAgent.toLowerCase(),
|
|
279
|
+
macosPlatforms = /(macintosh|macintel|macppc|mac68k|macos)/i,
|
|
280
|
+
windowsPlatforms = /(win32|win64|windows|wince)/i,
|
|
281
|
+
iosPlatforms = /(iphone|ipad|ipod)/i,
|
|
282
|
+
os = null;
|
|
283
|
+
|
|
284
|
+
if (macosPlatforms.test(userAgent)) {
|
|
285
|
+
os = 'macos';
|
|
286
|
+
} else if (iosPlatforms.test(userAgent)) {
|
|
287
|
+
os = 'ios';
|
|
288
|
+
} else if (windowsPlatforms.test(userAgent)) {
|
|
289
|
+
os = 'windows';
|
|
290
|
+
} else if (/android/.test(userAgent)) {
|
|
291
|
+
os = 'android';
|
|
292
|
+
} else if (!os && /linux/.test(userAgent)) {
|
|
293
|
+
os = 'linux';
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
return os;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
function hexToRgb(hex: string): [number, number, number] {
|
|
300
|
+
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
301
|
+
return result
|
|
302
|
+
? [
|
|
303
|
+
parseInt(result[1], 16),
|
|
304
|
+
parseInt(result[2], 16),
|
|
305
|
+
parseInt(result[3], 16),
|
|
306
|
+
]
|
|
307
|
+
: [0, 0, 0];
|
|
308
|
+
}
|
|
309
|
+
|
|
208
310
|
export {
|
|
209
311
|
useIsDesktop,
|
|
210
312
|
useIsSmall,
|
|
@@ -223,4 +325,14 @@ export {
|
|
|
223
325
|
trimText,
|
|
224
326
|
calculatePosition,
|
|
225
327
|
useResponsive,
|
|
328
|
+
processDeepLinkURI,
|
|
329
|
+
getParamFromURL,
|
|
330
|
+
throttleFn,
|
|
331
|
+
debounceFn,
|
|
332
|
+
capitalizeFirstLetter,
|
|
333
|
+
CustomToolbarSort,
|
|
334
|
+
randomString,
|
|
335
|
+
randomIntFromInterval,
|
|
336
|
+
getOS,
|
|
337
|
+
hexToRgb,
|
|
226
338
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const Buffer = require('buffer/').Buffer;
|
|
1
2
|
type Entry<T> = {
|
|
2
3
|
[K in keyof T]: [K, T[K]];
|
|
3
4
|
}[keyof T];
|
|
@@ -74,3 +75,25 @@ export function formatAMPM(date) {
|
|
|
74
75
|
var strTime = hours + ':' + minutes + ' ' + ampm;
|
|
75
76
|
return strTime;
|
|
76
77
|
}
|
|
78
|
+
export function isURL(str) {
|
|
79
|
+
if (!str) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
var urlRegex =
|
|
83
|
+
'^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$';
|
|
84
|
+
var url = new RegExp(urlRegex, 'i');
|
|
85
|
+
return str.length < 2083 && url.test(str);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export const base64ToUint8Array = (base64Str: string) => {
|
|
89
|
+
let decodedData;
|
|
90
|
+
|
|
91
|
+
decodedData = Buffer.from(base64Str, 'base64').toString('binary');
|
|
92
|
+
|
|
93
|
+
const result = new Uint8Array(new ArrayBuffer(decodedData.length));
|
|
94
|
+
for (let i = 0; i < decodedData.length; i += 1) {
|
|
95
|
+
result[i] = decodedData.charCodeAt(i);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return result;
|
|
99
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/*
|
|
2
|
+
********************************************
|
|
3
|
+
Copyright © 2021 Agora Lab, Inc., all rights reserved.
|
|
4
|
+
AppBuilder and all associated components, source code, APIs, services, and documentation
|
|
5
|
+
(the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
|
|
6
|
+
accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
|
|
7
|
+
Use without a license or in violation of any license terms and conditions (including use for
|
|
8
|
+
any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
|
|
9
|
+
information visit https://appbuilder.agora.io.
|
|
10
|
+
*********************************************
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import React, {useState} from 'react';
|
|
14
|
+
import {createHook} from 'customization-implementation';
|
|
15
|
+
import {useToolbar} from './useToolbar';
|
|
16
|
+
|
|
17
|
+
export interface ActionSheetInferface {
|
|
18
|
+
isOnActionSheet: boolean;
|
|
19
|
+
isOnFirstRow: boolean;
|
|
20
|
+
showLabel: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const ActionSheetContext = React.createContext<ActionSheetInferface>({
|
|
24
|
+
isOnActionSheet: false,
|
|
25
|
+
isOnFirstRow: false,
|
|
26
|
+
showLabel: $config.ICON_TEXT,
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
interface ActionSheetProviderProps {
|
|
30
|
+
children: React.ReactNode;
|
|
31
|
+
isOnFirstRow?: boolean;
|
|
32
|
+
}
|
|
33
|
+
const ActionSheetProvider = (props: ActionSheetProviderProps) => {
|
|
34
|
+
const {position} = useToolbar();
|
|
35
|
+
return (
|
|
36
|
+
<ActionSheetContext.Provider
|
|
37
|
+
value={{
|
|
38
|
+
isOnActionSheet: true,
|
|
39
|
+
isOnFirstRow: props?.isOnFirstRow,
|
|
40
|
+
showLabel:
|
|
41
|
+
!props?.isOnFirstRow && $config.ICON_TEXT && position !== undefined,
|
|
42
|
+
}}>
|
|
43
|
+
{props.children}
|
|
44
|
+
</ActionSheetContext.Provider>
|
|
45
|
+
);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const useActionSheet = createHook(ActionSheetContext);
|
|
49
|
+
|
|
50
|
+
export {ActionSheetProvider, useActionSheet};
|
|
@@ -9,21 +9,19 @@
|
|
|
9
9
|
information visit https://appbuilder.agora.io.
|
|
10
10
|
*********************************************
|
|
11
11
|
*/
|
|
12
|
-
import {useContent} from 'customization-api';
|
|
13
12
|
import {useEffect, useState} from 'react';
|
|
14
13
|
import LocalEventEmitter, {
|
|
15
14
|
LocalEventsEnum,
|
|
16
15
|
} from '../rtm-events-api/LocalEvents';
|
|
17
16
|
|
|
18
17
|
/**
|
|
19
|
-
* Returns
|
|
18
|
+
* Returns active speaker uid or undefined if nobody speaking
|
|
20
19
|
* @returns function
|
|
21
20
|
*/
|
|
22
21
|
function useActiveSpeaker() {
|
|
23
22
|
const [activeSpeaker, setActiveSpeaker] = useState(undefined);
|
|
24
|
-
const {defaultContent} = useContent();
|
|
25
23
|
useEffect(() => {
|
|
26
|
-
const listenActiveSpeaker =
|
|
24
|
+
const listenActiveSpeaker = data => {
|
|
27
25
|
setActiveSpeaker(data);
|
|
28
26
|
};
|
|
29
27
|
LocalEventEmitter.on(LocalEventsEnum.ACTIVE_SPEAKER, listenActiveSpeaker);
|
|
@@ -34,9 +32,7 @@ function useActiveSpeaker() {
|
|
|
34
32
|
);
|
|
35
33
|
};
|
|
36
34
|
}, []);
|
|
37
|
-
return activeSpeaker
|
|
38
|
-
? activeSpeaker
|
|
39
|
-
: undefined;
|
|
35
|
+
return activeSpeaker;
|
|
40
36
|
}
|
|
41
37
|
|
|
42
38
|
export default useActiveSpeaker;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {useEffect, useState} from 'react';
|
|
2
|
+
import {AppState} from 'react-native';
|
|
3
|
+
|
|
4
|
+
const useAppState = () => {
|
|
5
|
+
const [appStateVisible, setAppStateVisible] = useState(AppState.currentState);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
const subscription = AppState.addEventListener('change', nextAppState => {
|
|
8
|
+
setAppStateVisible(nextAppState);
|
|
9
|
+
});
|
|
10
|
+
return () => {
|
|
11
|
+
subscription?.remove();
|
|
12
|
+
};
|
|
13
|
+
}, []);
|
|
14
|
+
return appStateVisible;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default useAppState;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import {useRef, useEffect} from 'react';
|
|
2
|
+
|
|
3
|
+
export type Disposer = () => void;
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5
|
+
export type Fn = (...args: any[]) => any;
|
|
6
|
+
export type Nullable<T> = T | null | undefined;
|
|
7
|
+
export type MaybePromise<T> = T | PromiseLike<T>;
|
|
8
|
+
export type MaybePromiseOrNull<T> = MaybePromise<Nullable<T>>;
|
|
9
|
+
|
|
10
|
+
export function invoke<T>(fn: () => T): T | void {
|
|
11
|
+
try {
|
|
12
|
+
return fn();
|
|
13
|
+
} catch (e) {
|
|
14
|
+
console.error(e);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function joinDisposers(disposers: Disposer[]): Disposer {
|
|
19
|
+
return () => disposers.forEach(invoke);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function interval(fn: Fn, interval: number): Disposer {
|
|
23
|
+
const id = setInterval(fn, interval);
|
|
24
|
+
return () => clearInterval(id);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function timeout(fn: Fn, ms: number): Disposer {
|
|
28
|
+
const id = setTimeout(fn, ms);
|
|
29
|
+
return () => clearTimeout(id);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface AsyncTaskRunner {
|
|
33
|
+
run: (
|
|
34
|
+
this: void,
|
|
35
|
+
task: () => MaybePromise<void | (() => MaybePromise<void>)>,
|
|
36
|
+
) => void;
|
|
37
|
+
dispose: (this: void) => void;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Chain async tasks. During the task running/stopping, if multiple tasks are triggered, only the last one will be executed.
|
|
42
|
+
*/
|
|
43
|
+
export function createAsyncTaskRunner(): AsyncTaskRunner {
|
|
44
|
+
let isRunning: boolean | undefined;
|
|
45
|
+
let nextTask: undefined | (() => MaybePromise<void>);
|
|
46
|
+
let disposer: undefined | void | (() => MaybePromise<void>);
|
|
47
|
+
|
|
48
|
+
function runNextTask() {
|
|
49
|
+
if (nextTask) {
|
|
50
|
+
const _nextTask = nextTask;
|
|
51
|
+
nextTask = void 0;
|
|
52
|
+
_nextTask();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function disposeEffect() {
|
|
57
|
+
if (disposer) {
|
|
58
|
+
const _disposer = disposer;
|
|
59
|
+
disposer = void 0;
|
|
60
|
+
try {
|
|
61
|
+
await _disposer();
|
|
62
|
+
} catch (e) {
|
|
63
|
+
console.error(e);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async function runTask(
|
|
69
|
+
effect: () => MaybePromise<void | (() => MaybePromise<void>)>,
|
|
70
|
+
) {
|
|
71
|
+
isRunning = true;
|
|
72
|
+
|
|
73
|
+
await disposeEffect();
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
disposer = await effect();
|
|
77
|
+
} catch (e) {
|
|
78
|
+
console.error(e);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
isRunning = false;
|
|
82
|
+
|
|
83
|
+
runNextTask();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async function stopTask() {
|
|
87
|
+
isRunning = true;
|
|
88
|
+
|
|
89
|
+
await disposeEffect();
|
|
90
|
+
|
|
91
|
+
isRunning = false;
|
|
92
|
+
|
|
93
|
+
runNextTask();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function run(
|
|
97
|
+
task: () => MaybePromise<void | (() => MaybePromise<void>)>,
|
|
98
|
+
): void {
|
|
99
|
+
if (isRunning) {
|
|
100
|
+
nextTask = () => runTask(task);
|
|
101
|
+
} else {
|
|
102
|
+
runTask(task);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function dispose(): void {
|
|
107
|
+
if (isRunning) {
|
|
108
|
+
nextTask = stopTask;
|
|
109
|
+
} else {
|
|
110
|
+
stopTask();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
run,
|
|
116
|
+
dispose,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Accepts a function that contains imperative, possibly asynchronous effect-ful code.
|
|
122
|
+
* During the side-effect running/removing, if multiple effects are triggered, only the last one will be executed.
|
|
123
|
+
*/
|
|
124
|
+
export function useAsyncEffect(
|
|
125
|
+
effect: () => MaybePromise<void | (() => MaybePromise<void>)>,
|
|
126
|
+
deps?: ReadonlyArray<unknown>,
|
|
127
|
+
): void {
|
|
128
|
+
const runnerRef = useRef<AsyncTaskRunner | undefined>();
|
|
129
|
+
useEffect(() => {
|
|
130
|
+
if (!runnerRef.current) {
|
|
131
|
+
runnerRef.current = createAsyncTaskRunner();
|
|
132
|
+
}
|
|
133
|
+
const {run, dispose} = runnerRef.current;
|
|
134
|
+
run(effect);
|
|
135
|
+
return dispose;
|
|
136
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
137
|
+
}, deps);
|
|
138
|
+
}
|
|
@@ -2,18 +2,11 @@ import {gql, useMutation} from '@apollo/client';
|
|
|
2
2
|
import {RoomInfoContextInterface} from '../components/room-info/useRoomInfo';
|
|
3
3
|
import {useSetRoomInfo} from '../components/room-info/useSetRoomInfo';
|
|
4
4
|
import SDKEvents from '../utils/SdkEvents';
|
|
5
|
+
import isSDK from './isSDK';
|
|
5
6
|
|
|
6
7
|
const CREATE_CHANNEL = gql`
|
|
7
|
-
mutation CreateChannel(
|
|
8
|
-
$title:
|
|
9
|
-
$backendURL: String!
|
|
10
|
-
$enablePSTN: Boolean
|
|
11
|
-
) {
|
|
12
|
-
createChannel(
|
|
13
|
-
title: $title
|
|
14
|
-
backendURL: $backendURL
|
|
15
|
-
enablePSTN: $enablePSTN
|
|
16
|
-
) {
|
|
8
|
+
mutation CreateChannel($title: String!, $enablePSTN: Boolean) {
|
|
9
|
+
createChannel(title: $title, enablePSTN: $enablePSTN) {
|
|
17
10
|
passphrase {
|
|
18
11
|
host
|
|
19
12
|
view
|
|
@@ -46,11 +39,14 @@ export default function useCreateRoom(): createRoomFun {
|
|
|
46
39
|
const res = await createChannel({
|
|
47
40
|
variables: {
|
|
48
41
|
title: roomTitle,
|
|
49
|
-
backendURL: $config.BACKEND_ENDPOINT,
|
|
50
42
|
enablePSTN: enablePSTN,
|
|
51
43
|
},
|
|
52
44
|
});
|
|
53
|
-
|
|
45
|
+
// in React-SDK mode, we use a more recent package of @apollo/client
|
|
46
|
+
// which is compatible with react18, long term we should be looking to
|
|
47
|
+
// upgrade core dependency as well. The following condition accounts
|
|
48
|
+
// for differences in the way the two version function.
|
|
49
|
+
if (error && !isSDK) {
|
|
54
50
|
throw error;
|
|
55
51
|
}
|
|
56
52
|
if (res && res?.data && res?.data?.createChannel) {
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/*
|
|
2
|
+
********************************************
|
|
3
|
+
Copyright © 2021 Agora Lab, Inc., all rights reserved.
|
|
4
|
+
AppBuilder and all associated components, source code, APIs, services, and documentation
|
|
5
|
+
(the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
|
|
6
|
+
accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
|
|
7
|
+
Use without a license or in violation of any license terms and conditions (including use for
|
|
8
|
+
any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
|
|
9
|
+
information visit https://appbuilder.agora.io.
|
|
10
|
+
*********************************************
|
|
11
|
+
*/
|
|
12
|
+
import {useRoomInfo} from '../components/room-info/useRoomInfo';
|
|
13
|
+
import {controlMessageEnum} from '../components/ChatContext';
|
|
14
|
+
import events, {PersistanceLevel} from '../rtm-events-api';
|
|
15
|
+
import {MUTE_REMOTE_TYPE} from './useRemoteMute';
|
|
16
|
+
|
|
17
|
+
function useDisableButton() {
|
|
18
|
+
const {
|
|
19
|
+
data: {isHost},
|
|
20
|
+
} = useRoomInfo();
|
|
21
|
+
|
|
22
|
+
return async (type: MUTE_REMOTE_TYPE, action: boolean = true) => {
|
|
23
|
+
if (isHost) {
|
|
24
|
+
events.send(
|
|
25
|
+
controlMessageEnum.disableButton,
|
|
26
|
+
JSON.stringify({button: type, action}),
|
|
27
|
+
PersistanceLevel.None,
|
|
28
|
+
);
|
|
29
|
+
} else {
|
|
30
|
+
console.error(
|
|
31
|
+
'A host can only enable/disable participants video/audio button.',
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export default useDisableButton;
|