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
@@ -10,12 +10,92 @@
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 {useRender} 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';
35
+
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
+ };
17
97
 
18
- const VideoPreview: React.FC = () => {
98
+ const VideoPreview = () => {
19
99
  const {renderList, activeUids} = useRender();
20
100
 
21
101
  const [maxUid] = activeUids;
@@ -23,11 +103,87 @@ const VideoPreview: React.FC = () => {
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={renderList[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
+ };
@@ -21,6 +21,7 @@ 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,6 +39,7 @@ const JoinCallBtn = (props: PreCallJoinCallBtnProps) => {
38
39
  const {rtcProps} = useContext(PropsContext);
39
40
  const {setCallActive} = usePreCall();
40
41
  const username = useGetName();
42
+ const setUsername = useSetName();
41
43
  const {isJoinDataFetched} = useMeetingInfo();
42
44
  const {awake, request} = useWakeLock();
43
45
  const 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';
2
+ import {Text, StyleSheet, View, TextStyle} from 'react-native';
3
+ import {trimText} from '../../utils/common';
4
+ import ThemeConfig from '../../theme';
3
5
  import {useMeetingInfo} from '../meeting-info/useMeetingInfo';
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
13
  } = useMeetingInfo();
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
17
  import {useMeetingInfo} from '../meeting-info/useMeetingInfo';
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
37
  const {isJoinDataFetched} = useMeetingInfo();
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
  />
@@ -17,11 +17,27 @@ export interface PreCallContextInterface {
17
17
  callActive: boolean;
18
18
  setCallActive: React.Dispatch<React.SetStateAction<boolean>>;
19
19
  error?: ApolloError;
20
+ isCameraAvailable?: boolean;
21
+ setCameraAvailable: React.Dispatch<React.SetStateAction<boolean>>;
22
+ isMicAvailable?: boolean;
23
+ setMicAvailable: React.Dispatch<React.SetStateAction<boolean>>;
24
+ isSpeakerAvailable?: boolean;
25
+ setSpeakerAvailable: React.Dispatch<React.SetStateAction<boolean>>;
26
+ isPermissionRequested: boolean;
27
+ setIsPermissionRequested: React.Dispatch<React.SetStateAction<boolean>>;
20
28
  }
21
29
 
22
30
  const PreCallContext = createContext<PreCallContextInterface>({
23
31
  callActive: false,
24
32
  setCallActive: () => {},
33
+ isCameraAvailable: false,
34
+ isMicAvailable: false,
35
+ isSpeakerAvailable: false,
36
+ setCameraAvailable: () => {},
37
+ setMicAvailable: () => {},
38
+ setSpeakerAvailable: () => {},
39
+ isPermissionRequested: false,
40
+ setIsPermissionRequested: () => {},
25
41
  });
26
42
 
27
43
  interface PreCallProviderProps {
@@ -9,19 +9,22 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
+ import hexadecimalTransparency from '../utils/hexadecimalTransparency';
13
+ import ThemeConfig from '../theme';
12
14
  import {isWebInternal} from '../utils/common';
13
15
 
14
16
  const styles = {
15
17
  temp: {
16
18
  width: '100%',
17
19
  height: '100%',
18
- backgroundColor: $config.SECONDARY_FONT_COLOR,
19
- borderRadius: 15,
20
+ borderRadius: 0,
21
+ borderWidth: 0,
20
22
  },
21
23
  bottomBar: {
22
24
  flex: isWebInternal() ? 1.3 : 1.6,
23
25
  paddingHorizontal: isWebInternal() ? '20%' : '1%',
24
- backgroundColor: $config.SECONDARY_FONT_COLOR + 80,
26
+ backgroundColor:
27
+ $config.SECONDARY_ACTION_COLOR + hexadecimalTransparency['80%'],
25
28
  flexDirection: 'row',
26
29
  justifyContent: 'space-evenly',
27
30
  position: 'relative',
@@ -29,21 +32,30 @@ const styles = {
29
32
  bottom: 0,
30
33
  },
31
34
  localButton: {
32
- backgroundColor: $config.SECONDARY_FONT_COLOR, //'#fff',
33
- borderRadius: 23,
34
- borderColor: $config.PRIMARY_COLOR,
35
- borderWidth: 0,
36
- width: 40,
37
- height: 40,
38
- padding: 3,
39
35
  display: 'flex',
40
36
  alignSelf: 'center',
41
37
  alignItems: 'center',
42
38
  justifyContent: 'center',
43
39
  },
40
+ actionSheetButton: {
41
+ width: 25,
42
+ height: 25,
43
+ },
44
+ localButtonSmall: {
45
+ display: 'flex',
46
+ alignSelf: 'center',
47
+ alignItems: 'center',
48
+ justifyContent: 'center',
49
+ },
50
+ localButtonText: {
51
+ fontFamily: 'Source Sans Pro',
52
+ fontSize: 12,
53
+ marginTop: 4,
54
+ fontWeight: '400',
55
+ },
44
56
  localButtonWithoutBG: {
45
57
  borderRadius: 23,
46
- borderColor: $config.PRIMARY_COLOR,
58
+ borderColor: $config.PRIMARY_ACTION_BRAND_COLOR,
47
59
  borderWidth: 0,
48
60
  width: 40,
49
61
  height: 40,
@@ -59,15 +71,24 @@ const styles = {
59
71
  resizeMode: 'contain',
60
72
  },
61
73
  endCall: {
62
- backgroundColor: $config.SECONDARY_FONT_COLOR, //'#fff',
63
- borderRadius: 23,
64
- borderColor: $config.PRIMARY_COLOR,
65
- borderWidth: 0,
66
- width: 40,
67
- height: 40,
68
- alignSelf: 'center',
69
- alignItems: 'center',
74
+ width: 20,
75
+ height: 20,
76
+ },
77
+ endCallContainer: {
78
+ flexDirection: 'row',
70
79
  justifyContent: 'center',
80
+ alignItems: 'center',
81
+ paddingVertical: 8,
82
+ paddingHorizontal: 16,
83
+ backgroundColor: $config.SEMANTIC_ERROR,
84
+ borderRadius: 8,
85
+ },
86
+ endCallText: {
87
+ color: $config.PRIMARY_ACTION_TEXT_COLOR,
88
+ fontFamily: ThemeConfig.FontFamily.sansPro,
89
+ fontSize: 12,
90
+ marginLeft: 8,
91
+ fontWeight: '700',
71
92
  },
72
93
  remoteButton: {
73
94
  width: 25,
@@ -80,7 +101,7 @@ const styles = {
80
101
  borderRightWidth: 0,
81
102
  borderLeftWidth: 0,
82
103
  marginHorizontal: 0,
83
- backgroundColor: $config.SECONDARY_FONT_COLOR, //'#fff',
104
+ backgroundColor: $config.SECONDARY_ACTION_COLOR, //'#fff',
84
105
  },
85
106
  liveStreamHostControlBtns: {
86
107
  width: 20,
@@ -93,7 +114,7 @@ const styles = {
93
114
  borderRightWidth: 0,
94
115
  borderLeftWidth: 0,
95
116
  marginHorizontal: 0,
96
- backgroundColor: $config.SECONDARY_FONT_COLOR,
117
+ backgroundColor: $config.SECONDARY_ACTION_COLOR,
97
118
  },
98
119
  minCloseBtn: {
99
120
  alignItems: 'center',
@@ -14,7 +14,6 @@ import {createHook} from 'customization-implementation';
14
14
  import React from 'react';
15
15
  import {useString} from '../utils/useString';
16
16
  import isSDKCheck from '../utils/isSDK';
17
- import Toast from '../../react-native-toast-message';
18
17
  import {useMeetingInfo} from './meeting-info/useMeetingInfo';
19
18
  import platform from '../subComponents/Platform';
20
19
  import {MeetingInviteInterface} from '../language/default-labels/videoCallScreenLabels';
@@ -124,31 +123,31 @@ const ShareLinkProvider = (props: ShareLinkProvideProps) => {
124
123
  if (isHost) {
125
124
  if (isSeparateHostLink) {
126
125
  //seperate link for host and attendee
127
- inviteContent += `Meeting - ${meetingName}\nURL for Attendee: ${url?.attendee}\nURL for Host: ${url?.host}`;
126
+ inviteContent += `Meeting: ${meetingName}\n\nAttendee Link:\n${url?.attendee}\n\nHost Link:\n${url?.host}`;
128
127
  } else {
129
128
  //single link for everyone
130
- inviteContent += `Meeting - ${meetingName}\nMeeting URL: ${url?.host}`;
129
+ inviteContent += `Meeting: ${meetingName}\n\nMeeting Link:\n${url?.host}`;
131
130
  }
132
131
  }
133
132
  //for attendee
134
133
  else {
135
- inviteContent += `Meeting - ${meetingName}\nURL for Attendee: ${url?.attendee}`;
134
+ inviteContent += `Meeting: ${meetingName}\n\nAttendee Link:\n${url?.attendee}`;
136
135
  }
137
136
  } else {
138
137
  if (isHost) {
139
138
  if (isSeparateHostLink) {
140
- inviteContent += `Meeting - ${meetingName}\nAttendee Meeting ID: ${id?.attendee}\nHost Meeting ID: ${id?.host}`;
139
+ inviteContent += `Meeting: ${meetingName}\n\nAttendee Meeting ID:\n${id?.attendee}\n\nHost Meeting ID:\n${id?.host}`;
141
140
  } else {
142
- inviteContent += `Meeting - ${meetingName}\nMeeting ID: ${id?.host}`;
141
+ inviteContent += `Meeting: ${meetingName}\n\nMeeting ID:\n${id?.host}`;
143
142
  }
144
143
  } else {
145
144
  //copy this label on videocall screen
146
- inviteContent += `Meeting - ${meetingName}\nAttendee Meeting ID: ${id?.attendee}`;
145
+ inviteContent += `Meeting: ${meetingName}\n\nAttendee Meeting ID:\n${id?.attendee}`;
147
146
  }
148
147
  }
149
148
  // Adding pstn data into meeting data if present
150
149
  if (pstn?.number && pstn?.pin) {
151
- inviteContent += `\nPSTN Number: ${pstn.number}\nPSTN Pin: ${pstn.pin}`;
150
+ inviteContent += `\n\nPSTN Number:\n${pstn.number}\n\nPSTN Pin:\n${pstn.pin}`;
152
151
  }
153
152
  return inviteContent;
154
153
  };
@@ -240,7 +239,10 @@ const ShareLinkProvider = (props: ShareLinkProvideProps) => {
240
239
  return stringToCopy;
241
240
  };
242
241
 
243
- const copyShareLinkToClipboard = (input: SHARE_LINK_CONTENT_TYPE) => {
242
+ const copyShareLinkToClipboard = (
243
+ input: SHARE_LINK_CONTENT_TYPE,
244
+ callbackFn?: () => void,
245
+ ) => {
244
246
  let stringToCopy = '';
245
247
  switch (input) {
246
248
  case SHARE_LINK_CONTENT_TYPE.MEETING_INVITE:
@@ -258,11 +260,7 @@ const ShareLinkProvider = (props: ShareLinkProvideProps) => {
258
260
  break;
259
261
  }
260
262
  Clipboard.setString(stringToCopy);
261
- Toast.show({
262
- type: 'success',
263
- text1: copiedToClipboardText,
264
- visibilityTime: 1000,
265
- });
263
+ callbackFn && callbackFn();
266
264
  };
267
265
 
268
266
  return (
@@ -0,0 +1,41 @@
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, {useState} from 'react';
13
+ import {createHook} from 'customization-implementation';
14
+
15
+ interface ToastContextInterface {
16
+ isActionSheetVisible: boolean;
17
+ setActionSheetVisible: React.Dispatch<React.SetStateAction<boolean>>;
18
+ }
19
+
20
+ const ToastContext = React.createContext<ToastContextInterface>({
21
+ isActionSheetVisible: false,
22
+ setActionSheetVisible: () => {},
23
+ });
24
+
25
+ const ToastProvider = (props: {children: React.ReactNode}) => {
26
+ const [isActionSheetVisible, setActionSheetVisible] = useState(false);
27
+
28
+ return (
29
+ <ToastContext.Provider
30
+ value={{
31
+ isActionSheetVisible,
32
+ setActionSheetVisible,
33
+ }}>
34
+ {props.children}
35
+ </ToastContext.Provider>
36
+ );
37
+ };
38
+
39
+ const useToast = createHook(ToastContext);
40
+
41
+ export {useToast, ToastContext, ToastProvider};