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