agora-appbuilder-core 3.0.9 → 3.0.10

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 (248) 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/Contexts/LocalUserContext.tsx +4 -0
  5. package/template/agora-rn-uikit/src/Contexts/PropsContext.tsx +18 -0
  6. package/template/agora-rn-uikit/src/Contexts/RtcContext.tsx +2 -0
  7. package/template/agora-rn-uikit/src/Controls/BtnTemplate.tsx +30 -26
  8. package/template/agora-rn-uikit/src/Controls/Icons.ts +30 -83
  9. package/template/agora-rn-uikit/src/Controls/ImageIcon.tsx +6 -6
  10. package/template/agora-rn-uikit/src/Reducer/ActiveSpeakerDetected.ts +11 -0
  11. package/template/agora-rn-uikit/src/Reducer/LocalMuteAudio.ts +1 -0
  12. package/template/agora-rn-uikit/src/Reducer/LocalMuteVideo.ts +1 -0
  13. package/template/agora-rn-uikit/src/Reducer/LocalPermissionState.ts +24 -0
  14. package/template/agora-rn-uikit/src/Reducer/RemoteAudioStateChanged.ts +1 -0
  15. package/template/agora-rn-uikit/src/Reducer/RemoteVideoStateChanged.ts +1 -0
  16. package/template/agora-rn-uikit/src/Reducer/UpdateDualStreamMode.ts +1 -0
  17. package/template/agora-rn-uikit/src/Reducer/UserJoined.ts +2 -0
  18. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteAudio.ts +1 -0
  19. package/template/agora-rn-uikit/src/Reducer/UserMuteRemoteVideo.ts +1 -0
  20. package/template/agora-rn-uikit/src/Reducer/UserOffline.ts +1 -0
  21. package/template/agora-rn-uikit/src/Reducer/UserPin.ts +11 -0
  22. package/template/agora-rn-uikit/src/Reducer/index.ts +3 -0
  23. package/template/agora-rn-uikit/src/Rtc/Create.tsx +89 -1
  24. package/template/agora-rn-uikit/src/RtcConfigure.tsx +39 -2
  25. package/template/agora-rn-uikit/src/Views/MaxVideoView.native.tsx +15 -5
  26. package/template/agora-rn-uikit/src/Views/MaxVideoView.tsx +15 -9
  27. package/template/agora-rn-uikit/src/index.ts +3 -1
  28. package/template/android/app/build.gradle +1 -0
  29. package/template/android/app/src/main/AndroidManifest.xml +22 -15
  30. package/template/android/app/src/main/assets/fonts/SourceSansPro-Regular.ttf +0 -0
  31. package/template/android/app/src/main/assets/fonts/icomoon.ttf +0 -0
  32. package/template/android/app/src/main/java/com/helloworld/MainActivity.java +50 -0
  33. package/template/android/app/src/main/res/values/colors.xml +7 -0
  34. package/template/android/build.gradle +3 -3
  35. package/template/babel.config.js +1 -0
  36. package/template/bridge/rtc/webNg/RtcEngine.ts +110 -17
  37. package/template/customization-api/sub-components.ts +1 -1
  38. package/template/customization-api/typeDefinition.ts +2 -1
  39. package/template/electron/index.html +27 -27
  40. package/template/electron/renderer/index.js +1 -0
  41. package/template/global.d.ts +25 -4
  42. package/template/index.rsdk.tsx +1 -0
  43. package/template/index.web.js +2 -1
  44. package/template/index.wsdk.tsx +1 -1
  45. package/template/ios/HelloWorld/Info.plist +14 -1
  46. package/template/ios/HelloWorld.xcodeproj/project.pbxproj +17 -0
  47. package/template/metro.config.js +1 -1
  48. package/template/package.json +18 -7
  49. package/template/react-native-toast-message/index.d.ts +43 -43
  50. package/template/react-native-toast-message/src/colors/index.js +3 -2
  51. package/template/react-native-toast-message/src/components/base/index.js +46 -59
  52. package/template/react-native-toast-message/src/components/base/styles.js +16 -32
  53. package/template/react-native-toast-message/src/components/checkbox.js +178 -0
  54. package/template/react-native-toast-message/src/components/error.js +3 -2
  55. package/template/react-native-toast-message/src/components/info.js +3 -2
  56. package/template/react-native-toast-message/src/components/success.js +3 -2
  57. package/template/react-native-toast-message/src/index.js +122 -31
  58. package/template/react-native-toast-message/src/index.sdk.tsx +125 -35
  59. package/template/react-native-toast-message/src/styles.js +3 -4
  60. package/template/react-native-toast-message/src/styles.sdk.ts +3 -4
  61. package/template/react-native.config.js +7 -0
  62. package/template/src/App.tsx +6 -0
  63. package/template/src/AppWrapper.tsx +63 -28
  64. package/template/src/assets/font-styles.css +329 -0
  65. package/template/src/assets/fonts/SourceSansPro-Regular.ttf +0 -0
  66. package/template/src/assets/fonts/icomoon.ttf +0 -0
  67. package/template/src/assets/permission.png +0 -0
  68. package/template/src/assets/selection.json +1 -0
  69. package/template/src/atoms/ActionMenu.tsx +236 -0
  70. package/template/src/atoms/AnimatedActiveSpeaker.native.tsx +71 -0
  71. package/template/src/atoms/AnimatedActiveSpeaker.tsx +84 -0
  72. package/template/src/atoms/AnimatedRings.native.tsx +68 -0
  73. package/template/src/atoms/AnimatedRings.tsx +70 -0
  74. package/template/src/atoms/Card.tsx +61 -0
  75. package/template/src/atoms/CircularProgress.native.tsx +121 -0
  76. package/template/src/atoms/CircularProgress.tsx +102 -0
  77. package/template/src/atoms/CustomIcon.tsx +88 -0
  78. package/template/src/atoms/CustomSwitch.tsx +287 -0
  79. package/template/src/atoms/Dropdown.tsx +306 -0
  80. package/template/src/atoms/HorizontalRule.tsx +3 -1
  81. package/template/src/atoms/IconButton.tsx +162 -0
  82. package/template/src/atoms/ImageIcon.tsx +98 -0
  83. package/template/src/atoms/InfoBubble.tsx +291 -0
  84. package/template/src/atoms/Input.tsx +87 -0
  85. package/template/src/atoms/InviteInfo.tsx +166 -0
  86. package/template/src/atoms/LinkButton.tsx +28 -0
  87. package/template/src/atoms/OutlineButton.tsx +61 -0
  88. package/template/src/atoms/ParticipantsCount.tsx +73 -0
  89. package/template/src/atoms/Popup.tsx +147 -0
  90. package/template/src/atoms/PrimaryButton.tsx +51 -26
  91. package/template/src/atoms/RecordingInfo.tsx +49 -0
  92. package/template/src/atoms/SecondaryButton.tsx +8 -5
  93. package/template/src/atoms/Spacer.tsx +22 -0
  94. package/template/src/atoms/TertiaryButton.tsx +78 -0
  95. package/template/src/atoms/TextInput.tsx +12 -14
  96. package/template/src/atoms/Toggle.tsx +47 -0
  97. package/template/src/atoms/Tooltip.native.tsx +65 -0
  98. package/template/src/atoms/Tooltip.tsx +94 -0
  99. package/template/src/atoms/UserAvatar.tsx +60 -0
  100. package/template/src/components/Chat.tsx +86 -214
  101. package/template/src/components/ChatContext.ts +8 -1
  102. package/template/src/components/ColorConfigure.tsx +1 -1
  103. package/template/src/components/ColorContext.ts +1 -1
  104. package/template/src/components/CommonStyles.ts +44 -0
  105. package/template/src/components/Controls.tsx +342 -42
  106. package/template/src/components/{Controls.native.tsx → Controls1.native.tsx} +6 -4
  107. package/template/src/components/DeviceConfigure.tsx +461 -101
  108. package/template/src/components/DeviceContext.tsx +8 -4
  109. package/template/src/components/EventsConfigure.tsx +144 -7
  110. package/template/src/components/GraphQLProvider.tsx +1 -1
  111. package/template/src/components/GridVideo.tsx +59 -44
  112. package/template/src/components/HostControlView.tsx +114 -35
  113. package/template/src/components/Navbar.tsx +216 -398
  114. package/template/src/components/NetworkQualityContext.tsx +20 -20
  115. package/template/src/components/ParticipantsView.tsx +177 -154
  116. package/template/src/components/PinnedVideo.tsx +207 -120
  117. package/template/src/components/Precall.native.tsx +358 -119
  118. package/template/src/components/Precall.tsx +269 -135
  119. package/template/src/components/RTMConfigure.tsx +27 -4
  120. package/template/src/components/Router.electron.ts +1 -0
  121. package/template/src/components/Router.native.ts +1 -0
  122. package/template/src/components/Router.sdk.ts +1 -0
  123. package/template/src/components/Router.ts +1 -0
  124. package/template/src/components/Settings.tsx +26 -95
  125. package/template/src/components/SettingsView.tsx +251 -56
  126. package/template/src/components/Share.tsx +302 -273
  127. package/template/src/components/StorageContext.tsx +30 -3
  128. package/template/src/components/ToastComponent.tsx +8 -0
  129. package/template/src/components/chat-messages/useChatMessages.tsx +69 -23
  130. package/template/src/components/chat-ui/useChatUIControl.tsx +7 -0
  131. package/template/src/components/common/Error.tsx +20 -6
  132. package/template/src/components/common/Logo.tsx +16 -15
  133. package/template/src/components/contexts/LiveStreamDataContext.tsx +10 -5
  134. package/template/src/components/contexts/VideoMeetingDataContext.tsx +37 -7
  135. package/template/src/components/livestream/LiveStreamContext.tsx +270 -36
  136. package/template/src/components/livestream/Types.ts +39 -14
  137. package/template/src/components/livestream/index.ts +1 -0
  138. package/template/src/components/livestream/views/LiveStreamControls.tsx +12 -4
  139. package/template/src/components/participants/AllAudienceParticipants.tsx +101 -30
  140. package/template/src/components/participants/AllHostParticipants.tsx +103 -34
  141. package/template/src/components/participants/Participant.tsx +302 -0
  142. package/template/src/components/participants/ParticipantName.tsx +13 -7
  143. package/template/src/components/participants/ParticipantSectionTitle.tsx +35 -10
  144. package/template/src/components/participants/ScreenshareParticipants.tsx +144 -12
  145. package/template/src/components/participants/UserActionMenuOptions.tsx +398 -0
  146. package/template/src/components/popups/InvitePopup.tsx +115 -0
  147. package/template/src/components/popups/StopRecordingPopup.tsx +114 -0
  148. package/template/src/components/precall/LocalMute.tsx +84 -14
  149. package/template/src/components/precall/{LocalMute.native.tsx → LocalMute1.native.tsx} +21 -5
  150. package/template/src/components/precall/PermissionHelper.native.tsx +5 -0
  151. package/template/src/components/precall/PermissionHelper.tsx +126 -0
  152. package/template/src/components/precall/PreCallSettings.tsx +52 -0
  153. package/template/src/components/precall/VideoPreview.native.tsx +48 -3
  154. package/template/src/components/precall/VideoPreview.tsx +163 -7
  155. package/template/src/components/precall/joinCallBtn.tsx +15 -2
  156. package/template/src/components/precall/meetingTitle.tsx +15 -12
  157. package/template/src/components/precall/selectDevice.tsx +1 -21
  158. package/template/src/components/precall/textInput.tsx +32 -4
  159. package/template/src/components/precall/usePreCall.tsx +16 -0
  160. package/template/src/components/styles.ts +42 -21
  161. package/template/src/components/useShareLink.tsx +12 -14
  162. package/template/src/components/useToast.tsx +41 -0
  163. package/template/src/components/useVideoCall.tsx +65 -0
  164. package/template/src/language/default-labels/precallScreenLabels.ts +3 -3
  165. package/template/src/pages/Authenticate.tsx +5 -15
  166. package/template/src/pages/Create.tsx +293 -165
  167. package/template/src/pages/Endcall.tsx +148 -0
  168. package/template/src/pages/Join.tsx +93 -67
  169. package/template/src/pages/VideoCall.tsx +89 -64
  170. package/template/src/pages/video-call/ActionSheet.native.tsx +215 -0
  171. package/template/src/pages/video-call/ActionSheet.tsx +226 -0
  172. package/template/src/pages/video-call/ActionSheetContent.tsx +479 -0
  173. package/template/src/pages/video-call/ActionSheetHandle.tsx +38 -0
  174. package/template/src/pages/video-call/ActionSheetStyles.css +138 -0
  175. package/template/src/pages/video-call/DefaultLayouts.ts +4 -4
  176. package/template/src/pages/video-call/NameWithMicIcon.tsx +120 -44
  177. package/template/src/pages/video-call/RenderComponent.tsx +3 -2
  178. package/template/src/pages/video-call/SidePanelHeader.tsx +190 -0
  179. package/template/src/pages/video-call/VideoCallMobileView.tsx +139 -0
  180. package/template/src/pages/video-call/VideoCallScreen.native.tsx +37 -0
  181. package/template/src/pages/video-call/VideoCallScreen.tsx +45 -9
  182. package/template/src/pages/video-call/VideoComponent.tsx +18 -3
  183. package/template/src/pages/video-call/VideoRenderer.tsx +218 -60
  184. package/template/src/rtm-events/constants.ts +2 -0
  185. package/template/src/subComponents/ChatBubble.tsx +123 -83
  186. package/template/src/subComponents/ChatContainer.tsx +257 -84
  187. package/template/src/subComponents/ChatInput.ios.tsx +237 -0
  188. package/template/src/subComponents/ChatInput.tsx +61 -46
  189. package/template/src/subComponents/Checkbox.native.tsx +16 -5
  190. package/template/src/subComponents/Checkbox.tsx +2 -2
  191. package/template/src/subComponents/CopyJoinInfo.tsx +36 -58
  192. package/template/src/subComponents/EndcallPopup.tsx +107 -0
  193. package/template/src/subComponents/FallbackLogo.tsx +122 -40
  194. package/template/src/subComponents/LanguageSelector.tsx +1 -1
  195. package/template/src/subComponents/LayoutIconButton.tsx +201 -0
  196. package/template/src/subComponents/LayoutIconDropdown.tsx +131 -134
  197. package/template/src/subComponents/{LayoutIconDropdown.native.tsx → LayoutIconDropdown1.native.tsx} +4 -18
  198. package/template/src/subComponents/LocalAudioMute.tsx +119 -27
  199. package/template/src/subComponents/LocalEndCall.tsx +71 -33
  200. package/template/src/subComponents/LocalSwitchCamera.tsx +17 -30
  201. package/template/src/subComponents/LocalVideoMute.tsx +117 -27
  202. package/template/src/subComponents/Logo.tsx +3 -4
  203. package/template/src/subComponents/LogoutButton.tsx +1 -1
  204. package/template/src/subComponents/NetworkQualityPill.tsx +60 -63
  205. package/template/src/subComponents/OpenInNativeButton.tsx +3 -3
  206. package/template/src/subComponents/Recording.tsx +28 -29
  207. package/template/src/subComponents/RemoteAudioMute.tsx +83 -29
  208. package/template/src/subComponents/RemoteEndCall.tsx +8 -5
  209. package/template/src/subComponents/RemoteMutePopup.tsx +193 -0
  210. package/template/src/subComponents/RemoteVideoMute.tsx +74 -21
  211. package/template/src/subComponents/RemoveMeetingPopup.tsx +109 -0
  212. package/template/src/subComponents/RemoveScreensharePopup.tsx +109 -0
  213. package/template/src/subComponents/ScreenShareNotice.tsx +83 -8
  214. package/template/src/subComponents/SelectDevice.tsx +404 -61
  215. package/template/src/subComponents/SelectDeviceSettings.backup.tsx +207 -0
  216. package/template/src/subComponents/SelectOAuth.tsx +9 -8
  217. package/template/src/subComponents/SidePanelHeader.tsx +112 -0
  218. package/template/src/subComponents/ToastConfig.tsx +150 -10
  219. package/template/src/subComponents/chat/ChatParticipants.tsx +187 -78
  220. package/template/src/subComponents/livestream/CurrentLiveStreamRequestsView.tsx +95 -32
  221. package/template/src/subComponents/livestream/controls/LocalRaiseHand.tsx +29 -33
  222. package/template/src/subComponents/livestream/controls/RemoteLiveStreamApprovedRequestRecall.tsx +6 -6
  223. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestApprove.tsx +24 -11
  224. package/template/src/subComponents/livestream/controls/RemoteLiveStreamRequestReject.tsx +17 -10
  225. package/template/src/subComponents/recording/useRecording.tsx +79 -27
  226. package/template/src/subComponents/screenshare/ScreenshareButton.tsx +52 -70
  227. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +11 -2
  228. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +26 -4
  229. package/template/src/theme/index.ts +46 -0
  230. package/template/src/utils/PlatformWrapper.tsx +21 -0
  231. package/template/src/utils/common.tsx +155 -1
  232. package/template/src/utils/hexadecimalTransparency.ts +108 -0
  233. package/template/src/utils/index.tsx +19 -0
  234. package/template/src/utils/isMobileOrTablet.ts +7 -2
  235. package/template/src/utils/pendingStateUpdateHelper.ts +19 -0
  236. package/template/src/utils/useButtonTemplate.tsx +1 -0
  237. package/template/src/utils/useFocus.tsx +46 -0
  238. package/template/src/utils/useIsActiveSpeaker.ts +27 -0
  239. package/template/src/utils/useIsHandRaised.ts +13 -0
  240. package/template/src/utils/useMuteToggleLocal.ts +54 -3
  241. package/template/src/utils/useRemoteEndScreenshare.ts +26 -0
  242. package/template/src/utils/useRemoteRequest.ts +84 -0
  243. package/template/web/index.html +5 -0
  244. package/template/webpack.commons.js +13 -8
  245. package/template/webpack.web.config.js +1 -0
  246. package/template/src/assets/icons.ts +0 -102
  247. package/template/src/components/participants/MeParticipant.tsx +0 -38
  248. package/template/src/components/participants/RemoteParticipants.tsx +0 -71
@@ -0,0 +1,115 @@
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 React, {useEffect} from 'react';
13
+ import {StyleSheet, View} from 'react-native';
14
+ import {
15
+ SHARE_LINK_CONTENT_TYPE,
16
+ useShareLink,
17
+ } from '../../components/useShareLink';
18
+ import Popup from '../../atoms/Popup';
19
+ import Spacer from '../../atoms/Spacer';
20
+ import PrimaryButton from '../../atoms/PrimaryButton';
21
+ import TertiaryButton from '../../atoms/TertiaryButton';
22
+ import ThemeConfig from '../../theme';
23
+ import {CopyMeetingInfo} from '../../components/Share';
24
+ import {isMobileUA, useIsDesktop} from '../../utils/common';
25
+ import {useVideoCall} from '../useVideoCall';
26
+ import {useParams} from '../Router';
27
+ import useGetMeetingPhrase from '../../utils/useGetMeetingPhrase';
28
+
29
+ const InvitePopup = () => {
30
+ const {setShowInvitePopup, showInvitePopup} = useVideoCall();
31
+ const isDesktop = useIsDesktop();
32
+ const {copyShareLinkToClipboard} = useShareLink();
33
+ const {phrase} = useParams<{phrase: string}>();
34
+ const getMeeting = useGetMeetingPhrase();
35
+ useEffect(() => {
36
+ getMeeting(phrase);
37
+ }, [phrase]);
38
+ return (
39
+ <Popup
40
+ modalVisible={showInvitePopup}
41
+ setModalVisible={setShowInvitePopup}
42
+ title="Invite others to join this meeting"
43
+ showCloseIcon={true}
44
+ containerStyle={{alignItems: isDesktop('popup') ? 'center' : 'stretch'}}
45
+ contentContainerStyle={style.contentContainer}>
46
+ <CopyMeetingInfo showSubLabel={false} />
47
+ <View
48
+ style={
49
+ isDesktop('popup') ? style.btnContainer : style.btnContainerMobile
50
+ }>
51
+ {isDesktop('popup') ? (
52
+ <View style={{flex: 1}}>
53
+ <TertiaryButton
54
+ text={'CANCEL'}
55
+ textStyle={style.btnText}
56
+ containerStyle={{
57
+ width: '100%',
58
+ height: 48,
59
+ paddingVertical: 12,
60
+ paddingHorizontal: 12,
61
+ borderRadius: ThemeConfig.BorderRadius.medium,
62
+ }}
63
+ onPress={() => {
64
+ setShowInvitePopup(false);
65
+ }}
66
+ />
67
+ </View>
68
+ ) : null}
69
+ {isDesktop('popup') ? <Spacer size={10} horizontal={true} /> : <></>}
70
+ <View style={{flex: 1}}>
71
+ <PrimaryButton
72
+ textStyle={style.btnText}
73
+ containerStyle={{
74
+ minWidth: 'auto',
75
+ width: '100%',
76
+ borderRadius: ThemeConfig.BorderRadius.medium,
77
+ height: 48,
78
+ paddingVertical: 12,
79
+ paddingHorizontal: 12,
80
+ }}
81
+ onPress={() => {
82
+ copyShareLinkToClipboard(SHARE_LINK_CONTENT_TYPE.MEETING_INVITE);
83
+ }}
84
+ text={'COPY INVITATION'}
85
+ />
86
+ </View>
87
+ </View>
88
+ </Popup>
89
+ );
90
+ };
91
+
92
+ export default InvitePopup;
93
+
94
+ const style = StyleSheet.create({
95
+ btnContainer: {
96
+ flex: 1,
97
+ flexDirection: 'row',
98
+ justifyContent: 'center',
99
+ alignItems: 'center',
100
+ marginTop: 48,
101
+ },
102
+ btnContainerMobile: {
103
+ flexDirection: 'row',
104
+ justifyContent: 'center',
105
+ marginTop: 30,
106
+ },
107
+ btnText: {
108
+ fontWeight: '600',
109
+ fontSize: 16,
110
+ },
111
+ contentContainer: {
112
+ padding: isMobileUA() ? 24 : 40,
113
+ minWidth: 342,
114
+ },
115
+ });
@@ -0,0 +1,114 @@
1
+ import React from 'react';
2
+ import {StyleSheet, Text, View} from 'react-native';
3
+ import Spacer from '../../atoms/Spacer';
4
+ import Popup from '../../atoms/Popup';
5
+ import TertiaryButton from '../../atoms/TertiaryButton';
6
+ import PrimaryButton from '../../atoms/PrimaryButton';
7
+ import ThemeConfig from '../../theme';
8
+ import {useIsDesktop} from '../../utils/common';
9
+ import {useRecording} from 'customization-api';
10
+ import {useVideoCall} from '../useVideoCall';
11
+
12
+ const StopRecordingPopup = () => {
13
+ const {showStopRecordingPopup, setShowStopRecordingPopup} = useVideoCall();
14
+ const {stopRecording, isRecordingActive} = useRecording();
15
+ const isDesktop = useIsDesktop()('popup');
16
+ const recordingLabelHeading = 'Stop Recording?';
17
+ const recordingLabelSubHeading =
18
+ 'Are you sure you want to stop recording? You can’t undo this action.';
19
+
20
+ const cancelBtnLabel = 'CANCEL';
21
+ const stopRecordingBtnLabel = 'END RECORDING';
22
+
23
+ const doStopRecording = () => {
24
+ if (isRecordingActive) {
25
+ stopRecording && stopRecording();
26
+ setShowStopRecordingPopup(false);
27
+ }
28
+ };
29
+ return (
30
+ <Popup
31
+ modalVisible={showStopRecordingPopup}
32
+ setModalVisible={setShowStopRecordingPopup}
33
+ showCloseIcon={false}
34
+ contentContainerStyle={styles.contentContainer}>
35
+ <Text style={styles.heading}>{recordingLabelHeading}</Text>
36
+ <Spacer size={8} />
37
+ <Text style={styles.subHeading}>{recordingLabelSubHeading}</Text>
38
+ <Spacer size={32} />
39
+ <View style={isDesktop ? styles.btnContainer : styles.btnContainerMobile}>
40
+ <View style={isDesktop && {flex: 1}}>
41
+ <TertiaryButton
42
+ containerStyle={{
43
+ minWidth: 'auto',
44
+ width: isDesktop ? 90 : '100%',
45
+ height: 48,
46
+ paddingVertical: 12,
47
+ paddingHorizontal: 12,
48
+ borderRadius: ThemeConfig.BorderRadius.medium,
49
+ }}
50
+ textStyle={styles.btnText}
51
+ text={cancelBtnLabel}
52
+ onPress={() => setShowStopRecordingPopup(false)}
53
+ />
54
+ </View>
55
+ <Spacer
56
+ size={isDesktop ? 10 : 20}
57
+ horizontal={isDesktop ? true : false}
58
+ />
59
+ <View style={isDesktop && {flex: 2}}>
60
+ <PrimaryButton
61
+ containerStyle={{
62
+ minWidth: 'auto',
63
+ width: '100%',
64
+ borderRadius: ThemeConfig.BorderRadius.medium,
65
+ height: 48,
66
+ backgroundColor: $config.SEMANTIC_ERROR,
67
+ paddingVertical: 12,
68
+ paddingHorizontal: 12,
69
+ }}
70
+ textStyle={styles.btnText}
71
+ text={stopRecordingBtnLabel}
72
+ onPress={doStopRecording}
73
+ />
74
+ </View>
75
+ </View>
76
+ </Popup>
77
+ );
78
+ };
79
+
80
+ export default StopRecordingPopup;
81
+
82
+ const styles = StyleSheet.create({
83
+ btnContainer: {
84
+ flex: 1,
85
+ flexDirection: 'row',
86
+ justifyContent: 'center',
87
+ alignItems: 'center',
88
+ },
89
+ btnText: {
90
+ fontWeight: '600',
91
+ fontSize: 16,
92
+ lineHeight: 24,
93
+ },
94
+
95
+ btnContainerMobile: {
96
+ flexDirection: 'column-reverse',
97
+ },
98
+ contentContainer: {
99
+ padding: 24,
100
+ maxWidth: 342,
101
+ },
102
+ heading: {
103
+ fontFamily: ThemeConfig.FontFamily.sansPro,
104
+ fontWeight: '600',
105
+ fontSize: 22,
106
+ color: $config.SEMANTIC_ERROR,
107
+ },
108
+ subHeading: {
109
+ fontFamily: ThemeConfig.FontFamily.sansPro,
110
+ fontWeight: '400',
111
+ fontSize: ThemeConfig.FontSize.small,
112
+ color: $config.FONT_COLOR,
113
+ },
114
+ });
@@ -9,18 +9,28 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- import React from 'react';
12
+ import React, {useState, useEffect, useContext} from 'react';
13
13
  import {View, StyleSheet} from 'react-native';
14
14
  import {useCustomization} from 'customization-implementation';
15
- import {isValidReactComponent} from '../../utils/common';
15
+ import {
16
+ isAndroid,
17
+ isIOS,
18
+ isMobileUA,
19
+ isValidReactComponent,
20
+ } from '../../utils/common';
16
21
  import LocalVideoMute, {
17
22
  LocalVideoMuteProps,
18
23
  } from '../../subComponents/LocalVideoMute';
19
24
  import LocalAudioMute, {
20
25
  LocalAudioMuteProps,
21
26
  } from '../../subComponents/LocalAudioMute';
27
+ import hexadecimalTransparency from '../../utils/hexadecimalTransparency';
28
+ import PreCallSettings from './PreCallSettings';
29
+ import Spacer from '../../atoms/Spacer';
30
+ import {usePreCall} from './usePreCall';
31
+ import DeviceContext from '../DeviceContext';
22
32
 
23
- const PreCallLocalMute: React.FC = () => {
33
+ const PreCallLocalMute = (props: {isMobileView?: boolean}) => {
24
34
  const {VideoMute, AudioMute} = useCustomization((data) => {
25
35
  let components: {
26
36
  VideoMute: React.ComponentType<LocalAudioMuteProps>;
@@ -60,15 +70,74 @@ const PreCallLocalMute: React.FC = () => {
60
70
  // }
61
71
  return components;
62
72
  });
73
+ const {isMobileView = false} = props;
74
+ const isNative = isAndroid() || isIOS();
75
+ // for mweb check for camera * mic availablity for desktop it happens in settings panel
76
+ // refactor later to set mic/camera availablity oustside settings panel <selectDevice>
77
+ const {deviceList} = useContext(DeviceContext);
78
+ const {setCameraAvailable, setMicAvailable} = usePreCall();
79
+ const audioDevices = deviceList.filter((device) => {
80
+ if (device.kind === 'audioinput') {
81
+ return true;
82
+ }
83
+ });
84
+ const videoDevices = deviceList.filter((device) => {
85
+ if (device.kind === 'videoinput') {
86
+ return true;
87
+ }
88
+ });
89
+ useEffect(() => {
90
+ if (audioDevices && audioDevices.length) {
91
+ isMobileView && !isNative && setMicAvailable(true);
92
+ }
93
+ }, [audioDevices]);
94
+
95
+ useEffect(() => {
96
+ if (videoDevices && videoDevices.length) {
97
+ isMobileView && !isNative && setCameraAvailable(true);
98
+ }
99
+ }, [videoDevices]);
63
100
  return (
64
- <View style={style.precallControls}>
65
- <View style={{alignSelf: 'center'}}>
66
- <AudioMute />
101
+ <View
102
+ style={[style.precallControls, isMobileView && {paddingVertical: 10}]}
103
+ testID="precall-controls">
104
+ <View style={{width: 52, height: 52}}>
105
+ <AudioMute
106
+ isMobileView={isMobileView}
107
+ showLabel={isMobileUA() ? !isMobileView : $config.ICON_TEXT}
108
+ showToolTip={true}
109
+ />
67
110
  </View>
111
+
68
112
  {!$config.AUDIO_ROOM && (
69
- <View style={{alignSelf: 'center'}}>
70
- <VideoMute />
71
- </View>
113
+ <>
114
+ <Spacer size={isMobileView ? 24 : 16} horizontal={true} />
115
+ <View
116
+ style={{
117
+ width: 52,
118
+ height: 52,
119
+ }}>
120
+ <VideoMute
121
+ isMobileView={isMobileView}
122
+ showLabel={isMobileUA() ? !isMobileView : $config.ICON_TEXT}
123
+ showToolTip={true}
124
+ />
125
+ </View>
126
+ </>
127
+ )}
128
+
129
+ {/* Settings View in Mobile */}
130
+ {isMobileView && !isNative && (
131
+ <>
132
+ <Spacer size={isMobileView ? 24 : 16} horizontal={true} />
133
+ <View
134
+ style={{
135
+ width: 52,
136
+ height: 52,
137
+ }}>
138
+ <PreCallSettings />
139
+ </View>
140
+ </>
72
141
  )}
73
142
  </View>
74
143
  );
@@ -83,10 +152,11 @@ export default PreCallLocalMute;
83
152
  const style = StyleSheet.create({
84
153
  precallControls: {
85
154
  flexDirection: 'row',
86
- alignSelf: 'center',
87
- padding: 10,
88
- width: '40%',
89
- justifyContent: 'space-around',
90
- marginVertical: '5%',
155
+ paddingVertical: 32,
156
+ justifyContent: 'center',
157
+ alignItems: 'center',
158
+ backgroundColor: $config.CARD_LAYER_1_COLOR,
159
+ // borderBottomLeftRadius: 4,
160
+ // borderBottomRightRadius: 4,
91
161
  },
92
162
  });
@@ -10,7 +10,7 @@
10
10
  *********************************************
11
11
  */
12
12
  import React from 'react';
13
- import {View, StyleSheet} from 'react-native';
13
+ import {View, StyleSheet, Text} from 'react-native';
14
14
  import {useCustomization} from 'customization-implementation';
15
15
  import {isValidReactComponent} from '../../utils/common';
16
16
  import LocalAudioMute, {
@@ -22,6 +22,7 @@ import LocalVideoMute, {
22
22
  import LocalSwitchCamera, {
23
23
  LocalSwitchCameraProps,
24
24
  } from '../../subComponents/LocalSwitchCamera';
25
+ import hexadecimalTransparency from '../../utils/hexadecimalTransparency';
25
26
 
26
27
  const PreCallLocalMute: React.FC = () => {
27
28
  const {VideoMute, AudioMute} = useCustomization((data) => {
@@ -63,9 +64,18 @@ const PreCallLocalMute: React.FC = () => {
63
64
  // }
64
65
  return components;
65
66
  });
67
+
66
68
  return (
67
- <>
68
- <View style={style.width50}>
69
+ <View style={style.precallControls} testID="precall-controls">
70
+ {!$config.AUDIO_ROOM && (
71
+ <View style={{alignSelf: 'center', marginRight: 30}}>
72
+ <VideoMute />
73
+ </View>
74
+ )}
75
+ <View style={{alignSelf: 'center'}}>
76
+ <AudioMute />
77
+ </View>
78
+ {/* <View style={style.width50}>
69
79
  <AudioMute />
70
80
  </View>
71
81
  {!$config.AUDIO_ROOM && (
@@ -79,8 +89,8 @@ const PreCallLocalMute: React.FC = () => {
79
89
  <LocalSwitchCamera />
80
90
  </View>
81
91
  </>
82
- )}
83
- </>
92
+ )} */}
93
+ </View>
84
94
  );
85
95
  };
86
96
  export const PreCallLocalMuteComponentsArray: [
@@ -92,4 +102,10 @@ export default PreCallLocalMute;
92
102
 
93
103
  const style = StyleSheet.create({
94
104
  width50: {width: 50},
105
+ precallControls: {
106
+ flexDirection: 'row',
107
+ paddingVertical: 10,
108
+ justifyContent: 'center',
109
+ backgroundColor: $config.CARD_LAYER_1_COLOR,
110
+ },
95
111
  });
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ const PermissionHelper = () => {
3
+ return <></>;
4
+ };
5
+ export default PermissionHelper;
@@ -0,0 +1,126 @@
1
+ import {useLocalUserInfo, useRender, useRtc} from 'customization-api';
2
+ import React, {useEffect, useState} from 'react';
3
+ import {
4
+ View,
5
+ Image,
6
+ Modal,
7
+ TouchableOpacity,
8
+ StyleSheet,
9
+ Text,
10
+ } from 'react-native';
11
+ import Popup from '../../atoms/Popup';
12
+ import ThemeConfig from '../../theme';
13
+ //@ts-ignore
14
+ import permissionHelper from '../../assets/permission.png';
15
+ import {PermissionState} from '../../../agora-rn-uikit';
16
+
17
+ const PermissionHelper = () => {
18
+ const {dispatch} = useRtc();
19
+ const {permissionStatus} = useLocalUserInfo();
20
+ const [showPopup, setShowPopup] = useState(false);
21
+
22
+ const closePopup = () => {
23
+ dispatch({
24
+ type: 'LocalPermissionState',
25
+ value: [PermissionState.CANCELLED],
26
+ });
27
+ };
28
+ useEffect(() => {
29
+ //If permission already given it will take few milliseconds to resolve the promise. it will show the popup which not required. so added timeout
30
+ setTimeout(() => {
31
+ setShowPopup(true);
32
+ }, 500);
33
+ }, []);
34
+ //todo hari update the modal message based the veritical
35
+ return (
36
+ showPopup && (
37
+ <Popup
38
+ modalVisible={permissionStatus === PermissionState.REQUESTED}
39
+ setModalVisible={closePopup}
40
+ showCloseIcon={false}
41
+ contentContainerStyle={styles.modal}>
42
+ <View style={styles.modalImageContainer}>
43
+ <Image
44
+ style={styles.modalImage}
45
+ resizeMode={'contain'}
46
+ source={{uri: permissionHelper}}
47
+ />
48
+ </View>
49
+ <View style={styles.modalContent}>
50
+ <Text style={styles.infoMessage1}>
51
+ {$config.AUDIO_ROOM
52
+ ? 'Allow access to microphone'
53
+ : 'Allow access to camera and microphone'}
54
+ </Text>
55
+ <Text style={styles.infoMessage2}>
56
+ Select
57
+ <Text style={styles.infoMessage2Highlight}>{` “Allow” `}</Text>
58
+ {$config.AUDIO_ROOM
59
+ ? 'for others to hear you'
60
+ : 'for others to see and hear you'}
61
+ </Text>
62
+ <TouchableOpacity
63
+ onPress={() => {
64
+ closePopup();
65
+ }}>
66
+ <Text style={styles.dismissBtn}>Dismiss</Text>
67
+ </TouchableOpacity>
68
+ </View>
69
+ </Popup>
70
+ )
71
+ );
72
+ };
73
+
74
+ const styles = StyleSheet.create({
75
+ dismissBtn: {
76
+ fontFamily: ThemeConfig.FontFamily.sansPro,
77
+ fontWeight: '600',
78
+ fontSize: ThemeConfig.FontSize.normal,
79
+ color: $config.PRIMARY_ACTION_BRAND_COLOR,
80
+ paddingVertical: 32,
81
+ },
82
+ infoMessage1: {
83
+ paddingHorizontal: 76,
84
+ paddingTop: 32,
85
+ paddingBottom: 12,
86
+ fontFamily: ThemeConfig.FontFamily.sansPro,
87
+ fontWeight: '700',
88
+ fontSize: ThemeConfig.FontSize.large,
89
+ textAlign: 'center',
90
+ color: $config.FONT_COLOR,
91
+ },
92
+ infoMessage2: {
93
+ fontFamily: ThemeConfig.FontFamily.sansPro,
94
+ fontWeight: '400',
95
+ fontSize: ThemeConfig.FontSize.small,
96
+ color: $config.FONT_COLOR + ThemeConfig.EmphasisPlus.medium,
97
+ },
98
+ infoMessage2Highlight: {
99
+ fontWeight: '700',
100
+ fontFamily: ThemeConfig.FontFamily.sansPro,
101
+ fontSize: ThemeConfig.FontSize.small,
102
+ },
103
+ modal: {
104
+ flex: 1,
105
+ flexDirection: 'column',
106
+ maxHeight: 386,
107
+ width: 441,
108
+ borderRadius: 20,
109
+ paddingHorizontal: 0,
110
+ paddingVertical: 0,
111
+ borderWidth: 0,
112
+ },
113
+ modalImageContainer: {
114
+ minHeight: 190,
115
+ },
116
+ modalImage: {width: '100%', height: '100%'},
117
+ modalContent: {
118
+ flex: 1,
119
+ justifyContent: 'center',
120
+ alignItems: 'center',
121
+ backgroundColor: $config.CARD_LAYER_1_COLOR,
122
+ borderBottomLeftRadius: 20,
123
+ borderBottomRightRadius: 20,
124
+ },
125
+ });
126
+ export default PermissionHelper;
@@ -0,0 +1,52 @@
1
+ import {StyleSheet, Text, TouchableOpacity} from 'react-native';
2
+ import React, {useState} from 'react';
3
+ import SettingsView from '../SettingsView';
4
+ import Popup from '../../atoms/Popup';
5
+ import ImageIcon from '../../atoms/ImageIcon';
6
+
7
+ interface PreCallSettingsProps {
8
+ isMobileView?: boolean;
9
+ }
10
+
11
+ const PreCallSettings = (props: PreCallSettingsProps) => {
12
+ const [isSettingsVisible, setIsSettingsVisible] = useState(false);
13
+ const {isMobileView = true} = props;
14
+
15
+ return (
16
+ <>
17
+ <Popup
18
+ modalVisible={isSettingsVisible}
19
+ setModalVisible={setIsSettingsVisible}
20
+ title=""
21
+ containerStyle={styles.containerStyle}
22
+ contentContainerStyle={styles.contentContainer}
23
+ showCloseIcon={false}>
24
+ <SettingsView
25
+ hideName={true}
26
+ handleClose={() => setIsSettingsVisible(false)}
27
+ />
28
+ </Popup>
29
+
30
+ <TouchableOpacity onPress={() => setIsSettingsVisible(true)}>
31
+ <ImageIcon
32
+ name={'settings'}
33
+ tintColor={$config.SECONDARY_ACTION_COLOR}
34
+ />
35
+ </TouchableOpacity>
36
+ </>
37
+ );
38
+ };
39
+
40
+ export default PreCallSettings;
41
+
42
+ const styles = StyleSheet.create({
43
+ contentContainer: {
44
+ backgroundColor: $config.CARD_LAYER_1_COLOR,
45
+ borderWidth: 1,
46
+ borderColor: $config.CARD_LAYER_3_COLOR,
47
+ borderRadius: 4,
48
+ padding: 0,
49
+ width: '100%',
50
+ },
51
+ containerStyle: {},
52
+ });
@@ -12,8 +12,10 @@
12
12
 
13
13
  import {useRender, useRtc} from 'customization-api';
14
14
  import React from 'react';
15
- import {View} from 'react-native';
15
+ import {View, StyleSheet} from 'react-native';
16
16
  import {MaxVideoView} from '../../../agora-rn-uikit';
17
+ import PreCallLocalMute from './LocalMute';
18
+ import {ImageIcon as UiKitImageIcon} from '../../../agora-rn-uikit';
17
19
 
18
20
  const VideoPreview: React.FC = () => {
19
21
  const rtc = useRtc();
@@ -27,9 +29,52 @@ const VideoPreview: React.FC = () => {
27
29
  }
28
30
 
29
31
  return (
30
- <View style={{borderRadius: 10, flex: 1}}>
31
- <MaxVideoView user={renderList[maxUid]} key={maxUid} />
32
+ <View style={styles.container}>
33
+ <View style={{flex: 1}}>
34
+ <MaxVideoView
35
+ user={renderList[maxUid]}
36
+ key={maxUid}
37
+ fallback={Fallback}
38
+ containerStyle={{
39
+ width: '100%',
40
+ height: '100%',
41
+ borderBottomLeftRadius: 8,
42
+ borderBottomRightRadius: 8,
43
+ }}
44
+ />
45
+ </View>
46
+ <PreCallLocalMute isMobileView={true} />
32
47
  </View>
33
48
  );
34
49
  };
35
50
  export default VideoPreview;
51
+
52
+ const Fallback = () => {
53
+ return (
54
+ <View style={styles.fallbackRootContainer}>
55
+ <View style={styles.avatar}>
56
+ {/*TODO fix ttf file <ImageIcon name="profile" customSize={{width: 100, height: 100}} /> */}
57
+ <UiKitImageIcon name={'profile'} />
58
+ </View>
59
+ </View>
60
+ );
61
+ };
62
+
63
+ const styles = StyleSheet.create({
64
+ container: {
65
+ flex: 1,
66
+ position: 'relative',
67
+ justifyContent: 'space-between',
68
+ },
69
+ avatar: {
70
+ height: 100,
71
+ width: 100,
72
+ },
73
+ fallbackRootContainer: {
74
+ flex: 1,
75
+ backgroundColor: $config.VIDEO_AUDIO_TILE_COLOR,
76
+ justifyContent: 'center',
77
+ alignItems: 'center',
78
+ position: 'relative',
79
+ },
80
+ });