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
@@ -0,0 +1,198 @@
1
+ import React, {SetStateAction, useContext} from 'react';
2
+ import {
3
+ View,
4
+ Text,
5
+ StyleSheet,
6
+ TouchableOpacity,
7
+ TouchableWithoutFeedback,
8
+ Modal,
9
+ } from 'react-native';
10
+ import {isWeb} from '../utils/common';
11
+ import {ImageIcon} from '../../agora-rn-uikit';
12
+ import useCustomLayout from '../pages/video-call/CustomLayout';
13
+ import {useLayout} from '../utils/useLayout';
14
+ import DimensionContext from '../components/dimension/DimensionContext';
15
+
16
+ interface LayoutIconDropdownProps {
17
+ modalPosition?: {
18
+ top?: number;
19
+ right?: number;
20
+ left?: number;
21
+ bottom?: number;
22
+ };
23
+ showDropdown: boolean;
24
+ setShowDropdown: React.Dispatch<SetStateAction<boolean>>;
25
+ }
26
+
27
+ const LayoutIconDropdown = (props: LayoutIconDropdownProps) => {
28
+ const {
29
+ showDropdown,
30
+ setShowDropdown,
31
+ modalPosition = {top: 45, right: 15, bottom: undefined, left: undefined},
32
+ } = props;
33
+ const {getDimensionData} = useContext(DimensionContext);
34
+ const {isDesktop, dim} = getDimensionData();
35
+
36
+ const layouts = useCustomLayout();
37
+ const {activeLayoutName, setActiveLayoutName} = useLayout();
38
+ const renderSeparatorHorizontal = () => {
39
+ return isWeb && isDesktop ? (
40
+ <View style={style.navItem}>
41
+ <View style={style.navItemSeparatorHorizontal}></View>
42
+ </View>
43
+ ) : (
44
+ <View style={{marginHorizontal: 2}}></View>
45
+ );
46
+ };
47
+ const selectedItemHighlighter = (isSelected: boolean) => {
48
+ return <View style={isSelected ? style.highlighter : {}} />;
49
+ };
50
+ const renderDropdown = () => {
51
+ const data = layouts.map((item, index) => {
52
+ let onPress = () => {
53
+ setActiveLayoutName(item.name);
54
+ setShowDropdown(false);
55
+ };
56
+ let content = [];
57
+ let BtnTemplateLocal = [
58
+ item?.iconName ? (
59
+ <ImageIcon
60
+ key={'btnTemplateNameDropdown' + index}
61
+ style={style.btnHolderCustom}
62
+ name={item?.iconName}
63
+ />
64
+ ) : (
65
+ <ImageIcon
66
+ key={'btnTemplateIconDropdown' + index}
67
+ style={style.btnHolderCustom}
68
+ icon={item.icon}
69
+ />
70
+ ),
71
+ ];
72
+ content.push(
73
+ <TouchableOpacity
74
+ key={'dropdownLayoutIcon' + index}
75
+ style={style.dropdownInnerIconContainer}
76
+ onPress={onPress}>
77
+ <>
78
+ <View style={style.highlighterContainer}>
79
+ {selectedItemHighlighter(item.name === activeLayoutName)}
80
+ </View>
81
+ <View style={{flex: 1}}>{BtnTemplateLocal}</View>
82
+ <View style={style.layoutNameContainer}>
83
+ <Text numberOfLines={2} style={style.layoutNameText}>
84
+ {item.label}
85
+ </Text>
86
+ </View>
87
+ </>
88
+ </TouchableOpacity>,
89
+ );
90
+ if (layouts.length - 1 !== index) {
91
+ content.push(
92
+ <View
93
+ style={style.separaterContainer}
94
+ key={'navLayoutIconSeparater' + index}>
95
+ {renderSeparatorHorizontal()}
96
+ </View>,
97
+ );
98
+ }
99
+ return content;
100
+ });
101
+ return (
102
+ <Modal
103
+ animationType="fade"
104
+ transparent={true}
105
+ visible={showDropdown}
106
+ onRequestClose={() => {
107
+ setShowDropdown(false);
108
+ }}>
109
+ <TouchableWithoutFeedback
110
+ onPress={() => {
111
+ setShowDropdown(false);
112
+ }}>
113
+ <View style={style.backDrop} />
114
+ </TouchableWithoutFeedback>
115
+ <View
116
+ style={[
117
+ style.dropdownContainer,
118
+ {
119
+ top: modalPosition?.top,
120
+ right: modalPosition?.right,
121
+ left: modalPosition?.left,
122
+ bottom: modalPosition?.bottom,
123
+ },
124
+ ]}>
125
+ {data}
126
+ </View>
127
+ </Modal>
128
+ );
129
+ };
130
+ return <>{renderDropdown()}</>;
131
+ };
132
+
133
+ const style = StyleSheet.create({
134
+ layoutNameContainer: {
135
+ flex: 2,
136
+ justifyContent: 'center',
137
+ paddingHorizontal: 5,
138
+ },
139
+ layoutNameText: {
140
+ textAlign: 'left',
141
+ },
142
+ highlighter: {
143
+ justifyContent: 'center',
144
+ alignSelf: 'center',
145
+ height: 1,
146
+ width: 1,
147
+ borderRadius: 10,
148
+ borderWidth: 4,
149
+ borderColor: $config.PRIMARY_COLOR,
150
+ },
151
+ highlighterContainer: {flex: 0.5, justifyContent: 'center'},
152
+ dropdownInnerIconContainer: {
153
+ flex: 1,
154
+ flexDirection: 'row',
155
+ paddingHorizontal: 5,
156
+ paddingVertical: 5,
157
+ minHeight: 40,
158
+ },
159
+ navItem: {
160
+ height: '100%',
161
+ alignItems: 'center',
162
+ position: 'relative',
163
+ },
164
+ navItemSeparatorHorizontal: {
165
+ backgroundColor: $config.PRIMARY_FONT_COLOR + '80',
166
+ width: '100%',
167
+ height: 1,
168
+ marginVertical: 10,
169
+ alignSelf: 'center',
170
+ opacity: 0.8,
171
+ },
172
+ separaterContainer: {
173
+ flex: 0.5,
174
+ paddingHorizontal: 5,
175
+ },
176
+ dropdownContainer: {
177
+ position: 'absolute',
178
+ marginTop: 5,
179
+ width: 160,
180
+ backgroundColor: 'white',
181
+ borderRadius: 10,
182
+ paddingVertical: 10,
183
+ },
184
+ btnHolderCustom: {
185
+ width: '100%',
186
+ height: '100%',
187
+ resizeMode: 'contain',
188
+ },
189
+ backDrop: {
190
+ position: 'absolute',
191
+ top: 0,
192
+ bottom: 0,
193
+ left: 0,
194
+ right: 0,
195
+ },
196
+ });
197
+
198
+ export default LayoutIconDropdown;
@@ -10,42 +10,64 @@
10
10
  *********************************************
11
11
  */
12
12
  import React, {useContext} from 'react';
13
- import {RtcContext} from '../../agora-rn-uikit';
14
- import {LocalContext} from '../../agora-rn-uikit';
15
- import {Image, StyleSheet, TouchableOpacity} from 'react-native';
16
- import icons from '../assets/icons';
17
- import ColorContext from '../components/ColorContext';
13
+ import {
14
+ BtnTemplate,
15
+ ToggleState,
16
+ LocalContext,
17
+ BtnTemplateInterface,
18
+ } from '../../agora-rn-uikit';
19
+ import useMuteToggleLocal, {MUTE_LOCAL_TYPE} from '../utils/useMuteToggleLocal';
20
+ import Styles from '../components/styles';
21
+ import {
22
+ ButtonTemplateName,
23
+ useButtonTemplate,
24
+ } from '../utils/useButtonTemplate';
25
+ import {useString} from '../utils/useString';
18
26
 
19
27
  /**
20
- * A component to mute / unmute the local mute
28
+ * A component to mute / unmute the local audio
21
29
  */
22
- function LocalAudioMute() {
23
- const {primaryColor} = useContext(ColorContext);
24
- const {dispatch} = useContext(RtcContext);
30
+ export interface LocalAudioMuteProps {
31
+ buttonTemplateName?: ButtonTemplateName;
32
+ render?: (
33
+ onPress: () => void,
34
+ isAudioEnabled: boolean,
35
+ buttonTemplateName?: ButtonTemplateName,
36
+ ) => JSX.Element;
37
+ }
38
+
39
+ function LocalAudioMute(props: LocalAudioMuteProps) {
25
40
  const local = useContext(LocalContext);
41
+ const localMute = useMuteToggleLocal();
42
+ //commented for v1 release
43
+ //const audioLabel = useString('toggleAudioButton')();
44
+ const audioLabel = 'Audio';
45
+
46
+ const defaultTemplateValue = useButtonTemplate().buttonTemplateName;
47
+ const {buttonTemplateName = defaultTemplateValue} = props;
48
+
49
+ const onPress = () => {
50
+ localMute(MUTE_LOCAL_TYPE.audio);
51
+ };
52
+ const isAudioEnabled = local.audio === ToggleState.enabled;
26
53
 
27
- return (
28
- <TouchableOpacity
29
- onPress={() => {
30
- dispatch({
31
- type: 'LocalMuteAudio',
32
- value: [local.audio],
33
- });
34
- }}>
35
- <Image
36
- style={[styles.icon, {tintColor: primaryColor}]}
37
- source={{uri: local.audio ? icons.mic : icons.micOff}}
38
- />
39
- </TouchableOpacity>
54
+ let btnTemplateProps: BtnTemplateInterface = {
55
+ onPress: onPress,
56
+ name: isAudioEnabled ? 'mic' : 'micOff',
57
+ };
58
+
59
+ if (buttonTemplateName === ButtonTemplateName.topBar) {
60
+ btnTemplateProps.style = Styles.fullWidthButton as Object;
61
+ } else {
62
+ btnTemplateProps.style = Styles.localButton as Object;
63
+ btnTemplateProps.btnText = audioLabel;
64
+ }
65
+
66
+ return props?.render ? (
67
+ props.render(onPress, isAudioEnabled, buttonTemplateName)
68
+ ) : (
69
+ <BtnTemplate {...btnTemplateProps} />
40
70
  );
41
71
  }
42
72
 
43
- const styles = StyleSheet.create({
44
- icon: {
45
- width: 24,
46
- height: 24,
47
- tintColor: $config.PRIMARY_COLOR,
48
- },
49
- });
50
-
51
73
  export default LocalAudioMute;
@@ -0,0 +1,52 @@
1
+ import React, {useContext} from 'react';
2
+ import {
3
+ ButtonTemplateName,
4
+ useButtonTemplate,
5
+ } from '../utils/useButtonTemplate';
6
+ import {
7
+ BtnTemplate,
8
+ BtnTemplateInterface,
9
+ RtcContext,
10
+ } from '../../agora-rn-uikit';
11
+ import Styles from '../components/styles';
12
+ import {useString} from '../utils/useString';
13
+
14
+ export interface LocalEndcallProps {
15
+ buttonTemplateName?: ButtonTemplateName;
16
+ render?: (
17
+ onPress: () => void,
18
+ buttonTemplateName?: ButtonTemplateName,
19
+ ) => JSX.Element;
20
+ }
21
+
22
+ const LocalEndcall = (props: LocalEndcallProps) => {
23
+ const {dispatch} = useContext(RtcContext);
24
+ //commented for v1 release
25
+ //const endCallLabel = useString('endCallButton')();
26
+ const endCallLabel = 'Hang Up';
27
+ const defaultTemplateValue = useButtonTemplate().buttonTemplateName;
28
+ const {buttonTemplateName = defaultTemplateValue} = props;
29
+ const onPress = () =>
30
+ dispatch({
31
+ type: 'EndCall',
32
+ value: [],
33
+ });
34
+ let btnTemplateProps: BtnTemplateInterface = {
35
+ name: 'callEnd',
36
+ color: '#FD0845',
37
+ onPress: onPress,
38
+ };
39
+
40
+ if (buttonTemplateName === ButtonTemplateName.topBar) {
41
+ btnTemplateProps.style = Styles.fullWidthButton as Object;
42
+ } else {
43
+ btnTemplateProps.btnText = endCallLabel;
44
+ btnTemplateProps.style = Styles.endCall as Object;
45
+ }
46
+ return props?.render ? (
47
+ props.render(onPress, buttonTemplateName)
48
+ ) : (
49
+ <BtnTemplate {...btnTemplateProps} />
50
+ );
51
+ };
52
+ export default LocalEndcall;
@@ -0,0 +1,61 @@
1
+ import React, {useContext} from 'react';
2
+ import {
3
+ ButtonTemplateName,
4
+ useButtonTemplate,
5
+ } from '../utils/useButtonTemplate';
6
+ import {useString} from '../utils/useString';
7
+ import {
8
+ BtnTemplate,
9
+ RtcContext,
10
+ PropsContext,
11
+ LocalContext,
12
+ ToggleState,
13
+ BtnTemplateInterface,
14
+ } from '../../agora-rn-uikit';
15
+ import Styles from '../components/styles';
16
+
17
+ export interface LocalSwitchCameraProps {
18
+ buttonTemplateName?: ButtonTemplateName;
19
+ render?: (
20
+ onPress: () => void,
21
+ isVideoEnabled: boolean,
22
+ buttonTemplateName?: ButtonTemplateName,
23
+ ) => JSX.Element;
24
+ }
25
+
26
+ function LocalSwitchCamera(props: LocalSwitchCameraProps) {
27
+ const {callbacks} = useContext(PropsContext);
28
+ const {RtcEngine} = useContext(RtcContext);
29
+ const local = useContext(LocalContext);
30
+ //commented for v1 release
31
+ //const switchCameraButtonText = useString('switchCameraButton')();
32
+ const switchCameraButtonText = 'Switch';
33
+
34
+ const defaultTemplateValue = useButtonTemplate().buttonTemplateName;
35
+ const {buttonTemplateName = defaultTemplateValue} = props;
36
+ const onPress = () => {
37
+ RtcEngine.switchCamera();
38
+ callbacks?.SwitchCamera && callbacks.SwitchCamera();
39
+ };
40
+ const isVideoEnabled = local.video === ToggleState.enabled;
41
+ let btnTemplateProps: BtnTemplateInterface = {
42
+ name: 'switchCamera',
43
+ disabled: isVideoEnabled ? false : true,
44
+ onPress: onPress,
45
+ };
46
+
47
+ if (buttonTemplateName === ButtonTemplateName.topBar) {
48
+ btnTemplateProps.style = Styles.fullWidthButton as Object;
49
+ } else {
50
+ btnTemplateProps.style = Styles.localButton as Object;
51
+ btnTemplateProps.btnText = switchCameraButtonText;
52
+ }
53
+
54
+ return props?.render ? (
55
+ props.render(onPress, isVideoEnabled, buttonTemplateName)
56
+ ) : (
57
+ <BtnTemplate {...btnTemplateProps} />
58
+ );
59
+ }
60
+
61
+ export default LocalSwitchCamera;
@@ -10,43 +10,61 @@
10
10
  *********************************************
11
11
  */
12
12
  import React, {useContext} from 'react';
13
- import {RtcContext} from '../../agora-rn-uikit';
14
- import {LocalContext} from '../../agora-rn-uikit';
15
- import {Image, StyleSheet, TouchableOpacity} from 'react-native';
16
- import icons from '../assets/icons';
17
- import ColorContext from '../components/ColorContext';
13
+ import {
14
+ BtnTemplate,
15
+ ToggleState,
16
+ LocalContext,
17
+ BtnTemplateInterface,
18
+ } from '../../agora-rn-uikit';
19
+ import useMuteToggleLocal, {MUTE_LOCAL_TYPE} from '../utils/useMuteToggleLocal';
20
+ import Styles from '../components/styles';
21
+ import {
22
+ ButtonTemplateName,
23
+ useButtonTemplate,
24
+ } from '../utils/useButtonTemplate';
25
+ import {useString} from '../utils/useString';
18
26
 
19
27
  /**
20
28
  * A component to mute / unmute the local video
21
29
  */
22
- function LocalVideoMute() {
23
- const {primaryColor} = useContext(ColorContext);
24
- const {dispatch} = useContext(RtcContext);
30
+ export interface LocalVideoMuteProps {
31
+ buttonTemplateName?: ButtonTemplateName;
32
+ render?: (
33
+ onPress: () => void,
34
+ isVideoEnabled: boolean,
35
+ buttonTemplateName?: ButtonTemplateName,
36
+ ) => JSX.Element;
37
+ }
38
+
39
+ function LocalVideoMute(props: LocalVideoMuteProps) {
25
40
  const local = useContext(LocalContext);
41
+ const localMute = useMuteToggleLocal();
42
+ //commented for v1 release
43
+ //const videoLabel = useString('toggleVideoButton')();
44
+ const videoLabel = 'Video';
45
+ const defaultTemplateValue = useButtonTemplate().buttonTemplateName;
46
+ const {buttonTemplateName = defaultTemplateValue} = props;
47
+ const onPress = () => {
48
+ localMute(MUTE_LOCAL_TYPE.video);
49
+ };
50
+ const isVideoEnabled = local.video === ToggleState.enabled;
51
+ let btnTemplateProps: BtnTemplateInterface = {
52
+ onPress: onPress,
53
+ name: isVideoEnabled ? 'videocam' : 'videocamOff',
54
+ };
26
55
 
27
- return (
28
- <TouchableOpacity
29
- onPress={() => {
30
- dispatch({
31
- type: 'LocalMuteVideo',
32
- value: [local.video],
33
- });
34
- }}>
35
- <Image
36
- style={[styles.icon, {tintColor: primaryColor}]}
37
- source={{uri: local.video ? icons.videocam : icons.videocamOff}}
38
- />
39
- </TouchableOpacity>
56
+ if (buttonTemplateName === ButtonTemplateName.topBar) {
57
+ btnTemplateProps.style = Styles.fullWidthButton as Object;
58
+ } else {
59
+ btnTemplateProps.style = Styles.localButton as Object;
60
+ btnTemplateProps.btnText = videoLabel;
61
+ }
62
+
63
+ return props?.render ? (
64
+ props.render(onPress, isVideoEnabled, buttonTemplateName)
65
+ ) : (
66
+ <BtnTemplate {...btnTemplateProps} />
40
67
  );
41
68
  }
42
69
 
43
- const styles = StyleSheet.create({
44
- icon: {
45
- width: 25,
46
- height: 22,
47
- marginHorizontal: 3,
48
- tintColor: $config.PRIMARY_COLOR,
49
- },
50
- });
51
-
52
70
  export default LocalVideoMute;
@@ -11,9 +11,10 @@
11
11
  */
12
12
  import React, {useContext} from 'react';
13
13
  import {TouchableOpacity, Text, StyleSheet} from 'react-native';
14
- import StorageContext from '../components/StorageContext';
14
+ import StorageContext, {initStoreValue} from '../components/StorageContext';
15
15
  import {useHistory} from '../components/Router';
16
16
  import {gql, useMutation} from '@apollo/client';
17
+ import {useString} from '../utils/useString';
17
18
 
18
19
  const LOGOUT = gql`
19
20
  mutation logoutSession($token: String!) {
@@ -28,10 +29,24 @@ const LogoutButton = () => {
28
29
  const {token} = store;
29
30
  const history = useHistory();
30
31
  const [logoutQuery] = useMutation(LOGOUT);
31
-
32
+ //commented for v1 release
33
+ // const oauthLoginLabel = useString('oauthLoginLabel')();
34
+ // const logoutButton = useString('logoutButton')();
35
+ const oauthLoginLabel = 'Login using OAuth';
36
+ const logoutButton = 'Logout';
32
37
  const logout = () => {
33
38
  if (setStore) {
34
- setStore({token: null, displayName: ''});
39
+ /**
40
+ * In case of usage from FPE
41
+ * User stored some data in localstorage we don't want to remove their on logout.
42
+ * so setting prevstate with store default value
43
+ */
44
+ setStore((prevState) => {
45
+ return {
46
+ ...prevState,
47
+ ...initStoreValue,
48
+ };
49
+ });
35
50
  }
36
51
  logoutQuery({variables: {token}}).catch((e) => {
37
52
  console.log(e);
@@ -46,11 +61,11 @@ const LogoutButton = () => {
46
61
  <>
47
62
  {token === null ? (
48
63
  <TouchableOpacity style={style.btn} onPress={() => login()}>
49
- <Text style={style.btnText}>Login using OAuth</Text>
64
+ <Text style={style.btnText}>{oauthLoginLabel}</Text>
50
65
  </TouchableOpacity>
51
66
  ) : (
52
67
  <TouchableOpacity style={style.btn} onPress={() => logout()}>
53
- <Text style={style.btnText}>Logout</Text>
68
+ <Text style={style.btnText}>{logoutButton}</Text>
54
69
  </TouchableOpacity>
55
70
  )}
56
71
  </>
@@ -1,4 +1,5 @@
1
- import React, {useState} from 'react';
1
+ // @ts-nocheck
2
+ import React, {useContext, useState} from 'react';
2
3
  import {
3
4
  View,
4
5
  Image,
@@ -9,7 +10,12 @@ import {
9
10
  ViewStyle,
10
11
  StyleProp,
11
12
  } from 'react-native';
13
+ import {useString} from '../utils/useString';
12
14
  import {networkIconsObject} from '../components/NetworkQualityContext';
15
+ import {NetworkQualities} from 'src/language/default-labels/videoCallScreenLabels';
16
+ import {isWeb} from '../utils/common';
17
+ import NetworkQualityContext from '../components/NetworkQualityContext';
18
+ import {RenderInterface, UidType} from '../../agora-rn-uikit';
13
19
 
14
20
  /**
15
21
  *
@@ -22,17 +28,45 @@ import {networkIconsObject} from '../components/NetworkQualityContext';
22
28
  *
23
29
  */
24
30
  export const NetworkQualityPill = ({
25
- networkStat,
31
+ user,
26
32
  primaryColor,
27
33
  small,
28
34
  rootStyle,
29
35
  }: {
30
- networkStat: number;
36
+ user: RenderInterface;
31
37
  primaryColor: any;
32
38
  small?: boolean;
33
39
  rootStyle?: StyleProp<ViewStyle>;
34
40
  }) => {
35
41
  const [networkTextVisible, setNetworkTextVisible] = useState(false);
42
+ //commented for v1 release
43
+ //const getLabel = useString<NetworkQualities>('networkQualityLabel');
44
+ const getLabel = (quality: string) => {
45
+ switch (quality) {
46
+ case 'unknown':
47
+ return 'Unknown';
48
+ case 'excellent':
49
+ return 'Excellent';
50
+ case 'good':
51
+ return 'Good';
52
+ case 'bad':
53
+ return 'Bad';
54
+ case 'veryBad':
55
+ return 'Very Bad';
56
+ case 'unpublished':
57
+ return 'Unpublished';
58
+ case 'loading':
59
+ return 'Loading';
60
+ default:
61
+ return 'Loading';
62
+ }
63
+ };
64
+ const networkQualityStat = useContext(NetworkQualityContext);
65
+ const networkStat = networkQualityStat[user.uid]
66
+ ? networkQualityStat[user.uid]
67
+ : user.audio || user.video
68
+ ? 8
69
+ : 7;
36
70
 
37
71
  return (
38
72
  <View
@@ -42,8 +76,7 @@ export const NetworkQualityPill = ({
42
76
  opacity: networkTextVisible ? 1 : 0.8,
43
77
  },
44
78
  rootStyle,
45
- ]}
46
- >
79
+ ]}>
47
80
  <PlatformSpecificWrapper {...{networkTextVisible, setNetworkTextVisible}}>
48
81
  <View style={[style.networkIndicatorBackdrop]}>
49
82
  <Image
@@ -68,9 +101,8 @@ export const NetworkQualityPill = ({
68
101
  style={[
69
102
  style.networkPillText,
70
103
  {fontSize: small ? 14 : 15, userSelect: 'none'},
71
- ]}
72
- >
73
- {networkIconsObject[networkStat].text}
104
+ ]}>
105
+ {getLabel(networkIconsObject[networkStat].text)}
74
106
  </Text>
75
107
  )}
76
108
  </PlatformSpecificWrapper>
@@ -83,7 +115,7 @@ const PlatformSpecificWrapper = ({
83
115
  setNetworkTextVisible,
84
116
  children,
85
117
  }: any) => {
86
- return Platform.OS !== 'web' ? (
118
+ return !isWeb ? (
87
119
  <Pressable
88
120
  style={{
89
121
  height: '100%',
@@ -93,8 +125,7 @@ const PlatformSpecificWrapper = ({
93
125
  }}
94
126
  onPress={() => {
95
127
  setNetworkTextVisible((visible: boolean) => !visible);
96
- }}
97
- >
128
+ }}>
98
129
  {children}
99
130
  </Pressable>
100
131
  ) : (
@@ -114,8 +145,7 @@ const PlatformSpecificWrapper = ({
114
145
  }}
115
146
  onMouseLeave={() => {
116
147
  setNetworkTextVisible(false);
117
- }}
118
- >
148
+ }}>
119
149
  {children}
120
150
  </div>
121
151
  );
@@ -10,7 +10,8 @@
10
10
  *********************************************
11
11
  */
12
12
  import React, {useContext} from 'react';
13
- import {View, TouchableOpacity, Text, Platform, StyleSheet} from 'react-native';
13
+ import {View, TouchableOpacity, Text, StyleSheet} from 'react-native';
14
+ import {isWeb} from '../utils/common';
14
15
  import ColorContext from '../components/ColorContext';
15
16
 
16
17
  /**
@@ -22,7 +23,7 @@ const OpenInNativeButton = () => {
22
23
  const {primaryColor} = useContext(ColorContext);
23
24
  const openInNative = () => {};
24
25
 
25
- return Platform.OS === 'web' ? (
26
+ return isWeb ? (
26
27
  <View style={{position: 'absolute', right: 0}}>
27
28
  <TouchableOpacity
28
29
  style={[style.btn, {borderColor: primaryColor}]}