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,92 @@
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, {createContext, useContext, useEffect, useState} from 'react';
13
+ import {createHook} from 'fpe-implementation';
14
+ import {useFpe} from 'fpe-api';
15
+ import {DEFAULT_I18_DATA} from './index';
16
+ import StorageContext from '../components/StorageContext';
17
+
18
+ export interface LanguageContextInterface {
19
+ languageCode: string;
20
+ setLanguageCode: (code: string) => void;
21
+ }
22
+
23
+ export interface LanguagePropsInterface {
24
+ children: React.ReactNode;
25
+ }
26
+
27
+ const LanguageContext = createContext<LanguageContextInterface>({
28
+ languageCode: DEFAULT_I18_DATA.locale,
29
+ setLanguageCode: () => {},
30
+ });
31
+
32
+ const LanguageProvider = (props: LanguagePropsInterface) => {
33
+ const {store, setStore} = useContext(StorageContext);
34
+ const i18nData = useFpe((data) => data?.i18n);
35
+
36
+ //If language code is stored in the localstorage no longer available in fpe data
37
+ //then we will update the localstorage value to default value
38
+ let storedCode =
39
+ i18nData && Array.isArray(i18nData) && i18nData.length
40
+ ? i18nData?.find((item) => item.locale === store.selectedLanguageCode)
41
+ ? store.selectedLanguageCode
42
+ : undefined
43
+ : undefined;
44
+
45
+ const [languageCode, setLanguageCodeLocal] = useState(
46
+ storedCode ||
47
+ (i18nData && Array.isArray(i18nData) && i18nData.length
48
+ ? i18nData[0].locale
49
+ : false) ||
50
+ DEFAULT_I18_DATA.locale,
51
+ );
52
+
53
+ useEffect(() => {
54
+ if (setStore) {
55
+ setStore((prevState) => {
56
+ return {
57
+ ...prevState,
58
+ selectedLanguageCode: languageCode,
59
+ };
60
+ });
61
+ }
62
+ }, [languageCode]);
63
+
64
+ useEffect(() => {
65
+ let storedCode =
66
+ i18nData && Array.isArray(i18nData) && i18nData.length
67
+ ? i18nData?.find((item) => item.locale === store.selectedLanguageCode)
68
+ ? store.selectedLanguageCode
69
+ : undefined
70
+ : undefined;
71
+ setLanguageCodeLocal(
72
+ storedCode ||
73
+ (i18nData && Array.isArray(i18nData) && i18nData.length
74
+ ? i18nData[0].locale
75
+ : false) ||
76
+ DEFAULT_I18_DATA.locale,
77
+ );
78
+ }, [i18nData]);
79
+
80
+ const setLanguageCode = (langCode: string) => {
81
+ setLanguageCodeLocal(langCode);
82
+ };
83
+
84
+ return (
85
+ <LanguageContext.Provider value={{languageCode, setLanguageCode}}>
86
+ {props.children}
87
+ </LanguageContext.Provider>
88
+ );
89
+ };
90
+ const useLanguage = createHook(LanguageContext);
91
+
92
+ export {LanguageProvider, useLanguage};
@@ -9,28 +9,36 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React, {useState} from 'react';
12
+ import React, {useContext, useState} from 'react';
13
13
  import {
14
14
  View,
15
15
  Text,
16
16
  ImageBackground,
17
17
  StyleSheet,
18
- Dimensions,
18
+ LayoutChangeEvent,
19
19
  } from 'react-native';
20
20
  import Logo from '../subComponents/Logo';
21
21
  import OAuth from '../components/OAuth';
22
22
  import Illustration from '../subComponents/Illustration';
23
- import hasBrandLogo from '../utils/hasBrandLogo';
23
+ import {hasBrandLogo} from '../utils/common';
24
+ import DimensionContext from '../components/dimension/DimensionContext';
25
+ import {useString} from '../utils/useString';
24
26
 
25
27
  const Authenticate = () => {
26
- const [dim, setDim] = useState([
27
- Dimensions.get('window').width,
28
- Dimensions.get('window').height,
29
- Dimensions.get('window').width > Dimensions.get('window').height,
30
- ]);
31
- let onLayout = (e: any) => {
32
- setDim([e.nativeEvent.layout.width, e.nativeEvent.layout.height]);
28
+ const {getDimensionData} = useContext(DimensionContext);
29
+ const [isDesktop, setIsDesktop] = useState(false);
30
+ let onLayout = (e: LayoutChangeEvent) => {
31
+ const {isDesktop} = getDimensionData(
32
+ e.nativeEvent.layout.width,
33
+ e.nativeEvent.layout.height,
34
+ );
35
+ setIsDesktop(isDesktop);
33
36
  };
37
+ //commented for v1 release
38
+ // const oauthLoginLabel = useString('oauthLoginLabel')();
39
+ // const oauthProviderLabel = useString('oauthProviderLabel')();
40
+ const oauthLoginLabel = 'Login using OAuth';
41
+ const oauthProviderLabel = 'Please select an OAuth provider to login.';
34
42
  return (
35
43
  <ImageBackground
36
44
  onLayout={onLayout}
@@ -41,13 +49,11 @@ const Authenticate = () => {
41
49
  <View style={style.nav}>{hasBrandLogo && <Logo />}</View>
42
50
  <View style={style.content}>
43
51
  <View style={style.leftContent}>
44
- <Text style={style.heading}>Login using OAuth</Text>
45
- <Text style={style.headline}>
46
- Please select an OAuth provider to login.
47
- </Text>
52
+ <Text style={style.heading}>{oauthLoginLabel}</Text>
53
+ <Text style={style.headline}>{oauthProviderLabel}</Text>
48
54
  <OAuth />
49
55
  </View>
50
- {dim[0] > dim[1] + 150 ? (
56
+ {isDesktop ? (
51
57
  <View style={style.full}>
52
58
  <Illustration />
53
59
  </View>
@@ -9,200 +9,217 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React, {useEffect, useState} from 'react';
13
- import {
14
- View,
15
- Text,
16
- StyleSheet,
17
- Dimensions,
18
- ScrollView,
19
- Platform,
20
- } from 'react-native';
12
+ import React, {useEffect, useState, useContext} from 'react';
13
+ import {View, Text, StyleSheet, ScrollView} from 'react-native';
21
14
  import {useHistory} from '../components/Router';
22
15
  import Checkbox from '../subComponents/Checkbox';
23
- import {gql, useMutation} from '@apollo/client';
24
- import Logo from '../subComponents/Logo';
25
- // import OpenInNativeButton from '../subComponents/OpenInNativeButton';
26
- import Share from '../components/Share';
27
- // import ColorContext from '../components/ColorContext';
28
- // import Illustration from '../subComponents/Illustration';
29
- // import {textInput} from '../../theme.json';
30
16
  import PrimaryButton from '../atoms/PrimaryButton';
31
17
  import SecondaryButton from '../atoms/SecondaryButton';
32
18
  import HorizontalRule from '../atoms/HorizontalRule';
33
19
  import TextInput from '../atoms/TextInput';
34
- import Error from '../subComponents/Error';
35
20
  import Toast from '../../react-native-toast-message';
36
- import hasBrandLogo from '../utils/hasBrandLogo';
21
+ import {ErrorContext} from '../components/common';
22
+ import ShareLink from '../components/Share';
23
+ import Logo from '../components/common/Logo';
24
+ import {isWeb, isValidReactComponent} from '../utils/common';
25
+ import {useFpe, useMeetingInfo} from 'fpe-api';
26
+ import {useString} from '../utils/useString';
27
+ import useCreateMeeting from '../utils/useCreateMeeting';
28
+ import {CreateProvider} from './create/useCreate';
29
+ import useJoinMeeting from '../utils/useJoinMeeting';
30
+ import SDKEvents from '../utils/SdkEvents';
37
31
 
38
- type PasswordInput = {
39
- host: string;
40
- view: string;
41
- };
32
+ const Create = () => {
33
+ const {CreateComponent} = useFpe((data) => {
34
+ let components: {
35
+ CreateComponent?: React.ElementType;
36
+ } = {};
37
+ // commented for v1 release
38
+ // if (
39
+ // data?.components?.create &&
40
+ // typeof data?.components?.create !== 'object'
41
+ // ) {
42
+ // if (
43
+ // data?.components?.create &&
44
+ // isValidReactComponent(data?.components?.create)
45
+ // )
46
+ // components.CreateComponent = data?.components?.create;
47
+ // }
48
+ return components;
49
+ });
42
50
 
43
- const CREATE_CHANNEL = gql`
44
- mutation CreateChannel(
45
- $title: String!
46
- $backendURL: String!
47
- $enablePSTN: Boolean
48
- ) {
49
- createChannel(
50
- title: $title
51
- backendURL: $backendURL
52
- enablePSTN: $enablePSTN
53
- ) {
54
- passphrase {
55
- host
56
- view
57
- }
58
- channel
59
- title
60
- pstn {
61
- number
62
- dtmf
63
- }
64
- }
65
- }
66
- `;
51
+ const useJoin = useJoinMeeting();
67
52
 
68
- const Create = () => {
69
- // const {primaryColor} = useContext(ColorContext);
53
+ const {setGlobalErrorMessage} = useContext(ErrorContext);
70
54
  const history = useHistory();
55
+ const [loading, setLoading] = useState(false);
71
56
  const [roomTitle, onChangeRoomTitle] = useState('');
72
57
  const [pstnCheckbox, setPstnCheckbox] = useState(false);
73
58
  const [hostControlCheckbox, setHostControlCheckbox] = useState(true);
74
- const [urlView, setUrlView] = useState(null);
75
- const [urlHost, setUrlHost] = useState(null);
76
- const [pstn, setPstn] = useState(null);
77
59
  const [roomCreated, setRoomCreated] = useState(false);
78
- const [joinPhrase, setJoinPhrase] = useState(null);
79
- const [createChannel, {data, loading, error}] = useMutation(CREATE_CHANNEL);
60
+ const createRoomFun = useCreateMeeting();
61
+ const {
62
+ meetingPassphrase: {attendee, host, pstn},
63
+ } = useMeetingInfo();
64
+ //commented for v1 release
65
+ // const createdText = useString('meetingCreatedNotificationLabel')();
66
+ // const hostControlsToggle = useString<boolean>('hostControlsToggle');
67
+ // const pstnToggle = useString<boolean>('pstnToggle');
68
+ // const loadingWithDots = useString('loadingWithDots')();
69
+ // const createMeetingButton = useString('createMeetingButton')();
70
+ // const haveMeetingID = useString('haveMeetingID')();
80
71
 
81
- console.log('mutation data', data);
72
+ const createdText = 'Created';
73
+ const hostControlsToggle = (toggle: boolean) =>
74
+ toggle
75
+ ? 'Restrict Host Controls (Separate host link)'
76
+ : 'Restrict Host Controls (Everyone is a Host)';
77
+ const pstnToggle = () => 'Use PSTN (Join by dialing a number)';
78
+ const meetingNameInputPlaceholder = useString(
79
+ 'meetingNameInputPlaceholder',
80
+ )();
81
+ const loadingWithDots = 'Loading...';
82
+ const createMeetingButton = 'Create Meeting';
83
+ const haveMeetingID = 'Have a Meeting ID?';
82
84
 
83
85
  useEffect(() => {
84
- if (Platform.OS === 'web') {
86
+ if (isWeb) {
85
87
  document.title = $config.APP_NAME;
86
88
  }
89
+ SDKEvents.on('joinMeetingWithPhrase', (phrase) => {
90
+ console.log(
91
+ 'DEBUG(aditya)-SDKEvents: joinMeetingWithPhrase event called',
92
+ );
93
+ useJoin(phrase);
94
+ });
95
+ return () => {
96
+ SDKEvents.off('joinMeetingWithPhrase');
97
+ };
87
98
  }, []);
88
99
 
89
- const createRoom = () => {
100
+ const showShareScreen = () => {
101
+ setRoomCreated(true);
102
+ };
103
+
104
+ useEffect(() => {
105
+ if (attendee) {
106
+ SDKEvents.emit('create', host, attendee, pstn);
107
+ }
108
+ }, [attendee]);
109
+
110
+ const createRoomAndNavigateToShare = async (
111
+ roomTitle: string,
112
+ enablePSTN: boolean,
113
+ isSeparateHostLink: boolean,
114
+ ) => {
90
115
  if (roomTitle !== '') {
91
- console.log('Create room invoked');
92
- createChannel({
93
- variables: {
94
- title: roomTitle,
95
- backendURL: $config.BACKEND_ENDPOINT,
96
- enablePSTN: pstnCheckbox,
97
- },
98
- })
99
- .then((res: any) => {
100
- Toast.show({
101
- text1: 'Created: ' + roomTitle,
102
- visibilityTime: 1000,
103
- });
104
- console.log('promise data', res);
105
- setUrlView(res.data.createChannel.passphrase.view);
106
- setUrlHost(res.data.createChannel.passphrase.host);
107
- setPstn(res.data.createChannel.pstn);
108
- setJoinPhrase(res.data.createChannel.passphrase.host);
109
- setRoomCreated(true);
110
- })
111
- .catch((e) => {
112
- console.log(e);
116
+ setLoading(true);
117
+ try {
118
+ await createRoomFun(roomTitle, enablePSTN, isSeparateHostLink);
119
+ setLoading(false);
120
+ Toast.show({
121
+ type: 'success',
122
+ text1: createdText + ': ' + roomTitle,
123
+ visibilityTime: 1000,
113
124
  });
125
+ showShareScreen();
126
+ } catch (error) {
127
+ setLoading(false);
128
+ setGlobalErrorMessage(error);
129
+ }
114
130
  }
115
131
  };
116
132
 
117
- const [dim, setDim] = useState([
118
- Dimensions.get('window').width,
119
- Dimensions.get('window').height,
120
- Dimensions.get('window').width > Dimensions.get('window').height,
121
- ]);
122
- let onLayout = (e: any) => {
123
- setDim([e.nativeEvent.layout.width, e.nativeEvent.layout.height]);
124
- };
125
-
126
133
  return (
127
- // <ImageBackground
128
- // style={style.full}
129
- // resizeMode={'cover'}>
130
- // <KeyboardAvoidingView behavior={'height'} style={style.main}>
131
- <ScrollView contentContainerStyle={style.main}>
132
- <View style={style.nav}>
133
- {hasBrandLogo && <Logo />}
134
- {error ? <Error error={error} /> : <></>}
135
- {/* <OpenInNativeButton /> */}
136
- </View>
134
+ <CreateProvider
135
+ value={{
136
+ showShareScreen,
137
+ }}>
137
138
  {!roomCreated ? (
138
- <View style={style.content} onLayout={onLayout}>
139
- <View style={style.leftContent}>
140
- <Text style={style.heading}>{$config.APP_NAME}</Text>
141
- <Text style={style.headline}>{$config.LANDING_SUB_HEADING}</Text>
142
- <View style={style.inputs}>
143
- <TextInput
144
- value={roomTitle}
145
- onChangeText={(text) => onChangeRoomTitle(text)}
146
- onSubmitEditing={() => createRoom()}
147
- placeholder="Name your meeting"
148
- />
149
- <View style={{paddingVertical: 10}}>
150
- <View style={style.checkboxHolder}>
151
- {$config.EVENT_MODE ? (
152
- <></>
153
- ) : (
154
- <>
155
- <Checkbox
156
- disabled={$config.EVENT_MODE}
157
- value={hostControlCheckbox}
158
- onValueChange={setHostControlCheckbox}
159
- />
160
- <Text style={style.checkboxTitle}>
161
- Restrict Host Controls (Separate host link)
162
- </Text>
163
- </>
164
- )}
165
- </View>
166
- {$config.PSTN ? (
167
- <View style={style.checkboxHolder}>
168
- <Checkbox
169
- value={pstnCheckbox}
170
- onValueChange={setPstnCheckbox}
139
+ CreateComponent ? (
140
+ <CreateComponent />
141
+ ) : (
142
+ <ScrollView contentContainerStyle={style.main}>
143
+ <Logo />
144
+ <View style={style.content}>
145
+ <View style={style.leftContent}>
146
+ <Text style={style.heading}>{$config.APP_NAME}</Text>
147
+ <Text style={style.headline}>
148
+ {$config.LANDING_SUB_HEADING}
149
+ </Text>
150
+ <View style={style.inputs}>
151
+ <TextInput
152
+ value={roomTitle}
153
+ onChangeText={(text) => onChangeRoomTitle(text)}
154
+ onSubmitEditing={() =>
155
+ createRoomAndNavigateToShare(
156
+ roomTitle,
157
+ pstnCheckbox,
158
+ hostControlCheckbox,
159
+ )
160
+ }
161
+ placeholder={meetingNameInputPlaceholder}
162
+ />
163
+ <View style={{paddingVertical: 10}}>
164
+ <View style={style.checkboxHolder}>
165
+ {$config.EVENT_MODE ? (
166
+ <></>
167
+ ) : (
168
+ <>
169
+ <Checkbox
170
+ disabled={$config.EVENT_MODE}
171
+ value={hostControlCheckbox}
172
+ onValueChange={setHostControlCheckbox}
173
+ />
174
+ <Text style={style.checkboxTitle}>
175
+ {/* Restrict Host Controls (Separate host link) */}
176
+ {hostControlsToggle(hostControlCheckbox)}
177
+ </Text>
178
+ </>
179
+ )}
180
+ </View>
181
+ {$config.PSTN ? (
182
+ <View style={style.checkboxHolder}>
183
+ <Checkbox
184
+ value={pstnCheckbox}
185
+ onValueChange={setPstnCheckbox}
186
+ />
187
+ <Text style={style.checkboxTitle}>
188
+ {pstnToggle(pstnCheckbox)}
189
+ </Text>
190
+ </View>
191
+ ) : (
192
+ <></>
193
+ )}
194
+ </View>
195
+ <View style={style.btnContainer}>
196
+ <PrimaryButton
197
+ disabled={roomTitle === '' || loading}
198
+ onPress={() =>
199
+ createRoomAndNavigateToShare(
200
+ roomTitle,
201
+ pstnCheckbox,
202
+ hostControlCheckbox,
203
+ )
204
+ }
205
+ text={loading ? loadingWithDots : createMeetingButton}
206
+ />
207
+ <HorizontalRule />
208
+ <SecondaryButton
209
+ onPress={() => history.push('/join')}
210
+ text={haveMeetingID}
171
211
  />
172
- <Text style={style.checkboxTitle}>
173
- Use PSTN (Join by dialing a number)
174
- </Text>
175
212
  </View>
176
- ) : (
177
- <></>
178
- )}
179
- </View>
180
- <View style={style.btnContainer}>
181
- <PrimaryButton
182
- disabled={roomTitle === '' || loading}
183
- onPress={() => createRoom()}
184
- text={loading ? 'Loading...' : 'Create Meeting'}
185
- />
186
- <HorizontalRule />
187
- <SecondaryButton
188
- onPress={() => history.push('/join')}
189
- text={'Have a Meeting ID?'}
190
- />
213
+ </View>
191
214
  </View>
192
215
  </View>
193
- </View>
194
- </View>
216
+ </ScrollView>
217
+ )
195
218
  ) : (
196
- <Share
197
- urlView={urlView}
198
- urlHost={urlHost}
199
- pstn={pstn}
200
- hostControlCheckbox={hostControlCheckbox}
201
- joinPhrase={joinPhrase}
202
- roomTitle={roomTitle}
203
- />
219
+ <></>
204
220
  )}
205
- </ScrollView>
221
+ {roomCreated ? <ShareLink /> : <></>}
222
+ </CreateProvider>
206
223
  );
207
224
  };
208
225
 
@@ -9,54 +9,66 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React, {useContext, useState} from 'react';
12
+ // @ts-nocheck
13
+ import React, {useState} from 'react';
13
14
  import {View, Text, StyleSheet, ScrollView} from 'react-native';
14
15
  import {useHistory} from '../components/Router';
15
- import SessionContext from '../components/SessionContext';
16
- // import OpenInNativeButton from '../subComponents/OpenInNativeButton';
17
16
  import Logo from '../subComponents/Logo';
18
- import hasBrandLogo from '../utils/hasBrandLogo';
17
+ import {
18
+ isValidReactComponent,
19
+ shouldAuthenticate,
20
+ hasBrandLogo,
21
+ } from '../utils/common';
19
22
  import LogoutButton from '../subComponents/LogoutButton';
20
- import ColorContext from '../components/ColorContext';
21
- // import Illustration from '../subComponents/Illustration';
22
- // import {secondaryBtn} from '../../theme.json';
23
23
  import PrimaryButton from '../atoms/PrimaryButton';
24
24
  import SecondaryButton from '../atoms/SecondaryButton';
25
25
  import HorizontalRule from '../atoms/HorizontalRule';
26
26
  import TextInput from '../atoms/TextInput';
27
27
  import Error from '../subComponents/Error';
28
- import shouldAuthenticate from '../utils/shouldAuthenticate';
29
- // const joinFlag = 0;
30
- interface joinProps {
31
- phrase: string;
32
- onChangePhrase: (text: string) => void;
33
- }
34
- const Join = (props: joinProps) => {
28
+ import {useString} from '../utils/useString';
29
+ import useNavigateTo from '../utils/useNavigateTo';
30
+ import {useFpe} from 'fpe-api';
31
+
32
+ const Join = () => {
33
+ //commented for v1 release
34
+ // const meetingIdInputPlaceholder = useString('meetingIdInputPlaceholder')();
35
+ // const enterMeetingButton = useString('enterMeetingButton')();
36
+ // const createMeetingButton = useString('createMeetingButton')();
37
+ const meetingIdInputPlaceholder = 'Enter Meeting ID';
38
+ const enterMeetingButton = 'Enter Meeting';
39
+ const createMeetingButton = 'Create Meeting';
35
40
  const history = useHistory();
36
- const {primaryColor} = useContext(ColorContext);
37
- const {joinSession} = useContext(SessionContext);
41
+ const [phrase, setPhrase] = useState('');
42
+ const navigateTo = useNavigateTo();
38
43
  const [error, setError] = useState<null | {name: string; message: string}>(
39
44
  null,
40
45
  );
41
- // const [dim, setDim] = useState([
42
- // Dimensions.get('window').width,
43
- // Dimensions.get('window').height,
44
- // Dimensions.get('window').width > Dimensions.get('window').height,
45
- // ]);
46
- // let onLayout = (e: any) => {
47
- // setDim([e.nativeEvent.layout.width, e.nativeEvent.layout.height]);
48
- // };
46
+
49
47
  const createMeeting = () => {
50
48
  history.push('/create');
51
49
  };
52
50
 
53
- const phrase = props.phrase;
54
- const onChangePhrase = props.onChangePhrase;
55
51
  const startCall = async () => {
56
- joinSession({phrase});
52
+ navigateTo(phrase);
57
53
  };
54
+ const {JoinComponent} = useFpe((data) => {
55
+ let components: {
56
+ JoinComponent?: React.ComponentType;
57
+ } = {};
58
+ // commented for v1 release
59
+ // if (
60
+ // data?.components?.join &&
61
+ // typeof data?.components?.join !== 'object' &&
62
+ // isValidReactComponent(data?.components?.join)
63
+ // ) {
64
+ // components.JoinComponent = data?.components?.join;
65
+ // }
66
+ return components;
67
+ });
58
68
 
59
- return (
69
+ return JoinComponent ? (
70
+ <JoinComponent />
71
+ ) : (
60
72
  <ScrollView contentContainerStyle={style.main}>
61
73
  <View style={style.nav}>
62
74
  {hasBrandLogo && <Logo />}
@@ -69,20 +81,20 @@ const Join = (props: joinProps) => {
69
81
  <View style={style.inputs}>
70
82
  <TextInput
71
83
  value={phrase}
72
- onChangeText={(text) => onChangePhrase(text)}
84
+ onChangeText={(text) => setPhrase(text)}
73
85
  onSubmitEditing={() => startCall()}
74
- placeholder="Enter Meeting ID"
86
+ placeholder={meetingIdInputPlaceholder}
75
87
  />
76
88
  <View style={{height: 10}} />
77
89
  <PrimaryButton
78
90
  disabled={phrase === ''}
79
91
  onPress={() => startCall()}
80
- text={'Enter Meeting'}
92
+ text={enterMeetingButton}
81
93
  />
82
94
  <HorizontalRule />
83
95
  <SecondaryButton
84
96
  onPress={() => createMeeting()}
85
- text={'Create a meeting'}
97
+ text={createMeetingButton}
86
98
  />
87
99
  {shouldAuthenticate ? (
88
100
  <LogoutButton setError={setError} /> //setError not available in logout?