agora-appbuilder-core 3.0.9 → 4.0.0-api.1

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 +72 -5
  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 +100 -52
  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,24 +10,180 @@
10
10
  *********************************************
11
11
  */
12
12
 
13
- import {useRender} from 'customization-api';
14
- import React from 'react';
15
- import {View} from 'react-native';
13
+ import React, {useContext, useState} from 'react';
14
+ import {
15
+ View,
16
+ StyleSheet,
17
+ Image,
18
+ Text,
19
+ TouchableOpacity,
20
+ Linking,
21
+ } from 'react-native';
16
22
  import {MaxVideoView} from '../../../agora-rn-uikit';
23
+ import PreCallLocalMute from './LocalMute';
24
+ import {
25
+ LocalContext,
26
+ PermissionState,
27
+ ImageIcon as UiKitImageIcon,
28
+ } from '../../../agora-rn-uikit';
29
+ import {useContent} from 'customization-api';
30
+ import {usePreCall} from './usePreCall';
31
+ import ImageIcon from '../../atoms/ImageIcon';
32
+ import ThemeConfig from '../../theme';
33
+ import Spacer from '../../atoms/Spacer';
34
+ import {isMobileUA, isWebInternal, useResponsive} from '../../utils/common';
17
35
 
18
- const VideoPreview: React.FC = () => {
19
- const {renderList, activeUids} = useRender();
36
+ const Fallback = () => {
37
+ const {isCameraAvailable, isMicAvailable} = usePreCall();
38
+ const local = useContext(LocalContext);
39
+ const requestCameraAndAudioPermission = () => {
40
+ try {
41
+ const URL =
42
+ 'https://support.google.com/chrome/answer/2693767?hl=en&co=GENIE.Platform%3DDesktop';
43
+ if (isWebInternal()) {
44
+ window.open(URL, '_blank');
45
+ } else {
46
+ Linking.openURL(URL);
47
+ }
48
+ } catch (error) {
49
+ console.error(`Couldn't open the support url`);
50
+ }
51
+ };
52
+ const styles = useStyles();
53
+ return (
54
+ <View style={styles.fallbackRootContainer}>
55
+ {isCameraAvailable ||
56
+ ($config.AUDIO_ROOM && isMicAvailable) ||
57
+ local.permissionStatus === PermissionState.NOT_REQUESTED ||
58
+ local.permissionStatus === PermissionState.REQUESTED ? (
59
+ <View style={styles.avatar}>
60
+ <UiKitImageIcon name={'profile'} />
61
+ </View>
62
+ ) : (
63
+ <View style={styles.fallbackContainer}>
64
+ <Text style={styles.infoText1}>
65
+ Can’t Find Your{$config.AUDIO_ROOM ? ' Microphone' : ' Camera'}
66
+ </Text>
67
+ <Text style={styles.infoText2}>
68
+ Check your system settings to make sure that a
69
+ {$config.AUDIO_ROOM ? ' microphone' : ' camera'} is available. If
70
+ not, plug one in and restart your browser.
71
+ </Text>
72
+ <Spacer size={33} />
73
+ <TouchableOpacity
74
+ style={{
75
+ flexDirection: 'row',
76
+ alignSelf: 'center',
77
+ }}
78
+ onPress={() => {
79
+ requestCameraAndAudioPermission();
80
+ }}>
81
+ <Text style={styles.retryBtn}>Learn More</Text>
82
+ <Spacer horizontal={true} size={4} />
83
+ <View style={{alignSelf: 'center'}}>
84
+ <ImageIcon
85
+ iconType="plain"
86
+ name={'link-share'}
87
+ tintColor={$config.PRIMARY_ACTION_BRAND_COLOR}
88
+ />
89
+ </View>
90
+ </TouchableOpacity>
91
+ <Spacer size={23} />
92
+ </View>
93
+ )}
94
+ </View>
95
+ );
96
+ };
97
+
98
+ const VideoPreview = () => {
99
+ const {defaultContent, activeUids} = useContent();
20
100
 
21
101
  const [maxUid] = activeUids;
22
102
 
23
103
  if (!maxUid) {
24
104
  return null;
25
105
  }
26
-
106
+ const styles = useStyles();
27
107
  return (
28
- <View style={{borderRadius: 10, flex: 1}}>
29
- <MaxVideoView user={renderList[maxUid]} key={maxUid} />
108
+ <View style={[styles.container]}>
109
+ <View
110
+ style={{
111
+ flex: 1,
112
+ }}>
113
+ <MaxVideoView
114
+ user={defaultContent[maxUid]}
115
+ key={maxUid}
116
+ fallback={Fallback}
117
+ containerStyle={{
118
+ minHeight: 200,
119
+ width: '100%',
120
+ height: '100%',
121
+ // borderTopLeftRadius: 4,
122
+ // borderTopRightRadius: 4,
123
+ }}
124
+ />
125
+ </View>
126
+ <PreCallLocalMute isMobileView={isMobileUA() ? true : false} />
30
127
  </View>
31
128
  );
32
129
  };
33
130
  export default VideoPreview;
131
+
132
+ const useStyles = () => {
133
+ const getResponsiveValue = useResponsive();
134
+ return StyleSheet.create({
135
+ infoText1: {
136
+ fontFamily: ThemeConfig.FontFamily.sansPro,
137
+ fontWeight: '700',
138
+ fontSize: 20,
139
+ textAlign: 'center',
140
+ color: $config.FONT_COLOR,
141
+ paddingTop: 24,
142
+ paddingBottom: 12,
143
+ paddingHorizontal: 10,
144
+ },
145
+ infoText2: {
146
+ fontFamily: ThemeConfig.FontFamily.sansPro,
147
+ fontWeight: '400',
148
+ fontSize: ThemeConfig.FontSize.small,
149
+ textAlign: 'center',
150
+ color: $config.FONT_COLOR + ThemeConfig.EmphasisPlus.disabled,
151
+ paddingHorizontal: getResponsiveValue(48),
152
+ },
153
+ fallbackRootContainer: {
154
+ flex: 1,
155
+ backgroundColor: $config.VIDEO_AUDIO_TILE_COLOR,
156
+ justifyContent: 'center',
157
+ alignItems: 'center',
158
+ // borderTopLeftRadius: 4,
159
+ // borderTopRightRadius: 4,
160
+ },
161
+ fallbackContainer: {
162
+ minHeight: 200,
163
+ maxWidth: 440,
164
+ backgroundColor: $config.CARD_LAYER_4_COLOR,
165
+ borderRadius: ThemeConfig.BorderRadius.large,
166
+ justifyContent: 'center',
167
+ alignItems: 'center',
168
+ margin: 40,
169
+ },
170
+ retryBtn: {
171
+ fontFamily: ThemeConfig.FontFamily.sansPro,
172
+ fontWeight: '600',
173
+ fontSize: ThemeConfig.FontSize.normal,
174
+ color: $config.PRIMARY_ACTION_BRAND_COLOR,
175
+ alignSelf: 'center',
176
+ },
177
+ container: {
178
+ flex: 1,
179
+ position: 'relative',
180
+ justifyContent: 'space-between',
181
+ overflow: 'hidden',
182
+ },
183
+ avatar: {
184
+ width: 100,
185
+ height: 100,
186
+ margin: 40,
187
+ },
188
+ });
189
+ };
@@ -16,7 +16,7 @@ import {usePreCall} from '../../components/precall/usePreCall';
16
16
  import {useString} from '../../utils/useString';
17
17
  import {ChannelProfile, PropsContext} from '../../../agora-rn-uikit';
18
18
  import {JoinRoomButtonTextInterface} from '../../language/default-labels/precallScreenLabels';
19
- import {useMeetingInfo} from '../meeting-info/useMeetingInfo';
19
+ import {useRoomInfo} from '../room-info/useRoomInfo';
20
20
  import useGetName from '../../utils/useGetName';
21
21
 
22
22
  export interface PreCallJoinCallBtnProps {
@@ -31,7 +31,7 @@ const JoinCallBtn = (props: PreCallJoinCallBtnProps) => {
31
31
  const {rtcProps} = useContext(PropsContext);
32
32
  const {setCallActive} = usePreCall();
33
33
  const username = useGetName();
34
- const {isJoinDataFetched} = useMeetingInfo();
34
+ const {isJoinDataFetched} = useRoomInfo();
35
35
  const joinRoomButton =
36
36
  useString<JoinRoomButtonTextInterface>('joinRoomButton');
37
37
 
@@ -16,11 +16,12 @@ import {usePreCall} from '../../components/precall/usePreCall';
16
16
  import {useString} from '../../utils/useString';
17
17
  import {ChannelProfile, PropsContext} from '../../../agora-rn-uikit';
18
18
  import {JoinRoomButtonTextInterface} from '../../language/default-labels/precallScreenLabels';
19
- import {useMeetingInfo} from '../meeting-info/useMeetingInfo';
19
+ import {useRoomInfo} from '../room-info/useRoomInfo';
20
20
  import useGetName from '../../utils/useGetName';
21
21
  import {useWakeLock} from '../../components/useWakeLock';
22
22
  import isMobileOrTablet from '../../utils/isMobileOrTablet';
23
23
  import {isWebInternal} from '../../utils/common';
24
+ import useSetName from '../../utils/useSetName';
24
25
 
25
26
  const audio = new Audio(
26
27
  'https://dl.dropboxusercontent.com/s/1cdwpm3gca9mlo0/kick.mp3',
@@ -38,7 +39,8 @@ const JoinCallBtn = (props: PreCallJoinCallBtnProps) => {
38
39
  const {rtcProps} = useContext(PropsContext);
39
40
  const {setCallActive} = usePreCall();
40
41
  const username = useGetName();
41
- const {isJoinDataFetched} = useMeetingInfo();
42
+ const setUsername = useSetName();
43
+ const {isJoinDataFetched} = useRoomInfo();
42
44
  const {awake, request} = useWakeLock();
43
45
  const joinRoomButton =
44
46
  useString<JoinRoomButtonTextInterface>('joinRoomButton');
@@ -51,6 +53,7 @@ const JoinCallBtn = (props: PreCallJoinCallBtnProps) => {
51
53
  );
52
54
 
53
55
  const onSubmit = () => {
56
+ setUsername(username.trim());
54
57
  setCallActive(true);
55
58
  // Play a sound to avoid autoblocking in safari
56
59
  if (isWebInternal() || isMobileOrTablet()) {
@@ -80,11 +83,21 @@ const JoinCallBtn = (props: PreCallJoinCallBtnProps) => {
80
83
 
81
84
  const title = buttonText;
82
85
  const onPress = () => onSubmit();
83
- const disabled = !isJoinDataFetched || username === '';
86
+ const disabled = !isJoinDataFetched || username?.trim() === '';
84
87
  return props?.render ? (
85
88
  props.render(onPress, title, disabled)
86
89
  ) : (
87
- <PrimaryButton onPress={onPress} disabled={disabled} text={title} />
90
+ <PrimaryButton
91
+ // iconName={'video-on'}
92
+ onPress={onPress}
93
+ disabled={disabled}
94
+ text={title}
95
+ containerStyle={{
96
+ minWidth: '100%',
97
+ paddingHorizontal: 10,
98
+ }}
99
+ textStyle={{textAlign: 'center'}}
100
+ />
88
101
  );
89
102
  };
90
103
 
@@ -1,18 +1,20 @@
1
1
  import React from 'react';
2
- import {Text, StyleSheet, View} from 'react-native';
3
- import {useMeetingInfo} from '../meeting-info/useMeetingInfo';
2
+ import {Text, StyleSheet, View, TextStyle} from 'react-native';
3
+ import {trimText} from '../../utils/common';
4
+ import ThemeConfig from '../../theme';
5
+ import {useRoomInfo} from '../room-info/useRoomInfo';
4
6
 
5
- const MeetingTitle: React.FC = () => {
7
+ export interface MeetingTitleProps {
8
+ textStyle?: TextStyle;
9
+ }
10
+ const MeetingTitle = (props?: MeetingTitleProps) => {
6
11
  const {
7
12
  data: {meetingTitle},
8
- } = useMeetingInfo();
13
+ } = useRoomInfo();
9
14
  return (
10
- <>
11
- <Text style={[style.titleHeading, {color: $config.PRIMARY_COLOR}]}>
12
- {meetingTitle}
13
- </Text>
14
- <View style={{height: 50}} />
15
- </>
15
+ <Text style={[style.titleHeading, props?.textStyle ? props.textStyle : {}]}>
16
+ {trimText(meetingTitle)}
17
+ </Text>
16
18
  );
17
19
  };
18
20
 
@@ -20,9 +22,10 @@ export default MeetingTitle;
20
22
 
21
23
  const style = StyleSheet.create({
22
24
  titleHeading: {
23
- fontSize: 28,
24
- fontWeight: '700',
25
- textAlign: 'center',
26
- color: $config.SECONDARY_FONT_COLOR,
25
+ fontSize: ThemeConfig.FontSize.normal,
26
+ lineHeight: ThemeConfig.FontSize.normal,
27
+ fontWeight: '600',
28
+ color: $config.FONT_COLOR,
29
+ fontFamily: ThemeConfig.FontFamily.sansPro,
27
30
  },
28
31
  });
@@ -20,27 +20,7 @@ const selectDevice: React.FC = () => {
20
20
  //commented for v1 release
21
21
  //const selectInputDeviceLabel = useString('selectInputDeviceLabel')();
22
22
  const selectInputDeviceLabel = 'Select Input Device';
23
- return (
24
- <>
25
- <Text style={style.subHeading}>{selectInputDeviceLabel}</Text>
26
- <View
27
- style={{
28
- flex: 1,
29
- maxWidth: isWebInternal() ? '25vw' : 'auto',
30
- marginVertical: 30,
31
- }}>
32
- <SelectDevice />
33
- </View>
34
- </>
35
- );
23
+ return <SelectDevice />;
36
24
  };
37
25
 
38
26
  export default selectDevice;
39
-
40
- const style = StyleSheet.create({
41
- subHeading: {
42
- fontSize: 18,
43
- fontWeight: '700',
44
- color: $config.PRIMARY_FONT_COLOR,
45
- },
46
- });
@@ -11,29 +11,57 @@
11
11
  */
12
12
 
13
13
  import React from 'react';
14
+ import {TextStyle} from 'react-native';
14
15
  import TextInput from '../../atoms/TextInput';
15
16
  import {useString} from '../../utils/useString';
16
- import {useMeetingInfo} from '../meeting-info/useMeetingInfo';
17
+ import {useRoomInfo} from '../room-info/useRoomInfo';
17
18
  import useSetName from '../../utils/useSetName';
18
19
  import useGetName from '../../utils/useGetName';
20
+ import Input from '../../atoms/Input';
21
+ import ThemeConfig from '../../theme';
22
+ import {maxInputLimit} from '../../utils/common';
19
23
 
20
- const PreCallTextInput: React.FC = () => {
24
+ export interface PreCallTextInputProps {
25
+ labelStyle?: TextStyle;
26
+ textInputStyle?: TextStyle;
27
+ isDesktop?: boolean;
28
+ }
29
+ const PreCallTextInput: React.FC = (props?: PreCallTextInputProps) => {
21
30
  //commented for v1 release
22
31
  // const userNamePlaceholder = useString('userNamePlaceholder')();
23
32
  // const fetchingNamePlaceholder = useString('fetchingNamePlaceholder')();
24
- const userNamePlaceholder = 'Display name*';
33
+ const userNamePlaceholder = 'Enter Your Name';
25
34
  const fetchingNamePlaceholder = 'Getting name...';
26
35
  const username = useGetName();
27
36
  const setUsername = useSetName();
28
- const {isJoinDataFetched} = useMeetingInfo();
37
+ const {isJoinDataFetched} = useRoomInfo();
38
+ const {isDesktop = false} = props;
29
39
 
30
40
  return (
31
- <TextInput
41
+ <Input
42
+ maxLength={maxInputLimit}
43
+ label={isDesktop ? ($config.EVENT_MODE ? 'Your Name' : 'Joining as') : ''}
44
+ labelStyle={
45
+ props?.labelStyle
46
+ ? props.labelStyle
47
+ : {
48
+ fontFamily: ThemeConfig.FontFamily.sansPro,
49
+ fontWeight: '400',
50
+ fontSize: ThemeConfig.FontSize.small,
51
+ lineHeight: ThemeConfig.FontSize.small,
52
+ color: $config.FONT_COLOR,
53
+ }
54
+ }
32
55
  value={username}
56
+ autoFocus
33
57
  onChangeText={(text) => setUsername(text ? text : '')}
34
58
  onSubmitEditing={() => {}}
35
59
  placeholder={
36
- isJoinDataFetched ? userNamePlaceholder : fetchingNamePlaceholder
60
+ isJoinDataFetched
61
+ ? $config.EVENT_MODE
62
+ ? 'Luke Skywalker'
63
+ : userNamePlaceholder
64
+ : fetchingNamePlaceholder
37
65
  }
38
66
  editable={isJoinDataFetched}
39
67
  />
@@ -9,19 +9,39 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React, {createContext} from 'react';
12
+ import React, {createContext, useContext, useEffect} from 'react';
13
13
  import {createHook} from 'customization-implementation';
14
14
  import {ApolloError} from '@apollo/client';
15
+ import {SdkApiContext} from '../SdkApiContext';
16
+ import {useRoomInfo} from '../room-info/useRoomInfo';
17
+ import SDKEvents from '../../utils/SdkEvents';
18
+ import DeviceContext from '../DeviceContext';
15
19
 
16
20
  export interface PreCallContextInterface {
17
21
  callActive: boolean;
18
22
  setCallActive: React.Dispatch<React.SetStateAction<boolean>>;
19
23
  error?: ApolloError;
24
+ isCameraAvailable?: boolean;
25
+ setCameraAvailable: React.Dispatch<React.SetStateAction<boolean>>;
26
+ isMicAvailable?: boolean;
27
+ setMicAvailable: React.Dispatch<React.SetStateAction<boolean>>;
28
+ isSpeakerAvailable?: boolean;
29
+ setSpeakerAvailable: React.Dispatch<React.SetStateAction<boolean>>;
30
+ isPermissionRequested: boolean;
31
+ setIsPermissionRequested: React.Dispatch<React.SetStateAction<boolean>>;
20
32
  }
21
33
 
22
34
  const PreCallContext = createContext<PreCallContextInterface>({
23
35
  callActive: false,
24
36
  setCallActive: () => {},
37
+ isCameraAvailable: false,
38
+ isMicAvailable: false,
39
+ isSpeakerAvailable: false,
40
+ setCameraAvailable: () => {},
41
+ setMicAvailable: () => {},
42
+ setSpeakerAvailable: () => {},
43
+ isPermissionRequested: false,
44
+ setIsPermissionRequested: () => {},
25
45
  });
26
46
 
27
47
  interface PreCallProviderProps {
@@ -30,6 +50,24 @@ interface PreCallProviderProps {
30
50
  }
31
51
 
32
52
  const PreCallProvider = (props: PreCallProviderProps) => {
53
+ const {join} = useContext(SdkApiContext);
54
+ const roomInfo = useRoomInfo();
55
+ const {deviceList} = useContext(DeviceContext);
56
+
57
+ useEffect(() => {
58
+ if (join.phrase) {
59
+ //@ts-ignore
60
+ join?.promise?.res([
61
+ roomInfo.data,
62
+ () => {
63
+ props.value.setCallActive(true);
64
+ },
65
+ ]);
66
+ }
67
+
68
+ SDKEvents.emit('ready-to-join', roomInfo.data.meetingTitle, deviceList);
69
+ }, []);
70
+
33
71
  return (
34
72
  <PreCallContext.Provider value={{...props.value}}>
35
73
  {props.children}
@@ -12,7 +12,7 @@
12
12
  import React, {createContext} from 'react';
13
13
  import {createHook} from 'customization-implementation';
14
14
  import {UidType} from '../../../agora-rn-uikit';
15
- export interface MeetingInfoContextInterface {
15
+ export interface RoomInfoContextInterface {
16
16
  isJoinDataFetched?: boolean;
17
17
  data?: {
18
18
  isHost: boolean;
@@ -36,7 +36,31 @@ export interface MeetingInfoContextInterface {
36
36
  };
37
37
  }
38
38
 
39
- export const MeetingInfoDefaultValue: MeetingInfoContextInterface = {
39
+ export const validateMeetingInfoData = (
40
+ roomInfo: Partial<RoomInfoContextInterface['data']>,
41
+ ) => {
42
+ const {
43
+ channel,
44
+ encryptionSecret,
45
+ rtmToken,
46
+ screenShareToken,
47
+ screenShareUid,
48
+ token,
49
+ uid,
50
+ } = roomInfo;
51
+ if ($config.ENCRYPTION_ENABLED && !encryptionSecret) {
52
+ return false;
53
+ }
54
+ if ($config.SCREEN_SHARING && (!screenShareToken || !screenShareUid)) {
55
+ return false;
56
+ }
57
+ if (!channel || !rtmToken || !token || !uid) {
58
+ return false;
59
+ }
60
+ return true;
61
+ };
62
+
63
+ export const RoomInfoDefaultValue: RoomInfoContextInterface = {
40
64
  isJoinDataFetched: false,
41
65
  data: {
42
66
  isHost: false,
@@ -48,23 +72,23 @@ export const MeetingInfoDefaultValue: MeetingInfoContextInterface = {
48
72
  },
49
73
  };
50
74
 
51
- const MeetingInfoContext = createContext(MeetingInfoDefaultValue);
75
+ const RoomInfoContext = createContext(RoomInfoDefaultValue);
52
76
 
53
- interface MeetingInfoProviderProps {
77
+ interface RoomInfoProviderProps {
54
78
  children: React.ReactNode;
55
- value: MeetingInfoContextInterface;
79
+ value: RoomInfoContextInterface;
56
80
  }
57
81
 
58
- const MeetingInfoProvider = (props: MeetingInfoProviderProps) => {
82
+ const RoomInfoProvider = (props: RoomInfoProviderProps) => {
59
83
  return (
60
- <MeetingInfoContext.Provider value={{...props.value}}>
84
+ <RoomInfoContext.Provider value={{...props.value}}>
61
85
  {props.children}
62
- </MeetingInfoContext.Provider>
86
+ </RoomInfoContext.Provider>
63
87
  );
64
88
  };
65
89
  /**
66
90
  * The MeetingInfo app state contains information about the active meeting.
67
91
  */
68
- const useMeetingInfo = createHook(MeetingInfoContext);
92
+ const useRoomInfo = createHook(RoomInfoContext);
69
93
 
70
- export {MeetingInfoProvider, useMeetingInfo};
94
+ export {RoomInfoProvider, useRoomInfo};
@@ -11,28 +11,28 @@
11
11
  */
12
12
  import React, {createContext, SetStateAction} from 'react';
13
13
  import {createHook} from 'customization-implementation';
14
- import {MeetingInfoContextInterface} from './useMeetingInfo';
14
+ import {RoomInfoContextInterface} from './useRoomInfo';
15
15
 
16
- export interface SetMeetingInfoContextInterface {
17
- setMeetingInfo: React.Dispatch<SetStateAction<MeetingInfoContextInterface>>;
16
+ export interface SetRoomInfoContextInterface {
17
+ setRoomInfo: React.Dispatch<SetStateAction<RoomInfoContextInterface>>;
18
18
  }
19
19
 
20
- const SetMeetingInfoContext = createContext<SetMeetingInfoContextInterface>({
21
- setMeetingInfo: () => {},
20
+ const SetRoomInfoContext = createContext<SetRoomInfoContextInterface>({
21
+ setRoomInfo: () => {},
22
22
  });
23
23
 
24
- interface SetMeetingInfoProviderProps {
24
+ interface SetRoomInfoProviderProps {
25
25
  children: React.ReactNode;
26
- value: SetMeetingInfoContextInterface;
26
+ value: SetRoomInfoContextInterface;
27
27
  }
28
28
 
29
- const SetMeetingInfoProvider = (props: SetMeetingInfoProviderProps) => {
29
+ const SetRoomInfoProvider = (props: SetRoomInfoProviderProps) => {
30
30
  return (
31
- <SetMeetingInfoContext.Provider value={{...props.value}}>
31
+ <SetRoomInfoContext.Provider value={{...props.value}}>
32
32
  {props.children}
33
- </SetMeetingInfoContext.Provider>
33
+ </SetRoomInfoContext.Provider>
34
34
  );
35
35
  };
36
- const useSetMeetingInfo = createHook(SetMeetingInfoContext);
36
+ const useSetRoomInfo = createHook(SetRoomInfoContext);
37
37
 
38
- export {SetMeetingInfoProvider, useSetMeetingInfo};
38
+ export {SetRoomInfoProvider, useSetRoomInfo};