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
@@ -1,21 +1,18 @@
1
1
  import React, {useState, useReducer, useContext, useCallback} from 'react';
2
2
  import {
3
3
  RtcProvider,
4
- UidStateInterface,
4
+ RenderStateInterface,
5
5
  DispatchType,
6
6
  ActionType,
7
+ UidType,
7
8
  } from './Contexts/RtcContext';
8
9
  import PropsContext, {
9
10
  ToggleState,
10
- UidInterface,
11
11
  RtcPropsInterface,
12
12
  CallbacksInterface,
13
13
  DualStreamMode,
14
- ClientRole,
15
- ChannelProfile,
16
14
  } from './Contexts/PropsContext';
17
- import {MinUidProvider} from './Contexts/MinUidContext';
18
- import {MaxUidProvider} from './Contexts/MaxUidContext';
15
+ import {RenderProvider} from './Contexts/RenderContext';
19
16
  import {actionTypeGuard} from './Utils/actionTypeGuard';
20
17
 
21
18
  import {
@@ -31,23 +28,25 @@ import {
31
28
  } from './Reducer';
32
29
  import Create from './Rtc/Create';
33
30
  import Join from './Rtc/Join';
31
+ import useLocalUid from './Utils/useLocalUid';
34
32
 
35
- const RtcConfigure: React.FC<Partial<RtcPropsInterface>> = (props) => {
36
- const {callbacks, rtcProps, mode} = useContext(PropsContext);
33
+ const RtcConfigure = (props: {children: React.ReactNode}) => {
34
+ const {callbacks, rtcProps} = useContext(PropsContext);
37
35
  let [dualStreamMode, setDualStreamMode] = useState<DualStreamMode>(
38
36
  rtcProps?.initialDualStreamMode || DualStreamMode.DYNAMIC,
39
37
  );
40
-
41
- const initialLocalState: UidStateInterface = {
42
- min: [],
43
- max: [
44
- {
45
- uid: 'local',
38
+ const localUid = useLocalUid();
39
+ const initialLocalState: RenderStateInterface = {
40
+ renderList: {
41
+ [localUid]: {
42
+ uid: localUid,
46
43
  audio: ToggleState.disabled,
47
44
  video: ToggleState.disabled,
48
45
  streamType: 'high',
46
+ type: 'rtc',
49
47
  },
50
- ],
48
+ },
49
+ renderPosition: [localUid],
51
50
  };
52
51
 
53
52
  const [initialState, setInitialState] = React.useState(
@@ -58,14 +57,75 @@ const RtcConfigure: React.FC<Partial<RtcPropsInterface>> = (props) => {
58
57
  setInitialState(JSON.parse(JSON.stringify(initialLocalState)));
59
58
  }, []);
60
59
 
60
+ /**
61
+ *
62
+ * @param state RenderStateInterface
63
+ * @param action ActionType<'UpdateRenderList'>
64
+ * @returns void
65
+ *
66
+ * UpdateRenderList will update the renderlist for given uid
67
+ *
68
+ */
69
+ const UpdateRenderList = (
70
+ state: RenderStateInterface,
71
+ action: ActionType<'UpdateRenderList'>,
72
+ ) => {
73
+ const newState = {
74
+ ...state,
75
+ renderList: {
76
+ ...state.renderList,
77
+ [action.value[0]]: {
78
+ ...state.renderList[action.value[0]],
79
+ ...action.value[1],
80
+ },
81
+ },
82
+ };
83
+ return newState;
84
+ };
85
+
86
+ /**
87
+ *
88
+ * @param state RenderStateInterface
89
+ * @param action ActionType<'AddCustomContent'>
90
+ * @returns void
91
+ *
92
+ * AddCustomContent use to add new data into render position and render list
93
+ */
94
+ const AddCustomContent = (
95
+ state: RenderStateInterface,
96
+ action: ActionType<'AddCustomContent'>,
97
+ ) => {
98
+ const newState = {
99
+ ...state,
100
+ renderPosition: [...state.renderPosition, action.value[0]],
101
+ renderList: {
102
+ ...state.renderList,
103
+ [action.value[0]]: {
104
+ ...state.renderList[action.value[0]],
105
+ ...action.value[1],
106
+ },
107
+ },
108
+ };
109
+ return newState;
110
+ };
111
+
61
112
  const reducer = (
62
- state: UidStateInterface,
113
+ state: RenderStateInterface,
63
114
  action: ActionType<keyof CallbacksInterface>,
64
115
  ) => {
65
- let stateUpdate = {},
66
- uids = [...state.max, ...state.min].map((u: UidInterface) => u.uid);
116
+ let stateUpdate = {};
67
117
 
68
118
  switch (action.type) {
119
+ case 'AddCustomContent':
120
+ if (actionTypeGuard(action, action.type)) {
121
+ stateUpdate = AddCustomContent(state, action);
122
+ }
123
+ break;
124
+ case 'UpdateRenderList':
125
+ if (actionTypeGuard(action, action.type)) {
126
+ stateUpdate = UpdateRenderList(state, action);
127
+ }
128
+ break;
69
129
  case 'UpdateDualStreamMode':
70
130
  if (actionTypeGuard(action, action.type)) {
71
131
  stateUpdate = UpdateDualStreamMode(state, action);
@@ -73,7 +133,7 @@ const RtcConfigure: React.FC<Partial<RtcPropsInterface>> = (props) => {
73
133
  break;
74
134
  case 'UserJoined':
75
135
  if (actionTypeGuard(action, action.type)) {
76
- stateUpdate = UserJoined(state, action, dualStreamMode, uids);
136
+ stateUpdate = UserJoined(state, action, dualStreamMode, localUid);
77
137
  }
78
138
  break;
79
139
  case 'UserOffline':
@@ -86,6 +146,11 @@ const RtcConfigure: React.FC<Partial<RtcPropsInterface>> = (props) => {
86
146
  stateUpdate = swapVideo(state, action.value[0]);
87
147
  }
88
148
  break;
149
+ case 'DequeVideo':
150
+ if (actionTypeGuard(action, action.type)) {
151
+ stateUpdate = dequeVideo(state, action.value[0]);
152
+ }
153
+ break;
89
154
  case 'UserMuteRemoteAudio':
90
155
  if (actionTypeGuard(action, action.type)) {
91
156
  stateUpdate = UserMuteRemoteAudio(state, action);
@@ -98,12 +163,12 @@ const RtcConfigure: React.FC<Partial<RtcPropsInterface>> = (props) => {
98
163
  break;
99
164
  case 'LocalMuteAudio':
100
165
  if (actionTypeGuard(action, action.type)) {
101
- stateUpdate = LocalMuteAudio(state, action);
166
+ stateUpdate = LocalMuteAudio(state, action, localUid);
102
167
  }
103
168
  break;
104
169
  case 'LocalMuteVideo':
105
170
  if (actionTypeGuard(action, action.type)) {
106
- stateUpdate = LocalMuteVideo(state, action);
171
+ stateUpdate = LocalMuteVideo(state, action, localUid);
107
172
  }
108
173
  break;
109
174
  case 'RemoteAudioStateChanged':
@@ -137,36 +202,86 @@ const RtcConfigure: React.FC<Partial<RtcPropsInterface>> = (props) => {
137
202
  };
138
203
 
139
204
  const swapVideo = useCallback(
140
- (state: UidStateInterface, ele: UidInterface) => {
141
- let newState: UidStateInterface = {
142
- min: [],
143
- max: [],
205
+ (state: RenderStateInterface, newMaxUid: UidType) => {
206
+ let renderPosition: RenderStateInterface['renderPosition'] = [
207
+ ...state.renderPosition,
208
+ ];
209
+ let renderList: RenderStateInterface['renderList'] = {
210
+ ...state.renderList,
144
211
  };
145
- // Remove the minimized element which is being swapped out
146
- newState.min = state.min.filter((e) => e !== ele);
212
+ // Element which is currently maximized
213
+ const [currentMaxUid] = renderPosition;
147
214
 
148
- let maxEle = state.max[0]; // Element which is currently maximized
149
- let minEle = ele;
215
+ if (currentMaxUid === newMaxUid) {
216
+ return {};
217
+ }
150
218
 
151
219
  if (dualStreamMode === DualStreamMode.DYNAMIC) {
152
- maxEle.streamType = 'low'; // set stream quality to low
153
- minEle.streamType = 'high'; // set stream quality to high
154
-
220
+ renderList[currentMaxUid].streamType = 'low';
221
+ renderList[newMaxUid].streamType = 'high';
155
222
  // No need to modify the streamType if the mode is not dynamic
156
223
  }
157
224
 
158
- if (maxEle.uid === 'local') {
159
- newState.min.unshift(maxEle);
160
- } else {
161
- newState.min.push(maxEle);
225
+ /**
226
+ * old logic for swap
227
+ * if currentMaxUid === localUid then push newMaxId at first position
228
+ * else push newMaxUid at last position
229
+ */
230
+
231
+ const newMaxUidOldPosition = renderPosition.findIndex(
232
+ (i) => i === newMaxUid,
233
+ );
234
+
235
+ renderPosition[0] = newMaxUid;
236
+ renderPosition[newMaxUidOldPosition] = currentMaxUid;
237
+
238
+ return {
239
+ renderPosition: renderPosition,
240
+ renderList: renderList,
241
+ };
242
+ },
243
+ [dualStreamMode],
244
+ );
245
+
246
+ /**
247
+ * deque will
248
+ */
249
+ const dequeVideo = useCallback(
250
+ (state: RenderStateInterface, newMaxUid: UidType) => {
251
+ let renderPosition: RenderStateInterface['renderPosition'] = [
252
+ ...state.renderPosition,
253
+ ];
254
+ let renderList: RenderStateInterface['renderList'] = {
255
+ ...state.renderList,
256
+ };
257
+ // Element which is currently maximized
258
+ const [currentMaxUid] = renderPosition;
259
+
260
+ if (currentMaxUid === newMaxUid) {
261
+ return {};
262
+ }
263
+
264
+ if (dualStreamMode === DualStreamMode.DYNAMIC) {
265
+ renderList[currentMaxUid].streamType = 'low';
266
+ renderList[newMaxUid].streamType = 'high';
267
+ // No need to modify the streamType if the mode is not dynamic
162
268
  }
163
- newState.max = [minEle];
164
269
 
165
- return newState;
270
+ const minIds = renderPosition.filter(
271
+ (uid) => uid !== newMaxUid && uid !== currentMaxUid,
272
+ );
273
+
274
+ renderPosition = [newMaxUid, currentMaxUid, ...minIds];
275
+
276
+ return {
277
+ renderPosition: renderPosition,
278
+ renderList: renderList,
279
+ };
166
280
  },
167
281
  [dualStreamMode],
168
282
  );
169
- const [uidState, dispatch]: [UidStateInterface, DispatchType] = useReducer(
283
+
284
+ const [uidState, dispatch]: [RenderStateInterface, DispatchType] = useReducer(
170
285
  reducer,
171
286
  initialState,
172
287
  );
@@ -185,11 +300,13 @@ const RtcConfigure: React.FC<Partial<RtcPropsInterface>> = (props) => {
185
300
  dispatch,
186
301
  setDualStreamMode,
187
302
  }}>
188
- <MaxUidProvider value={uidState.max}>
189
- <MinUidProvider value={uidState.min}>
190
- {props.children}
191
- </MinUidProvider>
192
- </MaxUidProvider>
303
+ <RenderProvider
304
+ value={{
305
+ renderList: uidState.renderList,
306
+ renderPosition: uidState.renderPosition,
307
+ }}>
308
+ {props.children}
309
+ </RenderProvider>
193
310
  </RtcProvider>
194
311
  </Join>
195
312
  )}
@@ -0,0 +1,8 @@
1
+ import {useContext} from 'react';
2
+ import PropsContext from '../Contexts/PropsContext';
3
+
4
+ const useLocalUid = () => {
5
+ const {rtcProps} = useContext(PropsContext);
6
+ return rtcProps?.uid || 0;
7
+ };
8
+ export default useLocalUid;
@@ -1,23 +1,25 @@
1
1
  import React, {useContext} from 'react';
2
2
  import {RtcLocalView, RtcRemoteView, VideoRenderMode} from 'react-native-agora';
3
3
  import styles from '../Style';
4
- import PropsContext, {UidInterface} from '../Contexts/PropsContext';
4
+ import PropsContext, {RenderInterface} from '../Contexts/PropsContext';
5
5
  import {View} from 'react-native';
6
+ import useLocalUid from '../Utils/useLocalUid';
6
7
 
7
8
  const LocalView = RtcLocalView.SurfaceView;
8
9
  const RemoteView = RtcRemoteView.SurfaceView;
9
10
 
10
11
  interface MaxViewInterface {
11
- user: UidInterface;
12
+ user: RenderInterface;
12
13
  fallback?: React.ComponentType;
13
14
  }
14
15
 
15
16
  const MaxVideoView: React.FC<MaxViewInterface> = (props) => {
16
- const {styleProps} = useContext(PropsContext);
17
+ const {styleProps, rtcProps} = useContext(PropsContext);
17
18
  const {maxViewStyles} = styleProps || {};
18
19
  const Fallback = props.fallback;
19
-
20
- return props.user.uid === 'local' ? (
20
+ const localUid = useLocalUid();
21
+ const uid = props.user.uid === rtcProps?.screenShareUid ? 1 : props.user.uid;
22
+ return uid === localUid ? (
21
23
  props.user.video ? (
22
24
  <LocalView
23
25
  style={{...styles.fullView, ...(maxViewStyles as object)}}
@@ -31,7 +33,7 @@ const MaxVideoView: React.FC<MaxViewInterface> = (props) => {
31
33
  ) : props.user.video ? (
32
34
  <RemoteView
33
35
  style={{...styles.fullView, ...(maxViewStyles as object)}}
34
- uid={props.user.uid as number}
36
+ uid={uid as number}
35
37
  renderMode={VideoRenderMode.Fit}
36
38
  />
37
39
  ) : Fallback ? (
@@ -1,23 +1,25 @@
1
1
  import React, {useContext} from 'react';
2
2
  import {RtcLocalView, RtcRemoteView, VideoRenderMode} from 'react-native-agora';
3
3
  import styles from '../Style';
4
- import PropsContext, {UidInterface} from '../Contexts/PropsContext';
4
+ import PropsContext, {RenderInterface} from '../Contexts/PropsContext';
5
5
  import {View} from 'react-native';
6
+ import useLocalUid from '../Utils/useLocalUid';
6
7
 
7
8
  const LocalView = RtcLocalView.SurfaceView;
8
9
  const RemoteView = RtcRemoteView.SurfaceView;
9
10
 
10
11
  interface MaxViewInterface {
11
- user: UidInterface;
12
+ user: RenderInterface;
12
13
  fallback?: React.ComponentType;
13
14
  }
14
15
 
15
16
  const MaxVideoView: React.FC<MaxViewInterface> = (props) => {
16
- const {styleProps} = useContext(PropsContext);
17
+ const {styleProps, rtcProps} = useContext(PropsContext);
17
18
  const {maxViewStyles} = styleProps || {};
18
19
  const Fallback = props.fallback;
19
-
20
- return props.user.uid === 'local' ? (
20
+ const localUid = useLocalUid();
21
+ const uid = props.user.uid === rtcProps?.screenShareUid ? 1 : props.user.uid;
22
+ return uid === localUid ? (
21
23
  props.user.video ? (
22
24
  <LocalView
23
25
  style={{...styles.fullView, ...(maxViewStyles as object)}}
@@ -33,7 +35,7 @@ const MaxVideoView: React.FC<MaxViewInterface> = (props) => {
33
35
  <div style={{flex: 1, display: props.user.video ? 'flex' : 'none'}}>
34
36
  <RemoteView
35
37
  style={{...styles.fullView, ...(maxViewStyles as object)}}
36
- uid={props.user.uid as number}
38
+ uid={uid as number}
37
39
  renderMode={VideoRenderMode.Fit}
38
40
  />
39
41
  </div>
@@ -4,29 +4,31 @@ import {RtcLocalView, RtcRemoteView, VideoRenderMode} from 'react-native-agora';
4
4
  import styles from '../Style';
5
5
  import icons from '../Controls/Icons';
6
6
  import RemoteControls from '../Controls/RemoteControls';
7
- import PropsContext, {UidInterface} from '../Contexts/PropsContext';
7
+ import PropsContext, {RenderInterface} from '../Contexts/PropsContext';
8
+ import useLocalUid from '../Utils/useLocalUid';
8
9
 
9
10
  const LocalView = RtcLocalView.SurfaceView;
10
11
  const RemoteView = RtcRemoteView.SurfaceView;
11
12
 
12
13
  interface MinViewInterface {
13
- user: UidInterface;
14
+ user: RenderInterface;
14
15
  color?: string;
15
16
  showOverlay?: boolean;
16
17
  }
17
18
 
18
19
  const MinVideoView: React.FC<MinViewInterface> = (props) => {
19
20
  const [overlay, setOverlay] = useState(false);
20
- const {styleProps} = useContext(PropsContext);
21
+ const {styleProps, rtcProps} = useContext(PropsContext);
21
22
  const {minViewStyles, theme, remoteBtnStyles} = styleProps || {};
22
23
  const {minCloseBtnStyles} = remoteBtnStyles || {};
23
24
  const {showOverlay} = props || {};
24
-
25
+ const localUid = useLocalUid();
26
+ const uid = props.user.uid === rtcProps?.screenShareUid ? 1 : props.user.uid;
25
27
  return (
26
28
  <View style={{margin: 5}}>
27
29
  {showOverlay ? (
28
30
  <TouchableOpacity onPress={() => setOverlay(true)}>
29
- {props.user.uid === 'local' ? (
31
+ {uid === localUid ? (
30
32
  props.user.video ? (
31
33
  <LocalView
32
34
  style={{...styles.minView, ...(minViewStyles as object)}}
@@ -34,18 +36,25 @@ const MinVideoView: React.FC<MinViewInterface> = (props) => {
34
36
  zOrderMediaOverlay={true}
35
37
  />
36
38
  ) : (
37
- <View style={{flex: 1, backgroundColor: '#f0f', ...styles.minView, ...(minViewStyles as object)}} />
39
+ <View
40
+ style={{
41
+ flex: 1,
42
+ backgroundColor: '#f0f',
43
+ ...styles.minView,
44
+ ...(minViewStyles as object),
45
+ }}
46
+ />
38
47
  )
39
48
  ) : (
40
49
  <RemoteView
41
50
  style={{...styles.minView, ...(minViewStyles as object)}}
42
- uid={props.user.uid as number}
51
+ uid={uid as number}
43
52
  renderMode={VideoRenderMode.Hidden}
44
53
  zOrderMediaOverlay={true}
45
54
  />
46
55
  )}
47
56
  </TouchableOpacity>
48
- ) : props.user.uid === 'local' ? (
57
+ ) : uid === localUid ? (
49
58
  <LocalView
50
59
  style={{...styles.minView, ...(minViewStyles as object)}}
51
60
  renderMode={VideoRenderMode.Hidden}
@@ -54,7 +63,7 @@ const MinVideoView: React.FC<MinViewInterface> = (props) => {
54
63
  ) : (
55
64
  <RemoteView
56
65
  style={{...styles.minView, ...(minViewStyles as object)}}
57
- uid={props.user.uid as number}
66
+ uid={uid as number}
58
67
  renderMode={VideoRenderMode.Hidden}
59
68
  zOrderMediaOverlay={true}
60
69
  />
@@ -11,15 +11,10 @@ export {
11
11
  LocalContext,
12
12
  } from './Contexts/LocalUserContext';
13
13
  export {
14
- default as MaxUidContext,
15
- MaxUidConsumer,
16
- MaxUidProvider,
17
- } from './Contexts/MaxUidContext';
18
- export {
19
- default as MinUidContext,
20
- MinUidConsumer,
21
- MinUidProvider,
22
- } from './Contexts/MinUidContext';
14
+ default as RenderContext,
15
+ RenderConsumer,
16
+ RenderProvider,
17
+ } from './Contexts/RenderContext';
23
18
 
24
19
  export {
25
20
  default as PropsContext,
@@ -29,9 +24,11 @@ export {
29
24
 
30
25
  export {DualStreamMode} from './Contexts/PropsContext';
31
26
 
27
+ export {ToggleState} from './Contexts/PropsContext';
28
+
32
29
  export type {
33
- UidInterface,
34
- ToggleState,
30
+ DefaultRenderInterface,
31
+ RenderInterface,
35
32
  RtcPropsInterface,
36
33
  CallbacksInterface,
37
34
  CustomCallbacksInterface,
@@ -46,14 +43,16 @@ export {
46
43
  RtcProvider,
47
44
  } from './Contexts/RtcContext';
48
45
  export type {
46
+ UidType,
49
47
  RtcContextInterface,
50
48
  DispatchType,
51
- UidStateInterface,
49
+ RenderStateInterface,
52
50
  ActionInterface,
53
51
  ActionType,
54
52
  } from './Contexts/RtcContext';
55
53
 
56
54
  export {default as BtnTemplate} from './Controls/BtnTemplate';
55
+ export type {BtnTemplateInterface} from './Controls/BtnTemplate';
57
56
  export {default as Endcall} from './Controls/Local/EndCall';
58
57
  export {default as FullScreen} from './Controls/Local/FullScreen';
59
58
  export {default as LocalAudioMute} from './Controls/Local/LocalAudioMute';
@@ -67,3 +66,4 @@ export {default as RemoteVideoMute} from './Controls/Remote/RemoteVideoMute';
67
66
  export {default as RemoteControls} from './Controls/RemoteControls';
68
67
 
69
68
  export {default as ImageIcon} from './Controls/ImageIcon';
69
+ export {default as useLocalUid} from './Utils/useLocalUid';
@@ -10,8 +10,24 @@
10
10
  *********************************************
11
11
  */
12
12
  const configVars = require('./configTransform');
13
+ const getFpePath = require('./fpe.config');
14
+
13
15
  // This file is read only by react native for IOS & Android. Doesn't apply to electron, Web targets
14
16
  module.exports = {
15
17
  presets: ['module:metro-react-native-babel-preset'],
16
- plugins: [['transform-define', configVars]],
18
+ plugins: [
19
+ ['transform-define', configVars],
20
+ [
21
+ require.resolve('babel-plugin-module-resolver'),
22
+ {
23
+ root: ["./"],
24
+ alias: {
25
+ "fpe-api/install": "./fpe-api/install.ts",
26
+ "fpe-api": "./fpe-api/index.ts",
27
+ "fpe-implementation": "./fpe-implementation/index.ts",
28
+ "test-fpe": getFpePath()
29
+ }
30
+ }
31
+ ]
32
+ ],
17
33
  };