ordering-ui-react-native 0.17.51 → 0.17.52-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 (218) 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 +29 -2
  19. package/themes/business/src/components/GoogleMap/index.tsx +58 -57
  20. package/themes/business/src/components/LoginForm/Otp/index.tsx +120 -0
  21. package/themes/business/src/components/LoginForm/Otp/styles.tsx +7 -0
  22. package/themes/business/src/components/LoginForm/index.tsx +238 -80
  23. package/themes/business/src/components/LoginForm/styles.tsx +10 -0
  24. package/themes/business/src/components/MapView/index.tsx +10 -10
  25. package/themes/business/src/components/NewOrderNotification/index.tsx +35 -21
  26. package/themes/business/src/components/OrderDetails/Delivery.tsx +31 -5
  27. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +93 -50
  28. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +59 -62
  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 +18 -17
  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 +29 -14
  40. package/themes/business/src/components/StoresList/index.tsx +2 -2
  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 +32 -2
  46. package/themes/business/src/utils/index.tsx +44 -1
  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/LoginForm/Otp/index.tsx +92 -0
  52. package/themes/kiosk/src/components/LoginForm/Otp/styles.tsx +7 -0
  53. package/themes/kiosk/src/components/LoginForm/index.tsx +480 -156
  54. package/themes/kiosk/src/components/LoginForm/styles.tsx +14 -1
  55. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  56. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  57. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  58. package/themes/kiosk/src/components/PhoneInputNumber/index.tsx +3 -2
  59. package/themes/kiosk/src/components/PhoneInputNumber/styles.tsx +1 -3
  60. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  61. package/themes/kiosk/src/components/shared/OModal.tsx +14 -11
  62. package/themes/kiosk/src/layouts/Container.tsx +7 -1
  63. package/themes/kiosk/src/types/index.d.ts +13 -0
  64. package/themes/kiosk/src/utils/index.tsx +15 -0
  65. package/themes/original/index.tsx +4 -0
  66. package/themes/original/src/components/AddressDetails/index.tsx +29 -11
  67. package/themes/original/src/components/AddressForm/index.tsx +79 -44
  68. package/themes/original/src/components/AddressList/index.tsx +27 -22
  69. package/themes/original/src/components/AddressList/styles.tsx +4 -2
  70. package/themes/original/src/components/AnalyticsSegment/index.tsx +193 -10
  71. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  72. package/themes/original/src/components/AppleLogin/styles.tsx +3 -1
  73. package/themes/original/src/components/BusinessBasicInformation/index.tsx +160 -91
  74. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +9 -7
  75. package/themes/original/src/components/BusinessController/index.tsx +122 -68
  76. package/themes/original/src/components/BusinessController/styles.tsx +23 -4
  77. package/themes/original/src/components/BusinessFeaturedController/index.tsx +21 -54
  78. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +8 -0
  79. package/themes/original/src/components/BusinessInformation/index.tsx +110 -108
  80. package/themes/original/src/components/BusinessItemAccordion/index.tsx +23 -22
  81. package/themes/original/src/components/BusinessListingSearch/index.tsx +352 -326
  82. package/themes/original/src/components/BusinessPreorder/index.tsx +103 -19
  83. package/themes/original/src/components/BusinessProductsCategories/index.tsx +1 -2
  84. package/themes/original/src/components/BusinessProductsList/index.tsx +23 -14
  85. package/themes/original/src/components/BusinessProductsList/styles.tsx +8 -3
  86. package/themes/original/src/components/BusinessProductsListing/UpsellingRedirect.tsx +1 -1
  87. package/themes/original/src/components/BusinessProductsListing/index.tsx +668 -514
  88. package/themes/original/src/components/BusinessProductsListing/styles.tsx +2 -2
  89. package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
  90. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +1 -1
  91. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +95 -80
  92. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -11
  93. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  94. package/themes/original/src/components/Cart/index.tsx +100 -67
  95. package/themes/original/src/components/CartContent/index.tsx +115 -19
  96. package/themes/original/src/components/CartContent/styles.tsx +17 -7
  97. package/themes/original/src/components/Checkout/index.tsx +367 -174
  98. package/themes/original/src/components/Checkout/styles.tsx +4 -2
  99. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  100. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  101. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  102. package/themes/original/src/components/DriverTips/index.tsx +52 -34
  103. package/themes/original/src/components/FacebookLogin/styles.tsx +3 -1
  104. package/themes/original/src/components/Favorite/index.tsx +8 -9
  105. package/themes/original/src/components/Favorite/styles.tsx +1 -1
  106. package/themes/original/src/components/FavoriteList/index.tsx +51 -80
  107. package/themes/original/src/components/FloatingButton/index.tsx +1 -2
  108. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  109. package/themes/original/src/components/GPSButton/index.tsx +6 -4
  110. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  111. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +96 -0
  112. package/themes/original/src/components/GiftCard/GiftCardUI/styles.tsx +5 -0
  113. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +100 -0
  114. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +8 -0
  115. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +191 -0
  116. package/themes/original/src/components/GiftCard/RedeemGiftCard/styles.tsx +8 -0
  117. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +165 -0
  118. package/themes/original/src/components/GiftCard/SendGiftCard/styles.tsx +9 -0
  119. package/themes/original/src/components/GoogleLogin/styles.tsx +1 -1
  120. package/themes/original/src/components/GoogleMap/index.tsx +15 -4
  121. package/themes/original/src/components/Help/index.tsx +8 -8
  122. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +10 -31
  123. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +5 -3
  124. package/themes/original/src/components/HelpGuide/index.tsx +6 -6
  125. package/themes/original/src/components/HelpGuide/styles.tsx +6 -0
  126. package/themes/original/src/components/HelpOrder/index.tsx +6 -15
  127. package/themes/original/src/components/HelpOrder/styles.tsx +8 -1
  128. package/themes/original/src/components/Home/index.tsx +13 -4
  129. package/themes/original/src/components/LastOrder/index.tsx +1 -34
  130. package/themes/original/src/components/LoginForm/Otp/index.tsx +55 -13
  131. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  132. package/themes/original/src/components/LoginForm/index.tsx +64 -26
  133. package/themes/original/src/components/LottieAnimation/index.tsx +89 -55
  134. package/themes/original/src/components/MessageListing/index.tsx +16 -42
  135. package/themes/original/src/components/Messages/index.tsx +32 -10
  136. package/themes/original/src/components/MomentOption/index.tsx +195 -88
  137. package/themes/original/src/components/MultiCart/index.tsx +50 -0
  138. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +151 -49
  139. package/themes/original/src/components/MultiCheckout/index.tsx +308 -88
  140. package/themes/original/src/components/MultiCheckout/styles.tsx +3 -1
  141. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +37 -224
  142. package/themes/original/src/components/MultiOrdersDetails/index.tsx +68 -21
  143. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
  144. package/themes/original/src/components/MyOrders/index.tsx +77 -52
  145. package/themes/original/src/components/NavBar/index.tsx +18 -18
  146. package/themes/original/src/components/NotFoundSource/index.tsx +14 -10
  147. package/themes/original/src/components/Notifications/index.tsx +46 -50
  148. package/themes/original/src/components/Notifications/styles.tsx +6 -3
  149. package/themes/original/src/components/OrderDetails/OrderEta.tsx +76 -0
  150. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +15 -3
  151. package/themes/original/src/components/OrderDetails/index.tsx +190 -358
  152. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  153. package/themes/original/src/components/OrderItAgain/index.tsx +3 -1
  154. package/themes/original/src/components/OrderProgress/index.tsx +93 -114
  155. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  156. package/themes/original/src/components/OrderSummary/index.tsx +85 -57
  157. package/themes/original/src/components/OrderTypeSelector/index.tsx +1 -1
  158. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +24 -19
  159. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +14 -14
  160. package/themes/original/src/components/OrdersOption/index.tsx +76 -66
  161. package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
  162. package/themes/original/src/components/PageBanner/index.tsx +107 -40
  163. package/themes/original/src/components/PageBanner/styles.tsx +4 -1
  164. package/themes/original/src/components/PaymentOptionCard/index.tsx +180 -0
  165. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +1 -1
  166. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  167. package/themes/original/src/components/PaymentOptions/index.tsx +64 -7
  168. package/themes/original/src/components/PhoneInputNumber/index.tsx +3 -3
  169. package/themes/original/src/components/PlaceSpot/index.tsx +12 -6
  170. package/themes/original/src/components/ProductForm/index.tsx +114 -36
  171. package/themes/original/src/components/ProductForm/styles.tsx +5 -7
  172. package/themes/original/src/components/ProductItemAccordion/index.tsx +22 -19
  173. package/themes/original/src/components/ProductOptionSubOption/index.tsx +24 -14
  174. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +3 -4
  175. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  176. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -50
  177. package/themes/original/src/components/ProfessionalProfile/index.tsx +36 -7
  178. package/themes/original/src/components/Promotions/index.tsx +234 -220
  179. package/themes/original/src/components/Promotions/styles.tsx +10 -3
  180. package/themes/original/src/components/ReviewDriver/index.tsx +3 -3
  181. package/themes/original/src/components/ReviewOrder/index.tsx +26 -9
  182. package/themes/original/src/components/ReviewOrder/styles.tsx +7 -0
  183. package/themes/original/src/components/ReviewProducts/index.tsx +23 -11
  184. package/themes/original/src/components/ReviewTrigger/index.tsx +27 -9
  185. package/themes/original/src/components/ReviewTrigger/styles.tsx +8 -1
  186. package/themes/original/src/components/ScheduleAccordion/index.tsx +68 -0
  187. package/themes/original/src/components/ScheduleAccordion/styles.tsx +14 -0
  188. package/themes/original/src/components/ServiceForm/index.tsx +66 -17
  189. package/themes/original/src/components/Sessions/index.tsx +11 -8
  190. package/themes/original/src/components/Sessions/styles.tsx +5 -0
  191. package/themes/original/src/components/SignupForm/index.tsx +43 -20
  192. package/themes/original/src/components/SingleOrderCard/index.tsx +130 -52
  193. package/themes/original/src/components/SingleOrderCard/styles.tsx +11 -2
  194. package/themes/original/src/components/SingleProductCard/index.tsx +72 -34
  195. package/themes/original/src/components/SingleProductCard/styles.tsx +22 -4
  196. package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
  197. package/themes/original/src/components/StripeCardsList/index.tsx +13 -3
  198. package/themes/original/src/components/StripeElementsForm/index.tsx +51 -34
  199. package/themes/original/src/components/UpsellingProducts/index.tsx +238 -224
  200. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  201. package/themes/original/src/components/UserDetails/index.tsx +8 -4
  202. package/themes/original/src/components/UserFormDetails/index.tsx +76 -7
  203. package/themes/original/src/components/UserFormDetails/styles.tsx +1 -1
  204. package/themes/original/src/components/UserProfile/index.tsx +88 -79
  205. package/themes/original/src/components/UserProfileForm/index.tsx +27 -29
  206. package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
  207. package/themes/original/src/components/WalletTransactionItem/index.tsx +2 -2
  208. package/themes/original/src/components/WalletTransactions/index.tsx +3 -3
  209. package/themes/original/src/components/Wallets/index.tsx +67 -24
  210. package/themes/original/src/components/Wallets/styles.tsx +3 -4
  211. package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
  212. package/themes/original/src/components/shared/OButton.tsx +6 -2
  213. package/themes/original/src/components/shared/OInput.tsx +16 -2
  214. package/themes/original/src/components/shared/OModal.tsx +3 -3
  215. package/themes/original/src/layouts/Container.tsx +1 -1
  216. package/themes/original/src/types/index.tsx +40 -11
  217. package/themes/original/src/utils/index.tsx +375 -58
  218. 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, 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,11 +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'));
180
+ vibrateApp()
181
+ return
182
+ }
183
+ if (!values?.cellphone && otpType === 'cellphone') {
184
+ showToast(ToastType.Error, t('PHONE_NUMBER_REQUIRED', 'Phone number is required'));
168
185
  return
169
186
  }
170
187
  if (loginTab === 'otp') {
@@ -177,6 +194,7 @@ const LoginFormUI = (props: LoginParams) => {
177
194
  } else {
178
195
  if (phoneInputData.error) {
179
196
  showToast(ToastType.Error, phoneInputData.error);
197
+ vibrateApp()
180
198
  return;
181
199
  }
182
200
  handleButtonLoginClick({
@@ -189,6 +207,7 @@ const LoginFormUI = (props: LoginParams) => {
189
207
  const handleVerifyCodeClick = () => {
190
208
  if (phoneInputData.error) {
191
209
  showToast(ToastType.Error, phoneInputData.error);
210
+ vibrateApp()
192
211
  return;
193
212
  }
194
213
  if (
@@ -203,6 +222,7 @@ const LoginFormUI = (props: LoginParams) => {
203
222
  'The field Mobile phone is required.',
204
223
  ),
205
224
  );
225
+ vibrateApp()
206
226
  return;
207
227
  }
208
228
  handleSendVerifyCode && handleSendVerifyCode(phoneInputData.phone);
@@ -217,17 +237,19 @@ const LoginFormUI = (props: LoginParams) => {
217
237
  };
218
238
 
219
239
  const handleChangeInputEmail = (value: string, onChange: any) => {
220
- onChange(value.toLowerCase().replace(/[&,()%";:ç?<>{}\\[\]\s]/g, ''));
240
+ onChange(value.toLowerCase().trim().replace(/[&,()%";:ç?<>{}\\[\]\s]/g, ''));
221
241
  };
222
242
 
223
243
  const handleOpenRecaptcha = () => {
224
244
  setRecaptchaVerified(false)
225
245
  if (!recaptchaConfig?.siteKey) {
226
246
  showToast(ToastType.Error, t('NO_RECAPTCHA_SITE_KEY', 'The config doesn\'t have recaptcha site key'));
247
+ vibrateApp()
227
248
  return
228
249
  }
229
250
  if (!recaptchaConfig?.baseUrl) {
230
251
  showToast(ToastType.Error, t('NO_RECAPTCHA_BASE_URL', 'The config doesn\'t have recaptcha base url'));
252
+ vibrateApp()
231
253
  return
232
254
  }
233
255
 
@@ -244,9 +266,14 @@ const LoginFormUI = (props: LoginParams) => {
244
266
  setOtpType(type)
245
267
  }
246
268
 
247
- const handleLoginOtp = (code: string) => {
248
- handleButtonLoginClick({ code })
249
- 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
+ }
250
277
  }
251
278
 
252
279
  const closeAlert = () => {
@@ -304,6 +331,7 @@ const LoginFormUI = (props: LoginParams) => {
304
331
  baseUrl: configs?.security_recaptcha_base_url?.value || null
305
332
  })
306
333
  showToast(ToastType.Info, t('TRY_AGAIN', 'Please try again'))
334
+ vibrateApp()
307
335
  return
308
336
  }
309
337
  formState.result?.result &&
@@ -313,6 +341,7 @@ const LoginFormUI = (props: LoginParams) => {
313
341
  ? formState.result?.result
314
342
  : formState.result?.result[0],
315
343
  );
344
+ formState.result?.result && vibrateApp()
316
345
  }
317
346
  }, [formState]);
318
347
 
@@ -324,6 +353,7 @@ const LoginFormUI = (props: LoginParams) => {
324
353
  ? verifyPhoneState?.result?.result
325
354
  : verifyPhoneState?.result?.result[0];
326
355
  verifyPhoneState.result?.result && showToast(ToastType.Error, message);
356
+ verifyPhoneState.result?.result && vibrateApp();
327
357
  setIsLoadingVerifyModal(false);
328
358
  return;
329
359
  }
@@ -363,18 +393,25 @@ const LoginFormUI = (props: LoginParams) => {
363
393
  }
364
394
  }, [checkPhoneCodeState])
365
395
 
396
+ useEffect(() => {
397
+ if (!!Object.values(errors)?.length) vibrateApp()
398
+ }, [errors])
399
+
366
400
  return (
367
401
  <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
- />
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
+ )}
378
415
  <FormSide>
379
416
  {(Number(useLoginByEmail) + Number(useLoginByCellphone) + Number(useLoginOtpEmail) + Number(useLoginOtpCellphone) > 1) && (
380
417
  <LoginWith>
@@ -720,8 +757,8 @@ const LoginFormUI = (props: LoginParams) => {
720
757
 
721
758
  {configs && Object.keys(configs).length > 0 ? (
722
759
  (((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)) &&
760
+ ((configs?.google_login_client_id?.value !== '' && configs?.google_login_client_id?.value !== null) && googleLoginEnabled) ||
761
+ ((configs?.apple_login_client_id?.value !== '' && configs?.apple_login_client_id?.value !== null) && appleLoginEnabled)) && !isGuest &&
725
762
  (
726
763
  <>
727
764
  <View
@@ -749,7 +786,7 @@ const LoginFormUI = (props: LoginParams) => {
749
786
  facebookLoginEnabled && (
750
787
  <FacebookLogin
751
788
  notificationState={notificationState}
752
- handleErrors={(err: any) => showToast(ToastType.Error, err)}
789
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), vibrateApp() }}
753
790
  handleLoading={(val: boolean) => setIsFBLoading(val)}
754
791
  handleSuccessFacebookLogin={handleSuccessFacebook}
755
792
  />
@@ -758,7 +795,7 @@ const LoginFormUI = (props: LoginParams) => {
758
795
  <GoogleLogin
759
796
  notificationState={notificationState}
760
797
  webClientId={configs?.google_login_client_id?.value}
761
- handleErrors={(err: any) => showToast(ToastType.Error, err)}
798
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), vibrateApp() }}
762
799
  handleLoading={(val: boolean) => setIsFBLoading(val)}
763
800
  handleSuccessGoogleLogin={handleSuccessFacebook}
764
801
  />
@@ -766,7 +803,7 @@ const LoginFormUI = (props: LoginParams) => {
766
803
  {(configs?.apple_login_client_id?.value !== '' && configs?.google_login_client_id?.value !== null) && appleLoginEnabled && (
767
804
  <AppleLogin
768
805
  notificationState={notificationState}
769
- handleErrors={(err: any) => showToast(ToastType.Error, err)}
806
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), vibrateApp() }}
770
807
  handleLoading={(val: boolean) => setIsFBLoading(val)}
771
808
  handleSuccessAppleLogin={handleSuccessFacebook}
772
809
  />
@@ -812,20 +849,21 @@ const LoginFormUI = (props: LoginParams) => {
812
849
  onClose={() => setIsModalVisible(false)}
813
850
  />
814
851
  </OModal>
815
- <OModal
816
- open={willVerifyOtpState}
817
- onClose={() => setWillVerifyOtpState(false)}
818
- entireModal
819
- title={t('ENTER_VERIFICATION_CODE', 'Enter verification code')}
852
+ <Modal
853
+ visible={willVerifyOtpState}
854
+ onDismiss={() => setWillVerifyOtpState(false)}
855
+ animationType='slide'
820
856
  >
821
857
  <Otp
822
858
  willVerifyOtpState={willVerifyOtpState}
859
+ otpError={otpError}
860
+ setOtpError={setOtpError}
823
861
  setWillVerifyOtpState={setWillVerifyOtpState}
824
862
  handleLoginOtp={handleLoginOtp}
825
863
  onSubmit={onSubmit}
826
864
  setAlertState={setAlertState}
827
865
  />
828
- </OModal>
866
+ </Modal>
829
867
  <Alert
830
868
  open={alertState.open}
831
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