ordering-ui-react-native 0.17.30 → 0.17.31-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 +119 -120
  6. package/src/components/StripeMethodForm/index.tsx +108 -79
  7. package/src/components/VerifyPhone/styles.tsx +1 -2
  8. package/src/components/shared/OToast.tsx +4 -4
  9. package/src/types/index.tsx +5 -0
  10. package/src/utils/index.tsx +7 -1
  11. package/themes/business/index.tsx +2 -0
  12. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +265 -240
  13. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -4
  14. package/themes/business/src/components/BusinessController/index.tsx +0 -1
  15. package/themes/business/src/components/Chat/index.tsx +118 -107
  16. package/themes/business/src/components/DriverMap/index.tsx +17 -6
  17. package/themes/business/src/components/GoogleMap/index.tsx +58 -57
  18. package/themes/business/src/components/LoginForm/Otp/index.tsx +120 -0
  19. package/themes/business/src/components/LoginForm/Otp/styles.tsx +7 -0
  20. package/themes/business/src/components/LoginForm/index.tsx +238 -80
  21. package/themes/business/src/components/LoginForm/styles.tsx +10 -0
  22. package/themes/business/src/components/MapView/index.tsx +10 -10
  23. package/themes/business/src/components/NewOrderNotification/index.tsx +43 -50
  24. package/themes/business/src/components/OrderDetails/Delivery.tsx +4 -3
  25. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +90 -47
  26. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +59 -62
  27. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +195 -0
  28. package/themes/business/src/components/OrderDetailsLogistic/styles.tsx +5 -0
  29. package/themes/business/src/components/OrderMessage/index.tsx +18 -17
  30. package/themes/business/src/components/OrderSummary/index.tsx +113 -121
  31. package/themes/business/src/components/OrdersOption/index.tsx +32 -75
  32. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +250 -0
  33. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +115 -0
  34. package/themes/business/src/components/PreviousOrders/index.tsx +445 -243
  35. package/themes/business/src/components/PreviousOrders/styles.tsx +31 -3
  36. package/themes/business/src/components/ProductItemAccordion/index.tsx +27 -3
  37. package/themes/business/src/components/ReviewCustomer/index.tsx +41 -24
  38. package/themes/business/src/components/StoresList/index.tsx +2 -2
  39. package/themes/business/src/components/shared/OLink.tsx +33 -13
  40. package/themes/business/src/components/shared/OModal.tsx +16 -9
  41. package/themes/business/src/components/shared/OText.tsx +8 -2
  42. package/themes/business/src/types/index.tsx +32 -2
  43. package/themes/business/src/utils/index.tsx +44 -1
  44. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  45. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  46. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  47. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -1
  48. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  49. package/themes/kiosk/src/components/LoginForm/Otp/index.tsx +92 -0
  50. package/themes/kiosk/src/components/LoginForm/Otp/styles.tsx +7 -0
  51. package/themes/kiosk/src/components/LoginForm/index.tsx +473 -151
  52. package/themes/kiosk/src/components/LoginForm/styles.tsx +14 -1
  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 +3 -2
  57. package/themes/kiosk/src/components/PhoneInputNumber/styles.tsx +1 -3
  58. package/themes/kiosk/src/components/ProductForm/index.tsx +1 -14
  59. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  60. package/themes/kiosk/src/components/shared/OModal.tsx +14 -11
  61. package/themes/kiosk/src/layouts/Container.tsx +7 -1
  62. package/themes/kiosk/src/types/index.d.ts +13 -0
  63. package/themes/kiosk/src/utils/index.tsx +15 -0
  64. package/themes/original/index.tsx +6 -0
  65. package/themes/original/src/components/AddressDetails/index.tsx +29 -11
  66. package/themes/original/src/components/AddressForm/index.tsx +85 -49
  67. package/themes/original/src/components/AddressList/index.tsx +26 -21
  68. package/themes/original/src/components/AddressList/styles.tsx +4 -2
  69. package/themes/original/src/components/AnalyticsSegment/index.tsx +193 -10
  70. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  71. package/themes/original/src/components/BusinessBasicInformation/index.tsx +159 -90
  72. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +9 -7
  73. package/themes/original/src/components/BusinessController/index.tsx +154 -68
  74. package/themes/original/src/components/BusinessController/styles.tsx +22 -9
  75. package/themes/original/src/components/BusinessFeaturedController/index.tsx +21 -54
  76. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +8 -0
  77. package/themes/original/src/components/BusinessInformation/index.tsx +10 -31
  78. package/themes/original/src/components/BusinessItemAccordion/index.tsx +23 -22
  79. package/themes/original/src/components/BusinessListingSearch/index.tsx +350 -323
  80. package/themes/original/src/components/BusinessPreorder/index.tsx +97 -16
  81. package/themes/original/src/components/BusinessProductsList/index.tsx +20 -11
  82. package/themes/original/src/components/BusinessProductsList/styles.tsx +8 -3
  83. package/themes/original/src/components/BusinessProductsListing/UpsellingRedirect.tsx +1 -1
  84. package/themes/original/src/components/BusinessProductsListing/index.tsx +684 -524
  85. package/themes/original/src/components/BusinessProductsListing/styles.tsx +7 -9
  86. package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
  87. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +1 -1
  88. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +105 -78
  89. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -9
  90. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  91. package/themes/original/src/components/Cart/index.tsx +102 -69
  92. package/themes/original/src/components/CartContent/index.tsx +115 -19
  93. package/themes/original/src/components/CartContent/styles.tsx +15 -1
  94. package/themes/original/src/components/Checkout/index.tsx +331 -177
  95. package/themes/original/src/components/Checkout/styles.tsx +4 -2
  96. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  97. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  98. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  99. package/themes/original/src/components/DriverTips/index.tsx +52 -34
  100. package/themes/original/src/components/Favorite/index.tsx +7 -4
  101. package/themes/original/src/components/Favorite/styles.tsx +1 -1
  102. package/themes/original/src/components/FavoriteList/index.tsx +51 -80
  103. package/themes/original/src/components/FloatingButton/index.tsx +1 -2
  104. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  105. package/themes/original/src/components/GPSButton/index.tsx +6 -4
  106. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  107. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +96 -0
  108. package/themes/original/src/components/GiftCard/GiftCardUI/styles.tsx +5 -0
  109. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +100 -0
  110. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +8 -0
  111. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +191 -0
  112. package/themes/original/src/components/GiftCard/RedeemGiftCard/styles.tsx +8 -0
  113. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +165 -0
  114. package/themes/original/src/components/GiftCard/SendGiftCard/styles.tsx +9 -0
  115. package/themes/original/src/components/GoogleMap/index.tsx +15 -4
  116. package/themes/original/src/components/Help/index.tsx +8 -8
  117. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +11 -22
  118. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +6 -0
  119. package/themes/original/src/components/HelpGuide/index.tsx +12 -16
  120. package/themes/original/src/components/HelpGuide/styles.tsx +6 -0
  121. package/themes/original/src/components/HelpOrder/index.tsx +12 -25
  122. package/themes/original/src/components/HelpOrder/styles.tsx +8 -1
  123. package/themes/original/src/components/Home/index.tsx +13 -4
  124. package/themes/original/src/components/LastOrder/index.tsx +1 -34
  125. package/themes/original/src/components/LoginForm/Otp/index.tsx +89 -73
  126. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  127. package/themes/original/src/components/LoginForm/index.tsx +67 -22
  128. package/themes/original/src/components/LottieAnimation/index.tsx +78 -0
  129. package/themes/original/src/components/MessageListing/index.tsx +16 -42
  130. package/themes/original/src/components/Messages/index.tsx +32 -10
  131. package/themes/original/src/components/MomentOption/index.tsx +195 -88
  132. package/themes/original/src/components/MultiCart/index.tsx +50 -0
  133. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +197 -116
  134. package/themes/original/src/components/MultiCheckout/index.tsx +298 -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 +55 -51
  140. package/themes/original/src/components/NavBar/index.tsx +21 -21
  141. package/themes/original/src/components/Notifications/index.tsx +46 -50
  142. package/themes/original/src/components/Notifications/styles.tsx +6 -3
  143. package/themes/original/src/components/OrderDetails/OrderEta.tsx +76 -0
  144. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +15 -3
  145. package/themes/original/src/components/OrderDetails/index.tsx +199 -359
  146. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  147. package/themes/original/src/components/OrderItAgain/index.tsx +3 -1
  148. package/themes/original/src/components/OrderProgress/index.tsx +74 -112
  149. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  150. package/themes/original/src/components/OrderSummary/index.tsx +87 -59
  151. package/themes/original/src/components/OrderTypeSelector/index.tsx +2 -1
  152. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +24 -19
  153. package/themes/original/src/components/OrdersOption/index.tsx +63 -56
  154. package/themes/original/src/components/PageBanner/index.tsx +171 -0
  155. package/themes/original/src/components/PageBanner/styles.tsx +11 -0
  156. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +1 -1
  157. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  158. package/themes/original/src/components/PaymentOptions/index.tsx +34 -6
  159. package/themes/original/src/components/PhoneInputNumber/index.tsx +3 -3
  160. package/themes/original/src/components/PlaceSpot/index.tsx +12 -6
  161. package/themes/original/src/components/ProductForm/index.tsx +225 -234
  162. package/themes/original/src/components/ProductForm/styles.tsx +5 -8
  163. package/themes/original/src/components/ProductItemAccordion/index.tsx +59 -29
  164. package/themes/original/src/components/ProductOptionSubOption/index.tsx +19 -11
  165. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +1 -2
  166. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  167. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -50
  168. package/themes/original/src/components/ProfessionalProfile/index.tsx +36 -7
  169. package/themes/original/src/components/Promotions/index.tsx +234 -220
  170. package/themes/original/src/components/Promotions/styles.tsx +10 -3
  171. package/themes/original/src/components/ReviewDriver/index.tsx +3 -3
  172. package/themes/original/src/components/ReviewOrder/index.tsx +26 -9
  173. package/themes/original/src/components/ReviewOrder/styles.tsx +7 -0
  174. package/themes/original/src/components/ReviewProducts/index.tsx +23 -11
  175. package/themes/original/src/components/ReviewTrigger/index.tsx +27 -9
  176. package/themes/original/src/components/ReviewTrigger/styles.tsx +8 -1
  177. package/themes/original/src/components/ScheduleAccordion/index.tsx +68 -0
  178. package/themes/original/src/components/ScheduleAccordion/styles.tsx +14 -0
  179. package/themes/original/src/components/ServiceForm/index.tsx +74 -19
  180. package/themes/original/src/components/Sessions/index.tsx +11 -8
  181. package/themes/original/src/components/Sessions/styles.tsx +5 -0
  182. package/themes/original/src/components/SignupForm/index.tsx +42 -19
  183. package/themes/original/src/components/SingleOrderCard/index.tsx +156 -64
  184. package/themes/original/src/components/SingleOrderCard/styles.tsx +11 -9
  185. package/themes/original/src/components/SingleProductCard/index.tsx +99 -55
  186. package/themes/original/src/components/SingleProductCard/styles.tsx +23 -13
  187. package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
  188. package/themes/original/src/components/StripeCardsList/index.tsx +9 -2
  189. package/themes/original/src/components/StripeElementsForm/index.tsx +28 -15
  190. package/themes/original/src/components/UpsellingProducts/index.tsx +238 -224
  191. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  192. package/themes/original/src/components/UserDetails/index.tsx +8 -4
  193. package/themes/original/src/components/UserFormDetails/index.tsx +47 -7
  194. package/themes/original/src/components/UserProfile/index.tsx +9 -14
  195. package/themes/original/src/components/UserProfileForm/index.tsx +25 -28
  196. package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
  197. package/themes/original/src/components/WalletTransactionItem/index.tsx +2 -2
  198. package/themes/original/src/components/WalletTransactions/index.tsx +3 -3
  199. package/themes/original/src/components/Wallets/index.tsx +79 -36
  200. package/themes/original/src/components/Wallets/styles.tsx +5 -4
  201. package/themes/original/src/components/shared/CardAnimation.tsx +47 -0
  202. package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
  203. package/themes/original/src/components/shared/OBottomPopup.tsx +1 -1
  204. package/themes/original/src/components/shared/OButton.tsx +6 -2
  205. package/themes/original/src/components/shared/OIcon.tsx +8 -1
  206. package/themes/original/src/components/shared/OInput.tsx +16 -2
  207. package/themes/original/src/components/shared/OModal.tsx +3 -3
  208. package/themes/original/src/layouts/Container.tsx +13 -9
  209. package/themes/original/src/types/index.tsx +35 -9
  210. package/themes/original/src/utils/index.tsx +364 -58
  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 } from 'react-native';
2
+ import { StyleSheet, View, Keyboard, Vibration } 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,
@@ -72,6 +73,7 @@ const LoginFormUI = (props: LoginParams) => {
72
73
  generateOtpCode,
73
74
  useLoginOtpEmail,
74
75
  useLoginOtpCellphone,
76
+ isGuest
75
77
  } = props;
76
78
 
77
79
  const [, { showToast }] = useToast();
@@ -96,7 +98,7 @@ const LoginFormUI = (props: LoginParams) => {
96
98
  const [alertState, setAlertState] = useState({ open: false, title: '', content: [] })
97
99
  const [tabLayouts, setTabLayouts] = useState<any>({})
98
100
  const tabsRef = useRef<any>(null)
99
-
101
+ const enabledPoweredByOrdering = configs?.powered_by_ordering_module?.value
100
102
  const theme = useTheme();
101
103
  const isOtpEmail = loginTab === 'otp' && otpType === 'email'
102
104
  const isOtpCellphone = loginTab === 'otp' && otpType === 'cellphone'
@@ -160,11 +162,24 @@ const LoginFormUI = (props: LoginParams) => {
160
162
  handleCategoryScroll(otpType ? `${val}_${otpType}` : val)
161
163
  };
162
164
 
165
+ const vibrateApp = (impact?: string) => {
166
+ const options = {
167
+ enableVibrateFallback: true,
168
+ ignoreAndroidSystemSettings: false
169
+ };
170
+ ReactNativeHapticFeedback.trigger(impact || "impactLight", options);
171
+ }
172
+
163
173
  const onSubmit = (values?: any) => {
164
174
  Keyboard.dismiss();
165
175
  if (loginTab === 'otp') {
166
176
  if (phoneInputData.error && (loginTab !== 'otp' || (otpType === 'cellphone' && loginTab === 'otp'))) {
167
177
  showToast(ToastType.Error, t('INVALID_PHONE_NUMBER', 'Invalid phone number'));
178
+ Vibration.vibrate()
179
+ return
180
+ }
181
+ if (!values?.cellphone && otpType === 'cellphone') {
182
+ showToast(ToastType.Error, t('PHONE_NUMBER_REQUIRED', 'Phone number is required'));
168
183
  return
169
184
  }
170
185
  if (loginTab === 'otp') {
@@ -177,6 +192,7 @@ const LoginFormUI = (props: LoginParams) => {
177
192
  } else {
178
193
  if (phoneInputData.error) {
179
194
  showToast(ToastType.Error, phoneInputData.error);
195
+ Vibration.vibrate()
180
196
  return;
181
197
  }
182
198
  handleButtonLoginClick({
@@ -189,6 +205,7 @@ const LoginFormUI = (props: LoginParams) => {
189
205
  const handleVerifyCodeClick = () => {
190
206
  if (phoneInputData.error) {
191
207
  showToast(ToastType.Error, phoneInputData.error);
208
+ Vibration.vibrate()
192
209
  return;
193
210
  }
194
211
  if (
@@ -203,6 +220,7 @@ const LoginFormUI = (props: LoginParams) => {
203
220
  'The field Mobile phone is required.',
204
221
  ),
205
222
  );
223
+ Vibration.vibrate()
206
224
  return;
207
225
  }
208
226
  handleSendVerifyCode && handleSendVerifyCode(phoneInputData.phone);
@@ -217,17 +235,19 @@ const LoginFormUI = (props: LoginParams) => {
217
235
  };
218
236
 
219
237
  const handleChangeInputEmail = (value: string, onChange: any) => {
220
- onChange(value.toLowerCase().replace(/[&,()%";:ç?<>{}\\[\]\s]/g, ''));
238
+ onChange(value.toLowerCase().trim().replace(/[&,()%";:ç?<>{}\\[\]\s]/g, ''));
221
239
  };
222
240
 
223
241
  const handleOpenRecaptcha = () => {
224
242
  setRecaptchaVerified(false)
225
243
  if (!recaptchaConfig?.siteKey) {
226
244
  showToast(ToastType.Error, t('NO_RECAPTCHA_SITE_KEY', 'The config doesn\'t have recaptcha site key'));
245
+ Vibration.vibrate()
227
246
  return
228
247
  }
229
248
  if (!recaptchaConfig?.baseUrl) {
230
249
  showToast(ToastType.Error, t('NO_RECAPTCHA_BASE_URL', 'The config doesn\'t have recaptcha base url'));
250
+ Vibration.vibrate()
231
251
  return
232
252
  }
233
253
 
@@ -244,9 +264,18 @@ const LoginFormUI = (props: LoginParams) => {
244
264
  setOtpType(type)
245
265
  }
246
266
 
247
- const handleLoginOtp = (code: string) => {
248
- handleButtonLoginClick({ code })
249
- setWillVerifyOtpState(false)
267
+ const handleLoginOtp = async (code: string) => {
268
+ if (!code) return
269
+ const logged = await handleButtonLoginClick({ code })
270
+ if (logged) {
271
+ setWillVerifyOtpState(false)
272
+ } else {
273
+ setAlertState({
274
+ open: true,
275
+ title: '',
276
+ content: t('OTP_CODE_INCORRECT', 'Otp code incorrect')
277
+ })
278
+ }
250
279
  }
251
280
 
252
281
  const closeAlert = () => {
@@ -304,6 +333,7 @@ const LoginFormUI = (props: LoginParams) => {
304
333
  baseUrl: configs?.security_recaptcha_base_url?.value || null
305
334
  })
306
335
  showToast(ToastType.Info, t('TRY_AGAIN', 'Please try again'))
336
+ Vibration.vibrate()
307
337
  return
308
338
  }
309
339
  formState.result?.result &&
@@ -313,6 +343,7 @@ const LoginFormUI = (props: LoginParams) => {
313
343
  ? formState.result?.result
314
344
  : formState.result?.result[0],
315
345
  );
346
+ formState.result?.result && Vibration.vibrate()
316
347
  }
317
348
  }, [formState]);
318
349
 
@@ -324,6 +355,7 @@ const LoginFormUI = (props: LoginParams) => {
324
355
  ? verifyPhoneState?.result?.result
325
356
  : verifyPhoneState?.result?.result[0];
326
357
  verifyPhoneState.result?.result && showToast(ToastType.Error, message);
358
+ verifyPhoneState.result?.result && Vibration.vibrate();
327
359
  setIsLoadingVerifyModal(false);
328
360
  return;
329
361
  }
@@ -363,18 +395,25 @@ const LoginFormUI = (props: LoginParams) => {
363
395
  }
364
396
  }, [checkPhoneCodeState])
365
397
 
398
+ useEffect(() => {
399
+ if (!!Object.values(errors)?.length) Vibration.vibrate()
400
+ }, [errors])
401
+
366
402
  return (
367
403
  <Container>
368
- <NavBar
369
- title={t('LOGIN', 'Login')}
370
- titleAlign={'center'}
371
- onActionLeft={() => navigation?.canGoBack() && navigation.goBack()}
372
- showCall={false}
373
- btnStyle={{ paddingLeft: 0 }}
374
- style={{ flexDirection: 'column', alignItems: 'flex-start' }}
375
- titleWrapStyle={{ paddingHorizontal: 0 }}
376
- titleStyle={{ marginRight: 0, marginLeft: 0 }}
377
- />
404
+ {isGuest ? (
405
+ <OText style={{ textAlign: 'center', marginBottom: 10 }} size={18}>{t('LOGIN', 'Login')}</OText>
406
+ ) : (
407
+ <NavBar
408
+ title={t('LOGIN', 'Login')}
409
+ titleAlign={'center'}
410
+ onActionLeft={() => navigation?.canGoBack() && navigation.goBack()}
411
+ showCall={false}
412
+ btnStyle={{ paddingLeft: 0 }}
413
+ titleWrapStyle={{ paddingHorizontal: 0 }}
414
+ titleStyle={{ marginRight: 0, marginLeft: 0 }}
415
+ />
416
+ )}
378
417
  <FormSide>
379
418
  {(Number(useLoginByEmail) + Number(useLoginByCellphone) + Number(useLoginOtpEmail) + Number(useLoginOtpCellphone) > 1) && (
380
419
  <LoginWith>
@@ -680,7 +719,7 @@ const LoginFormUI = (props: LoginParams) => {
680
719
  {t('NEW_ON_PLATFORM', 'New on Ordering?')}
681
720
  </OText>
682
721
  <TouchableOpacity onPress={() => onNavigationRedirect('Signup')}>
683
- <OText size={14} mLeft={5} color={theme.colors.skyBlue}>
722
+ <OText size={14} mLeft={5} color={theme.colors.primary}>
684
723
  {t('CREATE_ACCOUNT', 'Create account')}
685
724
  </OText>
686
725
  </TouchableOpacity>
@@ -720,8 +759,8 @@ const LoginFormUI = (props: LoginParams) => {
720
759
 
721
760
  {configs && Object.keys(configs).length > 0 ? (
722
761
  (((configs?.facebook_login?.value === 'true' || configs?.facebook_login?.value === '1') && configs?.facebook_id?.value && facebookLoginEnabled) ||
723
- ((configs?.google_login_client_id?.value !== '' && configs?.google_login_client_id?.value !== null) && googleLoginEnabled) ||
724
- ((configs?.apple_login_client_id?.value !== '' && configs?.apple_login_client_id?.value !== null) && appleLoginEnabled)) &&
762
+ ((configs?.google_login_client_id?.value !== '' && configs?.google_login_client_id?.value !== null) && googleLoginEnabled) ||
763
+ ((configs?.apple_login_client_id?.value !== '' && configs?.apple_login_client_id?.value !== null) && appleLoginEnabled)) && !isGuest &&
725
764
  (
726
765
  <>
727
766
  <View
@@ -749,7 +788,7 @@ const LoginFormUI = (props: LoginParams) => {
749
788
  facebookLoginEnabled && (
750
789
  <FacebookLogin
751
790
  notificationState={notificationState}
752
- handleErrors={(err: any) => showToast(ToastType.Error, err)}
791
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), Vibration.vibrate() }}
753
792
  handleLoading={(val: boolean) => setIsFBLoading(val)}
754
793
  handleSuccessFacebookLogin={handleSuccessFacebook}
755
794
  />
@@ -758,7 +797,7 @@ const LoginFormUI = (props: LoginParams) => {
758
797
  <GoogleLogin
759
798
  notificationState={notificationState}
760
799
  webClientId={configs?.google_login_client_id?.value}
761
- handleErrors={(err: any) => showToast(ToastType.Error, err)}
800
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), Vibration.vibrate() }}
762
801
  handleLoading={(val: boolean) => setIsFBLoading(val)}
763
802
  handleSuccessGoogleLogin={handleSuccessFacebook}
764
803
  />
@@ -766,7 +805,7 @@ const LoginFormUI = (props: LoginParams) => {
766
805
  {(configs?.apple_login_client_id?.value !== '' && configs?.google_login_client_id?.value !== null) && appleLoginEnabled && (
767
806
  <AppleLogin
768
807
  notificationState={notificationState}
769
- handleErrors={(err: any) => showToast(ToastType.Error, err)}
808
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), Vibration.vibrate() }}
770
809
  handleLoading={(val: boolean) => setIsFBLoading(val)}
771
810
  handleSuccessAppleLogin={handleSuccessFacebook}
772
811
  />
@@ -789,6 +828,12 @@ const LoginFormUI = (props: LoginParams) => {
789
828
  </Placeholder>
790
829
  </SkeletonWrapper>
791
830
  )}
831
+
832
+ {enabledPoweredByOrdering && (
833
+ <OText>
834
+ Powered By Ordering.co
835
+ </OText>
836
+ )}
792
837
  </FormSide>
793
838
  <OModal
794
839
  open={isModalVisible}
@@ -0,0 +1,78 @@
1
+ import React, { useRef, useState } from 'react'
2
+ import Lottie from 'lottie-react-native';
3
+ import { TouchableOpacity, Easing, ViewStyle, Animated } from 'react-native';
4
+ import IconAntDesign from 'react-native-vector-icons/AntDesign'
5
+ import { useTheme } from 'styled-components';
6
+
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 }
19
+ }
20
+
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 [isHide, setIsHide] = useState(true)
38
+ const favoriteArray = ['heart', 'hearto']
39
+ const icon = type === 'favorite' ? favoriteArray : []
40
+ const animationGif = type === 'favorite' ? theme.images?.general?.heart : ''
41
+ const onPressLottie = () => {
42
+ if (!disableAnimation) {
43
+ setIsHide(false)
44
+ Animated.timing(animationProgress.current, {
45
+ toValue,
46
+ duration: duration || 5000,
47
+ easing: animationType || Easing.linear,
48
+ useNativeDriver: useNativeDriver ?? true
49
+ }).start();
50
+ hideLottie()
51
+ }
52
+ onClick()
53
+ }
54
+
55
+ const hideLottie = () => {
56
+ setTimeout(() => setIsHide(true), 4500)
57
+ }
58
+
59
+ return (
60
+ <TouchableOpacity
61
+ onPress={onPressLottie}
62
+ style={style}
63
+ >
64
+ {!isHide &&
65
+ <Lottie
66
+ progress={animationProgress.current}
67
+ source={animationGif}
68
+ />
69
+ }
70
+ <IconAntDesign
71
+ name={isActive ? icon[0] : icon[1]}
72
+ color={iconProps?.color || theme.colors.danger5}
73
+ size={iconProps?.size || 16}
74
+ style={iconProps?.style}
75
+ />
76
+ </TouchableOpacity>
77
+ )
78
+ }
@@ -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