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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/Readme.md +7 -1
  2. package/package.json +4 -3
  3. package/template/Gulpfile.js +306 -87
  4. package/template/_gitignore +4 -1
  5. package/template/_package-lock.json +2297 -2533
  6. package/template/agora-rn-uikit/.git/HEAD +1 -1
  7. package/template/agora-rn-uikit/.git/config +3 -3
  8. package/template/agora-rn-uikit/.git/index +0 -0
  9. package/template/agora-rn-uikit/.git/logs/HEAD +2 -2
  10. package/template/agora-rn-uikit/.git/logs/refs/heads/master +1 -1
  11. package/template/agora-rn-uikit/.git/logs/refs/heads/release/fpe-1.0.0 +1 -0
  12. package/template/agora-rn-uikit/.git/logs/refs/remotes/origin/HEAD +1 -1
  13. package/template/agora-rn-uikit/.git/objects/pack/pack-f274a85fccfc9b5112d154bb3b6d34cb4b8dedde.idx +0 -0
  14. package/template/agora-rn-uikit/.git/objects/pack/{pack-0061d00cd98162a329a32b537488a35d0abeb069.pack → pack-f274a85fccfc9b5112d154bb3b6d34cb4b8dedde.pack} +0 -0
  15. package/template/agora-rn-uikit/.git/packed-refs +5 -1
  16. package/template/agora-rn-uikit/.git/refs/heads/release/fpe-1.0.0 +1 -0
  17. package/template/agora-rn-uikit/src/AgoraUIKit.tsx +23 -20
  18. package/template/agora-rn-uikit/src/Contexts/LocalUserContext.tsx +13 -8
  19. package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +25 -9
  20. package/template/agora-rn-uikit/src/Contexts/RenderContext.tsx +10 -0
  21. package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +11 -5
  22. package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +6 -2
  23. package/template/agora-rn-uikit/src/Controls/ImageIcon.tsx +1 -1
  24. package/template/agora-rn-uikit/src/Controls/Local/EndCall.tsx +6 -2
  25. package/template/agora-rn-uikit/src/Controls/Local/LocalAudioMute.tsx +2 -2
  26. package/template/agora-rn-uikit/src/Controls/Local/LocalVideoMute.tsx +2 -2
  27. package/template/agora-rn-uikit/src/Controls/Local/SwitchCamera.tsx +6 -2
  28. package/template/agora-rn-uikit/src/Controls/LocalControls.tsx +11 -6
  29. package/template/agora-rn-uikit/src/Controls/Remote/RemoteAudioMute.tsx +10 -6
  30. package/template/agora-rn-uikit/src/Controls/Remote/RemoteSwap.tsx +7 -6
  31. package/template/agora-rn-uikit/src/Controls/Remote/RemoteVideoMute.tsx +6 -5
  32. package/template/agora-rn-uikit/src/Controls/RemoteControls.tsx +3 -3
  33. package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +16 -13
  34. package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +16 -13
  35. package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +13 -13
  36. package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +16 -13
  37. package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +28 -31
  38. package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +48 -35
  39. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +11 -13
  40. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +11 -13
  41. package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +18 -15
  42. package/template/agora-rn-uikit/src/Rtc/Create.tsx +14 -2
  43. package/template/agora-rn-uikit/src/Rtc/Join.tsx +19 -3
  44. package/template/agora-rn-uikit/src/RtcConfigure.tsx +161 -44
  45. package/template/agora-rn-uikit/src/Utils/useLocalUid.ts +8 -0
  46. package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +8 -6
  47. package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +8 -6
  48. package/template/agora-rn-uikit/src/Views/MinVideoView.tsx +18 -9
  49. package/template/agora-rn-uikit/src/index.ts +12 -12
  50. package/template/babel.config.js +17 -1
  51. package/template/bridge/rtc/webNg/RtcEngine.ts +34 -28
  52. package/template/bridge/rtc/webNg/SurfaceView.tsx +3 -2
  53. package/template/bridge/rtc/webNg/Types.ts +14 -0
  54. package/template/bridge/rtc/webNg/index.ts +5 -2
  55. package/template/bridge/rtm/web/index.ts +13 -7
  56. package/template/electron-builder.js +3 -2
  57. package/template/esbuild.rsdk.go +226 -0
  58. package/template/{src/subComponents/LayoutEnum.tsx → esbuildConfigTransform.js} +1 -5
  59. package/template/fpe-api/components.ts +42 -0
  60. package/template/fpe-api/context.ts +45 -0
  61. package/template/fpe-api/fpeEvents.ts +9 -0
  62. package/template/fpe-api/index.ts +21 -0
  63. package/template/fpe-api/install.ts +128 -0
  64. package/template/fpe-api/typeDefinition.ts +143 -0
  65. package/template/fpe-api/useFpe.tsx +35 -0
  66. package/template/fpe-api/utils.ts +62 -0
  67. package/template/fpe-implementation/createHook.ts +33 -0
  68. package/template/fpe-implementation/dummyFpe.ts +17 -0
  69. package/template/fpe-implementation/index.ts +1 -0
  70. package/template/fpe-todo.txt +14 -0
  71. package/template/fpe.config.js +25 -0
  72. package/template/global.d.ts +4 -0
  73. package/template/index.rsdk.tsx +27 -0
  74. package/template/index.wsdk.tsx +27 -0
  75. package/template/package-lock.json +2297 -2533
  76. package/template/package.json +28 -12
  77. package/template/react-native-toast-message/src/index.js +9 -10
  78. package/template/react-native-toast-message/src/index.wsdk.js +419 -0
  79. package/template/src/App.tsx +97 -65
  80. package/template/src/AppWrapper.tsx +79 -0
  81. package/template/src/SDKAppWrapper.tsx +67 -0
  82. package/template/src/atoms/PrimaryButton.tsx +14 -8
  83. package/template/src/atoms/TextInput.tsx +13 -5
  84. package/template/src/components/Chat.tsx +171 -139
  85. package/template/src/components/ChatContext.ts +14 -22
  86. package/template/src/components/ColorConfigure.tsx +2 -2
  87. package/template/src/components/Controls.native.tsx +72 -62
  88. package/template/src/components/Controls.tsx +90 -69
  89. package/template/src/components/DeviceConfigure.tsx +1 -1
  90. package/template/src/components/DeviceContext.tsx +14 -7
  91. package/template/src/components/GraphQLProvider.tsx +9 -2
  92. package/template/src/components/GridVideo.tsx +20 -159
  93. package/template/src/components/HostControlView.tsx +54 -15
  94. package/template/src/components/Navbar.tsx +408 -157
  95. package/template/src/components/NetworkQualityContext.tsx +29 -22
  96. package/template/src/components/ParticipantsView.tsx +97 -119
  97. package/template/src/components/PinnedVideo.tsx +41 -188
  98. package/template/src/components/Precall.native.tsx +131 -97
  99. package/template/src/components/Precall.tsx +193 -158
  100. package/template/src/components/RTMConfigure.tsx +320 -398
  101. package/template/src/components/Router.sdk.ts +20 -0
  102. package/template/src/components/SessionContext.tsx +6 -3
  103. package/template/src/components/Settings.native.tsx +3 -0
  104. package/template/src/components/Settings.tsx +65 -31
  105. package/template/src/components/SettingsView.tsx +14 -8
  106. package/template/src/components/Share.tsx +188 -220
  107. package/template/src/components/StorageContext.tsx +5 -5
  108. package/template/src/components/StoreToken.tsx +5 -1
  109. package/template/src/components/chat-messages/useChatMessages.tsx +202 -0
  110. package/template/src/components/chat-notification/useChatNotification.tsx +78 -0
  111. package/template/src/components/chat-ui/useChatUIControl.tsx +66 -0
  112. package/template/src/components/common/Error.tsx +54 -0
  113. package/template/src/components/common/Logo.tsx +35 -0
  114. package/template/src/components/common/index.tsx +8 -0
  115. package/template/src/components/contexts/LiveStreamDataContext.tsx +79 -0
  116. package/template/src/components/contexts/ScreenShareContext.tsx +47 -0
  117. package/template/src/components/contexts/WhiteboardContext.tsx +59 -0
  118. package/template/src/components/dimension/DimensionContext.ts +27 -0
  119. package/template/src/components/dimension/DimensionProvider.tsx +34 -0
  120. package/template/src/components/livestream/LiveStreamContext.tsx +293 -272
  121. package/template/src/components/livestream/Types.ts +26 -7
  122. package/template/src/components/livestream/index.ts +13 -2
  123. package/template/src/components/livestream/views/LiveStreamControls.tsx +5 -1
  124. package/template/src/components/meeting-info/useMeetingInfo.tsx +63 -0
  125. package/template/src/components/meeting-info/useSetMeetingInfo.tsx +38 -0
  126. package/template/src/components/participants/AllAudienceParticipants.tsx +26 -21
  127. package/template/src/components/participants/AllHostParticipants.tsx +36 -53
  128. package/template/src/components/participants/MeParticipant.tsx +9 -10
  129. package/template/src/components/participants/ParticipantName.tsx +2 -1
  130. package/template/src/components/participants/RemoteParticipants.tsx +3 -3
  131. package/template/src/components/precall/LocalMute.native.tsx +91 -0
  132. package/template/src/components/precall/LocalMute.tsx +90 -0
  133. package/template/src/components/precall/VideoPreview.native.tsx +35 -0
  134. package/template/src/components/precall/VideoPreview.tsx +33 -0
  135. package/template/src/components/precall/index.tsx +28 -0
  136. package/template/src/components/precall/joinCallBtn.native.tsx +69 -0
  137. package/template/src/components/precall/joinCallBtn.tsx +91 -0
  138. package/template/src/components/precall/meetingTitle.tsx +26 -0
  139. package/template/src/components/precall/selectDevice.tsx +46 -0
  140. package/template/src/components/precall/textInput.tsx +43 -0
  141. package/template/src/components/precall/usePreCall.tsx +41 -0
  142. package/template/src/components/styles.ts +20 -3
  143. package/template/src/components/useShareLink.tsx +222 -0
  144. package/template/src/components/useWakeLock.tsx +3 -3
  145. package/template/src/custom-events/CustomEvents.ts +197 -0
  146. package/template/src/custom-events/index.tsx +4 -0
  147. package/template/src/custom-events/types.ts +51 -0
  148. package/template/src/language/default-labels/commonLabels.ts +21 -0
  149. package/template/src/language/default-labels/createScreenLabels.ts +22 -0
  150. package/template/src/language/default-labels/index.ts +38 -0
  151. package/template/src/language/default-labels/joinScreenLabels.ts +13 -0
  152. package/template/src/language/default-labels/precallScreenLabels.ts +33 -0
  153. package/template/src/language/default-labels/shareLinkScreenLabels.ts +44 -0
  154. package/template/src/language/default-labels/videoCallScreenLabels.ts +189 -0
  155. package/template/src/language/i18nTypes.ts +10 -0
  156. package/template/src/language/index.ts +18 -0
  157. package/template/src/language/useLanguage.tsx +92 -0
  158. package/template/src/pages/Authenticate.tsx +21 -15
  159. package/template/src/pages/Create.tsx +176 -159
  160. package/template/src/pages/Join.tsx +44 -32
  161. package/template/src/pages/VideoCall.tsx +134 -406
  162. package/template/src/pages/create/useCreate.tsx +37 -0
  163. package/template/src/pages/video-call/CustomLayout.ts +17 -0
  164. package/template/src/pages/video-call/CustomUserContextHolder.tsx +12 -0
  165. package/template/src/pages/video-call/DefaultLayouts.ts +65 -0
  166. package/template/src/pages/video-call/NameWithMicStatus.tsx +62 -0
  167. package/template/src/pages/video-call/RenderComponent.tsx +52 -0
  168. package/template/src/pages/video-call/VideoCallScreen.tsx +191 -0
  169. package/template/src/pages/video-call/VideoComponent.tsx +34 -0
  170. package/template/src/pages/video-call/VideoRenderer.tsx +86 -0
  171. package/template/src/pages/video-call/index.ts +20 -0
  172. package/template/src/rtm/RTMEngine.ts +58 -0
  173. package/template/src/rtm/utils.ts +28 -0
  174. package/template/src/rtm-events/EventUtils.ts +268 -0
  175. package/template/src/rtm-events/EventsQueue.ts +38 -0
  176. package/template/src/rtm-events/constants.ts +40 -0
  177. package/template/src/rtm-events/index.tsx +8 -0
  178. package/template/src/rtm-events/types.ts +7 -0
  179. package/template/src/subComponents/ChatBubble.tsx +18 -11
  180. package/template/src/subComponents/ChatContainer.tsx +78 -29
  181. package/template/src/subComponents/ChatInput.tsx +146 -70
  182. package/template/src/subComponents/CopyJoinInfo.tsx +52 -67
  183. package/template/src/subComponents/Error.tsx +35 -24
  184. package/template/src/subComponents/LanguageSelector.tsx +85 -0
  185. package/template/src/subComponents/LayoutIconDropdown.native.tsx +163 -0
  186. package/template/src/subComponents/LayoutIconDropdown.tsx +198 -0
  187. package/template/src/subComponents/LocalAudioMute.tsx +52 -30
  188. package/template/src/subComponents/LocalEndCall.tsx +52 -0
  189. package/template/src/subComponents/LocalSwitchCamera.tsx +61 -0
  190. package/template/src/subComponents/LocalVideoMute.tsx +48 -30
  191. package/template/src/subComponents/LogoutButton.tsx +20 -5
  192. package/template/src/subComponents/NetworkQualityPill.tsx +43 -13
  193. package/template/src/subComponents/OpenInNativeButton.tsx +3 -2
  194. package/template/src/subComponents/Recording.tsx +46 -138
  195. package/template/src/subComponents/RemoteAudioMute.tsx +30 -34
  196. package/template/src/subComponents/RemoteEndCall.tsx +18 -7
  197. package/template/src/subComponents/RemoteVideoMute.tsx +17 -9
  198. package/template/src/subComponents/ScreenShareNotice.tsx +40 -40
  199. package/template/src/subComponents/SelectDevice.tsx +88 -45
  200. package/template/src/subComponents/SelectOAuth.tsx +30 -6
  201. package/template/src/subComponents/SidePanelButtons.ts +39 -0
  202. package/template/src/subComponents/TextWithTooltip.native.tsx +2 -1
  203. package/template/src/subComponents/TextWithTooltip.tsx +15 -20
  204. package/template/src/subComponents/chat/ChatParticipants.tsx +31 -32
  205. package/template/src/subComponents/livestream/ApprovedLiveStreamControlsView.tsx +7 -3
  206. package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +32 -18
  207. package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +22 -8
  208. package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +12 -7
  209. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +24 -27
  210. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +23 -26
  211. package/template/src/subComponents/livestream/index.ts +10 -2
  212. package/template/src/subComponents/recording/useRecording.tsx +209 -0
  213. package/template/src/subComponents/recording/useRecordingLayoutQuery.tsx +64 -0
  214. package/template/src/subComponents/screenshare/ScreenshareButton.native.tsx +18 -0
  215. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +59 -31
  216. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +57 -52
  217. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +97 -138
  218. package/template/src/subComponents/screenshare/useScreenshare.tsx +29 -0
  219. package/template/src/subComponents/toastConfig.tsx +25 -20
  220. package/template/src/utils/IsAttendeeUser.ts +34 -0
  221. package/template/src/utils/SdkEvents.ts +68 -0
  222. package/template/src/utils/common.tsx +40 -0
  223. package/template/src/utils/eventEmitter.ts +29 -0
  224. package/template/src/utils/getMeetingInvite.ts +30 -0
  225. package/template/src/utils/index.tsx +11 -2
  226. package/template/src/utils/isAudioEnabled.ts +29 -0
  227. package/template/src/utils/isHostUser.ts +33 -0
  228. package/template/src/utils/isMobileOrTablet.native.ts +5 -0
  229. package/template/src/utils/{mobileWebTest.tsx → isMobileOrTablet.ts} +5 -2
  230. package/template/src/utils/isPSTNUser.ts +30 -0
  231. package/template/src/utils/isSDK.sdk.ts +5 -0
  232. package/template/src/utils/isSDK.ts +5 -0
  233. package/template/src/utils/isScreenShareUser.ts +31 -0
  234. package/template/src/utils/isVideoEnabled.ts +29 -0
  235. package/template/src/utils/useButtonTemplate.tsx +43 -0
  236. package/template/src/utils/useCreateMeeting.ts +74 -0
  237. package/template/src/utils/useGetLiveStreamingRequests.ts +24 -0
  238. package/template/src/utils/useGetMeetingPhrase.ts +68 -0
  239. package/template/src/utils/useGetName.ts +20 -0
  240. package/template/src/{subComponents/screenshare/ScreenshareContext.tsx → utils/useGroupMessages.ts} +10 -7
  241. package/template/src/utils/useJoinMeeting.ts +120 -0
  242. package/template/src/utils/useLayout.tsx +40 -0
  243. package/template/src/utils/useLiveStreamingUids.ts +26 -0
  244. package/template/src/utils/useMutePSTN.ts +43 -0
  245. package/template/src/utils/useMuteToggleLocal.ts +109 -0
  246. package/template/src/utils/useNavParams.ts +6 -0
  247. package/template/src/utils/useNavigateTo.ts +8 -0
  248. package/template/src/utils/usePrivateMessages.ts +33 -0
  249. package/template/src/utils/useRemoteEndCall.ts +27 -0
  250. package/template/src/utils/useRemoteMute.ts +64 -0
  251. package/template/src/utils/useSendControlMessage.ts +51 -0
  252. package/template/src/utils/useSendMessage.ts +40 -0
  253. package/template/src/utils/useSetName.ts +20 -0
  254. package/template/src/utils/useSetUnreadMessageCount.ts +43 -0
  255. package/template/src/utils/useSidePanel.tsx +41 -0
  256. package/template/src/utils/useString.ts +61 -0
  257. package/template/src/utils/useUnreadMessageCount.ts +50 -0
  258. package/template/src/utils/useUserList.ts +26 -0
  259. package/template/tsconfig.json +4 -4
  260. package/template/tsconfig_fpeApi.json +103 -0
  261. package/template/tsconfig_rsdk_index.json +105 -0
  262. package/template/tsconfig_wsdk_index.json +104 -0
  263. package/template/webpack.commons.js +40 -16
  264. package/template/webpack.main.config.js +2 -1
  265. package/template/webpack.renderer.config.js +1 -1
  266. package/template/webpack.rsdk.config.js +33 -0
  267. package/template/webpack.ts.config.js +89 -0
  268. package/template/webpack.web.config.js +8 -1
  269. package/template/webpack.wsdk.config.js +34 -0
  270. package/template/agora-rn-uikit/.git/logs/refs/heads/ab-dev-auto +0 -1
  271. package/template/agora-rn-uikit/.git/objects/pack/pack-0061d00cd98162a329a32b537488a35d0abeb069.idx +0 -0
  272. package/template/agora-rn-uikit/.git/refs/heads/ab-dev-auto +0 -1
  273. package/template/agora-rn-uikit/src/Contexts/MaxUidContext.tsx +0 -7
  274. package/template/agora-rn-uikit/src/Contexts/MinUidContext.tsx +0 -8
  275. package/template/src/components/participants/context/ParticipantContext.tsx +0 -97
  276. package/template/src/subComponents/ScreenshareButton.tsx +0 -257
  277. package/template/src/subComponents/SwitchCamera.tsx +0 -35
  278. package/template/src/utils/hasBrandLogo.tsx +0 -3
  279. package/template/src/utils/mobileWebTest.native.tsx +0 -5
  280. package/template/src/utils/shouldAuthenticate.tsx +0 -7
@@ -0,0 +1,268 @@
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
+ * If the listener returns true then it will be removed after it is called.
124
+ *
125
+ * @param {String} evt Name of the event to attach the listener to.
126
+ * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling.
127
+ * @param {EventSourceEnum} source Name of the bucket to search events from
128
+ * @return {Object} Current instance of EventUtils
129
+ */
130
+ addListener(evt: string, listener: any, source: EventSourceEnum): object {
131
+ if (!_isValidListener(listener)) {
132
+ throw new Error('Listener must be a function');
133
+ }
134
+ const listeners = _getListenersAsObject(evt, source);
135
+ const listenerIsWrapped = typeof listener === 'object';
136
+
137
+ for (let key in listeners) {
138
+ if (
139
+ listeners.hasOwnProperty(key) &&
140
+ _indexOfListener(listeners[key], listener) === -1
141
+ ) {
142
+ listeners[key].push(
143
+ listenerIsWrapped
144
+ ? listener
145
+ : {
146
+ listener: listener,
147
+ once: false,
148
+ },
149
+ );
150
+ }
151
+ }
152
+ return this;
153
+ },
154
+
155
+ /**
156
+ * Removes a listener function from the specified event.
157
+ *
158
+ * @param {String} evt Name of the event to remove the listener from.
159
+ * @param {Function} listenerToRemove Method to remove from the event.
160
+ * @param {EventSourceEnum} source Name of the bucket to search events from
161
+ * @return {Object} Current instance of EventUtils for chaining.
162
+ */
163
+ removeListener(
164
+ evt: string,
165
+ listenerToRemove: TListener,
166
+ source: EventSourceEnum,
167
+ ): Object {
168
+ let listeners = _getListenersAsObject(evt, source);
169
+ for (let key in listeners) {
170
+ if (listeners.hasOwnProperty(key)) {
171
+ let index = _indexOfListener(listeners[key], listenerToRemove);
172
+ if (index !== -1) {
173
+ listeners[key].splice(index, 1);
174
+ }
175
+ }
176
+ }
177
+ return this;
178
+ },
179
+
180
+ /**
181
+ * Removes all listeners from a specified event.
182
+ * If you do not specify an event then all listeners will be removed.
183
+ * That means every event will be emptied.
184
+ *
185
+ * @param {String} [evt] Optional name of the event to remove all listeners for. Will remove from every event if not passed.
186
+ * @param {EventSourceEnum} source Name of the bucket to search events from
187
+ * @return {Object} Current instance of EventUtils
188
+ */
189
+ removeAllListeners(evt: string, source: EventSourceEnum): object {
190
+ let type = typeof evt;
191
+ let events = this.getEvents(source);
192
+ if (type === 'string') {
193
+ if (events.has(evt)) {
194
+ events.delete(evt);
195
+ }
196
+ }
197
+ return this;
198
+ },
199
+
200
+ /**
201
+ * Removes all events and resets the state.
202
+ * That means every event will be emptied.
203
+ *
204
+ * @param {source} source source Name of the bucket to search events from
205
+ * @return {Object} Current instance of EventUtils
206
+ */
207
+ removeAll(source: EventSourceEnum): object {
208
+ _events[source] = new Map();
209
+ return this;
210
+ },
211
+
212
+ /**
213
+ * Emits an event of your choice.
214
+ * When emitted, every listener attached to that event will be executed.
215
+ * If you pass the optional argument array then those arguments will be passed to every listener upon execution.
216
+ * Because it uses `apply`, your array of arguments will be passed as if you wrote them out separately.
217
+ * So they will not arrive within the array on the other side, they will be separate.
218
+ *
219
+ * @param {String} evt Name of the event to emit and execute listeners for.
220
+ * @param {Array} [args] Optional array of arguments to be passed to each listener.
221
+ * @return {Object} Current instance of EventUtils
222
+ */
223
+ emitEvent(evt: string, args: any): object {
224
+ let listenersMap = _getListenersAsObject(
225
+ evt,
226
+ args.payload.source || EventSourceEnum.core,
227
+ );
228
+ let listeners: TListenerMetaData[];
229
+ let listener: TListenerMetaData;
230
+ for (let key in listenersMap) {
231
+ if (listenersMap.hasOwnProperty(key)) {
232
+ listeners = listenersMap[key].slice(0);
233
+ for (let i = 0; i < listeners.length; i++) {
234
+ // If the listener returns true then it shall be removed from the event
235
+ // The function is executed either with a basic call or an apply if there is an args array
236
+ listener = listeners[i];
237
+
238
+ if (listener.once === true) {
239
+ this.removeListener(evt, args.payload.source, listener.listener);
240
+ }
241
+
242
+ const newargs = [].slice.call(arguments, 1);
243
+ listener.listener.apply(this, newargs || []);
244
+ }
245
+ }
246
+ }
247
+ return this;
248
+ },
249
+ // 1. To add multiple listeners
250
+ // addListeners(evt: string, listeners: any) {
251
+ // if (Array.isArray(listeners)) {
252
+ // let i = listeners.length;
253
+ // while (i--) {
254
+ // this.addListener.call(this, evt, listeners[i]);
255
+ // }
256
+ // }
257
+ // },
258
+ // 2. To add only once listener
259
+ // addOnceListener(evt: string, listener: TListener) {
260
+ // return this.addListener(evt, {
261
+ // listener: listener,
262
+ // once: true,
263
+ // });
264
+ // },
265
+ };
266
+ })();
267
+
268
+ 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,40 @@
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
+
30
+ const EventNames = {
31
+ RECORDING_ATTRIBUTE,
32
+ RAISED_ATTRIBUTE,
33
+ ROLE_ATTRIBUTE,
34
+ PUBLIC_CHAT_MESSAGE,
35
+ PRIVATE_CHAT_MESSAGE,
36
+ SCREENSHARE_ATTRIBUTE,
37
+ };
38
+ /** ***** EVENT NAMES ENDS ***** */
39
+
40
+ 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,38 @@
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
  };
36
+ //commented for v1 release
37
+ //const remoteUserDefaultLabel = useString('remoteUserDefaultLabel')();
38
+ const remoteUserDefaultLabel = 'User';
33
39
  return (
34
40
  <View>
35
41
  <View style={isLocal ? style.chatSenderViewLocal : style.chatSenderView}>
36
42
  <Text style={isLocal ? style.timestampTextLocal : style.timestampText}>
37
- {userList[uid] ? userList[uid].name : 'User'} | {time + ' '}
43
+ {renderList[uid] ? renderList[uid].name : remoteUserDefaultLabel} |{' '}
44
+ {time + ' '}
38
45
  </Text>
39
46
  </View>
40
47
  <View
@@ -54,7 +61,7 @@ const ChatBubble = (props: channelMessage) => {
54
61
  <Text
55
62
  style={isLocal ? style.whiteText : style.blackText}
56
63
  selectable={true}>
57
- {msg.slice(1) + ' '}
64
+ {message}
58
65
  </Text>
59
66
  </Hyperlink>
60
67
  </View>
@@ -86,7 +93,7 @@ const style = StyleSheet.create({
86
93
  fontWeight: '500',
87
94
  fontSize: 12,
88
95
  flex: 1,
89
- // textAlign: 'right',
96
+ textAlign: 'left',
90
97
  },
91
98
  timestampTextLocal: {
92
99
  color: $config.PRIMARY_FONT_COLOR + '60',
@@ -14,16 +14,24 @@ 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 ChatContext, {ChatBubbleProps} from '../components/ChatContext';
25
+ import {BtnTemplate} 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} = useContext(ChatContext);
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,