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,17 @@
1
+ import {useFpe} from 'fpe-api';
2
+ import {DefaultLayouts} from './DefaultLayouts';
3
+
4
+ function useCustomLayout() {
5
+ const fpeLayouts = useFpe((config) => {
6
+ if (
7
+ typeof config?.components?.videoCall === 'object' &&
8
+ config?.components?.videoCall?.customLayout
9
+ ) {
10
+ return config.components.videoCall.customLayout(DefaultLayouts);
11
+ } else {
12
+ return DefaultLayouts;
13
+ }
14
+ });
15
+ return fpeLayouts;
16
+ }
17
+ export default useCustomLayout;
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import {useFpe} from 'fpe-api';
3
+
4
+ const CustomUserContextHolder: React.FC<{children: any}> = (props) => {
5
+ const useUserContext = useFpe((config) => {
6
+ if (
7
+ config?.components?.videoCall &&
8
+ typeof config?.components?.videoCall === 'object' &&
9
+ config?.components?.videoCall?.useUserContext &&
10
+ typeof config?.components?.videoCall?.useUserContext === 'function'
11
+ ) {
12
+ return config?.components?.videoCall?.useUserContext;
13
+ } else {
14
+ return () => {};
15
+ }
16
+ });
17
+ useUserContext();
18
+ return props.children;
19
+ };
20
+ export default CustomUserContextHolder;
@@ -0,0 +1,65 @@
1
+ import {layoutObjectType} from 'fpe-api';
2
+ import GridVideo from '../../components/GridVideo';
3
+ import PinnedVideo from '../../components/PinnedVideo';
4
+ import useCustomLayout from './CustomLayout';
5
+ import {useLayout} from '../../utils/useLayout';
6
+
7
+ export const DefaultLayouts: layoutObjectType[] = [
8
+ {
9
+ name: 'grid',
10
+ label: 'Grid Layout',
11
+ iconName: 'gridLayoutIcon',
12
+ component: GridVideo,
13
+ },
14
+ {
15
+ name: 'pinned',
16
+ label: 'Pinned Layout',
17
+ iconName: 'pinnedLayoutIcon',
18
+ component: PinnedVideo,
19
+ },
20
+ ];
21
+
22
+ export const getPinnedLayoutName = () => DefaultLayouts[1].name;
23
+ export const getGridLayoutName = () => DefaultLayouts[0].name;
24
+
25
+ export const useSetPinnedLayout = () => {
26
+ const {setActiveLayoutName} = useLayout();
27
+ const layouts = useCustomLayout();
28
+ const pinnedLayoutName = getPinnedLayoutName();
29
+ let checkPinnedLayoutExist = false;
30
+ if (layouts && Array.isArray(layouts) && layouts.length) {
31
+ let data = layouts.filter((item) => item.name === pinnedLayoutName);
32
+ if (data && data.length) {
33
+ checkPinnedLayoutExist = true;
34
+ }
35
+ }
36
+ if (!checkPinnedLayoutExist) {
37
+ return () => {};
38
+ }
39
+ return () => {
40
+ setActiveLayoutName(pinnedLayoutName);
41
+ };
42
+ };
43
+
44
+ export const useChangeDefaultLayout = () => {
45
+ const {setActiveLayoutName} = useLayout();
46
+ const layout = useCustomLayout();
47
+
48
+ if (!layout) {
49
+ return () => {};
50
+ }
51
+
52
+ if (
53
+ layout &&
54
+ Array.isArray(layout) &&
55
+ (layout.length === 0 || layout.length === 1)
56
+ ) {
57
+ return () => {};
58
+ }
59
+
60
+ return () => {
61
+ setActiveLayoutName((activeLayout: string) =>
62
+ activeLayout === layout[1].name ? layout[0].name : layout[1].name,
63
+ );
64
+ };
65
+ };
@@ -0,0 +1,62 @@
1
+ import React, {useContext} from 'react';
2
+ import {View, StyleSheet, useWindowDimensions} from 'react-native';
3
+ import {RFValue} from 'react-native-responsive-fontsize';
4
+ import {ImageIcon, RenderInterface} from '../../../agora-rn-uikit';
5
+ import TextWithTooltip from '../../subComponents/TextWithTooltip';
6
+ import ColorContext from '../../components/ColorContext';
7
+ import {useString} from '../../utils/useString';
8
+
9
+ export const NameWithMicStatus = ({user}: {user: RenderInterface}) => {
10
+ const {primaryColor} = useContext(ColorContext);
11
+ const {height, width} = useWindowDimensions();
12
+ //commented for v1 release
13
+ //const remoteUserDefaultLabel = useString('remoteUserDefaultLabel')();
14
+ const remoteUserDefaultLabel = 'User';
15
+ return (
16
+ <>
17
+ <View style={[style.MicBackdrop]}>
18
+ <ImageIcon
19
+ name={user.audio ? 'mic' : 'micOff'}
20
+ color={user.audio ? primaryColor : 'red'}
21
+ style={style.MicIcon}
22
+ />
23
+ </View>
24
+ <View style={{flex: 1}}>
25
+ <TextWithTooltip
26
+ value={user.name || remoteUserDefaultLabel}
27
+ style={[
28
+ style.name,
29
+ {
30
+ fontSize: RFValue(14, height > width ? height : width),
31
+ },
32
+ ]}
33
+ />
34
+ </View>
35
+ </>
36
+ );
37
+ };
38
+
39
+ const style = StyleSheet.create({
40
+ name: {
41
+ color: $config.PRIMARY_FONT_COLOR,
42
+ lineHeight: 25,
43
+ fontWeight: '700',
44
+ flexShrink: 1,
45
+ },
46
+ MicBackdrop: {
47
+ width: 20,
48
+ height: 20,
49
+ borderRadius: 15,
50
+ marginHorizontal: 10,
51
+ backgroundColor: $config.SECONDARY_FONT_COLOR,
52
+ display: 'flex',
53
+ alignSelf: 'center',
54
+ justifyContent: 'center',
55
+ },
56
+ MicIcon: {
57
+ width: '80%',
58
+ height: '80%',
59
+ alignSelf: 'center',
60
+ resizeMode: 'contain',
61
+ },
62
+ });
@@ -0,0 +1,52 @@
1
+ import React from 'react';
2
+ import {MaxVideoRenderer} from './VideoRenderer';
3
+ import {UidType} from '../../../agora-rn-uikit';
4
+ import {
5
+ renderComponentObjectInterface,
6
+ useFpe,
7
+ useRenderContext,
8
+ } from 'fpe-api';
9
+ import {isValidReactComponent} from '../../utils/common';
10
+
11
+ export type RenderComponentType = {[key: string]: React.FC<any>};
12
+
13
+ const DefaultRenderComponent: RenderComponentType = {
14
+ rtc: MaxVideoRenderer,
15
+ screenshare: MaxVideoRenderer,
16
+ };
17
+ interface RenderComponentProps {
18
+ uid: UidType;
19
+ }
20
+ const RenderComponent = ({uid}: RenderComponentProps) => {
21
+ const {renderList} = useRenderContext();
22
+ const FpeRenderComponent = useFpe((config) =>
23
+ typeof config?.components?.videoCall === 'object' &&
24
+ typeof config?.components?.videoCall?.customContent === 'object'
25
+ ? config?.components?.videoCall?.customContent
26
+ : undefined,
27
+ );
28
+
29
+ const getRenderComponent = (type: keyof renderComponentObjectInterface) => {
30
+ //checking FPE providing the render component and whether its valid react element
31
+ const FPEComp =
32
+ FpeRenderComponent &&
33
+ FpeRenderComponent[type] &&
34
+ isValidReactComponent(FpeRenderComponent[type])
35
+ ? FpeRenderComponent[type]
36
+ : false;
37
+ //if its valid element then return fpe comp other return the default component
38
+ if (FPEComp) {
39
+ return FPEComp;
40
+ } else {
41
+ return DefaultRenderComponent[type]
42
+ ? DefaultRenderComponent[type]
43
+ : DefaultRenderComponent['rtc'];
44
+ }
45
+ };
46
+
47
+ const RenderComp = getRenderComponent(renderList[uid]?.type);
48
+
49
+ return <RenderComp user={renderList[uid]} />;
50
+ };
51
+
52
+ export default RenderComponent;
@@ -0,0 +1,191 @@
1
+ import React, {useContext, useEffect} from 'react';
2
+ import {View, StyleSheet} from 'react-native';
3
+ import {useFpe} from 'fpe-api';
4
+ import Navbar from '../../components/Navbar';
5
+ import ParticipantsView from '../../components/ParticipantsView';
6
+ import SettingsView from '../../components/SettingsView';
7
+ import Controls from '../../components/Controls';
8
+ import Chat from '../../components/Chat';
9
+ import {SidePanelType} from '../../subComponents/SidePanelEnum';
10
+ import {isValidReactComponent, isWeb} from '../../utils/common';
11
+ import {useSidePanel} from '../../utils/useSidePanel';
12
+ import VideoComponent from './VideoComponent';
13
+ import {videoView} from '../../../theme.json';
14
+ import {
15
+ ButtonTemplateProvider,
16
+ ButtonTemplateName,
17
+ } from '../../utils/useButtonTemplate';
18
+ import SDKEvents from '../../utils/SdkEvents';
19
+ import {RtcContext} from '../../../agora-rn-uikit';
20
+ import {useMeetingInfo} from '../../components/meeting-info/useMeetingInfo';
21
+
22
+ const VideoCallScreen = () => {
23
+ const {sidePanel} = useSidePanel();
24
+ const rtc = useContext(RtcContext);
25
+ const {meetingTitle, isHost} = useMeetingInfo();
26
+ const {
27
+ ChatComponent,
28
+ VideocallComponent,
29
+ BottombarComponent,
30
+ ParticipantsComponent,
31
+ SettingsComponent,
32
+ TopbarComponent,
33
+ VideocallBeforeView,
34
+ VideocallAfterView,
35
+ } = useFpe((data) => {
36
+ let components: {
37
+ VideocallComponent?: React.ComponentType;
38
+ ChatComponent: React.ComponentType;
39
+ BottombarComponent: React.ComponentType;
40
+ ParticipantsComponent: React.ComponentType;
41
+ SettingsComponent: React.ComponentType;
42
+ TopbarComponent: React.ComponentType;
43
+ VideocallBeforeView: React.ComponentType;
44
+ VideocallAfterView: React.ComponentType;
45
+ } = {
46
+ BottombarComponent: Controls,
47
+ TopbarComponent: Navbar,
48
+ ChatComponent: Chat,
49
+ ParticipantsComponent: ParticipantsView,
50
+ SettingsComponent: SettingsView,
51
+ VideocallAfterView: React.Fragment,
52
+ VideocallBeforeView: React.Fragment,
53
+ };
54
+ if (
55
+ data?.components?.videoCall &&
56
+ typeof data?.components?.videoCall !== 'object' &&
57
+ isValidReactComponent(data?.components?.videoCall)
58
+ ) {
59
+ components.VideocallComponent = data?.components?.videoCall;
60
+ }
61
+ if (
62
+ data?.components?.videoCall &&
63
+ typeof data?.components?.videoCall === 'object'
64
+ ) {
65
+ // commented for v1 release
66
+ // if (
67
+ // data?.components?.videoCall?.after &&
68
+ // isValidReactComponent(data?.components?.videoCall?.after)
69
+ // ) {
70
+ // components.VideocallAfterView = data?.components?.videoCall?.after;
71
+ // }
72
+
73
+ // commented for v1 release
74
+ // if (
75
+ // data?.components?.videoCall?.before &&
76
+ // isValidReactComponent(data?.components?.videoCall?.before)
77
+ // ) {
78
+ // components.VideocallBeforeView = data?.components?.videoCall?.before;
79
+ // }
80
+
81
+ // commented for v1 release
82
+ // if (
83
+ // data?.components?.videoCall.chat &&
84
+ // typeof data?.components?.videoCall.chat !== 'object' &&
85
+ // isValidReactComponent(data?.components?.videoCall.chat)
86
+ // ) {
87
+ // components.ChatComponent = data?.components?.videoCall.chat;
88
+ // }
89
+
90
+ if (
91
+ data?.components?.videoCall.bottomBar &&
92
+ typeof data?.components?.videoCall.bottomBar !== 'object' &&
93
+ isValidReactComponent(data?.components?.videoCall.bottomBar)
94
+ ) {
95
+ components.BottombarComponent = data?.components?.videoCall.bottomBar;
96
+ }
97
+
98
+ // commented for v1 release
99
+ // if (
100
+ // data?.components?.videoCall.topBar &&
101
+ // typeof data?.components?.videoCall.topBar !== 'object' &&
102
+ // isValidReactComponent(data?.components?.videoCall.topBar)
103
+ // ) {
104
+ // components.TopbarComponent = data?.components?.videoCall.topBar;
105
+ // }
106
+
107
+ if (
108
+ data?.components?.videoCall.participantsPanel &&
109
+ typeof data?.components?.videoCall.participantsPanel !== 'object' &&
110
+ isValidReactComponent(data?.components?.videoCall.participantsPanel)
111
+ ) {
112
+ components.ParticipantsComponent =
113
+ data?.components?.videoCall.participantsPanel;
114
+ }
115
+
116
+ // commented for v1 release
117
+ // if (
118
+ // data?.components?.videoCall.settingsPanel &&
119
+ // typeof data?.components?.videoCall.settingsPanel !== 'object' &&
120
+ // isValidReactComponent(data?.components?.videoCall.settingsPanel)
121
+ // ) {
122
+ // components.SettingsComponent =
123
+ // data?.components?.videoCall.settingsPanel;
124
+ // }
125
+ }
126
+
127
+ return components;
128
+ });
129
+
130
+ useEffect(() => {
131
+ new Promise((res) =>
132
+ rtc.RtcEngine.getDevices(function (devices: MediaDeviceInfo[]) {
133
+ res(devices);
134
+ }),
135
+ ).then((devices: MediaDeviceInfo[]) => {
136
+ SDKEvents.emit('join', meetingTitle, devices, isHost);
137
+ });
138
+ }, []);
139
+
140
+ return VideocallComponent ? (
141
+ <VideocallComponent />
142
+ ) : (
143
+ <>
144
+ <VideocallBeforeView />
145
+ <View style={style.full}>
146
+ <ButtonTemplateProvider
147
+ value={{buttonTemplateName: ButtonTemplateName.topBar}}>
148
+ <TopbarComponent />
149
+ </ButtonTemplateProvider>
150
+ <View style={[style.videoView, {backgroundColor: '#ffffff00'}]}>
151
+ <VideoComponent />
152
+ {sidePanel === SidePanelType.Participants ? (
153
+ <ParticipantsComponent />
154
+ ) : (
155
+ <></>
156
+ )}
157
+ {sidePanel === SidePanelType.Chat ? (
158
+ $config.CHAT ? (
159
+ <ChatComponent />
160
+ ) : (
161
+ <></>
162
+ )
163
+ ) : (
164
+ <></>
165
+ )}
166
+ {sidePanel === SidePanelType.Settings ? <SettingsComponent /> : <></>}
167
+ </View>
168
+ {!isWeb && sidePanel === SidePanelType.Chat ? (
169
+ <></>
170
+ ) : (
171
+ <ButtonTemplateProvider
172
+ value={{buttonTemplateName: ButtonTemplateName.bottomBar}}>
173
+ <BottombarComponent />
174
+ </ButtonTemplateProvider>
175
+ )}
176
+ </View>
177
+ <VideocallAfterView />
178
+ </>
179
+ );
180
+ };
181
+ export default VideoCallScreen;
182
+ //change these to inline styles or sth
183
+ const style = StyleSheet.create({
184
+ full: {
185
+ flex: 1,
186
+ flexDirection: 'column',
187
+ overflow: 'hidden',
188
+ },
189
+ //@ts-ignore
190
+ videoView: videoView,
191
+ });
@@ -0,0 +1,34 @@
1
+ import React, {useEffect, useState} from 'react';
2
+ import useCustomLayout from './CustomLayout';
3
+ import {isArray, isValidReactComponent} from '../../utils/common';
4
+ import {useLayout} from '../../utils/useLayout';
5
+ import {useRenderContext} from 'fpe-api';
6
+
7
+ const VideoComponent = () => {
8
+ const [layout, setLayoutIndex] = useState(0);
9
+ const fpeLayouts = useCustomLayout();
10
+ const {activeLayoutName} = useLayout();
11
+ const {renderPosition} = useRenderContext();
12
+ useEffect(() => {
13
+ if (isArray(fpeLayouts)) {
14
+ let index = fpeLayouts.findIndex(
15
+ (item) => item.name === activeLayoutName,
16
+ );
17
+ if (index >= 0) {
18
+ setLayoutIndex(index);
19
+ }
20
+ }
21
+ }, [activeLayoutName]);
22
+
23
+ if (
24
+ fpeLayouts &&
25
+ fpeLayouts[layout] &&
26
+ isValidReactComponent(fpeLayouts[layout].component)
27
+ ) {
28
+ const CurrentLayout = fpeLayouts[layout].component;
29
+ return <CurrentLayout renderData={renderPosition} />;
30
+ } else {
31
+ return <></>;
32
+ }
33
+ };
34
+ export default VideoComponent;
@@ -0,0 +1,86 @@
1
+ import React, {useContext} from 'react';
2
+ import {View, StyleSheet} from 'react-native';
3
+ import {RenderInterface, UidType} from '../../../agora-rn-uikit';
4
+ import ScreenShareNotice from '../../subComponents/ScreenShareNotice';
5
+ import {MaxVideoView} from '../../../agora-rn-uikit';
6
+ import FallbackLogo from '../../subComponents/FallbackLogo';
7
+ import ColorContext from '../../components/ColorContext';
8
+ import {NetworkQualityPill} from '../../subComponents/NetworkQualityPill';
9
+ import {NameWithMicStatus} from './NameWithMicStatus';
10
+
11
+ interface MaxVideoRendererInterface {
12
+ user: RenderInterface;
13
+ }
14
+ const MaxVideoRenderer: React.FC<MaxVideoRendererInterface> = ({user}) => {
15
+ const {primaryColor} = useContext(ColorContext);
16
+ return (
17
+ <View style={maxStyle.container}>
18
+ <ScreenShareNotice uid={user.uid} />
19
+ <NetworkQualityPill
20
+ user={user}
21
+ primaryColor={primaryColor}
22
+ rootStyle={{
23
+ marginLeft: 25,
24
+ top: 8,
25
+ right: 10,
26
+ }}
27
+ small
28
+ />
29
+ <MaxVideoView
30
+ fallback={() => {
31
+ return FallbackLogo(user?.name);
32
+ }}
33
+ user={user}
34
+ key={user.uid}
35
+ />
36
+ <View style={maxStyle.nameHolder}>
37
+ <NameWithMicStatus user={user} />
38
+ </View>
39
+ </View>
40
+ );
41
+ };
42
+
43
+ const maxStyle = StyleSheet.create({
44
+ container: {width: '100%', height: '100%'},
45
+ width80: {width: '80%'},
46
+ width100: {width: '100%'},
47
+ flex2: {flex: 2},
48
+ flex4: {flex: 4, backgroundColor: '#ffffff00'},
49
+ flex1: {flex: 1},
50
+ nameHolder: {
51
+ marginTop: -25,
52
+ backgroundColor: $config.SECONDARY_FONT_COLOR + 'aa',
53
+ alignSelf: 'flex-end',
54
+ paddingHorizontal: 8,
55
+ height: 25,
56
+ borderTopLeftRadius: 15,
57
+ borderBottomRightRadius: 15,
58
+ flexDirection: 'row',
59
+ zIndex: 5,
60
+ maxWidth: '100%',
61
+ },
62
+ name: {
63
+ color: $config.PRIMARY_FONT_COLOR,
64
+ lineHeight: 25,
65
+ fontWeight: '700',
66
+ flexShrink: 1,
67
+ },
68
+ MicBackdrop: {
69
+ width: 20,
70
+ height: 20,
71
+ borderRadius: 15,
72
+ marginHorizontal: 10,
73
+ backgroundColor: $config.SECONDARY_FONT_COLOR,
74
+ display: 'flex',
75
+ alignSelf: 'center',
76
+ justifyContent: 'center',
77
+ },
78
+ MicIcon: {
79
+ width: '80%',
80
+ height: '80%',
81
+ alignSelf: 'center',
82
+ resizeMode: 'contain',
83
+ },
84
+ });
85
+
86
+ export {MaxVideoRenderer};
@@ -0,0 +1,20 @@
1
+ import ParticipantsView from '../../components/ParticipantsView';
2
+ import Chat from '../../components/Chat';
3
+ import Navbar, {NavBarComponentsArray} from '../../components/Navbar';
4
+ import SettingsView from '../../components/SettingsView';
5
+ import Controls, {ControlsComponentsArray} from '../../components/Controls';
6
+ import ChatBubble from '../../subComponents/ChatBubble';
7
+ import {ChatTextInput, ChatSendButton} from '../../subComponents/ChatInput';
8
+
9
+ export {
10
+ ParticipantsView,
11
+ Chat,
12
+ Navbar,
13
+ NavBarComponentsArray,
14
+ SettingsView,
15
+ Controls,
16
+ ControlsComponentsArray,
17
+ ChatBubble,
18
+ ChatTextInput,
19
+ ChatSendButton,
20
+ };
@@ -0,0 +1,58 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2022 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+
13
+ import RtmEngine from 'agora-react-native-rtm';
14
+
15
+ class RTMEngine {
16
+ engine!: RtmEngine;
17
+ private localUID: string = '';
18
+ private channelId: string = '';
19
+
20
+ private static _instance: RTMEngine | null = null;
21
+
22
+ public static getInstance() {
23
+ if (!RTMEngine._instance) {
24
+ return new RTMEngine();
25
+ }
26
+ return RTMEngine._instance;
27
+ }
28
+
29
+ private async createClientInstance() {
30
+ await this.engine.createClient($config.APP_ID);
31
+ }
32
+
33
+ private constructor() {
34
+ if (RTMEngine._instance) {
35
+ return RTMEngine._instance;
36
+ }
37
+ RTMEngine._instance = this;
38
+ this.engine = new RtmEngine();
39
+ this.localUID = '';
40
+ this.channelId = '';
41
+ this.createClientInstance();
42
+
43
+ return RTMEngine._instance;
44
+ }
45
+
46
+ setLoginInfo(localUID: string, channelID: string) {
47
+ this.localUID = localUID;
48
+ this.channelId = channelID;
49
+ }
50
+ get localUid() {
51
+ return this.localUID;
52
+ }
53
+ get channelUid() {
54
+ return this.channelId;
55
+ }
56
+ }
57
+
58
+ export default RTMEngine;
@@ -0,0 +1,44 @@
1
+ export const hasJsonStructure = (str: string) => {
2
+ if (typeof str !== 'string') return false;
3
+ try {
4
+ const result = JSON.parse(str);
5
+ const type = Object.prototype.toString.call(result);
6
+ return type === '[object Object]' || type === '[object Array]';
7
+ } catch (err) {
8
+ return false;
9
+ }
10
+ };
11
+
12
+ export const safeJsonParse = (str: string) => {
13
+ try {
14
+ return [null, JSON.parse(str)];
15
+ } catch (err) {
16
+ return [err];
17
+ }
18
+ };
19
+
20
+ export const adjustUID = (uid: number): number => {
21
+ let adjustedUID = uid;
22
+ if (adjustedUID < 0) {
23
+ adjustedUID = uid + parseInt('0xffffffff') + 1;
24
+ }
25
+ return adjustedUID;
26
+ };
27
+
28
+ export const timeNow = () => new Date().getTime();
29
+
30
+ export const getMessageTime = (ts?: number): number => {
31
+ if (!ts) return timeNow();
32
+ try {
33
+ const timestamp = new Date(ts).getTime();
34
+ return isNaN(timestamp) ? timeNow() : timestamp;
35
+ } catch (error) {
36
+ return timeNow();
37
+ }
38
+ };
39
+
40
+ export const get32BitUid = (peerId: string) => {
41
+ let arr = new Int32Array(1);
42
+ arr[0] = parseInt(peerId);
43
+ return arr[0];
44
+ };