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,79 @@
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 React from 'react';
13
+ import {Router} from './components/Router';
14
+ import Navigation from './components/Navigation';
15
+ import {StorageProvider} from './components/StorageContext';
16
+ import GraphQLProvider from './components/GraphQLProvider';
17
+ import {SessionProvider} from './components/SessionContext';
18
+ import {ImageBackground, SafeAreaView, StatusBar, Platform} from 'react-native';
19
+ import ColorConfigure from './components/ColorConfigure';
20
+ import Toast from '../react-native-toast-message';
21
+ import ToastConfig from './subComponents/toastConfig';
22
+ import {isValidReactComponent} from './utils/common';
23
+ import DimensionProvider from './components/dimension/DimensionProvider';
24
+ import Error from './components/common/Error';
25
+ import {ErrorProvider} from './components/common';
26
+ import {useFpe, FpeProvider, fpeConfig, FpeApiInterface} from 'fpe-api';
27
+ import {LanguageProvider} from './language/useLanguage';
28
+
29
+ interface AppWrapperProps {
30
+ children: React.ReactNode;
31
+ fpeConfig?: FpeApiInterface;
32
+ }
33
+
34
+ const AppWrapper = (props: AppWrapperProps) => {
35
+ const AppRoot = useFpe((data) => {
36
+ if (data?.appRoot && isValidReactComponent(data.appRoot)) {
37
+ return data.appRoot;
38
+ }
39
+ return React.Fragment;
40
+ });
41
+
42
+ return (
43
+ <AppRoot>
44
+ <ImageBackground
45
+ source={{uri: $config.BG}}
46
+ style={{flex: 1}}
47
+ resizeMode={'cover'}>
48
+ <SafeAreaView
49
+ // @ts-ignore textAlign not supported by TS definitions but is applied to web regardless
50
+ style={[{flex: 1}, Platform.select({web: {textAlign: 'left'}})]}>
51
+ <StatusBar hidden={true} />
52
+ <Toast ref={(ref) => Toast.setRef(ref)} config={ToastConfig} />
53
+ <StorageProvider>
54
+ <GraphQLProvider>
55
+ <Router>
56
+ <SessionProvider>
57
+ <ColorConfigure>
58
+ <DimensionProvider>
59
+ <LanguageProvider>
60
+ <ErrorProvider>
61
+ <Error />
62
+ <Navigation />
63
+ {props.children}
64
+ </ErrorProvider>
65
+ </LanguageProvider>
66
+ </DimensionProvider>
67
+ </ColorConfigure>
68
+ </SessionProvider>
69
+ </Router>
70
+ </GraphQLProvider>
71
+ </StorageProvider>
72
+ </SafeAreaView>
73
+ </ImageBackground>
74
+ </AppRoot>
75
+ );
76
+ // return <div> hello world</div>; {/* isn't join:phrase redundant now, also can we remove joinStore */}
77
+ };
78
+
79
+ export default AppWrapper;
@@ -0,0 +1,67 @@
1
+ import React, {useEffect, useState} from 'react';
2
+ import {fpeConfig, FpeProvider, FpeApiInterface} from 'fpe-api';
3
+ import {installFPE as createFPE} from 'fpe-api/install';
4
+ import SDKEvents from './utils/SdkEvents';
5
+ import App from './App';
6
+
7
+ export interface userEventsMapInterface {
8
+ leave: () => void;
9
+ create: (
10
+ hostPhrase: string,
11
+ attendeePhrase?: string,
12
+ pstnNumer?: string,
13
+ ) => void;
14
+ preJoin: (meetingTitle: string, devices: MediaDeviceInfo[]) => void;
15
+ join: (
16
+ meetingTitle: string,
17
+ devices: MediaDeviceInfo[],
18
+ isHost: boolean,
19
+ ) => void;
20
+ }
21
+
22
+ export interface AppBuilderSdkApiInterface {
23
+ addFPE: (fpe: FpeApiInterface) => void;
24
+ createFPE: (fpe: FpeApiInterface) => FpeApiInterface;
25
+ joinMeeting: (joinPhrase: string) => void;
26
+ on: <T extends keyof userEventsMapInterface>(
27
+ userEventName: T,
28
+ callBack: userEventsMapInterface[T],
29
+ ) => void;
30
+ off: (userEventName: keyof userEventsMapInterface) => void;
31
+ }
32
+
33
+ export const AppBuilderSdkApi: AppBuilderSdkApiInterface = {
34
+ addFPE: (fpeConfig: FpeApiInterface) => {
35
+ SDKEvents.emit('addFpe', fpeConfig);
36
+ },
37
+ joinMeeting: (joinPhrase: string) => {
38
+ SDKEvents.emit('joinMeetingWithPhrase', joinPhrase);
39
+ },
40
+ createFPE,
41
+ on: (userEventName, cb) => {
42
+ SDKEvents.on(userEventName, cb);
43
+ },
44
+ off: (userEventName) => {
45
+ SDKEvents.off(userEventName);
46
+ },
47
+ };
48
+
49
+ const SDKAppWrapper = () => {
50
+ const [fpe, setFpe] = useState(fpeConfig);
51
+ useEffect(() => {
52
+ SDKEvents.on('addFpe', (sdkFpeConfig) => {
53
+ console.log('DEBUG(aditya)-SDKEvents: addFpe event called');
54
+ setFpe(sdkFpeConfig);
55
+ });
56
+ // Join event consumed in Create.tsx
57
+ }, []);
58
+ return (
59
+ <>
60
+ <FpeProvider value={fpe}>
61
+ <App />
62
+ </FpeProvider>
63
+ </>
64
+ );
65
+ };
66
+
67
+ export default SDKAppWrapper;
@@ -35,14 +35,20 @@ export default function PrimaryButton(props: ButtonProps) {
35
35
  {backgroundColor: props.disabled ? primaryColor + '80' : primaryColor},
36
36
  ]}
37
37
  {...otherProps}>
38
- {props.text ? (
39
- <Text style={[styles.primaryButtonText as StyleProp<TextStyle>, {color: '#fff'}]}>
40
- {props.text}
41
- </Text>
42
- ) : (
43
- <></>
44
- )}
45
- {children}
38
+ <>
39
+ {props.text ? (
40
+ <Text
41
+ style={[
42
+ styles.primaryButtonText as StyleProp<TextStyle>,
43
+ {color: '#fff'},
44
+ ]}>
45
+ {props.text}
46
+ </Text>
47
+ ) : (
48
+ <></>
49
+ )}
50
+ {children}
51
+ </>
46
52
  </Pressable>
47
53
  );
48
54
  }
@@ -11,6 +11,7 @@
11
11
  */
12
12
  import React, {useContext} from 'react';
13
13
  import {TextInputProps, StyleSheet, TextInput, Platform} from 'react-native';
14
+ import {isWeb} from '../utils/common';
14
15
  import {textInput} from '../../theme.json';
15
16
  import ColorContext from '../components/ColorContext';
16
17
 
@@ -19,7 +20,13 @@ const PrimaryButton = (props: TextInputProps) => {
19
20
  const {style, ...otherProps} = props;
20
21
  return (
21
22
  <TextInput
22
- style={[styles.textInput, styles.textWrapFix, style, styles.noOutline, {borderColor: primaryColor, color: $config.PRIMARY_FONT_COLOR}]}
23
+ style={[
24
+ styles.textInput,
25
+ styles.textWrapFix,
26
+ style,
27
+ styles.noOutline,
28
+ {borderColor: primaryColor, color: $config.PRIMARY_FONT_COLOR},
29
+ ]}
23
30
  placeholderTextColor={$config.PRIMARY_FONT_COLOR + '70'}
24
31
  {...otherProps}
25
32
  autoCorrect={false}
@@ -31,10 +38,11 @@ export default PrimaryButton;
31
38
 
32
39
  const styles = StyleSheet.create({
33
40
  textInput,
34
- noOutline: Platform.OS === 'web' ? { outlineStyle: "none" } : {},
41
+ // @ts-ignore
42
+ noOutline: isWeb ? {outlineStyle: 'none'} : {},
35
43
  textWrapFix: Platform.select({
36
44
  ios: {
37
- paddingVertical: 5
38
- }
39
- })
45
+ paddingVertical: 5,
46
+ },
47
+ }),
40
48
  });
@@ -9,25 +9,31 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React, {useState, useContext, useEffect} from 'react';
12
+ import React, {useState, useContext} from 'react';
13
13
  import {
14
14
  View,
15
- Platform,
16
15
  Text,
17
16
  StyleSheet,
18
17
  TouchableOpacity,
19
18
  Dimensions,
20
- useWindowDimensions,
21
19
  } from 'react-native';
22
- import {RFValue} from 'react-native-responsive-fontsize';
23
20
  import ChatContainer from '../subComponents/ChatContainer';
24
21
  import ChatInput from '../subComponents/ChatInput';
25
22
  import ChatParticipants from '../subComponents/chat/ChatParticipants';
26
23
  import ColorContext from './ColorContext';
27
- import chatContext from './ChatContext';
24
+ import {useChatNotification} from './chat-notification/useChatNotification';
25
+ import {useString} from '../utils/useString';
26
+ import {isIOS, isValidReactComponent, isWeb} from '../utils/common';
27
+ import {useChatUIControl} from './chat-ui/useChatUIControl';
28
+ import {useFpe} from 'fpe-api';
29
+ import {UidType} from '../../agora-rn-uikit';
28
30
 
29
- const Chat = (props: any) => {
30
- const {height, width} = useWindowDimensions();
31
+ const Chat = () => {
32
+ // commented for v1 release
33
+ // const groupChatLabel = useString('groupChatLabel')();
34
+ // const privateChatLabel = useString('privateChatLabel')();
35
+ const groupChatLabel = 'Group';
36
+ const privateChatLabel = 'Private';
31
37
  const [dim, setDim] = useState([
32
38
  Dimensions.get('window').width,
33
39
  Dimensions.get('window').height,
@@ -35,154 +41,189 @@ const Chat = (props: any) => {
35
41
  ]);
36
42
  const isSmall = dim[0] < 700;
37
43
 
38
- const {userList} = useContext(chatContext);
39
-
40
44
  const {
41
- setChatDisplayed,
42
- pendingPrivateNotification,
43
- pendingPublicNotification,
44
- lastCheckedPrivateState,
45
- privateMessageCountMap,
46
- setPrivateMessageLastSeen,
47
- setPrivateChatDisplayed,
48
- } = props;
45
+ groupActive,
46
+ setGroupActive,
47
+ privateActive,
48
+ setPrivateActive,
49
+ setSelectedChatUserId: setSelectedUser,
50
+ } = useChatUIControl();
51
+ const {
52
+ unreadGroupMessageCount,
53
+ setUnreadGroupMessageCount,
54
+ unreadPrivateMessageCount,
55
+ setUnreadPrivateMessageCount,
56
+ setUnreadIndividualMessageCount,
57
+ unreadIndividualMessageCount,
58
+ } = useChatNotification();
59
+
49
60
  const {primaryColor} = useContext(ColorContext);
50
- const [groupActive, setGroupActive] = useState(true);
51
- const [privateActive, setPrivateActive] = useState(false);
52
- const [selectedUserID, setSelectedUser] = useState('');
53
61
 
54
- //Initally private state should be false
55
- useEffect(() => {
56
- setPrivateChatDisplayed(false);
62
+ React.useEffect(() => {
63
+ return () => {
64
+ // reset both the active tabs
65
+ setGroupActive(false);
66
+ setPrivateActive(false);
67
+ setSelectedUser(0);
68
+ };
57
69
  }, []);
58
70
 
59
- useEffect(() => {
60
- if (privateActive && selectedUserID) {
61
- setPrivateMessageLastSeen({
62
- userId: selectedUserID,
63
- lastSeenCount: privateMessageCountMap[selectedUserID],
64
- });
65
- }
66
- }, [pendingPrivateNotification]);
67
-
68
71
  const selectGroup = () => {
69
72
  setPrivateActive(false);
70
73
  setGroupActive(true);
71
- setPrivateChatDisplayed(false);
74
+ setUnreadGroupMessageCount(0);
75
+ setSelectedUser(0);
72
76
  };
73
77
  const selectPrivate = () => {
74
78
  setGroupActive(false);
75
- setPrivateChatDisplayed(true);
79
+ setSelectedUser(0);
80
+ setPrivateActive(false);
76
81
  };
77
- const selectUser = (userUID: any) => {
82
+ const selectUser = (userUID: UidType) => {
78
83
  setSelectedUser(userUID);
79
84
  setPrivateActive(true);
85
+ setUnreadIndividualMessageCount((prevState) => {
86
+ return {
87
+ ...prevState,
88
+ [userUID]: 0,
89
+ };
90
+ });
91
+ setUnreadPrivateMessageCount(
92
+ unreadPrivateMessageCount - (unreadIndividualMessageCount[userUID] || 0),
93
+ );
80
94
  };
81
95
 
96
+ const {ChatAfterView, ChatBeforeView} = useFpe((data) => {
97
+ let components: {
98
+ ChatAfterView: React.ComponentType;
99
+ ChatBeforeView: React.ComponentType;
100
+ } = {
101
+ ChatAfterView: React.Fragment,
102
+ ChatBeforeView: React.Fragment,
103
+ };
104
+ if (
105
+ data?.components?.videoCall &&
106
+ typeof data?.components?.videoCall === 'object'
107
+ ) {
108
+ // commented for v1 release
109
+ // if (
110
+ // data?.components?.videoCall?.chat &&
111
+ // typeof data?.components?.videoCall?.chat === 'object'
112
+ // ) {
113
+ // if (
114
+ // data?.components?.videoCall?.chat?.after &&
115
+ // isValidReactComponent(data?.components?.videoCall?.chat?.after)
116
+ // ) {
117
+ // components.ChatAfterView = data?.components?.videoCall?.chat?.after;
118
+ // }
119
+ // if (
120
+ // data?.components?.videoCall?.chat?.before &&
121
+ // isValidReactComponent(data?.components?.videoCall?.chat?.before)
122
+ // ) {
123
+ // components.ChatBeforeView = data?.components?.videoCall?.chat?.before;
124
+ // }
125
+ // }
126
+ }
127
+ return components;
128
+ });
129
+
82
130
  return (
83
- <View
84
- style={
85
- Platform.OS === 'web'
86
- ? !isSmall
87
- ? style.chatView
131
+ <>
132
+ <View
133
+ style={
134
+ isWeb
135
+ ? !isSmall
136
+ ? style.chatView
137
+ : style.chatViewNative
88
138
  : style.chatViewNative
89
- : style.chatViewNative
90
- }>
91
- <View style={style.chatNav}>
92
- <TouchableOpacity
93
- onPress={selectGroup}
94
- style={
95
- groupActive
96
- ? [style.groupActive, {borderColor: primaryColor}]
97
- : [
98
- style.group,
99
- {
100
- borderColor: primaryColor,
101
- borderTopColor: primaryColor + '80',
102
- },
103
- ]
104
- }>
105
- {pendingPublicNotification !== 0 ? (
106
- <View style={style.chatNotification}>
107
- <Text>{pendingPublicNotification}</Text>
108
- </View>
109
- ) : null}
110
- <Text style={groupActive ? style.groupTextActive : style.groupText}>
111
- Group
112
- </Text>
113
- </TouchableOpacity>
114
- <TouchableOpacity
115
- onPress={selectPrivate}
116
- style={
117
- !groupActive
118
- ? [style.privateActive, {borderColor: primaryColor}]
119
- : [
120
- style.private,
121
- {
122
- borderColor: primaryColor,
123
- borderTopColor: primaryColor + '80',
124
- },
125
- ]
126
- }>
127
- {pendingPrivateNotification !== 0 ? (
128
- <View style={style.chatNotification}>
129
- <Text>{pendingPrivateNotification}</Text>
130
- </View>
131
- ) : null}
132
- <Text style={!groupActive ? style.groupTextActive : style.groupText}>
133
- Private
134
- </Text>
135
- </TouchableOpacity>
136
- </View>
137
- {groupActive ? (
138
- <>
139
- <ChatContainer privateActive={privateActive} />
140
- <View style={[style.chatInputLineSeparator, {marginBottom: 0}]} />
141
- <View>
142
- <View style={style.chatInputContainer}>
143
- <View style={[style.chatInputLineSeparator, {opacity: 0.3}]} />
144
- <ChatInput privateActive={privateActive} />
139
+ }>
140
+ {/**
141
+ * In Native device we are setting absolute view. so placed ChatBeforeView and ChatAfterView inside the main view
142
+ */}
143
+ <ChatBeforeView />
144
+ <View style={style.chatNav}>
145
+ <TouchableOpacity
146
+ onPress={selectGroup}
147
+ style={
148
+ groupActive
149
+ ? [style.groupActive, {borderColor: primaryColor}]
150
+ : [
151
+ style.group,
152
+ {
153
+ borderColor: primaryColor,
154
+ borderTopColor: primaryColor + '80',
155
+ },
156
+ ]
157
+ }>
158
+ {unreadGroupMessageCount !== 0 ? (
159
+ <View style={style.chatNotification}>
160
+ <Text>{unreadGroupMessageCount}</Text>
161
+ </View>
162
+ ) : null}
163
+ <Text style={groupActive ? style.groupTextActive : style.groupText}>
164
+ {groupChatLabel}
165
+ </Text>
166
+ </TouchableOpacity>
167
+ <TouchableOpacity
168
+ onPress={selectPrivate}
169
+ style={
170
+ !groupActive
171
+ ? [style.privateActive, {borderColor: primaryColor}]
172
+ : [
173
+ style.private,
174
+ {
175
+ borderColor: primaryColor,
176
+ borderTopColor: primaryColor + '80',
177
+ },
178
+ ]
179
+ }>
180
+ {unreadPrivateMessageCount !== 0 ? (
181
+ <View style={style.chatNotification}>
182
+ <Text>{unreadPrivateMessageCount}</Text>
183
+ </View>
184
+ ) : null}
185
+ <Text
186
+ style={!groupActive ? style.groupTextActive : style.groupText}>
187
+ {privateChatLabel}
188
+ </Text>
189
+ </TouchableOpacity>
190
+ </View>
191
+ {groupActive ? (
192
+ <>
193
+ <ChatContainer privateActive={privateActive} />
194
+ <View style={[style.chatInputLineSeparator, {marginBottom: 0}]} />
195
+ <View>
196
+ <View style={style.chatInputContainer}>
197
+ <View style={[style.chatInputLineSeparator, {opacity: 0.3}]} />
198
+ <ChatInput />
199
+ </View>
145
200
  </View>
146
- </View>
147
- </>
148
- ) : (
149
- <>
150
- {!privateActive ? (
151
- <ChatParticipants
152
- selectUser={selectUser}
153
- setPrivateMessageLastSeen={setPrivateMessageLastSeen}
154
- privateMessageCountMap={privateMessageCountMap}
155
- lastCheckedPrivateState={lastCheckedPrivateState}
156
- />
157
- ) : (
158
- <>
159
- <ChatContainer
160
- privateActive={privateActive}
161
- setPrivateActive={setPrivateActive}
162
- selectedUserID={selectedUserID}
163
- selectedUsername={
164
- userList[selectedUserID]
165
- ? userList[selectedUserID]?.name + ' '
166
- : 'User '
167
- }
168
- />
169
- <View style={[style.chatInputLineSeparator, {marginBottom: 0}]} />
170
- <View>
171
- <View style={style.chatInputContainer}>
172
- <View
173
- style={[style.chatInputLineSeparator, {opacity: 0.3}]}
174
- />
175
- <ChatInput
176
- privateActive={privateActive}
177
- selectedUserID={selectedUserID}
178
- />
201
+ </>
202
+ ) : (
203
+ <>
204
+ {!privateActive ? (
205
+ <ChatParticipants selectUser={selectUser} />
206
+ ) : (
207
+ <>
208
+ <ChatContainer selectPrivate={selectPrivate} />
209
+ <View
210
+ style={[style.chatInputLineSeparator, {marginBottom: 0}]}
211
+ />
212
+ <View>
213
+ <View style={style.chatInputContainer}>
214
+ <View
215
+ style={[style.chatInputLineSeparator, {opacity: 0.3}]}
216
+ />
217
+ <ChatInput />
218
+ </View>
179
219
  </View>
180
- </View>
181
- </>
182
- )}
183
- </>
184
- )}
185
- </View>
220
+ </>
221
+ )}
222
+ </>
223
+ )}
224
+ <ChatAfterView />
225
+ </View>
226
+ </>
186
227
  );
187
228
  };
188
229
 
@@ -299,7 +340,7 @@ const style = StyleSheet.create({
299
340
  justifyContent: 'center',
300
341
  backgroundColor: $config.PRIMARY_COLOR,
301
342
  color: $config.SECONDARY_FONT_COLOR,
302
- fontFamily: Platform.OS === 'ios' ? 'Helvetica' : 'sans-serif',
343
+ fontFamily: isIOS ? 'Helvetica' : 'sans-serif',
303
344
  borderRadius: 10,
304
345
  position: 'absolute',
305
346
  left: 25,
@@ -313,7 +354,7 @@ const style = StyleSheet.create({
313
354
  justifyContent: 'center',
314
355
  backgroundColor: $config.PRIMARY_COLOR,
315
356
  color: $config.SECONDARY_FONT_COLOR,
316
- fontFamily: Platform.OS === 'ios' ? 'Helvetica' : 'sans-serif',
357
+ fontFamily: isIOS ? 'Helvetica' : 'sans-serif',
317
358
  borderRadius: 10,
318
359
  position: 'absolute',
319
360
  right: 20,
@@ -9,20 +9,26 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import RtmEngine, {RtmAttribute} from 'agora-react-native-rtm';
13
- import {createContext} from 'react';
14
- import {rtmEventsInterface} from './RTMEvents';
12
+ import RtmEngine from 'agora-react-native-rtm';
13
+ import {UidType} from '../../agora-rn-uikit';
14
+ import {createContext, SetStateAction} from 'react';
15
15
 
16
- export interface channelMessage {
16
+ export interface ChatBubbleProps {
17
17
  isLocal: boolean;
18
- msg: string;
19
- ts: string;
20
- uid: string;
18
+ message: string;
19
+ timestamp: string;
20
+ uid: UidType;
21
+ render?: (
22
+ isLocal: boolean,
23
+ message: string,
24
+ timestamp: string,
25
+ uid: UidType,
26
+ ) => JSX.Element;
21
27
  }
22
28
 
23
29
  export interface messageStoreInterface {
24
30
  ts: string;
25
- uid: string;
31
+ uid: UidType;
26
32
  msg: string;
27
33
  }
28
34
 
@@ -49,23 +55,15 @@ export enum attrRequestTypes {
49
55
  none = 'NONE',
50
56
  }
51
57
 
52
- interface chatContext {
53
- messageStore: messageStoreInterface | any;
54
- privateMessageStore: any;
58
+ export interface chatContext {
59
+ hasUserJoinedRTM: boolean;
55
60
  sendMessage: (msg: string) => void;
56
- sendMessageToUid: (msg: string, uid: number) => void;
61
+ sendMessageToUid: (msg: string, uid: number | string) => void;
57
62
  sendControlMessage: (msg: string) => void;
58
63
  sendControlMessageToUid: (msg: string, uid: number) => void;
59
- addOrUpdateLocalUserAttributes: (attributes: RtmAttribute[]) => void;
60
- broadcastUserAttributes: (
61
- attributes: RtmAttribute[],
62
- ctrlMsg: controlMessageEnum,
63
- ) => void;
64
64
  engine: RtmEngine;
65
- localUid: string;
66
- userList: any;
65
+ localUid: UidType;
67
66
  onlineUsersCount: number;
68
- events: rtmEventsInterface;
69
67
  }
70
68
 
71
69
  export enum controlMessageEnum {
@@ -76,8 +74,6 @@ export enum controlMessageEnum {
76
74
  kickUser = '5',
77
75
  cloudRecordingActive = '6',
78
76
  cloudRecordingUnactive = '7',
79
- clientRoleChanged = 'CLIENT_ROLE_CHANGED',
80
- // TODO move to livestream provider
81
77
  }
82
78
 
83
79
  const ChatContext = createContext(null as unknown as chatContext);
@@ -12,7 +12,7 @@
12
12
  import React from 'react';
13
13
  import ColorContext from './ColorContext';
14
14
 
15
- const ColorConfigure: React.FC = (props: any) => {
15
+ const ColorConfigure = (props: {children: React.ReactNode}) => {
16
16
  const primaryColor = $config.PRIMARY_COLOR;
17
17
  console.log(primaryColor);
18
18
  return (
@@ -20,7 +20,7 @@ const ColorConfigure: React.FC = (props: any) => {
20
20
  value={{
21
21
  primaryColor: primaryColor,
22
22
  }}>
23
- {true ? props.children : <></>}
23
+ {props.children}
24
24
  </ColorContext.Provider>
25
25
  );
26
26
  };