agora-appbuilder-core 2.2.0 → 2.3.0-beta.10
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/Readme.md +7 -1
- package/package.json +4 -3
- package/template/Gulpfile.js +389 -82
- package/template/_gitignore +4 -1
- package/template/_package-lock.json +32214 -3080
- package/template/agora-rn-uikit/src/AgoraUIKit.tsx +23 -20
- package/template/agora-rn-uikit/src/Contexts/LocalUserContext.tsx +13 -8
- package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +25 -9
- package/template/agora-rn-uikit/src/Contexts/RenderContext.tsx +10 -0
- package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +11 -5
- package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +6 -2
- package/template/agora-rn-uikit/src/Controls/ImageIcon.tsx +1 -1
- package/template/agora-rn-uikit/src/Controls/Local/EndCall.tsx +6 -2
- package/template/agora-rn-uikit/src/Controls/Local/LocalAudioMute.tsx +2 -2
- package/template/agora-rn-uikit/src/Controls/Local/LocalVideoMute.tsx +2 -2
- package/template/agora-rn-uikit/src/Controls/Local/SwitchCamera.tsx +6 -2
- package/template/agora-rn-uikit/src/Controls/LocalControls.tsx +11 -6
- package/template/agora-rn-uikit/src/Controls/Remote/RemoteAudioMute.tsx +10 -6
- package/template/agora-rn-uikit/src/Controls/Remote/RemoteSwap.tsx +7 -6
- package/template/agora-rn-uikit/src/Controls/Remote/RemoteVideoMute.tsx +6 -5
- package/template/agora-rn-uikit/src/Controls/RemoteControls.tsx +3 -3
- package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +16 -13
- package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +16 -13
- package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +13 -13
- package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +16 -13
- package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +28 -31
- package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +48 -35
- package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +11 -13
- package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +11 -13
- package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +18 -15
- package/template/agora-rn-uikit/src/Rtc/Create.tsx +22 -3
- package/template/agora-rn-uikit/src/Rtc/Join.tsx +19 -3
- package/template/agora-rn-uikit/src/RtcConfigure.tsx +161 -44
- package/template/agora-rn-uikit/src/Utils/useLocalUid.ts +8 -0
- package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +8 -6
- package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +8 -6
- package/template/agora-rn-uikit/src/Views/MinVideoView.tsx +18 -9
- package/template/agora-rn-uikit/src/index.ts +12 -12
- package/template/babel.config.js +17 -1
- package/template/bridge/rtc/webNg/RtcEngine.ts +34 -28
- package/template/bridge/rtc/webNg/SurfaceView.tsx +3 -2
- package/template/bridge/rtc/webNg/Types.ts +14 -0
- package/template/bridge/rtc/webNg/index.ts +5 -2
- package/template/bridge/rtm/web/index.ts +13 -7
- package/template/electron-builder.js +3 -2
- package/template/esbuild.rsdk.go +240 -0
- package/template/{src/subComponents/LayoutEnum.tsx → esbuildConfigTransform.js} +1 -5
- package/template/fpe-api/components.ts +43 -0
- package/template/fpe-api/context.ts +45 -0
- package/template/fpe-api/fpeEvents.ts +9 -0
- package/template/fpe-api/index.ts +21 -0
- package/template/fpe-api/install.ts +138 -0
- package/template/fpe-api/typeDefinition.ts +144 -0
- package/template/fpe-api/useFpe.tsx +35 -0
- package/template/fpe-api/utils.ts +61 -0
- package/template/fpe-implementation/createHook.ts +33 -0
- package/template/fpe-implementation/dummyFpe.ts +17 -0
- package/template/fpe-implementation/index.ts +1 -0
- package/template/fpe-todo.txt +14 -0
- package/template/fpe.config.js +29 -0
- package/template/global.d.ts +4 -0
- package/template/index.rsdk.tsx +27 -0
- package/template/index.wsdk.tsx +27 -0
- package/template/package.json +30 -13
- package/template/react-native-toast-message/src/index.js +9 -10
- package/template/react-native-toast-message/src/index.wsdk.js +419 -0
- package/template/src/App.tsx +97 -65
- package/template/src/AppWrapper.tsx +79 -0
- package/template/src/SDKAppWrapper.tsx +67 -0
- package/template/src/atoms/PrimaryButton.tsx +14 -8
- package/template/src/atoms/TextInput.tsx +13 -5
- package/template/src/components/Chat.tsx +178 -137
- package/template/src/components/ChatContext.ts +18 -22
- package/template/src/components/ColorConfigure.tsx +2 -2
- package/template/src/components/Controls.native.tsx +72 -62
- package/template/src/components/Controls.tsx +90 -69
- package/template/src/components/DeviceConfigure.tsx +1 -1
- package/template/src/components/DeviceContext.tsx +14 -7
- package/template/src/components/GraphQLProvider.tsx +9 -2
- package/template/src/components/GridVideo.tsx +20 -159
- package/template/src/components/HostControlView.tsx +54 -15
- package/template/src/components/Navbar.tsx +408 -157
- package/template/src/components/NetworkQualityContext.tsx +29 -22
- package/template/src/components/ParticipantsView.tsx +91 -115
- package/template/src/components/PinnedVideo.tsx +41 -188
- package/template/src/components/Precall.native.tsx +131 -97
- package/template/src/components/Precall.tsx +193 -158
- package/template/src/components/RTMConfigure.tsx +309 -415
- package/template/src/components/Router.sdk.ts +20 -0
- package/template/src/components/SessionContext.tsx +6 -3
- package/template/src/components/Settings.native.tsx +3 -0
- package/template/src/components/Settings.tsx +65 -31
- package/template/src/components/SettingsView.tsx +14 -8
- package/template/src/components/Share.tsx +188 -220
- package/template/src/components/StorageContext.tsx +5 -5
- package/template/src/components/StoreToken.tsx +5 -1
- package/template/src/components/chat-messages/useChatMessages.tsx +208 -0
- package/template/src/components/chat-notification/useChatNotification.tsx +78 -0
- package/template/src/components/chat-ui/useChatUIControl.tsx +66 -0
- package/template/src/components/common/Error.tsx +54 -0
- package/template/src/components/common/Logo.tsx +35 -0
- package/template/src/components/common/index.tsx +8 -0
- package/template/src/components/contexts/LiveStreamDataContext.tsx +79 -0
- package/template/src/components/contexts/ScreenShareContext.tsx +47 -0
- package/template/src/components/contexts/WhiteboardContext.tsx +59 -0
- package/template/src/components/dimension/DimensionContext.ts +27 -0
- package/template/src/components/dimension/DimensionProvider.tsx +34 -0
- package/template/src/components/livestream/LiveStreamContext.tsx +297 -273
- package/template/src/components/livestream/Types.ts +26 -7
- package/template/src/components/livestream/index.ts +13 -2
- package/template/src/components/livestream/views/LiveStreamControls.tsx +5 -1
- package/template/src/components/meeting-info/useMeetingInfo.tsx +63 -0
- package/template/src/components/meeting-info/useSetMeetingInfo.tsx +38 -0
- package/template/src/components/participants/AllAudienceParticipants.tsx +26 -21
- package/template/src/components/participants/AllHostParticipants.tsx +41 -53
- package/template/src/components/participants/MeParticipant.tsx +9 -10
- package/template/src/components/participants/ParticipantName.tsx +2 -1
- package/template/src/components/participants/RemoteParticipants.tsx +3 -3
- package/template/src/components/precall/LocalMute.native.tsx +91 -0
- package/template/src/components/precall/LocalMute.tsx +90 -0
- package/template/src/components/precall/VideoPreview.native.tsx +35 -0
- package/template/src/components/precall/VideoPreview.tsx +33 -0
- package/template/src/components/precall/index.tsx +28 -0
- package/template/src/components/precall/joinCallBtn.native.tsx +69 -0
- package/template/src/components/precall/joinCallBtn.tsx +91 -0
- package/template/src/components/precall/meetingTitle.tsx +26 -0
- package/template/src/components/precall/selectDevice.tsx +46 -0
- package/template/src/components/precall/textInput.tsx +43 -0
- package/template/src/components/precall/usePreCall.tsx +41 -0
- package/template/src/components/styles.ts +20 -3
- package/template/src/components/useShareLink.tsx +237 -0
- package/template/src/components/useUserPreference.tsx +125 -0
- package/template/src/components/useWakeLock.tsx +3 -3
- package/template/src/custom-events/CustomEvents.ts +238 -0
- package/template/src/custom-events/index.tsx +4 -0
- package/template/src/custom-events/types.ts +51 -0
- package/template/src/language/default-labels/commonLabels.ts +21 -0
- package/template/src/language/default-labels/createScreenLabels.ts +22 -0
- package/template/src/language/default-labels/index.ts +38 -0
- package/template/src/language/default-labels/joinScreenLabels.ts +13 -0
- package/template/src/language/default-labels/precallScreenLabels.ts +33 -0
- package/template/src/language/default-labels/shareLinkScreenLabels.ts +44 -0
- package/template/src/language/default-labels/videoCallScreenLabels.ts +191 -0
- package/template/src/language/i18nTypes.ts +10 -0
- package/template/src/language/index.ts +18 -0
- package/template/src/language/useLanguage.tsx +92 -0
- package/template/src/pages/Authenticate.tsx +21 -15
- package/template/src/pages/Create.tsx +180 -159
- package/template/src/pages/Join.tsx +47 -32
- package/template/src/pages/VideoCall.tsx +138 -407
- package/template/src/pages/create/useCreate.tsx +37 -0
- package/template/src/pages/video-call/CustomLayout.ts +17 -0
- package/template/src/pages/video-call/CustomUserContextHolder.tsx +20 -0
- package/template/src/pages/video-call/DefaultLayouts.ts +65 -0
- package/template/src/pages/video-call/NameWithMicStatus.tsx +62 -0
- package/template/src/pages/video-call/RenderComponent.tsx +52 -0
- package/template/src/pages/video-call/VideoCallScreen.tsx +191 -0
- package/template/src/pages/video-call/VideoComponent.tsx +34 -0
- package/template/src/pages/video-call/VideoRenderer.tsx +86 -0
- package/template/src/pages/video-call/index.ts +20 -0
- package/template/src/rtm/RTMEngine.ts +58 -0
- package/template/src/rtm/utils.ts +44 -0
- package/template/src/rtm-events/EventUtils.ts +267 -0
- package/template/src/rtm-events/EventsQueue.ts +38 -0
- package/template/src/rtm-events/constants.ts +42 -0
- package/template/src/rtm-events/index.tsx +8 -0
- package/template/src/rtm-events/types.ts +7 -0
- package/template/src/subComponents/ChatBubble.tsx +21 -12
- package/template/src/subComponents/ChatContainer.tsx +79 -30
- package/template/src/subComponents/ChatInput.tsx +146 -70
- package/template/src/subComponents/CopyJoinInfo.tsx +52 -67
- package/template/src/subComponents/Error.tsx +35 -24
- package/template/src/subComponents/LanguageSelector.tsx +85 -0
- package/template/src/subComponents/LayoutIconDropdown.native.tsx +163 -0
- package/template/src/subComponents/LayoutIconDropdown.tsx +198 -0
- package/template/src/subComponents/LocalAudioMute.tsx +52 -30
- package/template/src/subComponents/LocalEndCall.tsx +52 -0
- package/template/src/subComponents/LocalSwitchCamera.tsx +61 -0
- package/template/src/subComponents/LocalVideoMute.tsx +48 -30
- package/template/src/subComponents/LogoutButton.tsx +20 -5
- package/template/src/subComponents/NetworkQualityPill.tsx +43 -13
- package/template/src/subComponents/OpenInNativeButton.tsx +3 -2
- package/template/src/subComponents/Recording.tsx +46 -138
- package/template/src/subComponents/RemoteAudioMute.tsx +30 -34
- package/template/src/subComponents/RemoteEndCall.tsx +18 -7
- package/template/src/subComponents/RemoteVideoMute.tsx +17 -9
- package/template/src/subComponents/ScreenShareNotice.tsx +40 -40
- package/template/src/subComponents/SelectDevice.tsx +88 -45
- package/template/src/subComponents/SelectOAuth.tsx +30 -6
- package/template/src/subComponents/SidePanelButtons.ts +39 -0
- package/template/src/subComponents/TextWithTooltip.native.tsx +2 -1
- package/template/src/subComponents/TextWithTooltip.tsx +15 -20
- package/template/src/subComponents/chat/ChatParticipants.tsx +31 -32
- package/template/src/subComponents/livestream/ApprovedLiveStreamControlsView.tsx +7 -3
- package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +32 -18
- package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +22 -8
- package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +12 -7
- package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +24 -27
- package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +23 -26
- package/template/src/subComponents/livestream/index.ts +10 -2
- package/template/src/subComponents/recording/useRecording.tsx +209 -0
- package/template/src/subComponents/recording/useRecordingLayoutQuery.tsx +64 -0
- package/template/src/subComponents/screenshare/ScreenshareButton.native.tsx +18 -0
- package/template/src/subComponents/screenshare/ScreenshareButton.tsx +61 -31
- package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +57 -52
- package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +104 -144
- package/template/src/subComponents/screenshare/useScreenshare.tsx +29 -0
- package/template/src/subComponents/toastConfig.tsx +25 -20
- package/template/src/utils/IsAttendeeUser.ts +34 -0
- package/template/src/utils/SdkEvents.ts +68 -0
- package/template/src/utils/common.tsx +40 -0
- package/template/src/utils/eventEmitter.ts +29 -0
- package/template/src/utils/getMeetingInvite.ts +53 -0
- package/template/src/utils/index.tsx +11 -2
- package/template/src/utils/isAudioEnabled.ts +29 -0
- package/template/src/utils/isHostUser.ts +33 -0
- package/template/src/utils/isMobileOrTablet.native.ts +5 -0
- package/template/src/utils/{mobileWebTest.tsx → isMobileOrTablet.ts} +5 -2
- package/template/src/utils/isPSTNUser.ts +30 -0
- package/template/src/utils/isSDK.sdk.ts +5 -0
- package/template/src/utils/isSDK.ts +5 -0
- package/template/src/utils/isScreenShareUser.ts +31 -0
- package/template/src/utils/isVideoEnabled.ts +29 -0
- package/template/src/utils/useButtonTemplate.tsx +43 -0
- package/template/src/utils/useCreateMeeting.ts +74 -0
- package/template/src/utils/useGetLiveStreamingRequests.ts +24 -0
- package/template/src/utils/useGetMeetingPhrase.ts +68 -0
- package/template/src/utils/useGetName.ts +19 -0
- package/template/src/{subComponents/screenshare/ScreenshareContext.tsx → utils/useGroupMessages.ts} +10 -7
- package/template/src/utils/useJoinMeeting.ts +128 -0
- package/template/src/utils/useLayout.tsx +40 -0
- package/template/src/utils/useLiveStreamingUids.ts +26 -0
- package/template/src/utils/useLocalShareScreenUid.ts +19 -0
- package/template/src/utils/useMutePSTN.ts +43 -0
- package/template/src/utils/useMuteToggleLocal.ts +109 -0
- package/template/src/utils/useNavParams.ts +6 -0
- package/template/src/utils/useNavigateTo.ts +8 -0
- package/template/src/utils/usePrivateMessages.ts +33 -0
- package/template/src/utils/useRemoteEndCall.ts +27 -0
- package/template/src/utils/useRemoteMute.ts +64 -0
- package/template/src/utils/useSendControlMessage.ts +51 -0
- package/template/src/utils/useSendMessage.ts +40 -0
- package/template/src/utils/useSetName.ts +18 -0
- package/template/src/utils/useSetUnreadMessageCount.ts +43 -0
- package/template/src/utils/useSidePanel.tsx +41 -0
- package/template/src/utils/useString.ts +61 -0
- package/template/src/utils/useUnreadMessageCount.ts +50 -0
- package/template/src/utils/useUserList.ts +26 -0
- package/template/tsconfig.json +4 -4
- package/template/tsconfig_fpeApi.json +103 -0
- package/template/tsconfig_rsdk_index.json +105 -0
- package/template/tsconfig_wsdk_index.json +104 -0
- package/template/webpack.commons.js +40 -16
- package/template/webpack.main.config.js +2 -1
- package/template/webpack.renderer.config.js +1 -1
- package/template/webpack.rsdk.config.js +33 -0
- package/template/webpack.ts.config.js +89 -0
- package/template/webpack.web.config.js +8 -1
- package/template/webpack.wsdk.config.js +34 -0
- package/template/agora-rn-uikit/.git/HEAD +0 -1
- package/template/agora-rn-uikit/.git/config +0 -16
- package/template/agora-rn-uikit/.git/description +0 -1
- package/template/agora-rn-uikit/.git/hooks/applypatch-msg.sample +0 -15
- package/template/agora-rn-uikit/.git/hooks/commit-msg.sample +0 -24
- package/template/agora-rn-uikit/.git/hooks/fsmonitor-watchman.sample +0 -173
- package/template/agora-rn-uikit/.git/hooks/post-update.sample +0 -8
- package/template/agora-rn-uikit/.git/hooks/pre-applypatch.sample +0 -14
- package/template/agora-rn-uikit/.git/hooks/pre-commit.sample +0 -49
- package/template/agora-rn-uikit/.git/hooks/pre-merge-commit.sample +0 -13
- package/template/agora-rn-uikit/.git/hooks/pre-push.sample +0 -53
- package/template/agora-rn-uikit/.git/hooks/pre-rebase.sample +0 -169
- package/template/agora-rn-uikit/.git/hooks/pre-receive.sample +0 -24
- package/template/agora-rn-uikit/.git/hooks/prepare-commit-msg.sample +0 -42
- package/template/agora-rn-uikit/.git/hooks/push-to-checkout.sample +0 -78
- package/template/agora-rn-uikit/.git/hooks/update.sample +0 -128
- package/template/agora-rn-uikit/.git/index +0 -0
- package/template/agora-rn-uikit/.git/info/exclude +0 -6
- package/template/agora-rn-uikit/.git/logs/HEAD +0 -2
- package/template/agora-rn-uikit/.git/logs/refs/heads/ab-dev-auto +0 -1
- package/template/agora-rn-uikit/.git/logs/refs/heads/master +0 -1
- package/template/agora-rn-uikit/.git/logs/refs/remotes/origin/HEAD +0 -1
- package/template/agora-rn-uikit/.git/objects/pack/pack-0061d00cd98162a329a32b537488a35d0abeb069.idx +0 -0
- package/template/agora-rn-uikit/.git/objects/pack/pack-0061d00cd98162a329a32b537488a35d0abeb069.pack +0 -0
- package/template/agora-rn-uikit/.git/packed-refs +0 -24
- package/template/agora-rn-uikit/.git/refs/heads/ab-dev-auto +0 -1
- package/template/agora-rn-uikit/.git/refs/heads/master +0 -1
- package/template/agora-rn-uikit/.git/refs/remotes/origin/HEAD +0 -1
- package/template/agora-rn-uikit/.gitignore +0 -63
- package/template/agora-rn-uikit/package-lock.json +0 -7612
- package/template/agora-rn-uikit/src/Contexts/MaxUidContext.tsx +0 -7
- package/template/agora-rn-uikit/src/Contexts/MinUidContext.tsx +0 -8
- package/template/package-lock.json +0 -22923
- package/template/react-native-toast-message/.gitignore +0 -5
- package/template/react-native-toast-message/.npmignore +0 -5
- package/template/react-native-toast-message/package-lock.json +0 -10553
- package/template/src/.DS_Store +0 -0
- package/template/src/components/participants/context/ParticipantContext.tsx +0 -97
- package/template/src/subComponents/.DS_Store +0 -0
- package/template/src/subComponents/ScreenshareButton.tsx +0 -257
- package/template/src/subComponents/SwitchCamera.tsx +0 -35
- package/template/src/utils/hasBrandLogo.tsx +0 -3
- package/template/src/utils/mobileWebTest.native.tsx +0 -5
- package/template/src/utils/shouldAuthenticate.tsx +0 -7
|
@@ -1,56 +1,60 @@
|
|
|
1
1
|
import React, {createContext, useContext, useState, useRef} from 'react';
|
|
2
|
-
import ChatContext, {
|
|
3
|
-
controlMessageEnum,
|
|
4
|
-
messageChannelType,
|
|
5
|
-
attrRequestTypes,
|
|
6
|
-
} from '../ChatContext';
|
|
2
|
+
import ChatContext, {controlMessageEnum} from '../ChatContext';
|
|
7
3
|
import Toast from '../../../react-native-toast-message';
|
|
8
4
|
import {
|
|
9
5
|
LiveStreamControlMessageEnum,
|
|
10
6
|
LSNotificationObject,
|
|
11
7
|
liveStreamContext,
|
|
12
|
-
requestStatus,
|
|
13
|
-
requestInterface,
|
|
14
|
-
attrRequestStatus,
|
|
15
|
-
attrRequestInterface,
|
|
16
8
|
liveStreamPropsInterface,
|
|
9
|
+
raiseHandItemInterface,
|
|
10
|
+
RaiseHandValue,
|
|
11
|
+
raiseHandListInterface,
|
|
17
12
|
} from './Types';
|
|
18
|
-
import {ClientRole} from '../../../agora-rn-uikit';
|
|
19
|
-
import
|
|
20
|
-
import {
|
|
13
|
+
import {ClientRole, useLocalUid, UidType} from '../../../agora-rn-uikit';
|
|
14
|
+
import {filterObject, isEmptyObject} from '../../utils';
|
|
15
|
+
import {useMeetingInfo} from '../meeting-info/useMeetingInfo';
|
|
16
|
+
import useUserList from '../../utils/useUserList';
|
|
17
|
+
import {useScreenshare} from '../../subComponents/screenshare/useScreenshare';
|
|
18
|
+
import CustomEvents, {EventLevel} from '../../custom-events';
|
|
19
|
+
import {EventNames} from '../../rtm-events';
|
|
21
20
|
|
|
22
21
|
const LiveStreamContext = createContext(null as unknown as liveStreamContext);
|
|
23
22
|
|
|
24
23
|
export const LiveStreamContextConsumer = LiveStreamContext.Consumer;
|
|
25
24
|
|
|
26
|
-
export const LiveStreamContextProvider
|
|
27
|
-
|
|
25
|
+
export const LiveStreamContextProvider: React.FC<liveStreamPropsInterface> = (
|
|
26
|
+
props,
|
|
27
|
+
) => {
|
|
28
|
+
const screenshareContextInstance = useScreenshare();
|
|
29
|
+
const screenshareContextInstanceRef = useRef<any>();
|
|
30
|
+
screenshareContextInstanceRef.current = screenshareContextInstance;
|
|
28
31
|
|
|
29
|
-
const {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
sendControlMessageToUid,
|
|
33
|
-
sendControlMessage,
|
|
34
|
-
broadcastUserAttributes,
|
|
35
|
-
addOrUpdateLocalUserAttributes,
|
|
36
|
-
events,
|
|
37
|
-
} = useContext(ChatContext);
|
|
32
|
+
const {renderList} = useUserList();
|
|
33
|
+
const renderListRef = useRef<any>();
|
|
34
|
+
renderListRef.current = renderList;
|
|
38
35
|
|
|
39
|
-
const
|
|
36
|
+
const [raiseHandList, setRaiseHandList] = useState<raiseHandListInterface>(
|
|
37
|
+
{},
|
|
38
|
+
);
|
|
39
|
+
const raiseHandListRef = useRef<any>();
|
|
40
|
+
raiseHandListRef.current = raiseHandList;
|
|
41
|
+
|
|
42
|
+
React.useEffect(() => {
|
|
43
|
+
renderListRef.current = renderList;
|
|
44
|
+
}, [renderList]);
|
|
40
45
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
46
|
+
React.useEffect(() => {
|
|
47
|
+
raiseHandListRef.current = raiseHandList;
|
|
48
|
+
}, [raiseHandList]);
|
|
44
49
|
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
50
|
+
const localUid = useLocalUid();
|
|
51
|
+
const localUidRef = useRef<any>();
|
|
52
|
+
localUidRef.current = localUid;
|
|
48
53
|
|
|
49
|
-
const
|
|
50
|
-
Partial<Record<string, requestInterface>>
|
|
51
|
-
>({});
|
|
54
|
+
const {hasUserJoinedRTM} = useContext(ChatContext);
|
|
52
55
|
|
|
53
|
-
const
|
|
56
|
+
const {setRtcProps, rtcProps, callActive} = props?.value;
|
|
57
|
+
const {isHost} = useMeetingInfo();
|
|
54
58
|
|
|
55
59
|
const [lastCheckedRequestTimestamp, setLastCheckedRequestTimestamp] =
|
|
56
60
|
useState(0);
|
|
@@ -60,8 +64,6 @@ export const LiveStreamContextProvider = (props: liveStreamPropsInterface) => {
|
|
|
60
64
|
|
|
61
65
|
const [isPendingRequestToReview, setPendingRequestToReview] = useState(false);
|
|
62
66
|
|
|
63
|
-
const localUserRef = useRef({uid: localUid, status: ''});
|
|
64
|
-
|
|
65
67
|
const showToast = (text: string) => {
|
|
66
68
|
Toast.show({
|
|
67
69
|
type: 'success',
|
|
@@ -81,37 +83,95 @@ export const LiveStreamContextProvider = (props: liveStreamPropsInterface) => {
|
|
|
81
83
|
};
|
|
82
84
|
|
|
83
85
|
const getAttendeeName = (uid: number | string) => {
|
|
84
|
-
return
|
|
86
|
+
return renderListRef.current?.[uid]?.name
|
|
87
|
+
? renderListRef.current[uid].name
|
|
88
|
+
: 'user';
|
|
85
89
|
};
|
|
86
90
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
91
|
+
const addOrUpdateLiveStreamRequest = (
|
|
92
|
+
userUID: string,
|
|
93
|
+
payload: Partial<raiseHandItemInterface>,
|
|
94
|
+
) => {
|
|
95
|
+
if (userUID && !isEmptyObject(payload)) {
|
|
96
|
+
const userId = `${userUID}`;
|
|
97
|
+
setRaiseHandList((oldRaisedHandList) => ({
|
|
98
|
+
...oldRaisedHandList,
|
|
99
|
+
[userId]: {
|
|
100
|
+
raised: payload?.raised || RaiseHandValue.FALSE,
|
|
101
|
+
ts: payload?.ts || Date.now(),
|
|
102
|
+
role:
|
|
103
|
+
payload?.role ||
|
|
104
|
+
oldRaisedHandList[userId]?.role ||
|
|
105
|
+
ClientRole.Audience,
|
|
106
|
+
},
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
const changeClientRoleTo = (newRole: ClientRole) => {
|
|
112
|
+
updateRtcProps(newRole);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const UpdtLocStateAndBCastAttr = (newRole: ClientRole, ts: number) => {
|
|
116
|
+
switch (newRole) {
|
|
117
|
+
case ClientRole.Audience:
|
|
118
|
+
addOrUpdateLiveStreamRequest(localUidRef.current, {
|
|
119
|
+
raised: RaiseHandValue.FALSE,
|
|
120
|
+
ts: ts,
|
|
121
|
+
role: ClientRole.Audience,
|
|
122
|
+
});
|
|
123
|
+
// Audience notfies all host when request is rejected
|
|
124
|
+
CustomEvents.send(EventNames.RAISED_ATTRIBUTE, {
|
|
125
|
+
action: LiveStreamControlMessageEnum.notifyHostsInChannel,
|
|
126
|
+
level: EventLevel.LEVEL2,
|
|
127
|
+
value: RaiseHandValue.FALSE,
|
|
128
|
+
});
|
|
129
|
+
break;
|
|
130
|
+
case ClientRole.Broadcaster:
|
|
131
|
+
// Update local state
|
|
132
|
+
addOrUpdateLiveStreamRequest(localUidRef.current, {
|
|
133
|
+
raised: RaiseHandValue.TRUE,
|
|
134
|
+
ts: ts,
|
|
135
|
+
role: ClientRole.Broadcaster,
|
|
136
|
+
});
|
|
137
|
+
// Audience notfies all host when request is approved
|
|
138
|
+
CustomEvents.send(EventNames.RAISED_ATTRIBUTE, {
|
|
139
|
+
action: LiveStreamControlMessageEnum.notifyHostsInChannel,
|
|
140
|
+
value: RaiseHandValue.TRUE,
|
|
141
|
+
level: EventLevel.LEVEL2,
|
|
142
|
+
});
|
|
143
|
+
default:
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
// Get feeback for performance wise from @nitesh
|
|
149
|
+
const pendingRequests = filterObject(
|
|
150
|
+
raiseHandList,
|
|
151
|
+
([k, v]) =>
|
|
152
|
+
v?.raised === RaiseHandValue.TRUE && v?.role == ClientRole.Audience,
|
|
153
|
+
);
|
|
95
154
|
|
|
96
155
|
React.useEffect(() => {
|
|
97
156
|
// Get the time timestamp of recent request
|
|
98
|
-
const recentRequest = Object.values(
|
|
157
|
+
const recentRequest = Object.values(pendingRequests).sort(
|
|
99
158
|
(a, b) => b?.ts - a?.ts || 0,
|
|
100
159
|
)[0]; // sorting in descending order and take the first request
|
|
101
160
|
|
|
102
161
|
if (recentRequest?.ts) {
|
|
103
162
|
setLastRequestReceivedTimestamp(recentRequest.ts);
|
|
104
163
|
}
|
|
105
|
-
if (Object.keys(
|
|
164
|
+
if (Object.keys(pendingRequests).length === 0) {
|
|
106
165
|
setPendingRequestToReview(false);
|
|
107
166
|
}
|
|
108
|
-
}, [
|
|
167
|
+
}, [raiseHandList]);
|
|
109
168
|
|
|
110
169
|
React.useEffect(() => {
|
|
111
170
|
if (
|
|
112
|
-
//
|
|
113
|
-
Object.keys(
|
|
114
|
-
lastRequestReceivedTimestamp >= lastCheckedRequestTimestamp
|
|
171
|
+
// Only true host should see the pending request
|
|
172
|
+
Object.keys(pendingRequests).length !== 0 &&
|
|
173
|
+
lastRequestReceivedTimestamp >= lastCheckedRequestTimestamp &&
|
|
174
|
+
isHost
|
|
115
175
|
) {
|
|
116
176
|
setPendingRequestToReview(true);
|
|
117
177
|
} else {
|
|
@@ -119,289 +179,253 @@ export const LiveStreamContextProvider = (props: liveStreamPropsInterface) => {
|
|
|
119
179
|
}
|
|
120
180
|
}, [lastRequestReceivedTimestamp, lastCheckedRequestTimestamp]);
|
|
121
181
|
|
|
182
|
+
/** ******* SETTING UP ROLES BEGINS ******* */
|
|
122
183
|
React.useEffect(() => {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
filterObject(
|
|
126
|
-
currLiveStreamRequest,
|
|
127
|
-
([k, v]) => userList[k] && !userList[k]?.offline,
|
|
128
|
-
),
|
|
129
|
-
);
|
|
130
|
-
|
|
131
|
-
// Check attribute of user joined if it has request livestreaming attribute
|
|
132
|
-
const uidsOfUsersHavingLSRequest: attrRequestInterface[] = Object.keys(
|
|
133
|
-
filterObject(
|
|
134
|
-
userList,
|
|
135
|
-
([k, v]) =>
|
|
136
|
-
v?.requests === attrRequestStatus.RaiseHand_AwaitingAction ||
|
|
137
|
-
v?.requests === attrRequestStatus.RaiseHand_Approved,
|
|
138
|
-
),
|
|
139
|
-
).map((key) => ({
|
|
140
|
-
uid: key,
|
|
141
|
-
status:
|
|
142
|
-
userList[key]?.requests || attrRequestStatus.RaiseHand_AwaitingAction,
|
|
143
|
-
}));
|
|
144
|
-
|
|
145
|
-
// console.log('uidsOfUsersHavingLSRequest', uidsOfUsersHavingLSRequest);
|
|
146
|
-
// Set uids of user who have active live streaming request
|
|
147
|
-
setUidsOfInitialRequests([...uidsOfUsersHavingLSRequest]);
|
|
148
|
-
}, [userList]);
|
|
149
|
-
|
|
150
|
-
React.useEffect(() => {
|
|
151
|
-
// Filter new requests
|
|
152
|
-
const initialRequests = uidsOfInitialRequests
|
|
153
|
-
.filter(
|
|
154
|
-
(item: attrRequestInterface) => !currLiveStreamRequest?.[item.uid],
|
|
155
|
-
)
|
|
156
|
-
.reduce((acc, item) => {
|
|
184
|
+
CustomEvents.on(EventNames.ROLE_ATTRIBUTE, (data) => {
|
|
185
|
+
setRaiseHandList((prevState) => {
|
|
157
186
|
return {
|
|
158
|
-
...
|
|
159
|
-
[
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
: requestStatus.AwaitingAction,
|
|
187
|
+
...prevState,
|
|
188
|
+
[data.sender]: {
|
|
189
|
+
...prevState[data.sender],
|
|
190
|
+
role:
|
|
191
|
+
data.payload.value in ClientRole
|
|
192
|
+
? parseInt(data.payload.value)
|
|
193
|
+
: ClientRole.Audience,
|
|
166
194
|
},
|
|
167
195
|
};
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
}, []);
|
|
199
|
+
|
|
200
|
+
React.useEffect(() => {
|
|
201
|
+
if (!callActive || !hasUserJoinedRTM) return;
|
|
202
|
+
CustomEvents.send(EventNames.ROLE_ATTRIBUTE, {
|
|
203
|
+
level: EventLevel.LEVEL2,
|
|
204
|
+
value: rtcProps.role in ClientRole ? rtcProps.role : ClientRole.Audience,
|
|
205
|
+
});
|
|
206
|
+
setRaiseHandList((prevState) => {
|
|
207
|
+
return {
|
|
208
|
+
...prevState,
|
|
209
|
+
[localUid]: {
|
|
210
|
+
...prevState[localUid],
|
|
211
|
+
role:
|
|
212
|
+
rtcProps.role in ClientRole ? rtcProps.role : ClientRole.Audience,
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
});
|
|
216
|
+
}, [callActive, rtcProps.role, hasUserJoinedRTM]);
|
|
217
|
+
|
|
218
|
+
/** ******* SETTING UP ROLES ENDS ********/
|
|
174
219
|
|
|
175
|
-
|
|
220
|
+
/** ******* EVENT LISTENERS SECTION BEGINS ******* */
|
|
176
221
|
|
|
177
222
|
React.useEffect(() => {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
(data
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
223
|
+
/** ********************** HOST EVENTS SECTION BEGINS ********************** */
|
|
224
|
+
CustomEvents.on(EventNames.RAISED_ATTRIBUTE, (data) => {
|
|
225
|
+
if (!isHost) return;
|
|
226
|
+
switch (data?.payload?.action) {
|
|
227
|
+
// 1. Host can receive raise hand request with true or false value
|
|
228
|
+
case LiveStreamControlMessageEnum.raiseHandRequest:
|
|
229
|
+
switch (data?.payload?.value) {
|
|
230
|
+
case RaiseHandValue.TRUE:
|
|
231
|
+
// Step 1: Show notifications
|
|
232
|
+
showToast(
|
|
233
|
+
`${getAttendeeName(data.sender)} ${
|
|
234
|
+
LSNotificationObject.RAISE_HAND_RECEIVED
|
|
235
|
+
}`,
|
|
236
|
+
);
|
|
237
|
+
// 2. All Hosts in channel update their raised state to "true" when attendee raise their hand
|
|
238
|
+
addOrUpdateLiveStreamRequest(data.sender, {
|
|
239
|
+
ts: data.ts,
|
|
240
|
+
raised: RaiseHandValue.TRUE,
|
|
241
|
+
role: ClientRole.Audience,
|
|
242
|
+
});
|
|
243
|
+
break;
|
|
244
|
+
case RaiseHandValue.FALSE:
|
|
245
|
+
// Step 1: Show notifications
|
|
246
|
+
showToast(
|
|
247
|
+
`${getAttendeeName(data.sender)} ${
|
|
248
|
+
LSNotificationObject.RAISE_HAND_REQUEST_RECALL
|
|
249
|
+
}`,
|
|
250
|
+
);
|
|
251
|
+
// 2. All Hosts in channel update raised state to "false" when attendee recalls their request
|
|
252
|
+
addOrUpdateLiveStreamRequest(data.sender, {
|
|
253
|
+
ts: data.ts,
|
|
254
|
+
raised: RaiseHandValue.FALSE,
|
|
255
|
+
role: ClientRole.Audience,
|
|
256
|
+
});
|
|
257
|
+
default:
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
break;
|
|
261
|
+
// 2. All Hosts in channel gets notified when an attendee's request gets approved or rejected
|
|
262
|
+
case LiveStreamControlMessageEnum.notifyHostsInChannel:
|
|
263
|
+
if (!isHost) return;
|
|
264
|
+
switch (data.payload.value) {
|
|
265
|
+
case RaiseHandValue.TRUE:
|
|
266
|
+
addOrUpdateLiveStreamRequest(data.sender, {
|
|
267
|
+
ts: data.ts,
|
|
268
|
+
raised: RaiseHandValue.TRUE,
|
|
269
|
+
role: ClientRole.Broadcaster,
|
|
270
|
+
});
|
|
271
|
+
break;
|
|
272
|
+
case RaiseHandValue.FALSE:
|
|
273
|
+
addOrUpdateLiveStreamRequest(data.sender, {
|
|
274
|
+
ts: data.ts,
|
|
275
|
+
raised: RaiseHandValue.FALSE,
|
|
276
|
+
role: ClientRole.Audience,
|
|
277
|
+
});
|
|
278
|
+
break;
|
|
279
|
+
default:
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
break;
|
|
283
|
+
default:
|
|
284
|
+
break;
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
/** ********************** HOST EVENTS SECTION ENDS ********************** */
|
|
288
|
+
|
|
289
|
+
/** ********************** AUDIENCE EVENTS SECTION BEGINS ********************** */
|
|
290
|
+
// 1. Audience receives this when the request is accepted by host
|
|
291
|
+
CustomEvents.on(
|
|
292
|
+
LiveStreamControlMessageEnum.raiseHandRequestAccepted,
|
|
293
|
+
(data) => {
|
|
294
|
+
if (raiseHandList[localUidRef.current]?.raised === RaiseHandValue.FALSE)
|
|
295
|
+
return;
|
|
296
|
+
showToast(LSNotificationObject.RAISE_HAND_ACCEPTED);
|
|
297
|
+
// Promote user's privileges to host
|
|
298
|
+
changeClientRoleTo(ClientRole.Broadcaster);
|
|
299
|
+
// Audience updates its local attributes and notfies all host when request is approved
|
|
300
|
+
UpdtLocStateAndBCastAttr(ClientRole.Broadcaster, data.ts);
|
|
230
301
|
},
|
|
231
302
|
);
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
notifyAllHostsInChannel(
|
|
256
|
-
LiveStreamControlMessageEnum.notifyAllRequestRejected,
|
|
257
|
-
);
|
|
258
|
-
localUserRef.current.status = requestStatus.Cancelled;
|
|
259
|
-
updateLocalUserAttributes(attrRequestTypes.none);
|
|
260
|
-
break;
|
|
261
|
-
// 3. Audience receives this when host demotes (canceled after approval)
|
|
262
|
-
case LiveStreamControlMessageEnum.raiseHandApprovedRequestRecall:
|
|
263
|
-
showToast(LSNotificationObject.RAISE_HAND_APPROVED_REQUEST_RECALL);
|
|
264
|
-
screenshareContextInstance?.stopUserScreenShare(); // This will not exist on ios
|
|
265
|
-
setRaiseHandRequestActive(false);
|
|
266
|
-
// Audience notfies all host when request is rejected
|
|
267
|
-
notifyAllHostsInChannel(
|
|
268
|
-
LiveStreamControlMessageEnum.notifyAllRequestRejected,
|
|
269
|
-
);
|
|
270
|
-
changeClientRoleTo(ClientRole.Audience);
|
|
271
|
-
localUserRef.current.status = requestStatus.Cancelled;
|
|
272
|
-
break;
|
|
273
|
-
// 4. Audience when receives kickUser notifies all host when is kicked out
|
|
274
|
-
case controlMessageEnum.kickUser:
|
|
275
|
-
notifyAllHostsInChannel(
|
|
276
|
-
LiveStreamControlMessageEnum.notifyAllRequestRejected,
|
|
277
|
-
);
|
|
278
|
-
localUserRef.current.status = requestStatus.Cancelled;
|
|
279
|
-
break;
|
|
280
|
-
default:
|
|
281
|
-
break;
|
|
303
|
+
/** 2. Audience receives this when the request is rejected by host
|
|
304
|
+
* 2.a Audience receives this when the request is rejected by host which is not yet approved
|
|
305
|
+
* 2.b Audience receives this when the request when is demoted by the host
|
|
306
|
+
*/
|
|
307
|
+
CustomEvents.on(
|
|
308
|
+
LiveStreamControlMessageEnum.raiseHandRequestRejected,
|
|
309
|
+
(data) => {
|
|
310
|
+
/** 2.a */
|
|
311
|
+
if (
|
|
312
|
+
raiseHandListRef.current[localUidRef.current].role ==
|
|
313
|
+
ClientRole.Audience
|
|
314
|
+
) {
|
|
315
|
+
showToast(LSNotificationObject.RAISE_HAND_REJECTED);
|
|
316
|
+
} else if (
|
|
317
|
+
raiseHandListRef.current[localUidRef.current].role ==
|
|
318
|
+
ClientRole.Broadcaster
|
|
319
|
+
) {
|
|
320
|
+
/** 2.b */
|
|
321
|
+
showToast(LSNotificationObject.RAISE_HAND_APPROVED_REQUEST_RECALL);
|
|
322
|
+
screenshareContextInstanceRef?.current?.stopUserScreenShare(); // This will not exist on ios
|
|
323
|
+
|
|
324
|
+
// Demote user's privileges to audience
|
|
325
|
+
changeClientRoleTo(ClientRole.Audience);
|
|
282
326
|
}
|
|
327
|
+
// Audience updates its local attributes and notfies all host when demoted/request rejected
|
|
328
|
+
UpdtLocStateAndBCastAttr(ClientRole.Audience, data.ts);
|
|
283
329
|
},
|
|
284
330
|
);
|
|
331
|
+
// 3. Audience when receives kickUser notifies all host when is kicked out
|
|
332
|
+
CustomEvents.on(controlMessageEnum.kickUser, (data) => {
|
|
333
|
+
// Audience updates its local attributes and notfies all host when they(audience) are kicked out
|
|
334
|
+
UpdtLocStateAndBCastAttr(ClientRole.Audience, data.ts);
|
|
335
|
+
});
|
|
336
|
+
/** ********************** AUDIENCE EVENTS SECTION ENDS ********************** */
|
|
337
|
+
}, []);
|
|
285
338
|
|
|
286
|
-
|
|
287
|
-
// Cleanup the listeners
|
|
288
|
-
events.off(messageChannelType.Public, 'onLiveStreamActionsForHost');
|
|
289
|
-
events.off(messageChannelType.Private, 'onLiveStreamActionsForAudience');
|
|
290
|
-
};
|
|
291
|
-
}, [events, localUid, isHost, raiseHandRequestActive, userList]);
|
|
292
|
-
|
|
293
|
-
const addOrUpdateLiveStreamRequest = (request: requestInterface) => {
|
|
294
|
-
if (request && request?.uid && request?.ts && request?.uid) {
|
|
295
|
-
setLiveStreamRequest((oldLiveStreamRequest) => ({
|
|
296
|
-
...oldLiveStreamRequest,
|
|
297
|
-
[request?.uid as string]: {
|
|
298
|
-
status: request.status,
|
|
299
|
-
ts: request.ts,
|
|
300
|
-
uid: request.uid,
|
|
301
|
-
},
|
|
302
|
-
}));
|
|
303
|
-
}
|
|
304
|
-
};
|
|
305
|
-
|
|
306
|
-
const changeClientRoleTo = (newRole: ClientRole) => {
|
|
307
|
-
updateRtcProps(newRole);
|
|
308
|
-
broadcastUserAttributes(
|
|
309
|
-
[{key: 'role', value: newRole.toString()}],
|
|
310
|
-
controlMessageEnum.clientRoleChanged,
|
|
311
|
-
);
|
|
312
|
-
};
|
|
313
|
-
|
|
314
|
-
const notifyAllHostsInChannel = (ctrlEnum: LiveStreamControlMessageEnum) => {
|
|
315
|
-
sendControlMessage(ctrlEnum);
|
|
316
|
-
};
|
|
339
|
+
/** ******* EVENT LISTENERS SECTION ENDS ******* */
|
|
317
340
|
|
|
318
|
-
|
|
319
|
-
|
|
341
|
+
/** ******* HOST CONTROLS SECTION BEGINS ******* */
|
|
342
|
+
/* Host controls for Live Streaming
|
|
320
343
|
* a. Host can approve streaming request sent by audience
|
|
321
344
|
* b. Host can reject streaming request sent by audience
|
|
322
345
|
*/
|
|
323
346
|
|
|
324
|
-
const hostApprovesRequestOfUID = (uid:
|
|
325
|
-
addOrUpdateLiveStreamRequest({
|
|
326
|
-
|
|
347
|
+
const hostApprovesRequestOfUID = (uid: UidType) => {
|
|
348
|
+
addOrUpdateLiveStreamRequest(`${uid}`, {
|
|
349
|
+
raised: RaiseHandValue.TRUE,
|
|
327
350
|
ts: new Date().getTime(),
|
|
328
|
-
status: requestStatus.Cancelled,
|
|
329
351
|
});
|
|
330
|
-
|
|
352
|
+
CustomEvents.send(
|
|
331
353
|
LiveStreamControlMessageEnum.raiseHandRequestAccepted,
|
|
354
|
+
{},
|
|
332
355
|
uid,
|
|
333
356
|
);
|
|
334
357
|
};
|
|
335
358
|
|
|
336
|
-
const hostRejectsRequestOfUID = (uid:
|
|
337
|
-
addOrUpdateLiveStreamRequest({
|
|
338
|
-
|
|
359
|
+
const hostRejectsRequestOfUID = (uid: UidType) => {
|
|
360
|
+
addOrUpdateLiveStreamRequest(`${uid}`, {
|
|
361
|
+
raised: RaiseHandValue.FALSE,
|
|
339
362
|
ts: new Date().getTime(),
|
|
340
|
-
status: requestStatus.Cancelled,
|
|
341
363
|
});
|
|
342
|
-
|
|
364
|
+
CustomEvents.send(
|
|
343
365
|
LiveStreamControlMessageEnum.raiseHandRequestRejected,
|
|
366
|
+
{},
|
|
344
367
|
uid,
|
|
345
368
|
);
|
|
346
369
|
};
|
|
347
370
|
|
|
348
|
-
|
|
371
|
+
/** ******* HOST CONTROLS SECTION ENDS ******* */
|
|
372
|
+
|
|
373
|
+
/** ******* AUDIENCE CONTROLS SECTION BEGINS *******
|
|
349
374
|
* Audience have below controls
|
|
350
375
|
* a. Audience can raise a request to live stream
|
|
351
376
|
* b. Audience can recalls his request to live stream
|
|
352
377
|
* i. While recalling the request could be either approved or not approved
|
|
353
378
|
*/
|
|
354
379
|
|
|
355
|
-
const audienceSendsRequest = () => {
|
|
380
|
+
const audienceSendsRequest = async (): Promise<void> => {
|
|
381
|
+
// If hand is already raised, skip the call
|
|
382
|
+
if (raiseHandList[localUidRef.current]?.raised === RaiseHandValue.TRUE)
|
|
383
|
+
return;
|
|
356
384
|
showToast(LSNotificationObject.RAISE_HAND_REQUEST);
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
385
|
+
CustomEvents.send(EventNames.RAISED_ATTRIBUTE, {
|
|
386
|
+
action: LiveStreamControlMessageEnum.raiseHandRequest,
|
|
387
|
+
level: EventLevel.LEVEL2,
|
|
388
|
+
value: RaiseHandValue.TRUE,
|
|
389
|
+
});
|
|
390
|
+
// Update local state
|
|
391
|
+
addOrUpdateLiveStreamRequest(localUidRef.current, {
|
|
392
|
+
raised: RaiseHandValue.TRUE,
|
|
393
|
+
ts: new Date().getTime(),
|
|
394
|
+
});
|
|
360
395
|
};
|
|
361
396
|
|
|
362
|
-
const audienceRecallsRequest = () => {
|
|
397
|
+
const audienceRecallsRequest = async (): Promise<void> => {
|
|
398
|
+
// If hand is already down, skip the call
|
|
399
|
+
if (raiseHandList[localUidRef.current]?.raised === RaiseHandValue.FALSE)
|
|
400
|
+
return;
|
|
363
401
|
/**
|
|
364
402
|
* if: Check if request is already approved
|
|
365
|
-
* else: Audience Request was not approved by host, and was
|
|
403
|
+
* else: Audience Request was not approved by host, and was pending
|
|
366
404
|
*/
|
|
367
405
|
if (
|
|
368
|
-
|
|
369
|
-
|
|
406
|
+
raiseHandList[localUidRef.current]?.role == ClientRole.Broadcaster &&
|
|
407
|
+
raiseHandList[localUidRef.current]?.raised === RaiseHandValue.TRUE
|
|
370
408
|
) {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
/// Change role and send message in channel notifying the same
|
|
409
|
+
screenshareContextInstanceRef?.current?.stopUserScreenShare(); // This will not exist on ios
|
|
410
|
+
// Change role
|
|
374
411
|
changeClientRoleTo(ClientRole.Audience);
|
|
375
|
-
notifyAllHostsInChannel(
|
|
376
|
-
LiveStreamControlMessageEnum.notifyAllRequestRejected,
|
|
377
|
-
);
|
|
378
|
-
} else {
|
|
379
|
-
setRaiseHandRequestActive(false);
|
|
380
|
-
// Send message in channel to withdraw the request
|
|
381
|
-
sendControlMessage(LiveStreamControlMessageEnum.raiseHandRequestRecall);
|
|
382
412
|
}
|
|
383
|
-
|
|
413
|
+
UpdtLocStateAndBCastAttr(ClientRole.Audience, new Date().getTime());
|
|
384
414
|
showToast(LSNotificationObject.RAISE_HAND_REQUEST_RECALL_LOCAL);
|
|
385
415
|
};
|
|
386
416
|
|
|
387
|
-
|
|
388
|
-
value: attrRequestTypes | attrRequestStatus,
|
|
389
|
-
) => {
|
|
390
|
-
addOrUpdateLocalUserAttributes([{key: 'requests', value: value}]);
|
|
391
|
-
};
|
|
417
|
+
/** ******* AUDIENCE CONTROLS SECTION ENDS ******* */
|
|
392
418
|
|
|
393
419
|
return (
|
|
394
420
|
<LiveStreamContext.Provider
|
|
395
421
|
value={{
|
|
396
422
|
setLastCheckedRequestTimestamp,
|
|
397
423
|
isPendingRequestToReview,
|
|
398
|
-
|
|
424
|
+
raiseHandList,
|
|
399
425
|
hostApprovesRequestOfUID,
|
|
400
426
|
hostRejectsRequestOfUID,
|
|
401
427
|
audienceSendsRequest,
|
|
402
428
|
audienceRecallsRequest,
|
|
403
|
-
raiseHandRequestActive,
|
|
404
|
-
setRaiseHandRequestActive,
|
|
405
429
|
}}>
|
|
406
430
|
{props.children}
|
|
407
431
|
</LiveStreamContext.Provider>
|