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
@@ -9,150 +9,58 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React, {useContext, useEffect, useRef} from 'react';
13
- import {TouchableOpacity, StyleSheet, View, Text} from 'react-native';
14
- import ChatContext, {controlMessageEnum} from '../components/ChatContext';
15
- import ColorContext from '../components/ColorContext';
16
- import {gql, useMutation} from '@apollo/client';
17
- import {useParams} from '../components/Router';
18
- import {PropsContext} from '../../agora-rn-uikit';
19
- import Toast from '../../react-native-toast-message';
20
- import {ImageIcon} from '../../agora-rn-uikit';
12
+ import React from 'react';
13
+ import {BtnTemplate, BtnTemplateInterface} from '../../agora-rn-uikit';
14
+ import {useRecording} from './recording/useRecording';
15
+ import {useString} from '../utils/useString';
16
+ import {
17
+ ButtonTemplateName,
18
+ useButtonTemplate,
19
+ } from '../utils/useButtonTemplate';
20
+ import Styles from '../components/styles';
21
21
 
22
- const START_RECORDING = gql`
23
- mutation startRecordingSession($passphrase: String!, $secret: String) {
24
- startRecordingSession(passphrase: $passphrase, secret: $secret)
25
- }
26
- `;
27
-
28
- const STOP_RECORDING = gql`
29
- mutation stopRecordingSession($passphrase: String!) {
30
- stopRecordingSession(passphrase: $passphrase)
31
- }
32
- `;
33
-
34
- /**
35
- * Component to start / stop Agora cloud recording.
36
- * Sends a control message to all users in the channel over RTM to indicate that
37
- * Cloud recording has started/stopped.
38
- */
39
- function usePrevious(value: any) {
40
- const ref = useRef();
41
- useEffect(() => {
42
- ref.current = value;
43
- });
44
- return ref.current;
22
+ export interface RecordingButtonProps {
23
+ buttonTemplateName?: ButtonTemplateName;
24
+ render?: (
25
+ onPress: () => void,
26
+ isRecordingActive: boolean,
27
+ buttonTemplateName?: ButtonTemplateName,
28
+ ) => JSX.Element;
45
29
  }
46
30
 
47
- const Recording = (props: any) => {
48
- const {rtcProps} = useContext(PropsContext);
49
- const {primaryColor} = useContext(ColorContext);
50
- const setRecordingActive = props.setRecordingActive;
51
- const recordingActive = props.recordingActive;
52
- const {phrase} = useParams();
53
- const [startRecordingQuery] = useMutation(START_RECORDING);
54
- const [stopRecordingQuery] = useMutation(STOP_RECORDING);
55
- const {sendControlMessage} = useContext(ChatContext);
56
- const prevRecordingState = usePrevious({recordingActive});
57
-
58
- useEffect(() => {
59
- /**
60
- * The below check makes sure the notification is triggered
61
- * only once. In native apps, this componenet is mounted everytime
62
- * when chat icon is toggle, as Controls component is hidden and
63
- * shown
64
- */
65
- if (prevRecordingState) {
66
- if (prevRecordingState?.recordingActive === recordingActive) return;
67
- Toast.show({
68
- type: 'success',
69
- text1: recordingActive ? 'Recording Started' : 'Recording Stopped',
70
- visibilityTime: 1000,
71
- });
31
+ const Recording = (props: RecordingButtonProps) => {
32
+ const {startRecording, stopRecording, isRecordingActive} = useRecording();
33
+ //commented for v1 release
34
+ //const recordingButton = useString<boolean>('recordingButton');
35
+ const recordingButton = (recording: boolean) =>
36
+ recording ? 'Recording' : 'Record';
37
+ const defaultTemplateValue = useButtonTemplate().buttonTemplateName;
38
+ const {buttonTemplateName = defaultTemplateValue} = props;
39
+ const onPress = () => {
40
+ if (!isRecordingActive) {
41
+ startRecording && startRecording();
42
+ } else {
43
+ stopRecording && stopRecording();
72
44
  }
73
- }, [recordingActive]);
45
+ };
46
+ let btnTemplateProps: BtnTemplateInterface = {
47
+ name: isRecordingActive ? 'recordingActiveIcon' : 'recordingIcon',
48
+ onPress,
49
+ color: isRecordingActive ? '#FD0845' : $config.PRIMARY_COLOR,
50
+ };
51
+
52
+ if (buttonTemplateName === ButtonTemplateName.topBar) {
53
+ btnTemplateProps.style = Styles.fullWidthButton as Object;
54
+ } else {
55
+ btnTemplateProps.btnText = recordingButton(isRecordingActive);
56
+ btnTemplateProps.style = Styles.localButton as Object;
57
+ }
74
58
 
75
- return (
76
- <TouchableOpacity
77
- onPress={() => {
78
- if (!recordingActive) {
79
- // If recording is not going on, start the recording by executing the graphql query
80
- startRecordingQuery({
81
- variables: {
82
- passphrase: phrase,
83
- secret:
84
- rtcProps.encryption && rtcProps.encryption.key
85
- ? rtcProps.encryption.key
86
- : '',
87
- },
88
- })
89
- .then((res) => {
90
- console.log(res.data);
91
- if (res.data.startRecordingSession === 'success') {
92
- // Once the backend sucessfuly starts recording,
93
- // send a control message to everbody in the channel indicating that cloud recording is now active.
94
- sendControlMessage(controlMessageEnum.cloudRecordingActive);
95
- // set the local recording state to true to update the UI
96
- setRecordingActive(true);
97
- }
98
- })
99
- .catch((err) => {
100
- console.log(err);
101
- });
102
- } else {
103
- // If recording is already going on, stop the recording by executing the graphql query.
104
- stopRecordingQuery({variables: {passphrase: phrase}})
105
- .then((res) => {
106
- console.log(res.data);
107
- if (res.data.stopRecordingSession === 'success') {
108
- // Once the backend sucessfuly stops recording,
109
- // send a control message to everbody in the channel indicating that cloud recording is now inactive.
110
- sendControlMessage(controlMessageEnum.cloudRecordingUnactive);
111
- // set the local recording state to false to update the UI
112
- setRecordingActive(false);
113
- }
114
- })
115
- .catch((err) => {
116
- console.log(err);
117
- });
118
- }
119
- }}>
120
- <View style={[style.localButton, {borderColor: primaryColor}]}>
121
- <ImageIcon
122
- name={recordingActive ? 'recordingActiveIcon' : 'recordingIcon'}
123
- style={[style.buttonIcon]}
124
- color={recordingActive ? '#FD0845' : $config.PRIMARY_COLOR}
125
- />
126
- </View>
127
- <Text
128
- style={{
129
- textAlign: 'center',
130
- marginTop: 5,
131
- color: recordingActive ? '#FD0845' : $config.PRIMARY_COLOR,
132
- }}>
133
- {recordingActive ? 'Recording' : 'Record'}
134
- </Text>
135
- </TouchableOpacity>
59
+ return props?.render ? (
60
+ props.render(onPress, isRecordingActive, buttonTemplateName)
61
+ ) : (
62
+ <BtnTemplate {...btnTemplateProps} />
136
63
  );
137
64
  };
138
65
 
139
- const style = StyleSheet.create({
140
- localButton: {
141
- backgroundColor: $config.SECONDARY_FONT_COLOR,
142
- borderRadius: 23,
143
- borderColor: $config.PRIMARY_COLOR,
144
- borderWidth: 0,
145
- width: 40,
146
- height: 40,
147
- display: 'flex',
148
- alignSelf: 'center',
149
- alignItems: 'center',
150
- justifyContent: 'center',
151
- },
152
- buttonIcon: {
153
- width: '90%',
154
- height: '90%',
155
- },
156
- });
157
-
158
66
  export default Recording;
@@ -9,52 +9,48 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React, {useContext} from 'react';
12
+ import React from 'react';
13
13
  import {StyleSheet} from 'react-native';
14
- import ChatContext, {controlMessageEnum} from '../components/ChatContext';
15
- import ColorContext from '../components/ColorContext';
16
- import {gql, useMutation} from '@apollo/client';
17
- import {useParams} from '../components/Router';
18
- import {BtnTemplate} from '../../agora-rn-uikit';
19
-
20
- const MUTE_PSTN = gql`
21
- mutation mutePSTN($uid: Int!, $passphrase: String!, $mute: Boolean!) {
22
- mutePSTN(uid: $uid, passphrase: $passphrase, mute: $mute) {
23
- uid
24
- mute
25
- }
26
- }
27
- `;
14
+ import {controlMessageEnum} from '../components/ChatContext';
15
+ import {BtnTemplate, UidType} from '../../agora-rn-uikit';
16
+ import useIsPSTN from '../utils/isPSTNUser';
17
+ import useMutePSTN from '../utils/useMutePSTN';
18
+ import useSendControlMessage, {
19
+ CONTROL_MESSAGE_TYPE,
20
+ } from '../utils/useSendControlMessage';
28
21
 
22
+ export interface RemoteAudioMuteProps {
23
+ uid: UidType;
24
+ audio: boolean;
25
+ isHost: boolean;
26
+ }
29
27
  /**
30
28
  * Component to mute / unmute remote audio.
31
29
  * Sends a control message to another user over RTM if the local user is a host.
32
30
  * If the local user is not a host, it simply renders an image
33
31
  */
34
- const RemoteAudioMute = (props: {
35
- uid: number;
36
- audio: boolean;
37
- isHost: boolean;
38
- }) => {
32
+ const RemoteAudioMute = (props: RemoteAudioMuteProps) => {
39
33
  const {isHost = false} = props;
40
- const {primaryColor} = useContext(ColorContext);
41
- const {sendControlMessageToUid} = useContext(ChatContext);
42
- const [mutePSTN, {data, loading, error}] = useMutation(MUTE_PSTN);
43
- const {phrase} = useParams<{phrase: string}>();
44
-
34
+ const sendCtrlMsgToUid = useSendControlMessage();
35
+ const isPSTN = useIsPSTN();
36
+ const mutePSTN = useMutePSTN();
45
37
  return (
46
38
  <BtnTemplate
47
39
  disabled={!isHost}
48
40
  onPress={() => {
49
- if (String(props.uid)[0] === '1')
50
- mutePSTN({
51
- variables: {
52
- uid: props.uid,
53
- passphrase: phrase,
54
- mute: props.audio,
55
- },
56
- });
57
- else sendControlMessageToUid(controlMessageEnum.muteAudio, props.uid);
41
+ if (isPSTN(props.uid)) {
42
+ try {
43
+ mutePSTN(props.uid);
44
+ } catch (error) {
45
+ console.error('An error occurred while muting the PSTN user.');
46
+ }
47
+ } else {
48
+ sendCtrlMsgToUid(
49
+ CONTROL_MESSAGE_TYPE.controlMessageToUid,
50
+ controlMessageEnum.muteAudio,
51
+ props.uid,
52
+ );
53
+ }
58
54
  }}
59
55
  style={style.buttonIconMic}
60
56
  name={props.audio ? 'mic' : 'micOff'}
@@ -9,20 +9,31 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React, {useContext} from 'react';
12
+ import React from 'react';
13
13
  import {StyleSheet} from 'react-native';
14
- import ChatContext, {controlMessageEnum} from '../components/ChatContext';
15
- import {BtnTemplate} from '../../agora-rn-uikit';
14
+ import {controlMessageEnum} from '../components/ChatContext';
15
+ import {BtnTemplate, UidType} from '../../agora-rn-uikit';
16
+ import useSendControlMessage, {
17
+ CONTROL_MESSAGE_TYPE,
18
+ } from '../utils/useSendControlMessage';
16
19
 
17
- const RemoteEndCall = (props: {uid: number; isHost: boolean}) => {
18
- const {sendControlMessageToUid} = useContext(ChatContext);
20
+ export interface RemoteEndCallProps {
21
+ uid: UidType;
22
+ isHost: boolean;
23
+ }
24
+ const RemoteEndCall = (props: RemoteEndCallProps) => {
25
+ const sendCtrlMsgToUid = useSendControlMessage();
19
26
  return props.isHost && String(props.uid)[0] !== '1' ? (
20
27
  <BtnTemplate
21
28
  style={style.remoteButton}
22
29
  onPress={() => {
23
- sendControlMessageToUid(controlMessageEnum.kickUser, props.uid);
30
+ sendCtrlMsgToUid(
31
+ CONTROL_MESSAGE_TYPE.controlMessageToUid,
32
+ controlMessageEnum.kickUser,
33
+ props.uid,
34
+ );
24
35
  }}
25
- color='#FD0845'
36
+ color="#FD0845"
26
37
  name={'remoteEndCall'} // earlier was endCall, added remoteEndCall
27
38
  />
28
39
  ) : (
@@ -9,29 +9,37 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React, {useContext} from 'react';
12
+ import React from 'react';
13
13
  import {StyleSheet} from 'react-native';
14
- import ChatContext, {controlMessageEnum} from '../components/ChatContext';
15
- import ColorContext from '../components/ColorContext';
16
- import {BtnTemplate} from '../../agora-rn-uikit';
14
+ import {controlMessageEnum} from '../components/ChatContext';
15
+ import {BtnTemplate, UidType} from '../../agora-rn-uikit';
16
+ import useSendControlMessage, {
17
+ CONTROL_MESSAGE_TYPE,
18
+ } from '../utils/useSendControlMessage';
19
+
17
20
  /**
18
21
  * Component to mute / unmute remote video.
19
22
  * Sends a control message to another user over RTM if the local user is a host.
20
23
  * If the local user is not a host, it simply renders an image
21
24
  */
22
- const RemoteVideoMute = (props: {
23
- uid: number;
25
+ export interface RemoteVideoMuteProps {
26
+ uid: UidType;
24
27
  video: boolean;
25
28
  isHost: boolean;
26
- }) => {
29
+ }
30
+ const RemoteVideoMute = (props: RemoteVideoMuteProps) => {
27
31
  const {isHost = false} = props;
28
- const {sendControlMessageToUid} = useContext(ChatContext);
32
+ const sendCtrlMsgToUid = useSendControlMessage();
29
33
 
30
34
  return String(props.uid)[0] !== '1' ? (
31
35
  <BtnTemplate
32
36
  disabled={!isHost}
33
37
  onPress={() => {
34
- sendControlMessageToUid(controlMessageEnum.muteVideo, props.uid);
38
+ sendCtrlMsgToUid(
39
+ CONTROL_MESSAGE_TYPE.controlMessageToUid,
40
+ controlMessageEnum.muteVideo,
41
+ props.uid,
42
+ );
35
43
  }}
36
44
  style={style.buttonIconCam}
37
45
  name={props.video ? 'videocam' : 'videocamOff'}
@@ -10,52 +10,52 @@
10
10
  *********************************************
11
11
  */
12
12
 
13
+ import {PropsContext, UidType} from '../../agora-rn-uikit';
13
14
  import React, {useContext} from 'react';
14
- import { StyleSheet, View, Text } from 'react-native';
15
- import chatContext from '../components/ChatContext';
15
+ import {StyleSheet, View, Text} from 'react-native';
16
+ import {useString} from '../utils/useString';
16
17
  /**
17
18
  *
18
- * @param uid - uid of the user
19
+ * @param uid - uid of the user
19
20
  * @returns This component display overlay message "Screen sharing is active now" if user started sharing the screen.
20
- * why its needed : To prevent screensharing tunneling effect
21
- *
21
+ * why its needed : To prevent screensharing tunneling effect
22
+ *
22
23
  */
23
- function ScreenShareNotice({ uid }: any) {
24
- const {userList, localUid} = useContext(chatContext);
25
- /**
26
- * In a meeting a and b are there
27
- if a user sharing the screen - then that screenshare user uid is 1 for a’user end and its having xxx uid in another end
28
- if b user sharing the screen - then that screenshare user uid is 1 for b’user end and its having xxx uid in another end
29
- */
30
- return uid === 1
31
- ?
32
- <View style={styles.screenSharingMessageContainer}>
33
- <Text style={styles.screensharingMessage}>
34
- {userList[localUid]?.name + "'s screen share is active."}
35
- </Text>
36
- </View>
37
- : null
24
+ function ScreenShareNotice({uid}: {uid: UidType}) {
25
+ //commented for v1 release
26
+ // const screensharingActiveOverlayLabel = useString(
27
+ // 'screensharingActiveOverlayLabel',
28
+ // )();
29
+ const screensharingActiveOverlayLabel = 'Your screen share is active.';
30
+ const {rtcProps} = useContext(PropsContext);
31
+ return uid === rtcProps?.screenShareUid ? (
32
+ <View style={styles.screenSharingMessageContainer}>
33
+ <Text style={styles.screensharingMessage}>
34
+ {screensharingActiveOverlayLabel}
35
+ </Text>
36
+ </View>
37
+ ) : null;
38
38
  }
39
39
 
40
40
  const styles = StyleSheet.create({
41
- screenSharingMessageContainer: {
42
- position: 'absolute',
43
- top: 0,
44
- left: 0,
45
- right: 0,
46
- bottom: 0,
47
- width: '100%',
48
- height: '100%',
49
- justifyContent: 'center',
50
- zIndex: 2,
51
- backgroundColor: 'rgba(0,0,0,0.9)',
52
- borderRadius: 15
53
- },
54
- screensharingMessage: {
55
- alignSelf: 'center',
56
- fontSize: 20,
57
- color: $config.SECONDARY_FONT_COLOR
58
- }
59
- })
41
+ screenSharingMessageContainer: {
42
+ position: 'absolute',
43
+ top: 0,
44
+ left: 0,
45
+ right: 0,
46
+ bottom: 0,
47
+ width: '100%',
48
+ height: '100%',
49
+ justifyContent: 'center',
50
+ zIndex: 2,
51
+ backgroundColor: 'rgba(0,0,0,0.9)',
52
+ borderRadius: 15,
53
+ },
54
+ screensharingMessage: {
55
+ alignSelf: 'center',
56
+ fontSize: 20,
57
+ color: $config.SECONDARY_FONT_COLOR,
58
+ },
59
+ });
60
60
 
61
- export default ScreenShareNotice;
61
+ export default ScreenShareNotice;
@@ -14,21 +14,17 @@ import {Picker, StyleSheet, View, Text} from 'react-native';
14
14
  import {PropsContext, ClientRole} from '../../agora-rn-uikit';
15
15
  import DeviceContext from '../components/DeviceContext';
16
16
  import ColorContext from '../components/ColorContext';
17
+ import {useString} from '../utils/useString';
17
18
  // import {dropdown} from '../../theme.json';
18
19
  /**
19
20
  * A component to diplay a dropdown and select a device.
20
21
  * It will add the selected device to the device context.
21
22
  */
22
- const SelectDevice = () => {
23
- // Contexts
23
+ const useSelectDevice = (): [boolean, string] => {
24
24
  const {rtcProps} = useContext(PropsContext);
25
25
  const {primaryColor} = useContext(ColorContext);
26
- const {selectedCam, setSelectedCam, selectedMic, setSelectedMic, deviceList} =
27
- useContext(DeviceContext);
28
- // States
29
- const [isPickerDisabled, setPickerDisabled] = React.useState<boolean>(false);
30
26
  const [btnTheme, setBtnTheme] = React.useState<string>(primaryColor);
31
-
27
+ const [isPickerDisabled, setPickerDisabled] = React.useState<boolean>(false);
32
28
  React.useEffect(() => {
33
29
  if ($config.EVENT_MODE && rtcProps.role === ClientRole.Audience) {
34
30
  setPickerDisabled(true);
@@ -38,58 +34,105 @@ const SelectDevice = () => {
38
34
  setBtnTheme(primaryColor);
39
35
  }
40
36
  }, [rtcProps?.role]);
37
+ return [isPickerDisabled, btnTheme];
38
+ };
39
+
40
+ interface SelectVideoDeviceProps {
41
+ render?: (
42
+ selectedCam: string,
43
+ setSelectedCam: (cam: string) => void,
44
+ deviceList: MediaDeviceInfo[],
45
+ isDisabled: boolean,
46
+ ) => JSX.Element;
47
+ }
48
+
49
+ const SelectVideoDevice = (props: SelectVideoDeviceProps) => {
50
+ const {selectedCam, setSelectedCam, deviceList} = useContext(DeviceContext);
51
+ const [isPickerDisabled, btnTheme] = useSelectDevice();
52
+ return props?.render ? (
53
+ props.render(selectedCam, setSelectedCam, deviceList, isPickerDisabled)
54
+ ) : (
55
+ <Picker
56
+ enabled={!isPickerDisabled}
57
+ selectedValue={selectedCam}
58
+ style={[{borderColor: btnTheme}, style.popupPicker]}
59
+ onValueChange={(itemValue) => setSelectedCam(itemValue)}>
60
+ {deviceList.map((device: any) => {
61
+ if (device.kind === 'videoinput') {
62
+ return (
63
+ <Picker.Item
64
+ label={device.label}
65
+ value={device.deviceId}
66
+ key={device.deviceId}
67
+ />
68
+ );
69
+ }
70
+ })}
71
+ </Picker>
72
+ );
73
+ };
41
74
 
75
+ interface SelectAudioDeviceProps {
76
+ render?: (
77
+ selectedMic: string,
78
+ setSelectedMic: (mic: string) => void,
79
+ deviceList: MediaDeviceInfo[],
80
+ isDisabled: boolean,
81
+ ) => JSX.Element;
82
+ }
83
+
84
+ const SelectAudioDevice = (props: SelectAudioDeviceProps) => {
85
+ const {selectedMic, setSelectedMic, deviceList} = useContext(DeviceContext);
86
+ const [isPickerDisabled, btnTheme] = useSelectDevice();
87
+ return props?.render ? (
88
+ props.render(selectedMic, setSelectedMic, deviceList, isPickerDisabled)
89
+ ) : (
90
+ <Picker
91
+ enabled={!isPickerDisabled}
92
+ selectedValue={selectedMic}
93
+ style={[{borderColor: btnTheme}, style.popupPicker]}
94
+ onValueChange={(itemValue) => setSelectedMic(itemValue)}>
95
+ {deviceList.map((device: any) => {
96
+ if (device.kind === 'audioinput') {
97
+ return (
98
+ <Picker.Item
99
+ label={device.label}
100
+ value={device.deviceId}
101
+ key={device.deviceId}
102
+ />
103
+ );
104
+ }
105
+ })}
106
+ </Picker>
107
+ );
108
+ };
109
+
110
+ const SelectDevice = () => {
111
+ const [isPickerDisabled] = useSelectDevice();
112
+ //commented for v1 release
113
+ // const settingScreenInfoMessage = useString('settingScreenInfoMessage')();
114
+ const settingScreenInfoMessage =
115
+ 'Video and Audio sharing is disabled for attendees. Raise hand to request permission to share.';
42
116
  return (
43
117
  <View>
44
118
  <View style={{marginTop: 15}}></View>
45
119
  <View>
46
- <Picker
47
- enabled={!isPickerDisabled}
48
- selectedValue={selectedCam}
49
- style={[{borderColor: btnTheme}, style.popupPicker]}
50
- onValueChange={(itemValue) => setSelectedCam(itemValue)}>
51
- {deviceList.map((device: any) => {
52
- if (device.kind === 'videoinput') {
53
- return (
54
- <Picker.Item
55
- label={device.label}
56
- value={device.deviceId}
57
- key={device.deviceId}
58
- />
59
- );
60
- }
61
- })}
62
- </Picker>
63
- <Picker
64
- enabled={!isPickerDisabled}
65
- selectedValue={selectedMic}
66
- style={[{borderColor: btnTheme}, style.popupPicker]}
67
- onValueChange={(itemValue) => setSelectedMic(itemValue)}>
68
- {deviceList.map((device: any) => {
69
- if (device.kind === 'audioinput') {
70
- return (
71
- <Picker.Item
72
- label={device.label}
73
- value={device.deviceId}
74
- key={device.deviceId}
75
- />
76
- );
77
- }
78
- })}
79
- </Picker>
120
+ <SelectVideoDevice />
121
+ <SelectAudioDevice />
80
122
  </View>
81
123
  <View style={{marginTop: 15}}></View>
82
124
  {$config.EVENT_MODE && isPickerDisabled && (
83
125
  <View>
84
- <Text style={style.infoTxt}>
85
- Video and Audio sharing is disabled for attendees. Raise hand to
86
- request permission to share
87
- </Text>
126
+ <Text style={style.infoTxt}>{settingScreenInfoMessage}</Text>
88
127
  </View>
89
128
  )}
90
129
  </View>
91
130
  );
92
131
  };
132
+ export const SelectDeviceComponentsArray: [
133
+ (props: SelectVideoDeviceProps) => JSX.Element,
134
+ (props: SelectAudioDeviceProps) => JSX.Element,
135
+ ] = [SelectVideoDevice, SelectAudioDevice];
93
136
 
94
137
  const style = StyleSheet.create({
95
138
  popupPicker: {