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,33 @@
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
+
13
+ import React from 'react';
14
+ import {View} from 'react-native';
15
+ import {MaxVideoView} from '../../../agora-rn-uikit';
16
+ import useUserList from '../../utils/useUserList';
17
+
18
+ const VideoPreview: React.FC = () => {
19
+ const {renderList, renderPosition} = useUserList();
20
+
21
+ const [maxUid] = renderPosition;
22
+
23
+ if (!maxUid) {
24
+ return null;
25
+ }
26
+
27
+ return (
28
+ <View style={{borderRadius: 10, flex: 1}}>
29
+ <MaxVideoView user={renderList[maxUid]} key={maxUid} />
30
+ </View>
31
+ );
32
+ };
33
+ export default VideoPreview;
@@ -0,0 +1,28 @@
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
+
13
+ import PreCallLocalMute, {PreCallLocalMuteComponentsArray} from './LocalMute';
14
+ import PreCallVideoPreview from './VideoPreview';
15
+ import PreCallSelectDevice from './selectDevice';
16
+ import PreCallJoinBtn, {PreCallJoinCallBtnProps} from './joinCallBtn';
17
+ import PreCallTextInput from './textInput';
18
+ import PreCallMeetingTitle from './meetingTitle';
19
+ export {
20
+ PreCallLocalMuteComponentsArray,
21
+ PreCallLocalMute,
22
+ PreCallVideoPreview,
23
+ PreCallSelectDevice,
24
+ PreCallJoinBtn,
25
+ PreCallTextInput,
26
+ PreCallMeetingTitle,
27
+ };
28
+ export type {PreCallJoinCallBtnProps};
@@ -0,0 +1,69 @@
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
+
13
+ import React, {useContext, useEffect} from 'react';
14
+ import PrimaryButton from '../../atoms/PrimaryButton';
15
+ import {usePreCall} from '../../components/precall/usePreCall';
16
+ import {useString} from '../../utils/useString';
17
+ import {ChannelProfile, PropsContext} from '../../../agora-rn-uikit';
18
+ import {JoinRoomButtonTextInterface} from '../../language/default-labels/precallScreenLabels';
19
+ import {useMeetingInfo} from '../meeting-info/useMeetingInfo';
20
+ import useGetName from '../../utils/useGetName';
21
+
22
+ export interface PreCallJoinCallBtnProps {
23
+ render?: (
24
+ onPress: () => void,
25
+ title: string,
26
+ disabled: boolean,
27
+ ) => JSX.Element;
28
+ }
29
+
30
+ const JoinCallBtn = (props: PreCallJoinCallBtnProps) => {
31
+ const {rtcProps} = useContext(PropsContext);
32
+ const {setCallActive} = usePreCall();
33
+ const username = useGetName();
34
+ const {isJoinDataFetched} = useMeetingInfo();
35
+ const joinRoomButton =
36
+ useString<JoinRoomButtonTextInterface>('joinRoomButton');
37
+
38
+ const [buttonText, setButtonText] = React.useState(
39
+ joinRoomButton({
40
+ ready: isJoinDataFetched,
41
+ role: $config.EVENT_MODE ? rtcProps.role : undefined,
42
+ }),
43
+ );
44
+ useEffect(() => {
45
+ if (rtcProps?.role) {
46
+ setButtonText(
47
+ joinRoomButton({
48
+ ready: isJoinDataFetched,
49
+ role: $config.EVENT_MODE ? rtcProps.role : undefined,
50
+ }),
51
+ );
52
+ }
53
+ }, [rtcProps?.role]);
54
+
55
+ const onSubmit = () => {
56
+ setCallActive(true);
57
+ };
58
+
59
+ const title = buttonText;
60
+ const onPress = () => onSubmit();
61
+ const disabled = !isJoinDataFetched || username === '';
62
+ return props?.render ? (
63
+ props.render(onPress, title, disabled)
64
+ ) : (
65
+ <PrimaryButton onPress={onPress} disabled={disabled} text={title} />
66
+ );
67
+ };
68
+
69
+ export default JoinCallBtn;
@@ -0,0 +1,91 @@
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
+
13
+ import React, {useContext, useEffect} from 'react';
14
+ import PrimaryButton from '../../atoms/PrimaryButton';
15
+ import {usePreCall} from '../../components/precall/usePreCall';
16
+ import {useString} from '../../utils/useString';
17
+ import {ChannelProfile, PropsContext} from '../../../agora-rn-uikit';
18
+ import {JoinRoomButtonTextInterface} from '../../language/default-labels/precallScreenLabels';
19
+ import {useMeetingInfo} from '../meeting-info/useMeetingInfo';
20
+ import useGetName from '../../utils/useGetName';
21
+ import {useWakeLock} from '../../components/useWakeLock';
22
+ import isMobileOrTablet from '../../utils/isMobileOrTablet';
23
+ import {isWeb} from '../../utils/common';
24
+
25
+ const audio = new Audio(
26
+ 'https://dl.dropboxusercontent.com/s/1cdwpm3gca9mlo0/kick.mp3',
27
+ );
28
+
29
+ export interface PreCallJoinCallBtnProps {
30
+ render?: (
31
+ onPress: () => void,
32
+ title: string,
33
+ disabled: boolean,
34
+ ) => JSX.Element;
35
+ }
36
+
37
+ const JoinCallBtn = (props: PreCallJoinCallBtnProps) => {
38
+ const {rtcProps} = useContext(PropsContext);
39
+ const {setCallActive} = usePreCall();
40
+ const username = useGetName();
41
+ const {isJoinDataFetched} = useMeetingInfo();
42
+ const {awake, request} = useWakeLock();
43
+ const joinRoomButton =
44
+ useString<JoinRoomButtonTextInterface>('joinRoomButton');
45
+
46
+ const [buttonText, setButtonText] = React.useState(
47
+ joinRoomButton({
48
+ ready: isJoinDataFetched,
49
+ role: $config.EVENT_MODE ? rtcProps.role : undefined,
50
+ }),
51
+ );
52
+
53
+ const onSubmit = () => {
54
+ setCallActive(true);
55
+ // Play a sound to avoid autoblocking in safari
56
+ if (isWeb || isMobileOrTablet()) {
57
+ audio.volume = 0;
58
+ audio.play().then(() => {
59
+ // pause directly once played
60
+ audio.pause();
61
+ });
62
+ }
63
+ // Avoid Sleep only on mobile browsers
64
+ if (isWeb && isMobileOrTablet() && !awake) {
65
+ // Request wake lock
66
+ request();
67
+ }
68
+ };
69
+
70
+ useEffect(() => {
71
+ if (rtcProps?.role) {
72
+ setButtonText(
73
+ joinRoomButton({
74
+ ready: isJoinDataFetched,
75
+ role: $config.EVENT_MODE ? rtcProps.role : undefined,
76
+ }),
77
+ );
78
+ }
79
+ }, [rtcProps?.role]);
80
+
81
+ const title = buttonText;
82
+ const onPress = () => onSubmit();
83
+ const disabled = !isJoinDataFetched || username === '';
84
+ return props?.render ? (
85
+ props.render(onPress, title, disabled)
86
+ ) : (
87
+ <PrimaryButton onPress={onPress} disabled={disabled} text={title} />
88
+ );
89
+ };
90
+
91
+ export default JoinCallBtn;
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import {Text, StyleSheet, View} from 'react-native';
3
+ import {useMeetingInfo} from '../meeting-info/useMeetingInfo';
4
+
5
+ const MeetingTitle: React.FC = () => {
6
+ const {meetingTitle} = useMeetingInfo();
7
+ return (
8
+ <>
9
+ <Text style={[style.titleHeading, {color: $config.PRIMARY_COLOR}]}>
10
+ {meetingTitle}
11
+ </Text>
12
+ <View style={{height: 50}} />
13
+ </>
14
+ );
15
+ };
16
+
17
+ export default MeetingTitle;
18
+
19
+ const style = StyleSheet.create({
20
+ titleHeading: {
21
+ fontSize: 28,
22
+ fontWeight: '700',
23
+ textAlign: 'center',
24
+ color: $config.SECONDARY_FONT_COLOR,
25
+ },
26
+ });
@@ -0,0 +1,46 @@
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
+
13
+ import React from 'react';
14
+ import {View, StyleSheet, Text} from 'react-native';
15
+ import {isWeb} from '../../utils/common';
16
+ import SelectDevice from '../../subComponents/SelectDevice';
17
+ import {useString} from '../../utils/useString';
18
+
19
+ const selectDevice: React.FC = () => {
20
+ //commented for v1 release
21
+ //const selectInputDeviceLabel = useString('selectInputDeviceLabel')();
22
+ const selectInputDeviceLabel = 'Select Input Device';
23
+ return (
24
+ <>
25
+ <Text style={style.subHeading}>{selectInputDeviceLabel}</Text>
26
+ <View
27
+ style={{
28
+ flex: 1,
29
+ maxWidth: isWeb ? '25vw' : 'auto',
30
+ marginVertical: 30,
31
+ }}>
32
+ <SelectDevice />
33
+ </View>
34
+ </>
35
+ );
36
+ };
37
+
38
+ export default selectDevice;
39
+
40
+ const style = StyleSheet.create({
41
+ subHeading: {
42
+ fontSize: 18,
43
+ fontWeight: '700',
44
+ color: $config.PRIMARY_FONT_COLOR,
45
+ },
46
+ });
@@ -0,0 +1,43 @@
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
+
13
+ import React from 'react';
14
+ import TextInput from '../../atoms/TextInput';
15
+ import {useString} from '../../utils/useString';
16
+ import {useMeetingInfo} from '../meeting-info/useMeetingInfo';
17
+ import useSetName from '../../utils/useSetName';
18
+ import useGetName from '../../utils/useGetName';
19
+
20
+ const PreCallTextInput: React.FC = () => {
21
+ //commented for v1 release
22
+ // const userNamePlaceholder = useString('userNamePlaceholder')();
23
+ // const fetchingNamePlaceholder = useString('fetchingNamePlaceholder')();
24
+ const userNamePlaceholder = 'Display name*';
25
+ const fetchingNamePlaceholder = 'Getting name...';
26
+ const username = useGetName();
27
+ const setUsername = useSetName();
28
+ const {isJoinDataFetched} = useMeetingInfo();
29
+
30
+ return (
31
+ <TextInput
32
+ value={username}
33
+ onChangeText={(text) => setUsername(text ? text.trim() : '')}
34
+ onSubmitEditing={() => {}}
35
+ placeholder={
36
+ isJoinDataFetched ? userNamePlaceholder : fetchingNamePlaceholder
37
+ }
38
+ editable={isJoinDataFetched}
39
+ />
40
+ );
41
+ };
42
+
43
+ export default PreCallTextInput;
@@ -0,0 +1,41 @@
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} from 'react';
13
+ import {createHook} from 'fpe-implementation';
14
+ import {ApolloError} from '@apollo/client';
15
+
16
+ export interface PreCallContextInterface {
17
+ callActive: boolean;
18
+ setCallActive: React.Dispatch<React.SetStateAction<boolean>>;
19
+ error?: ApolloError;
20
+ }
21
+
22
+ const PreCallContext = createContext<PreCallContextInterface>({
23
+ callActive: false,
24
+ setCallActive: () => {},
25
+ });
26
+
27
+ interface PreCallProviderProps {
28
+ value: PreCallContextInterface;
29
+ children: React.ReactNode;
30
+ }
31
+
32
+ const PreCallProvider = (props: PreCallProviderProps) => {
33
+ return (
34
+ <PreCallContext.Provider value={{...props.value}}>
35
+ {props.children}
36
+ </PreCallContext.Provider>
37
+ );
38
+ };
39
+ const usePreCall = createHook(PreCallContext);
40
+
41
+ export {PreCallProvider, usePreCall};
@@ -9,7 +9,7 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import {Platform} from 'react-native';
12
+ import {isWeb} from '../utils/common';
13
13
 
14
14
  const styles = {
15
15
  temp: {
@@ -19,8 +19,8 @@ const styles = {
19
19
  borderRadius: 15,
20
20
  },
21
21
  bottomBar: {
22
- flex: Platform.OS === 'web' ? 1.3 : 1.6,
23
- paddingHorizontal: Platform.OS === 'web' ? '20%' : '1%',
22
+ flex: isWeb ? 1.3 : 1.6,
23
+ paddingHorizontal: isWeb ? '20%' : '1%',
24
24
  backgroundColor: $config.SECONDARY_FONT_COLOR + 80,
25
25
  flexDirection: 'row',
26
26
  justifyContent: 'space-evenly',
@@ -41,6 +41,23 @@ const styles = {
41
41
  alignItems: 'center',
42
42
  justifyContent: 'center',
43
43
  },
44
+ localButtonWithoutBG: {
45
+ borderRadius: 23,
46
+ borderColor: $config.PRIMARY_COLOR,
47
+ borderWidth: 0,
48
+ width: 40,
49
+ height: 40,
50
+ padding: 3,
51
+ display: 'flex',
52
+ alignSelf: 'center',
53
+ alignItems: 'center',
54
+ justifyContent: 'center',
55
+ },
56
+ fullWidthButton: {
57
+ width: '100%',
58
+ height: '100%',
59
+ resizeMode: 'contain',
60
+ },
44
61
  endCall: {
45
62
  backgroundColor: $config.SECONDARY_FONT_COLOR, //'#fff',
46
63
  borderRadius: 23,
@@ -0,0 +1,222 @@
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
+
13
+ import {createHook} from 'fpe-implementation';
14
+ import React from 'react';
15
+ import {useString} from '../utils/useString';
16
+ import isSDKCheck from '../utils/isSDK';
17
+ import Toast from '../../react-native-toast-message';
18
+ import {useMeetingInfo} from './meeting-info/useMeetingInfo';
19
+ import platform from '../subComponents/Platform';
20
+ import {
21
+ GetMeetingInviteID,
22
+ GetMeetingInviteURL,
23
+ } from '../utils/getMeetingInvite';
24
+ import {MeetingInviteInterface} from '../language/default-labels/videoCallScreenLabels';
25
+ import Clipboard from '../subComponents/Clipboard';
26
+
27
+ export enum SHARE_LINK_CONTENT_TYPE {
28
+ ATTENDEE,
29
+ HOST,
30
+ PSTN,
31
+ MEETING_INVITE,
32
+ }
33
+
34
+ export interface ShareLinkContextInterface {
35
+ copyShareLinkToClipboard: (type: SHARE_LINK_CONTENT_TYPE) => void;
36
+ getShareLink: (type: SHARE_LINK_CONTENT_TYPE) => string;
37
+ }
38
+ const ShareLinkContext = React.createContext<ShareLinkContextInterface>({
39
+ copyShareLinkToClipboard: () => {},
40
+ getShareLink: () => '',
41
+ });
42
+
43
+ interface ShareLinkProvideProps {
44
+ children: React.ReactNode;
45
+ }
46
+
47
+ const ShareLinkProvider = (props: ShareLinkProvideProps) => {
48
+ const {meetingTitle, meetingPassphrase, isSeparateHostLink} =
49
+ useMeetingInfo();
50
+
51
+ //commmented for v1 release
52
+ // const copiedToClipboardText = useString(
53
+ // 'copiedToClipboardNotificationLabel',
54
+ // )();
55
+ // const meetingIdText = useString('meetingIdLabel')();
56
+ // const PSTNNumberText = useString('PSTNNumber')();
57
+ // const PSTNPinText = useString('PSTNPin')();
58
+ // const meetingInviteText =
59
+ // useString<MeetingInviteInterface>('meetingInviteText');
60
+ const copiedToClipboardText = 'Copied to Clipboard';
61
+ const meetingIdText = 'Meeting ID';
62
+ const PSTNNumberText = 'PSTN Number';
63
+ const PSTNPinText = 'PSTN Pin';
64
+ const meetingInviteText = ({meetingName, id, url, pstn}) => {
65
+ let inviteContent = '';
66
+ if (url) {
67
+ // if host data is present generate links for both host and attendee
68
+ if (url?.host) {
69
+ inviteContent += `Meeting - ${meetingName}\nURL for Attendee: ${url?.attendee}\nURL for Host: ${url?.host}`;
70
+ }
71
+ // if host data is not present then generate link for attendee alone
72
+ else {
73
+ inviteContent += `Meeting - ${meetingName}\nMeeting URL: ${url?.attendee}`;
74
+ }
75
+ } else {
76
+ // if host data is present generate meeting ID for both host and attendee
77
+ if (id?.host) {
78
+ inviteContent += `Meeting - ${meetingName}\nAttendee Meeting ID: ${id?.attendee}\nHost Meeting ID: ${id?.host}`;
79
+ }
80
+ // if host data is not present then generate meeting ID for attendee alone
81
+ else {
82
+ inviteContent += `Meeting - ${meetingName}\nMeeting ID: ${id?.attendee}`;
83
+ }
84
+ }
85
+ // Adding pstn data into meeting data if present
86
+ if (pstn?.number && pstn?.pin) {
87
+ inviteContent += `\nPSTN Number: ${pstn.number}\nPSTN Pin: ${pstn.pin}`;
88
+ }
89
+ return inviteContent;
90
+ };
91
+
92
+ const isSDK = isSDKCheck();
93
+
94
+ const getMeetingInvite = () => {
95
+ let baseURL = getBaseURL();
96
+ let stringToCopy = meetingInviteText({
97
+ meetingName: meetingTitle,
98
+ url: baseURL
99
+ ? GetMeetingInviteURL(
100
+ baseURL,
101
+ meetingPassphrase.attendee,
102
+ isSeparateHostLink ? meetingPassphrase.host : undefined,
103
+ )
104
+ : undefined,
105
+ id: !baseURL
106
+ ? GetMeetingInviteID(
107
+ meetingPassphrase.attendee,
108
+ isSeparateHostLink ? meetingPassphrase.host : undefined,
109
+ )
110
+ : undefined,
111
+ pstn: meetingPassphrase?.pstn
112
+ ? {
113
+ number: meetingPassphrase.pstn.number,
114
+ pin: meetingPassphrase.pstn.pin,
115
+ }
116
+ : undefined,
117
+ });
118
+ return stringToCopy;
119
+ };
120
+
121
+ const getBaseURL = () => {
122
+ let baseURL =
123
+ platform === 'web' && !isSDK
124
+ ? $config.FRONTEND_ENDPOINT || window.location.origin
125
+ : undefined;
126
+ return baseURL;
127
+ };
128
+
129
+ const getAttendeeURLOrId = () => {
130
+ let stringToCopy = '';
131
+ let baseURL = getBaseURL();
132
+ if (meetingPassphrase?.attendee) {
133
+ if (baseURL) {
134
+ stringToCopy += `${baseURL}/${meetingPassphrase.attendee}`;
135
+ } else {
136
+ stringToCopy += `${meetingIdText}: ${meetingPassphrase.attendee}`;
137
+ }
138
+ }
139
+ return stringToCopy;
140
+ };
141
+
142
+ const getHostUrlOrId = () => {
143
+ let stringToCopy = '';
144
+ if (meetingPassphrase?.host) {
145
+ let baseURL = getBaseURL();
146
+ if (baseURL) {
147
+ stringToCopy += `${baseURL}/${meetingPassphrase.host}`;
148
+ } else {
149
+ stringToCopy += `${meetingIdText}: ${meetingPassphrase.host}`;
150
+ }
151
+ }
152
+ return stringToCopy;
153
+ };
154
+
155
+ const getPstn = () => {
156
+ let stringToCopy = '';
157
+ if (
158
+ meetingPassphrase?.pstn &&
159
+ meetingPassphrase.pstn?.number &&
160
+ meetingPassphrase.pstn?.pin
161
+ ) {
162
+ stringToCopy += `${PSTNNumberText}: ${meetingPassphrase.pstn.number} ${PSTNPinText}: ${meetingPassphrase.pstn.pin}`;
163
+ }
164
+
165
+ return stringToCopy;
166
+ };
167
+
168
+ const getShareLink = (input: SHARE_LINK_CONTENT_TYPE) => {
169
+ let stringToCopy = '';
170
+ switch (input) {
171
+ case SHARE_LINK_CONTENT_TYPE.MEETING_INVITE:
172
+ stringToCopy = getMeetingInvite();
173
+ break;
174
+ case SHARE_LINK_CONTENT_TYPE.ATTENDEE:
175
+ stringToCopy = getAttendeeURLOrId();
176
+ break;
177
+ case SHARE_LINK_CONTENT_TYPE.HOST:
178
+ stringToCopy = getHostUrlOrId();
179
+ break;
180
+ case SHARE_LINK_CONTENT_TYPE.PSTN:
181
+ stringToCopy = getPstn();
182
+ default:
183
+ break;
184
+ }
185
+ return stringToCopy;
186
+ };
187
+
188
+ const copyShareLinkToClipboard = (input: SHARE_LINK_CONTENT_TYPE) => {
189
+ let stringToCopy = '';
190
+ switch (input) {
191
+ case SHARE_LINK_CONTENT_TYPE.MEETING_INVITE:
192
+ stringToCopy = getMeetingInvite();
193
+ break;
194
+ case SHARE_LINK_CONTENT_TYPE.ATTENDEE:
195
+ stringToCopy = getAttendeeURLOrId();
196
+ break;
197
+ case SHARE_LINK_CONTENT_TYPE.HOST:
198
+ stringToCopy = getHostUrlOrId();
199
+ break;
200
+ case SHARE_LINK_CONTENT_TYPE.PSTN:
201
+ stringToCopy = getPstn();
202
+ default:
203
+ break;
204
+ }
205
+ Clipboard.setString(stringToCopy);
206
+ Toast.show({
207
+ type: 'success',
208
+ text1: copiedToClipboardText,
209
+ visibilityTime: 1000,
210
+ });
211
+ };
212
+
213
+ return (
214
+ <ShareLinkContext.Provider value={{copyShareLinkToClipboard, getShareLink}}>
215
+ {props.children}
216
+ </ShareLinkContext.Provider>
217
+ );
218
+ };
219
+
220
+ const useShareLink = createHook(ShareLinkContext);
221
+
222
+ export {ShareLinkProvider, ShareLinkContext, useShareLink};
@@ -1,10 +1,10 @@
1
1
  import NoSleep from 'nosleep.js';
2
2
  import React from 'react';
3
- import {Platform} from 'react-native';
4
- import mobileAndTabletCheck from '../utils/mobileWebTest';
3
+ import mobileAndTabletCheck from '../utils/isMobileOrTablet';
4
+ import {isWeb} from '../utils/common';
5
5
 
6
6
  const useWakeLock = () => {
7
- if (mobileAndTabletCheck() && Platform.OS == 'web') {
7
+ if (mobileAndTabletCheck() && isWeb) {
8
8
  const noSleep = React.useMemo(() => new NoSleep(), []);
9
9
  const [awake, set] = React.useState(noSleep.isEnabled);
10
10