agora-appbuilder-core 2.2.0 → 2.3.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/Readme.md +7 -1
  2. package/package.json +4 -3
  3. package/template/Gulpfile.js +389 -82
  4. package/template/_gitignore +4 -1
  5. package/template/_package-lock.json +32214 -3080
  6. package/template/agora-rn-uikit/src/AgoraUIKit.tsx +23 -20
  7. package/template/agora-rn-uikit/src/Contexts/LocalUserContext.tsx +13 -8
  8. package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +25 -9
  9. package/template/agora-rn-uikit/src/Contexts/RenderContext.tsx +10 -0
  10. package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +11 -5
  11. package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +6 -2
  12. package/template/agora-rn-uikit/src/Controls/ImageIcon.tsx +1 -1
  13. package/template/agora-rn-uikit/src/Controls/Local/EndCall.tsx +6 -2
  14. package/template/agora-rn-uikit/src/Controls/Local/LocalAudioMute.tsx +2 -2
  15. package/template/agora-rn-uikit/src/Controls/Local/LocalVideoMute.tsx +2 -2
  16. package/template/agora-rn-uikit/src/Controls/Local/SwitchCamera.tsx +6 -2
  17. package/template/agora-rn-uikit/src/Controls/LocalControls.tsx +11 -6
  18. package/template/agora-rn-uikit/src/Controls/Remote/RemoteAudioMute.tsx +10 -6
  19. package/template/agora-rn-uikit/src/Controls/Remote/RemoteSwap.tsx +7 -6
  20. package/template/agora-rn-uikit/src/Controls/Remote/RemoteVideoMute.tsx +6 -5
  21. package/template/agora-rn-uikit/src/Controls/RemoteControls.tsx +3 -3
  22. package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +16 -13
  23. package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +16 -13
  24. package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +13 -13
  25. package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +16 -13
  26. package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +28 -31
  27. package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +48 -35
  28. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +11 -13
  29. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +11 -13
  30. package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +18 -15
  31. package/template/agora-rn-uikit/src/Rtc/Create.tsx +22 -3
  32. package/template/agora-rn-uikit/src/Rtc/Join.tsx +19 -3
  33. package/template/agora-rn-uikit/src/RtcConfigure.tsx +161 -44
  34. package/template/agora-rn-uikit/src/Utils/useLocalUid.ts +8 -0
  35. package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +8 -6
  36. package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +8 -6
  37. package/template/agora-rn-uikit/src/Views/MinVideoView.tsx +18 -9
  38. package/template/agora-rn-uikit/src/index.ts +12 -12
  39. package/template/babel.config.js +17 -1
  40. package/template/bridge/rtc/webNg/RtcEngine.ts +34 -28
  41. package/template/bridge/rtc/webNg/SurfaceView.tsx +3 -2
  42. package/template/bridge/rtc/webNg/Types.ts +14 -0
  43. package/template/bridge/rtc/webNg/index.ts +5 -2
  44. package/template/bridge/rtm/web/index.ts +13 -7
  45. package/template/electron-builder.js +3 -2
  46. package/template/esbuild.rsdk.go +240 -0
  47. package/template/{src/subComponents/LayoutEnum.tsx → esbuildConfigTransform.js} +1 -5
  48. package/template/fpe-api/components.ts +43 -0
  49. package/template/fpe-api/context.ts +45 -0
  50. package/template/fpe-api/fpeEvents.ts +9 -0
  51. package/template/fpe-api/index.ts +21 -0
  52. package/template/fpe-api/install.ts +138 -0
  53. package/template/fpe-api/typeDefinition.ts +144 -0
  54. package/template/fpe-api/useFpe.tsx +35 -0
  55. package/template/fpe-api/utils.ts +61 -0
  56. package/template/fpe-implementation/createHook.ts +33 -0
  57. package/template/fpe-implementation/dummyFpe.ts +17 -0
  58. package/template/fpe-implementation/index.ts +1 -0
  59. package/template/fpe-todo.txt +14 -0
  60. package/template/fpe.config.js +29 -0
  61. package/template/global.d.ts +4 -0
  62. package/template/index.rsdk.tsx +27 -0
  63. package/template/index.wsdk.tsx +27 -0
  64. package/template/package.json +30 -13
  65. package/template/react-native-toast-message/src/index.js +9 -10
  66. package/template/react-native-toast-message/src/index.wsdk.js +419 -0
  67. package/template/src/App.tsx +97 -65
  68. package/template/src/AppWrapper.tsx +79 -0
  69. package/template/src/SDKAppWrapper.tsx +67 -0
  70. package/template/src/atoms/PrimaryButton.tsx +14 -8
  71. package/template/src/atoms/TextInput.tsx +13 -5
  72. package/template/src/components/Chat.tsx +178 -137
  73. package/template/src/components/ChatContext.ts +18 -22
  74. package/template/src/components/ColorConfigure.tsx +2 -2
  75. package/template/src/components/Controls.native.tsx +72 -62
  76. package/template/src/components/Controls.tsx +90 -69
  77. package/template/src/components/DeviceConfigure.tsx +1 -1
  78. package/template/src/components/DeviceContext.tsx +14 -7
  79. package/template/src/components/GraphQLProvider.tsx +9 -2
  80. package/template/src/components/GridVideo.tsx +20 -159
  81. package/template/src/components/HostControlView.tsx +54 -15
  82. package/template/src/components/Navbar.tsx +408 -157
  83. package/template/src/components/NetworkQualityContext.tsx +29 -22
  84. package/template/src/components/ParticipantsView.tsx +91 -115
  85. package/template/src/components/PinnedVideo.tsx +41 -188
  86. package/template/src/components/Precall.native.tsx +131 -97
  87. package/template/src/components/Precall.tsx +193 -158
  88. package/template/src/components/RTMConfigure.tsx +309 -415
  89. package/template/src/components/Router.sdk.ts +20 -0
  90. package/template/src/components/SessionContext.tsx +6 -3
  91. package/template/src/components/Settings.native.tsx +3 -0
  92. package/template/src/components/Settings.tsx +65 -31
  93. package/template/src/components/SettingsView.tsx +14 -8
  94. package/template/src/components/Share.tsx +188 -220
  95. package/template/src/components/StorageContext.tsx +5 -5
  96. package/template/src/components/StoreToken.tsx +5 -1
  97. package/template/src/components/chat-messages/useChatMessages.tsx +208 -0
  98. package/template/src/components/chat-notification/useChatNotification.tsx +78 -0
  99. package/template/src/components/chat-ui/useChatUIControl.tsx +66 -0
  100. package/template/src/components/common/Error.tsx +54 -0
  101. package/template/src/components/common/Logo.tsx +35 -0
  102. package/template/src/components/common/index.tsx +8 -0
  103. package/template/src/components/contexts/LiveStreamDataContext.tsx +79 -0
  104. package/template/src/components/contexts/ScreenShareContext.tsx +47 -0
  105. package/template/src/components/contexts/WhiteboardContext.tsx +59 -0
  106. package/template/src/components/dimension/DimensionContext.ts +27 -0
  107. package/template/src/components/dimension/DimensionProvider.tsx +34 -0
  108. package/template/src/components/livestream/LiveStreamContext.tsx +297 -273
  109. package/template/src/components/livestream/Types.ts +26 -7
  110. package/template/src/components/livestream/index.ts +13 -2
  111. package/template/src/components/livestream/views/LiveStreamControls.tsx +5 -1
  112. package/template/src/components/meeting-info/useMeetingInfo.tsx +63 -0
  113. package/template/src/components/meeting-info/useSetMeetingInfo.tsx +38 -0
  114. package/template/src/components/participants/AllAudienceParticipants.tsx +26 -21
  115. package/template/src/components/participants/AllHostParticipants.tsx +41 -53
  116. package/template/src/components/participants/MeParticipant.tsx +9 -10
  117. package/template/src/components/participants/ParticipantName.tsx +2 -1
  118. package/template/src/components/participants/RemoteParticipants.tsx +3 -3
  119. package/template/src/components/precall/LocalMute.native.tsx +91 -0
  120. package/template/src/components/precall/LocalMute.tsx +90 -0
  121. package/template/src/components/precall/VideoPreview.native.tsx +35 -0
  122. package/template/src/components/precall/VideoPreview.tsx +33 -0
  123. package/template/src/components/precall/index.tsx +28 -0
  124. package/template/src/components/precall/joinCallBtn.native.tsx +69 -0
  125. package/template/src/components/precall/joinCallBtn.tsx +91 -0
  126. package/template/src/components/precall/meetingTitle.tsx +26 -0
  127. package/template/src/components/precall/selectDevice.tsx +46 -0
  128. package/template/src/components/precall/textInput.tsx +43 -0
  129. package/template/src/components/precall/usePreCall.tsx +41 -0
  130. package/template/src/components/styles.ts +20 -3
  131. package/template/src/components/useShareLink.tsx +237 -0
  132. package/template/src/components/useUserPreference.tsx +125 -0
  133. package/template/src/components/useWakeLock.tsx +3 -3
  134. package/template/src/custom-events/CustomEvents.ts +238 -0
  135. package/template/src/custom-events/index.tsx +4 -0
  136. package/template/src/custom-events/types.ts +51 -0
  137. package/template/src/language/default-labels/commonLabels.ts +21 -0
  138. package/template/src/language/default-labels/createScreenLabels.ts +22 -0
  139. package/template/src/language/default-labels/index.ts +38 -0
  140. package/template/src/language/default-labels/joinScreenLabels.ts +13 -0
  141. package/template/src/language/default-labels/precallScreenLabels.ts +33 -0
  142. package/template/src/language/default-labels/shareLinkScreenLabels.ts +44 -0
  143. package/template/src/language/default-labels/videoCallScreenLabels.ts +191 -0
  144. package/template/src/language/i18nTypes.ts +10 -0
  145. package/template/src/language/index.ts +18 -0
  146. package/template/src/language/useLanguage.tsx +92 -0
  147. package/template/src/pages/Authenticate.tsx +21 -15
  148. package/template/src/pages/Create.tsx +180 -159
  149. package/template/src/pages/Join.tsx +47 -32
  150. package/template/src/pages/VideoCall.tsx +138 -407
  151. package/template/src/pages/create/useCreate.tsx +37 -0
  152. package/template/src/pages/video-call/CustomLayout.ts +17 -0
  153. package/template/src/pages/video-call/CustomUserContextHolder.tsx +20 -0
  154. package/template/src/pages/video-call/DefaultLayouts.ts +65 -0
  155. package/template/src/pages/video-call/NameWithMicStatus.tsx +62 -0
  156. package/template/src/pages/video-call/RenderComponent.tsx +52 -0
  157. package/template/src/pages/video-call/VideoCallScreen.tsx +191 -0
  158. package/template/src/pages/video-call/VideoComponent.tsx +34 -0
  159. package/template/src/pages/video-call/VideoRenderer.tsx +86 -0
  160. package/template/src/pages/video-call/index.ts +20 -0
  161. package/template/src/rtm/RTMEngine.ts +58 -0
  162. package/template/src/rtm/utils.ts +44 -0
  163. package/template/src/rtm-events/EventUtils.ts +267 -0
  164. package/template/src/rtm-events/EventsQueue.ts +38 -0
  165. package/template/src/rtm-events/constants.ts +42 -0
  166. package/template/src/rtm-events/index.tsx +8 -0
  167. package/template/src/rtm-events/types.ts +7 -0
  168. package/template/src/subComponents/ChatBubble.tsx +21 -12
  169. package/template/src/subComponents/ChatContainer.tsx +79 -30
  170. package/template/src/subComponents/ChatInput.tsx +146 -70
  171. package/template/src/subComponents/CopyJoinInfo.tsx +52 -67
  172. package/template/src/subComponents/Error.tsx +35 -24
  173. package/template/src/subComponents/LanguageSelector.tsx +85 -0
  174. package/template/src/subComponents/LayoutIconDropdown.native.tsx +163 -0
  175. package/template/src/subComponents/LayoutIconDropdown.tsx +198 -0
  176. package/template/src/subComponents/LocalAudioMute.tsx +52 -30
  177. package/template/src/subComponents/LocalEndCall.tsx +52 -0
  178. package/template/src/subComponents/LocalSwitchCamera.tsx +61 -0
  179. package/template/src/subComponents/LocalVideoMute.tsx +48 -30
  180. package/template/src/subComponents/LogoutButton.tsx +20 -5
  181. package/template/src/subComponents/NetworkQualityPill.tsx +43 -13
  182. package/template/src/subComponents/OpenInNativeButton.tsx +3 -2
  183. package/template/src/subComponents/Recording.tsx +46 -138
  184. package/template/src/subComponents/RemoteAudioMute.tsx +30 -34
  185. package/template/src/subComponents/RemoteEndCall.tsx +18 -7
  186. package/template/src/subComponents/RemoteVideoMute.tsx +17 -9
  187. package/template/src/subComponents/ScreenShareNotice.tsx +40 -40
  188. package/template/src/subComponents/SelectDevice.tsx +88 -45
  189. package/template/src/subComponents/SelectOAuth.tsx +30 -6
  190. package/template/src/subComponents/SidePanelButtons.ts +39 -0
  191. package/template/src/subComponents/TextWithTooltip.native.tsx +2 -1
  192. package/template/src/subComponents/TextWithTooltip.tsx +15 -20
  193. package/template/src/subComponents/chat/ChatParticipants.tsx +31 -32
  194. package/template/src/subComponents/livestream/ApprovedLiveStreamControlsView.tsx +7 -3
  195. package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +32 -18
  196. package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +22 -8
  197. package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +12 -7
  198. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +24 -27
  199. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +23 -26
  200. package/template/src/subComponents/livestream/index.ts +10 -2
  201. package/template/src/subComponents/recording/useRecording.tsx +209 -0
  202. package/template/src/subComponents/recording/useRecordingLayoutQuery.tsx +64 -0
  203. package/template/src/subComponents/screenshare/ScreenshareButton.native.tsx +18 -0
  204. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +61 -31
  205. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +57 -52
  206. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +104 -144
  207. package/template/src/subComponents/screenshare/useScreenshare.tsx +29 -0
  208. package/template/src/subComponents/toastConfig.tsx +25 -20
  209. package/template/src/utils/IsAttendeeUser.ts +34 -0
  210. package/template/src/utils/SdkEvents.ts +68 -0
  211. package/template/src/utils/common.tsx +40 -0
  212. package/template/src/utils/eventEmitter.ts +29 -0
  213. package/template/src/utils/getMeetingInvite.ts +53 -0
  214. package/template/src/utils/index.tsx +11 -2
  215. package/template/src/utils/isAudioEnabled.ts +29 -0
  216. package/template/src/utils/isHostUser.ts +33 -0
  217. package/template/src/utils/isMobileOrTablet.native.ts +5 -0
  218. package/template/src/utils/{mobileWebTest.tsx → isMobileOrTablet.ts} +5 -2
  219. package/template/src/utils/isPSTNUser.ts +30 -0
  220. package/template/src/utils/isSDK.sdk.ts +5 -0
  221. package/template/src/utils/isSDK.ts +5 -0
  222. package/template/src/utils/isScreenShareUser.ts +31 -0
  223. package/template/src/utils/isVideoEnabled.ts +29 -0
  224. package/template/src/utils/useButtonTemplate.tsx +43 -0
  225. package/template/src/utils/useCreateMeeting.ts +74 -0
  226. package/template/src/utils/useGetLiveStreamingRequests.ts +24 -0
  227. package/template/src/utils/useGetMeetingPhrase.ts +68 -0
  228. package/template/src/utils/useGetName.ts +19 -0
  229. package/template/src/{subComponents/screenshare/ScreenshareContext.tsx → utils/useGroupMessages.ts} +10 -7
  230. package/template/src/utils/useJoinMeeting.ts +128 -0
  231. package/template/src/utils/useLayout.tsx +40 -0
  232. package/template/src/utils/useLiveStreamingUids.ts +26 -0
  233. package/template/src/utils/useLocalShareScreenUid.ts +19 -0
  234. package/template/src/utils/useMutePSTN.ts +43 -0
  235. package/template/src/utils/useMuteToggleLocal.ts +109 -0
  236. package/template/src/utils/useNavParams.ts +6 -0
  237. package/template/src/utils/useNavigateTo.ts +8 -0
  238. package/template/src/utils/usePrivateMessages.ts +33 -0
  239. package/template/src/utils/useRemoteEndCall.ts +27 -0
  240. package/template/src/utils/useRemoteMute.ts +64 -0
  241. package/template/src/utils/useSendControlMessage.ts +51 -0
  242. package/template/src/utils/useSendMessage.ts +40 -0
  243. package/template/src/utils/useSetName.ts +18 -0
  244. package/template/src/utils/useSetUnreadMessageCount.ts +43 -0
  245. package/template/src/utils/useSidePanel.tsx +41 -0
  246. package/template/src/utils/useString.ts +61 -0
  247. package/template/src/utils/useUnreadMessageCount.ts +50 -0
  248. package/template/src/utils/useUserList.ts +26 -0
  249. package/template/tsconfig.json +4 -4
  250. package/template/tsconfig_fpeApi.json +103 -0
  251. package/template/tsconfig_rsdk_index.json +105 -0
  252. package/template/tsconfig_wsdk_index.json +104 -0
  253. package/template/webpack.commons.js +40 -16
  254. package/template/webpack.main.config.js +2 -1
  255. package/template/webpack.renderer.config.js +1 -1
  256. package/template/webpack.rsdk.config.js +33 -0
  257. package/template/webpack.ts.config.js +89 -0
  258. package/template/webpack.web.config.js +8 -1
  259. package/template/webpack.wsdk.config.js +34 -0
  260. package/template/agora-rn-uikit/.git/HEAD +0 -1
  261. package/template/agora-rn-uikit/.git/config +0 -16
  262. package/template/agora-rn-uikit/.git/description +0 -1
  263. package/template/agora-rn-uikit/.git/hooks/applypatch-msg.sample +0 -15
  264. package/template/agora-rn-uikit/.git/hooks/commit-msg.sample +0 -24
  265. package/template/agora-rn-uikit/.git/hooks/fsmonitor-watchman.sample +0 -173
  266. package/template/agora-rn-uikit/.git/hooks/post-update.sample +0 -8
  267. package/template/agora-rn-uikit/.git/hooks/pre-applypatch.sample +0 -14
  268. package/template/agora-rn-uikit/.git/hooks/pre-commit.sample +0 -49
  269. package/template/agora-rn-uikit/.git/hooks/pre-merge-commit.sample +0 -13
  270. package/template/agora-rn-uikit/.git/hooks/pre-push.sample +0 -53
  271. package/template/agora-rn-uikit/.git/hooks/pre-rebase.sample +0 -169
  272. package/template/agora-rn-uikit/.git/hooks/pre-receive.sample +0 -24
  273. package/template/agora-rn-uikit/.git/hooks/prepare-commit-msg.sample +0 -42
  274. package/template/agora-rn-uikit/.git/hooks/push-to-checkout.sample +0 -78
  275. package/template/agora-rn-uikit/.git/hooks/update.sample +0 -128
  276. package/template/agora-rn-uikit/.git/index +0 -0
  277. package/template/agora-rn-uikit/.git/info/exclude +0 -6
  278. package/template/agora-rn-uikit/.git/logs/HEAD +0 -2
  279. package/template/agora-rn-uikit/.git/logs/refs/heads/ab-dev-auto +0 -1
  280. package/template/agora-rn-uikit/.git/logs/refs/heads/master +0 -1
  281. package/template/agora-rn-uikit/.git/logs/refs/remotes/origin/HEAD +0 -1
  282. package/template/agora-rn-uikit/.git/objects/pack/pack-0061d00cd98162a329a32b537488a35d0abeb069.idx +0 -0
  283. package/template/agora-rn-uikit/.git/objects/pack/pack-0061d00cd98162a329a32b537488a35d0abeb069.pack +0 -0
  284. package/template/agora-rn-uikit/.git/packed-refs +0 -24
  285. package/template/agora-rn-uikit/.git/refs/heads/ab-dev-auto +0 -1
  286. package/template/agora-rn-uikit/.git/refs/heads/master +0 -1
  287. package/template/agora-rn-uikit/.git/refs/remotes/origin/HEAD +0 -1
  288. package/template/agora-rn-uikit/.gitignore +0 -63
  289. package/template/agora-rn-uikit/package-lock.json +0 -7612
  290. package/template/agora-rn-uikit/src/Contexts/MaxUidContext.tsx +0 -7
  291. package/template/agora-rn-uikit/src/Contexts/MinUidContext.tsx +0 -8
  292. package/template/package-lock.json +0 -22923
  293. package/template/react-native-toast-message/.gitignore +0 -5
  294. package/template/react-native-toast-message/.npmignore +0 -5
  295. package/template/react-native-toast-message/package-lock.json +0 -10553
  296. package/template/src/.DS_Store +0 -0
  297. package/template/src/components/participants/context/ParticipantContext.tsx +0 -97
  298. package/template/src/subComponents/.DS_Store +0 -0
  299. package/template/src/subComponents/ScreenshareButton.tsx +0 -257
  300. package/template/src/subComponents/SwitchCamera.tsx +0 -35
  301. package/template/src/utils/hasBrandLogo.tsx +0 -3
  302. package/template/src/utils/mobileWebTest.native.tsx +0 -5
  303. package/template/src/utils/shouldAuthenticate.tsx +0 -7
@@ -0,0 +1,267 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2022 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 {EventSourceEnum} from '../custom-events/types';
13
+ type TListener = <T>(t: T) => void;
14
+ type TListenerMetaData = {once: boolean; listener: TListener};
15
+ type TEventList = Map<string, TListenerMetaData[]>;
16
+ type TEvents = Record<EventSourceEnum, TEventList> | Record<string, never>;
17
+
18
+ const EventUtils = (function () {
19
+ 'use strict';
20
+
21
+ let _events: TEvents = {};
22
+
23
+ /**
24
+ * Checks if the callback passed is valid listener or not
25
+ * @return {Boolean} true if callback passed is a function
26
+ * @api private
27
+ * @example : () => {} (or) {once: false, listener: () => {}}
28
+ */
29
+ const _isValidListener = function (
30
+ listener: TListener | TListenerMetaData,
31
+ ): boolean {
32
+ if (typeof listener === 'function') {
33
+ return true;
34
+ } else if (listener && typeof listener === 'object') {
35
+ // If listener is passed with additional meta data (addOnceListener API below), it will be of type object
36
+ return _isValidListener(listener.listener);
37
+ } else {
38
+ return false;
39
+ }
40
+ };
41
+
42
+ /**
43
+ * Returns the listener array for the specified event.
44
+ * Will initialise the event object and listener arrays if required.
45
+ * Each property in the object response is an array of listener functions.
46
+ *
47
+ * @param {String} evt Name of the event to return the listeners from.
48
+ * @param {String} source Name of the bucket to search events from
49
+ * @return {Function[]} All listener functions for the event with meta data.
50
+ * @api private
51
+ * @example : [] (or) [{once: false, listener: f}, {once: false, listener: f}...so on and so forth]
52
+ */
53
+ const _getListeners = function (
54
+ evt: string,
55
+ source: EventSourceEnum,
56
+ ): TListenerMetaData[] | [] {
57
+ let response: TListenerMetaData[] | [];
58
+ if (_events.hasOwnProperty(source)) {
59
+ if (_events[source].get(evt)) {
60
+ response = _events[source].get(evt);
61
+ } else {
62
+ _events[source].set(evt, []);
63
+ response = _events[source].get(evt);
64
+ }
65
+ } else {
66
+ _events[source] = new Map();
67
+ _events[source].set(evt, []);
68
+ response = _events[source].get(evt);
69
+ }
70
+ return response;
71
+ };
72
+
73
+ /**
74
+ * Fetches the requested listeners via getListeners but will always return the results inside an object.
75
+ * This is mainly for internal use but others may find it useful.
76
+ *
77
+ * @param {String} evt Name of the event to return the listeners from.
78
+ * @param {EventSourceEnum} source Name of the bucket to search events from
79
+ * @return {Object} All listener functions for an event in an object.
80
+ * @api private
81
+ * @example : {evt-name: [{once: false, listener: f}, {once: false, listener: f}...so on and so forth]
82
+ */
83
+ const _getListenersAsObject = function (
84
+ evt: string,
85
+ source: EventSourceEnum,
86
+ ): object {
87
+ const listeners = _getListeners(evt, source);
88
+ let response: any;
89
+
90
+ if (listeners instanceof Array) {
91
+ response = {};
92
+ response[evt] = listeners;
93
+ }
94
+
95
+ return response || listeners;
96
+ };
97
+
98
+ /**
99
+ * Finds the index of the listener for the event in its storage array.
100
+ *
101
+ * @param {Function[]} listeners Array of listeners to search through.
102
+ * @param {Function} listener Method to look for.
103
+ * @return {Number} Index of the specified listener, -1 if not found
104
+ * @api private
105
+ */
106
+ const _indexOfListener = function (listeners: any, listener: any): number {
107
+ var i = listeners.length;
108
+ while (i--) {
109
+ if (listeners[i].listener.toString() === listener.toString()) {
110
+ return i;
111
+ }
112
+ }
113
+ return -1;
114
+ };
115
+
116
+ return {
117
+ getEvents(source: EventSourceEnum): TEvents | {} {
118
+ return _events[source] || (_events[source] = new Map());
119
+ },
120
+ /**
121
+ * Adds a listener function to the specified event.
122
+ * The listener will not be added if it is a duplicate.
123
+ *
124
+ * @param {String} evt Name of the event to attach the listener to.
125
+ * @param {Function} listener Method to be called when the event is emitted.
126
+ * @param {EventSourceEnum} source Name of the bucket to search events from
127
+ * @return {Object} Current instance of EventUtils
128
+ */
129
+ addListener(evt: string, listener: any, source: EventSourceEnum): object {
130
+ if (!_isValidListener(listener)) {
131
+ throw new Error('Listener must be a function');
132
+ }
133
+ const listeners = _getListenersAsObject(evt, source);
134
+ const listenerIsWrapped = typeof listener === 'object';
135
+
136
+ for (let key in listeners) {
137
+ if (
138
+ listeners.hasOwnProperty(key) &&
139
+ _indexOfListener(listeners[key], listener) === -1
140
+ ) {
141
+ listeners[key].push(
142
+ listenerIsWrapped
143
+ ? listener
144
+ : {
145
+ listener: listener,
146
+ once: false,
147
+ },
148
+ );
149
+ }
150
+ }
151
+ return this;
152
+ },
153
+
154
+ /**
155
+ * Removes a listener function from the specified event.
156
+ *
157
+ * @param {String} evt Name of the event to remove the listener from.
158
+ * @param {Function} listenerToRemove Method to remove from the event.
159
+ * @param {EventSourceEnum} source Name of the bucket to search events from
160
+ * @return {Object} Current instance of EventUtils for chaining.
161
+ */
162
+ removeListener(
163
+ evt: string,
164
+ listenerToRemove: TListener,
165
+ source: EventSourceEnum,
166
+ ): Object {
167
+ let listeners = _getListenersAsObject(evt, source);
168
+ for (let key in listeners) {
169
+ if (listeners.hasOwnProperty(key)) {
170
+ let index = _indexOfListener(listeners[key], listenerToRemove);
171
+ if (index !== -1) {
172
+ listeners[key].splice(index, 1);
173
+ }
174
+ }
175
+ }
176
+ return this;
177
+ },
178
+
179
+ /**
180
+ * Removes all listeners from a specified event.
181
+ * If you do not specify an event then all listeners will be removed.
182
+ * That means every event will be emptied.
183
+ *
184
+ * @param {String} [evt] Optional name of the event to remove all listeners for. Will remove from every event if not passed.
185
+ * @param {EventSourceEnum} source Name of the bucket to search events from
186
+ * @return {Object} Current instance of EventUtils
187
+ */
188
+ removeAllListeners(evt: string, source: EventSourceEnum): object {
189
+ let type = typeof evt;
190
+ let events = this.getEvents(source);
191
+ if (type === 'string') {
192
+ if (events.has(evt)) {
193
+ events.delete(evt);
194
+ }
195
+ }
196
+ return this;
197
+ },
198
+
199
+ /**
200
+ * Removes all events and resets the state.
201
+ * That means every event will be emptied.
202
+ *
203
+ * @param {source} source source Name of the bucket to search events from
204
+ * @return {Object} Current instance of EventUtils
205
+ */
206
+ removeAll(source: EventSourceEnum): object {
207
+ _events[source] = new Map();
208
+ return this;
209
+ },
210
+
211
+ /**
212
+ * Emits an event of your choice.
213
+ * When emitted, every listener attached to that event will be executed.
214
+ * If you pass the optional argument array then those arguments will be passed to every listener upon execution.
215
+ * Because it uses `apply`, your array of arguments will be passed as if you wrote them out separately.
216
+ * So they will not arrive within the array on the other side, they will be separate.
217
+ *
218
+ * @param {String} evt Name of the event to emit and execute listeners for.
219
+ * @param {Array} [args] Optional array of arguments to be passed to each listener.
220
+ * @return {Object} Current instance of EventUtils
221
+ */
222
+ emitEvent(evt: string, args: any): object {
223
+ let listenersMap = _getListenersAsObject(
224
+ evt,
225
+ args.payload.source || EventSourceEnum.core,
226
+ );
227
+ let listeners: TListenerMetaData[];
228
+ let listener: TListenerMetaData;
229
+ for (let key in listenersMap) {
230
+ if (listenersMap.hasOwnProperty(key)) {
231
+ listeners = listenersMap[key].slice(0);
232
+ for (let i = 0; i < listeners.length; i++) {
233
+ // If the listener returns true then it shall be removed from the event
234
+ // The function is executed either with a basic call or an apply if there is an args array
235
+ listener = listeners[i];
236
+
237
+ if (listener.once === true) {
238
+ this.removeListener(evt, args.payload.source, listener.listener);
239
+ }
240
+
241
+ const newargs = [].slice.call(arguments, 1);
242
+ listener.listener.apply(this, newargs || []);
243
+ }
244
+ }
245
+ }
246
+ return this;
247
+ },
248
+ // 1. To add multiple listeners
249
+ // addListeners(evt: string, listeners: any) {
250
+ // if (Array.isArray(listeners)) {
251
+ // let i = listeners.length;
252
+ // while (i--) {
253
+ // this.addListener.call(this, evt, listeners[i]);
254
+ // }
255
+ // }
256
+ // },
257
+ // 2. To add only once listener
258
+ // addOnceListener(evt: string, listener: TListener) {
259
+ // return this.addListener(evt, {
260
+ // listener: listener,
261
+ // once: true,
262
+ // });
263
+ // },
264
+ };
265
+ })();
266
+
267
+ export default EventUtils;
@@ -0,0 +1,38 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2022 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
+
13
+ interface IQueueEvent {
14
+ data: any;
15
+ uid: number | string;
16
+ ts: number;
17
+ }
18
+
19
+ const EventsQueue = (function () {
20
+ 'use strict';
21
+
22
+ let _eventsQueue: any = [];
23
+
24
+ return {
25
+ enqueue(q: IQueueEvent) {
26
+ _eventsQueue.push(q);
27
+ },
28
+ dequeue() {
29
+ if (_eventsQueue.length == 0) return;
30
+ _eventsQueue.shift();
31
+ },
32
+ printQueue() {
33
+ return _eventsQueue;
34
+ },
35
+ };
36
+ })();
37
+
38
+ export default EventsQueue;
@@ -0,0 +1,42 @@
1
+ /** ***** EVENTS ACTIONS BEGINS***** */
2
+ // 1. RECORDING
3
+ const RECORDING_STARTED = 'RECORDING_STARTED';
4
+ const RECORDING_STOPPED = 'RECORDING_STOPPED';
5
+ // 2. SCREENSHARE
6
+ const SCREENSHARE_STARTED = 'SCREENSHARE_STARTED';
7
+ const SCREENSHARE_STOPPED = 'SCREENSHARE_STOPPED';
8
+
9
+ const EventActions = {
10
+ RECORDING_STARTED,
11
+ RECORDING_STOPPED,
12
+ SCREENSHARE_STARTED,
13
+ SCREENSHARE_STOPPED,
14
+ };
15
+
16
+ /** ***** EVENTS ACTIONS ENDS ***** */
17
+
18
+ /** ***** EVENT NAMES BEGINS ***** */
19
+ // 1. RECORDING
20
+ const RECORDING_ATTRIBUTE = 'recording';
21
+ // 2. SCREENSHARE
22
+ const SCREENSHARE_ATTRIBUTE = 'screenshare';
23
+ // 2. LIVE STREAMING
24
+ const RAISED_ATTRIBUTE = 'raised';
25
+ const ROLE_ATTRIBUTE = 'role';
26
+ // 3. CHAT MESSAGES
27
+ const PUBLIC_CHAT_MESSAGE = 'PUBLIC_CHAT_MESSAGE';
28
+ const PRIVATE_CHAT_MESSAGE = 'PRIVATE_CHAT_MESSAGE';
29
+ // 4. NAME ATTRIBUTE
30
+ const NAME_ATTRIBUTE = 'name';
31
+ const EventNames = {
32
+ RECORDING_ATTRIBUTE,
33
+ RAISED_ATTRIBUTE,
34
+ ROLE_ATTRIBUTE,
35
+ PUBLIC_CHAT_MESSAGE,
36
+ PRIVATE_CHAT_MESSAGE,
37
+ SCREENSHARE_ATTRIBUTE,
38
+ NAME_ATTRIBUTE,
39
+ };
40
+ /** ***** EVENT NAMES ENDS ***** */
41
+
42
+ export {EventActions, EventNames};
@@ -0,0 +1,8 @@
1
+ import EventUtils from './EventUtils';
2
+ import EventsQueue from './EventsQueue';
3
+
4
+ export * from './constants';
5
+
6
+ import {eventMessageType} from './types';
7
+
8
+ export {EventUtils, EventsQueue, eventMessageType};
@@ -0,0 +1,7 @@
1
+ export enum eventMessageType {
2
+ CONTROL_GROUP = 1,
3
+ CONTROL_PRIVATE,
4
+ NORMAL_GROUP,
5
+ NORMAL_PRIVATE,
6
+ CUSTOM_EVENT,
7
+ }
@@ -10,31 +10,40 @@
10
10
  *********************************************
11
11
  */
12
12
  import React, {useContext} from 'react';
13
- import {View, Text, StyleSheet, Linking, Platform} from 'react-native';
13
+ import {View, Text, StyleSheet, Linking} from 'react-native';
14
14
  import Hyperlink from 'react-native-hyperlink';
15
- import ChatContext, {channelMessage} from '../components/ChatContext';
15
+ import {useString} from '../utils/useString';
16
+ import {ChatBubbleProps} from '../components/ChatContext';
16
17
  import ColorContext from '../components/ColorContext';
18
+ import {isWeb} from '../utils/common';
19
+ import useUserList from '../utils/useUserList';
17
20
 
18
- const ChatBubble = (props: channelMessage) => {
19
- const {userList} = useContext(ChatContext);
21
+ const ChatBubble = (props: ChatBubbleProps) => {
22
+ const {renderList} = useUserList();
20
23
  const {primaryColor} = useContext(ColorContext);
21
- let {isLocal, msg, ts, uid} = props;
24
+ let {isLocal, message, timestamp, uid} = props;
22
25
  let time =
23
- new Date(parseInt(ts)).getHours() +
26
+ new Date(parseInt(timestamp)).getHours() +
24
27
  ':' +
25
- new Date(parseInt(ts)).getMinutes();
28
+ new Date(parseInt(timestamp)).getMinutes();
26
29
  const handleUrl = (url: string) => {
27
- if (Platform.OS === 'web') {
30
+ if (isWeb) {
28
31
  window.open(url, '_blank');
29
32
  } else {
30
33
  Linking.openURL(url);
31
34
  }
32
35
  };
33
- return (
36
+ //commented for v1 release
37
+ //const remoteUserDefaultLabel = useString('remoteUserDefaultLabel')();
38
+ const remoteUserDefaultLabel = 'User';
39
+ return props?.render ? (
40
+ props.render(isLocal, message, timestamp, uid)
41
+ ) : (
34
42
  <View>
35
43
  <View style={isLocal ? style.chatSenderViewLocal : style.chatSenderView}>
36
44
  <Text style={isLocal ? style.timestampTextLocal : style.timestampText}>
37
- {userList[uid] ? userList[uid].name : 'User'} | {time + ' '}
45
+ {renderList[uid] ? renderList[uid].name : remoteUserDefaultLabel} |{' '}
46
+ {time + ' '}
38
47
  </Text>
39
48
  </View>
40
49
  <View
@@ -54,7 +63,7 @@ const ChatBubble = (props: channelMessage) => {
54
63
  <Text
55
64
  style={isLocal ? style.whiteText : style.blackText}
56
65
  selectable={true}>
57
- {msg.slice(1) + ' '}
66
+ {message}
58
67
  </Text>
59
68
  </Hyperlink>
60
69
  </View>
@@ -86,7 +95,7 @@ const style = StyleSheet.create({
86
95
  fontWeight: '500',
87
96
  fontSize: 12,
88
97
  flex: 1,
89
- // textAlign: 'right',
98
+ textAlign: 'left',
90
99
  },
91
100
  timestampTextLocal: {
92
101
  color: $config.PRIMARY_FONT_COLOR + '60',
@@ -9,21 +9,29 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React, {useContext, useRef} from 'react';
12
+ import React, {useRef} from 'react';
13
13
  import {
14
14
  View,
15
15
  ScrollView,
16
16
  StyleSheet,
17
- TouchableOpacity,
18
17
  Platform,
19
18
  Text,
20
19
  useWindowDimensions,
20
+ TouchableOpacity,
21
21
  } from 'react-native';
22
22
  import {RFValue} from 'react-native-responsive-fontsize';
23
23
  import ChatBubble from './ChatBubble';
24
- import ChatContext from '../components/ChatContext';
24
+ import {ChatBubbleProps} from '../components/ChatContext';
25
+ import {useLocalUid} from '../../agora-rn-uikit';
25
26
  import {ImageIcon} from '../../agora-rn-uikit';
26
27
  import TextWithTooltip from './TextWithTooltip';
28
+ import {useFpe} from 'fpe-api';
29
+ import {isValidReactComponent, isWeb} from '../utils/common';
30
+ import {useString} from '../utils/useString';
31
+ import {useChatUIControl} from '../components/chat-ui/useChatUIControl';
32
+ import useUserList from '../utils/useUserList';
33
+ import useGroupMessages from '../utils/useGroupMessages';
34
+ import usePrivateMessages from '../utils/usePrivateMessages';
27
35
 
28
36
  /**
29
37
  * Chat container is the component which renders all the chat messages
@@ -31,14 +39,53 @@ import TextWithTooltip from './TextWithTooltip';
31
39
  * and maps it to a ChatBubble
32
40
  */
33
41
  const ChatContainer = (props: any) => {
34
- const {userList} = useContext(ChatContext);
42
+ const {renderList} = useUserList();
43
+ const messageStore = useGroupMessages();
44
+ const getPrivateMessage = usePrivateMessages();
45
+ const privateMessageStore = getPrivateMessage();
35
46
  const {height, width} = useWindowDimensions();
36
- const {selectedUserID, privateActive, setPrivateActive, selectedUsername} =
37
- props;
38
- const {messageStore, localUid, privateMessageStore} = useContext(ChatContext);
39
-
47
+ const {selectPrivate} = props;
48
+ const {
49
+ privateActive,
50
+ selectedChatUserId: selectedUserID,
51
+ setPrivateActive,
52
+ } = useChatUIControl();
53
+ const localUid = useLocalUid();
54
+ //commented for v1 release
55
+ //const remoteUserDefaultLabel = useString('remoteUserDefaultLabel')();
56
+ const remoteUserDefaultLabel = 'User';
40
57
  const scrollViewRef = useRef<ScrollView>(null);
41
58
 
59
+ const {ChatBubbleComponent} = useFpe((data) => {
60
+ let components: {
61
+ ChatBubbleComponent: React.ComponentType<ChatBubbleProps>;
62
+ } = {
63
+ ChatBubbleComponent: ChatBubble,
64
+ };
65
+ if (
66
+ data?.components?.videoCall &&
67
+ typeof data?.components?.videoCall === 'object'
68
+ ) {
69
+ //commented for v1 release
70
+ if (
71
+ data?.components?.videoCall?.chat &&
72
+ typeof data?.components?.videoCall?.chat === 'object'
73
+ ) {
74
+ if (
75
+ data?.components?.videoCall?.chat?.chatBubble &&
76
+ typeof data?.components?.videoCall?.chat?.chatBubble !== 'object' &&
77
+ isValidReactComponent(data?.components?.videoCall?.chat?.chatBubble)
78
+ ) {
79
+ components.ChatBubbleComponent =
80
+ data?.components?.videoCall?.chat?.chatBubble;
81
+ }
82
+ }
83
+ }
84
+ return components;
85
+ });
86
+ //commented for v1 release
87
+ //const userOfflineLabel = useString('userOfflineLabel')();
88
+ const userOfflineLabel = 'User is offline';
42
89
  return (
43
90
  <View style={style.containerView}>
44
91
  {privateActive && (
@@ -57,7 +104,11 @@ const ChatContainer = (props: any) => {
57
104
  fontSize: RFValue(16, height > width ? height : width),
58
105
  },
59
106
  ]}
60
- value={selectedUsername}
107
+ value={
108
+ renderList[selectedUserID]
109
+ ? renderList[selectedUserID]?.name + ' '
110
+ : remoteUserDefaultLabel + ' '
111
+ }
61
112
  />
62
113
  </View>
63
114
  </TouchableOpacity>
@@ -68,35 +119,33 @@ const ChatContainer = (props: any) => {
68
119
  scrollViewRef.current?.scrollToEnd({animated: true});
69
120
  }}>
70
121
  {!privateActive ? (
71
- messageStore.map((message: any) => {
72
- return (
73
- <ChatBubble
122
+ messageStore.map((message: any) => (
123
+ <>
124
+ <ChatBubbleComponent
74
125
  isLocal={localUid === message.uid}
75
- msg={message.msg}
76
- ts={message.ts}
126
+ message={message.msg}
127
+ timestamp={message.ts}
77
128
  uid={message.uid}
78
129
  key={message.ts}
79
130
  />
80
- );
81
- })
131
+ </>
132
+ ))
82
133
  ) : privateMessageStore[selectedUserID] ? (
83
- privateMessageStore[selectedUserID].map((message: any) => {
84
- return (
85
- <ChatBubble
86
- isLocal={localUid === message.uid}
87
- msg={message.msg}
88
- ts={message.ts}
89
- uid={message.uid}
90
- key={message.ts}
91
- />
92
- );
93
- })
134
+ privateMessageStore[selectedUserID].map((message: any) => (
135
+ <ChatBubbleComponent
136
+ isLocal={localUid === message.uid}
137
+ message={message.msg}
138
+ timestamp={message.ts}
139
+ uid={message.uid}
140
+ key={message.ts}
141
+ />
142
+ ))
94
143
  ) : (
95
144
  <></>
96
145
  )}
97
- {userList[selectedUserID]?.offline && (
146
+ {renderList[selectedUserID]?.offline && (
98
147
  <View style={style.infoTextView}>
99
- <Text style={style.infoText}>User is offline</Text>
148
+ <Text style={style.infoText}>{userOfflineLabel}</Text>
100
149
  </View>
101
150
  )}
102
151
  </ScrollView>
@@ -126,7 +175,7 @@ const style = StyleSheet.create({
126
175
  alignSelf: 'flex-end',
127
176
  },
128
177
  name: {
129
- fontWeight: Platform.OS === 'web' ? '500' : '700',
178
+ fontWeight: isWeb ? '500' : '700',
130
179
  color: $config.PRIMARY_FONT_COLOR,
131
180
  textAlign: 'left',
132
181
  marginRight: 10,