agora-appbuilder-core 3.0.8 → 4.0.0-api.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 (341) hide show
  1. package/Readme.md +6 -0
  2. package/package.json +2 -2
  3. package/template/_package-lock.json +32828 -2777
  4. package/template/agora-rn-uikit/src/AgoraUIKit.tsx +6 -6
  5. package/template/agora-rn-uikit/src/Contexts/ContentContext.tsx +10 -0
  6. package/template/agora-rn-uikit/src/Contexts/DispatchContext.tsx +22 -0
  7. package/template/agora-rn-uikit/src/Contexts/LocalUserContext.tsx +10 -6
  8. package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +28 -8
  9. package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +7 -15
  10. package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +30 -26
  11. package/template/agora-rn-uikit/src/Controls/Icons.ts +30 -83
  12. package/template/agora-rn-uikit/src/Controls/ImageIcon.tsx +6 -6
  13. package/template/agora-rn-uikit/src/Controls/Local/LocalAudioMute.tsx +4 -2
  14. package/template/agora-rn-uikit/src/Controls/Local/LocalVideoMute.tsx +4 -2
  15. package/template/agora-rn-uikit/src/Controls/Local/Recording.tsx +0 -2
  16. package/template/agora-rn-uikit/src/Controls/Local/SwitchCamera.tsx +6 -6
  17. package/template/agora-rn-uikit/src/Controls/LocalControls.tsx +5 -5
  18. package/template/agora-rn-uikit/src/Controls/Remote/RemoteAudioMute.tsx +4 -4
  19. package/template/agora-rn-uikit/src/Controls/Remote/RemoteVideoMute.tsx +4 -4
  20. package/template/agora-rn-uikit/src/Controls/RemoteControls.tsx +2 -2
  21. package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +6 -6
  22. package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +6 -6
  23. package/template/agora-rn-uikit/src/Reducer/LocalPermissionState.ts +23 -0
  24. package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +6 -6
  25. package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +7 -7
  26. package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +7 -7
  27. package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +10 -10
  28. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +6 -6
  29. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +6 -6
  30. package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +5 -5
  31. package/template/agora-rn-uikit/src/Reducer/UserPin.ts +11 -0
  32. package/template/agora-rn-uikit/src/Reducer/index.ts +2 -0
  33. package/template/agora-rn-uikit/src/Rtc/Create.tsx +74 -7
  34. package/template/agora-rn-uikit/src/Rtc/Join.tsx +5 -4
  35. package/template/agora-rn-uikit/src/RtcConfigure.tsx +76 -49
  36. package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +17 -7
  37. package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +17 -11
  38. package/template/agora-rn-uikit/src/Views/MinVideoView.tsx +2 -2
  39. package/template/agora-rn-uikit/src/index.ts +17 -9
  40. package/template/android/app/build.gradle +1 -0
  41. package/template/android/app/src/main/AndroidManifest.xml +22 -15
  42. package/template/android/app/src/main/assets/fonts/SourceSansPro-Regular.ttf +0 -0
  43. package/template/android/app/src/main/assets/fonts/icomoon.ttf +0 -0
  44. package/template/android/app/src/main/java/com/helloworld/MainActivity.java +50 -0
  45. package/template/android/app/src/main/res/values/colors.xml +7 -0
  46. package/template/android/build.gradle +3 -3
  47. package/template/babel.config.js +1 -0
  48. package/template/bridge/rtc/webNg/RtcEngine.ts +110 -17
  49. package/template/customization-api/action-library.ts +10 -14
  50. package/template/customization-api/app-state.ts +4 -6
  51. package/template/customization-api/customEvents.ts +2 -2
  52. package/template/customization-api/customize.ts +1 -1
  53. package/template/customization-api/sub-components.ts +4 -12
  54. package/template/customization-api/typeDefinition.ts +15 -38
  55. package/template/customization-implementation/createHook.ts +24 -6
  56. package/template/customization-implementation/index.ts +1 -1
  57. package/template/customization-implementation/useCustomization.tsx +5 -7
  58. package/template/electron/index.html +27 -27
  59. package/template/electron/renderer/index.js +1 -0
  60. package/template/global.d.ts +26 -4
  61. package/template/index.rsdk.tsx +1 -0
  62. package/template/index.web.js +2 -1
  63. package/template/index.wsdk.tsx +9 -2
  64. package/template/ios/HelloWorld/Info.plist +14 -1
  65. package/template/ios/HelloWorld.xcodeproj/project.pbxproj +17 -0
  66. package/template/metro.config.js +1 -1
  67. package/template/package.json +18 -7
  68. package/template/react-native-toast-message/index.d.ts +43 -43
  69. package/template/react-native-toast-message/src/colors/index.js +3 -2
  70. package/template/react-native-toast-message/src/components/base/index.js +46 -59
  71. package/template/react-native-toast-message/src/components/base/styles.js +16 -32
  72. package/template/react-native-toast-message/src/components/checkbox.js +178 -0
  73. package/template/react-native-toast-message/src/components/error.js +3 -2
  74. package/template/react-native-toast-message/src/components/info.js +3 -2
  75. package/template/react-native-toast-message/src/components/success.js +3 -2
  76. package/template/react-native-toast-message/src/index.js +122 -31
  77. package/template/react-native-toast-message/src/index.sdk.tsx +125 -35
  78. package/template/react-native-toast-message/src/styles.js +3 -4
  79. package/template/react-native-toast-message/src/styles.sdk.ts +3 -4
  80. package/template/react-native.config.js +7 -0
  81. package/template/src/App.tsx +19 -14
  82. package/template/src/AppWrapper.tsx +74 -29
  83. package/template/src/SDKAppWrapper.tsx +60 -64
  84. package/template/src/app-state/useLocalUserInfo.ts +3 -3
  85. package/template/src/assets/font-styles.css +329 -0
  86. package/template/src/assets/fonts/SourceSansPro-Regular.ttf +0 -0
  87. package/template/src/assets/fonts/icomoon.ttf +0 -0
  88. package/template/src/assets/permission.png +0 -0
  89. package/template/src/assets/selection.json +1 -0
  90. package/template/src/atoms/ActionMenu.tsx +236 -0
  91. package/template/src/atoms/AnimatedActiveSpeaker.native.tsx +71 -0
  92. package/template/src/atoms/AnimatedActiveSpeaker.tsx +84 -0
  93. package/template/src/atoms/AnimatedRings.native.tsx +68 -0
  94. package/template/src/atoms/AnimatedRings.tsx +70 -0
  95. package/template/src/atoms/Card.tsx +61 -0
  96. package/template/src/atoms/CircularProgress.native.tsx +121 -0
  97. package/template/src/atoms/CircularProgress.tsx +102 -0
  98. package/template/src/atoms/CustomIcon.tsx +88 -0
  99. package/template/src/atoms/CustomSwitch.tsx +287 -0
  100. package/template/src/atoms/Dropdown.tsx +306 -0
  101. package/template/src/atoms/HorizontalRule.tsx +3 -1
  102. package/template/src/atoms/IconButton.tsx +162 -0
  103. package/template/src/atoms/ImageIcon.tsx +98 -0
  104. package/template/src/atoms/InfoBubble.tsx +291 -0
  105. package/template/src/atoms/Input.tsx +87 -0
  106. package/template/src/atoms/InviteInfo.tsx +166 -0
  107. package/template/src/atoms/LinkButton.tsx +28 -0
  108. package/template/src/atoms/OutlineButton.tsx +61 -0
  109. package/template/src/atoms/ParticipantsCount.tsx +74 -0
  110. package/template/src/atoms/Popup.tsx +147 -0
  111. package/template/src/atoms/PrimaryButton.tsx +51 -26
  112. package/template/src/atoms/RecordingInfo.tsx +52 -0
  113. package/template/src/atoms/SecondaryButton.tsx +8 -5
  114. package/template/src/atoms/Spacer.tsx +22 -0
  115. package/template/src/atoms/TertiaryButton.tsx +78 -0
  116. package/template/src/atoms/TextInput.tsx +12 -14
  117. package/template/src/atoms/Toggle.tsx +47 -0
  118. package/template/src/atoms/Toolbar.tsx +68 -0
  119. package/template/src/atoms/ToolbarItem.tsx +63 -0
  120. package/template/src/atoms/Tooltip.native.tsx +65 -0
  121. package/template/src/atoms/Tooltip.tsx +94 -0
  122. package/template/src/atoms/UserAvatar.tsx +60 -0
  123. package/template/src/components/Chat.tsx +164 -278
  124. package/template/src/components/ChatContext.ts +8 -1
  125. package/template/src/components/ColorConfigure.tsx +1 -1
  126. package/template/src/components/ColorContext.ts +1 -1
  127. package/template/src/components/CommonStyles.ts +44 -0
  128. package/template/src/components/Controls.tsx +331 -73
  129. package/template/src/components/{Controls.native.tsx → Controls1.native.tsx} +8 -6
  130. package/template/src/components/DeviceConfigure.tsx +511 -102
  131. package/template/src/components/DeviceContext.tsx +8 -4
  132. package/template/src/components/EventsConfigure.tsx +192 -10
  133. package/template/src/components/GraphQLProvider.tsx +1 -1
  134. package/template/src/components/GridVideo.tsx +60 -45
  135. package/template/src/components/HostControlView.tsx +114 -35
  136. package/template/src/components/Navbar.tsx +219 -437
  137. package/template/src/components/Navigation.tsx +15 -1
  138. package/template/src/components/NetworkQualityContext.tsx +22 -22
  139. package/template/src/components/ParticipantsView.tsx +178 -156
  140. package/template/src/components/PinnedVideo.tsx +206 -121
  141. package/template/src/components/Precall.native.tsx +358 -119
  142. package/template/src/components/Precall.tsx +272 -138
  143. package/template/src/components/RTMConfigure.tsx +66 -19
  144. package/template/src/components/Router.electron.ts +1 -0
  145. package/template/src/components/Router.native.ts +1 -0
  146. package/template/src/components/Router.sdk.ts +1 -0
  147. package/template/src/components/Router.ts +1 -0
  148. package/template/src/components/SdkApiContext.tsx +161 -0
  149. package/template/src/components/Settings.tsx +26 -95
  150. package/template/src/components/SettingsView.tsx +251 -56
  151. package/template/src/components/Share.tsx +305 -276
  152. package/template/src/components/StorageContext.tsx +30 -3
  153. package/template/src/components/ToastComponent.tsx +8 -0
  154. package/template/src/components/chat-messages/useChatMessages.tsx +97 -50
  155. package/template/src/components/chat-ui/useChatUIControls.tsx +76 -0
  156. package/template/src/components/common/Error.tsx +20 -6
  157. package/template/src/components/common/Logo.tsx +16 -15
  158. package/template/src/components/contexts/LiveStreamDataContext.tsx +16 -11
  159. package/template/src/components/contexts/VideoMeetingDataContext.tsx +41 -11
  160. package/template/src/components/contexts/WhiteboardContext.tsx +3 -3
  161. package/template/src/components/livestream/LiveStreamContext.tsx +284 -50
  162. package/template/src/components/livestream/Types.ts +39 -14
  163. package/template/src/components/livestream/index.ts +1 -0
  164. package/template/src/components/livestream/views/LiveStreamControls.tsx +9 -4
  165. package/template/src/components/participants/AllAudienceParticipants.tsx +102 -31
  166. package/template/src/components/participants/AllHostParticipants.tsx +106 -35
  167. package/template/src/components/participants/Participant.tsx +300 -0
  168. package/template/src/components/participants/ParticipantName.tsx +13 -7
  169. package/template/src/components/participants/ParticipantSectionTitle.tsx +35 -10
  170. package/template/src/components/participants/ScreenshareParticipants.tsx +144 -12
  171. package/template/src/components/participants/UserActionMenuOptions.tsx +396 -0
  172. package/template/src/components/popups/InvitePopup.tsx +115 -0
  173. package/template/src/components/popups/StopRecordingPopup.tsx +114 -0
  174. package/template/src/components/precall/LocalMute.tsx +84 -14
  175. package/template/src/components/precall/{LocalMute.native.tsx → LocalMute1.native.tsx} +21 -5
  176. package/template/src/components/precall/PermissionHelper.native.tsx +5 -0
  177. package/template/src/components/precall/PermissionHelper.tsx +126 -0
  178. package/template/src/components/precall/PreCallSettings.tsx +52 -0
  179. package/template/src/components/precall/VideoPreview.native.tsx +51 -6
  180. package/template/src/components/precall/VideoPreview.tsx +164 -8
  181. package/template/src/components/precall/joinCallBtn.native.tsx +2 -2
  182. package/template/src/components/precall/joinCallBtn.tsx +17 -4
  183. package/template/src/components/precall/meetingTitle.tsx +17 -14
  184. package/template/src/components/precall/selectDevice.tsx +1 -21
  185. package/template/src/components/precall/textInput.tsx +34 -6
  186. package/template/src/components/precall/usePreCall.tsx +39 -1
  187. package/template/src/components/{meeting-info/useMeetingInfo.tsx → room-info/useRoomInfo.tsx} +34 -10
  188. package/template/src/components/{meeting-info/useSetMeetingInfo.tsx → room-info/useSetRoomInfo.tsx} +12 -12
  189. package/template/src/components/styles.ts +42 -21
  190. package/template/src/components/useShareLink.tsx +19 -21
  191. package/template/src/components/useToast.tsx +41 -0
  192. package/template/src/components/useUserPreference.tsx +9 -6
  193. package/template/src/components/useVideoCall.tsx +84 -0
  194. package/template/src/language/default-labels/createScreenLabels.ts +3 -3
  195. package/template/src/language/default-labels/joinScreenLabels.ts +2 -2
  196. package/template/src/language/default-labels/precallScreenLabels.ts +3 -3
  197. package/template/src/language/default-labels/shareLinkScreenLabels.ts +5 -5
  198. package/template/src/language/default-labels/videoCallScreenLabels.ts +5 -5
  199. package/template/src/pages/Authenticate.tsx +5 -15
  200. package/template/src/pages/Create.tsx +304 -191
  201. package/template/src/pages/Endcall.tsx +148 -0
  202. package/template/src/pages/Join.tsx +96 -70
  203. package/template/src/pages/VideoCall.tsx +179 -69
  204. package/template/src/pages/video-call/ActionSheet.native.tsx +215 -0
  205. package/template/src/pages/video-call/ActionSheet.tsx +226 -0
  206. package/template/src/pages/video-call/ActionSheetContent.tsx +479 -0
  207. package/template/src/pages/video-call/ActionSheetHandle.tsx +38 -0
  208. package/template/src/pages/video-call/ActionSheetStyles.css +138 -0
  209. package/template/src/pages/video-call/DefaultLayouts.ts +6 -6
  210. package/template/src/pages/video-call/NameWithMicIcon.tsx +93 -49
  211. package/template/src/pages/video-call/RenderComponent.tsx +6 -30
  212. package/template/src/pages/video-call/SidePanelHeader.tsx +186 -0
  213. package/template/src/pages/video-call/VideoCallMobileView.tsx +138 -0
  214. package/template/src/pages/video-call/VideoCallScreen.native.tsx +37 -0
  215. package/template/src/pages/video-call/VideoCallScreen.tsx +109 -66
  216. package/template/src/pages/video-call/VideoComponent.tsx +20 -4
  217. package/template/src/pages/video-call/VideoRenderer.tsx +227 -61
  218. package/template/src/pages/video-call/index.ts +35 -7
  219. package/template/src/rtm/RTMEngine.ts +8 -0
  220. package/template/src/rtm-events/constants.ts +3 -1
  221. package/template/src/rtm-events-api/Events.ts +5 -4
  222. package/template/src/rtm-events-api/LocalEvents.ts +6 -0
  223. package/template/src/rtm-events-api/types.ts +5 -5
  224. package/template/src/subComponents/ChatBubble.tsx +125 -84
  225. package/template/src/subComponents/ChatContainer.tsx +280 -93
  226. package/template/src/subComponents/ChatInput.ios.tsx +175 -0
  227. package/template/src/subComponents/ChatInput.tsx +72 -115
  228. package/template/src/subComponents/Checkbox.native.tsx +16 -5
  229. package/template/src/subComponents/Checkbox.tsx +2 -2
  230. package/template/src/subComponents/CopyJoinInfo.tsx +36 -58
  231. package/template/src/subComponents/EndcallPopup.tsx +107 -0
  232. package/template/src/subComponents/FallbackLogo.tsx +122 -40
  233. package/template/src/subComponents/LanguageSelector.tsx +1 -1
  234. package/template/src/subComponents/LayoutIconButton.tsx +201 -0
  235. package/template/src/subComponents/LayoutIconDropdown.tsx +131 -134
  236. package/template/src/subComponents/{LayoutIconDropdown.native.tsx → LayoutIconDropdown1.native.tsx} +4 -18
  237. package/template/src/subComponents/LocalAudioMute.tsx +119 -27
  238. package/template/src/subComponents/LocalEndCall.tsx +73 -35
  239. package/template/src/subComponents/LocalSwitchCamera.tsx +19 -32
  240. package/template/src/subComponents/LocalVideoMute.tsx +117 -27
  241. package/template/src/subComponents/Logo.tsx +3 -4
  242. package/template/src/subComponents/LogoutButton.tsx +1 -1
  243. package/template/src/subComponents/NetworkQualityPill.tsx +66 -68
  244. package/template/src/subComponents/OpenInNativeButton.tsx +3 -3
  245. package/template/src/subComponents/Recording.tsx +28 -29
  246. package/template/src/subComponents/RemoteAudioMute.tsx +83 -29
  247. package/template/src/subComponents/RemoteEndCall.tsx +8 -5
  248. package/template/src/subComponents/RemoteMutePopup.tsx +193 -0
  249. package/template/src/subComponents/RemoteVideoMute.tsx +74 -21
  250. package/template/src/subComponents/RemoveMeetingPopup.tsx +109 -0
  251. package/template/src/subComponents/RemoveScreensharePopup.tsx +109 -0
  252. package/template/src/subComponents/ScreenShareNotice.tsx +83 -8
  253. package/template/src/subComponents/SelectDevice.tsx +404 -61
  254. package/template/src/subComponents/SelectDeviceSettings.backup.tsx +207 -0
  255. package/template/src/subComponents/SelectOAuth.tsx +9 -8
  256. package/template/src/subComponents/SidePanelButtons.ts +0 -3
  257. package/template/src/subComponents/SidePanelHeader.tsx +112 -0
  258. package/template/src/subComponents/ToastConfig.tsx +150 -10
  259. package/template/src/subComponents/chat/ChatParticipants.tsx +188 -79
  260. package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +97 -34
  261. package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +29 -33
  262. package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +8 -8
  263. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +24 -11
  264. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +17 -10
  265. package/template/src/subComponents/recording/useRecording.tsx +81 -29
  266. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +52 -70
  267. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +23 -12
  268. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +44 -19
  269. package/template/src/theme/index.ts +46 -0
  270. package/template/src/utils/PlatformWrapper.tsx +21 -0
  271. package/template/src/utils/SdkEvents.ts +23 -14
  272. package/template/src/utils/SdkMethodEvents.ts +81 -0
  273. package/template/src/utils/common.tsx +155 -1
  274. package/template/src/utils/hexadecimalTransparency.ts +108 -0
  275. package/template/src/utils/index.tsx +19 -0
  276. package/template/src/utils/isMobileOrTablet.ts +7 -2
  277. package/template/src/utils/pendingStateUpdateHelper.ts +19 -0
  278. package/template/src/utils/useActiveSpeaker.ts +42 -0
  279. package/template/src/utils/{useCreateMeeting.ts → useCreateRoom.ts} +19 -14
  280. package/template/src/utils/{useButtonTemplate.tsx → useFocus.tsx} +19 -16
  281. package/template/src/utils/useGetMeetingPhrase.ts +10 -10
  282. package/template/src/utils/useIsAudioEnabled.ts +3 -3
  283. package/template/src/utils/useIsHandRaised.ts +13 -0
  284. package/template/src/utils/useIsPSTN.ts +3 -3
  285. package/template/src/utils/useIsVideoEnabled.ts +3 -3
  286. package/template/src/utils/{useJoinMeeting.ts → useJoinRoom.ts} +27 -21
  287. package/template/src/utils/useMutePSTN.ts +2 -2
  288. package/template/src/utils/useMuteToggleLocal.ts +58 -5
  289. package/template/src/utils/useRemoteEndCall.ts +4 -4
  290. package/template/src/utils/useRemoteEndScreenshare.ts +26 -0
  291. package/template/src/utils/useRemoteMute.ts +7 -7
  292. package/template/src/utils/useRemoteRequest.ts +84 -0
  293. package/template/src/utils/useSwitchCamera.native.tsx +25 -0
  294. package/template/src/utils/useSwitchCamera.tsx +19 -0
  295. package/template/src/utils/useToolbar.tsx +59 -0
  296. package/template/web/index.html +5 -0
  297. package/template/webpack.commons.js +13 -8
  298. package/template/webpack.rsdk.config.js +1 -2
  299. package/template/webpack.web.config.js +1 -0
  300. package/template/agora-rn-uikit/.git/HEAD +0 -1
  301. package/template/agora-rn-uikit/.git/config +0 -16
  302. package/template/agora-rn-uikit/.git/description +0 -1
  303. package/template/agora-rn-uikit/.git/hooks/applypatch-msg.sample +0 -15
  304. package/template/agora-rn-uikit/.git/hooks/commit-msg.sample +0 -24
  305. package/template/agora-rn-uikit/.git/hooks/fsmonitor-watchman.sample +0 -174
  306. package/template/agora-rn-uikit/.git/hooks/post-update.sample +0 -8
  307. package/template/agora-rn-uikit/.git/hooks/pre-applypatch.sample +0 -14
  308. package/template/agora-rn-uikit/.git/hooks/pre-commit.sample +0 -49
  309. package/template/agora-rn-uikit/.git/hooks/pre-merge-commit.sample +0 -13
  310. package/template/agora-rn-uikit/.git/hooks/pre-push.sample +0 -53
  311. package/template/agora-rn-uikit/.git/hooks/pre-rebase.sample +0 -169
  312. package/template/agora-rn-uikit/.git/hooks/pre-receive.sample +0 -24
  313. package/template/agora-rn-uikit/.git/hooks/prepare-commit-msg.sample +0 -42
  314. package/template/agora-rn-uikit/.git/hooks/push-to-checkout.sample +0 -78
  315. package/template/agora-rn-uikit/.git/hooks/update.sample +0 -128
  316. package/template/agora-rn-uikit/.git/index +0 -0
  317. package/template/agora-rn-uikit/.git/info/exclude +0 -6
  318. package/template/agora-rn-uikit/.git/logs/HEAD +0 -2
  319. package/template/agora-rn-uikit/.git/logs/refs/heads/master +0 -1
  320. package/template/agora-rn-uikit/.git/logs/refs/heads/release/fpe-1.0.1 +0 -1
  321. package/template/agora-rn-uikit/.git/logs/refs/remotes/origin/HEAD +0 -1
  322. package/template/agora-rn-uikit/.git/objects/pack/pack-baa9cf4109c3e8528f39535764621cee252b2b77.idx +0 -0
  323. package/template/agora-rn-uikit/.git/objects/pack/pack-baa9cf4109c3e8528f39535764621cee252b2b77.pack +0 -0
  324. package/template/agora-rn-uikit/.git/packed-refs +0 -49
  325. package/template/agora-rn-uikit/.git/refs/heads/master +0 -1
  326. package/template/agora-rn-uikit/.git/refs/heads/release/fpe-1.0.1 +0 -1
  327. package/template/agora-rn-uikit/.git/refs/remotes/origin/HEAD +0 -1
  328. package/template/agora-rn-uikit/.gitignore +0 -63
  329. package/template/agora-rn-uikit/package-lock.json +0 -7612
  330. package/template/agora-rn-uikit/src/Contexts/RenderContext.tsx +0 -10
  331. package/template/package-lock.json +0 -22543
  332. package/template/react-native-toast-message/.gitignore +0 -5
  333. package/template/react-native-toast-message/.npmignore +0 -5
  334. package/template/react-native-toast-message/package-lock.json +0 -10553
  335. package/template/src/.DS_Store +0 -0
  336. package/template/src/assets/icons.ts +0 -102
  337. package/template/src/components/chat-ui/useChatUIControl.tsx +0 -69
  338. package/template/src/components/participants/MeParticipant.tsx +0 -38
  339. package/template/src/components/participants/RemoteParticipants.tsx +0 -71
  340. package/template/src/pages/video-call/CustomUserContextHolder.tsx +0 -20
  341. package/template/src/subComponents/.DS_Store +0 -0
@@ -10,11 +10,23 @@
10
10
  *********************************************
11
11
  */
12
12
  import React, {createContext, ReactChildren, useEffect, useState} from 'react';
13
- import AsyncStorage from '@react-native-community/async-storage';
13
+ import AsyncStorage from '@react-native-async-storage/async-storage'; // '@react-native-community/async-storage';
14
14
  import useMount from './useMount';
15
15
 
16
+ type rememberedDevicesListEntries = Record<
17
+ string,
18
+ 'switch-on-connect' | 'ignore-on-connect'
19
+ >;
20
+
16
21
  export interface StoreInterface {
17
- [key: string]: string | null;
22
+ token: string;
23
+ displayName: string;
24
+ selectedLanguageCode: string;
25
+ rememberedDevicesList: Record<
26
+ MediaDeviceInfo['kind'],
27
+ rememberedDevicesListEntries
28
+ >;
29
+ activeDeviceId: Record<MediaDeviceInfo['kind'], string>;
18
30
  }
19
31
 
20
32
  export interface StorageContextInterface {
@@ -26,6 +38,16 @@ export const initStoreValue: StoreInterface = {
26
38
  token: null,
27
39
  displayName: '',
28
40
  selectedLanguageCode: '',
41
+ rememberedDevicesList: {
42
+ audioinput: {},
43
+ audiooutput: {},
44
+ videoinput: {},
45
+ },
46
+ activeDeviceId: {
47
+ audioinput: '',
48
+ audiooutput: '',
49
+ videoinput: '',
50
+ },
29
51
  };
30
52
 
31
53
  const initStorageContextValue = {
@@ -54,7 +76,12 @@ export const StorageProvider = (props: {children: React.ReactNode}) => {
54
76
  await AsyncStorage.setItem('store', JSON.stringify(initStoreValue));
55
77
  setReady(true);
56
78
  } else {
57
- setStore(JSON.parse(storeString));
79
+ const storeFromStorage = JSON.parse(storeString);
80
+ Object.keys(initStoreValue).forEach((key) => {
81
+ if (!storeFromStorage[key])
82
+ storeFromStorage[key] = initStoreValue[key];
83
+ });
84
+ setStore(storeFromStorage);
58
85
  setReady(true);
59
86
  }
60
87
  console.log('store hydrated', storeString);
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import Toast from '../../react-native-toast-message';
3
+ import ToastConfig from '../subComponents/ToastConfig';
4
+
5
+ const ToastComponent = () => {
6
+ return <Toast ref={(ref) => Toast.setRef(ref)} config={ToastConfig} />;
7
+ };
8
+ export default ToastComponent;
@@ -10,18 +10,24 @@
10
10
  *********************************************
11
11
  */
12
12
  import {createHook} from 'customization-implementation';
13
- import React, {useState, useEffect, useRef} from 'react';
14
- import {useRender} from 'customization-api';
13
+ import React, {useState, useEffect, useRef, useContext} from 'react';
14
+ import {useContent} from 'customization-api';
15
15
  import {SidePanelType} from '../../subComponents/SidePanelEnum';
16
- import {useLocalUid, UidType} from '../../../agora-rn-uikit';
17
- import events, {EventPersistLevel} from '../../rtm-events-api';
16
+ import {
17
+ useLocalUid,
18
+ UidType,
19
+ ContentInterface,
20
+ DispatchContext,
21
+ } from '../../../agora-rn-uikit';
22
+ import events, {PersistanceLevel} from '../../rtm-events-api';
18
23
  import {EventNames} from '../../rtm-events';
19
- import {useChatUIControl} from '../chat-ui/useChatUIControl';
24
+ import {ChatType, useChatUIControls} from '../chat-ui/useChatUIControls';
20
25
  import {useChatNotification} from '../chat-notification/useChatNotification';
21
26
  import Toast from '../../../react-native-toast-message';
22
27
  import {timeNow} from '../../rtm/utils';
23
28
  import {useSidePanel} from '../../utils/useSidePanel';
24
29
  import getUniqueID from '../../utils/getUniqueID';
30
+ import {trimText} from '../../utils/common';
25
31
 
26
32
  enum ChatMessageActionEnum {
27
33
  Create = 'Create_Chat_Message',
@@ -49,6 +55,7 @@ interface ChatMessagesInterface {
49
55
  sendChatMessage: (msg: string, toUid?: UidType) => void;
50
56
  editChatMessage: (msgId: string, msg: string, toUid?: UidType) => void;
51
57
  deleteChatMessage: (msgId: string, toUid?: UidType) => void;
58
+ openPrivateChat: (toUid: UidType) => void;
52
59
  }
53
60
 
54
61
  const ChatMessagesContext = React.createContext<ChatMessagesInterface>({
@@ -57,19 +64,16 @@ const ChatMessagesContext = React.createContext<ChatMessagesInterface>({
57
64
  sendChatMessage: () => {},
58
65
  editChatMessage: () => {},
59
66
  deleteChatMessage: () => {},
67
+ openPrivateChat: () => {},
60
68
  });
61
69
 
62
70
  const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
63
- const {renderList} = useRender();
71
+ const {dispatch} = useContext(DispatchContext);
72
+ const {defaultContent} = useContent();
64
73
  const localUid = useLocalUid();
65
74
  const {setSidePanel} = useSidePanel();
66
- const {
67
- groupActive,
68
- selectedChatUserId,
69
- setGroupActive,
70
- setPrivateActive,
71
- setSelectedChatUserId,
72
- } = useChatUIControl();
75
+ const {chatType, setChatType, privateChatUser, setPrivateChatUser} =
76
+ useChatUIControls();
73
77
  const {
74
78
  setUnreadGroupMessageCount,
75
79
  setUnreadIndividualMessageCount,
@@ -82,24 +86,50 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
82
86
  [key: string]: messageStoreInterface[];
83
87
  }>({});
84
88
 
85
- const renderListRef = useRef({renderList: renderList});
89
+ const defaultContentRef = useRef({defaultContent: defaultContent});
86
90
  const groupActiveRef = useRef<boolean>();
87
91
  const individualActiveRef = useRef<string | number>();
88
92
 
89
93
  //commented for v1 release
90
94
  //const fromText = useString('messageSenderNotificationLabel');
91
- const fromText = (name: string) => `From : ${name}`;
95
+ const fromText = (name: string) => `${name} commented in the public chat`;
96
+ const privateMessageLabel = 'You’ve received a private message';
92
97
  useEffect(() => {
93
- renderListRef.current.renderList = renderList;
94
- }, [renderList]);
98
+ defaultContentRef.current.defaultContent = defaultContent;
99
+ }, [defaultContent]);
95
100
 
96
101
  useEffect(() => {
97
- groupActiveRef.current = groupActive;
98
- }, [groupActive]);
102
+ groupActiveRef.current = chatType === ChatType.Group;
103
+ }, [chatType]);
99
104
 
100
105
  useEffect(() => {
101
- individualActiveRef.current = selectedChatUserId;
102
- }, [selectedChatUserId]);
106
+ individualActiveRef.current = privateChatUser;
107
+ }, [privateChatUser]);
108
+
109
+ const openPrivateChat = (uidAsNumber) => {
110
+ //move this logic into ChatContainer
111
+ // setUnreadPrivateMessageCount(
112
+ // unreadPrivateMessageCount -
113
+ // (unreadIndividualMessageCount[uidAsNumber] || 0),
114
+ // );
115
+ // setUnreadIndividualMessageCount((prevState) => {
116
+ // return {
117
+ // ...prevState,
118
+ // [uidAsNumber]: 0,
119
+ // };
120
+ // });
121
+
122
+ setPrivateChatUser(uidAsNumber);
123
+ setChatType(ChatType.Private);
124
+ setSidePanel(SidePanelType.Chat);
125
+ };
126
+
127
+ const updateRenderListState = (
128
+ uid: number,
129
+ data: Partial<ContentInterface>,
130
+ ) => {
131
+ dispatch({type: 'UpdateRenderList', value: [uid, data]});
132
+ };
103
133
 
104
134
  React.useEffect(() => {
105
135
  const showMessageNotification = (
@@ -107,36 +137,44 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
107
137
  uid: string,
108
138
  isPrivateMessage: boolean = false,
109
139
  ) => {
140
+ //don't show group message notification if group chat is open
141
+ if (!isPrivateMessage && groupActiveRef.current) {
142
+ return;
143
+ }
110
144
  const uidAsNumber = parseInt(uid);
145
+ //don't show private message notification if private chat is open
146
+ if (isPrivateMessage && uidAsNumber === individualActiveRef.current) {
147
+ return;
148
+ }
111
149
  Toast.show({
112
- type: 'success',
113
- text1: msg.length > 30 ? msg.slice(0, 30) + '...' : msg,
114
- text2: renderListRef.current.renderList[uidAsNumber]?.name
115
- ? fromText(renderListRef.current.renderList[uidAsNumber]?.name)
150
+ primaryBtn: null,
151
+ secondaryBtn: null,
152
+ type: 'info',
153
+ text1: isPrivateMessage
154
+ ? privateMessageLabel
155
+ : defaultContentRef.current.defaultContent[uidAsNumber]?.name
156
+ ? fromText(
157
+ trimText(
158
+ defaultContentRef.current.defaultContent[uidAsNumber]?.name,
159
+ ),
160
+ )
116
161
  : '',
117
- visibilityTime: 1000,
162
+ text2: isPrivateMessage
163
+ ? ''
164
+ : msg.length > 30
165
+ ? msg.slice(0, 30) + '...'
166
+ : msg,
167
+ visibilityTime: 3000,
118
168
  onPress: () => {
119
169
  if (isPrivateMessage) {
120
- setUnreadPrivateMessageCount(
121
- unreadPrivateMessageCount -
122
- (unreadIndividualMessageCount[uidAsNumber] || 0),
123
- );
124
- setUnreadIndividualMessageCount((prevState) => {
125
- return {
126
- ...prevState,
127
- [uidAsNumber]: 0,
128
- };
129
- });
130
- setGroupActive(false);
131
- setSelectedChatUserId(uidAsNumber);
132
- setPrivateActive(true);
170
+ openPrivateChat(uidAsNumber);
133
171
  } else {
134
- setUnreadGroupMessageCount(0);
135
- setPrivateActive(false);
136
- setSelectedChatUserId(0);
137
- setGroupActive(true);
172
+ //move this logic into ChatContainer
173
+ // setUnreadGroupMessageCount(0);
174
+ setPrivateChatUser(0);
175
+ setChatType(ChatType.Group);
176
+ setSidePanel(SidePanelType.Chat);
138
177
  }
139
- setSidePanel(SidePanelType.Chat);
140
178
  },
141
179
  });
142
180
  };
@@ -211,6 +249,14 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
211
249
  const messageData = payload.value;
212
250
  switch (messageAction) {
213
251
  case ChatMessageActionEnum.Create:
252
+ //To order chat participant based on recent message
253
+ try {
254
+ updateRenderListState(data.sender, {
255
+ lastMessageTimeStamp: new Date().getTime(),
256
+ });
257
+ } catch (error) {
258
+ console.log("ERROR : couldn't update the last message timestamp");
259
+ }
214
260
  showMessageNotification(messageData.msg, `${data.sender}`, true);
215
261
  addMessageToPrivateStore(
216
262
  data.sender,
@@ -358,7 +404,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
358
404
  value: messageData,
359
405
  action: ChatMessageActionEnum.Create,
360
406
  }),
361
- EventPersistLevel.LEVEL1,
407
+ PersistanceLevel.None,
362
408
  toUid,
363
409
  );
364
410
  addMessageToPrivateStore(toUid, messageData, true);
@@ -375,7 +421,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
375
421
  value: messageData,
376
422
  action: ChatMessageActionEnum.Create,
377
423
  }),
378
- EventPersistLevel.LEVEL1,
424
+ PersistanceLevel.None,
379
425
  );
380
426
  addMessageToStore(localUid, messageData);
381
427
  }
@@ -395,7 +441,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
395
441
  value: {msgId, ...editMsgData},
396
442
  action: ChatMessageActionEnum.Update,
397
443
  }),
398
- EventPersistLevel.LEVEL1,
444
+ PersistanceLevel.None,
399
445
  toUid,
400
446
  );
401
447
  setPrivateMessageStore((prevState) => {
@@ -426,7 +472,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
426
472
  value: {msgId, ...editMsgData},
427
473
  action: ChatMessageActionEnum.Update,
428
474
  }),
429
- EventPersistLevel.LEVEL1,
475
+ PersistanceLevel.None,
430
476
  );
431
477
  setMessageStore((prevState) => {
432
478
  const newState = prevState.map((item) => {
@@ -457,7 +503,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
457
503
  value: {msgId, ...deleteMsgData},
458
504
  action: ChatMessageActionEnum.Delete,
459
505
  }),
460
- EventPersistLevel.LEVEL1,
506
+ PersistanceLevel.None,
461
507
  toUid,
462
508
  );
463
509
  setPrivateMessageStore((prevState) => {
@@ -488,7 +534,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
488
534
  value: {msgId, ...deleteMsgData},
489
535
  action: ChatMessageActionEnum.Delete,
490
536
  }),
491
- EventPersistLevel.LEVEL1,
537
+ PersistanceLevel.None,
492
538
  );
493
539
  setMessageStore((prevState) => {
494
540
  const newState = prevState.map((item) => {
@@ -514,6 +560,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
514
560
  sendChatMessage,
515
561
  editChatMessage,
516
562
  deleteChatMessage,
563
+ openPrivateChat,
517
564
  }}>
518
565
  {props.children}
519
566
  </ChatMessagesContext.Provider>
@@ -0,0 +1,76 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import {createHook} from 'customization-implementation';
13
+ import React, {SetStateAction, useState} from 'react';
14
+ import {UidType} from '../../../agora-rn-uikit';
15
+
16
+ export enum ChatType {
17
+ Group,
18
+ //todo confirm memberlist with vineeth
19
+ MemberList,
20
+ Private,
21
+ }
22
+
23
+ export interface ChatUIControlsInterface {
24
+ chatType: ChatType;
25
+ privateChatUser: UidType;
26
+ inputActive?: boolean;
27
+ setChatType: (chatType: ChatType) => void;
28
+ setPrivateChatUser: React.Dispatch<SetStateAction<UidType>>;
29
+ setInputActive: React.Dispatch<SetStateAction<boolean>>;
30
+ message: string;
31
+ setMessage: React.Dispatch<SetStateAction<string>>;
32
+ }
33
+
34
+ const ChatUIControlsContext = React.createContext<ChatUIControlsInterface>({
35
+ chatType: ChatType.Group,
36
+ privateChatUser: 0,
37
+ message: '',
38
+ setChatType: () => {},
39
+ setPrivateChatUser: () => {},
40
+ setMessage: () => {},
41
+ inputActive: false,
42
+ setInputActive: () => {},
43
+ });
44
+
45
+ interface ChatUIControlsProviderProps {
46
+ children: React.ReactNode;
47
+ }
48
+
49
+ const ChatUIControlsProvider = (props: ChatUIControlsProviderProps) => {
50
+ const [chatType, setChatType] = useState<ChatType>(ChatType.Group);
51
+ const [inputActive, setInputActive] = useState(false);
52
+ const [privateChatUser, setPrivateChatUser] = useState<UidType>(0);
53
+ const [message, setMessage] = useState('');
54
+ return (
55
+ <ChatUIControlsContext.Provider
56
+ value={{
57
+ chatType,
58
+ setChatType,
59
+ privateChatUser,
60
+ setPrivateChatUser,
61
+ message,
62
+ setMessage,
63
+ inputActive,
64
+ setInputActive,
65
+ }}>
66
+ {props.children}
67
+ </ChatUIControlsContext.Provider>
68
+ );
69
+ };
70
+
71
+ /**
72
+ * The ChatUIControl app state governs the chat ui.
73
+ */
74
+ const useChatUIControls = createHook(ChatUIControlsContext);
75
+
76
+ export {ChatUIControlsProvider, useChatUIControls};
@@ -10,7 +10,8 @@
10
10
  *********************************************
11
11
  */
12
12
 
13
- import React, {useContext, useState} from 'react';
13
+ import React, {useContext, useEffect, useState} from 'react';
14
+ import Toast from '../../../react-native-toast-message';
14
15
  import Error from '../../subComponents/Error';
15
16
  type ErrorType = {
16
17
  name: string;
@@ -44,11 +45,24 @@ const ErrorProvider = (props: {children: React.ReactNode}) => {
44
45
 
45
46
  const CommonError: React.FC = () => {
46
47
  const {error} = useContext(ErrorContext);
47
- return error && (error.name || error.message) ? (
48
- <Error error={error} showBack={true} />
49
- ) : (
50
- <></>
51
- );
48
+ useEffect(() => {
49
+ if (error?.name || error?.message) {
50
+ Toast.show({
51
+ type: 'error',
52
+ text1: error.name,
53
+ text2: error.message,
54
+ visibilityTime: 1000 * 10,
55
+ primaryBtn: null,
56
+ secondaryBtn: null,
57
+ });
58
+ }
59
+ }, [error]);
60
+ return <></>;
61
+ // return error && (error.name || error.message) ? (
62
+ // <Error error={error} showBack={true} />
63
+ // ) : (
64
+ // <></>
65
+ // );
52
66
  };
53
67
  export {ErrorContext, ErrorProvider};
54
68
  export default CommonError;
@@ -11,26 +11,27 @@
11
11
  */
12
12
 
13
13
  import React from 'react';
14
- import {View, StyleSheet} from 'react-native';
15
- import Logo from '../../subComponents/Logo';
14
+ import {StyleSheet, Image} from 'react-native';
16
15
  import {useHasBrandLogo} from '../../utils/common';
17
-
18
- const CommonLogo: React.FC = () => {
16
+ const Logo: React.FC = () => {
19
17
  const hasBrandLogo = useHasBrandLogo();
18
+ const hasLogo = hasBrandLogo();
19
+ if (!hasLogo) {
20
+ return null;
21
+ }
22
+
20
23
  return (
21
- <View style={style.nav}>
22
- {hasBrandLogo() && <Logo />}
23
- {/* <OpenInNativeButton /> */}
24
- </View>
24
+ <Image
25
+ source={{uri: $config.LOGO}}
26
+ style={style.logo}
27
+ resizeMode="contain"
28
+ />
25
29
  );
26
30
  };
27
- export default CommonLogo;
31
+ export default Logo;
28
32
  const style = StyleSheet.create({
29
- nav: {
30
- flex: 1,
31
- width: '100%',
32
- flexDirection: 'row',
33
- alignItems: 'center',
34
- justifyContent: 'center',
33
+ logo: {
34
+ width: 54,
35
+ height: 19,
35
36
  },
36
37
  });
@@ -1,12 +1,18 @@
1
1
  import {UidType} from '../../../agora-rn-uikit';
2
- import React, {createContext, useState, useContext} from 'react';
2
+ import React, {
3
+ createContext,
4
+ useState,
5
+ useContext,
6
+ useReducer,
7
+ useEffect,
8
+ } from 'react';
3
9
  import {createHook} from 'customization-implementation';
4
10
  import LiveStreamContext, {
5
11
  raiseHandListInterface,
6
12
  } from '../../components/livestream';
7
13
  import {ClientRole, useLocalUid} from '../../../agora-rn-uikit';
8
14
  import {filterObject} from '../../utils';
9
- import {useRender} from 'customization-api';
15
+ import {useContent} from 'customization-api';
10
16
 
11
17
  export interface LiveStreamDataObjectInterface {
12
18
  [key: number]: {
@@ -30,26 +36,25 @@ interface ScreenShareProviderProps {
30
36
  children: React.ReactNode;
31
37
  }
32
38
  const LiveStreamDataProvider = (props: ScreenShareProviderProps) => {
33
- const {renderList} = useRender();
39
+ const {defaultContent} = useContent();
34
40
  const {raiseHandList} = useContext(LiveStreamContext);
35
41
  const [hostUids, setHostUids] = useState<UidType[]>([]);
36
42
  const [audienceUids, setAudienceUids] = useState<UidType[]>([]);
37
43
 
38
44
  React.useEffect(() => {
39
- if (Object.keys(renderList).length !== 0) {
45
+ if (Object.keys(defaultContent).length !== 0) {
40
46
  const hostList = filterObject(
41
- renderList,
47
+ defaultContent,
42
48
  ([k, v]) =>
43
- (v?.type === 'rtc' ||
44
- v?.type === 'live' ||
45
- (v?.type === 'screenshare' && v?.video == 1)) &&
49
+ (v?.type === 'rtc' || v?.type === 'live') && //||
50
+ //(v?.type === 'screenshare' && v?.video == 1)
46
51
  (raiseHandList[k]
47
52
  ? raiseHandList[k]?.role == ClientRole.Broadcaster
48
53
  : true) &&
49
54
  !v?.offline,
50
55
  );
51
56
  const audienceList = filterObject(
52
- renderList,
57
+ defaultContent,
53
58
  ([k, v]) =>
54
59
  (v?.type === 'rtc' || v?.type === 'live') &&
55
60
  raiseHandList[k]?.role == ClientRole.Audience &&
@@ -61,13 +66,13 @@ const LiveStreamDataProvider = (props: ScreenShareProviderProps) => {
61
66
  setHostUids(hUids);
62
67
  setAudienceUids(aUids);
63
68
  }
64
- }, [renderList, raiseHandList]);
69
+ }, [defaultContent, raiseHandList]);
65
70
 
66
71
  return (
67
72
  <LiveStreamDataContext.Provider
68
73
  value={{
69
74
  liveStreamData: raiseHandList,
70
- hostUids,
75
+ hostUids: hostUids,
71
76
  audienceUids,
72
77
  }}>
73
78
  {props.children}
@@ -1,10 +1,18 @@
1
- import React, {createContext, useState, useEffect, useContext} from 'react';
1
+ import React, {
2
+ createContext,
3
+ useState,
4
+ useEffect,
5
+ useContext,
6
+ useReducer,
7
+ useRef,
8
+ } from 'react';
2
9
  import {createHook} from 'customization-implementation';
3
10
  import {UidType, useLocalUid} from '../../../agora-rn-uikit';
4
- import {useMeetingInfo} from '../meeting-info/useMeetingInfo';
5
- import events, {EventPersistLevel} from '../../rtm-events-api';
11
+ import {useRoomInfo} from '../room-info/useRoomInfo';
12
+ import events, {PersistanceLevel} from '../../rtm-events-api';
6
13
  import {EventNames} from '../../rtm-events';
7
14
  import ChatContext from '../ChatContext';
15
+ import {useContent} from 'customization-api';
8
16
 
9
17
  export interface VideoMeetingDataInterface {
10
18
  hostUids: UidType[];
@@ -21,11 +29,23 @@ interface VideoMeetingDataProviderProps {
21
29
  const VideoMeetingDataProvider = (props: VideoMeetingDataProviderProps) => {
22
30
  const {
23
31
  data: {isHost},
24
- } = useMeetingInfo();
32
+ } = useRoomInfo();
33
+ const {activeUids} = useContent();
25
34
  const {hasUserJoinedRTM} = useContext(ChatContext);
26
35
  const localUid = useLocalUid();
27
36
  const [hostUids, setHostUids] = useState<UidType[]>([]);
28
37
  const [attendeeUids, setAttendeeUids] = useState<UidType[]>([]);
38
+ const [, forceUpdate] = useReducer((x) => x + 1, 0);
39
+ const hostUidsRef = useRef({hostUids});
40
+ const attendeeUidsRef = useRef({attendeeUids});
41
+
42
+ useEffect(() => {
43
+ hostUidsRef.current.hostUids = hostUids;
44
+ }, [hostUids]);
45
+
46
+ useEffect(() => {
47
+ attendeeUidsRef.current.attendeeUids = attendeeUids;
48
+ }, [attendeeUids]);
29
49
 
30
50
  useEffect(() => {
31
51
  //set local uid
@@ -36,8 +56,8 @@ const VideoMeetingDataProvider = (props: VideoMeetingDataProviderProps) => {
36
56
  events.on(EventNames.VIDEO_MEETING_HOST, (data) => {
37
57
  const payload = JSON.parse(data?.payload);
38
58
  const hostUid = payload?.uid;
39
- if (hostUid && hostUids.indexOf(hostUid) === -1) {
40
- setHostUids((prevState) => [...prevState, hostUid]);
59
+ if (hostUid && hostUidsRef?.current?.hostUids.indexOf(hostUid) === -1) {
60
+ setHostUids([...hostUidsRef?.current?.hostUids, hostUid]);
41
61
  }
42
62
  });
43
63
 
@@ -45,8 +65,14 @@ const VideoMeetingDataProvider = (props: VideoMeetingDataProviderProps) => {
45
65
  events.on(EventNames.VIDEO_MEETING_ATTENDEE, (data) => {
46
66
  const payload = JSON.parse(data?.payload);
47
67
  const attendeeUid = payload?.uid;
48
- if (attendeeUid && attendeeUids.indexOf(attendeeUid) === -1) {
49
- setAttendeeUids((prevState) => [...prevState, attendeeUid]);
68
+ if (
69
+ attendeeUid &&
70
+ attendeeUidsRef?.current?.attendeeUids?.indexOf(attendeeUid) === -1
71
+ ) {
72
+ setAttendeeUids([
73
+ ...attendeeUidsRef?.current?.attendeeUids,
74
+ attendeeUid,
75
+ ]);
50
76
  }
51
77
  });
52
78
 
@@ -65,16 +91,20 @@ const VideoMeetingDataProvider = (props: VideoMeetingDataProviderProps) => {
65
91
  ? EventNames.VIDEO_MEETING_HOST
66
92
  : EventNames.VIDEO_MEETING_ATTENDEE,
67
93
  JSON.stringify({uid: localUid}),
68
- EventPersistLevel.LEVEL2,
94
+ PersistanceLevel.Sender,
69
95
  );
70
96
  }
71
97
  }, [isHost, hasUserJoinedRTM]);
72
98
 
99
+ useEffect(() => {
100
+ forceUpdate();
101
+ }, [activeUids]);
102
+
73
103
  return (
74
104
  <VideoMeetingData.Provider
75
105
  value={{
76
- hostUids,
77
- attendeeUids,
106
+ hostUids: hostUids.filter((i) => activeUids.indexOf(i) !== -1),
107
+ attendeeUids: attendeeUids.filter((i) => activeUids.indexOf(i) !== -1),
78
108
  }}>
79
109
  {props.children}
80
110
  </VideoMeetingData.Provider>
@@ -1,14 +1,14 @@
1
- import {UidType} from '../../../agora-rn-uikit';
1
+ import {DispatchContext, UidType} from '../../../agora-rn-uikit';
2
2
  import React, {
3
3
  createContext,
4
4
  Dispatch,
5
5
  SetStateAction,
6
+ useContext,
6
7
  useEffect,
7
8
  useState,
8
9
  } from 'react';
9
10
  import {createHook} from 'customization-implementation';
10
11
  import {filterObject} from '../../utils/index';
11
- import {useRtc} from 'customization-api';
12
12
 
13
13
  export interface WhiteboardObjectInterface {
14
14
  [key: number]: {
@@ -32,7 +32,7 @@ interface WhiteboardProviderProps {
32
32
  const WhiteboardProvider = (props: WhiteboardProviderProps) => {
33
33
  const [whiteboardData, setWhiteboardData] =
34
34
  useState<WhiteboardObjectInterface>({});
35
- const {dispatch} = useRtc();
35
+ const {dispatch} = useContext(DispatchContext);
36
36
 
37
37
  useEffect(() => {
38
38
  const activeData = filterObject(