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,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,12 @@
1
+ import React from 'react';
2
+ import {useFpe} from 'fpe-api';
3
+
4
+ const CustomUserContextHolder: React.FC<{children: any}> = (props) => {
5
+ //commented for v1 release
6
+ // const fpeCustomContext = useFpe((config) => config?.customUserContext);
7
+ // if (fpeCustomContext) {
8
+ // fpeCustomContext();
9
+ // }
10
+ return props.children;
11
+ };
12
+ 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,28 @@
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();