agora-appbuilder-core 3.0.9 → 4.0.0-api.1

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 (305) hide show
  1. package/Readme.md +6 -0
  2. package/package.json +2 -2
  3. package/template/_package-lock.json +5871 -4728
  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 +72 -5
  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 -106
  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 +100 -52
  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/src/Contexts/RenderContext.tsx +0 -10
  301. package/template/src/assets/icons.ts +0 -102
  302. package/template/src/components/chat-ui/useChatUIControl.tsx +0 -69
  303. package/template/src/components/participants/MeParticipant.tsx +0 -38
  304. package/template/src/components/participants/RemoteParticipants.tsx +0 -71
  305. package/template/src/pages/video-call/CustomUserContextHolder.tsx +0 -20
@@ -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
- const {setSidePanel} = useSidePanel();
66
- const {
67
- groupActive,
68
- selectedChatUserId,
69
- setGroupActive,
70
- setPrivateActive,
71
- setSelectedChatUserId,
72
- } = useChatUIControl();
74
+ const {setSidePanel, sidePanel} = useSidePanel();
75
+ const {chatType, setChatType, privateChatUser, setPrivateChatUser} =
76
+ useChatUIControls();
73
77
  const {
74
78
  setUnreadGroupMessageCount,
75
79
  setUnreadIndividualMessageCount,
@@ -82,24 +86,51 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
82
86
  [key: string]: messageStoreInterface[];
83
87
  }>({});
84
88
 
85
- const renderListRef = useRef({renderList: renderList});
86
- const groupActiveRef = useRef<boolean>();
89
+ const defaultContentRef = useRef({defaultContent: defaultContent});
90
+ const groupActiveRef = useRef<boolean>(false);
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 =
103
+ chatType === ChatType.Group && sidePanel === SidePanelType.Chat;
104
+ }, [chatType, sidePanel]);
99
105
 
100
106
  useEffect(() => {
101
- individualActiveRef.current = selectedChatUserId;
102
- }, [selectedChatUserId]);
107
+ individualActiveRef.current = privateChatUser;
108
+ }, [privateChatUser]);
109
+
110
+ const openPrivateChat = (uidAsNumber) => {
111
+ //move this logic into ChatContainer
112
+ // setUnreadPrivateMessageCount(
113
+ // unreadPrivateMessageCount -
114
+ // (unreadIndividualMessageCount[uidAsNumber] || 0),
115
+ // );
116
+ // setUnreadIndividualMessageCount((prevState) => {
117
+ // return {
118
+ // ...prevState,
119
+ // [uidAsNumber]: 0,
120
+ // };
121
+ // });
122
+
123
+ setPrivateChatUser(uidAsNumber);
124
+ setChatType(ChatType.Private);
125
+ setSidePanel(SidePanelType.Chat);
126
+ };
127
+
128
+ const updateRenderListState = (
129
+ uid: number,
130
+ data: Partial<ContentInterface>,
131
+ ) => {
132
+ dispatch({type: 'UpdateRenderList', value: [uid, data]});
133
+ };
103
134
 
104
135
  React.useEffect(() => {
105
136
  const showMessageNotification = (
@@ -107,36 +138,44 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
107
138
  uid: string,
108
139
  isPrivateMessage: boolean = false,
109
140
  ) => {
141
+ //don't show group message notification if group chat is open
142
+ if (!isPrivateMessage && groupActiveRef.current) {
143
+ return;
144
+ }
110
145
  const uidAsNumber = parseInt(uid);
146
+ //don't show private message notification if private chat is open
147
+ if (isPrivateMessage && uidAsNumber === individualActiveRef.current) {
148
+ return;
149
+ }
111
150
  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)
151
+ primaryBtn: null,
152
+ secondaryBtn: null,
153
+ type: 'info',
154
+ text1: isPrivateMessage
155
+ ? privateMessageLabel
156
+ : defaultContentRef.current.defaultContent[uidAsNumber]?.name
157
+ ? fromText(
158
+ trimText(
159
+ defaultContentRef.current.defaultContent[uidAsNumber]?.name,
160
+ ),
161
+ )
116
162
  : '',
117
- visibilityTime: 1000,
163
+ text2: isPrivateMessage
164
+ ? ''
165
+ : msg.length > 30
166
+ ? msg.slice(0, 30) + '...'
167
+ : msg,
168
+ visibilityTime: 3000,
118
169
  onPress: () => {
119
170
  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);
171
+ openPrivateChat(uidAsNumber);
133
172
  } else {
134
- setUnreadGroupMessageCount(0);
135
- setPrivateActive(false);
136
- setSelectedChatUserId(0);
137
- setGroupActive(true);
173
+ //move this logic into ChatContainer
174
+ // setUnreadGroupMessageCount(0);
175
+ setPrivateChatUser(0);
176
+ setChatType(ChatType.Group);
177
+ setSidePanel(SidePanelType.Chat);
138
178
  }
139
- setSidePanel(SidePanelType.Chat);
140
179
  },
141
180
  });
142
181
  };
@@ -211,6 +250,14 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
211
250
  const messageData = payload.value;
212
251
  switch (messageAction) {
213
252
  case ChatMessageActionEnum.Create:
253
+ //To order chat participant based on recent message
254
+ try {
255
+ updateRenderListState(data.sender, {
256
+ lastMessageTimeStamp: new Date().getTime(),
257
+ });
258
+ } catch (error) {
259
+ console.log("ERROR : couldn't update the last message timestamp");
260
+ }
214
261
  showMessageNotification(messageData.msg, `${data.sender}`, true);
215
262
  addMessageToPrivateStore(
216
263
  data.sender,
@@ -358,7 +405,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
358
405
  value: messageData,
359
406
  action: ChatMessageActionEnum.Create,
360
407
  }),
361
- EventPersistLevel.LEVEL1,
408
+ PersistanceLevel.None,
362
409
  toUid,
363
410
  );
364
411
  addMessageToPrivateStore(toUid, messageData, true);
@@ -375,7 +422,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
375
422
  value: messageData,
376
423
  action: ChatMessageActionEnum.Create,
377
424
  }),
378
- EventPersistLevel.LEVEL1,
425
+ PersistanceLevel.None,
379
426
  );
380
427
  addMessageToStore(localUid, messageData);
381
428
  }
@@ -395,7 +442,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
395
442
  value: {msgId, ...editMsgData},
396
443
  action: ChatMessageActionEnum.Update,
397
444
  }),
398
- EventPersistLevel.LEVEL1,
445
+ PersistanceLevel.None,
399
446
  toUid,
400
447
  );
401
448
  setPrivateMessageStore((prevState) => {
@@ -426,7 +473,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
426
473
  value: {msgId, ...editMsgData},
427
474
  action: ChatMessageActionEnum.Update,
428
475
  }),
429
- EventPersistLevel.LEVEL1,
476
+ PersistanceLevel.None,
430
477
  );
431
478
  setMessageStore((prevState) => {
432
479
  const newState = prevState.map((item) => {
@@ -457,7 +504,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
457
504
  value: {msgId, ...deleteMsgData},
458
505
  action: ChatMessageActionEnum.Delete,
459
506
  }),
460
- EventPersistLevel.LEVEL1,
507
+ PersistanceLevel.None,
461
508
  toUid,
462
509
  );
463
510
  setPrivateMessageStore((prevState) => {
@@ -488,7 +535,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
488
535
  value: {msgId, ...deleteMsgData},
489
536
  action: ChatMessageActionEnum.Delete,
490
537
  }),
491
- EventPersistLevel.LEVEL1,
538
+ PersistanceLevel.None,
492
539
  );
493
540
  setMessageStore((prevState) => {
494
541
  const newState = prevState.map((item) => {
@@ -514,6 +561,7 @@ const ChatMessagesProvider = (props: ChatMessagesProviderProps) => {
514
561
  sendChatMessage,
515
562
  editChatMessage,
516
563
  deleteChatMessage,
564
+ openPrivateChat,
517
565
  }}>
518
566
  {props.children}
519
567
  </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>