ordering-ui-react-native 0.17.58 → 0.17.59-release

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 (211) hide show
  1. package/package.json +8 -7
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessesListing/index.tsx +1 -1
  4. package/src/components/OrderCreating/index.tsx +1 -21
  5. package/src/components/PaymentOptionsWebView/index.tsx +29 -8
  6. package/src/components/PhoneInputNumber/index.tsx +6 -2
  7. package/src/components/StripeMethodForm/index.tsx +136 -102
  8. package/src/components/VerifyPhone/styles.tsx +1 -2
  9. package/src/components/shared/OToast.tsx +4 -4
  10. package/src/types/index.tsx +5 -0
  11. package/src/utils/index.tsx +5 -0
  12. package/themes/business/index.tsx +2 -0
  13. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +265 -240
  14. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -4
  15. package/themes/business/src/components/BusinessController/index.tsx +0 -1
  16. package/themes/business/src/components/Chat/index.tsx +125 -113
  17. package/themes/business/src/components/DriverMap/index.tsx +17 -6
  18. package/themes/business/src/components/DriverSchedule/index.tsx +42 -5
  19. package/themes/business/src/components/GoogleMap/index.tsx +58 -57
  20. package/themes/business/src/components/LoginForm/Otp/index.tsx +31 -3
  21. package/themes/business/src/components/LoginForm/index.tsx +15 -22
  22. package/themes/business/src/components/MapView/index.tsx +10 -10
  23. package/themes/business/src/components/NewOrderNotification/index.tsx +35 -21
  24. package/themes/business/src/components/NotFoundSource/index.tsx +2 -2
  25. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  26. package/themes/business/src/components/OrderDetails/Delivery.tsx +191 -6
  27. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +93 -50
  28. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +64 -63
  29. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +195 -0
  30. package/themes/business/src/components/OrderDetailsLogistic/styles.tsx +5 -0
  31. package/themes/business/src/components/OrderMessage/index.tsx +19 -18
  32. package/themes/business/src/components/OrderSummary/index.tsx +113 -121
  33. package/themes/business/src/components/OrdersOption/index.tsx +32 -75
  34. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +249 -0
  35. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +115 -0
  36. package/themes/business/src/components/PreviousOrders/index.tsx +445 -243
  37. package/themes/business/src/components/PreviousOrders/styles.tsx +31 -3
  38. package/themes/business/src/components/ProductItemAccordion/index.tsx +27 -3
  39. package/themes/business/src/components/ReviewCustomer/index.tsx +30 -15
  40. package/themes/business/src/components/StoresList/index.tsx +3 -4
  41. package/themes/business/src/components/UserProfileForm/index.tsx +11 -13
  42. package/themes/business/src/components/shared/OLink.tsx +33 -13
  43. package/themes/business/src/components/shared/OModal.tsx +16 -9
  44. package/themes/business/src/components/shared/OText.tsx +8 -2
  45. package/themes/business/src/types/index.tsx +28 -12
  46. package/themes/business/src/utils/index.tsx +29 -2
  47. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  48. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  49. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  50. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  51. package/themes/kiosk/src/components/Intro/index.tsx +16 -1
  52. package/themes/kiosk/src/components/LoginForm/index.tsx +7 -9
  53. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  54. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  55. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  56. package/themes/kiosk/src/components/PhoneInputNumber/index.tsx +2 -2
  57. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  58. package/themes/original/index.tsx +4 -0
  59. package/themes/original/src/components/AddressDetails/index.tsx +28 -10
  60. package/themes/original/src/components/AddressForm/index.tsx +68 -40
  61. package/themes/original/src/components/AddressList/index.tsx +27 -22
  62. package/themes/original/src/components/AddressList/styles.tsx +4 -2
  63. package/themes/original/src/components/AnalyticsSegment/index.tsx +193 -10
  64. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  65. package/themes/original/src/components/AppleLogin/styles.tsx +3 -1
  66. package/themes/original/src/components/BusinessBasicInformation/index.tsx +153 -96
  67. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +10 -12
  68. package/themes/original/src/components/BusinessController/index.tsx +122 -68
  69. package/themes/original/src/components/BusinessController/styles.tsx +23 -4
  70. package/themes/original/src/components/BusinessFeaturedController/index.tsx +21 -54
  71. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +8 -0
  72. package/themes/original/src/components/BusinessInformation/index.tsx +110 -108
  73. package/themes/original/src/components/BusinessItemAccordion/index.tsx +15 -20
  74. package/themes/original/src/components/BusinessListingSearch/index.tsx +352 -326
  75. package/themes/original/src/components/BusinessListingSearch/styles.tsx +0 -18
  76. package/themes/original/src/components/BusinessPreorder/index.tsx +103 -19
  77. package/themes/original/src/components/BusinessProductsCategories/index.tsx +1 -2
  78. package/themes/original/src/components/BusinessProductsList/index.tsx +25 -15
  79. package/themes/original/src/components/BusinessProductsList/styles.tsx +8 -3
  80. package/themes/original/src/components/BusinessProductsListing/UpsellingRedirect.tsx +1 -1
  81. package/themes/original/src/components/BusinessProductsListing/index.tsx +683 -555
  82. package/themes/original/src/components/BusinessProductsListing/styles.tsx +2 -2
  83. package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
  84. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +1 -1
  85. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +97 -91
  86. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +0 -1
  87. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  88. package/themes/original/src/components/Cart/index.tsx +77 -50
  89. package/themes/original/src/components/CartContent/index.tsx +117 -20
  90. package/themes/original/src/components/CartContent/styles.tsx +17 -7
  91. package/themes/original/src/components/Checkout/index.tsx +357 -171
  92. package/themes/original/src/components/Checkout/styles.tsx +4 -2
  93. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  94. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  95. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  96. package/themes/original/src/components/DriverTips/index.tsx +52 -34
  97. package/themes/original/src/components/FacebookLogin/styles.tsx +3 -1
  98. package/themes/original/src/components/Favorite/index.tsx +8 -9
  99. package/themes/original/src/components/Favorite/styles.tsx +1 -1
  100. package/themes/original/src/components/FavoriteList/index.tsx +51 -80
  101. package/themes/original/src/components/FloatingButton/index.tsx +1 -2
  102. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  103. package/themes/original/src/components/GPSButton/index.tsx +6 -4
  104. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  105. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +96 -0
  106. package/themes/original/src/components/GiftCard/GiftCardUI/styles.tsx +5 -0
  107. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +100 -0
  108. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +8 -0
  109. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +191 -0
  110. package/themes/original/src/components/GiftCard/RedeemGiftCard/styles.tsx +8 -0
  111. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +165 -0
  112. package/themes/original/src/components/GiftCard/SendGiftCard/styles.tsx +9 -0
  113. package/themes/original/src/components/GoogleLogin/styles.tsx +1 -1
  114. package/themes/original/src/components/GoogleMap/index.tsx +15 -4
  115. package/themes/original/src/components/Help/index.tsx +8 -8
  116. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +10 -31
  117. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +5 -3
  118. package/themes/original/src/components/HelpGuide/index.tsx +6 -6
  119. package/themes/original/src/components/HelpGuide/styles.tsx +6 -0
  120. package/themes/original/src/components/HelpOrder/index.tsx +6 -15
  121. package/themes/original/src/components/HelpOrder/styles.tsx +8 -1
  122. package/themes/original/src/components/Home/index.tsx +13 -4
  123. package/themes/original/src/components/LastOrder/index.tsx +1 -34
  124. package/themes/original/src/components/LoginForm/Otp/index.tsx +55 -13
  125. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  126. package/themes/original/src/components/LoginForm/index.tsx +60 -35
  127. package/themes/original/src/components/LottieAnimation/index.tsx +89 -55
  128. package/themes/original/src/components/MessageListing/index.tsx +16 -42
  129. package/themes/original/src/components/Messages/index.tsx +32 -10
  130. package/themes/original/src/components/MomentOption/index.tsx +195 -90
  131. package/themes/original/src/components/MomentSelector/index.tsx +1 -1
  132. package/themes/original/src/components/MultiCart/index.tsx +50 -0
  133. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +153 -49
  134. package/themes/original/src/components/MultiCheckout/index.tsx +308 -88
  135. package/themes/original/src/components/MultiCheckout/styles.tsx +3 -1
  136. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +37 -224
  137. package/themes/original/src/components/MultiOrdersDetails/index.tsx +68 -21
  138. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
  139. package/themes/original/src/components/MyOrders/index.tsx +65 -52
  140. package/themes/original/src/components/NavBar/index.tsx +18 -18
  141. package/themes/original/src/components/NotFoundSource/index.tsx +14 -10
  142. package/themes/original/src/components/Notifications/index.tsx +46 -50
  143. package/themes/original/src/components/Notifications/styles.tsx +6 -3
  144. package/themes/original/src/components/OrderDetails/OrderEta.tsx +76 -0
  145. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +15 -3
  146. package/themes/original/src/components/OrderDetails/index.tsx +190 -358
  147. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  148. package/themes/original/src/components/OrderItAgain/index.tsx +3 -1
  149. package/themes/original/src/components/OrderProgress/index.tsx +33 -59
  150. package/themes/original/src/components/OrderSummary/index.tsx +85 -57
  151. package/themes/original/src/components/OrderTypeSelector/index.tsx +1 -1
  152. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +24 -19
  153. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +14 -14
  154. package/themes/original/src/components/OrdersOption/index.tsx +78 -67
  155. package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
  156. package/themes/original/src/components/PageBanner/index.tsx +106 -31
  157. package/themes/original/src/components/PageBanner/styles.tsx +4 -4
  158. package/themes/original/src/components/PaymentOptionCard/index.tsx +180 -0
  159. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +1 -1
  160. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  161. package/themes/original/src/components/PaymentOptions/index.tsx +68 -9
  162. package/themes/original/src/components/PhoneInputNumber/index.tsx +3 -3
  163. package/themes/original/src/components/ProductForm/index.tsx +114 -35
  164. package/themes/original/src/components/ProductForm/styles.tsx +5 -7
  165. package/themes/original/src/components/ProductItemAccordion/index.tsx +22 -19
  166. package/themes/original/src/components/ProductOptionSubOption/index.tsx +24 -14
  167. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +3 -4
  168. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  169. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -50
  170. package/themes/original/src/components/ProfessionalProfile/index.tsx +36 -7
  171. package/themes/original/src/components/Promotions/index.tsx +234 -220
  172. package/themes/original/src/components/Promotions/styles.tsx +10 -3
  173. package/themes/original/src/components/ReviewDriver/index.tsx +3 -3
  174. package/themes/original/src/components/ReviewOrder/index.tsx +26 -9
  175. package/themes/original/src/components/ReviewOrder/styles.tsx +7 -0
  176. package/themes/original/src/components/ReviewProducts/index.tsx +23 -11
  177. package/themes/original/src/components/ReviewTrigger/index.tsx +27 -9
  178. package/themes/original/src/components/ReviewTrigger/styles.tsx +8 -1
  179. package/themes/original/src/components/ScheduleAccordion/index.tsx +68 -0
  180. package/themes/original/src/components/ScheduleAccordion/styles.tsx +14 -0
  181. package/themes/original/src/components/ServiceForm/index.tsx +66 -17
  182. package/themes/original/src/components/Sessions/index.tsx +11 -8
  183. package/themes/original/src/components/Sessions/styles.tsx +5 -0
  184. package/themes/original/src/components/SignupForm/index.tsx +44 -29
  185. package/themes/original/src/components/SingleOrderCard/index.tsx +130 -52
  186. package/themes/original/src/components/SingleOrderCard/styles.tsx +11 -2
  187. package/themes/original/src/components/SingleProductCard/index.tsx +71 -34
  188. package/themes/original/src/components/SingleProductCard/styles.tsx +21 -4
  189. package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
  190. package/themes/original/src/components/StripeCardsList/index.tsx +13 -3
  191. package/themes/original/src/components/StripeElementsForm/index.tsx +48 -34
  192. package/themes/original/src/components/UpsellingProducts/index.tsx +238 -224
  193. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  194. package/themes/original/src/components/UserDetails/index.tsx +8 -4
  195. package/themes/original/src/components/UserFormDetails/index.tsx +76 -7
  196. package/themes/original/src/components/UserFormDetails/styles.tsx +1 -1
  197. package/themes/original/src/components/UserProfile/index.tsx +88 -79
  198. package/themes/original/src/components/UserProfileForm/index.tsx +27 -29
  199. package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
  200. package/themes/original/src/components/WalletTransactionItem/index.tsx +2 -2
  201. package/themes/original/src/components/WalletTransactions/index.tsx +3 -3
  202. package/themes/original/src/components/Wallets/index.tsx +67 -24
  203. package/themes/original/src/components/Wallets/styles.tsx +3 -4
  204. package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
  205. package/themes/original/src/components/shared/OButton.tsx +6 -2
  206. package/themes/original/src/components/shared/OInput.tsx +6 -1
  207. package/themes/original/src/components/shared/OModal.tsx +3 -3
  208. package/themes/original/src/layouts/Container.tsx +1 -1
  209. package/themes/original/src/types/index.tsx +39 -10
  210. package/themes/original/src/utils/index.tsx +273 -1
  211. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -1,11 +1,12 @@
1
1
  import React, { useEffect, useState, useRef } from 'react';
2
- import { StyleSheet, View, Keyboard, Vibration } from 'react-native';
2
+ import { StyleSheet, View, Keyboard, Modal } from 'react-native';
3
3
  import Spinner from 'react-native-loading-spinner-overlay';
4
4
  import { useForm, Controller } from 'react-hook-form';
5
5
  import { PhoneInputNumber } from '../PhoneInputNumber';
6
6
  import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
7
7
  import Recaptcha from 'react-native-recaptcha-that-works'
8
8
  import ReCaptcha from '@fatnlazycat/react-native-recaptcha-v3'
9
+ import ReactNativeHapticFeedback from "react-native-haptic-feedback";
9
10
 
10
11
  import {
11
12
  LoginForm as LoginFormController,
@@ -45,6 +46,7 @@ import { AppleLogin } from '../AppleLogin';
45
46
  import { Otp } from './Otp'
46
47
  import { TouchableOpacity } from 'react-native-gesture-handler';
47
48
  import Alert from '../../../../../src/providers/AlertProvider'
49
+ import { vibrateApp } from '../../utils';
48
50
 
49
51
  const LoginFormUI = (props: LoginParams) => {
50
52
  const {
@@ -72,6 +74,7 @@ const LoginFormUI = (props: LoginParams) => {
72
74
  generateOtpCode,
73
75
  useLoginOtpEmail,
74
76
  useLoginOtpCellphone,
77
+ isGuest
75
78
  } = props;
76
79
 
77
80
  const [, { showToast }] = useToast();
@@ -95,6 +98,7 @@ const LoginFormUI = (props: LoginParams) => {
95
98
  const [recaptchaVerified, setRecaptchaVerified] = useState(false)
96
99
  const [alertState, setAlertState] = useState({ open: false, title: '', content: [] })
97
100
  const [tabLayouts, setTabLayouts] = useState<any>({})
101
+ const [otpError, setOtpError] = useState(null)
98
102
  const tabsRef = useRef<any>(null)
99
103
  const enabledPoweredByOrdering = configs?.powered_by_ordering_module?.value
100
104
  const theme = useTheme();
@@ -160,12 +164,24 @@ const LoginFormUI = (props: LoginParams) => {
160
164
  handleCategoryScroll(otpType ? `${val}_${otpType}` : val)
161
165
  };
162
166
 
167
+ const vibrateApp = (impact?: string) => {
168
+ const options = {
169
+ enableVibrateFallback: true,
170
+ ignoreAndroidSystemSettings: false
171
+ };
172
+ ReactNativeHapticFeedback.trigger(impact || "impactLight", options);
173
+ }
174
+
163
175
  const onSubmit = (values?: any) => {
164
176
  Keyboard.dismiss();
165
177
  if (loginTab === 'otp') {
166
178
  if (phoneInputData.error && (loginTab !== 'otp' || (otpType === 'cellphone' && loginTab === 'otp'))) {
167
179
  showToast(ToastType.Error, t('INVALID_PHONE_NUMBER', 'Invalid phone number'));
168
- Vibration.vibrate()
180
+ vibrateApp()
181
+ return
182
+ }
183
+ if (!values?.cellphone && otpType === 'cellphone') {
184
+ showToast(ToastType.Error, t('PHONE_NUMBER_REQUIRED', 'Phone number is required'));
169
185
  return
170
186
  }
171
187
  if (loginTab === 'otp') {
@@ -178,7 +194,7 @@ const LoginFormUI = (props: LoginParams) => {
178
194
  } else {
179
195
  if (phoneInputData.error) {
180
196
  showToast(ToastType.Error, phoneInputData.error);
181
- Vibration.vibrate()
197
+ vibrateApp()
182
198
  return;
183
199
  }
184
200
  handleButtonLoginClick({
@@ -191,7 +207,7 @@ const LoginFormUI = (props: LoginParams) => {
191
207
  const handleVerifyCodeClick = () => {
192
208
  if (phoneInputData.error) {
193
209
  showToast(ToastType.Error, phoneInputData.error);
194
- Vibration.vibrate()
210
+ vibrateApp()
195
211
  return;
196
212
  }
197
213
  if (
@@ -206,7 +222,7 @@ const LoginFormUI = (props: LoginParams) => {
206
222
  'The field Mobile phone is required.',
207
223
  ),
208
224
  );
209
- Vibration.vibrate()
225
+ vibrateApp()
210
226
  return;
211
227
  }
212
228
  handleSendVerifyCode && handleSendVerifyCode(phoneInputData.phone);
@@ -221,19 +237,19 @@ const LoginFormUI = (props: LoginParams) => {
221
237
  };
222
238
 
223
239
  const handleChangeInputEmail = (value: string, onChange: any) => {
224
- onChange(value.toLowerCase().replace(/[&,()%";:ç?<>{}\\[\]\s]/g, ''));
240
+ onChange(value.toLowerCase().trim().replace(/[&,()%";:ç?<>{}\\[\]\s]/g, ''));
225
241
  };
226
242
 
227
243
  const handleOpenRecaptcha = () => {
228
244
  setRecaptchaVerified(false)
229
245
  if (!recaptchaConfig?.siteKey) {
230
246
  showToast(ToastType.Error, t('NO_RECAPTCHA_SITE_KEY', 'The config doesn\'t have recaptcha site key'));
231
- Vibration.vibrate()
247
+ vibrateApp()
232
248
  return
233
249
  }
234
250
  if (!recaptchaConfig?.baseUrl) {
235
251
  showToast(ToastType.Error, t('NO_RECAPTCHA_BASE_URL', 'The config doesn\'t have recaptcha base url'));
236
- Vibration.vibrate()
252
+ vibrateApp()
237
253
  return
238
254
  }
239
255
 
@@ -250,9 +266,14 @@ const LoginFormUI = (props: LoginParams) => {
250
266
  setOtpType(type)
251
267
  }
252
268
 
253
- const handleLoginOtp = (code: string) => {
254
- handleButtonLoginClick({ code })
255
- setWillVerifyOtpState(false)
269
+ const handleLoginOtp = async (code: string) => {
270
+ if (!code) return
271
+ const logged = await handleButtonLoginClick({ code })
272
+ if (logged) {
273
+ setWillVerifyOtpState(false)
274
+ } else {
275
+ setOtpError(t('OTP_CODE_INCORRECT', 'Otp code incorrect'))
276
+ }
256
277
  }
257
278
 
258
279
  const closeAlert = () => {
@@ -310,7 +331,7 @@ const LoginFormUI = (props: LoginParams) => {
310
331
  baseUrl: configs?.security_recaptcha_base_url?.value || null
311
332
  })
312
333
  showToast(ToastType.Info, t('TRY_AGAIN', 'Please try again'))
313
- Vibration.vibrate()
334
+ vibrateApp()
314
335
  return
315
336
  }
316
337
  formState.result?.result &&
@@ -320,7 +341,7 @@ const LoginFormUI = (props: LoginParams) => {
320
341
  ? formState.result?.result
321
342
  : formState.result?.result[0],
322
343
  );
323
- formState.result?.result && Vibration.vibrate()
344
+ formState.result?.result && vibrateApp()
324
345
  }
325
346
  }, [formState]);
326
347
 
@@ -332,7 +353,7 @@ const LoginFormUI = (props: LoginParams) => {
332
353
  ? verifyPhoneState?.result?.result
333
354
  : verifyPhoneState?.result?.result[0];
334
355
  verifyPhoneState.result?.result && showToast(ToastType.Error, message);
335
- verifyPhoneState.result?.result && Vibration.vibrate();
356
+ verifyPhoneState.result?.result && vibrateApp();
336
357
  setIsLoadingVerifyModal(false);
337
358
  return;
338
359
  }
@@ -373,21 +394,24 @@ const LoginFormUI = (props: LoginParams) => {
373
394
  }, [checkPhoneCodeState])
374
395
 
375
396
  useEffect(() => {
376
- if (!!Object.values(errors)?.length) Vibration.vibrate()
397
+ if (!!Object.values(errors)?.length) vibrateApp()
377
398
  }, [errors])
378
399
 
379
400
  return (
380
401
  <Container>
381
- <NavBar
382
- title={t('LOGIN', 'Login')}
383
- titleAlign={'center'}
384
- onActionLeft={() => navigation?.canGoBack() && navigation.goBack()}
385
- showCall={false}
386
- btnStyle={{ paddingLeft: 0 }}
387
- style={{ flexDirection: 'column', alignItems: 'flex-start' }}
388
- titleWrapStyle={{ paddingHorizontal: 0 }}
389
- titleStyle={{ marginRight: 0, marginLeft: 0 }}
390
- />
402
+ {isGuest ? (
403
+ <OText style={{ textAlign: 'center', marginBottom: 10 }} size={18}>{t('LOGIN', 'Login')}</OText>
404
+ ) : (
405
+ <NavBar
406
+ title={t('LOGIN', 'Login')}
407
+ titleAlign={'center'}
408
+ onActionLeft={() => navigation?.canGoBack() && navigation.goBack()}
409
+ showCall={false}
410
+ btnStyle={{ paddingLeft: 0 }}
411
+ titleWrapStyle={{ paddingHorizontal: 0 }}
412
+ titleStyle={{ marginRight: 0, marginLeft: 0 }}
413
+ />
414
+ )}
391
415
  <FormSide>
392
416
  {(Number(useLoginByEmail) + Number(useLoginByCellphone) + Number(useLoginOtpEmail) + Number(useLoginOtpCellphone) > 1) && (
393
417
  <LoginWith>
@@ -734,7 +758,7 @@ const LoginFormUI = (props: LoginParams) => {
734
758
  {configs && Object.keys(configs).length > 0 ? (
735
759
  (((configs?.facebook_login?.value === 'true' || configs?.facebook_login?.value === '1') && configs?.facebook_id?.value && facebookLoginEnabled) ||
736
760
  ((configs?.google_login_client_id?.value !== '' && configs?.google_login_client_id?.value !== null) && googleLoginEnabled) ||
737
- ((configs?.apple_login_client_id?.value !== '' && configs?.apple_login_client_id?.value !== null) && appleLoginEnabled)) &&
761
+ ((configs?.apple_login_client_id?.value !== '' && configs?.apple_login_client_id?.value !== null) && appleLoginEnabled)) && !isGuest &&
738
762
  (
739
763
  <>
740
764
  <View
@@ -762,7 +786,7 @@ const LoginFormUI = (props: LoginParams) => {
762
786
  facebookLoginEnabled && (
763
787
  <FacebookLogin
764
788
  notificationState={notificationState}
765
- handleErrors={(err: any) => { showToast(ToastType.Error, err), Vibration.vibrate() }}
789
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), vibrateApp() }}
766
790
  handleLoading={(val: boolean) => setIsFBLoading(val)}
767
791
  handleSuccessFacebookLogin={handleSuccessFacebook}
768
792
  />
@@ -771,7 +795,7 @@ const LoginFormUI = (props: LoginParams) => {
771
795
  <GoogleLogin
772
796
  notificationState={notificationState}
773
797
  webClientId={configs?.google_login_client_id?.value}
774
- handleErrors={(err: any) => { showToast(ToastType.Error, err), Vibration.vibrate() }}
798
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), vibrateApp() }}
775
799
  handleLoading={(val: boolean) => setIsFBLoading(val)}
776
800
  handleSuccessGoogleLogin={handleSuccessFacebook}
777
801
  />
@@ -779,7 +803,7 @@ const LoginFormUI = (props: LoginParams) => {
779
803
  {(configs?.apple_login_client_id?.value !== '' && configs?.google_login_client_id?.value !== null) && appleLoginEnabled && (
780
804
  <AppleLogin
781
805
  notificationState={notificationState}
782
- handleErrors={(err: any) => { showToast(ToastType.Error, err), Vibration.vibrate() }}
806
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), vibrateApp() }}
783
807
  handleLoading={(val: boolean) => setIsFBLoading(val)}
784
808
  handleSuccessAppleLogin={handleSuccessFacebook}
785
809
  />
@@ -825,20 +849,21 @@ const LoginFormUI = (props: LoginParams) => {
825
849
  onClose={() => setIsModalVisible(false)}
826
850
  />
827
851
  </OModal>
828
- <OModal
829
- open={willVerifyOtpState}
830
- onClose={() => setWillVerifyOtpState(false)}
831
- entireModal
832
- title={t('ENTER_VERIFICATION_CODE', 'Enter verification code')}
852
+ <Modal
853
+ visible={willVerifyOtpState}
854
+ onDismiss={() => setWillVerifyOtpState(false)}
855
+ animationType='slide'
833
856
  >
834
857
  <Otp
835
858
  willVerifyOtpState={willVerifyOtpState}
859
+ otpError={otpError}
860
+ setOtpError={setOtpError}
836
861
  setWillVerifyOtpState={setWillVerifyOtpState}
837
862
  handleLoginOtp={handleLoginOtp}
838
863
  onSubmit={onSubmit}
839
864
  setAlertState={setAlertState}
840
865
  />
841
- </OModal>
866
+ </Modal>
842
867
  <Alert
843
868
  open={alertState.open}
844
869
  content={alertState.content}
@@ -1,69 +1,103 @@
1
- import React, { useRef } from 'react'
1
+ import React, { useRef, useState } from 'react'
2
2
  import Lottie from 'lottie-react-native';
3
3
  import { TouchableOpacity, Easing, ViewStyle, Animated } from 'react-native';
4
4
  import IconAntDesign from 'react-native-vector-icons/AntDesign'
5
5
  import { useTheme } from 'styled-components';
6
6
 
7
7
  interface Props {
8
- initialValue: number,
9
- onClick: any,
10
- disableAnimation?: boolean
11
- toValue: number,
12
- style?: ViewStyle,
13
- duration?: number,
14
- type: 'favorite', // animation types
15
- isActive: boolean,
16
- animationType?: ((value : number) => number);
17
- useNativeDriver?: boolean,
18
- iconProps?: {color?: string, size?: number, style?: ViewStyle}
8
+ initialValue: number,
9
+ onClick: any,
10
+ disableAnimation?: boolean
11
+ toValue: number,
12
+ style?: ViewStyle,
13
+ duration?: number,
14
+ type: 'favorite', // animation types
15
+ isActive: boolean,
16
+ animationType?: ((value: number) => number);
17
+ useNativeDriver?: boolean,
18
+ iconProps?: { color?: string, size?: number, style?: ViewStyle }
19
19
  }
20
20
 
21
21
  export const LottieAnimation = (props: Props) => {
22
- const {
23
- initialValue,
24
- onClick,
25
- disableAnimation,
26
- toValue,
27
- style,
28
- duration,
29
- type,
30
- isActive,
31
- useNativeDriver,
32
- animationType,
33
- iconProps
34
- } = props
35
- const theme = useTheme()
36
- const animationProgress = useRef(new Animated.Value(initialValue))
37
- const favoriteArray = ['heart', 'hearto']
38
- const icon = type === 'favorite' ? favoriteArray : []
39
- const animationGif = type === 'favorite' ? theme.images?.general?.heart : ''
40
- const onPressLottie = () => {
41
- if (!disableAnimation) {
42
- Animated.timing(animationProgress.current, {
43
- toValue,
44
- duration: duration || 5000,
45
- easing: animationType || Easing.linear,
46
- useNativeDriver: useNativeDriver ?? true
47
- }).start();
48
- }
49
- onClick()
22
+ const {
23
+ initialValue,
24
+ onClick,
25
+ disableAnimation,
26
+ toValue,
27
+ style,
28
+ duration,
29
+ type,
30
+ isActive,
31
+ useNativeDriver,
32
+ animationType,
33
+ iconProps
34
+ } = props
35
+
36
+ const theme = useTheme()
37
+ const animationProgress = useRef(new Animated.Value(initialValue))
38
+ const favRef = useRef<Lottie>(null)
39
+ const [isHide, setIsHide] = useState(true)
40
+
41
+ const favoriteArray = ['heart', 'hearto']
42
+ const icon = type === 'favorite' ? favoriteArray : []
43
+ const animationGif = type === 'favorite' ? theme.images?.general?.heart : ''
44
+
45
+ const onPressLottie = () => {
46
+ if (!disableAnimation) {
47
+ if (type === 'favorite') {
48
+ favRef.current?.play()
49
+ } else {
50
+ setIsHide(false)
51
+ Animated.timing(animationProgress.current, {
52
+ toValue,
53
+ duration: duration || 5000,
54
+ easing: animationType || Easing.linear,
55
+ useNativeDriver: useNativeDriver ?? true
56
+ }).start();
57
+ hideLottie()
58
+ }
50
59
  }
60
+ onClick()
61
+ }
51
62
 
52
- return (
53
- <TouchableOpacity
54
- onPress={onPressLottie}
55
- style={style}
56
- >
63
+ const hideLottie = () => {
64
+ setTimeout(() => setIsHide(true), 4500)
65
+ }
66
+
67
+ return (
68
+ <TouchableOpacity
69
+ onPress={onPressLottie}
70
+ style={style}
71
+ >
72
+ {type === 'favorite' ? (
73
+ // <Lottie
74
+ // ref={favRef}
75
+ // progress={initialValue}
76
+ // style={{ width: 20, height: 20 }}
77
+ // source={animationGif}
78
+ // />
79
+ <IconAntDesign
80
+ name={isActive ? icon[0] : icon[1]}
81
+ color={iconProps?.color || theme.colors.danger5}
82
+ size={iconProps?.size || 16}
83
+ style={iconProps?.style}
84
+ />
85
+ ) : (
86
+ <>
87
+ {!isHide &&
57
88
  <Lottie
58
- progress={animationProgress.current}
59
- source={animationGif}
60
- />
61
- <IconAntDesign
62
- name={isActive ? icon[0] : icon[1]}
63
- color={iconProps?.color || theme.colors.danger5}
64
- size={iconProps?.size || 16}
65
- style={iconProps?.style}
89
+ progress={animationProgress.current}
90
+ source={animationGif}
66
91
  />
67
- </TouchableOpacity>
68
- )
92
+ }
93
+ <IconAntDesign
94
+ name={isActive ? icon[0] : icon[1]}
95
+ color={iconProps?.color || theme.colors.danger5}
96
+ size={iconProps?.size || 16}
97
+ style={iconProps?.style}
98
+ />
99
+ </>
100
+ )}
101
+ </TouchableOpacity>
102
+ )
69
103
  }
@@ -16,11 +16,12 @@ import {
16
16
  PlaceholderLine,
17
17
  Fade
18
18
  } from "rn-placeholder";
19
- import { View, BackHandler } from 'react-native'
19
+ import { View, BackHandler, Platform } from 'react-native'
20
20
  import {
21
21
  MessageListingWrapper,
22
22
  MessageContainer
23
23
  } from './styles';
24
+ import { getOrderStatus } from '../../utils'
24
25
 
25
26
  const OrdersOptionUI = (props: OrdersOptionParams) => {
26
27
  const {
@@ -51,40 +52,6 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
51
52
  : theme.images.general.emptyPastOrders
52
53
  const orders = customArray || values || []
53
54
 
54
- const getOrderStatus = (s: string) => {
55
- const status = parseInt(s)
56
- const orderStatus = [
57
- { key: 0, value: t('PENDING', 'Pending') },
58
- { key: 1, value: t('COMPLETED', 'Completed') },
59
- { key: 2, value: t('REJECTED', 'Rejected') },
60
- { key: 3, value: t('DRIVER_IN_BUSINESS', 'Driver in business') },
61
- { key: 4, value: t('PREPARATION_COMPLETED', 'Preparation Completed') },
62
- { key: 5, value: t('REJECTED_BY_BUSINESS', 'Rejected by business') },
63
- { key: 6, value: t('REJECTED_BY_DRIVER', 'Rejected by Driver') },
64
- { key: 7, value: t('ACCEPTED_BY_BUSINESS', 'Accepted by business') },
65
- { key: 8, value: t('ACCEPTED_BY_DRIVER', 'Accepted by driver') },
66
- { key: 9, value: t('PICK_UP_COMPLETED_BY_DRIVER', 'Pick up completed by driver') },
67
- { key: 10, value: t('PICK_UP_FAILED_BY_DRIVER', 'Pick up Failed by driver') },
68
- { key: 11, value: t('DELIVERY_COMPLETED_BY_DRIVER', 'Delivery completed by driver') },
69
- { key: 12, value: t('DELIVERY_FAILED_BY_DRIVER', 'Delivery Failed by driver') },
70
- { key: 13, value: t('PREORDER', 'PreOrder') },
71
- { key: 14, value: t('ORDER_NOT_READY', 'Order not ready') },
72
- { key: 15, value: t('ORDER_PICKEDUP_COMPLETED_BY_CUSTOMER', 'Order picked up completed by customer') },
73
- { key: 16, value: t('CANCELLED_BY_CUSTOMER', 'Cancelled by customer') },
74
- { key: 17, value: t('ORDER_NOT_PICKEDUP_BY_CUSTOMER', 'Order not picked up by customer') },
75
- { key: 18, value: t('DRIVER_ALMOST_ARRIVED_TO_BUSINESS', 'Driver almost arrived to business') },
76
- { key: 19, value: t('DRIVER_ALMOST_ARRIVED_TO_CUSTOMER', 'Driver almost arrived to customer') },
77
- { key: 20, value: t('ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS', 'Customer almost arrived to business') },
78
- { key: 21, value: t('ORDER_CUSTOMER_ARRIVED_BUSINESS', 'Customer arrived to business') },
79
- { key: 22, value: t('ORDER_LOOKING_FOR_DRIVER', 'Looking for driver') },
80
- { key: 23, value: t('ORDER_DRIVER_ON_WAY', 'Driver on way') }
81
- ]
82
-
83
- const objectStatus = orderStatus.find((o) => o.key === status)
84
-
85
- return objectStatus && objectStatus
86
- }
87
-
88
55
  const handleClickOrder = (uuid: string) => {
89
56
  setSelectedOrderId(uuid)
90
57
  setOpenMessges(true)
@@ -102,7 +69,7 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
102
69
  }, [orderList, loading])
103
70
 
104
71
  useEffect(() => {
105
- if(refreshOrders){
72
+ if (refreshOrders) {
106
73
  loadOrders(false, false, false, true)
107
74
  setRefreshOrders && setRefreshOrders(false)
108
75
  }
@@ -156,7 +123,9 @@ const OrderMessageUI = (props: any) => {
156
123
  setMessages,
157
124
  readMessages,
158
125
  messagesReadList,
159
- setOpenMessges
126
+ setOpenMessges,
127
+ setSeletedOrder,
128
+ setSelectedOrderId
160
129
  } = props;
161
130
  const [openModalForBusiness, setOpenModalForBusiness] = useState(false);
162
131
  const [openModalForDriver, setOpenModalForDriver] = useState(false);
@@ -173,6 +142,8 @@ const OrderMessageUI = (props: any) => {
173
142
 
174
143
  const handleClose = () => {
175
144
  setOpenMessges(false)
145
+ setSeletedOrder(null)
146
+ setSelectedOrderId(null)
176
147
  }
177
148
 
178
149
  const handleOpenMessages = (data: any) => {
@@ -225,7 +196,7 @@ const OrderMessageUI = (props: any) => {
225
196
  }
226
197
 
227
198
  export const OrderListing = (props: OrdersOptionParams) => {
228
- const [businessState] = useBusiness();
199
+ const [businessState] = useBusiness();
229
200
  const OrderListingProps = {
230
201
  ...props,
231
202
  UIComponent: OrdersOptionUI,
@@ -236,7 +207,7 @@ export const OrderListing = (props: OrdersOptionParams) => {
236
207
  pageSize: 10,
237
208
  controlType: 'infinity'
238
209
  },
239
- businessId: businessState?.business?.id,
210
+ businessId: businessState?.business?.id,
240
211
  profileMessages: true,
241
212
  orderBy: 'last_direct_message_at',
242
213
  orderDirection: 'asc'
@@ -292,7 +263,7 @@ export const MessageListing = (props: MessageListingParams) => {
292
263
  titleAlign={'center'}
293
264
  onActionLeft={goToBack}
294
265
  showCall={false}
295
- paddingTop={10}
266
+ paddingTop={Platform.OS === 'ios' ? 20 : 10}
296
267
  btnStyle={{ paddingLeft: 0 }}
297
268
  />
298
269
  <OrderListing
@@ -300,9 +271,9 @@ export const MessageListing = (props: MessageListingParams) => {
300
271
  setSelectedOrderId={setSelectedOrderId}
301
272
  setOrderList={setOrderListStatus}
302
273
  setOpenMessges={setOpenMessges}
303
- franchiseId={props.franchiseId}
274
+ franchiseId={props.franchiseId}
304
275
  />
305
- {openMessages && seletedOrder && (
276
+ {openMessages && !!seletedOrder?.id && (
306
277
  <OModal
307
278
  open={openMessages}
308
279
  entireModal
@@ -311,7 +282,10 @@ export const MessageListing = (props: MessageListingParams) => {
311
282
  >
312
283
  <MessagesView
313
284
  order={seletedOrder}
285
+ orderId={seletedOrder?.id}
314
286
  setOpenMessges={setOpenMessges}
287
+ setSeletedOrder={setSeletedOrder}
288
+ setSelectedOrderId={setSelectedOrderId}
315
289
  />
316
290
  </OModal>
317
291
  )}
@@ -1,4 +1,5 @@
1
1
  import React, { useEffect, useState } from 'react'
2
+ import Clipboard from '@react-native-clipboard/clipboard';
2
3
  import { Messages as MessagesController, useSession, useUtils, useLanguage, ToastType, useToast } from 'ordering-components/native'
3
4
  import { useTheme } from 'styled-components/native';
4
5
  import { launchImageLibrary } from 'react-native-image-picker'
@@ -12,6 +13,7 @@ import { Header, TitleHeader, Wrapper, QuickMessageContainer, ProfileMessageHead
12
13
  import { MessagesParams } from '../../types'
13
14
  import { useWindowDimensions } from 'react-native'
14
15
  import { useSafeAreaInsets } from 'react-native-safe-area-context'
16
+ import { getLogisticTag } from '../../utils'
15
17
 
16
18
  const ORDER_STATUS: any = {
17
19
  0: 'ORDER_STATUS_PENDING',
@@ -126,7 +128,7 @@ const MessagesUI = (props: MessagesParams) => {
126
128
  ?
127
129
  `${t('ORDER', 'Order')} ${t(message.change.attribute.toUpperCase(), message.change.attribute.replace('_', ' '))} ${t('CHANGED_FROM', 'Changed from')} ${filterSpecialStatus.includes(message.change.attribute) ?
128
130
  `${message.change.old === null ? '0' : message.change.old} ${t('TO', 'to')} ${message.change.new} ${t('MINUTES', 'Minutes')}` :
129
- `${message.change.old !== null && t(ORDER_STATUS[parseInt(message.change.old, 10)])} ${t('TO', 'to')} ${t(ORDER_STATUS[parseInt(message.change.new, 10)])}`
131
+ `${message.change?.attribute !== 'logistic_status' ? message.change.old !== null && t(ORDER_STATUS[parseInt(message.change.old, 10)]) : message.change.old !== null && getLogisticTag(message.change.old)} ${t('TO', 'to')} ${message.change?.attribute !== 'logistic_status' ? t(ORDER_STATUS[parseInt(message.change.new, 10)]) : getLogisticTag(message.change.new)}`
130
132
  }`
131
133
  : message.change.new
132
134
  ?
@@ -141,7 +143,7 @@ const MessagesUI = (props: MessagesParams) => {
141
143
  const firstMessage = {
142
144
  _id: 0,
143
145
  text: _console,
144
- createdAt: order?.created_at,
146
+ createdAt: parseDate(order?.created_at, { outputFormat: 'YYYY-MM-DD HH:mm:ss' }),
145
147
  system: true
146
148
  }
147
149
  const newMessage: any = [];
@@ -150,13 +152,13 @@ const MessagesUI = (props: MessagesParams) => {
150
152
  newMessage.push({
151
153
  _id: message?.id,
152
154
  text: message.type === 1 ? messageConsole(message) : message.comment,
153
- createdAt: message.type !== 0 && message.created_at,
155
+ createdAt: message.type !== 0 && parseDate(message?.created_at, { outputFormat: 'YYYY-MM-DD HH:mm:ss' }),
154
156
  image: message.source,
155
157
  system: message.type === 1,
156
158
  user: {
157
- _id: message.author.id,
158
- name: message.author.name,
159
- avatar: message.author.id !== user.id && type === USER_TYPE.DRIVER ? order?.driver?.photo : order?.business?.logo
159
+ _id: message.author && message.author.id,
160
+ name: message.author && message.author.name,
161
+ avatar: message.author && (message.author.id !== user.id && type === USER_TYPE.DRIVER ? order?.driver?.photo : order?.business?.logo)
160
162
  }
161
163
  });
162
164
  }
@@ -165,13 +167,13 @@ const MessagesUI = (props: MessagesParams) => {
165
167
  newMessage.push({
166
168
  _id: message?.id,
167
169
  text: message.type === 1 ? messageConsole(message) : message.comment,
168
- createdAt: message.type !== 0 && message.created_at,
170
+ createdAt: message.type !== 0 && parseDate(message?.created_at, { outputFormat: 'YYYY-MM-DD HH:mm:ss' }),
169
171
  image: message.source,
170
172
  system: message.type === 1,
171
173
  user: {
172
- _id: message.author.id,
173
- name: message.author.name,
174
- avatar: message.author.id !== user.id && type === USER_TYPE.DRIVER ? order?.driver?.photo : order?.business?.logo
174
+ _id: message.author && message.author.id,
175
+ name: message.author && message.author.name,
176
+ avatar: message.author && (message.author.id !== user.id && type === USER_TYPE.DRIVER ? order?.driver?.photo : order?.business?.logo)
175
177
  }
176
178
  });
177
179
  }
@@ -240,6 +242,7 @@ const MessagesUI = (props: MessagesParams) => {
240
242
 
241
243
  const renderAccessory = () => {
242
244
  return (
245
+ !chatDisabled &&
243
246
  <QuickMessageContainer
244
247
  style={{
245
248
  marginLeft: 10,
@@ -397,6 +400,24 @@ const MessagesUI = (props: MessagesParams) => {
397
400
  }
398
401
  }
399
402
 
403
+ const onLongPress = (context: any, message: any) => {
404
+ const options = [
405
+ t('COPY_TEXT', 'Copy text'),
406
+ t('CANCEL', 'Cancel'),
407
+ ];
408
+ const cancelButtonIndex = options.length - 1;
409
+ context.actionSheet().showActionSheetWithOptions({
410
+ options,
411
+ cancelButtonIndex
412
+ }, (buttonIndex: any) => buttonIndex === 0 && Clipboard.setString(message.text)
413
+ );
414
+ }
415
+
416
+ useEffect(() => {
417
+ if (!order?.id || messages?.loading) return
418
+ readMessages && readMessages()
419
+ }, [order?.id, messages?.loading])
420
+
400
421
  return (
401
422
  <View style={{ height: getViewHeight(), width: '100%', paddingTop: 12, backgroundColor: 'white' }}>
402
423
  <Wrapper>
@@ -473,6 +494,7 @@ const MessagesUI = (props: MessagesParams) => {
473
494
  onSend={onSubmit}
474
495
  onInputTextChanged={onChangeMessage}
475
496
  alignTop
497
+ onLongPress={(context: any, message: any) => onLongPress(context, message)}
476
498
  scrollToBottom
477
499
  renderAvatarOnTop
478
500
  renderUsernameOnMessage