agora-appbuilder-core 2.2.0 → 2.3.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Readme.md +7 -1
- package/package.json +4 -3
- package/template/Gulpfile.js +306 -87
- package/template/_gitignore +4 -1
- package/template/_package-lock.json +2297 -2533
- package/template/agora-rn-uikit/.git/HEAD +1 -1
- package/template/agora-rn-uikit/.git/config +3 -3
- package/template/agora-rn-uikit/.git/index +0 -0
- package/template/agora-rn-uikit/.git/logs/HEAD +2 -2
- package/template/agora-rn-uikit/.git/logs/refs/heads/master +1 -1
- package/template/agora-rn-uikit/.git/logs/refs/heads/release/fpe-1.0.0 +1 -0
- package/template/agora-rn-uikit/.git/logs/refs/remotes/origin/HEAD +1 -1
- package/template/agora-rn-uikit/.git/objects/pack/pack-f274a85fccfc9b5112d154bb3b6d34cb4b8dedde.idx +0 -0
- package/template/agora-rn-uikit/.git/objects/pack/{pack-0061d00cd98162a329a32b537488a35d0abeb069.pack → pack-f274a85fccfc9b5112d154bb3b6d34cb4b8dedde.pack} +0 -0
- package/template/agora-rn-uikit/.git/packed-refs +5 -1
- package/template/agora-rn-uikit/.git/refs/heads/release/fpe-1.0.0 +1 -0
- 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 +14 -2
- 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 +226 -0
- package/template/{src/subComponents/LayoutEnum.tsx → esbuildConfigTransform.js} +1 -5
- package/template/fpe-api/components.ts +42 -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 +128 -0
- package/template/fpe-api/typeDefinition.ts +143 -0
- package/template/fpe-api/useFpe.tsx +35 -0
- package/template/fpe-api/utils.ts +62 -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 +25 -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-lock.json +2297 -2533
- package/template/package.json +28 -12
- 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 +171 -139
- package/template/src/components/ChatContext.ts +14 -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 +97 -119
- 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 +320 -398
- 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 +202 -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 +293 -272
- 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 +36 -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 +222 -0
- package/template/src/components/useWakeLock.tsx +3 -3
- package/template/src/custom-events/CustomEvents.ts +197 -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 +189 -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 +176 -159
- package/template/src/pages/Join.tsx +44 -32
- package/template/src/pages/VideoCall.tsx +134 -406
- 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 +12 -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 +28 -0
- package/template/src/rtm-events/EventUtils.ts +268 -0
- package/template/src/rtm-events/EventsQueue.ts +38 -0
- package/template/src/rtm-events/constants.ts +40 -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 +18 -11
- package/template/src/subComponents/ChatContainer.tsx +78 -29
- 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 +59 -31
- package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +57 -52
- package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +97 -138
- 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 +30 -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 +20 -0
- package/template/src/{subComponents/screenshare/ScreenshareContext.tsx → utils/useGroupMessages.ts} +10 -7
- package/template/src/utils/useJoinMeeting.ts +120 -0
- package/template/src/utils/useLayout.tsx +40 -0
- package/template/src/utils/useLiveStreamingUids.ts +26 -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 +20 -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/logs/refs/heads/ab-dev-auto +0 -1
- package/template/agora-rn-uikit/.git/objects/pack/pack-0061d00cd98162a329a32b537488a35d0abeb069.idx +0 -0
- package/template/agora-rn-uikit/.git/refs/heads/ab-dev-auto +0 -1
- package/template/agora-rn-uikit/src/Contexts/MaxUidContext.tsx +0 -7
- package/template/agora-rn-uikit/src/Contexts/MinUidContext.tsx +0 -8
- package/template/src/components/participants/context/ParticipantContext.tsx +0 -97
- 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,58 @@
|
|
|
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();
|
|
28
29
|
|
|
29
|
-
const {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
sendControlMessageToUid,
|
|
33
|
-
sendControlMessage,
|
|
34
|
-
broadcastUserAttributes,
|
|
35
|
-
addOrUpdateLocalUserAttributes,
|
|
36
|
-
events,
|
|
37
|
-
} = useContext(ChatContext);
|
|
30
|
+
const {renderList} = useUserList();
|
|
31
|
+
const renderListRef = useRef<any>();
|
|
32
|
+
renderListRef.current = renderList;
|
|
38
33
|
|
|
39
|
-
const
|
|
34
|
+
const [raiseHandList, setRaiseHandList] = useState<raiseHandListInterface>(
|
|
35
|
+
{},
|
|
36
|
+
);
|
|
37
|
+
const raiseHandListRef = useRef<any>();
|
|
38
|
+
raiseHandListRef.current = raiseHandList;
|
|
39
|
+
|
|
40
|
+
React.useEffect(() => {
|
|
41
|
+
renderListRef.current = renderList;
|
|
42
|
+
}, [renderList]);
|
|
40
43
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
+
React.useEffect(() => {
|
|
45
|
+
raiseHandListRef.current = raiseHandList;
|
|
46
|
+
}, [raiseHandList]);
|
|
44
47
|
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
+
const localUid = useLocalUid();
|
|
49
|
+
const localUidRef = useRef<any>();
|
|
50
|
+
localUidRef.current = localUid;
|
|
48
51
|
|
|
49
|
-
const
|
|
50
|
-
Partial<Record<string, requestInterface>>
|
|
51
|
-
>({});
|
|
52
|
+
const {hasUserJoinedRTM} = useContext(ChatContext);
|
|
52
53
|
|
|
53
|
-
const
|
|
54
|
+
const {setRtcProps, rtcProps, callActive} = props?.value;
|
|
55
|
+
const {isHost} = useMeetingInfo();
|
|
54
56
|
|
|
55
57
|
const [lastCheckedRequestTimestamp, setLastCheckedRequestTimestamp] =
|
|
56
58
|
useState(0);
|
|
@@ -60,8 +62,6 @@ export const LiveStreamContextProvider = (props: liveStreamPropsInterface) => {
|
|
|
60
62
|
|
|
61
63
|
const [isPendingRequestToReview, setPendingRequestToReview] = useState(false);
|
|
62
64
|
|
|
63
|
-
const localUserRef = useRef({uid: localUid, status: ''});
|
|
64
|
-
|
|
65
65
|
const showToast = (text: string) => {
|
|
66
66
|
Toast.show({
|
|
67
67
|
type: 'success',
|
|
@@ -81,37 +81,95 @@ export const LiveStreamContextProvider = (props: liveStreamPropsInterface) => {
|
|
|
81
81
|
};
|
|
82
82
|
|
|
83
83
|
const getAttendeeName = (uid: number | string) => {
|
|
84
|
-
return
|
|
84
|
+
return renderListRef.current?.[uid]?.name
|
|
85
|
+
? renderListRef.current[uid].name
|
|
86
|
+
: 'user';
|
|
85
87
|
};
|
|
86
88
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
)
|
|
93
|
-
|
|
94
|
-
|
|
89
|
+
const addOrUpdateLiveStreamRequest = (
|
|
90
|
+
userUID: string,
|
|
91
|
+
payload: Partial<raiseHandItemInterface>,
|
|
92
|
+
) => {
|
|
93
|
+
if (userUID && !isEmptyObject(payload)) {
|
|
94
|
+
const userId = userUID.toString();
|
|
95
|
+
setRaiseHandList((oldRaisedHandList) => ({
|
|
96
|
+
...oldRaisedHandList,
|
|
97
|
+
[userId]: {
|
|
98
|
+
raised: payload?.raised || RaiseHandValue.FALSE,
|
|
99
|
+
ts: payload?.ts || Date.now(),
|
|
100
|
+
role:
|
|
101
|
+
payload?.role ||
|
|
102
|
+
oldRaisedHandList[userId]?.role ||
|
|
103
|
+
ClientRole.Audience,
|
|
104
|
+
},
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const changeClientRoleTo = (newRole: ClientRole) => {
|
|
110
|
+
updateRtcProps(newRole);
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const UpdtLocStateAndBCastAttr = (newRole: ClientRole, ts: number) => {
|
|
114
|
+
switch (newRole) {
|
|
115
|
+
case ClientRole.Audience:
|
|
116
|
+
addOrUpdateLiveStreamRequest(localUidRef.current, {
|
|
117
|
+
raised: RaiseHandValue.FALSE,
|
|
118
|
+
ts: ts,
|
|
119
|
+
role: ClientRole.Audience,
|
|
120
|
+
});
|
|
121
|
+
// Audience notfies all host when request is rejected
|
|
122
|
+
CustomEvents.send(EventNames.RAISED_ATTRIBUTE, {
|
|
123
|
+
action: LiveStreamControlMessageEnum.notifyHostsInChannel,
|
|
124
|
+
level: EventLevel.LEVEL2,
|
|
125
|
+
value: RaiseHandValue.FALSE,
|
|
126
|
+
});
|
|
127
|
+
break;
|
|
128
|
+
case ClientRole.Broadcaster:
|
|
129
|
+
// Update local state
|
|
130
|
+
addOrUpdateLiveStreamRequest(localUidRef.current, {
|
|
131
|
+
raised: RaiseHandValue.TRUE,
|
|
132
|
+
ts: ts,
|
|
133
|
+
role: ClientRole.Broadcaster,
|
|
134
|
+
});
|
|
135
|
+
// Audience notfies all host when request is approved
|
|
136
|
+
CustomEvents.send(EventNames.RAISED_ATTRIBUTE, {
|
|
137
|
+
action: LiveStreamControlMessageEnum.notifyHostsInChannel,
|
|
138
|
+
value: RaiseHandValue.TRUE,
|
|
139
|
+
level: EventLevel.LEVEL2,
|
|
140
|
+
});
|
|
141
|
+
default:
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
// Get feeback for performance wise from @nitesh
|
|
147
|
+
const pendingRequests = filterObject(
|
|
148
|
+
raiseHandList,
|
|
149
|
+
([k, v]) =>
|
|
150
|
+
v?.raised === RaiseHandValue.TRUE && v?.role == ClientRole.Audience,
|
|
151
|
+
);
|
|
95
152
|
|
|
96
153
|
React.useEffect(() => {
|
|
97
154
|
// Get the time timestamp of recent request
|
|
98
|
-
const recentRequest = Object.values(
|
|
155
|
+
const recentRequest = Object.values(pendingRequests).sort(
|
|
99
156
|
(a, b) => b?.ts - a?.ts || 0,
|
|
100
157
|
)[0]; // sorting in descending order and take the first request
|
|
101
158
|
|
|
102
159
|
if (recentRequest?.ts) {
|
|
103
160
|
setLastRequestReceivedTimestamp(recentRequest.ts);
|
|
104
161
|
}
|
|
105
|
-
if (Object.keys(
|
|
162
|
+
if (Object.keys(pendingRequests).length === 0) {
|
|
106
163
|
setPendingRequestToReview(false);
|
|
107
164
|
}
|
|
108
|
-
}, [
|
|
165
|
+
}, [raiseHandList]);
|
|
109
166
|
|
|
110
167
|
React.useEffect(() => {
|
|
111
168
|
if (
|
|
112
|
-
//
|
|
113
|
-
Object.keys(
|
|
114
|
-
lastRequestReceivedTimestamp >= lastCheckedRequestTimestamp
|
|
169
|
+
// Only true host should see the pending request
|
|
170
|
+
Object.keys(pendingRequests).length !== 0 &&
|
|
171
|
+
lastRequestReceivedTimestamp >= lastCheckedRequestTimestamp &&
|
|
172
|
+
isHost
|
|
115
173
|
) {
|
|
116
174
|
setPendingRequestToReview(true);
|
|
117
175
|
} else {
|
|
@@ -119,289 +177,252 @@ export const LiveStreamContextProvider = (props: liveStreamPropsInterface) => {
|
|
|
119
177
|
}
|
|
120
178
|
}, [lastRequestReceivedTimestamp, lastCheckedRequestTimestamp]);
|
|
121
179
|
|
|
180
|
+
/** ******* SETTING UP ROLES BEGINS ******* */
|
|
122
181
|
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) => {
|
|
182
|
+
CustomEvents.on(EventNames.ROLE_ATTRIBUTE, (data) => {
|
|
183
|
+
setRaiseHandList((prevState) => {
|
|
157
184
|
return {
|
|
158
|
-
...
|
|
159
|
-
[
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
: requestStatus.AwaitingAction,
|
|
185
|
+
...prevState,
|
|
186
|
+
[data.sender]: {
|
|
187
|
+
...prevState[data.sender],
|
|
188
|
+
role:
|
|
189
|
+
data.payload.value in ClientRole
|
|
190
|
+
? ClientRole[data.payload.value]
|
|
191
|
+
: ClientRole.Audience,
|
|
166
192
|
},
|
|
167
193
|
};
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
}, []);
|
|
197
|
+
|
|
198
|
+
React.useEffect(() => {
|
|
199
|
+
if (!callActive || !hasUserJoinedRTM) return;
|
|
200
|
+
CustomEvents.send(EventNames.ROLE_ATTRIBUTE, {
|
|
201
|
+
level: EventLevel.LEVEL2,
|
|
202
|
+
value: rtcProps.role in ClientRole ? rtcProps.role : ClientRole.Audience,
|
|
203
|
+
});
|
|
204
|
+
setRaiseHandList((prevState) => {
|
|
205
|
+
return {
|
|
206
|
+
...prevState,
|
|
207
|
+
[localUid]: {
|
|
208
|
+
...prevState[localUid],
|
|
209
|
+
role:
|
|
210
|
+
rtcProps.role in ClientRole ? rtcProps.role : ClientRole.Audience,
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
});
|
|
214
|
+
}, [callActive, rtcProps.role, hasUserJoinedRTM]);
|
|
215
|
+
|
|
216
|
+
/** ******* SETTING UP ROLES ENDS ********/
|
|
174
217
|
|
|
175
|
-
|
|
218
|
+
/** ******* EVENT LISTENERS SECTION BEGINS ******* */
|
|
176
219
|
|
|
177
220
|
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
|
-
|
|
221
|
+
/** ********************** HOST EVENTS SECTION BEGINS ********************** */
|
|
222
|
+
CustomEvents.on(EventNames.RAISED_ATTRIBUTE, (data) => {
|
|
223
|
+
if (!isHost) return;
|
|
224
|
+
switch (data?.payload?.action) {
|
|
225
|
+
// 1. Host can receive raise hand request with true or false value
|
|
226
|
+
case LiveStreamControlMessageEnum.raiseHandRequest:
|
|
227
|
+
switch (data?.payload?.value) {
|
|
228
|
+
case RaiseHandValue.TRUE:
|
|
229
|
+
// Step 1: Show notifications
|
|
230
|
+
showToast(
|
|
231
|
+
`${getAttendeeName(data.sender)} ${
|
|
232
|
+
LSNotificationObject.RAISE_HAND_RECEIVED
|
|
233
|
+
}`,
|
|
234
|
+
);
|
|
235
|
+
// 2. All Hosts in channel update their raised state to "true" when attendee raise their hand
|
|
236
|
+
addOrUpdateLiveStreamRequest(data.sender, {
|
|
237
|
+
ts: data.ts,
|
|
238
|
+
raised: RaiseHandValue.TRUE,
|
|
239
|
+
role: ClientRole.Audience,
|
|
240
|
+
});
|
|
241
|
+
break;
|
|
242
|
+
case RaiseHandValue.FALSE:
|
|
243
|
+
// Step 1: Show notifications
|
|
244
|
+
showToast(
|
|
245
|
+
`${getAttendeeName(data.sender)} ${
|
|
246
|
+
LSNotificationObject.RAISE_HAND_REQUEST_RECALL
|
|
247
|
+
}`,
|
|
248
|
+
);
|
|
249
|
+
// 2. All Hosts in channel update raised state to "false" when attendee recalls their request
|
|
250
|
+
addOrUpdateLiveStreamRequest(data.sender, {
|
|
251
|
+
ts: data.ts,
|
|
252
|
+
raised: RaiseHandValue.FALSE,
|
|
253
|
+
role: ClientRole.Audience,
|
|
254
|
+
});
|
|
255
|
+
default:
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
break;
|
|
259
|
+
// 2. All Hosts in channel gets notified when an attendee's request gets approved or rejected
|
|
260
|
+
case LiveStreamControlMessageEnum.notifyHostsInChannel:
|
|
261
|
+
if (!isHost) return;
|
|
262
|
+
switch (data.payload.value) {
|
|
263
|
+
case RaiseHandValue.TRUE:
|
|
264
|
+
addOrUpdateLiveStreamRequest(data.sender, {
|
|
265
|
+
ts: data.ts,
|
|
266
|
+
raised: RaiseHandValue.TRUE,
|
|
267
|
+
role: ClientRole.Broadcaster,
|
|
268
|
+
});
|
|
269
|
+
break;
|
|
270
|
+
case RaiseHandValue.FALSE:
|
|
271
|
+
addOrUpdateLiveStreamRequest(data.sender, {
|
|
272
|
+
ts: data.ts,
|
|
273
|
+
raised: RaiseHandValue.FALSE,
|
|
274
|
+
role: ClientRole.Audience,
|
|
275
|
+
});
|
|
276
|
+
break;
|
|
277
|
+
default:
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
break;
|
|
281
|
+
default:
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
/** ********************** HOST EVENTS SECTION ENDS ********************** */
|
|
286
|
+
|
|
287
|
+
/** ********************** AUDIENCE EVENTS SECTION BEGINS ********************** */
|
|
288
|
+
// 1. Audience receives this when the request is accepted by host
|
|
289
|
+
CustomEvents.on(
|
|
290
|
+
LiveStreamControlMessageEnum.raiseHandRequestAccepted,
|
|
291
|
+
(data) => {
|
|
292
|
+
if (raiseHandList[localUidRef.current]?.raised === RaiseHandValue.FALSE)
|
|
293
|
+
return;
|
|
294
|
+
showToast(LSNotificationObject.RAISE_HAND_ACCEPTED);
|
|
295
|
+
// Promote user's privileges to host
|
|
296
|
+
changeClientRoleTo(ClientRole.Broadcaster);
|
|
297
|
+
// Audience updates its local attributes and notfies all host when request is approved
|
|
298
|
+
UpdtLocStateAndBCastAttr(ClientRole.Broadcaster, data.ts);
|
|
230
299
|
},
|
|
231
300
|
);
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
// Audience notfies all host when request is approved
|
|
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;
|
|
301
|
+
/** 2. Audience receives this when the request is rejected by host
|
|
302
|
+
* 2.a Audience receives this when the request is rejected by host which is not yet approved
|
|
303
|
+
* 2.b Audience receives this when the request when is demoted by the host
|
|
304
|
+
*/
|
|
305
|
+
CustomEvents.on(
|
|
306
|
+
LiveStreamControlMessageEnum.raiseHandRequestRejected,
|
|
307
|
+
(data) => {
|
|
308
|
+
/** 2.a */
|
|
309
|
+
if (
|
|
310
|
+
raiseHandListRef.current[localUidRef.current].role ==
|
|
311
|
+
ClientRole.Audience
|
|
312
|
+
) {
|
|
313
|
+
showToast(LSNotificationObject.RAISE_HAND_REJECTED);
|
|
314
|
+
} else if (
|
|
315
|
+
raiseHandListRef.current[localUidRef.current].role ==
|
|
316
|
+
ClientRole.Broadcaster
|
|
317
|
+
) {
|
|
318
|
+
/** 2.b */
|
|
319
|
+
showToast(LSNotificationObject.RAISE_HAND_APPROVED_REQUEST_RECALL);
|
|
320
|
+
screenshareContextInstance?.stopUserScreenShare(); // This will not exist on ios
|
|
321
|
+
// Demote user's privileges to audience
|
|
322
|
+
changeClientRoleTo(ClientRole.Audience);
|
|
282
323
|
}
|
|
324
|
+
// Audience updates its local attributes and notfies all host when demoted/request rejected
|
|
325
|
+
UpdtLocStateAndBCastAttr(ClientRole.Audience, data.ts);
|
|
283
326
|
},
|
|
284
327
|
);
|
|
328
|
+
// 3. Audience when receives kickUser notifies all host when is kicked out
|
|
329
|
+
CustomEvents.on(controlMessageEnum.kickUser, (data) => {
|
|
330
|
+
// Audience updates its local attributes and notfies all host when they(audience) are kicked out
|
|
331
|
+
UpdtLocStateAndBCastAttr(ClientRole.Audience, data.ts);
|
|
332
|
+
});
|
|
333
|
+
/** ********************** AUDIENCE EVENTS SECTION ENDS ********************** */
|
|
334
|
+
}, []);
|
|
285
335
|
|
|
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
|
-
};
|
|
336
|
+
/** ******* EVENT LISTENERS SECTION ENDS ******* */
|
|
317
337
|
|
|
318
|
-
|
|
319
|
-
|
|
338
|
+
/** ******* HOST CONTROLS SECTION BEGINS ******* */
|
|
339
|
+
/* Host controls for Live Streaming
|
|
320
340
|
* a. Host can approve streaming request sent by audience
|
|
321
341
|
* b. Host can reject streaming request sent by audience
|
|
322
342
|
*/
|
|
323
343
|
|
|
324
|
-
const hostApprovesRequestOfUID = (uid:
|
|
325
|
-
addOrUpdateLiveStreamRequest({
|
|
326
|
-
|
|
344
|
+
const hostApprovesRequestOfUID = (uid: UidType) => {
|
|
345
|
+
addOrUpdateLiveStreamRequest(uid.toString(), {
|
|
346
|
+
raised: RaiseHandValue.TRUE,
|
|
327
347
|
ts: new Date().getTime(),
|
|
328
|
-
status: requestStatus.Cancelled,
|
|
329
348
|
});
|
|
330
|
-
|
|
349
|
+
CustomEvents.send(
|
|
331
350
|
LiveStreamControlMessageEnum.raiseHandRequestAccepted,
|
|
351
|
+
{},
|
|
332
352
|
uid,
|
|
333
353
|
);
|
|
334
354
|
};
|
|
335
355
|
|
|
336
|
-
const hostRejectsRequestOfUID = (uid:
|
|
337
|
-
addOrUpdateLiveStreamRequest({
|
|
338
|
-
|
|
356
|
+
const hostRejectsRequestOfUID = (uid: UidType) => {
|
|
357
|
+
addOrUpdateLiveStreamRequest(uid.toString(), {
|
|
358
|
+
raised: RaiseHandValue.FALSE,
|
|
339
359
|
ts: new Date().getTime(),
|
|
340
|
-
status: requestStatus.Cancelled,
|
|
341
360
|
});
|
|
342
|
-
|
|
361
|
+
CustomEvents.send(
|
|
343
362
|
LiveStreamControlMessageEnum.raiseHandRequestRejected,
|
|
363
|
+
{},
|
|
344
364
|
uid,
|
|
345
365
|
);
|
|
346
366
|
};
|
|
347
367
|
|
|
348
|
-
|
|
368
|
+
/** ******* HOST CONTROLS SECTION ENDS ******* */
|
|
369
|
+
|
|
370
|
+
/** ******* AUDIENCE CONTROLS SECTION BEGINS *******
|
|
349
371
|
* Audience have below controls
|
|
350
372
|
* a. Audience can raise a request to live stream
|
|
351
373
|
* b. Audience can recalls his request to live stream
|
|
352
374
|
* i. While recalling the request could be either approved or not approved
|
|
353
375
|
*/
|
|
354
376
|
|
|
355
|
-
const audienceSendsRequest = () => {
|
|
377
|
+
const audienceSendsRequest = async (): Promise<void> => {
|
|
378
|
+
// If hand is already raised, skip the call
|
|
379
|
+
if (raiseHandList[localUidRef.current]?.raised === RaiseHandValue.TRUE)
|
|
380
|
+
return;
|
|
356
381
|
showToast(LSNotificationObject.RAISE_HAND_REQUEST);
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
382
|
+
CustomEvents.send(EventNames.RAISED_ATTRIBUTE, {
|
|
383
|
+
action: LiveStreamControlMessageEnum.raiseHandRequest,
|
|
384
|
+
level: EventLevel.LEVEL2,
|
|
385
|
+
value: RaiseHandValue.TRUE,
|
|
386
|
+
});
|
|
387
|
+
// Update local state
|
|
388
|
+
addOrUpdateLiveStreamRequest(localUidRef.current, {
|
|
389
|
+
raised: RaiseHandValue.TRUE,
|
|
390
|
+
ts: new Date().getTime(),
|
|
391
|
+
});
|
|
360
392
|
};
|
|
361
393
|
|
|
362
|
-
const audienceRecallsRequest = () => {
|
|
394
|
+
const audienceRecallsRequest = async (): Promise<void> => {
|
|
395
|
+
// If hand is already down, skip the call
|
|
396
|
+
if (raiseHandList[localUidRef.current]?.raised === RaiseHandValue.FALSE)
|
|
397
|
+
return;
|
|
363
398
|
/**
|
|
364
399
|
* if: Check if request is already approved
|
|
365
|
-
* else: Audience Request was not approved by host, and was
|
|
400
|
+
* else: Audience Request was not approved by host, and was pending
|
|
366
401
|
*/
|
|
367
402
|
if (
|
|
368
|
-
|
|
369
|
-
|
|
403
|
+
raiseHandList[localUidRef.current]?.role == ClientRole.Broadcaster &&
|
|
404
|
+
raiseHandList[localUidRef.current]?.raised === RaiseHandValue.TRUE
|
|
370
405
|
) {
|
|
371
406
|
screenshareContextInstance?.stopUserScreenShare(); // This will not exist on ios
|
|
372
|
-
|
|
373
|
-
/// Change role and send message in channel notifying the same
|
|
407
|
+
// Change role
|
|
374
408
|
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
409
|
}
|
|
383
|
-
|
|
410
|
+
UpdtLocStateAndBCastAttr(ClientRole.Audience, new Date().getTime());
|
|
384
411
|
showToast(LSNotificationObject.RAISE_HAND_REQUEST_RECALL_LOCAL);
|
|
385
412
|
};
|
|
386
413
|
|
|
387
|
-
|
|
388
|
-
value: attrRequestTypes | attrRequestStatus,
|
|
389
|
-
) => {
|
|
390
|
-
addOrUpdateLocalUserAttributes([{key: 'requests', value: value}]);
|
|
391
|
-
};
|
|
414
|
+
/** ******* AUDIENCE CONTROLS SECTION ENDS ******* */
|
|
392
415
|
|
|
393
416
|
return (
|
|
394
417
|
<LiveStreamContext.Provider
|
|
395
418
|
value={{
|
|
396
419
|
setLastCheckedRequestTimestamp,
|
|
397
420
|
isPendingRequestToReview,
|
|
398
|
-
|
|
421
|
+
raiseHandList,
|
|
399
422
|
hostApprovesRequestOfUID,
|
|
400
423
|
hostRejectsRequestOfUID,
|
|
401
424
|
audienceSendsRequest,
|
|
402
425
|
audienceRecallsRequest,
|
|
403
|
-
raiseHandRequestActive,
|
|
404
|
-
setRaiseHandRequestActive,
|
|
405
426
|
}}>
|
|
406
427
|
{props.children}
|
|
407
428
|
</LiveStreamContext.Provider>
|