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.
Files changed (280) hide show
  1. package/Readme.md +7 -1
  2. package/package.json +4 -3
  3. package/template/Gulpfile.js +306 -87
  4. package/template/_gitignore +4 -1
  5. package/template/_package-lock.json +2297 -2533
  6. package/template/agora-rn-uikit/.git/HEAD +1 -1
  7. package/template/agora-rn-uikit/.git/config +3 -3
  8. package/template/agora-rn-uikit/.git/index +0 -0
  9. package/template/agora-rn-uikit/.git/logs/HEAD +2 -2
  10. package/template/agora-rn-uikit/.git/logs/refs/heads/master +1 -1
  11. package/template/agora-rn-uikit/.git/logs/refs/heads/release/fpe-1.0.0 +1 -0
  12. package/template/agora-rn-uikit/.git/logs/refs/remotes/origin/HEAD +1 -1
  13. package/template/agora-rn-uikit/.git/objects/pack/pack-f274a85fccfc9b5112d154bb3b6d34cb4b8dedde.idx +0 -0
  14. package/template/agora-rn-uikit/.git/objects/pack/{pack-0061d00cd98162a329a32b537488a35d0abeb069.pack → pack-f274a85fccfc9b5112d154bb3b6d34cb4b8dedde.pack} +0 -0
  15. package/template/agora-rn-uikit/.git/packed-refs +5 -1
  16. package/template/agora-rn-uikit/.git/refs/heads/release/fpe-1.0.0 +1 -0
  17. package/template/agora-rn-uikit/src/AgoraUIKit.tsx +23 -20
  18. package/template/agora-rn-uikit/src/Contexts/LocalUserContext.tsx +13 -8
  19. package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +25 -9
  20. package/template/agora-rn-uikit/src/Contexts/RenderContext.tsx +10 -0
  21. package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +11 -5
  22. package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +6 -2
  23. package/template/agora-rn-uikit/src/Controls/ImageIcon.tsx +1 -1
  24. package/template/agora-rn-uikit/src/Controls/Local/EndCall.tsx +6 -2
  25. package/template/agora-rn-uikit/src/Controls/Local/LocalAudioMute.tsx +2 -2
  26. package/template/agora-rn-uikit/src/Controls/Local/LocalVideoMute.tsx +2 -2
  27. package/template/agora-rn-uikit/src/Controls/Local/SwitchCamera.tsx +6 -2
  28. package/template/agora-rn-uikit/src/Controls/LocalControls.tsx +11 -6
  29. package/template/agora-rn-uikit/src/Controls/Remote/RemoteAudioMute.tsx +10 -6
  30. package/template/agora-rn-uikit/src/Controls/Remote/RemoteSwap.tsx +7 -6
  31. package/template/agora-rn-uikit/src/Controls/Remote/RemoteVideoMute.tsx +6 -5
  32. package/template/agora-rn-uikit/src/Controls/RemoteControls.tsx +3 -3
  33. package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +16 -13
  34. package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +16 -13
  35. package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +13 -13
  36. package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +16 -13
  37. package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +28 -31
  38. package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +48 -35
  39. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +11 -13
  40. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +11 -13
  41. package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +18 -15
  42. package/template/agora-rn-uikit/src/Rtc/Create.tsx +14 -2
  43. package/template/agora-rn-uikit/src/Rtc/Join.tsx +19 -3
  44. package/template/agora-rn-uikit/src/RtcConfigure.tsx +161 -44
  45. package/template/agora-rn-uikit/src/Utils/useLocalUid.ts +8 -0
  46. package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +8 -6
  47. package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +8 -6
  48. package/template/agora-rn-uikit/src/Views/MinVideoView.tsx +18 -9
  49. package/template/agora-rn-uikit/src/index.ts +12 -12
  50. package/template/babel.config.js +17 -1
  51. package/template/bridge/rtc/webNg/RtcEngine.ts +34 -28
  52. package/template/bridge/rtc/webNg/SurfaceView.tsx +3 -2
  53. package/template/bridge/rtc/webNg/Types.ts +14 -0
  54. package/template/bridge/rtc/webNg/index.ts +5 -2
  55. package/template/bridge/rtm/web/index.ts +13 -7
  56. package/template/electron-builder.js +3 -2
  57. package/template/esbuild.rsdk.go +226 -0
  58. package/template/{src/subComponents/LayoutEnum.tsx → esbuildConfigTransform.js} +1 -5
  59. package/template/fpe-api/components.ts +42 -0
  60. package/template/fpe-api/context.ts +45 -0
  61. package/template/fpe-api/fpeEvents.ts +9 -0
  62. package/template/fpe-api/index.ts +21 -0
  63. package/template/fpe-api/install.ts +128 -0
  64. package/template/fpe-api/typeDefinition.ts +143 -0
  65. package/template/fpe-api/useFpe.tsx +35 -0
  66. package/template/fpe-api/utils.ts +62 -0
  67. package/template/fpe-implementation/createHook.ts +33 -0
  68. package/template/fpe-implementation/dummyFpe.ts +17 -0
  69. package/template/fpe-implementation/index.ts +1 -0
  70. package/template/fpe-todo.txt +14 -0
  71. package/template/fpe.config.js +25 -0
  72. package/template/global.d.ts +4 -0
  73. package/template/index.rsdk.tsx +27 -0
  74. package/template/index.wsdk.tsx +27 -0
  75. package/template/package-lock.json +2297 -2533
  76. package/template/package.json +28 -12
  77. package/template/react-native-toast-message/src/index.js +9 -10
  78. package/template/react-native-toast-message/src/index.wsdk.js +419 -0
  79. package/template/src/App.tsx +97 -65
  80. package/template/src/AppWrapper.tsx +79 -0
  81. package/template/src/SDKAppWrapper.tsx +67 -0
  82. package/template/src/atoms/PrimaryButton.tsx +14 -8
  83. package/template/src/atoms/TextInput.tsx +13 -5
  84. package/template/src/components/Chat.tsx +171 -139
  85. package/template/src/components/ChatContext.ts +14 -22
  86. package/template/src/components/ColorConfigure.tsx +2 -2
  87. package/template/src/components/Controls.native.tsx +72 -62
  88. package/template/src/components/Controls.tsx +90 -69
  89. package/template/src/components/DeviceConfigure.tsx +1 -1
  90. package/template/src/components/DeviceContext.tsx +14 -7
  91. package/template/src/components/GraphQLProvider.tsx +9 -2
  92. package/template/src/components/GridVideo.tsx +20 -159
  93. package/template/src/components/HostControlView.tsx +54 -15
  94. package/template/src/components/Navbar.tsx +408 -157
  95. package/template/src/components/NetworkQualityContext.tsx +29 -22
  96. package/template/src/components/ParticipantsView.tsx +97 -119
  97. package/template/src/components/PinnedVideo.tsx +41 -188
  98. package/template/src/components/Precall.native.tsx +131 -97
  99. package/template/src/components/Precall.tsx +193 -158
  100. package/template/src/components/RTMConfigure.tsx +320 -398
  101. package/template/src/components/Router.sdk.ts +20 -0
  102. package/template/src/components/SessionContext.tsx +6 -3
  103. package/template/src/components/Settings.native.tsx +3 -0
  104. package/template/src/components/Settings.tsx +65 -31
  105. package/template/src/components/SettingsView.tsx +14 -8
  106. package/template/src/components/Share.tsx +188 -220
  107. package/template/src/components/StorageContext.tsx +5 -5
  108. package/template/src/components/StoreToken.tsx +5 -1
  109. package/template/src/components/chat-messages/useChatMessages.tsx +202 -0
  110. package/template/src/components/chat-notification/useChatNotification.tsx +78 -0
  111. package/template/src/components/chat-ui/useChatUIControl.tsx +66 -0
  112. package/template/src/components/common/Error.tsx +54 -0
  113. package/template/src/components/common/Logo.tsx +35 -0
  114. package/template/src/components/common/index.tsx +8 -0
  115. package/template/src/components/contexts/LiveStreamDataContext.tsx +79 -0
  116. package/template/src/components/contexts/ScreenShareContext.tsx +47 -0
  117. package/template/src/components/contexts/WhiteboardContext.tsx +59 -0
  118. package/template/src/components/dimension/DimensionContext.ts +27 -0
  119. package/template/src/components/dimension/DimensionProvider.tsx +34 -0
  120. package/template/src/components/livestream/LiveStreamContext.tsx +293 -272
  121. package/template/src/components/livestream/Types.ts +26 -7
  122. package/template/src/components/livestream/index.ts +13 -2
  123. package/template/src/components/livestream/views/LiveStreamControls.tsx +5 -1
  124. package/template/src/components/meeting-info/useMeetingInfo.tsx +63 -0
  125. package/template/src/components/meeting-info/useSetMeetingInfo.tsx +38 -0
  126. package/template/src/components/participants/AllAudienceParticipants.tsx +26 -21
  127. package/template/src/components/participants/AllHostParticipants.tsx +36 -53
  128. package/template/src/components/participants/MeParticipant.tsx +9 -10
  129. package/template/src/components/participants/ParticipantName.tsx +2 -1
  130. package/template/src/components/participants/RemoteParticipants.tsx +3 -3
  131. package/template/src/components/precall/LocalMute.native.tsx +91 -0
  132. package/template/src/components/precall/LocalMute.tsx +90 -0
  133. package/template/src/components/precall/VideoPreview.native.tsx +35 -0
  134. package/template/src/components/precall/VideoPreview.tsx +33 -0
  135. package/template/src/components/precall/index.tsx +28 -0
  136. package/template/src/components/precall/joinCallBtn.native.tsx +69 -0
  137. package/template/src/components/precall/joinCallBtn.tsx +91 -0
  138. package/template/src/components/precall/meetingTitle.tsx +26 -0
  139. package/template/src/components/precall/selectDevice.tsx +46 -0
  140. package/template/src/components/precall/textInput.tsx +43 -0
  141. package/template/src/components/precall/usePreCall.tsx +41 -0
  142. package/template/src/components/styles.ts +20 -3
  143. package/template/src/components/useShareLink.tsx +222 -0
  144. package/template/src/components/useWakeLock.tsx +3 -3
  145. package/template/src/custom-events/CustomEvents.ts +197 -0
  146. package/template/src/custom-events/index.tsx +4 -0
  147. package/template/src/custom-events/types.ts +51 -0
  148. package/template/src/language/default-labels/commonLabels.ts +21 -0
  149. package/template/src/language/default-labels/createScreenLabels.ts +22 -0
  150. package/template/src/language/default-labels/index.ts +38 -0
  151. package/template/src/language/default-labels/joinScreenLabels.ts +13 -0
  152. package/template/src/language/default-labels/precallScreenLabels.ts +33 -0
  153. package/template/src/language/default-labels/shareLinkScreenLabels.ts +44 -0
  154. package/template/src/language/default-labels/videoCallScreenLabels.ts +189 -0
  155. package/template/src/language/i18nTypes.ts +10 -0
  156. package/template/src/language/index.ts +18 -0
  157. package/template/src/language/useLanguage.tsx +92 -0
  158. package/template/src/pages/Authenticate.tsx +21 -15
  159. package/template/src/pages/Create.tsx +176 -159
  160. package/template/src/pages/Join.tsx +44 -32
  161. package/template/src/pages/VideoCall.tsx +134 -406
  162. package/template/src/pages/create/useCreate.tsx +37 -0
  163. package/template/src/pages/video-call/CustomLayout.ts +17 -0
  164. package/template/src/pages/video-call/CustomUserContextHolder.tsx +12 -0
  165. package/template/src/pages/video-call/DefaultLayouts.ts +65 -0
  166. package/template/src/pages/video-call/NameWithMicStatus.tsx +62 -0
  167. package/template/src/pages/video-call/RenderComponent.tsx +52 -0
  168. package/template/src/pages/video-call/VideoCallScreen.tsx +191 -0
  169. package/template/src/pages/video-call/VideoComponent.tsx +34 -0
  170. package/template/src/pages/video-call/VideoRenderer.tsx +86 -0
  171. package/template/src/pages/video-call/index.ts +20 -0
  172. package/template/src/rtm/RTMEngine.ts +58 -0
  173. package/template/src/rtm/utils.ts +28 -0
  174. package/template/src/rtm-events/EventUtils.ts +268 -0
  175. package/template/src/rtm-events/EventsQueue.ts +38 -0
  176. package/template/src/rtm-events/constants.ts +40 -0
  177. package/template/src/rtm-events/index.tsx +8 -0
  178. package/template/src/rtm-events/types.ts +7 -0
  179. package/template/src/subComponents/ChatBubble.tsx +18 -11
  180. package/template/src/subComponents/ChatContainer.tsx +78 -29
  181. package/template/src/subComponents/ChatInput.tsx +146 -70
  182. package/template/src/subComponents/CopyJoinInfo.tsx +52 -67
  183. package/template/src/subComponents/Error.tsx +35 -24
  184. package/template/src/subComponents/LanguageSelector.tsx +85 -0
  185. package/template/src/subComponents/LayoutIconDropdown.native.tsx +163 -0
  186. package/template/src/subComponents/LayoutIconDropdown.tsx +198 -0
  187. package/template/src/subComponents/LocalAudioMute.tsx +52 -30
  188. package/template/src/subComponents/LocalEndCall.tsx +52 -0
  189. package/template/src/subComponents/LocalSwitchCamera.tsx +61 -0
  190. package/template/src/subComponents/LocalVideoMute.tsx +48 -30
  191. package/template/src/subComponents/LogoutButton.tsx +20 -5
  192. package/template/src/subComponents/NetworkQualityPill.tsx +43 -13
  193. package/template/src/subComponents/OpenInNativeButton.tsx +3 -2
  194. package/template/src/subComponents/Recording.tsx +46 -138
  195. package/template/src/subComponents/RemoteAudioMute.tsx +30 -34
  196. package/template/src/subComponents/RemoteEndCall.tsx +18 -7
  197. package/template/src/subComponents/RemoteVideoMute.tsx +17 -9
  198. package/template/src/subComponents/ScreenShareNotice.tsx +40 -40
  199. package/template/src/subComponents/SelectDevice.tsx +88 -45
  200. package/template/src/subComponents/SelectOAuth.tsx +30 -6
  201. package/template/src/subComponents/SidePanelButtons.ts +39 -0
  202. package/template/src/subComponents/TextWithTooltip.native.tsx +2 -1
  203. package/template/src/subComponents/TextWithTooltip.tsx +15 -20
  204. package/template/src/subComponents/chat/ChatParticipants.tsx +31 -32
  205. package/template/src/subComponents/livestream/ApprovedLiveStreamControlsView.tsx +7 -3
  206. package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +32 -18
  207. package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +22 -8
  208. package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +12 -7
  209. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +24 -27
  210. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +23 -26
  211. package/template/src/subComponents/livestream/index.ts +10 -2
  212. package/template/src/subComponents/recording/useRecording.tsx +209 -0
  213. package/template/src/subComponents/recording/useRecordingLayoutQuery.tsx +64 -0
  214. package/template/src/subComponents/screenshare/ScreenshareButton.native.tsx +18 -0
  215. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +59 -31
  216. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +57 -52
  217. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +97 -138
  218. package/template/src/subComponents/screenshare/useScreenshare.tsx +29 -0
  219. package/template/src/subComponents/toastConfig.tsx +25 -20
  220. package/template/src/utils/IsAttendeeUser.ts +34 -0
  221. package/template/src/utils/SdkEvents.ts +68 -0
  222. package/template/src/utils/common.tsx +40 -0
  223. package/template/src/utils/eventEmitter.ts +29 -0
  224. package/template/src/utils/getMeetingInvite.ts +30 -0
  225. package/template/src/utils/index.tsx +11 -2
  226. package/template/src/utils/isAudioEnabled.ts +29 -0
  227. package/template/src/utils/isHostUser.ts +33 -0
  228. package/template/src/utils/isMobileOrTablet.native.ts +5 -0
  229. package/template/src/utils/{mobileWebTest.tsx → isMobileOrTablet.ts} +5 -2
  230. package/template/src/utils/isPSTNUser.ts +30 -0
  231. package/template/src/utils/isSDK.sdk.ts +5 -0
  232. package/template/src/utils/isSDK.ts +5 -0
  233. package/template/src/utils/isScreenShareUser.ts +31 -0
  234. package/template/src/utils/isVideoEnabled.ts +29 -0
  235. package/template/src/utils/useButtonTemplate.tsx +43 -0
  236. package/template/src/utils/useCreateMeeting.ts +74 -0
  237. package/template/src/utils/useGetLiveStreamingRequests.ts +24 -0
  238. package/template/src/utils/useGetMeetingPhrase.ts +68 -0
  239. package/template/src/utils/useGetName.ts +20 -0
  240. package/template/src/{subComponents/screenshare/ScreenshareContext.tsx → utils/useGroupMessages.ts} +10 -7
  241. package/template/src/utils/useJoinMeeting.ts +120 -0
  242. package/template/src/utils/useLayout.tsx +40 -0
  243. package/template/src/utils/useLiveStreamingUids.ts +26 -0
  244. package/template/src/utils/useMutePSTN.ts +43 -0
  245. package/template/src/utils/useMuteToggleLocal.ts +109 -0
  246. package/template/src/utils/useNavParams.ts +6 -0
  247. package/template/src/utils/useNavigateTo.ts +8 -0
  248. package/template/src/utils/usePrivateMessages.ts +33 -0
  249. package/template/src/utils/useRemoteEndCall.ts +27 -0
  250. package/template/src/utils/useRemoteMute.ts +64 -0
  251. package/template/src/utils/useSendControlMessage.ts +51 -0
  252. package/template/src/utils/useSendMessage.ts +40 -0
  253. package/template/src/utils/useSetName.ts +20 -0
  254. package/template/src/utils/useSetUnreadMessageCount.ts +43 -0
  255. package/template/src/utils/useSidePanel.tsx +41 -0
  256. package/template/src/utils/useString.ts +61 -0
  257. package/template/src/utils/useUnreadMessageCount.ts +50 -0
  258. package/template/src/utils/useUserList.ts +26 -0
  259. package/template/tsconfig.json +4 -4
  260. package/template/tsconfig_fpeApi.json +103 -0
  261. package/template/tsconfig_rsdk_index.json +105 -0
  262. package/template/tsconfig_wsdk_index.json +104 -0
  263. package/template/webpack.commons.js +40 -16
  264. package/template/webpack.main.config.js +2 -1
  265. package/template/webpack.renderer.config.js +1 -1
  266. package/template/webpack.rsdk.config.js +33 -0
  267. package/template/webpack.ts.config.js +89 -0
  268. package/template/webpack.web.config.js +8 -1
  269. package/template/webpack.wsdk.config.js +34 -0
  270. package/template/agora-rn-uikit/.git/logs/refs/heads/ab-dev-auto +0 -1
  271. package/template/agora-rn-uikit/.git/objects/pack/pack-0061d00cd98162a329a32b537488a35d0abeb069.idx +0 -0
  272. package/template/agora-rn-uikit/.git/refs/heads/ab-dev-auto +0 -1
  273. package/template/agora-rn-uikit/src/Contexts/MaxUidContext.tsx +0 -7
  274. package/template/agora-rn-uikit/src/Contexts/MinUidContext.tsx +0 -8
  275. package/template/src/components/participants/context/ParticipantContext.tsx +0 -97
  276. package/template/src/subComponents/ScreenshareButton.tsx +0 -257
  277. package/template/src/subComponents/SwitchCamera.tsx +0 -35
  278. package/template/src/utils/hasBrandLogo.tsx +0 -3
  279. package/template/src/utils/mobileWebTest.native.tsx +0 -5
  280. 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 ScreenshareContext from '../../subComponents/screenshare/ScreenshareContext';
20
- import {filterObject} from '../../utils';
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 = (props: liveStreamPropsInterface) => {
27
- const screenshareContextInstance = useContext(ScreenshareContext);
25
+ export const LiveStreamContextProvider: React.FC<liveStreamPropsInterface> = (
26
+ props,
27
+ ) => {
28
+ const screenshareContextInstance = useScreenshare();
28
29
 
29
- const {
30
- userList,
31
- localUid,
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 {isHost, setRtcProps} = props;
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
- const [currLiveStreamRequest, setLiveStreamRequest] = useState<
42
- Partial<Record<string, requestInterface>>
43
- >({});
44
+ React.useEffect(() => {
45
+ raiseHandListRef.current = raiseHandList;
46
+ }, [raiseHandList]);
44
47
 
45
- const [uidsOfInitialRequests, setUidsOfInitialRequests] = useState<
46
- attrRequestInterface[]
47
- >([]);
48
+ const localUid = useLocalUid();
49
+ const localUidRef = useRef<any>();
50
+ localUidRef.current = localUid;
48
51
 
49
- const [activeLiveStreamRequest, setActiveLiveStreamRequest] = useState<
50
- Partial<Record<string, requestInterface>>
51
- >({});
52
+ const {hasUserJoinedRTM} = useContext(ChatContext);
52
53
 
53
- const [raiseHandRequestActive, setRaiseHandRequestActive] = useState(false);
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 userList[uid] ? userList[uid]?.name : 'user';
84
+ return renderListRef.current?.[uid]?.name
85
+ ? renderListRef.current[uid].name
86
+ : 'user';
85
87
  };
86
88
 
87
- React.useEffect(() => {
88
- setActiveLiveStreamRequest(
89
- filterObject(
90
- currLiveStreamRequest,
91
- ([k, v]) => v?.status === requestStatus.AwaitingAction,
92
- ),
93
- );
94
- }, [currLiveStreamRequest]);
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(activeLiveStreamRequest).sort(
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(activeLiveStreamRequest).length === 0) {
162
+ if (Object.keys(pendingRequests).length === 0) {
106
163
  setPendingRequestToReview(false);
107
164
  }
108
- }, [activeLiveStreamRequest]);
165
+ }, [raiseHandList]);
109
166
 
110
167
  React.useEffect(() => {
111
168
  if (
112
- // If active requests and last seen is less than last message received
113
- Object.keys(activeLiveStreamRequest).length !== 0 &&
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
- // Remove requests for users who are offline
124
- setLiveStreamRequest(
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
- ...acc,
159
- [item.uid]: {
160
- uid: item.uid,
161
- ts: new Date().getTime(),
162
- status:
163
- item.status === attrRequestStatus.RaiseHand_Approved
164
- ? requestStatus.Approved
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
- setLiveStreamRequest((oldLiveStreamRequest) => ({
170
- ...oldLiveStreamRequest,
171
- ...initialRequests,
172
- }));
173
- }, [uidsOfInitialRequests]);
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
- // Events listening section
218
+ /** ******* EVENT LISTENERS SECTION BEGINS ******* */
176
219
 
177
220
  React.useEffect(() => {
178
- events.on(
179
- messageChannelType.Public,
180
- 'onLiveStreamActionsForHost',
181
- (data: any, error: any) => {
182
- if (!data) return;
183
- if (!isHost) return;
184
- switch (data.msg) {
185
- // 1. All Hosts in channel add the audience request with 'Awaiting action' status
186
- case LiveStreamControlMessageEnum.raiseHandRequest:
187
- showToast(
188
- `${getAttendeeName(data.uid)} ${
189
- LSNotificationObject.RAISE_HAND_RECEIVED
190
- }`,
191
- );
192
- addOrUpdateLiveStreamRequest({
193
- uid: data.uid,
194
- ts: data.ts,
195
- status: requestStatus.AwaitingAction,
196
- });
197
- break;
198
- // 2. All Hosts in channel update their status when a audience recalls his request
199
- case LiveStreamControlMessageEnum.raiseHandRequestRecall:
200
- showToast(
201
- `${getAttendeeName(data.uid)} ${
202
- LSNotificationObject.RAISE_HAND_REQUEST_RECALL
203
- }`,
204
- );
205
- addOrUpdateLiveStreamRequest({
206
- uid: data.uid,
207
- ts: data.ts,
208
- status: requestStatus.Cancelled,
209
- });
210
- break;
211
- // 3. All Host in channel update their status when a audience request is approved
212
- case LiveStreamControlMessageEnum.notifyAllRequestApproved:
213
- addOrUpdateLiveStreamRequest({
214
- uid: data.uid,
215
- ts: data.ts,
216
- status: requestStatus.Approved,
217
- });
218
- break;
219
- // 4. All Host in channel update their status when a audience request is rejected
220
- case LiveStreamControlMessageEnum.notifyAllRequestRejected:
221
- addOrUpdateLiveStreamRequest({
222
- uid: data.uid,
223
- ts: data.ts,
224
- status: requestStatus.Cancelled,
225
- });
226
- break;
227
- default:
228
- break;
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
- events.on(
233
- messageChannelType.Private,
234
- 'onLiveStreamActionsForAudience',
235
- (data: any, error: any) => {
236
- if (!data) return;
237
- switch (data.msg) {
238
- // 1. Audience receives this when the request is accepted by host
239
- case LiveStreamControlMessageEnum.raiseHandRequestAccepted:
240
- if (!raiseHandRequestActive) return;
241
- showToast(LSNotificationObject.RAISE_HAND_ACCEPTED);
242
- // Audience notfies all host when request is approved
243
- notifyAllHostsInChannel(
244
- LiveStreamControlMessageEnum.notifyAllRequestApproved,
245
- );
246
- changeClientRoleTo(ClientRole.Broadcaster);
247
- localUserRef.current.status = requestStatus.Approved;
248
- updateLocalUserAttributes(attrRequestStatus.RaiseHand_Approved);
249
- break;
250
- // 2. Audience receives this when the request is cancelled by host
251
- case LiveStreamControlMessageEnum.raiseHandRequestRejected:
252
- showToast(LSNotificationObject.RAISE_HAND_REJECTED);
253
- setRaiseHandRequestActive(false);
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
- return () => {
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
- /****************** HOST CONTROLS ******************
319
- * Host controls for Live Streaming
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: number | string) => {
325
- addOrUpdateLiveStreamRequest({
326
- uid,
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
- sendControlMessageToUid(
349
+ CustomEvents.send(
331
350
  LiveStreamControlMessageEnum.raiseHandRequestAccepted,
351
+ {},
332
352
  uid,
333
353
  );
334
354
  };
335
355
 
336
- const hostRejectsRequestOfUID = (uid: number | string) => {
337
- addOrUpdateLiveStreamRequest({
338
- uid,
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
- sendControlMessageToUid(
361
+ CustomEvents.send(
343
362
  LiveStreamControlMessageEnum.raiseHandRequestRejected,
363
+ {},
344
364
  uid,
345
365
  );
346
366
  };
347
367
 
348
- /****************** AUDIENCE CONTROLS ****************
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
- setRaiseHandRequestActive(true);
358
- sendControlMessage(LiveStreamControlMessageEnum.raiseHandRequest);
359
- updateLocalUserAttributes(attrRequestStatus.RaiseHand_AwaitingAction);
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 in 'Awaiting Action' status
400
+ * else: Audience Request was not approved by host, and was pending
366
401
  */
367
402
  if (
368
- localUserRef &&
369
- localUserRef.current?.status === requestStatus.Approved
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
- setRaiseHandRequestActive(false);
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
- updateLocalUserAttributes(attrRequestTypes.none);
410
+ UpdtLocStateAndBCastAttr(ClientRole.Audience, new Date().getTime());
384
411
  showToast(LSNotificationObject.RAISE_HAND_REQUEST_RECALL_LOCAL);
385
412
  };
386
413
 
387
- const updateLocalUserAttributes = (
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
- currLiveStreamRequest,
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>