agora-appbuilder-core 3.0.9 → 4.0.0-api.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 (305) hide show
  1. package/Readme.md +6 -0
  2. package/package.json +2 -2
  3. package/template/_package-lock.json +5871 -4728
  4. package/template/agora-rn-uikit/src/AgoraUIKit.tsx +6 -6
  5. package/template/agora-rn-uikit/src/Contexts/ContentContext.tsx +10 -0
  6. package/template/agora-rn-uikit/src/Contexts/DispatchContext.tsx +22 -0
  7. package/template/agora-rn-uikit/src/Contexts/LocalUserContext.tsx +10 -6
  8. package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +28 -8
  9. package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +7 -15
  10. package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +30 -26
  11. package/template/agora-rn-uikit/src/Controls/Icons.ts +30 -83
  12. package/template/agora-rn-uikit/src/Controls/ImageIcon.tsx +6 -6
  13. package/template/agora-rn-uikit/src/Controls/Local/LocalAudioMute.tsx +4 -2
  14. package/template/agora-rn-uikit/src/Controls/Local/LocalVideoMute.tsx +4 -2
  15. package/template/agora-rn-uikit/src/Controls/Local/Recording.tsx +0 -2
  16. package/template/agora-rn-uikit/src/Controls/Local/SwitchCamera.tsx +6 -6
  17. package/template/agora-rn-uikit/src/Controls/LocalControls.tsx +5 -5
  18. package/template/agora-rn-uikit/src/Controls/Remote/RemoteAudioMute.tsx +4 -4
  19. package/template/agora-rn-uikit/src/Controls/Remote/RemoteVideoMute.tsx +4 -4
  20. package/template/agora-rn-uikit/src/Controls/RemoteControls.tsx +2 -2
  21. package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +6 -6
  22. package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +6 -6
  23. package/template/agora-rn-uikit/src/Reducer/LocalPermissionState.ts +23 -0
  24. package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +6 -6
  25. package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +7 -7
  26. package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +7 -7
  27. package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +10 -10
  28. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +6 -6
  29. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +6 -6
  30. package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +5 -5
  31. package/template/agora-rn-uikit/src/Reducer/UserPin.ts +11 -0
  32. package/template/agora-rn-uikit/src/Reducer/index.ts +2 -0
  33. package/template/agora-rn-uikit/src/Rtc/Create.tsx +74 -7
  34. package/template/agora-rn-uikit/src/Rtc/Join.tsx +5 -4
  35. package/template/agora-rn-uikit/src/RtcConfigure.tsx +76 -49
  36. package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +17 -7
  37. package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +17 -11
  38. package/template/agora-rn-uikit/src/Views/MinVideoView.tsx +2 -2
  39. package/template/agora-rn-uikit/src/index.ts +17 -9
  40. package/template/android/app/build.gradle +1 -0
  41. package/template/android/app/src/main/AndroidManifest.xml +22 -15
  42. package/template/android/app/src/main/assets/fonts/SourceSansPro-Regular.ttf +0 -0
  43. package/template/android/app/src/main/assets/fonts/icomoon.ttf +0 -0
  44. package/template/android/app/src/main/java/com/helloworld/MainActivity.java +50 -0
  45. package/template/android/app/src/main/res/values/colors.xml +7 -0
  46. package/template/android/build.gradle +3 -3
  47. package/template/babel.config.js +1 -0
  48. package/template/bridge/rtc/webNg/RtcEngine.ts +110 -17
  49. package/template/customization-api/action-library.ts +10 -14
  50. package/template/customization-api/app-state.ts +4 -6
  51. package/template/customization-api/customEvents.ts +2 -2
  52. package/template/customization-api/customize.ts +1 -1
  53. package/template/customization-api/sub-components.ts +4 -12
  54. package/template/customization-api/typeDefinition.ts +15 -38
  55. package/template/customization-implementation/createHook.ts +24 -6
  56. package/template/customization-implementation/index.ts +1 -1
  57. package/template/customization-implementation/useCustomization.tsx +5 -7
  58. package/template/electron/index.html +27 -27
  59. package/template/electron/renderer/index.js +1 -0
  60. package/template/global.d.ts +26 -4
  61. package/template/index.rsdk.tsx +1 -0
  62. package/template/index.web.js +2 -1
  63. package/template/index.wsdk.tsx +9 -2
  64. package/template/ios/HelloWorld/Info.plist +14 -1
  65. package/template/ios/HelloWorld.xcodeproj/project.pbxproj +17 -0
  66. package/template/metro.config.js +1 -1
  67. package/template/package.json +18 -7
  68. package/template/react-native-toast-message/index.d.ts +43 -43
  69. package/template/react-native-toast-message/src/colors/index.js +3 -2
  70. package/template/react-native-toast-message/src/components/base/index.js +46 -59
  71. package/template/react-native-toast-message/src/components/base/styles.js +16 -32
  72. package/template/react-native-toast-message/src/components/checkbox.js +178 -0
  73. package/template/react-native-toast-message/src/components/error.js +3 -2
  74. package/template/react-native-toast-message/src/components/info.js +3 -2
  75. package/template/react-native-toast-message/src/components/success.js +3 -2
  76. package/template/react-native-toast-message/src/index.js +122 -31
  77. package/template/react-native-toast-message/src/index.sdk.tsx +125 -35
  78. package/template/react-native-toast-message/src/styles.js +3 -4
  79. package/template/react-native-toast-message/src/styles.sdk.ts +3 -4
  80. package/template/react-native.config.js +7 -0
  81. package/template/src/App.tsx +19 -14
  82. package/template/src/AppWrapper.tsx +74 -29
  83. package/template/src/SDKAppWrapper.tsx +60 -64
  84. package/template/src/app-state/useLocalUserInfo.ts +3 -3
  85. package/template/src/assets/font-styles.css +329 -0
  86. package/template/src/assets/fonts/SourceSansPro-Regular.ttf +0 -0
  87. package/template/src/assets/fonts/icomoon.ttf +0 -0
  88. package/template/src/assets/permission.png +0 -0
  89. package/template/src/assets/selection.json +1 -0
  90. package/template/src/atoms/ActionMenu.tsx +236 -0
  91. package/template/src/atoms/AnimatedActiveSpeaker.native.tsx +71 -0
  92. package/template/src/atoms/AnimatedActiveSpeaker.tsx +84 -0
  93. package/template/src/atoms/AnimatedRings.native.tsx +68 -0
  94. package/template/src/atoms/AnimatedRings.tsx +70 -0
  95. package/template/src/atoms/Card.tsx +61 -0
  96. package/template/src/atoms/CircularProgress.native.tsx +121 -0
  97. package/template/src/atoms/CircularProgress.tsx +102 -0
  98. package/template/src/atoms/CustomIcon.tsx +88 -0
  99. package/template/src/atoms/CustomSwitch.tsx +287 -0
  100. package/template/src/atoms/Dropdown.tsx +306 -0
  101. package/template/src/atoms/HorizontalRule.tsx +3 -1
  102. package/template/src/atoms/IconButton.tsx +162 -0
  103. package/template/src/atoms/ImageIcon.tsx +98 -0
  104. package/template/src/atoms/InfoBubble.tsx +291 -0
  105. package/template/src/atoms/Input.tsx +87 -0
  106. package/template/src/atoms/InviteInfo.tsx +166 -0
  107. package/template/src/atoms/LinkButton.tsx +28 -0
  108. package/template/src/atoms/OutlineButton.tsx +61 -0
  109. package/template/src/atoms/ParticipantsCount.tsx +74 -0
  110. package/template/src/atoms/Popup.tsx +147 -0
  111. package/template/src/atoms/PrimaryButton.tsx +51 -26
  112. package/template/src/atoms/RecordingInfo.tsx +52 -0
  113. package/template/src/atoms/SecondaryButton.tsx +8 -5
  114. package/template/src/atoms/Spacer.tsx +22 -0
  115. package/template/src/atoms/TertiaryButton.tsx +78 -0
  116. package/template/src/atoms/TextInput.tsx +12 -14
  117. package/template/src/atoms/Toggle.tsx +47 -0
  118. package/template/src/atoms/Toolbar.tsx +68 -0
  119. package/template/src/atoms/ToolbarItem.tsx +63 -0
  120. package/template/src/atoms/Tooltip.native.tsx +65 -0
  121. package/template/src/atoms/Tooltip.tsx +94 -0
  122. package/template/src/atoms/UserAvatar.tsx +60 -0
  123. package/template/src/components/Chat.tsx +164 -278
  124. package/template/src/components/ChatContext.ts +8 -1
  125. package/template/src/components/ColorConfigure.tsx +1 -1
  126. package/template/src/components/ColorContext.ts +1 -1
  127. package/template/src/components/CommonStyles.ts +44 -0
  128. package/template/src/components/Controls.tsx +331 -73
  129. package/template/src/components/{Controls.native.tsx → Controls1.native.tsx} +8 -6
  130. package/template/src/components/DeviceConfigure.tsx +511 -106
  131. package/template/src/components/DeviceContext.tsx +8 -4
  132. package/template/src/components/EventsConfigure.tsx +192 -10
  133. package/template/src/components/GraphQLProvider.tsx +1 -1
  134. package/template/src/components/GridVideo.tsx +60 -45
  135. package/template/src/components/HostControlView.tsx +114 -35
  136. package/template/src/components/Navbar.tsx +219 -437
  137. package/template/src/components/Navigation.tsx +15 -1
  138. package/template/src/components/NetworkQualityContext.tsx +22 -22
  139. package/template/src/components/ParticipantsView.tsx +178 -156
  140. package/template/src/components/PinnedVideo.tsx +206 -121
  141. package/template/src/components/Precall.native.tsx +358 -119
  142. package/template/src/components/Precall.tsx +272 -138
  143. package/template/src/components/RTMConfigure.tsx +66 -19
  144. package/template/src/components/Router.electron.ts +1 -0
  145. package/template/src/components/Router.native.ts +1 -0
  146. package/template/src/components/Router.sdk.ts +1 -0
  147. package/template/src/components/Router.ts +1 -0
  148. package/template/src/components/SdkApiContext.tsx +161 -0
  149. package/template/src/components/Settings.tsx +26 -95
  150. package/template/src/components/SettingsView.tsx +251 -56
  151. package/template/src/components/Share.tsx +305 -276
  152. package/template/src/components/StorageContext.tsx +30 -3
  153. package/template/src/components/ToastComponent.tsx +8 -0
  154. package/template/src/components/chat-messages/useChatMessages.tsx +97 -50
  155. package/template/src/components/chat-ui/useChatUIControls.tsx +76 -0
  156. package/template/src/components/common/Error.tsx +20 -6
  157. package/template/src/components/common/Logo.tsx +16 -15
  158. package/template/src/components/contexts/LiveStreamDataContext.tsx +16 -11
  159. package/template/src/components/contexts/VideoMeetingDataContext.tsx +41 -11
  160. package/template/src/components/contexts/WhiteboardContext.tsx +3 -3
  161. package/template/src/components/livestream/LiveStreamContext.tsx +284 -50
  162. package/template/src/components/livestream/Types.ts +39 -14
  163. package/template/src/components/livestream/index.ts +1 -0
  164. package/template/src/components/livestream/views/LiveStreamControls.tsx +9 -4
  165. package/template/src/components/participants/AllAudienceParticipants.tsx +102 -31
  166. package/template/src/components/participants/AllHostParticipants.tsx +106 -35
  167. package/template/src/components/participants/Participant.tsx +300 -0
  168. package/template/src/components/participants/ParticipantName.tsx +13 -7
  169. package/template/src/components/participants/ParticipantSectionTitle.tsx +35 -10
  170. package/template/src/components/participants/ScreenshareParticipants.tsx +144 -12
  171. package/template/src/components/participants/UserActionMenuOptions.tsx +396 -0
  172. package/template/src/components/popups/InvitePopup.tsx +115 -0
  173. package/template/src/components/popups/StopRecordingPopup.tsx +114 -0
  174. package/template/src/components/precall/LocalMute.tsx +84 -14
  175. package/template/src/components/precall/{LocalMute.native.tsx → LocalMute1.native.tsx} +21 -5
  176. package/template/src/components/precall/PermissionHelper.native.tsx +5 -0
  177. package/template/src/components/precall/PermissionHelper.tsx +126 -0
  178. package/template/src/components/precall/PreCallSettings.tsx +52 -0
  179. package/template/src/components/precall/VideoPreview.native.tsx +51 -6
  180. package/template/src/components/precall/VideoPreview.tsx +164 -8
  181. package/template/src/components/precall/joinCallBtn.native.tsx +2 -2
  182. package/template/src/components/precall/joinCallBtn.tsx +17 -4
  183. package/template/src/components/precall/meetingTitle.tsx +17 -14
  184. package/template/src/components/precall/selectDevice.tsx +1 -21
  185. package/template/src/components/precall/textInput.tsx +34 -6
  186. package/template/src/components/precall/usePreCall.tsx +39 -1
  187. package/template/src/components/{meeting-info/useMeetingInfo.tsx → room-info/useRoomInfo.tsx} +34 -10
  188. package/template/src/components/{meeting-info/useSetMeetingInfo.tsx → room-info/useSetRoomInfo.tsx} +12 -12
  189. package/template/src/components/styles.ts +42 -21
  190. package/template/src/components/useShareLink.tsx +19 -21
  191. package/template/src/components/useToast.tsx +41 -0
  192. package/template/src/components/useUserPreference.tsx +9 -6
  193. package/template/src/components/useVideoCall.tsx +84 -0
  194. package/template/src/language/default-labels/createScreenLabels.ts +3 -3
  195. package/template/src/language/default-labels/joinScreenLabels.ts +2 -2
  196. package/template/src/language/default-labels/precallScreenLabels.ts +3 -3
  197. package/template/src/language/default-labels/shareLinkScreenLabels.ts +5 -5
  198. package/template/src/language/default-labels/videoCallScreenLabels.ts +5 -5
  199. package/template/src/pages/Authenticate.tsx +5 -15
  200. package/template/src/pages/Create.tsx +304 -191
  201. package/template/src/pages/Endcall.tsx +148 -0
  202. package/template/src/pages/Join.tsx +96 -70
  203. package/template/src/pages/VideoCall.tsx +179 -69
  204. package/template/src/pages/video-call/ActionSheet.native.tsx +215 -0
  205. package/template/src/pages/video-call/ActionSheet.tsx +226 -0
  206. package/template/src/pages/video-call/ActionSheetContent.tsx +479 -0
  207. package/template/src/pages/video-call/ActionSheetHandle.tsx +38 -0
  208. package/template/src/pages/video-call/ActionSheetStyles.css +138 -0
  209. package/template/src/pages/video-call/DefaultLayouts.ts +6 -6
  210. package/template/src/pages/video-call/NameWithMicIcon.tsx +93 -49
  211. package/template/src/pages/video-call/RenderComponent.tsx +6 -30
  212. package/template/src/pages/video-call/SidePanelHeader.tsx +186 -0
  213. package/template/src/pages/video-call/VideoCallMobileView.tsx +138 -0
  214. package/template/src/pages/video-call/VideoCallScreen.native.tsx +37 -0
  215. package/template/src/pages/video-call/VideoCallScreen.tsx +109 -66
  216. package/template/src/pages/video-call/VideoComponent.tsx +20 -4
  217. package/template/src/pages/video-call/VideoRenderer.tsx +227 -61
  218. package/template/src/pages/video-call/index.ts +35 -7
  219. package/template/src/rtm/RTMEngine.ts +8 -0
  220. package/template/src/rtm-events/constants.ts +3 -1
  221. package/template/src/rtm-events-api/Events.ts +5 -4
  222. package/template/src/rtm-events-api/LocalEvents.ts +6 -0
  223. package/template/src/rtm-events-api/types.ts +5 -5
  224. package/template/src/subComponents/ChatBubble.tsx +125 -84
  225. package/template/src/subComponents/ChatContainer.tsx +280 -93
  226. package/template/src/subComponents/ChatInput.ios.tsx +175 -0
  227. package/template/src/subComponents/ChatInput.tsx +72 -115
  228. package/template/src/subComponents/Checkbox.native.tsx +16 -5
  229. package/template/src/subComponents/Checkbox.tsx +2 -2
  230. package/template/src/subComponents/CopyJoinInfo.tsx +36 -58
  231. package/template/src/subComponents/EndcallPopup.tsx +107 -0
  232. package/template/src/subComponents/FallbackLogo.tsx +122 -40
  233. package/template/src/subComponents/LanguageSelector.tsx +1 -1
  234. package/template/src/subComponents/LayoutIconButton.tsx +201 -0
  235. package/template/src/subComponents/LayoutIconDropdown.tsx +131 -134
  236. package/template/src/subComponents/{LayoutIconDropdown.native.tsx → LayoutIconDropdown1.native.tsx} +4 -18
  237. package/template/src/subComponents/LocalAudioMute.tsx +119 -27
  238. package/template/src/subComponents/LocalEndCall.tsx +73 -35
  239. package/template/src/subComponents/LocalSwitchCamera.tsx +19 -32
  240. package/template/src/subComponents/LocalVideoMute.tsx +117 -27
  241. package/template/src/subComponents/Logo.tsx +3 -4
  242. package/template/src/subComponents/LogoutButton.tsx +1 -1
  243. package/template/src/subComponents/NetworkQualityPill.tsx +66 -68
  244. package/template/src/subComponents/OpenInNativeButton.tsx +3 -3
  245. package/template/src/subComponents/Recording.tsx +28 -29
  246. package/template/src/subComponents/RemoteAudioMute.tsx +83 -29
  247. package/template/src/subComponents/RemoteEndCall.tsx +8 -5
  248. package/template/src/subComponents/RemoteMutePopup.tsx +193 -0
  249. package/template/src/subComponents/RemoteVideoMute.tsx +74 -21
  250. package/template/src/subComponents/RemoveMeetingPopup.tsx +109 -0
  251. package/template/src/subComponents/RemoveScreensharePopup.tsx +109 -0
  252. package/template/src/subComponents/ScreenShareNotice.tsx +83 -8
  253. package/template/src/subComponents/SelectDevice.tsx +404 -61
  254. package/template/src/subComponents/SelectDeviceSettings.backup.tsx +207 -0
  255. package/template/src/subComponents/SelectOAuth.tsx +9 -8
  256. package/template/src/subComponents/SidePanelButtons.ts +0 -3
  257. package/template/src/subComponents/SidePanelHeader.tsx +112 -0
  258. package/template/src/subComponents/ToastConfig.tsx +150 -10
  259. package/template/src/subComponents/chat/ChatParticipants.tsx +188 -79
  260. package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +97 -34
  261. package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +29 -33
  262. package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +8 -8
  263. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +24 -11
  264. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +17 -10
  265. package/template/src/subComponents/recording/useRecording.tsx +81 -29
  266. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +52 -70
  267. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +23 -12
  268. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +44 -19
  269. package/template/src/theme/index.ts +46 -0
  270. package/template/src/utils/PlatformWrapper.tsx +21 -0
  271. package/template/src/utils/SdkEvents.ts +23 -14
  272. package/template/src/utils/SdkMethodEvents.ts +81 -0
  273. package/template/src/utils/common.tsx +155 -1
  274. package/template/src/utils/hexadecimalTransparency.ts +108 -0
  275. package/template/src/utils/index.tsx +19 -0
  276. package/template/src/utils/isMobileOrTablet.ts +7 -2
  277. package/template/src/utils/pendingStateUpdateHelper.ts +19 -0
  278. package/template/src/utils/useActiveSpeaker.ts +42 -0
  279. package/template/src/utils/{useCreateMeeting.ts → useCreateRoom.ts} +19 -14
  280. package/template/src/utils/{useButtonTemplate.tsx → useFocus.tsx} +19 -16
  281. package/template/src/utils/useGetMeetingPhrase.ts +10 -10
  282. package/template/src/utils/useIsAudioEnabled.ts +3 -3
  283. package/template/src/utils/useIsHandRaised.ts +13 -0
  284. package/template/src/utils/useIsPSTN.ts +3 -3
  285. package/template/src/utils/useIsVideoEnabled.ts +3 -3
  286. package/template/src/utils/{useJoinMeeting.ts → useJoinRoom.ts} +27 -21
  287. package/template/src/utils/useMutePSTN.ts +2 -2
  288. package/template/src/utils/useMuteToggleLocal.ts +58 -5
  289. package/template/src/utils/useRemoteEndCall.ts +4 -4
  290. package/template/src/utils/useRemoteEndScreenshare.ts +26 -0
  291. package/template/src/utils/useRemoteMute.ts +7 -7
  292. package/template/src/utils/useRemoteRequest.ts +84 -0
  293. package/template/src/utils/useSwitchCamera.native.tsx +25 -0
  294. package/template/src/utils/useSwitchCamera.tsx +19 -0
  295. package/template/src/utils/useToolbar.tsx +59 -0
  296. package/template/web/index.html +5 -0
  297. package/template/webpack.commons.js +13 -8
  298. package/template/webpack.rsdk.config.js +1 -2
  299. package/template/webpack.web.config.js +1 -0
  300. package/template/agora-rn-uikit/src/Contexts/RenderContext.tsx +0 -10
  301. package/template/src/assets/icons.ts +0 -102
  302. package/template/src/components/chat-ui/useChatUIControl.tsx +0 -69
  303. package/template/src/components/participants/MeParticipant.tsx +0 -38
  304. package/template/src/components/participants/RemoteParticipants.tsx +0 -71
  305. package/template/src/pages/video-call/CustomUserContextHolder.tsx +0 -20
@@ -10,34 +10,37 @@
10
10
  *********************************************
11
11
  */
12
12
 
13
- import React from 'react';
13
+ import React, {SetStateAction} from 'react';
14
14
  import {createHook} from 'customization-implementation';
15
15
 
16
- export enum ButtonTemplateName {
17
- topBar,
18
- bottomBar,
16
+ export interface currentFocus {
17
+ editName: boolean;
19
18
  }
20
-
21
- export interface ButtonTemplateInferface {
22
- buttonTemplateName?: ButtonTemplateName;
19
+ export interface FocusContextInterface {
20
+ currentFocus: currentFocus;
21
+ setFocus: React.Dispatch<SetStateAction<currentFocus>>;
23
22
  }
24
23
 
25
- const ButtonTemplateContext = React.createContext<ButtonTemplateInferface>({
26
- buttonTemplateName: undefined,
24
+ const FocusContext = React.createContext<FocusContextInterface>({
25
+ currentFocus: {editName: false},
26
+ setFocus: () => {},
27
27
  });
28
28
 
29
- interface ButtonTemplateProviderProps {
30
- value: ButtonTemplateInferface;
29
+ interface FocusProviderProps {
30
+ value: FocusContextInterface;
31
31
  children: React.ReactNode;
32
32
  }
33
- const ButtonTemplateProvider = (props: ButtonTemplateProviderProps) => {
33
+ const FocusProvider = (props: FocusProviderProps) => {
34
34
  return (
35
- <ButtonTemplateContext.Provider value={{...props.value}}>
35
+ <FocusContext.Provider value={{...props.value}}>
36
36
  {props.children}
37
- </ButtonTemplateContext.Provider>
37
+ </FocusContext.Provider>
38
38
  );
39
39
  };
40
40
 
41
- const useButtonTemplate = createHook(ButtonTemplateContext);
41
+ /**
42
+ * The Focus app state governs the chatinput and editname.
43
+ */
44
+ const useFocus = createHook(FocusContext);
42
45
 
43
- export {ButtonTemplateProvider, useButtonTemplate};
46
+ export {FocusProvider, useFocus};
@@ -1,7 +1,7 @@
1
1
  import {useContext} from 'react';
2
2
  import {gql} from '@apollo/client';
3
- import {MeetingInfoContextInterface} from '../components/meeting-info/useMeetingInfo';
4
- import {useSetMeetingInfo} from '../components/meeting-info/useSetMeetingInfo';
3
+ import {RoomInfoContextInterface} from '../components/room-info/useRoomInfo';
4
+ import {useSetRoomInfo} from '../components/room-info/useSetRoomInfo';
5
5
  import {GraphQLContext} from '../components/GraphQLProvider';
6
6
 
7
7
  const SHARE = gql`
@@ -22,7 +22,7 @@ const SHARE = gql`
22
22
  `;
23
23
 
24
24
  export default function useGetMeetingPhrase() {
25
- const {setMeetingInfo} = useSetMeetingInfo();
25
+ const {setRoomInfo} = useSetRoomInfo();
26
26
  const {client} = useContext(GraphQLContext);
27
27
  return async (phrase: string) => {
28
28
  const response = await client.query({
@@ -37,28 +37,28 @@ export default function useGetMeetingPhrase() {
37
37
  try {
38
38
  if (response && response.data) {
39
39
  let data = response.data;
40
- let meetingInfo: Partial<MeetingInfoContextInterface['data']> = {
40
+ let roomInfo: Partial<RoomInfoContextInterface['data']> = {
41
41
  roomId: {attendee: ''},
42
42
  };
43
43
  if (data?.share?.passphrase?.view) {
44
- meetingInfo.roomId.attendee = data.share.passphrase.view;
44
+ roomInfo.roomId.attendee = data.share.passphrase.view;
45
45
  }
46
46
  if (data?.share?.passphrase?.host) {
47
- meetingInfo.roomId.host = data.share.passphrase.host;
47
+ roomInfo.roomId.host = data.share.passphrase.host;
48
48
  }
49
49
  if (data?.share?.pstn) {
50
- meetingInfo.pstn = {
50
+ roomInfo.pstn = {
51
51
  number: data.share.pstn.number,
52
52
  pin: data.share.pstn.dtmf,
53
53
  };
54
54
  }
55
- setMeetingInfo((prevState) => {
55
+ setRoomInfo((prevState) => {
56
56
  return {
57
57
  ...prevState,
58
58
  data: {
59
59
  ...prevState.data,
60
- roomId: meetingInfo.roomId,
61
- pstn: meetingInfo?.pstn,
60
+ roomId: roomInfo.roomId,
61
+ pstn: roomInfo?.pstn,
62
62
  },
63
63
  };
64
64
  });
@@ -9,7 +9,7 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import {useRender} from 'customization-api';
12
+ import {useContent} from 'customization-api';
13
13
  import {UidType} from '../../agora-rn-uikit';
14
14
  import {ToggleState} from '../../agora-rn-uikit/src/Contexts/PropsContext';
15
15
 
@@ -18,14 +18,14 @@ import {ToggleState} from '../../agora-rn-uikit/src/Contexts/PropsContext';
18
18
  * @returns function
19
19
  */
20
20
  function useIsAudioEnabled() {
21
- const {renderList} = useRender();
21
+ const {defaultContent} = useContent();
22
22
  /**
23
23
  *
24
24
  * @param uid UidType
25
25
  * @returns boolean
26
26
  */
27
27
  const isAudioEnabled = (uid: UidType): boolean =>
28
- renderList[uid]?.audio === ToggleState.enabled;
28
+ defaultContent[uid]?.audio === ToggleState.enabled;
29
29
 
30
30
  return isAudioEnabled;
31
31
  }
@@ -0,0 +1,13 @@
1
+ import {useContext} from 'react';
2
+ import {UidType} from '../../agora-rn-uikit';
3
+ import LiveStreamContext from '../components/livestream/LiveStreamContext';
4
+ import {RaiseHandValue} from '../components/livestream/Types';
5
+
6
+ const useIsHandRaised = () => {
7
+ const {raiseHandList} = useContext(LiveStreamContext);
8
+ const isHandRaised = (uid: UidType) => {
9
+ return raiseHandList[uid]?.raised === RaiseHandValue.TRUE;
10
+ };
11
+ return isHandRaised;
12
+ };
13
+ export default useIsHandRaised;
@@ -9,7 +9,7 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import {useRender} from 'customization-api';
12
+ import {useContent} from 'customization-api';
13
13
  import {UidType} from '../../agora-rn-uikit';
14
14
 
15
15
  /**
@@ -17,14 +17,14 @@ import {UidType} from '../../agora-rn-uikit';
17
17
  * @returns function
18
18
  */
19
19
  function useIsPSTN() {
20
- const {renderList} = useRender();
20
+ const {defaultContent} = useContent();
21
21
  /**
22
22
  *
23
23
  * @param uid number
24
24
  * @returns boolean
25
25
  */
26
26
  const isPSTN = (uid: UidType) =>
27
- !renderList[uid] && String(uid)[0] === '1' ? true : false;
27
+ !defaultContent[uid] && String(uid)[0] === '1' ? true : false;
28
28
  return isPSTN;
29
29
  }
30
30
 
@@ -9,7 +9,7 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import {useRender} from 'customization-api';
12
+ import {useContent} from 'customization-api';
13
13
  import {UidType, ToggleState} from '../../agora-rn-uikit';
14
14
 
15
15
  /**
@@ -17,7 +17,7 @@ import {UidType, ToggleState} from '../../agora-rn-uikit';
17
17
  * @returns function
18
18
  */
19
19
  function useIsVideoEnabled() {
20
- const {renderList} = useRender();
20
+ const {defaultContent} = useContent();
21
21
 
22
22
  /**
23
23
  *
@@ -25,7 +25,7 @@ function useIsVideoEnabled() {
25
25
  * @returns boolean
26
26
  */
27
27
  const isVideoEnabled = (uid: UidType): boolean =>
28
- renderList[uid]?.video === ToggleState.enabled;
28
+ defaultContent[uid]?.video === ToggleState.enabled;
29
29
 
30
30
  return isVideoEnabled;
31
31
  }
@@ -1,8 +1,8 @@
1
1
  import {useContext} from 'react';
2
2
  import {gql} from '@apollo/client';
3
3
  import StorageContext from '../components/StorageContext';
4
- import {MeetingInfoContextInterface} from '../components/meeting-info/useMeetingInfo';
5
- import {useSetMeetingInfo} from '../components/meeting-info/useSetMeetingInfo';
4
+ import {RoomInfoContextInterface} from '../components/room-info/useRoomInfo';
5
+ import {useSetRoomInfo} from '../components/room-info/useSetRoomInfo';
6
6
  import {GraphQLContext} from '../components/GraphQLProvider';
7
7
 
8
8
  const JOIN_CHANNEL_PHRASE_AND_GET_USER = gql`
@@ -53,12 +53,12 @@ const JOIN_CHANNEL_PHRASE = gql`
53
53
  /**
54
54
  * Returns an asynchronous function to join a meeting with the given phrase.
55
55
  */
56
- export default function useJoinMeeting() {
56
+ export default function useJoinRoom() {
57
57
  const {store} = useContext(StorageContext);
58
- const {setMeetingInfo} = useSetMeetingInfo();
58
+ const {setRoomInfo} = useSetRoomInfo();
59
59
  const {client} = useContext(GraphQLContext);
60
60
  return async (phrase: string) => {
61
- setMeetingInfo((prevState) => {
61
+ setRoomInfo((prevState) => {
62
62
  return {
63
63
  ...prevState,
64
64
  isJoinDataFetched: false,
@@ -79,48 +79,54 @@ export default function useJoinMeeting() {
79
79
  } else {
80
80
  if (response && response.data) {
81
81
  let data = response.data;
82
- let meetingInfo: Partial<MeetingInfoContextInterface['data']> = {};
82
+ let roomInfo: Partial<RoomInfoContextInterface['data']> = {};
83
83
  if (data?.joinChannel?.channel) {
84
- meetingInfo.channel = data.joinChannel.channel;
84
+ roomInfo.channel = data.joinChannel.channel;
85
85
  }
86
86
  if (data?.joinChannel?.mainUser?.uid) {
87
- meetingInfo.uid = data.joinChannel.mainUser.uid;
87
+ roomInfo.uid = data.joinChannel.mainUser.uid;
88
88
  }
89
89
  if (data?.joinChannel?.mainUser?.rtc) {
90
- meetingInfo.token = data.joinChannel.mainUser.rtc;
90
+ roomInfo.token = data.joinChannel.mainUser.rtc;
91
91
  }
92
92
  if (data?.joinChannel?.mainUser?.rtm) {
93
- meetingInfo.rtmToken = data.joinChannel.mainUser.rtm;
93
+ roomInfo.rtmToken = data.joinChannel.mainUser.rtm;
94
94
  }
95
95
  if (data?.joinChannel?.secret) {
96
- meetingInfo.encryptionSecret = data.joinChannel.secret;
96
+ roomInfo.encryptionSecret = data.joinChannel.secret;
97
97
  }
98
98
  if (data?.joinChannel?.screenShare?.uid) {
99
- meetingInfo.screenShareUid = data.joinChannel.screenShare.uid;
99
+ roomInfo.screenShareUid = data.joinChannel.screenShare.uid;
100
100
  }
101
101
  if (data?.joinChannel?.screenShare?.rtc) {
102
- meetingInfo.screenShareToken = data.joinChannel.screenShare.rtc;
102
+ roomInfo.screenShareToken = data.joinChannel.screenShare.rtc;
103
103
  }
104
104
  if (data?.joinChannel?.isHost) {
105
- meetingInfo.isHost = data.joinChannel.isHost;
105
+ roomInfo.isHost = data.joinChannel.isHost;
106
106
  }
107
107
  if (data?.joinChannel?.title) {
108
- meetingInfo.meetingTitle = data.joinChannel.title;
108
+ roomInfo.meetingTitle = data.joinChannel.title;
109
109
  }
110
110
  //getUser is not available from backend
111
111
  // if (data?.getUser?.name) {
112
- // meetingInfo.username = data.getUser.name;
112
+ // roomInfo.username = data.getUser.name;
113
113
  // }
114
- setMeetingInfo((prevState) => {
114
+ console.log('!!!!!Meetinginfo', {
115
+ roomInfo,
116
+ response: response.data,
117
+ });
118
+ setRoomInfo((prevState) => {
119
+ let compiledMeetingInfo = {
120
+ ...prevState.data,
121
+ ...roomInfo,
122
+ };
115
123
  return {
116
124
  ...prevState,
117
125
  isJoinDataFetched: true,
118
- data: {
119
- ...prevState.data,
120
- ...meetingInfo,
121
- },
126
+ data: compiledMeetingInfo,
122
127
  };
123
128
  });
129
+ return roomInfo;
124
130
  } else {
125
131
  throw new Error('An error occurred in parsing the channel data.');
126
132
  }
@@ -1,6 +1,6 @@
1
1
  import {gql, useMutation} from '@apollo/client';
2
2
  import {UidType} from '../../agora-rn-uikit';
3
- import {useMeetingInfo} from '../components/meeting-info/useMeetingInfo';
3
+ import {useRoomInfo} from '../components/room-info/useRoomInfo';
4
4
  import useIsPSTN from './useIsPSTN';
5
5
  const MUTE_PSTN = gql`
6
6
  mutation mutePSTN($uid: Int!, $passphrase: String!, $mute: Boolean!) {
@@ -15,7 +15,7 @@ const useMutePSTN = () => {
15
15
  const [mutePSTN, {data, loading, error}] = useMutation(MUTE_PSTN);
16
16
  const {
17
17
  data: {isHost, roomId},
18
- } = useMeetingInfo();
18
+ } = useRoomInfo();
19
19
  const isPSTN = useIsPSTN();
20
20
  return async (uid: UidType) => {
21
21
  if (isHost) {
@@ -10,7 +10,12 @@
10
10
  *********************************************
11
11
  */
12
12
  import {useLocalUserInfo, useRtc} from 'customization-api';
13
+ import {useContext, useEffect, useRef, useState} from 'react';
14
+
13
15
  import {ToggleState} from '../../agora-rn-uikit/src/Contexts/PropsContext';
16
+ import {isMobileUA, isWebInternal} from './common';
17
+ import {AppState} from 'react-native';
18
+ import {DispatchContext} from '../../agora-rn-uikit';
14
19
 
15
20
  export enum MUTE_LOCAL_TYPE {
16
21
  audio,
@@ -20,9 +25,52 @@ export enum MUTE_LOCAL_TYPE {
20
25
  * Returns an asynchronous function to toggle muted state of the given track type for the local user.
21
26
  */
22
27
  function useMuteToggleLocal() {
23
- const {RtcEngine, dispatch} = useRtc();
28
+ const {RtcEngineUnsafe} = useRtc();
29
+ const {dispatch} = useContext(DispatchContext);
24
30
  const local = useLocalUserInfo();
25
31
 
32
+ const appState = useRef(AppState.currentState);
33
+ const [appStateVisible, setAppStateVisible] = useState(appState.current);
34
+ const isCamON = useRef(local.video);
35
+
36
+ useEffect(() => {
37
+ if ($config.AUDIO_ROOM || !isMobileUA()) return;
38
+ const subscription = AppState.addEventListener('change', (nextAppState) => {
39
+ appState.current = nextAppState;
40
+ setAppStateVisible(appState.current);
41
+ });
42
+
43
+ return () => {
44
+ subscription?.remove();
45
+ };
46
+ }, []);
47
+
48
+ useEffect(() => {
49
+ // console.log(`Video State ${local.video} in Mode ${appStateVisible}`);
50
+ if (appStateVisible === 'background') {
51
+ isCamON.current = local.video;
52
+ if (isCamON.current) {
53
+ isWebInternal()
54
+ ? RtcEngineUnsafe.muteLocalVideoStream(true)
55
+ : RtcEngineUnsafe.enableLocalVideo(false);
56
+
57
+ dispatch({
58
+ type: 'LocalMuteVideo',
59
+ value: [0],
60
+ });
61
+ }
62
+ }
63
+ if (appStateVisible === 'active' && isCamON.current) {
64
+ isWebInternal()
65
+ ? RtcEngineUnsafe.muteLocalVideoStream(false)
66
+ : RtcEngineUnsafe.enableLocalVideo(true);
67
+ dispatch({
68
+ type: 'LocalMuteVideo',
69
+ value: [1],
70
+ });
71
+ }
72
+ }, [appStateVisible]);
73
+
26
74
  return async (type: MUTE_LOCAL_TYPE) => {
27
75
  switch (type) {
28
76
  case MUTE_LOCAL_TYPE.audio:
@@ -43,7 +91,7 @@ function useMuteToggleLocal() {
43
91
  });
44
92
 
45
93
  try {
46
- await RtcEngine.muteLocalAudioStream(
94
+ await RtcEngineUnsafe.muteLocalAudioStream(
47
95
  localAudioState === ToggleState.enabled,
48
96
  );
49
97
  // Enable UI
@@ -82,9 +130,14 @@ function useMuteToggleLocal() {
82
130
  });
83
131
 
84
132
  try {
85
- await RtcEngine.muteLocalVideoStream(
86
- localVideoState === ToggleState.enabled ? true : false,
87
- );
133
+ //enableLocalVideo not available on web
134
+ isWebInternal()
135
+ ? await RtcEngineUnsafe.muteLocalVideoStream(
136
+ localVideoState === ToggleState.enabled ? true : false,
137
+ )
138
+ : await RtcEngineUnsafe.enableLocalVideo(
139
+ localVideoState === ToggleState.enabled ? false : true,
140
+ );
88
141
 
89
142
  // Enable UI
90
143
  dispatch({
@@ -1,8 +1,8 @@
1
1
  import {controlMessageEnum} from '../components/ChatContext';
2
- import {useMeetingInfo} from '../components/meeting-info/useMeetingInfo';
2
+ import {useRoomInfo} from '../components/room-info/useRoomInfo';
3
3
  import useIsPSTN from './useIsPSTN';
4
4
  import {UidType} from '../../agora-rn-uikit';
5
- import events, {EventPersistLevel} from '../rtm-events-api';
5
+ import events, {PersistanceLevel} from '../rtm-events-api';
6
6
 
7
7
  /**
8
8
  * Returns a function to end the call for a remote user with the given uid.
@@ -10,7 +10,7 @@ import events, {EventPersistLevel} from '../rtm-events-api';
10
10
  const useRemoteEndCall = () => {
11
11
  const {
12
12
  data: {isHost},
13
- } = useMeetingInfo();
13
+ } = useRoomInfo();
14
14
  const isPSTN = useIsPSTN();
15
15
 
16
16
  return (uid: UidType) => {
@@ -19,7 +19,7 @@ const useRemoteEndCall = () => {
19
19
  events.send(
20
20
  controlMessageEnum.kickUser,
21
21
  '',
22
- EventPersistLevel.LEVEL1,
22
+ PersistanceLevel.None,
23
23
  uid,
24
24
  );
25
25
  }
@@ -0,0 +1,26 @@
1
+ import {controlMessageEnum} from '../components/ChatContext';
2
+ import {useRoomInfo} from '../components/room-info/useRoomInfo';
3
+ import {UidType} from '../../agora-rn-uikit';
4
+ import events, {PersistanceLevel} from '../rtm-events-api';
5
+
6
+ /**
7
+ * Returns a function to end the screenshare for a remote user with the given uid.
8
+ */
9
+ const useRemoteEndScreenshare = () => {
10
+ const {
11
+ data: {isHost},
12
+ } = useRoomInfo();
13
+ return (uid: UidType) => {
14
+ if (isHost && uid) {
15
+ events.send(
16
+ controlMessageEnum.kickScreenshare,
17
+ '',
18
+ PersistanceLevel.None,
19
+ uid,
20
+ );
21
+ } else {
22
+ console.error('A host can only remove the screenshare from the call.');
23
+ }
24
+ };
25
+ };
26
+ export default useRemoteEndScreenshare;
@@ -9,12 +9,12 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import {useMeetingInfo} from '../components/meeting-info/useMeetingInfo';
12
+ import {useRoomInfo} from '../components/room-info/useRoomInfo';
13
13
  import {controlMessageEnum} from '../components/ChatContext';
14
14
  import useIsPSTN from './useIsPSTN';
15
15
  import useMutePSTN from './useMutePSTN';
16
16
  import {UidType} from '../../agora-rn-uikit';
17
- import events, {EventPersistLevel} from '../rtm-events-api';
17
+ import events, {PersistanceLevel} from '../rtm-events-api';
18
18
 
19
19
  export enum MUTE_REMOTE_TYPE {
20
20
  audio,
@@ -26,7 +26,7 @@ export enum MUTE_REMOTE_TYPE {
26
26
  function useRemoteMute() {
27
27
  const {
28
28
  data: {isHost},
29
- } = useMeetingInfo();
29
+ } = useRoomInfo();
30
30
  const isPSTN = useIsPSTN();
31
31
  const mutePSTN = useMutePSTN();
32
32
 
@@ -46,7 +46,7 @@ function useRemoteMute() {
46
46
  events.send(
47
47
  controlMessageEnum.muteAudio,
48
48
  '',
49
- EventPersistLevel.LEVEL1,
49
+ PersistanceLevel.None,
50
50
  uid,
51
51
  );
52
52
  }
@@ -55,7 +55,7 @@ function useRemoteMute() {
55
55
  events.send(
56
56
  controlMessageEnum.muteAudio,
57
57
  '',
58
- EventPersistLevel.LEVEL1,
58
+ PersistanceLevel.None,
59
59
  );
60
60
  }
61
61
  break;
@@ -66,7 +66,7 @@ function useRemoteMute() {
66
66
  events.send(
67
67
  controlMessageEnum.muteVideo,
68
68
  '',
69
- EventPersistLevel.LEVEL1,
69
+ PersistanceLevel.None,
70
70
  uid,
71
71
  );
72
72
  }
@@ -75,7 +75,7 @@ function useRemoteMute() {
75
75
  events.send(
76
76
  controlMessageEnum.muteVideo,
77
77
  '',
78
- EventPersistLevel.LEVEL1,
78
+ PersistanceLevel.None,
79
79
  );
80
80
  }
81
81
  break;
@@ -0,0 +1,84 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import {useRoomInfo} from '../components/room-info/useRoomInfo';
13
+ import {controlMessageEnum} from '../components/ChatContext';
14
+ import useIsPSTN from './useIsPSTN';
15
+ import useMutePSTN from './useMutePSTN';
16
+ import {UidType} from '../../agora-rn-uikit';
17
+ import events, {PersistanceLevel} from '../rtm-events-api';
18
+
19
+ export enum REQUEST_REMOTE_TYPE {
20
+ audio,
21
+ video,
22
+ }
23
+ /**
24
+ * Returns an asynchronous function to request audio/video for a remote user with the given uid or if no uid provided, request everyone else in the meeting.
25
+ */
26
+ function useRemoteRequest() {
27
+ const {
28
+ data: {isHost},
29
+ } = useRoomInfo();
30
+ const isPSTN = useIsPSTN();
31
+
32
+ return async (type: REQUEST_REMOTE_TYPE, uid?: UidType) => {
33
+ if (isHost) {
34
+ switch (type) {
35
+ case REQUEST_REMOTE_TYPE.audio:
36
+ // To individual
37
+ if (uid) {
38
+ if (isPSTN(uid)) {
39
+ //can't ask pstn user to unmute
40
+ } else {
41
+ events.send(
42
+ controlMessageEnum.requestAudio,
43
+ '',
44
+ PersistanceLevel.None,
45
+ uid,
46
+ );
47
+ }
48
+ } else {
49
+ // To everyone
50
+ events.send(
51
+ controlMessageEnum.requestAudio,
52
+ '',
53
+ PersistanceLevel.None,
54
+ );
55
+ }
56
+ break;
57
+ case REQUEST_REMOTE_TYPE.video:
58
+ if (uid) {
59
+ // To individual
60
+ if (!isPSTN(uid)) {
61
+ events.send(
62
+ controlMessageEnum.requestVideo,
63
+ '',
64
+ PersistanceLevel.None,
65
+ uid,
66
+ );
67
+ }
68
+ } else {
69
+ // To everyone
70
+ events.send(
71
+ controlMessageEnum.requestVideo,
72
+ '',
73
+ PersistanceLevel.None,
74
+ );
75
+ }
76
+ break;
77
+ }
78
+ } else {
79
+ console.error('A host can only request audience audio or video.');
80
+ }
81
+ };
82
+ }
83
+
84
+ export default useRemoteRequest;
@@ -0,0 +1,25 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+ import {useRtc} from 'customization-api';
13
+
14
+ function useSwitchCamera() {
15
+ const {RtcEngineUnsafe} = useRtc();
16
+ return () => {
17
+ try {
18
+ RtcEngineUnsafe.switchCamera();
19
+ } catch (error) {
20
+ console.error(error);
21
+ }
22
+ };
23
+ }
24
+
25
+ export default useSwitchCamera;
@@ -0,0 +1,19 @@
1
+ /*
2
+ ********************************************
3
+ Copyright © 2021 Agora Lab, Inc., all rights reserved.
4
+ AppBuilder and all associated components, source code, APIs, services, and documentation
5
+ (the “Materials”) are owned by Agora Lab, Inc. and its licensors. The Materials may not be
6
+ accessed, used, modified, or distributed for any purpose without a license from Agora Lab, Inc.
7
+ Use without a license or in violation of any license terms and conditions (including use for
8
+ any purpose competitive to Agora Lab, Inc.’s business) is strictly prohibited. For more
9
+ information visit https://appbuilder.agora.io.
10
+ *********************************************
11
+ */
12
+
13
+ function useSwitchCamera() {
14
+ return () => {
15
+ console.warn('SwitchCamera only supported on native platforms');
16
+ };
17
+ }
18
+
19
+ export default useSwitchCamera;