agora-appbuilder-core 2.2.0 → 2.3.0-beta.2

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 (301) 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 +32186 -3078
  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 +14 -2
  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 +226 -0
  47. package/template/{src/subComponents/LayoutEnum.tsx → esbuildConfigTransform.js} +1 -5
  48. package/template/fpe-api/components.ts +42 -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 +128 -0
  53. package/template/fpe-api/typeDefinition.ts +143 -0
  54. package/template/fpe-api/useFpe.tsx +35 -0
  55. package/template/fpe-api/utils.ts +62 -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 +28 -12
  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 +171 -139
  73. package/template/src/components/ChatContext.ts +14 -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 +328 -416
  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 +293 -272
  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 +239 -0
  132. package/template/src/components/useWakeLock.tsx +3 -3
  133. package/template/src/custom-events/CustomEvents.ts +221 -0
  134. package/template/src/custom-events/index.tsx +4 -0
  135. package/template/src/custom-events/types.ts +51 -0
  136. package/template/src/language/default-labels/commonLabels.ts +21 -0
  137. package/template/src/language/default-labels/createScreenLabels.ts +22 -0
  138. package/template/src/language/default-labels/index.ts +38 -0
  139. package/template/src/language/default-labels/joinScreenLabels.ts +13 -0
  140. package/template/src/language/default-labels/precallScreenLabels.ts +33 -0
  141. package/template/src/language/default-labels/shareLinkScreenLabels.ts +44 -0
  142. package/template/src/language/default-labels/videoCallScreenLabels.ts +189 -0
  143. package/template/src/language/i18nTypes.ts +10 -0
  144. package/template/src/language/index.ts +18 -0
  145. package/template/src/language/useLanguage.tsx +92 -0
  146. package/template/src/pages/Authenticate.tsx +21 -15
  147. package/template/src/pages/Create.tsx +176 -159
  148. package/template/src/pages/Join.tsx +44 -32
  149. package/template/src/pages/VideoCall.tsx +134 -406
  150. package/template/src/pages/create/useCreate.tsx +37 -0
  151. package/template/src/pages/video-call/CustomLayout.ts +17 -0
  152. package/template/src/pages/video-call/CustomUserContextHolder.tsx +12 -0
  153. package/template/src/pages/video-call/DefaultLayouts.ts +65 -0
  154. package/template/src/pages/video-call/NameWithMicStatus.tsx +62 -0
  155. package/template/src/pages/video-call/RenderComponent.tsx +52 -0
  156. package/template/src/pages/video-call/VideoCallScreen.tsx +191 -0
  157. package/template/src/pages/video-call/VideoComponent.tsx +34 -0
  158. package/template/src/pages/video-call/VideoRenderer.tsx +86 -0
  159. package/template/src/pages/video-call/index.ts +20 -0
  160. package/template/src/rtm/RTMEngine.ts +58 -0
  161. package/template/src/rtm/utils.ts +44 -0
  162. package/template/src/rtm-events/EventUtils.ts +267 -0
  163. package/template/src/rtm-events/EventsQueue.ts +38 -0
  164. package/template/src/rtm-events/constants.ts +40 -0
  165. package/template/src/rtm-events/index.tsx +8 -0
  166. package/template/src/rtm-events/types.ts +7 -0
  167. package/template/src/subComponents/ChatBubble.tsx +18 -11
  168. package/template/src/subComponents/ChatContainer.tsx +79 -30
  169. package/template/src/subComponents/ChatInput.tsx +146 -70
  170. package/template/src/subComponents/CopyJoinInfo.tsx +52 -67
  171. package/template/src/subComponents/Error.tsx +35 -24
  172. package/template/src/subComponents/LanguageSelector.tsx +85 -0
  173. package/template/src/subComponents/LayoutIconDropdown.native.tsx +163 -0
  174. package/template/src/subComponents/LayoutIconDropdown.tsx +198 -0
  175. package/template/src/subComponents/LocalAudioMute.tsx +52 -30
  176. package/template/src/subComponents/LocalEndCall.tsx +52 -0
  177. package/template/src/subComponents/LocalSwitchCamera.tsx +61 -0
  178. package/template/src/subComponents/LocalVideoMute.tsx +48 -30
  179. package/template/src/subComponents/LogoutButton.tsx +20 -5
  180. package/template/src/subComponents/NetworkQualityPill.tsx +43 -13
  181. package/template/src/subComponents/OpenInNativeButton.tsx +3 -2
  182. package/template/src/subComponents/Recording.tsx +46 -138
  183. package/template/src/subComponents/RemoteAudioMute.tsx +30 -34
  184. package/template/src/subComponents/RemoteEndCall.tsx +18 -7
  185. package/template/src/subComponents/RemoteVideoMute.tsx +17 -9
  186. package/template/src/subComponents/ScreenShareNotice.tsx +40 -40
  187. package/template/src/subComponents/SelectDevice.tsx +88 -45
  188. package/template/src/subComponents/SelectOAuth.tsx +30 -6
  189. package/template/src/subComponents/SidePanelButtons.ts +39 -0
  190. package/template/src/subComponents/TextWithTooltip.native.tsx +2 -1
  191. package/template/src/subComponents/TextWithTooltip.tsx +15 -20
  192. package/template/src/subComponents/chat/ChatParticipants.tsx +31 -32
  193. package/template/src/subComponents/livestream/ApprovedLiveStreamControlsView.tsx +7 -3
  194. package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +32 -18
  195. package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +22 -8
  196. package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +12 -7
  197. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +24 -27
  198. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +23 -26
  199. package/template/src/subComponents/livestream/index.ts +10 -2
  200. package/template/src/subComponents/recording/useRecording.tsx +209 -0
  201. package/template/src/subComponents/recording/useRecordingLayoutQuery.tsx +64 -0
  202. package/template/src/subComponents/screenshare/ScreenshareButton.native.tsx +18 -0
  203. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +61 -31
  204. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +57 -52
  205. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +102 -143
  206. package/template/src/subComponents/screenshare/useScreenshare.tsx +29 -0
  207. package/template/src/subComponents/toastConfig.tsx +25 -20
  208. package/template/src/utils/IsAttendeeUser.ts +34 -0
  209. package/template/src/utils/SdkEvents.ts +68 -0
  210. package/template/src/utils/common.tsx +40 -0
  211. package/template/src/utils/eventEmitter.ts +29 -0
  212. package/template/src/utils/getMeetingInvite.ts +30 -0
  213. package/template/src/utils/index.tsx +11 -2
  214. package/template/src/utils/isAudioEnabled.ts +29 -0
  215. package/template/src/utils/isHostUser.ts +33 -0
  216. package/template/src/utils/isMobileOrTablet.native.ts +5 -0
  217. package/template/src/utils/{mobileWebTest.tsx → isMobileOrTablet.ts} +5 -2
  218. package/template/src/utils/isPSTNUser.ts +30 -0
  219. package/template/src/utils/isSDK.sdk.ts +5 -0
  220. package/template/src/utils/isSDK.ts +5 -0
  221. package/template/src/utils/isScreenShareUser.ts +31 -0
  222. package/template/src/utils/isVideoEnabled.ts +29 -0
  223. package/template/src/utils/useButtonTemplate.tsx +43 -0
  224. package/template/src/utils/useCreateMeeting.ts +74 -0
  225. package/template/src/utils/useGetLiveStreamingRequests.ts +24 -0
  226. package/template/src/utils/useGetMeetingPhrase.ts +68 -0
  227. package/template/src/utils/useGetName.ts +20 -0
  228. package/template/src/{subComponents/screenshare/ScreenshareContext.tsx → utils/useGroupMessages.ts} +10 -7
  229. package/template/src/utils/useJoinMeeting.ts +120 -0
  230. package/template/src/utils/useLayout.tsx +40 -0
  231. package/template/src/utils/useLiveStreamingUids.ts +26 -0
  232. package/template/src/utils/useMutePSTN.ts +43 -0
  233. package/template/src/utils/useMuteToggleLocal.ts +109 -0
  234. package/template/src/utils/useNavParams.ts +6 -0
  235. package/template/src/utils/useNavigateTo.ts +8 -0
  236. package/template/src/utils/usePrivateMessages.ts +33 -0
  237. package/template/src/utils/useRemoteEndCall.ts +27 -0
  238. package/template/src/utils/useRemoteMute.ts +64 -0
  239. package/template/src/utils/useSendControlMessage.ts +51 -0
  240. package/template/src/utils/useSendMessage.ts +40 -0
  241. package/template/src/utils/useSetName.ts +20 -0
  242. package/template/src/utils/useSetUnreadMessageCount.ts +43 -0
  243. package/template/src/utils/useSidePanel.tsx +41 -0
  244. package/template/src/utils/useString.ts +61 -0
  245. package/template/src/utils/useUnreadMessageCount.ts +50 -0
  246. package/template/src/utils/useUserList.ts +26 -0
  247. package/template/tsconfig.json +4 -4
  248. package/template/tsconfig_fpeApi.json +103 -0
  249. package/template/tsconfig_rsdk_index.json +105 -0
  250. package/template/tsconfig_wsdk_index.json +104 -0
  251. package/template/webpack.commons.js +40 -16
  252. package/template/webpack.main.config.js +2 -1
  253. package/template/webpack.renderer.config.js +1 -1
  254. package/template/webpack.rsdk.config.js +33 -0
  255. package/template/webpack.ts.config.js +89 -0
  256. package/template/webpack.web.config.js +8 -1
  257. package/template/webpack.wsdk.config.js +34 -0
  258. package/template/agora-rn-uikit/.git/HEAD +0 -1
  259. package/template/agora-rn-uikit/.git/config +0 -16
  260. package/template/agora-rn-uikit/.git/description +0 -1
  261. package/template/agora-rn-uikit/.git/hooks/applypatch-msg.sample +0 -15
  262. package/template/agora-rn-uikit/.git/hooks/commit-msg.sample +0 -24
  263. package/template/agora-rn-uikit/.git/hooks/fsmonitor-watchman.sample +0 -173
  264. package/template/agora-rn-uikit/.git/hooks/post-update.sample +0 -8
  265. package/template/agora-rn-uikit/.git/hooks/pre-applypatch.sample +0 -14
  266. package/template/agora-rn-uikit/.git/hooks/pre-commit.sample +0 -49
  267. package/template/agora-rn-uikit/.git/hooks/pre-merge-commit.sample +0 -13
  268. package/template/agora-rn-uikit/.git/hooks/pre-push.sample +0 -53
  269. package/template/agora-rn-uikit/.git/hooks/pre-rebase.sample +0 -169
  270. package/template/agora-rn-uikit/.git/hooks/pre-receive.sample +0 -24
  271. package/template/agora-rn-uikit/.git/hooks/prepare-commit-msg.sample +0 -42
  272. package/template/agora-rn-uikit/.git/hooks/push-to-checkout.sample +0 -78
  273. package/template/agora-rn-uikit/.git/hooks/update.sample +0 -128
  274. package/template/agora-rn-uikit/.git/index +0 -0
  275. package/template/agora-rn-uikit/.git/info/exclude +0 -6
  276. package/template/agora-rn-uikit/.git/logs/HEAD +0 -2
  277. package/template/agora-rn-uikit/.git/logs/refs/heads/ab-dev-auto +0 -1
  278. package/template/agora-rn-uikit/.git/logs/refs/heads/master +0 -1
  279. package/template/agora-rn-uikit/.git/logs/refs/remotes/origin/HEAD +0 -1
  280. package/template/agora-rn-uikit/.git/objects/pack/pack-0061d00cd98162a329a32b537488a35d0abeb069.idx +0 -0
  281. package/template/agora-rn-uikit/.git/objects/pack/pack-0061d00cd98162a329a32b537488a35d0abeb069.pack +0 -0
  282. package/template/agora-rn-uikit/.git/packed-refs +0 -24
  283. package/template/agora-rn-uikit/.git/refs/heads/ab-dev-auto +0 -1
  284. package/template/agora-rn-uikit/.git/refs/heads/master +0 -1
  285. package/template/agora-rn-uikit/.git/refs/remotes/origin/HEAD +0 -1
  286. package/template/agora-rn-uikit/.gitignore +0 -63
  287. package/template/agora-rn-uikit/package-lock.json +0 -7612
  288. package/template/agora-rn-uikit/src/Contexts/MaxUidContext.tsx +0 -7
  289. package/template/agora-rn-uikit/src/Contexts/MinUidContext.tsx +0 -8
  290. package/template/package-lock.json +0 -22923
  291. package/template/react-native-toast-message/.gitignore +0 -5
  292. package/template/react-native-toast-message/.npmignore +0 -5
  293. package/template/react-native-toast-message/package-lock.json +0 -10553
  294. package/template/src/.DS_Store +0 -0
  295. package/template/src/components/participants/context/ParticipantContext.tsx +0 -97
  296. package/template/src/subComponents/.DS_Store +0 -0
  297. package/template/src/subComponents/ScreenshareButton.tsx +0 -257
  298. package/template/src/subComponents/SwitchCamera.tsx +0 -35
  299. package/template/src/utils/hasBrandLogo.tsx +0 -3
  300. package/template/src/utils/mobileWebTest.native.tsx +0 -5
  301. 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
+
53
43
  const {channel, appId, screenShareUid, screenShareToken, encryption} =
54
44
  useContext(PropsContext).rtcProps;
55
45
 
56
- const [setPresenterQuery] = useMutation(SET_PRESENTER);
57
- const [setNormalQuery] = useMutation(SET_NORMAL);
46
+ const renderListRef = useRef({renderList: renderList});
47
+
48
+ useEffect(() => {
49
+ renderListRef.current.renderList = renderList;
50
+ }, [renderList]);
51
+
52
+ const triggerChangeLayout = (pinned: boolean, screenShareUid?: UidType) => {
53
+ //screenshare is started set the layout to Pinned View
54
+ if (pinned && screenShareUid) {
55
+ dispatch({
56
+ type: 'SwapVideo',
57
+ value: [screenShareUid],
58
+ });
59
+ setPinnedLayout();
60
+ } else {
61
+ //screenshare is stopped set the layout Grid View
62
+ changeLayout();
63
+ }
64
+ };
65
+
66
+ useEffect(() => {
67
+ CustomEvents.on(EventNames.SCREENSHARE_ATTRIBUTE, (data) => {
68
+ const screenUidOfUser =
69
+ renderListRef.current.renderList[data.sender].screenUid;
70
+ setScreenShareData((prevState) => {
71
+ return {
72
+ ...prevState,
73
+ [screenUidOfUser]: {
74
+ name: renderListRef.current.renderList[screenUidOfUser]?.name,
75
+ isActive: data.payload.value === 'true' ? true : false,
76
+ },
77
+ };
78
+ });
79
+ //if remote user started/stopped the screenshare then change the layout to pinned/grid
80
+ data.payload.value === 'true'
81
+ ? triggerChangeLayout(true, screenUidOfUser)
82
+ : triggerChangeLayout(false);
83
+ });
84
+ }, []);
58
85
 
59
86
  useEffect(() => {
87
+ // @ts-ignore
60
88
  rtc.RtcEngine.addListener('ScreenshareStopped', () => {
61
89
  setScreenshareActive(false);
62
90
  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
- });
91
+ executeNormalQuery();
92
+ CustomEvents.send(EventNames.SCREENSHARE_ATTRIBUTE, {
93
+ value: `${false}`,
94
+ level: EventLevel.LEVEL2,
95
+ });
96
+ //if local user stopped the screenshare then change layout to grid
97
+ triggerChangeLayout(false);
75
98
  });
76
99
  }, []);
77
100
 
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
101
  const executeRecordingQuery = (isScreenActive: boolean) => {
121
102
  if (!isScreenActive) {
122
103
  // 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
- });
104
+ executePresenterQuery();
136
105
  } else {
137
106
  // 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
- });
107
+ executeNormalQuery();
147
108
  }
148
109
  };
149
110
 
150
111
  const stopUserScreenShare = () => {
151
- if (screenshareActive) {
152
- startUserScreenshare();
153
- }
112
+ if (!isScreenshareActive) return;
113
+ userScreenshare(false);
114
+ };
115
+ const startUserScreenshare = () => {
116
+ if (isScreenshareActive) return;
117
+ userScreenshare(true);
154
118
  };
155
119
 
156
- const startUserScreenshare = async () => {
157
- const isScreenActive = screenshareActive;
158
- if (recordingActive) {
159
- executeRecordingQuery(isScreenActive);
120
+ const userScreenshare = async (isActive: boolean) => {
121
+ if (isRecordingActive) {
122
+ executeRecordingQuery(isActive);
160
123
  }
161
124
  try {
125
+ // @ts-ignore
162
126
  await rtc.RtcEngine.startScreenshare(
163
127
  screenShareToken,
164
128
  channel,
165
129
  null,
166
130
  screenShareUid,
167
131
  appId,
168
- rtc.RtcEngine,
169
- encryption,
132
+ rtc.RtcEngine as unknown as IAgoraRTC,
133
+ encryption as unknown as any,
170
134
  );
171
- !isScreenActive && setScreenshareActive(true);
135
+ isActive && setScreenshareActive(true);
172
136
  } catch (e) {
173
137
  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
- });
138
+ executeNormalQuery();
139
+ }
140
+ if (isActive) {
141
+ CustomEvents.send(EventNames.SCREENSHARE_ATTRIBUTE, {
142
+ value: `${true}`,
143
+ level: EventLevel.LEVEL2,
144
+ });
145
+ //if local user started the screenshare then change layout to pinned
146
+ triggerChangeLayout(true, screenShareUid);
188
147
  }
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;