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
@@ -10,23 +10,32 @@
10
10
  *********************************************
11
11
  */
12
12
  import React, {useState, useContext} from 'react';
13
- import {View, Dimensions, Platform, StyleSheet} from 'react-native';
14
- import {LocalUserContext} from '../../agora-rn-uikit';
15
- import {
16
- LocalAudioMute,
17
- LocalVideoMute,
18
- Endcall,
19
- PropsContext,
20
- } from '../../agora-rn-uikit';
21
- import Recording from '../subComponents/Recording';
22
- import SwitchCamera from '../subComponents/SwitchCamera';
23
- import ScreenshareButton from '../subComponents/screenshare/ScreenshareButton';
13
+ import {View, Dimensions, StyleSheet} from 'react-native';
14
+ import {PropsContext} from '../../agora-rn-uikit';
15
+ import LocalAudioMute, {
16
+ LocalAudioMuteProps,
17
+ } from '../subComponents/LocalAudioMute';
18
+ import LocalVideoMute, {
19
+ LocalVideoMuteProps,
20
+ } from '../subComponents/LocalVideoMute';
21
+ import Recording, {RecordingButtonProps} from '../subComponents/Recording';
22
+ import LocalSwitchCamera, {
23
+ LocalSwitchCameraProps,
24
+ } from '../subComponents/LocalSwitchCamera';
25
+ import ScreenshareButton, {
26
+ ScreenshareButtonProps,
27
+ } from '../subComponents/screenshare/ScreenshareButton';
24
28
  import {controlsHolder} from '../../theme.json';
25
- import mobileAndTabletCheck from '../utils/mobileWebTest';
29
+ import isMobileOrTablet from '../utils/isMobileOrTablet';
26
30
  import {ClientRole} from '../../agora-rn-uikit';
27
- import LiveStreamControls from './livestream/views/LiveStreamControls';
31
+ import LiveStreamControls, {
32
+ LiveStreamControlsProps,
33
+ } from './livestream/views/LiveStreamControls';
34
+ import {isIOS, isWeb} from '../utils/common';
35
+ import {useMeetingInfo} from './meeting-info/useMeetingInfo';
36
+ import LocalEndcall, {LocalEndcallProps} from '../subComponents/LocalEndCall';
28
37
 
29
- const Controls = (props: any) => {
38
+ const Controls = () => {
30
39
  const {rtcProps} = useContext(PropsContext);
31
40
 
32
41
  let onLayout = (e: any) => {
@@ -38,72 +47,84 @@ const Controls = (props: any) => {
38
47
  Dimensions.get('window').width > Dimensions.get('window').height,
39
48
  ]);
40
49
  const isDesktop = dim[0] > 1224;
41
- const {setRecordingActive, recordingActive, isHost} = props;
50
+ const {isHost} = useMeetingInfo();
42
51
 
43
52
  return (
44
- <LocalUserContext>
45
- <View
46
- style={[
47
- style.controlsHolder,
48
- {
49
- paddingHorizontal: isDesktop ? '25%' : '1%',
50
- backgroundColor: $config.SECONDARY_FONT_COLOR + 80,
51
- },
52
- ]}
53
- onLayout={onLayout}>
54
- {$config.EVENT_MODE && rtcProps.role == ClientRole.Audience ? (
55
- <LiveStreamControls showControls={true} />
56
- ) : (
57
- <>
58
- {/**
59
- * In event mode when raise hand feature is active
60
- * and audience is promoted to host, the audience can also
61
- * demote himself
62
- */}
63
- {$config.EVENT_MODE && (
64
- <LiveStreamControls
65
- showControls={
66
- rtcProps?.role == ClientRole.Broadcaster && !isHost
67
- }
68
- />
69
- )}
53
+ <View
54
+ style={[
55
+ style.controlsHolder,
56
+ {
57
+ paddingHorizontal: isDesktop ? '25%' : '1%',
58
+ backgroundColor: $config.SECONDARY_FONT_COLOR + 80,
59
+ },
60
+ ]}
61
+ onLayout={onLayout}>
62
+ {$config.EVENT_MODE && rtcProps.role == ClientRole.Audience ? (
63
+ <LiveStreamControls showControls={true} />
64
+ ) : (
65
+ <>
66
+ {/**
67
+ * In event mode when raise hand feature is active
68
+ * and audience is promoted to host, the audience can also
69
+ * demote himself
70
+ */}
71
+ {$config.EVENT_MODE && (
72
+ <LiveStreamControls
73
+ showControls={rtcProps?.role == ClientRole.Broadcaster && !isHost}
74
+ />
75
+ )}
76
+ <View style={{alignSelf: 'center'}}>
77
+ <LocalAudioMute />
78
+ </View>
79
+ <View style={{alignSelf: 'center'}}>
80
+ <LocalVideoMute />
81
+ </View>
82
+ {isMobileOrTablet() && (
83
+ <View style={{alignSelf: 'center'}}>
84
+ <LocalSwitchCamera />
85
+ </View>
86
+ )}
87
+ {$config.SCREEN_SHARING && !isMobileOrTablet() && (
70
88
  <View style={{alignSelf: 'center'}}>
71
- <LocalAudioMute />
89
+ <ScreenshareButton />
72
90
  </View>
91
+ )}
92
+ {isHost && $config.CLOUD_RECORDING && (
73
93
  <View style={{alignSelf: 'center'}}>
74
- <LocalVideoMute />
94
+ <Recording />
75
95
  </View>
76
- {mobileAndTabletCheck() && (
77
- <View style={{alignSelf: 'center'}}>
78
- <SwitchCamera />
79
- </View>
80
- )}
81
- {$config.SCREEN_SHARING && !mobileAndTabletCheck() && (
82
- <View style={{alignSelf: 'center'}}>
83
- <ScreenshareButton />
84
- </View>
85
- )}
86
- {isHost && $config.CLOUD_RECORDING && (
87
- <View style={{alignSelf: 'center'}}>
88
- <Recording
89
- recordingActive={recordingActive}
90
- setRecordingActive={setRecordingActive}
91
- />
92
- </View>
93
- )}
94
- </>
95
- )}
96
- <View style={{alignSelf: 'center'}}>
97
- <Endcall />
98
- </View>
96
+ )}
97
+ </>
98
+ )}
99
+ <View style={{alignSelf: 'center'}}>
100
+ <LocalEndcall />
99
101
  </View>
100
- </LocalUserContext>
102
+ </View>
101
103
  );
102
104
  };
103
105
 
106
+ export const ControlsComponentsArray: [
107
+ (props: LocalAudioMuteProps) => JSX.Element,
108
+ (props: LocalVideoMuteProps) => JSX.Element,
109
+ (props: LocalSwitchCameraProps) => JSX.Element,
110
+ (props: ScreenshareButtonProps) => JSX.Element,
111
+ (props: RecordingButtonProps) => JSX.Element,
112
+ (props: LocalEndcallProps) => JSX.Element,
113
+ (props: LiveStreamControlsProps) => JSX.Element,
114
+ ] = [
115
+ LocalAudioMute,
116
+ LocalVideoMute,
117
+ LocalSwitchCamera,
118
+ ScreenshareButton,
119
+ Recording,
120
+ LocalEndcall,
121
+ LiveStreamControls,
122
+ ];
123
+
104
124
  const style = StyleSheet.create({
125
+ // @ts-ignore
105
126
  controlsHolder: {
106
- flex: Platform.OS === 'web' ? 1.3 : 1.6,
127
+ flex: isWeb ? 1.3 : 1.6,
107
128
  ...controlsHolder,
108
129
  },
109
130
  chatNotification: {
@@ -114,7 +135,7 @@ const style = StyleSheet.create({
114
135
  justifyContent: 'center',
115
136
  backgroundColor: $config.PRIMARY_COLOR,
116
137
  color: $config.SECONDARY_FONT_COLOR,
117
- fontFamily: Platform.OS === 'ios' ? 'Helvetica' : 'sans-serif',
138
+ fontFamily: isIOS ? 'Helvetica' : 'sans-serif',
118
139
  borderRadius: 10,
119
140
  position: 'absolute',
120
141
  left: 25,
@@ -161,7 +161,7 @@ const DeviceConfigure: React.FC<Props> = (props: any) => {
161
161
  deviceList,
162
162
  setDeviceList,
163
163
  }}>
164
- {true ? props.children : <></>}
164
+ {props.children}
165
165
  </DeviceContext.Provider>
166
166
  );
167
167
  };
@@ -12,13 +12,20 @@
12
12
  import {createContext} from 'react';
13
13
 
14
14
  interface DeviceContext {
15
- selectedCam: any;
16
- setSelectedCam: (cam: any) => void;
17
- selectedMic: any;
18
- setSelectedMic: (mic: any) => void;
19
- deviceList: Array<any>;
20
- setDeviceList: (devices: any) => void;
15
+ selectedCam: string;
16
+ setSelectedCam: (cam: string) => void;
17
+ selectedMic: string;
18
+ setSelectedMic: (mic: string) => void;
19
+ deviceList: MediaDeviceInfo[];
20
+ setDeviceList: (devices: MediaDeviceInfo[]) => void;
21
21
  }
22
22
 
23
- const DeviceContext = createContext((null as unknown) as DeviceContext);
23
+ const DeviceContext = createContext<DeviceContext>({
24
+ selectedCam: '',
25
+ selectedMic: '',
26
+ deviceList: [],
27
+ setSelectedCam: () => {},
28
+ setSelectedMic: () => {},
29
+ setDeviceList: () => {},
30
+ });
24
31
  export default DeviceContext;
@@ -14,13 +14,18 @@ import {
14
14
  createHttpLink,
15
15
  InMemoryCache,
16
16
  ApolloProvider,
17
+ NormalizedCacheObject,
17
18
  } from '@apollo/client';
18
19
  import {setContext} from '@apollo/client/link/context';
19
20
  // import useMount from './useMount';
20
- import React, {useContext, useRef} from 'react';
21
+ import React, {createContext, useContext, useRef} from 'react';
21
22
  import StorageContext from './StorageContext';
22
23
  import AsyncStorage from '@react-native-community/async-storage';
23
24
 
25
+ export const GraphQLContext = createContext<{
26
+ client: ApolloClient<NormalizedCacheObject>;
27
+ }>({client: {}});
28
+
24
29
  const GraphQLProvider = (props: {children: React.ReactNode}) => {
25
30
  const httpLink = createHttpLink({
26
31
  uri: `${$config.BACKEND_ENDPOINT}/query`,
@@ -64,7 +69,9 @@ const GraphQLProvider = (props: {children: React.ReactNode}) => {
64
69
  console.log('GraphQL render triggered', store);
65
70
 
66
71
  return (
67
- <ApolloProvider client={client.current}>{props.children}</ApolloProvider>
72
+ <GraphQLContext.Provider value={{client: client.current}}>
73
+ <ApolloProvider client={client.current}>{props.children}</ApolloProvider>
74
+ </GraphQLContext.Provider>
68
75
  );
69
76
  };
70
77
 
@@ -9,33 +9,13 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
+ import {layoutComponent} from 'fpe-api';
12
13
  import React, {useMemo, useContext, useState} from 'react';
13
- import {
14
- View,
15
- Platform,
16
- StyleSheet,
17
- Text,
18
- Dimensions,
19
- Image,
20
- Pressable,
21
- useWindowDimensions,
22
- } from 'react-native';
23
- import {MinUidContext} from '../../agora-rn-uikit';
24
- import {MaxUidContext} from '../../agora-rn-uikit';
25
- import {MaxVideoView} from '../../agora-rn-uikit';
14
+ import {View, StyleSheet, Dimensions, Pressable} from 'react-native';
15
+ import {isWeb} from '../utils/common';
26
16
  import {RtcContext} from '../../agora-rn-uikit';
27
- import chatContext from './ChatContext';
28
- import icons from '../assets/icons';
29
- import ColorContext from './ColorContext';
30
- import FallbackLogo from '../subComponents/FallbackLogo';
31
- import Layout from '../subComponents/LayoutEnum';
32
- import ScreenShareNotice from '../subComponents/ScreenShareNotice';
33
- import {RFValue} from 'react-native-responsive-fontsize';
34
- import networkQualityContext from './NetworkQualityContext';
35
- import {NetworkQualityPill} from '../subComponents/NetworkQualityPill';
36
- import {ImageIcon} from '../../agora-rn-uikit';
37
- import TextWithTooltip from '../subComponents/TextWithTooltip';
38
-
17
+ import {useSetPinnedLayout} from '../pages/video-call/DefaultLayouts';
18
+ import RenderComponent from '../pages/video-call/RenderComponent';
39
19
  const layout = (len: number, isDesktop: boolean = true) => {
40
20
  const rows = Math.round(Math.sqrt(len));
41
21
  const cols = Math.ceil(len / rows);
@@ -54,25 +34,16 @@ const layout = (len: number, isDesktop: boolean = true) => {
54
34
  };
55
35
  };
56
36
 
57
- // const isDesktop = Platform.OS === 'web';
58
-
59
- interface GridVideoProps {
60
- setLayout: React.Dispatch<React.SetStateAction<Layout>>;
61
- }
62
-
63
- const GridVideo = (props: GridVideoProps) => {
64
- const {height, width} = useWindowDimensions();
37
+ const GridVideo: layoutComponent = ({renderData}) => {
65
38
  const {dispatch} = useContext(RtcContext);
66
- const max = useContext(MaxUidContext);
67
- const min = useContext(MinUidContext);
68
- const {primaryColor} = useContext(ColorContext);
69
- const networkQualityStat = useContext(networkQualityContext);
70
- const {userList, localUid} = useContext(chatContext);
71
- const users = [...max, ...min];
72
39
  let onLayout = (e: any) => {
73
- setDim([e.nativeEvent.layout.width, e.nativeEvent.layout.height]);
40
+ setDim([
41
+ e.nativeEvent.layout.width,
42
+ e.nativeEvent.layout.height,
43
+ e.nativeEvent.layout.width > e.nativeEvent.layout.height,
44
+ ]);
74
45
  };
75
- const [dim, setDim] = useState([
46
+ const [dim, setDim] = useState<[number, number, boolean]>([
76
47
  Dimensions.get('window').width,
77
48
  Dimensions.get('window').height,
78
49
  Dimensions.get('window').width > Dimensions.get('window').height,
@@ -80,9 +51,11 @@ const GridVideo = (props: GridVideoProps) => {
80
51
  const isDesktop = dim[0] > dim[1] + 100;
81
52
 
82
53
  let {matrix, dims} = useMemo(
83
- () => layout(users.length, isDesktop),
84
- [users.length, isDesktop],
54
+ () => layout(renderData.length, isDesktop),
55
+ [renderData.length, isDesktop],
85
56
  );
57
+
58
+ const setPinnedLayout = useSetPinnedLayout();
86
59
  return (
87
60
  <View
88
61
  style={[style.full, {paddingHorizontal: isDesktop ? 50 : 0}]}
@@ -95,130 +68,18 @@ const GridVideo = (props: GridVideoProps) => {
95
68
  if (!(ridx === 0 && cidx === 0)) {
96
69
  dispatch({
97
70
  type: 'SwapVideo',
98
- value: [users[ridx * dims.c + cidx]],
71
+ value: [renderData[ridx * dims.c + cidx]],
99
72
  });
100
73
  }
101
- props.setLayout(Layout.Pinned);
74
+ setPinnedLayout();
102
75
  }}
103
76
  style={{
104
- flex: Platform.OS === 'web' ? 1 / dims.c : 1,
77
+ flex: isWeb ? 1 / dims.c : 1,
105
78
  marginHorizontal: 'auto',
106
79
  }}
107
80
  key={cidx}>
108
81
  <View style={style.gridVideoContainerInner}>
109
- <NetworkQualityPill
110
- networkStat={
111
- // When no network quality reported and if user has no stream
112
- // published show "unsupported" else show "loading"
113
- networkQualityStat[users[ridx * dims.c + cidx].uid]
114
- ? networkQualityStat[users[ridx * dims.c + cidx].uid]
115
- : users[ridx * dims.c + cidx].audio ||
116
- users[ridx * dims.c + cidx].video
117
- ? 8
118
- : 7
119
- }
120
- primaryColor={primaryColor}
121
- rootStyle={{top: 5, left: 5}}
122
- />
123
- <ScreenShareNotice uid={users[ridx * dims.c + cidx].uid} />
124
- <MaxVideoView
125
- fallback={() => {
126
- if (users[ridx * dims.c + cidx].uid === 'local') {
127
- return FallbackLogo(userList[localUid]?.name);
128
- } else if (
129
- String(users[ridx * dims.c + cidx].uid)[0] === '1'
130
- ) {
131
- return FallbackLogo('PSTN User');
132
- } else {
133
- return FallbackLogo(
134
- userList[users[ridx * dims.c + cidx]?.uid]?.name,
135
- );
136
- }
137
- }}
138
- user={users[ridx * dims.c + cidx]}
139
- key={users[ridx * dims.c + cidx].uid}
140
- />
141
- <View
142
- style={{
143
- zIndex: 5,
144
- marginTop: -30,
145
- backgroundColor: $config.SECONDARY_FONT_COLOR + 'bb',
146
- alignSelf: 'flex-end',
147
- paddingHorizontal: 8,
148
- height: 30,
149
- borderTopLeftRadius: 15,
150
- borderBottomRightRadius: 15,
151
- // marginHorizontal: 'auto',
152
- maxWidth: '100%',
153
- flexDirection: 'row',
154
- // alignContent: 'flex-end',
155
- // width: '100%',
156
- // alignItems: 'flex-start',
157
- }}>
158
- {/* <View style={{alignSelf: 'flex-end', flexDirection: 'row'}}> */}
159
- <View style={[style.MicBackdrop]}>
160
- <ImageIcon
161
- name={
162
- users[ridx * dims.c + cidx].audio ? 'mic' : 'micOff'
163
- }
164
- color={
165
- users[ridx * dims.c + cidx].audio ? primaryColor : 'red'
166
- }
167
- style={style.MicIcon}
168
- />
169
- {/* <Image
170
- source={{
171
- uri: users[ridx * dims.c + cidx].audio
172
- ? icons.mic
173
- : icons.micOff,
174
- }}
175
- style={[
176
- style.MicIcon,
177
- {
178
- tintColor: users[ridx * dims.c + cidx].audio
179
- ? primaryColor
180
- : 'red',
181
- },
182
- ]}
183
- resizeMode={'contain'}
184
- /> */}
185
- </View>
186
- <View style={{flex:1}}>
187
- <TextWithTooltip
188
- value={users[ridx * dims.c + cidx].uid === 'local'
189
- ? userList[localUid]
190
- ? userList[localUid].name + ' '
191
- : 'You '
192
- : userList[users[ridx * dims.c + cidx].uid]
193
- ? userList[users[ridx * dims.c + cidx].uid].name + ' '
194
- : users[ridx * dims.c + cidx].uid === 1
195
- ? (userList[localUid]?.name + "'s screen ")
196
- : String(users[ridx * dims.c + cidx].uid)[0] === '1'
197
- ? 'PSTN User '
198
- : 'User '}
199
- style={
200
- {
201
- color: $config.PRIMARY_FONT_COLOR,
202
- lineHeight: 30,
203
- fontSize: RFValue(14, height > width ? height : width),
204
- fontWeight: '700',
205
- flexShrink: 1,
206
- // width: '100%',
207
- // alignSelf: 'stretch',
208
- // textAlign: 'center',
209
- }
210
- }
211
- />
212
- </View>
213
- {/* </View> */}
214
- {/* {console.log(
215
- '!nax',
216
- userList,
217
- userList[users[ridx * dims.c + cidx].uid],
218
- userList[localUid],
219
- users[ridx * dims.c + cidx].uid,
220
- )} */}
221
- </View>
82
+ <RenderComponent uid={renderData[ridx * dims.c + cidx]} />
222
83
  </View>
223
84
  </Pressable>
224
85
  ))}
@@ -9,30 +9,69 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React, {useContext} from 'react';
13
- import {View, Text, TouchableOpacity, StyleSheet} from 'react-native';
14
- import chatContext, {controlMessageEnum} from './ChatContext';
15
- import ColorContext from './ColorContext';
12
+ import React from 'react';
13
+ import {View, Text, StyleSheet} from 'react-native';
14
+ import {controlMessageEnum} from './ChatContext';
16
15
  import SecondaryButton from '../atoms/SecondaryButton';
16
+ import {useString} from '../utils/useString';
17
+ import useSendControlMessage, {
18
+ CONTROL_MESSAGE_TYPE,
19
+ } from '../utils/useSendControlMessage';
20
+
21
+ export interface MuteAllAudioButtonProps {
22
+ render?: (onPress: () => void) => JSX.Element;
23
+ }
24
+
25
+ export const MuteAllAudioButton = (props: MuteAllAudioButtonProps) => {
26
+ const sendCtrlMsg = useSendControlMessage();
27
+ //commented for v1 release
28
+ //const muteAllAudioButton = useString('muteAllAudioButton')();
29
+ const muteAllAudioButton = 'Mute all audios';
30
+ const onPress = () =>
31
+ sendCtrlMsg(
32
+ CONTROL_MESSAGE_TYPE.controlMessageToEveryOne,
33
+ controlMessageEnum.muteAudio,
34
+ );
35
+ return props?.render ? (
36
+ props.render(onPress)
37
+ ) : (
38
+ <SecondaryButton onPress={onPress} text={muteAllAudioButton} />
39
+ );
40
+ };
41
+
42
+ export interface MuteAllVideoButtonProps {
43
+ render?: (onPress: () => void) => JSX.Element;
44
+ }
45
+ export const MuteAllVideoButton = (props: MuteAllVideoButtonProps) => {
46
+ const sendCtrlMsg = useSendControlMessage();
47
+ //commented for v1 release
48
+ //const muteAllVideoButton = useString('muteAllVideoButton')();
49
+ const muteAllVideoButton = 'Mute all videos';
50
+ const onPress = () =>
51
+ sendCtrlMsg(
52
+ CONTROL_MESSAGE_TYPE.controlMessageToEveryOne,
53
+ controlMessageEnum.muteVideo,
54
+ );
55
+ return props?.render ? (
56
+ props.render(onPress)
57
+ ) : (
58
+ <SecondaryButton onPress={onPress} text={muteAllVideoButton} />
59
+ );
60
+ };
17
61
 
18
62
  const HostControlView = () => {
19
- const {sendControlMessage} = useContext(chatContext);
20
- const {primaryColor} = useContext(ColorContext);
63
+ //commented for v1 release
64
+ //const hostControlsLabel = useString('hostControlsLabel')();
65
+ const hostControlsLabel = 'Host Controls';
21
66
  return (
22
67
  <>
23
- <Text style={style.heading}>Host Controls</Text>
68
+ <Text style={style.heading}>{hostControlsLabel}</Text>
24
69
  <View>
25
70
  <View style={style.btnContainer}>
26
- <SecondaryButton
27
- onPress={() => sendControlMessage(controlMessageEnum.muteAudio)}
28
- text={'Mute all audios'}
29
- />
71
+ <MuteAllAudioButton />
30
72
  </View>
31
73
  <View style={style.btnContainer}>
32
- <SecondaryButton
33
- onPress={() => sendControlMessage(controlMessageEnum.muteVideo)}
34
- text={'Mute all videos'}
35
- />
74
+ <MuteAllVideoButton />
36
75
  </View>
37
76
  </View>
38
77
  </>