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
@@ -1,36 +1,21 @@
1
- import React, {
2
- createContext,
3
- useContext,
4
- useEffect,
5
- useRef,
6
- useState,
7
- } from 'react';
8
- import {useParams} from '../../components/Router';
9
- import ChatContext from '../../components/ChatContext';
1
+ import React, {useContext, useEffect, useRef, useState} from 'react';
2
+ import {RtcContext, PropsContext, UidType} from '../../../agora-rn-uikit';
3
+ import {ScreenshareContext} from './useScreenshare';
10
4
  import {
11
- RtcContext,
12
- PropsContext,
13
- MinUidContext,
14
- MaxUidContext,
15
- } from '../../../agora-rn-uikit/src';
16
- import Layout from '../LayoutEnum';
17
- import {gql, useMutation} from '@apollo/client';
18
- import ScreenshareContext from './ScreenshareContext';
5
+ useChangeDefaultLayout,
6
+ useSetPinnedLayout,
7
+ } from '../../pages/video-call/DefaultLayouts';
8
+ import {useRecording} from '../recording/useRecording';
9
+ import {useScreenContext} from '../../components/contexts/ScreenShareContext';
10
+ import useUserList from '../../utils/useUserList';
11
+ import CustomEvents, {EventLevel} from '../../custom-events';
12
+ import {EventNames} from '../../rtm-events';
13
+ import {IAgoraRTC} from 'agora-rtc-sdk-ng';
14
+ import useRecordingLayoutQuery from '../recording/useRecordingLayoutQuery';
15
+ import {useString} from '../../utils/useString';
19
16
 
20
- const SET_PRESENTER = gql`
21
- mutation setPresenter($uid: Int!, $passphrase: String!) {
22
- setPresenter(uid: $uid, passphrase: $passphrase)
23
- }
24
- `;
25
-
26
- const SET_NORMAL = gql`
27
- mutation setNormal($passphrase: String!) {
28
- setNormal(passphrase: $passphrase)
29
- }
30
- `;
31
-
32
- function usePrevious(value: any) {
33
- const ref = useRef();
17
+ function usePrevious<T = any>(value: any) {
18
+ const ref = useRef<T>();
34
19
  useEffect(() => {
35
20
  ref.current = value;
36
21
  });
@@ -39,159 +24,133 @@ function usePrevious(value: any) {
39
24
 
40
25
  export const ScreenshareContextConsumer = ScreenshareContext.Consumer;
41
26
 
42
- export const ScreenshareConfigure = (props: any) => {
43
- const {userList} = useContext(ChatContext);
44
- const [screenshareActive, setScreenshareActive] = useState(false);
27
+ export const ScreenshareConfigure = (props: {children: React.ReactNode}) => {
28
+ const [isScreenshareActive, setScreenshareActive] = useState(false);
45
29
  const rtc = useContext(RtcContext);
46
30
  const {dispatch} = rtc;
47
- const max = useContext(MaxUidContext);
48
- const min = useContext(MinUidContext);
49
- const users = [...max, ...min];
50
- const prevUsers = usePrevious({users});
51
- const {phrase} = useParams<any>();
52
- const {setLayout, recordingActive} = props;
31
+ const {renderList, renderPosition} = useUserList();
32
+ const {isRecordingActive} = useRecording();
33
+ const {executeNormalQuery, executePresenterQuery} = useRecordingLayoutQuery();
34
+ const {setScreenShareData, screenShareData} = useScreenContext();
35
+ // commented for v1 release
36
+ // const getScreenShareName = useString('screenshareUserName');
37
+ // const userText = useString('remoteUserDefaultLabel')();
38
+ const getScreenShareName = (name: string) => `${name}'s screenshare`;
39
+ const userText = 'User';
40
+ const setPinnedLayout = useSetPinnedLayout();
41
+ const changeLayout = useChangeDefaultLayout();
42
+
43
+ const prevRenderPosition = usePrevious<{renderPosition: UidType[]}>({
44
+ renderPosition,
45
+ });
53
46
  const {channel, appId, screenShareUid, screenShareToken, encryption} =
54
47
  useContext(PropsContext).rtcProps;
55
48
 
56
- const [setPresenterQuery] = useMutation(SET_PRESENTER);
57
- const [setNormalQuery] = useMutation(SET_NORMAL);
49
+ const renderListRef = useRef({renderList: renderList});
50
+
51
+ useEffect(() => {
52
+ renderListRef.current.renderList = renderList;
53
+ }, [renderList]);
54
+
55
+ const triggerChangeLayout = (pinned: boolean, screenShareUid?: UidType) => {
56
+ //screenshare is started set the layout to Pinned View
57
+ if (pinned && screenShareUid) {
58
+ dispatch({
59
+ type: 'SwapVideo',
60
+ value: [screenShareUid],
61
+ });
62
+ setPinnedLayout();
63
+ }
64
+ //screenshare is stopped set the layout Grid View
65
+ else {
66
+ changeLayout();
67
+ }
68
+ };
58
69
 
59
70
  useEffect(() => {
71
+ CustomEvents.on(EventNames.SCREENSHARE_ATTRIBUTE, (data) => {
72
+ const screenUidOfUser =
73
+ renderListRef.current.renderList[data.sender].screenUid;
74
+ setScreenShareData((prevState) => {
75
+ return {
76
+ ...prevState,
77
+ [screenUidOfUser]: {
78
+ name: renderListRef.current.renderList[screenUidOfUser]?.name,
79
+ isActive: data.payload.value === 'true' ? true : false,
80
+ },
81
+ };
82
+ });
83
+ //if remote user started/stopped the screenshare then change the layout to pinned/grid
84
+ data.payload.value === 'true'
85
+ ? triggerChangeLayout(true, screenUidOfUser)
86
+ : triggerChangeLayout(false);
87
+ });
88
+ }, []);
89
+
90
+ useEffect(() => {
91
+ // @ts-ignore
60
92
  rtc.RtcEngine.addListener('ScreenshareStopped', () => {
61
93
  setScreenshareActive(false);
62
94
  console.log('STOPPED SHARING');
63
- setLayout((l: Layout) =>
64
- l === Layout.Pinned ? Layout.Grid : Layout.Pinned,
65
- );
66
- setNormalQuery({variables: {passphrase: phrase}})
67
- .then((res) => {
68
- console.log(res.data);
69
- if (res.data.stopRecordingSession === 'success') {
70
- }
71
- })
72
- .catch((err) => {
73
- console.log(err);
74
- });
95
+ executeNormalQuery();
96
+ CustomEvents.send(EventNames.SCREENSHARE_ATTRIBUTE, {
97
+ value: `${false}`,
98
+ level: EventLevel.LEVEL2,
99
+ });
100
+ //if local user stopped the screenshare then change layout to grid
101
+ triggerChangeLayout(false);
75
102
  });
76
103
  }, []);
77
104
 
78
- useEffect(() => {
79
- if (prevUsers !== undefined) {
80
- let joinedUser = users.filter((person) =>
81
- prevUsers?.users.every((person2) => !(person2.uid === person.uid)),
82
- );
83
- let leftUser = prevUsers?.users.filter((person) =>
84
- users.every((person2) => !(person2.uid === person.uid)),
85
- );
86
-
87
- if (joinedUser.length === 1) {
88
- const newUserUid = joinedUser[0].uid;
89
- // identify remote user screen type, if screen share, swap to PIN
90
- if (userList[newUserUid] && userList[newUserUid].type === 1) {
91
- dispatch({
92
- type: 'SwapVideo',
93
- value: [joinedUser[0]],
94
- });
95
- setLayout(Layout.Pinned);
96
- } else if (newUserUid === 1) {
97
- // identify local user screen type
98
- if (newUserUid !== users[0].uid) {
99
- // if not already maximized
100
- dispatch({
101
- type: 'SwapVideo',
102
- value: [joinedUser[0]],
103
- });
104
- }
105
- setLayout(Layout.Pinned);
106
- }
107
- }
108
-
109
- if (leftUser.length === 1) {
110
- const leftUserUid = leftUser[0].uid;
111
- if (userList[leftUserUid] && userList[leftUserUid].type === 1) {
112
- setLayout((l: Layout) =>
113
- l === Layout.Pinned ? Layout.Grid : Layout.Pinned,
114
- );
115
- }
116
- }
117
- }
118
- }, [users, userList]);
119
-
120
105
  const executeRecordingQuery = (isScreenActive: boolean) => {
121
106
  if (!isScreenActive) {
122
107
  // If screen share is not going on, start the screen share by executing the graphql query
123
- setPresenterQuery({
124
- variables: {
125
- uid: screenShareUid,
126
- passphrase: phrase,
127
- },
128
- })
129
- .then((res) => {
130
- if (res.data.setPresenter === 'success') {
131
- }
132
- })
133
- .catch((err) => {
134
- console.log(err);
135
- });
108
+ executePresenterQuery();
136
109
  } else {
137
110
  // If recording is already going on, stop the recording by executing the graphql query.
138
- setNormalQuery({variables: {passphrase: phrase}})
139
- .then((res) => {
140
- console.log(res.data);
141
- if (res.data.stopRecordingSession === 'success') {
142
- }
143
- })
144
- .catch((err) => {
145
- console.log(err);
146
- });
111
+ executeNormalQuery();
147
112
  }
148
113
  };
149
114
 
150
115
  const stopUserScreenShare = () => {
151
- if (screenshareActive) {
116
+ if (isScreenshareActive) {
152
117
  startUserScreenshare();
153
118
  }
154
119
  };
155
120
 
156
121
  const startUserScreenshare = async () => {
157
- const isScreenActive = screenshareActive;
158
- if (recordingActive) {
122
+ const isScreenActive = isScreenshareActive;
123
+ if (isRecordingActive) {
159
124
  executeRecordingQuery(isScreenActive);
160
125
  }
161
126
  try {
127
+ // @ts-ignore
162
128
  await rtc.RtcEngine.startScreenshare(
163
129
  screenShareToken,
164
130
  channel,
165
131
  null,
166
132
  screenShareUid,
167
133
  appId,
168
- rtc.RtcEngine,
169
- encryption,
134
+ rtc.RtcEngine as unknown as IAgoraRTC,
135
+ encryption as unknown as any,
170
136
  );
171
137
  !isScreenActive && setScreenshareActive(true);
172
138
  } catch (e) {
173
139
  console.error("can't start the screen share", e);
174
- setNormalQuery({variables: {passphrase: phrase}})
175
- .then((res) => {
176
- console.log(res.data);
177
- if (res.data.stopRecordingSession === 'success') {
178
- // Once the backend sucessfuly stops recording,
179
- // send a control message to everbody in the channel indicating that cloud recording is now inactive.
180
- // sendControlMessage(controlMessageEnum.cloudRecordingUnactive);
181
- // set the local recording state to false to update the UI
182
- // setScreenshareActive(false);
183
- }
184
- })
185
- .catch((err) => {
186
- console.log(err);
187
- });
140
+ executeNormalQuery();
188
141
  }
142
+ CustomEvents.send(EventNames.SCREENSHARE_ATTRIBUTE, {
143
+ value: `${true}`,
144
+ level: EventLevel.LEVEL2,
145
+ });
146
+ //if local user started the screenshare then change layout to pinned
147
+ triggerChangeLayout(true, screenShareUid);
189
148
  };
190
149
 
191
150
  return (
192
151
  <ScreenshareContext.Provider
193
152
  value={{
194
- screenshareActive,
153
+ isScreenshareActive,
195
154
  startUserScreenshare,
196
155
  stopUserScreenShare,
197
156
  }}>
@@ -0,0 +1,29 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import {createContext} from 'react';
13
+ import {createHook} from 'fpe-implementation';
14
+
15
+ export interface ScreenshareContextInterface {
16
+ isScreenshareActive: boolean;
17
+ startUserScreenshare: () => void;
18
+ stopUserScreenShare: () => void;
19
+ }
20
+
21
+ export const ScreenshareContext = createContext<ScreenshareContextInterface>({
22
+ isScreenshareActive: false,
23
+ startUserScreenshare: () => {},
24
+ stopUserScreenShare: () => {},
25
+ });
26
+
27
+ const useScreenshare = createHook(ScreenshareContext);
28
+
29
+ export {useScreenshare};
@@ -9,32 +9,37 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
+ // @ts-nocheck
12
13
  import React from 'react';
13
14
  import {Platform} from 'react-native';
14
- import Toast, { BaseToast } from '../../react-native-toast-message';
15
- import mobileAndTabletCheck from '../utils/mobileWebTest';
15
+ import Toast, {BaseToast} from '../../react-native-toast-message';
16
+ import isMobileOrTablet from '../utils/isMobileOrTablet';
16
17
 
17
18
  const toastConfig = {
18
- /*
19
+ /*
19
20
  overwrite 'success' type,
20
21
  modifying the existing `BaseToast` component
21
22
  */
22
- success: ({ text1, text2, props, ...rest }) => (
23
- <BaseToast
24
- {...rest}
25
- //BaseToast is modified to have zIndex: 100
26
- style={{ borderLeftColor: $config.PRIMARY_COLOR, backgroundColor: $config.SECONDARY_FONT_COLOR, width: !mobileAndTabletCheck() ? '40%' : '95%'}}
27
- contentContainerStyle={{ paddingHorizontal: 15, overflow: 'hidden'}}
28
- text1Style={{
29
- fontSize: 15,
30
- fontWeight: '400',
31
- color: $config.PRIMARY_FONT_COLOR
32
- }}
33
- text1={text1}
34
- text2={text2}
35
- // text2={props.uuid}
36
- />
37
- ),
23
+ success: ({text1, text2, props, ...rest}) => (
24
+ <BaseToast
25
+ {...rest}
26
+ //BaseToast is modified to have zIndex: 100
27
+ style={{
28
+ borderLeftColor: $config.PRIMARY_COLOR,
29
+ backgroundColor: $config.SECONDARY_FONT_COLOR,
30
+ width: !isMobileOrTablet() ? '40%' : '95%',
31
+ }}
32
+ contentContainerStyle={{paddingHorizontal: 15, overflow: 'hidden'}}
33
+ text1Style={{
34
+ fontSize: 15,
35
+ fontWeight: '400',
36
+ color: $config.PRIMARY_FONT_COLOR,
37
+ }}
38
+ text1={text1}
39
+ text2={text2}
40
+ // text2={props.uuid}
41
+ />
42
+ ),
38
43
  };
39
44
 
40
- export default toastConfig;
45
+ export default toastConfig;
@@ -0,0 +1,34 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import {useMeetingInfo} from '../components/meeting-info/useMeetingInfo';
13
+ import {useLiveStreamDataContext} from '../components/contexts/LiveStreamDataContext';
14
+ import {UidType} from '../../agora-rn-uikit';
15
+
16
+ function useIsAttendee() {
17
+ if ($config.EVENT_MODE) {
18
+ const {audienceUids} = useLiveStreamDataContext();
19
+ const isAttendee = (uid: UidType) => {
20
+ return audienceUids.filter((audienceUid) => audienceUid === uid).length
21
+ ? true
22
+ : false;
23
+ };
24
+ return isAttendee;
25
+ } else {
26
+ const {isHost} = useMeetingInfo();
27
+ const isAttendee = (uid: UidType) => {
28
+ return !isHost ? true : false;
29
+ };
30
+ return isAttendee;
31
+ }
32
+ }
33
+
34
+ export default useIsAttendee;
@@ -0,0 +1,68 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ /**
13
+ * @format
14
+ */
15
+ type callBackType = (...args: any[]) => void;
16
+ import {userEventsMapInterface} from '../SDKAppWrapper';
17
+
18
+ interface eventsMapInterface extends userEventsMapInterface {
19
+ addFpe: callBackType;
20
+ joinMeetingWithPhrase: (phrase: string) => void;
21
+ }
22
+ interface SDKEventsInterface {
23
+ eventsMap: eventsMapInterface;
24
+ eventSubs: {[key in keyof eventsMapInterface]: any};
25
+ emit: (eventName: keyof eventsMapInterface, ...args: any) => void;
26
+ on: (eventName: keyof eventsMapInterface, cb: callBackType) => void;
27
+ off: (eventName: keyof eventsMapInterface) => void;
28
+ }
29
+
30
+ const SDKEvents: SDKEventsInterface = {
31
+ eventsMap: {
32
+ addFpe: () => {},
33
+ joinMeetingWithPhrase: (p) => {},
34
+ leave: () => {},
35
+ create: () => {},
36
+ preJoin: () => {},
37
+ join: () => {},
38
+ },
39
+ eventSubs: {
40
+ addFpe: null,
41
+ joinMeetingWithPhrase: null,
42
+ leave: null,
43
+ create: null,
44
+ preJoin: null,
45
+ join: null,
46
+ },
47
+ on: function (eventName, cb) {
48
+ console.log(
49
+ 'DEBUG(aditya)-SDKEvents: event registered:',
50
+ eventName,
51
+ );
52
+ this.eventsMap[eventName] = cb;
53
+ if (this.eventSubs[eventName]) {
54
+ cb(...this.eventSubs[eventName]);
55
+ }
56
+ },
57
+ emit: function (eventName, ...args) {
58
+ console.log('DEBUG(aditya)-SDKEvents: emit called:', eventName, ...args);
59
+ this.eventsMap[eventName](...args);
60
+ this.eventSubs[eventName] = args;
61
+ },
62
+ off: function (eventName) {
63
+ console.log('DEBUG(aditya)-SDKEvents: event deregistered:', eventName);
64
+ this.eventSubs[eventName] = null;
65
+ },
66
+ };
67
+
68
+ export default SDKEvents;
@@ -0,0 +1,40 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import React from 'react';
13
+ import {Platform} from 'react-native';
14
+ import * as ReactIs from 'react-is';
15
+
16
+ const isValidReactComponent = <T,>(Component?: React.ComponentType<T>) =>
17
+ Component && ReactIs.isValidElementType(Component) ? true : false;
18
+
19
+ const hasBrandLogo: boolean = !!$config.LOGO;
20
+
21
+ const shouldAuthenticate: boolean =
22
+ $config.ENABLE_APPLE_OAUTH ||
23
+ $config.ENABLE_GOOGLE_OAUTH ||
24
+ $config.ENABLE_MICROSOFT_OAUTH ||
25
+ $config.ENABLE_SLACK_OAUTH;
26
+
27
+ const isWeb = Platform.OS === 'web';
28
+ const isAndroid = Platform.OS === 'android';
29
+ const isIOS = Platform.OS === 'ios';
30
+ const isArray = (data: any[]) =>
31
+ data && Array.isArray(data) && data.length ? true : false ? true : false;
32
+ export {
33
+ hasBrandLogo,
34
+ shouldAuthenticate,
35
+ isWeb,
36
+ isIOS,
37
+ isAndroid,
38
+ isArray,
39
+ isValidReactComponent,
40
+ };
@@ -0,0 +1,29 @@
1
+ function EventEmitter(this: any) {
2
+ // key: eventName,
3
+ // value: An array of callback functions with the same eventName
4
+ this.events = new Map();
5
+
6
+ return {
7
+ on: (eventName: string, callback: Function) => {
8
+ if (this.events.has(eventName)) {
9
+ throw new Error(`Event with ${eventName} is already registered`);
10
+ }
11
+ //if eventName does not exist, add
12
+ console.log('on', eventName, callback);
13
+ this.events.set(eventName, callback);
14
+ },
15
+ emit: (eventName: string, args: any) => {
16
+ console.log('emit', args, eventName);
17
+
18
+ if (this.events.has(eventName)) {
19
+ //if eventName exists, call the callback in events accordingly
20
+ const registeredCallback = this.events.get(eventName);
21
+ // handle for this context
22
+ registeredCallback(args);
23
+ }
24
+ },
25
+ };
26
+ }
27
+
28
+ const SDKEvents = new (EventEmitter as any)();
29
+ export {SDKEvents};
@@ -0,0 +1,30 @@
1
+ const GetMeetingInviteURL = (
2
+ baseUrl: string,
3
+ attendee: string,
4
+ host?: string,
5
+ ) => {
6
+ if (host) {
7
+ return {
8
+ host: `${baseUrl}/${host}`,
9
+ attendee: `${baseUrl}/${attendee}`,
10
+ };
11
+ } else {
12
+ return {
13
+ attendee: `${baseUrl}/${attendee}`,
14
+ };
15
+ }
16
+ };
17
+ const GetMeetingInviteID = (attendee: string, host?: string) => {
18
+ if (host) {
19
+ return {
20
+ host: `${host}`,
21
+ attendee: `${attendee}`,
22
+ };
23
+ } else {
24
+ return {
25
+ attendee: `${attendee}`,
26
+ };
27
+ }
28
+ };
29
+
30
+ export {GetMeetingInviteURL, GetMeetingInviteID};
@@ -23,11 +23,11 @@ export function numFormatter(num: number) {
23
23
  }
24
24
  const value = Math.abs(num);
25
25
  const sign = Math.sign(num);
26
- let newValue = value;
26
+ let newValue: string | number = value;
27
27
  if (value >= 1000) {
28
28
  var suffixes = ['', 'k', 'm', 'b', 't', 't+'];
29
29
  var suffixNum = Math.floor(('' + value).length / 3);
30
- var shortValue = '';
30
+ var shortValue;
31
31
  for (var precision = 2; precision >= 1; precision--) {
32
32
  shortValue = parseFloat(
33
33
  (suffixNum != 0
@@ -46,3 +46,12 @@ export function numFormatter(num: number) {
46
46
  newValue = sign === -1 ? `-${newValue}` : `${newValue}`;
47
47
  return newValue;
48
48
  }
49
+
50
+ export function isEmptyObject(obj: object) {
51
+ if (obj == null) return true;
52
+ if (typeof obj !== 'object') return true;
53
+ for (const key in obj) {
54
+ return false;
55
+ }
56
+ return true;
57
+ }
@@ -0,0 +1,29 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import {UidType} from '../../agora-rn-uikit';
13
+ import {ToggleState} from '../../agora-rn-uikit/src/Contexts/PropsContext';
14
+ import useUserList from './useUserList';
15
+
16
+ function useIsAudioEnabled() {
17
+ const {renderList} = useUserList();
18
+ /**
19
+ *
20
+ * @param uid UidType
21
+ * @returns boolean
22
+ */
23
+ const audioEnabled = (uid: UidType): boolean =>
24
+ renderList[uid]?.audio === ToggleState.enabled;
25
+
26
+ return audioEnabled;
27
+ }
28
+
29
+ export default useIsAudioEnabled;
@@ -0,0 +1,33 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+
13
+ import {useMeetingInfo} from '../components/meeting-info/useMeetingInfo';
14
+ import {useLiveStreamDataContext} from '../components/contexts/LiveStreamDataContext';
15
+ import {UidType} from '../../agora-rn-uikit';
16
+
17
+ function useIsHost() {
18
+ if ($config.EVENT_MODE) {
19
+ const {hostUids} = useLiveStreamDataContext();
20
+ const isHost = (uid: UidType) => {
21
+ return hostUids.filter((hostId) => hostId === uid).length ? true : false;
22
+ };
23
+ return isHost;
24
+ } else {
25
+ const {isHost} = useMeetingInfo();
26
+ const isHostFun = (uid: UidType) => {
27
+ return isHost ? true : false;
28
+ };
29
+ return isHostFun;
30
+ }
31
+ }
32
+
33
+ export default useIsHost;