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,148 @@
1
+ import React, {useContext, useEffect, useState} from 'react';
2
+ import {StyleSheet, View, Text, Platform} from 'react-native';
3
+ import PrimaryButton from '../atoms/PrimaryButton';
4
+ import TertiaryButton from '../atoms/TertiaryButton';
5
+ import Spacer from '../atoms/Spacer';
6
+ import {Logo} from '../components/common';
7
+ import {useHistory} from '../components/Router';
8
+ import StorageContext from '../components/StorageContext';
9
+ import ThemeConfig from '../theme';
10
+ import ReactNativeForegroundService from '@supersami/rn-foreground-service';
11
+ import CircularProgress from '../atoms/CircularProgress';
12
+ import {useIsDesktop} from '../utils/common';
13
+
14
+ /* For android only, bg audio */
15
+ const StopForegroundService = () => {
16
+ if (Platform.OS === 'android') {
17
+ ReactNativeForegroundService.stop();
18
+ console.log('stopping foreground service');
19
+ }
20
+ };
21
+
22
+ const Endcall = () => {
23
+ const leftMeetingLabel = 'You have left the meeting.';
24
+ const rejoinBtnLabel = 'REJOIN';
25
+ const createMeetingLabel = 'START NEW MEETING';
26
+ const returnToHomeLabel = 'Returning to the home screen';
27
+ const {store} = useContext(StorageContext);
28
+ const history = useHistory();
29
+
30
+ const onComplete = React.useCallback(() => {
31
+ history.push('/');
32
+ StopForegroundService();
33
+ }, []);
34
+
35
+ const isDesktop = useIsDesktop();
36
+
37
+ const reJoin = () => {
38
+ StopForegroundService();
39
+ };
40
+ const goToCreate = () => {
41
+ history.push('/');
42
+ StopForegroundService();
43
+ };
44
+ return (
45
+ <View style={styles.main}>
46
+ <View
47
+ style={[
48
+ styles.contentContainer,
49
+ isDesktop() && {alignItems: 'center'},
50
+ ]}>
51
+ <View style={{alignSelf: 'center'}}>
52
+ <Logo />
53
+ </View>
54
+ <Spacer size={20} />
55
+ <Text
56
+ style={[
57
+ styles.heading,
58
+ !isDesktop() && {fontSize: 20, lineHeight: 25},
59
+ ]}>
60
+ {leftMeetingLabel}
61
+ </Text>
62
+ <Spacer size={40} />
63
+ <View
64
+ style={isDesktop() ? styles.btnContainer : styles.btnContainerMobile}>
65
+ <TertiaryButton
66
+ containerStyle={{
67
+ height: 60,
68
+ paddingHorizontal: 34,
69
+ paddingVertical: 20,
70
+ borderRadius: 8,
71
+ minWidth: isDesktop() ? 'auto' : '100%',
72
+ marginRight: isDesktop() ? 12 : 0,
73
+ }}
74
+ textStyle={styles.btnText}
75
+ text={rejoinBtnLabel}
76
+ onPress={() => {
77
+ reJoin();
78
+ }}
79
+ />
80
+
81
+ <PrimaryButton
82
+ containerStyle={{
83
+ height: 60,
84
+ minWidth: isDesktop() ? 'auto' : '100%',
85
+ marginBottom: isDesktop() ? 0 : 20,
86
+ paddingHorizontal: 30,
87
+ paddingVertical: 20,
88
+ }}
89
+ text={createMeetingLabel}
90
+ textStyle={styles.btnText}
91
+ onPress={() => {
92
+ goToCreate();
93
+ }}
94
+ />
95
+ </View>
96
+ </View>
97
+ <View style={styles.bottomContainer}>
98
+ <CircularProgress onComplete={onComplete} timer={60} />
99
+ <Spacer size={10} />
100
+ <Text style={styles.returnHomeText}>{returnToHomeLabel}</Text>
101
+ </View>
102
+ </View>
103
+ );
104
+ };
105
+
106
+ export default Endcall;
107
+
108
+ const styles = StyleSheet.create({
109
+ returnHomeText: {
110
+ fontFamily: ThemeConfig.FontFamily.sansPro,
111
+ fontWeight: '400',
112
+ fontSize: ThemeConfig.FontSize.small,
113
+ lineHeight: 18,
114
+ color: $config.FONT_COLOR,
115
+ textAlign: 'center',
116
+ },
117
+ bottomContainer: {
118
+ marginBottom: 28,
119
+ },
120
+ main: {
121
+ flex: 1,
122
+ paddingHorizontal: 40,
123
+ },
124
+ contentContainer: {
125
+ flex: 1,
126
+ justifyContent: 'center',
127
+ },
128
+ btnContainer: {
129
+ flexDirection: 'row',
130
+ justifyContent: 'space-between',
131
+ },
132
+ btnText: {
133
+ fontWeight: '600',
134
+ fontSize: 16,
135
+ lineHeight: 24,
136
+ },
137
+ btnContainerMobile: {
138
+ flexDirection: 'column-reverse',
139
+ },
140
+ heading: {
141
+ fontFamily: ThemeConfig.FontFamily.sansPro,
142
+ fontWeight: '600',
143
+ fontSize: 40,
144
+ lineHeight: 40,
145
+ color: $config.FONT_COLOR,
146
+ alignSelf: 'center',
147
+ },
148
+ });
@@ -9,12 +9,14 @@
9
9
  information visit https://appbuilder.agora.io.
10
10
  *********************************************
11
11
  */
12
- // @ts-nocheck
13
- import React, {useState} from 'react';
12
+ import React, {useState, useContext} from 'react';
14
13
  import {View, Text, StyleSheet, ScrollView} from 'react-native';
15
14
  import {useHistory} from '../components/Router';
16
- import Logo from '../subComponents/Logo';
15
+ //import Logo from '../subComponents/Logo';
16
+ import Logo from '../components/common/Logo';
17
+ import Spacer from '../atoms/Spacer';
17
18
  import {
19
+ isMobileUA,
18
20
  isValidReactComponent,
19
21
  shouldAuthenticate,
20
22
  useHasBrandLogo,
@@ -29,6 +31,16 @@ import {useString} from '../utils/useString';
29
31
  import {useCustomization} from 'customization-implementation';
30
32
  import {useSetMeetingInfo} from '../components/meeting-info/useSetMeetingInfo';
31
33
  import {MeetingInfoDefaultValue} from '../components/meeting-info/useMeetingInfo';
34
+ import Card from '../atoms/Card';
35
+ import Input from '../atoms/Input';
36
+ import LinkButton from '../atoms/LinkButton';
37
+ import Toast from '../../react-native-toast-message';
38
+ import useJoinMeeting from '../utils/useJoinMeeting';
39
+ import isMobileOrTablet from '../utils/isMobileOrTablet';
40
+ import ThemeConfig from '../theme';
41
+
42
+ const isLiveStream = $config.EVENT_MODE;
43
+ const mobileOrTablet = isMobileOrTablet();
32
44
 
33
45
  const Join = () => {
34
46
  const hasBrandLogo = useHasBrandLogo();
@@ -36,22 +48,46 @@ const Join = () => {
36
48
  // const meetingIdInputPlaceholder = useString('meetingIdInputPlaceholder')();
37
49
  // const enterMeetingButton = useString('enterMeetingButton')();
38
50
  // const createMeetingButton = useString('createMeetingButton')();
39
- const meetingIdInputPlaceholder = 'Enter Meeting ID';
40
- const enterMeetingButton = 'Enter Meeting';
41
- const createMeetingButton = 'Create Meeting';
51
+ const meetingIdInputPlaceholder = isLiveStream
52
+ ? 'Enter Stream ID'
53
+ : 'Enter Meeting ID';
54
+ const enterMeetingButton = isLiveStream ? 'Join Stream' : 'Join Meeting';
55
+ const createMeetingButton = isLiveStream
56
+ ? 'Create a Stream'
57
+ : 'Create a meeting';
42
58
  const history = useHistory();
43
59
  const [phrase, setPhrase] = useState('');
44
60
  const [error, setError] = useState<null | {name: string; message: string}>(
45
61
  null,
46
62
  );
63
+
64
+ const useJoin = useJoinMeeting();
47
65
  const {setMeetingInfo} = useSetMeetingInfo();
48
66
  const createMeeting = () => {
49
67
  history.push('/create');
50
68
  };
51
69
 
52
70
  const startCall = async () => {
53
- setMeetingInfo(MeetingInfoDefaultValue);
54
- history.push(phrase);
71
+ useJoin(phrase)
72
+ .then(() => {
73
+ setMeetingInfo(MeetingInfoDefaultValue);
74
+ history.push(phrase);
75
+ })
76
+
77
+ .catch((error) => {
78
+ const isInvalidUrl =
79
+ error?.message.toLowerCase().trim() === 'invalid url' || false;
80
+ Toast.show({
81
+ type: 'error',
82
+ text1: isInvalidUrl ? 'Meeting ID Invalid.' : 'Some Error Occured.',
83
+ text2: isInvalidUrl
84
+ ? 'Please enter a valid Meeting ID'
85
+ : 'Please try again',
86
+ visibilityTime: 3000,
87
+ primaryBtn: null,
88
+ secondaryBtn: null,
89
+ });
90
+ });
55
91
  };
56
92
  const {JoinComponent} = useCustomization((data) => {
57
93
  let components: {
@@ -71,93 +107,83 @@ const Join = () => {
71
107
  return JoinComponent ? (
72
108
  <JoinComponent />
73
109
  ) : (
74
- <ScrollView contentContainerStyle={style.main}>
75
- <View style={style.nav}>
76
- {hasBrandLogo() && <Logo />}
110
+ <View style={style.root}>
111
+ <ScrollView contentContainerStyle={style.main}>
77
112
  {error ? <Error error={error} /> : <></>}
78
- </View>
79
- <View style={style.content}>
80
- <View style={style.leftContent}>
81
- <Text style={style.heading}>{$config.APP_NAME}</Text>
82
- <Text style={style.headline}>{$config.LANDING_SUB_HEADING}</Text>
83
- <View style={style.inputs}>
84
- <TextInput
113
+ <Card>
114
+ <View>
115
+ <Logo />
116
+ <Spacer size={20} />
117
+ <Text style={style.heading}>
118
+ {isLiveStream ? 'Join a Stream' : 'Join a Meeting'}
119
+ </Text>
120
+ <Spacer size={40} />
121
+ <Input
122
+ labelStyle={style.labelStyle}
123
+ label={isLiveStream ? 'Stream ID' : 'Meeting ID'}
124
+ autoFocus
85
125
  value={phrase}
126
+ helpText={
127
+ isLiveStream
128
+ ? 'Enter the stream ID here for the meeting you’d like to join'
129
+ : 'Enter the meeting ID here for the meeting you’d like to join'
130
+ }
131
+ placeholder={meetingIdInputPlaceholder}
86
132
  onChangeText={(text) => setPhrase(text)}
87
133
  onSubmitEditing={() => startCall()}
88
- placeholder={meetingIdInputPlaceholder}
89
134
  />
90
- <View style={{height: 10}} />
135
+ <Spacer size={60} />
136
+ </View>
137
+ <View style={style.btnContainer}>
91
138
  <PrimaryButton
139
+ iconName="video-on"
92
140
  disabled={phrase === ''}
93
141
  onPress={() => startCall()}
94
142
  text={enterMeetingButton}
143
+ containerStyle={isMobileUA() && {width: '100%'}}
95
144
  />
96
- <HorizontalRule />
97
- <SecondaryButton
98
- onPress={() => createMeeting()}
145
+ <Spacer size={16} />
146
+ <LinkButton
99
147
  text={createMeetingButton}
148
+ onPress={() => createMeeting()}
100
149
  />
101
150
  {shouldAuthenticate ? (
102
- <LogoutButton setError={setError} /> //setError not available in logout?
151
+ <LogoutButton
152
+ //@ts-ignore
153
+ setError={setError}
154
+ /> //setError not available in logout?
103
155
  ) : (
104
156
  <></>
105
157
  )}
106
158
  </View>
107
- </View>
108
- </View>
109
- </ScrollView>
159
+ </Card>
160
+ </ScrollView>
161
+ </View>
110
162
  );
111
163
  };
112
164
 
113
165
  const style = StyleSheet.create({
114
- illustration: {flex: 1, alignSelf: 'flex-end'},
115
- main: {
116
- paddingVertical: '8%',
117
- marginHorizontal: '8%',
118
- display: 'flex',
119
- justifyContent: 'space-evenly',
120
- flexGrow: 1,
121
- },
122
- nav: {
123
- flex: 1,
166
+ btnContainer: {
124
167
  width: '100%',
125
- flexDirection: 'row',
126
168
  alignItems: 'center',
127
- alignSelf: 'center',
128
- justifyContent: 'center',
129
169
  },
130
- content: {flex: 6, flexDirection: 'row'},
131
- leftContent: {
132
- width: '100%',
133
- minHeight: 300,
170
+ labelStyle: {
171
+ paddingLeft: 8,
172
+ },
173
+ root: {
134
174
  flex: 1,
135
- justifyContent: 'space-evenly',
136
- marginBottom: '15%',
137
- marginTop: '8%',
138
- // marginRight: '5%',
139
- marginHorizontal: 'auto',
175
+ },
176
+ main: {
177
+ flexGrow: 1,
178
+ flexDirection: 'row',
179
+ justifyContent: 'center',
140
180
  },
141
181
  heading: {
142
- fontSize: 32,
182
+ fontSize: ThemeConfig.FontSize.extraLarge,
143
183
  fontWeight: '700',
144
- textAlign: 'center',
145
- color: $config.PRIMARY_FONT_COLOR,
146
- marginBottom: 20,
147
- },
148
- headline: {
149
- fontSize: 18,
150
- fontWeight: '400',
151
- textAlign: 'center',
152
- color: $config.PRIMARY_FONT_COLOR,
153
- marginBottom: 20,
154
- },
155
- inputs: {
156
- flex: 1,
157
- width: '100%',
158
- alignSelf: 'flex-start',
159
- alignItems: 'center',
160
- justifyContent: 'space-evenly',
184
+ lineHeight: ThemeConfig.FontSize.extraLarge,
185
+ color: $config.FONT_COLOR,
186
+ fontFamily: ThemeConfig.FontFamily.sansPro,
161
187
  },
162
188
  });
163
189
 
@@ -11,7 +11,7 @@
11
11
  */
12
12
  // @ts-nocheck
13
13
  import React, {useState, useContext, useEffect} from 'react';
14
- import {View, StyleSheet, Text} from 'react-native';
14
+ import {View, StyleSheet, Text, useWindowDimensions} from 'react-native';
15
15
  import {
16
16
  RtcConfigure,
17
17
  PropsProvider,
@@ -24,7 +24,7 @@ import {useParams, useHistory} from '../components/Router';
24
24
  import RtmConfigure from '../components/RTMConfigure';
25
25
  import DeviceConfigure from '../components/DeviceConfigure';
26
26
  import Logo from '../subComponents/Logo';
27
- import {useHasBrandLogo, isArray} from '../utils/common';
27
+ import {useHasBrandLogo, isArray, isMobileUA} from '../utils/common';
28
28
  import {SidePanelType} from '../subComponents/SidePanelEnum';
29
29
  import {videoView} from '../../theme.json';
30
30
  import {LiveStreamContextProvider} from '../components/livestream';
@@ -54,6 +54,9 @@ import {useWakeLock} from '../components/useWakeLock';
54
54
  import SDKEvents from '../utils/SdkEvents';
55
55
  import {UserPreferenceProvider} from '../components/useUserPreference';
56
56
  import EventsConfigure from '../components/EventsConfigure';
57
+ import PermissionHelper from '../components/precall/PermissionHelper';
58
+ import {currentFocus, FocusProvider} from '../utils/useFocus';
59
+ import {VideoCallProvider} from '../components/useVideoCall';
57
60
 
58
61
  enum RnEncryptionEnum {
59
62
  /**
@@ -99,6 +102,9 @@ const VideoCall: React.FC = () => {
99
102
  const [isRecordingActive, setRecordingActive] = useState(false);
100
103
  const [queryComplete, setQueryComplete] = useState(false);
101
104
  const [sidePanel, setSidePanel] = useState<SidePanelType>(SidePanelType.None);
105
+ const [currentFocus, setFocus] = useState<currentFocus>({
106
+ editName: false,
107
+ });
102
108
  const {phrase} = useParams<{phrase: string}>();
103
109
  // commented for v1 release
104
110
  //const lifecycle = useCustomization((data) => data.lifecycle);
@@ -136,6 +142,7 @@ const VideoCall: React.FC = () => {
136
142
  .then(() => {})
137
143
  .catch((error) => {
138
144
  setGlobalErrorMessage(error);
145
+ history.push('/');
139
146
  });
140
147
  }, []);
141
148
 
@@ -181,7 +188,10 @@ const VideoCall: React.FC = () => {
181
188
  history.push('/');
182
189
  }, 0),
183
190
  };
184
-
191
+ const [isCameraAvailable, setCameraAvailable] = useState(false);
192
+ const [isMicAvailable, setMicAvailable] = useState(false);
193
+ const [isSpeakerAvailable, setSpeakerAvailable] = useState(false);
194
+ const [isPermissionRequested, setIsPermissionRequested] = useState(false);
185
195
  return (
186
196
  <>
187
197
  {queryComplete ? (
@@ -210,65 +220,80 @@ const VideoCall: React.FC = () => {
210
220
  currentLayout,
211
221
  setLayout,
212
222
  }}>
213
- <SidePanelProvider
214
- value={{
215
- sidePanel,
216
- setSidePanel,
217
- }}>
218
- <ChatMessagesProvider>
219
- <ScreenShareProvider>
220
- <RtmConfigure
221
- setRecordingActive={setRecordingActive}
222
- callActive={callActive}>
223
- <UserPreferenceProvider>
224
- <EventsConfigure>
225
- <WhiteboardProvider>
226
- <RecordingProvider
227
- value={{
228
- setRecordingActive,
229
- isRecordingActive,
230
- }}>
231
- <ScreenshareConfigure>
232
- <LiveStreamContextProvider
233
- value={{
234
- setRtcProps,
235
- rtcProps,
236
- callActive,
237
- }}>
238
- <LiveStreamDataProvider>
239
- <LocalUserContext
240
- localUid={rtcProps?.uid || 0}>
241
- <CustomUserContextHolder>
242
- <NetworkQualityProvider>
243
- {callActive ? (
244
- <VideoMeetingDataProvider>
245
- <VideoCallScreen />
246
- </VideoMeetingDataProvider>
247
- ) : $config.PRECALL ? (
248
- <PreCallProvider
249
- value={{
250
- callActive,
251
- setCallActive,
252
- }}>
253
- <Precall />
254
- </PreCallProvider>
255
- ) : (
256
- <></>
257
- )}
258
- </NetworkQualityProvider>
259
- </CustomUserContextHolder>
260
- </LocalUserContext>
261
- </LiveStreamDataProvider>
262
- </LiveStreamContextProvider>
263
- </ScreenshareConfigure>
264
- </RecordingProvider>
265
- </WhiteboardProvider>
266
- </EventsConfigure>
267
- </UserPreferenceProvider>
268
- </RtmConfigure>
269
- </ScreenShareProvider>
270
- </ChatMessagesProvider>
271
- </SidePanelProvider>
223
+ <FocusProvider value={{currentFocus, setFocus}}>
224
+ <SidePanelProvider
225
+ value={{
226
+ sidePanel,
227
+ setSidePanel,
228
+ }}>
229
+ <ChatMessagesProvider>
230
+ <ScreenShareProvider>
231
+ <RtmConfigure
232
+ setRecordingActive={setRecordingActive}
233
+ callActive={callActive}>
234
+ <UserPreferenceProvider>
235
+ <EventsConfigure>
236
+ <WhiteboardProvider>
237
+ <RecordingProvider
238
+ value={{
239
+ setRecordingActive,
240
+ isRecordingActive,
241
+ }}>
242
+ <ScreenshareConfigure>
243
+ <LiveStreamContextProvider
244
+ value={{
245
+ setRtcProps,
246
+ rtcProps,
247
+ callActive,
248
+ }}>
249
+ <LiveStreamDataProvider>
250
+ <LocalUserContext
251
+ localUid={rtcProps?.uid}>
252
+ <CustomUserContextHolder>
253
+ <NetworkQualityProvider>
254
+ {!isMobileUA() && (
255
+ <PermissionHelper />
256
+ )}
257
+ {callActive ? (
258
+ <VideoMeetingDataProvider>
259
+ <VideoCallProvider>
260
+ <VideoCallScreen />
261
+ </VideoCallProvider>
262
+ </VideoMeetingDataProvider>
263
+ ) : $config.PRECALL ? (
264
+ <PreCallProvider
265
+ value={{
266
+ callActive,
267
+ setCallActive,
268
+ isCameraAvailable,
269
+ isMicAvailable,
270
+ setCameraAvailable,
271
+ setMicAvailable,
272
+ isPermissionRequested,
273
+ setIsPermissionRequested,
274
+ isSpeakerAvailable,
275
+ setSpeakerAvailable,
276
+ }}>
277
+ <Precall />
278
+ </PreCallProvider>
279
+ ) : (
280
+ <></>
281
+ )}
282
+ </NetworkQualityProvider>
283
+ </CustomUserContextHolder>
284
+ </LocalUserContext>
285
+ </LiveStreamDataProvider>
286
+ </LiveStreamContextProvider>
287
+ </ScreenshareConfigure>
288
+ </RecordingProvider>
289
+ </WhiteboardProvider>
290
+ </EventsConfigure>
291
+ </UserPreferenceProvider>
292
+ </RtmConfigure>
293
+ </ScreenShareProvider>
294
+ </ChatMessagesProvider>
295
+ </SidePanelProvider>
296
+ </FocusProvider>
272
297
  </LayoutProvider>
273
298
  </ChatNotificationProvider>
274
299
  </ChatUIControlProvider>
@@ -302,7 +327,7 @@ const styleProps = {
302
327
  recording: styles.localButton,
303
328
  screenshare: styles.localButton,
304
329
  },
305
- theme: $config.PRIMARY_COLOR,
330
+ theme: $config.PRIMARY_ACTION_BRAND_COLOR,
306
331
  remoteBtnStyles: {
307
332
  muteRemoteAudio: styles.remoteButton,
308
333
  muteRemoteVideo: styles.remoteButton,
@@ -330,7 +355,7 @@ const style = StyleSheet.create({
330
355
  justifyContent: 'center',
331
356
  marginBottom: 30,
332
357
  },
333
- loaderText: {fontWeight: '500', color: $config.PRIMARY_FONT_COLOR},
358
+ loaderText: {fontWeight: '500', color: $config.FONT_COLOR},
334
359
  });
335
360
 
336
361
  export default VideoCall;