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
@@ -1,15 +1,18 @@
1
1
  import React, { Component } from 'react';
2
- import { Animated, PanResponder, Keyboard } from 'react-native';
2
+ import { Animated, PanResponder, Keyboard, Dimensions } from 'react-native';
3
3
  import PropTypes from 'prop-types';
4
4
 
5
5
  import SuccessToast from './components/success';
6
6
  import ErrorToast from './components/error';
7
7
  import InfoToast from './components/info';
8
+
8
9
  import { complement } from './utils/arr';
9
10
  import { includeKeys } from './utils/obj';
10
11
  import { stylePropType } from './utils/prop-types';
11
12
  import { isIOS } from './utils/platform';
12
13
  import styles from './styles';
14
+ import isMobileOrTablet from '../../src/utils/isMobileOrTablet';
15
+ import { isMobileUA, isWebInternal } from '../../src/utils/common';
13
16
 
14
17
  const FRICTION = 8;
15
18
 
@@ -81,11 +84,15 @@ class Toast extends Component {
81
84
  }
82
85
 
83
86
  static show(options = {}) {
84
- Toast._ref.show(options);
87
+ Toast._ref?.show(options);
85
88
  }
86
89
 
87
90
  static hide() {
88
- Toast._ref.hide();
91
+ Toast._ref?.hide({ forceHide: true });
92
+ }
93
+
94
+ static getToastId() {
95
+ return Toast._ref?.getToastId();
89
96
  }
90
97
 
91
98
  constructor(props) {
@@ -109,7 +116,10 @@ class Toast extends Component {
109
116
  keyboardHeight: 0,
110
117
  keyboardVisible: false,
111
118
 
112
- customProps: {}
119
+ customProps: {},
120
+ customStyle: this.getCustomStyle(),
121
+ isHovered: false,
122
+ toastId: 0
113
123
  };
114
124
 
115
125
  this.panResponder = PanResponder.create({
@@ -126,6 +136,40 @@ class Toast extends Component {
126
136
  });
127
137
  }
128
138
 
139
+ getToastId = () => {
140
+ return this.state?.toastId;
141
+ };
142
+
143
+ getCustomStyle = () => {
144
+ let customStyle = {};
145
+ if (isMobileOrTablet() || Dimensions.get('window').width < 768) {
146
+ customStyle = {
147
+ left: '3%',
148
+ right: '3%',
149
+ width: '94%'
150
+ };
151
+ } else if (Dimensions.get('window').width < 900) {
152
+ customStyle = {
153
+ left: '18%',
154
+ right: '18%',
155
+ width: '64%'
156
+ };
157
+ } else if (Dimensions.get('window').width < 1200) {
158
+ customStyle = {
159
+ left: '25%',
160
+ right: '25%',
161
+ width: '50%'
162
+ };
163
+ } else {
164
+ customStyle = {
165
+ left: '33.33%',
166
+ right: '33.33%',
167
+ width: '33.33%'
168
+ };
169
+ }
170
+ return customStyle;
171
+ };
172
+
129
173
  componentDidMount() {
130
174
  const noop = {
131
175
  remove: () => {}
@@ -251,24 +295,29 @@ class Toast extends Component {
251
295
  }
252
296
  }
253
297
 
254
- async hide({ speed } = {}) {
255
- await this._setState((prevState) => ({
256
- ...prevState,
257
- inProgress: true
258
- }));
259
- await this.animateHide({
260
- speed
261
- });
262
- this.clearTimer();
263
- await this._setState((prevState) => ({
264
- ...prevState,
265
- isVisible: false,
266
- inProgress: false
267
- }));
268
-
269
- const { onHide } = this.state;
270
- if (onHide) {
271
- onHide();
298
+ async hide({ speed, forceHide = false } = {}) {
299
+ if (this.state.isHovered && !forceHide && !isMobileUA()) {
300
+ return;
301
+ } else {
302
+ await this._setState((prevState) => ({
303
+ ...prevState,
304
+ inProgress: true
305
+ }));
306
+ await this.animateHide({
307
+ speed
308
+ });
309
+ this.clearTimer();
310
+ await this._setState((prevState) => ({
311
+ ...prevState,
312
+ isVisible: false,
313
+ inProgress: false,
314
+ toastId: 0
315
+ }));
316
+
317
+ const { onHide } = this.state;
318
+ if (onHide) {
319
+ onHide();
320
+ }
272
321
  }
273
322
  }
274
323
 
@@ -331,9 +380,14 @@ class Toast extends Component {
331
380
  'isVisible',
332
381
  'text1',
333
382
  'text2',
383
+ 'leadingIcon',
334
384
  'hide',
335
385
  'show',
336
- 'onPress'
386
+ 'onPress',
387
+ 'primaryBtn',
388
+ 'secondaryBtn',
389
+ 'checkbox',
390
+ 'toastId'
337
391
  ]
338
392
  }),
339
393
  props: { ...customProps },
@@ -358,6 +412,11 @@ class Toast extends Component {
358
412
 
359
413
  return [
360
414
  styles.base,
415
+ {
416
+ left: this.state.customStyle.left,
417
+ right: this.state.customStyle.right,
418
+ width: this.state.customStyle.width
419
+ },
361
420
  styles[position],
362
421
  {
363
422
  transform: [{ translateY }]
@@ -366,7 +425,10 @@ class Toast extends Component {
366
425
  }
367
426
 
368
427
  onLayout(e) {
369
- this.setState({ height: e.nativeEvent.layout.height });
428
+ this.setState({
429
+ height: e.nativeEvent.layout.height,
430
+ customStyle: this.getCustomStyle()
431
+ });
370
432
  }
371
433
 
372
434
  render() {
@@ -375,16 +437,45 @@ class Toast extends Component {
375
437
  const baseStyle = this.getBaseStyle(position, keyboardHeight);
376
438
 
377
439
  return (
378
- <Animated.View
379
- testID='animatedView'
380
- onLayout={this.onLayout}
381
- style={[baseStyle, style, { zIndex: 100 }]} //added zindex
382
- {...this.panResponder.panHandlers}>
383
- {this.renderContent(this.props)}
384
- </Animated.View>
440
+ <PlatformWrapper
441
+ setIsHovered={(value) => {
442
+ if (!isMobileUA()) {
443
+ this.setState({
444
+ isHovered: value
445
+ });
446
+ setTimeout(() => {
447
+ if (!value) {
448
+ this.startTimer();
449
+ }
450
+ });
451
+ }
452
+ }}>
453
+ <Animated.View
454
+ testID='animatedView'
455
+ onLayout={this.onLayout}
456
+ style={[baseStyle, style, { zIndex: 100 }]} //added zindex
457
+ {...this.panResponder.panHandlers}>
458
+ {this.renderContent(this.props)}
459
+ </Animated.View>
460
+ </PlatformWrapper>
385
461
  );
386
462
  }
387
463
  }
464
+ const PlatformWrapper = ({ children, setIsHovered }) => {
465
+ return isWebInternal() ? (
466
+ <div
467
+ onMouseEnter={() => {
468
+ setIsHovered(true);
469
+ }}
470
+ onMouseLeave={() => {
471
+ setIsHovered(false);
472
+ }}>
473
+ {children}
474
+ </div>
475
+ ) : (
476
+ <>{children}</>
477
+ );
478
+ };
388
479
 
389
480
  Toast.propTypes = {
390
481
  config: PropTypes.objectOf(PropTypes.func),
@@ -1,5 +1,5 @@
1
1
  import React, { Component } from 'react';
2
- import { Animated, PanResponder, Keyboard } from 'react-native';
2
+ import { Animated, PanResponder, Keyboard, Dimensions } from 'react-native';
3
3
  import PropTypes from 'prop-types';
4
4
 
5
5
  import SuccessToast from './components/success';
@@ -10,6 +10,8 @@ import { includeKeys } from './utils/obj';
10
10
  import { stylePropType } from './utils/prop-types';
11
11
  import { isIOS } from './utils/platform';
12
12
  import styles from './styles';
13
+ import isMobileOrTablet from '../../src/utils/isMobileOrTablet';
14
+ import { isWebInternal, isMobileUA } from '../../src/utils/common';
13
15
 
14
16
  const FRICTION = 8;
15
17
 
@@ -81,11 +83,15 @@ class Toast extends Component {
81
83
  }
82
84
 
83
85
  static show(options = {}) {
84
- Toast._ref.show(options);
86
+ Toast._ref?.show(options);
85
87
  }
86
88
 
87
89
  static hide() {
88
- Toast._ref.hide();
90
+ Toast._ref?.hide({ forceHide: true });
91
+ }
92
+
93
+ static getToastId() {
94
+ return Toast._ref?.getToastId();
89
95
  }
90
96
 
91
97
  constructor(props) {
@@ -109,7 +115,10 @@ class Toast extends Component {
109
115
  keyboardHeight: 0,
110
116
  keyboardVisible: false,
111
117
 
112
- customProps: {}
118
+ customProps: {},
119
+ customStyle: this.getCustomStyle(),
120
+ isHovered: false,
121
+ toastId: 0
113
122
  };
114
123
 
115
124
  this.panResponder = PanResponder.create({
@@ -126,6 +135,40 @@ class Toast extends Component {
126
135
  });
127
136
  }
128
137
 
138
+ getToastId = () => {
139
+ return this.state?.toastId;
140
+ };
141
+
142
+ getCustomStyle = () => {
143
+ let customStyle = {};
144
+ if (isMobileOrTablet() || Dimensions.get('window').width < 768) {
145
+ customStyle = {
146
+ left: '3%',
147
+ right: '3%',
148
+ width: '94%'
149
+ };
150
+ } else if (Dimensions.get('window').width < 900) {
151
+ customStyle = {
152
+ left: '18%',
153
+ right: '18%',
154
+ width: '64%'
155
+ };
156
+ } else if (Dimensions.get('window').width < 1200) {
157
+ customStyle = {
158
+ left: '25%',
159
+ right: '25%',
160
+ width: '50%'
161
+ };
162
+ } else {
163
+ customStyle = {
164
+ left: '33.33%',
165
+ right: '33.33%',
166
+ width: '33.33%'
167
+ };
168
+ }
169
+ return customStyle;
170
+ };
171
+
129
172
  componentDidMount() {
130
173
  const noop = {
131
174
  remove: () => {}
@@ -251,24 +294,29 @@ class Toast extends Component {
251
294
  }
252
295
  }
253
296
 
254
- async hide({ speed } = {}) {
255
- await this._setState((prevState) => ({
256
- ...prevState,
257
- inProgress: true
258
- }));
259
- await this.animateHide({
260
- speed
261
- });
262
- this.clearTimer();
263
- await this._setState((prevState) => ({
264
- ...prevState,
265
- isVisible: false,
266
- inProgress: false
267
- }));
268
-
269
- const { onHide } = this.state;
270
- if (onHide) {
271
- onHide();
297
+ async hide({ speed, forceHide = false } = {}) {
298
+ if (this.state.isHovered && !forceHide && !isMobileUA()) {
299
+ return;
300
+ } else {
301
+ await this._setState((prevState) => ({
302
+ ...prevState,
303
+ inProgress: true
304
+ }));
305
+ await this.animateHide({
306
+ speed
307
+ });
308
+ this.clearTimer();
309
+ await this._setState((prevState) => ({
310
+ ...prevState,
311
+ isVisible: false,
312
+ inProgress: false,
313
+ toastId: 0
314
+ }));
315
+
316
+ const { onHide } = this.state;
317
+ if (onHide) {
318
+ onHide();
319
+ }
272
320
  }
273
321
  }
274
322
 
@@ -333,7 +381,11 @@ class Toast extends Component {
333
381
  'text2',
334
382
  'hide',
335
383
  'show',
336
- 'onPress'
384
+ 'onPress',
385
+ 'primaryBtn',
386
+ 'secondaryBtn',
387
+ 'checkbox',
388
+ 'toastId'
337
389
  ]
338
390
  }),
339
391
  props: { ...customProps },
@@ -358,6 +410,11 @@ class Toast extends Component {
358
410
 
359
411
  return [
360
412
  styles.base,
413
+ {
414
+ left: this.state.customStyle.left,
415
+ right: this.state.customStyle.right,
416
+ width: this.state.customStyle.width
417
+ },
361
418
  styles[position],
362
419
  {
363
420
  opacity: translateY
@@ -366,7 +423,10 @@ class Toast extends Component {
366
423
  }
367
424
 
368
425
  onLayout(e) {
369
- this.setState({ height: e.nativeEvent.layout.height });
426
+ this.setState({
427
+ height: e.nativeEvent.layout.height,
428
+ customStyle: this.getCustomStyle()
429
+ });
370
430
  }
371
431
 
372
432
  render() {
@@ -375,21 +435,51 @@ class Toast extends Component {
375
435
  const baseStyle = this.getBaseStyle(position, keyboardHeight);
376
436
 
377
437
  return (
378
- <Animated.View
379
- testID='animatedView'
380
- onLayout={this.onLayout}
381
- style={[
382
- baseStyle,
383
- style,
384
- { zIndex: 100, display: this.state.isVisible ? 'flex' : 'none' }
385
- ]} //added zindex
386
- {...this.panResponder.panHandlers}>
387
- {this.renderContent(this.props)}
388
- </Animated.View>
438
+ <PlatformWrapper
439
+ setIsHovered={(value) => {
440
+ if (!isMobileUA()) {
441
+ this.setState({
442
+ isHovered: value
443
+ });
444
+ setTimeout(() => {
445
+ if (!value) {
446
+ this.startTimer();
447
+ }
448
+ });
449
+ }
450
+ }}>
451
+ <Animated.View
452
+ testID='animatedView'
453
+ onLayout={this.onLayout}
454
+ style={[
455
+ baseStyle,
456
+ style,
457
+ { zIndex: 100, display: this.state.isVisible ? 'flex' : 'none' }
458
+ ]} //added zindex
459
+ {...this.panResponder.panHandlers}>
460
+ {this.renderContent(this.props)}
461
+ </Animated.View>
462
+ </PlatformWrapper>
389
463
  );
390
464
  }
391
465
  }
392
466
 
467
+ const PlatformWrapper = ({ children, setIsHovered }) => {
468
+ return isWebInternal() ? (
469
+ <div
470
+ onMouseEnter={() => {
471
+ setIsHovered(true);
472
+ }}
473
+ onMouseLeave={() => {
474
+ setIsHovered(false);
475
+ }}>
476
+ {children}
477
+ </div>
478
+ ) : (
479
+ <>{children}</>
480
+ );
481
+ };
482
+
393
483
  Toast.propTypes = {
394
484
  config: PropTypes.objectOf(PropTypes.func),
395
485
  style: stylePropType,
@@ -1,12 +1,11 @@
1
- import { StyleSheet } from 'react-native';
1
+ import isMobileOrTablet from '../../src/utils/isMobileOrTablet';
2
+ import { StyleSheet, Dimensions } from 'react-native';
2
3
 
3
4
  export default StyleSheet.create({
4
5
  base: {
5
6
  position: 'absolute',
6
7
  alignItems: 'center',
7
- justifyContent: 'center',
8
- left: 0,
9
- right: 0
8
+ justifyContent: 'center'
10
9
  },
11
10
  top: {
12
11
  top: 0
@@ -1,12 +1,11 @@
1
- import { StyleSheet } from 'react-native';
1
+ import isMobileOrTablet from '../../src/utils/isMobileOrTablet';
2
+ import { Dimensions, StyleSheet } from 'react-native';
2
3
 
3
4
  export default StyleSheet.create({
4
5
  base: {
5
6
  position: 'absolute',
6
7
  alignItems: 'center',
7
- justifyContent: 'center',
8
- left: 0,
9
- right: 0
8
+ justifyContent: 'center'
10
9
  },
11
10
  top: {
12
11
  top: 30
@@ -0,0 +1,7 @@
1
+ module.exports = {
2
+ project: {
3
+ ios: {},
4
+ android: {},
5
+ },
6
+ assets: ["./src/assets/fonts"]
7
+ }
@@ -31,6 +31,7 @@ import {
31
31
  } from './components/meeting-info/useMeetingInfo';
32
32
  import {SetMeetingInfoProvider} from './components/meeting-info/useSetMeetingInfo';
33
33
  import {ShareLinkProvider} from './components/useShareLink';
34
+ import Endcall from './pages/Endcall';
34
35
 
35
36
  //hook can't be used in the outside react function calls. so directly checking the platform.
36
37
  if (Platform.OS === 'ios') {
@@ -46,6 +47,7 @@ declare module 'agora-rn-uikit' {
46
47
  name: string;
47
48
  screenUid: number;
48
49
  offline: boolean;
50
+ lastMessageTimeStamp: number;
49
51
  }
50
52
  interface RtcPropsInterface {
51
53
  screenShareUid: number;
@@ -107,6 +109,10 @@ const App: React.FC = () => {
107
109
  <Route exact path={'/join'}>
108
110
  <Join />
109
111
  </Route>
112
+ {/* Will be used in the future
113
+ <Route exact path={'/leave'}>
114
+ <Endcall />
115
+ </Route> */}
110
116
  {shouldAuthenticate ? (
111
117
  <PrivateRoute
112
118
  path={'/create'}
@@ -15,21 +15,53 @@ import Navigation from './components/Navigation';
15
15
  import {StorageProvider} from './components/StorageContext';
16
16
  import GraphQLProvider from './components/GraphQLProvider';
17
17
  import {SessionProvider} from './components/SessionContext';
18
- import {ImageBackground, SafeAreaView, StatusBar, Platform} from 'react-native';
18
+ import {
19
+ ImageBackground,
20
+ SafeAreaView,
21
+ StatusBar,
22
+ Platform,
23
+ View,
24
+ } from 'react-native';
19
25
  import ColorConfigure from './components/ColorConfigure';
20
- import Toast from '../react-native-toast-message';
21
- import ToastConfig from './subComponents/ToastConfig';
22
26
  import {isValidReactComponent} from './utils/common';
23
27
  import DimensionProvider from './components/dimension/DimensionProvider';
24
28
  import Error from './components/common/Error';
25
29
  import {ErrorProvider} from './components/common';
26
30
  import {useCustomization} from 'customization-implementation';
27
31
  import {LanguageProvider} from './language/useLanguage';
32
+ import {PropsConsumer} from 'agora-rn-uikit';
33
+ import ToastComponent from './components/ToastComponent';
34
+ import {ToastContext, ToastProvider} from './components/useToast';
28
35
 
29
36
  interface AppWrapperProps {
30
37
  children: React.ReactNode;
31
38
  }
32
39
 
40
+ const ImageBackgroundComp = (props: {
41
+ bg?: string;
42
+ color?: string;
43
+ children?: React.ReactNode;
44
+ }) => {
45
+ if (props?.bg) {
46
+ return (
47
+ <ImageBackground
48
+ source={{uri: props.bg}}
49
+ style={{flex: 1}}
50
+ resizeMode={'cover'}>
51
+ {props.children}
52
+ </ImageBackground>
53
+ );
54
+ } else if (props?.color) {
55
+ return (
56
+ <View style={{flex: 1, backgroundColor: props.color}}>
57
+ {props.children}
58
+ </View>
59
+ );
60
+ } else {
61
+ return <>{props.children}</>;
62
+ }
63
+ };
64
+
33
65
  const AppWrapper = (props: AppWrapperProps) => {
34
66
  const AppRoot = useCustomization((data) => {
35
67
  if (
@@ -43,36 +75,39 @@ const AppWrapper = (props: AppWrapperProps) => {
43
75
 
44
76
  return (
45
77
  <AppRoot>
46
- <ImageBackground
47
- source={{uri: $config.BG}}
48
- style={{flex: 1}}
49
- resizeMode={'cover'}>
78
+ <ImageBackgroundComp bg={$config.BG} color={$config.BACKGROUND_COLOR}>
50
79
  <SafeAreaView
51
80
  // @ts-ignore textAlign not supported by TS definitions but is applied to web regardless
52
81
  style={[{flex: 1}, Platform.select({web: {textAlign: 'left'}})]}>
53
82
  <StatusBar hidden={true} />
54
- <Toast ref={(ref) => Toast.setRef(ref)} config={ToastConfig} />
55
- <StorageProvider>
56
- <GraphQLProvider>
57
- <Router>
58
- <SessionProvider>
59
- <ColorConfigure>
60
- <DimensionProvider>
61
- <LanguageProvider>
62
- <ErrorProvider>
63
- <Error />
64
- <Navigation />
65
- {props.children}
66
- </ErrorProvider>
67
- </LanguageProvider>
68
- </DimensionProvider>
69
- </ColorConfigure>
70
- </SessionProvider>
71
- </Router>
72
- </GraphQLProvider>
73
- </StorageProvider>
83
+ <ToastProvider>
84
+ <ToastContext.Consumer>
85
+ {({isActionSheetVisible}) => {
86
+ return !isActionSheetVisible ? <ToastComponent /> : null;
87
+ }}
88
+ </ToastContext.Consumer>
89
+ <StorageProvider>
90
+ <GraphQLProvider>
91
+ <Router>
92
+ <SessionProvider>
93
+ <ColorConfigure>
94
+ <DimensionProvider>
95
+ <LanguageProvider>
96
+ <ErrorProvider>
97
+ <Error />
98
+ <Navigation />
99
+ {props.children}
100
+ </ErrorProvider>
101
+ </LanguageProvider>
102
+ </DimensionProvider>
103
+ </ColorConfigure>
104
+ </SessionProvider>
105
+ </Router>
106
+ </GraphQLProvider>
107
+ </StorageProvider>
108
+ </ToastProvider>
74
109
  </SafeAreaView>
75
- </ImageBackground>
110
+ </ImageBackgroundComp>
76
111
  </AppRoot>
77
112
  );
78
113
  // return <div> hello world</div>; {/* isn't join:phrase redundant now, also can we remove joinStore */}