ordering-ui-react-native 0.16.40 → 0.16.41-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 (202) hide show
  1. package/package.json +7 -5
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/ActiveOrders/index.tsx +61 -63
  4. package/src/components/ActiveOrders/styles.tsx +8 -14
  5. package/src/components/BusinessBasicInformation/index.tsx +11 -19
  6. package/src/components/BusinessInformation/index.tsx +33 -4
  7. package/src/components/BusinessInformation/styles.tsx +2 -2
  8. package/src/components/BusinessProductsList/index.tsx +10 -10
  9. package/src/components/BusinessesListing/index.tsx +1 -1
  10. package/src/components/Checkout/index.tsx +2 -1
  11. package/src/components/LanguageSelector/index.tsx +21 -16
  12. package/src/components/LoginForm/index.tsx +15 -0
  13. package/src/components/Messages/index.tsx +2 -2
  14. package/src/components/NotificationSetting/index.tsx +85 -0
  15. package/src/components/OrdersOption/index.tsx +54 -56
  16. package/src/components/PaymentOptions/index.tsx +298 -345
  17. package/src/components/PaymentOptionsWebView/index.tsx +120 -121
  18. package/src/components/ReviewDriver/index.tsx +1 -1
  19. package/src/components/ReviewOrder/index.tsx +1 -1
  20. package/src/components/ReviewProducts/index.tsx +11 -0
  21. package/src/components/SignupForm/index.tsx +15 -0
  22. package/src/components/SingleProductReview/index.tsx +8 -5
  23. package/src/components/StripeElementsForm/index.tsx +25 -16
  24. package/src/components/VerifyPhone/styles.tsx +1 -2
  25. package/src/components/shared/OBottomPopup.tsx +6 -2
  26. package/src/index.tsx +2 -0
  27. package/src/pages/BusinessesListing.tsx +7 -6
  28. package/src/pages/OrderDetails.tsx +1 -1
  29. package/src/pages/ReviewDriver.tsx +2 -2
  30. package/src/pages/ReviewOrder.tsx +2 -2
  31. package/src/types/@fatnlazycat/react-native-recaptcha-v3/index.d.ts +1 -0
  32. package/src/utils/index.tsx +2 -1
  33. package/themes/business/src/components/BusinessController/index.tsx +2 -2
  34. package/themes/business/src/components/Chat/index.tsx +40 -32
  35. package/themes/business/src/components/DriverMap/index.tsx +7 -5
  36. package/themes/business/src/components/DriverSchedule/index.tsx +36 -19
  37. package/themes/business/src/components/LoginForm/index.tsx +111 -74
  38. package/themes/business/src/components/MapView/index.tsx +12 -1
  39. package/themes/business/src/components/MessagesOption/index.tsx +11 -1
  40. package/themes/business/src/components/NewOrderNotification/index.tsx +26 -41
  41. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  42. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +25 -19
  43. package/themes/business/src/components/OrdersListManager/index.tsx +10 -3
  44. package/themes/business/src/components/OrdersOption/index.tsx +65 -21
  45. package/themes/business/src/components/OrdersOption/styles.tsx +5 -1
  46. package/themes/business/src/components/OrdersOptionBusiness/index.tsx +15 -1
  47. package/themes/business/src/components/OrdersOptionCity/index.tsx +15 -1
  48. package/themes/business/src/components/OrdersOptionDate/index.tsx +19 -6
  49. package/themes/business/src/components/OrdersOptionDelivery/index.tsx +15 -1
  50. package/themes/business/src/components/OrdersOptionDriver/index.tsx +15 -1
  51. package/themes/business/src/components/OrdersOptionPaymethod/index.tsx +15 -1
  52. package/themes/business/src/components/OrdersOptionStatus/index.tsx +10 -1
  53. package/themes/business/src/components/PreviousMessages/index.tsx +17 -18
  54. package/themes/business/src/components/PreviousOrders/index.tsx +22 -24
  55. package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
  56. package/themes/business/src/components/ReviewCustomer/index.tsx +27 -13
  57. package/themes/business/src/components/ScheduleBlocked/index.tsx +2 -2
  58. package/themes/business/src/components/UserFormDetails/index.tsx +5 -2
  59. package/themes/business/src/components/UserProfileForm/index.tsx +2 -0
  60. package/themes/business/src/components/shared/ODropDown.tsx +42 -8
  61. package/themes/business/src/components/shared/ODropDownCalendar.tsx +36 -7
  62. package/themes/business/src/types/index.tsx +15 -9
  63. package/themes/business/src/utils/index.tsx +10 -0
  64. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  65. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  66. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  67. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -1
  68. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  69. package/themes/kiosk/src/components/LoginForm/index.tsx +121 -10
  70. package/themes/kiosk/src/components/LoginForm/styles.tsx +5 -0
  71. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  72. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  73. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  74. package/themes/kiosk/src/components/ProductForm/index.tsx +1 -14
  75. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  76. package/themes/kiosk/src/types/index.d.ts +2 -0
  77. package/themes/original/index.tsx +4 -0
  78. package/themes/original/src/components/AddressDetails/index.tsx +10 -8
  79. package/themes/original/src/components/AddressForm/index.tsx +157 -140
  80. package/themes/original/src/components/AddressList/index.tsx +1 -1
  81. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  82. package/themes/original/src/components/BusinessBasicInformation/index.tsx +260 -176
  83. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +2 -2
  84. package/themes/original/src/components/BusinessController/index.tsx +216 -113
  85. package/themes/original/src/components/BusinessController/styles.tsx +1 -8
  86. package/themes/original/src/components/BusinessItemAccordion/index.tsx +12 -6
  87. package/themes/original/src/components/BusinessListingSearch/BusinessControllerSkeletons/index.tsx +57 -0
  88. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +59 -0
  89. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/styles.tsx +13 -0
  90. package/themes/original/src/components/BusinessListingSearch/index.tsx +109 -139
  91. package/themes/original/src/components/BusinessListingSearch/styles.tsx +10 -12
  92. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +87 -0
  93. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/styles.tsx +12 -0
  94. package/themes/original/src/components/BusinessProductsList/index.tsx +59 -60
  95. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  96. package/themes/original/src/components/BusinessProductsListing/index.tsx +210 -115
  97. package/themes/original/src/components/BusinessProductsListing/styles.tsx +18 -11
  98. package/themes/original/src/components/BusinessReviews/index.tsx +6 -1
  99. package/themes/original/src/components/BusinessTypeFilter/index.tsx +3 -2
  100. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +37 -25
  101. package/themes/original/src/components/BusinessesListing/Layout/Appointment/styles.tsx +5 -4
  102. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +260 -109
  103. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +47 -10
  104. package/themes/original/src/components/BusinessesListing/index.tsx +95 -7
  105. package/themes/original/src/components/Cart/index.tsx +53 -15
  106. package/themes/original/src/components/Cart/styles.tsx +4 -0
  107. package/themes/original/src/components/CartContent/index.tsx +22 -16
  108. package/themes/original/src/components/Checkout/index.tsx +114 -118
  109. package/themes/original/src/components/Checkout/styles.tsx +4 -3
  110. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  111. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  112. package/themes/original/src/components/DriverTips/index.tsx +4 -4
  113. package/themes/original/src/components/DriverTips/styles.tsx +2 -1
  114. package/themes/original/src/components/FavoriteList/index.tsx +19 -0
  115. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  116. package/themes/original/src/components/GPSButton/index.tsx +20 -19
  117. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  118. package/themes/original/src/components/GoogleMap/index.tsx +20 -12
  119. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +25 -10
  120. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +4 -0
  121. package/themes/original/src/components/HelpGuide/index.tsx +9 -8
  122. package/themes/original/src/components/HelpOrder/index.tsx +9 -8
  123. package/themes/original/src/components/LanguageSelector/index.tsx +19 -14
  124. package/themes/original/src/components/LoginForm/Otp/index.tsx +95 -73
  125. package/themes/original/src/components/LoginForm/index.tsx +98 -41
  126. package/themes/original/src/components/LottieAnimation/index.tsx +69 -0
  127. package/themes/original/src/components/Messages/index.tsx +20 -20
  128. package/themes/original/src/components/MomentOption/index.tsx +8 -6
  129. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +92 -92
  130. package/themes/original/src/components/MultiCheckout/index.tsx +6 -0
  131. package/themes/original/src/components/MultiOrdersDetails/index.tsx +20 -16
  132. package/themes/original/src/components/MyOrders/index.tsx +88 -22
  133. package/themes/original/src/components/NavBar/index.tsx +15 -9
  134. package/themes/original/src/components/NetworkError/index.tsx +5 -3
  135. package/themes/original/src/components/NotFoundSource/index.tsx +2 -1
  136. package/themes/original/src/components/Notifications/index.tsx +148 -0
  137. package/themes/original/src/components/Notifications/styles.tsx +17 -0
  138. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +167 -0
  139. package/themes/original/src/components/OrderDetails/index.tsx +200 -37
  140. package/themes/original/src/components/OrderDetails/styles.tsx +15 -2
  141. package/themes/original/src/components/OrderItAgain/index.tsx +75 -0
  142. package/themes/original/src/components/OrderItAgain/styles.tsx +10 -0
  143. package/themes/original/src/components/OrderProgress/index.tsx +77 -66
  144. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  145. package/themes/original/src/components/OrderSummary/index.tsx +2 -35
  146. package/themes/original/src/components/OrderTypeSelector/index.tsx +85 -36
  147. package/themes/original/src/components/OrderTypeSelector/styles.tsx +19 -1
  148. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +97 -106
  149. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +3 -0
  150. package/themes/original/src/components/OrdersOption/index.tsx +71 -55
  151. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  152. package/themes/original/src/components/PaymentOptions/index.tsx +1 -2
  153. package/themes/original/src/components/PhoneInputNumber/index.tsx +5 -11
  154. package/themes/original/src/components/PlaceSpot/index.tsx +249 -47
  155. package/themes/original/src/components/PlaceSpot/styles.tsx +0 -2
  156. package/themes/original/src/components/PreviousOrders/index.tsx +3 -2
  157. package/themes/original/src/components/ProductForm/index.tsx +639 -664
  158. package/themes/original/src/components/ProductForm/styles.tsx +10 -11
  159. package/themes/original/src/components/ProductItemAccordion/index.tsx +199 -128
  160. package/themes/original/src/components/ProductOption/index.tsx +1 -1
  161. package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
  162. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +0 -1
  163. package/themes/original/src/components/ProfessionalFilter/index.tsx +2 -1
  164. package/themes/original/src/components/ProfessionalProfile/index.tsx +26 -14
  165. package/themes/original/src/components/Promotions/index.tsx +232 -219
  166. package/themes/original/src/components/Promotions/styles.tsx +7 -2
  167. package/themes/original/src/components/ReviewDriver/index.tsx +7 -7
  168. package/themes/original/src/components/ReviewOrder/index.tsx +18 -3
  169. package/themes/original/src/components/ReviewProducts/index.tsx +2 -2
  170. package/themes/original/src/components/ReviewTrigger/index.tsx +118 -0
  171. package/themes/original/src/components/ReviewTrigger/styles.tsx +34 -0
  172. package/themes/original/src/components/SearchBar/index.tsx +5 -3
  173. package/themes/original/src/components/ServiceForm/index.tsx +410 -258
  174. package/themes/original/src/components/SignupForm/index.tsx +184 -127
  175. package/themes/original/src/components/SingleOrderCard/index.tsx +229 -181
  176. package/themes/original/src/components/SingleOrderCard/styles.tsx +0 -7
  177. package/themes/original/src/components/SingleProductCard/index.tsx +198 -112
  178. package/themes/original/src/components/SingleProductCard/styles.tsx +3 -10
  179. package/themes/original/src/components/SingleProductReview/index.tsx +38 -5
  180. package/themes/original/src/components/SingleProductReview/styles.tsx +12 -0
  181. package/themes/original/src/components/StripeElementsForm/index.tsx +13 -2
  182. package/themes/original/src/components/UpsellingProducts/index.tsx +15 -5
  183. package/themes/original/src/components/UserDetails/index.tsx +5 -3
  184. package/themes/original/src/components/UserFormDetails/index.tsx +6 -48
  185. package/themes/original/src/components/UserProfile/index.tsx +56 -31
  186. package/themes/original/src/components/UserProfile/styles.ts +17 -0
  187. package/themes/original/src/components/UserProfileForm/index.tsx +10 -10
  188. package/themes/original/src/components/WalletTransactions/index.tsx +76 -0
  189. package/themes/original/src/components/WalletTransactions/styles.tsx +13 -0
  190. package/themes/original/src/components/Wallets/index.tsx +176 -164
  191. package/themes/original/src/components/Wallets/styles.tsx +12 -8
  192. package/themes/original/src/components/shared/CardAnimation.tsx +47 -0
  193. package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
  194. package/themes/original/src/components/shared/OBottomPopup.tsx +48 -15
  195. package/themes/original/src/components/shared/OButton.tsx +10 -3
  196. package/themes/original/src/components/shared/OIcon.tsx +8 -1
  197. package/themes/original/src/components/shared/OInput.tsx +13 -3
  198. package/themes/original/src/layouts/Container.tsx +13 -9
  199. package/themes/original/src/layouts/FloatingBottomContainer.tsx +5 -1
  200. package/themes/original/src/types/index.tsx +83 -29
  201. package/themes/original/src/utils/index.tsx +121 -10
  202. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -1,10 +1,11 @@
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
+ import ReCaptcha from '@fatnlazycat/react-native-recaptcha-v3'
8
9
 
9
10
  import {
10
11
  LoginForm as LoginFormController,
@@ -95,7 +96,7 @@ const LoginFormUI = (props: LoginParams) => {
95
96
  const [alertState, setAlertState] = useState({ open: false, title: '', content: [] })
96
97
  const [tabLayouts, setTabLayouts] = useState<any>({})
97
98
  const tabsRef = useRef<any>(null)
98
-
99
+ const enabledPoweredByOrdering = configs?.powered_by_ordering_module?.value
99
100
  const theme = useTheme();
100
101
  const isOtpEmail = loginTab === 'otp' && otpType === 'email'
101
102
  const isOtpCellphone = loginTab === 'otp' && otpType === 'cellphone'
@@ -164,6 +165,7 @@ const LoginFormUI = (props: LoginParams) => {
164
165
  if (loginTab === 'otp') {
165
166
  if (phoneInputData.error && (loginTab !== 'otp' || (otpType === 'cellphone' && loginTab === 'otp'))) {
166
167
  showToast(ToastType.Error, t('INVALID_PHONE_NUMBER', 'Invalid phone number'));
168
+ Vibration.vibrate()
167
169
  return
168
170
  }
169
171
  if (loginTab === 'otp') {
@@ -176,6 +178,7 @@ const LoginFormUI = (props: LoginParams) => {
176
178
  } else {
177
179
  if (phoneInputData.error) {
178
180
  showToast(ToastType.Error, phoneInputData.error);
181
+ Vibration.vibrate()
179
182
  return;
180
183
  }
181
184
  handleButtonLoginClick({
@@ -188,6 +191,7 @@ const LoginFormUI = (props: LoginParams) => {
188
191
  const handleVerifyCodeClick = () => {
189
192
  if (phoneInputData.error) {
190
193
  showToast(ToastType.Error, phoneInputData.error);
194
+ Vibration.vibrate()
191
195
  return;
192
196
  }
193
197
  if (
@@ -202,6 +206,7 @@ const LoginFormUI = (props: LoginParams) => {
202
206
  'The field Mobile phone is required.',
203
207
  ),
204
208
  );
209
+ Vibration.vibrate()
205
210
  return;
206
211
  }
207
212
  handleSendVerifyCode && handleSendVerifyCode(phoneInputData.phone);
@@ -223,10 +228,12 @@ const LoginFormUI = (props: LoginParams) => {
223
228
  setRecaptchaVerified(false)
224
229
  if (!recaptchaConfig?.siteKey) {
225
230
  showToast(ToastType.Error, t('NO_RECAPTCHA_SITE_KEY', 'The config doesn\'t have recaptcha site key'));
231
+ Vibration.vibrate()
226
232
  return
227
233
  }
228
234
  if (!recaptchaConfig?.baseUrl) {
229
235
  showToast(ToastType.Error, t('NO_RECAPTCHA_BASE_URL', 'The config doesn\'t have recaptcha base url'));
236
+ Vibration.vibrate()
230
237
  return
231
238
  }
232
239
 
@@ -235,7 +242,7 @@ const LoginFormUI = (props: LoginParams) => {
235
242
 
236
243
  const onRecaptchaVerify = (token: any) => {
237
244
  setRecaptchaVerified(true)
238
- handleReCaptcha(token)
245
+ handleReCaptcha({ code: token, version: recaptchaConfig?.version })
239
246
  }
240
247
 
241
248
  const handleChangeOtpType = (type: string) => {
@@ -272,15 +279,40 @@ const LoginFormUI = (props: LoginParams) => {
272
279
 
273
280
  useEffect(() => {
274
281
  if (configs && Object.keys(configs).length > 0 && enableReCaptcha) {
275
- setRecaptchaConfig({
276
- siteKey: configs?.security_recaptcha_site_key?.value || null,
277
- baseUrl: configs?.security_recaptcha_base_url?.value || null
278
- })
282
+ if (configs?.security_recaptcha_type?.value === 'v3' &&
283
+ configs?.security_recaptcha_score_v3?.value > 0 &&
284
+ configs?.security_recaptcha_site_key_v3?.value
285
+ ) {
286
+ setRecaptchaConfig({
287
+ version: 'v3',
288
+ siteKey: configs?.security_recaptcha_site_key_v3?.value || null,
289
+ baseUrl: configs?.security_recaptcha_base_url?.value || null
290
+ })
291
+ return
292
+ }
293
+ if (configs?.security_recaptcha_site_key?.value) {
294
+ setRecaptchaConfig({
295
+ version: 'v2',
296
+ siteKey: configs?.security_recaptcha_site_key?.value || null,
297
+ baseUrl: configs?.security_recaptcha_base_url?.value || null
298
+ })
299
+ }
279
300
  }
280
301
  }, [configs, enableReCaptcha])
281
302
 
282
303
  useEffect(() => {
283
304
  if (!formState.loading && formState.result?.error) {
305
+ if (formState.result?.result?.[0] === 'ERROR_AUTH_VERIFICATION_CODE') {
306
+ setRecaptchaVerified(false)
307
+ setRecaptchaConfig({
308
+ version: 'v2',
309
+ siteKey: configs?.security_recaptcha_site_key?.value || null,
310
+ baseUrl: configs?.security_recaptcha_base_url?.value || null
311
+ })
312
+ showToast(ToastType.Info, t('TRY_AGAIN', 'Please try again'))
313
+ Vibration.vibrate()
314
+ return
315
+ }
284
316
  formState.result?.result &&
285
317
  showToast(
286
318
  ToastType.Error,
@@ -288,6 +320,7 @@ const LoginFormUI = (props: LoginParams) => {
288
320
  ? formState.result?.result
289
321
  : formState.result?.result[0],
290
322
  );
323
+ formState.result?.result && Vibration.vibrate()
291
324
  }
292
325
  }, [formState]);
293
326
 
@@ -299,6 +332,7 @@ const LoginFormUI = (props: LoginParams) => {
299
332
  ? verifyPhoneState?.result?.result
300
333
  : verifyPhoneState?.result?.result[0];
301
334
  verifyPhoneState.result?.result && showToast(ToastType.Error, message);
335
+ verifyPhoneState.result?.result && Vibration.vibrate();
302
336
  setIsLoadingVerifyModal(false);
303
337
  return;
304
338
  }
@@ -338,6 +372,10 @@ const LoginFormUI = (props: LoginParams) => {
338
372
  }
339
373
  }, [checkPhoneCodeState])
340
374
 
375
+ useEffect(() => {
376
+ if (!!Object.values(errors)?.length) Vibration.vibrate()
377
+ }, [errors])
378
+
341
379
  return (
342
380
  <Container>
343
381
  <NavBar
@@ -596,35 +634,47 @@ const LoginFormUI = (props: LoginParams) => {
596
634
  </TouchableOpacity>
597
635
  )}
598
636
 
599
- {enableReCaptcha && (
637
+ {(enableReCaptcha && recaptchaConfig?.version) && (
600
638
  <>
601
- <TouchableOpacity
602
- onPress={handleOpenRecaptcha}
603
- >
604
- <RecaptchaButton>
605
- {recaptchaVerified ? (
606
- <MaterialCommunityIcons
607
- name="checkbox-marked"
608
- size={26}
609
- color={theme.colors.primary}
610
- />
611
- ) : (
612
- <MaterialCommunityIcons
613
- name="checkbox-blank-outline"
614
- size={26}
615
- color={theme.colors.mediumGray}
616
- />
617
- )}
618
- <OText size={14} mLeft={8}>{t('VERIFY_ReCAPTCHA', 'Verify reCAPTCHA')}</OText>
619
- </RecaptchaButton>
620
- </TouchableOpacity>
621
- <Recaptcha
622
- ref={recaptchaRef}
623
- siteKey={recaptchaConfig?.siteKey}
624
- baseUrl={recaptchaConfig?.baseUrl}
625
- onVerify={onRecaptchaVerify}
626
- onExpire={() => setRecaptchaVerified(false)}
627
- />
639
+ {recaptchaConfig?.version === 'v3' ? (
640
+ <ReCaptcha
641
+ url={recaptchaConfig?.baseUrl}
642
+ siteKey={recaptchaConfig?.siteKey}
643
+ containerStyle={{ height: 40 }}
644
+ onExecute={onRecaptchaVerify}
645
+ reCaptchaType={1}
646
+ />
647
+ ) : (
648
+ <>
649
+ <TouchableOpacity
650
+ onPress={handleOpenRecaptcha}
651
+ >
652
+ <RecaptchaButton>
653
+ {recaptchaVerified ? (
654
+ <MaterialCommunityIcons
655
+ name="checkbox-marked"
656
+ size={26}
657
+ color={theme.colors.primary}
658
+ />
659
+ ) : (
660
+ <MaterialCommunityIcons
661
+ name="checkbox-blank-outline"
662
+ size={26}
663
+ color={theme.colors.mediumGray}
664
+ />
665
+ )}
666
+ <OText size={14} mLeft={8}>{t('VERIFY_ReCAPTCHA', 'Verify reCAPTCHA')}</OText>
667
+ </RecaptchaButton>
668
+ </TouchableOpacity>
669
+ <Recaptcha
670
+ ref={recaptchaRef}
671
+ siteKey={recaptchaConfig?.siteKey}
672
+ baseUrl={recaptchaConfig?.baseUrl}
673
+ onVerify={onRecaptchaVerify}
674
+ onExpire={() => setRecaptchaVerified(false)}
675
+ />
676
+ </>)
677
+ }
628
678
  </>
629
679
  )}
630
680
  <OButton
@@ -643,7 +693,7 @@ const LoginFormUI = (props: LoginParams) => {
643
693
  {t('NEW_ON_PLATFORM', 'New on Ordering?')}
644
694
  </OText>
645
695
  <TouchableOpacity onPress={() => onNavigationRedirect('Signup')}>
646
- <OText size={14} mLeft={5} color={theme.colors.skyBlue}>
696
+ <OText size={14} mLeft={5} color={theme.colors.primary}>
647
697
  {t('CREATE_ACCOUNT', 'Create account')}
648
698
  </OText>
649
699
  </TouchableOpacity>
@@ -682,8 +732,9 @@ const LoginFormUI = (props: LoginParams) => {
682
732
  )}
683
733
 
684
734
  {configs && Object.keys(configs).length > 0 ? (
685
- (((configs?.facebook_login?.value === 'true' || configs?.facebook_login?.value === '1') && configs?.facebook_id?.value) ||
686
- (configs?.google_login_client_id?.value !== '' && configs?.google_login_client_id?.value !== null)) &&
735
+ (((configs?.facebook_login?.value === 'true' || configs?.facebook_login?.value === '1') && configs?.facebook_id?.value && facebookLoginEnabled) ||
736
+ ((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)) &&
687
738
  (
688
739
  <>
689
740
  <View
@@ -711,7 +762,7 @@ const LoginFormUI = (props: LoginParams) => {
711
762
  facebookLoginEnabled && (
712
763
  <FacebookLogin
713
764
  notificationState={notificationState}
714
- handleErrors={(err: any) => showToast(ToastType.Error, err)}
765
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), Vibration.vibrate() }}
715
766
  handleLoading={(val: boolean) => setIsFBLoading(val)}
716
767
  handleSuccessFacebookLogin={handleSuccessFacebook}
717
768
  />
@@ -720,7 +771,7 @@ const LoginFormUI = (props: LoginParams) => {
720
771
  <GoogleLogin
721
772
  notificationState={notificationState}
722
773
  webClientId={configs?.google_login_client_id?.value}
723
- handleErrors={(err: any) => showToast(ToastType.Error, err)}
774
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), Vibration.vibrate() }}
724
775
  handleLoading={(val: boolean) => setIsFBLoading(val)}
725
776
  handleSuccessGoogleLogin={handleSuccessFacebook}
726
777
  />
@@ -728,7 +779,7 @@ const LoginFormUI = (props: LoginParams) => {
728
779
  {(configs?.apple_login_client_id?.value !== '' && configs?.google_login_client_id?.value !== null) && appleLoginEnabled && (
729
780
  <AppleLogin
730
781
  notificationState={notificationState}
731
- handleErrors={(err: any) => showToast(ToastType.Error, err)}
782
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), Vibration.vibrate() }}
732
783
  handleLoading={(val: boolean) => setIsFBLoading(val)}
733
784
  handleSuccessAppleLogin={handleSuccessFacebook}
734
785
  />
@@ -751,6 +802,12 @@ const LoginFormUI = (props: LoginParams) => {
751
802
  </Placeholder>
752
803
  </SkeletonWrapper>
753
804
  )}
805
+
806
+ {enabledPoweredByOrdering && (
807
+ <OText>
808
+ Powered By Ordering.co
809
+ </OText>
810
+ )}
754
811
  </FormSide>
755
812
  <OModal
756
813
  open={isModalVisible}
@@ -0,0 +1,69 @@
1
+ import React, { useRef } 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 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()
50
+ }
51
+
52
+ return (
53
+ <TouchableOpacity
54
+ onPress={onPressLottie}
55
+ style={style}
56
+ >
57
+ <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}
66
+ />
67
+ </TouchableOpacity>
68
+ )
69
+ }
@@ -5,6 +5,7 @@ import { launchImageLibrary } from 'react-native-image-picker'
5
5
  import { GiftedChat, Actions, ActionsProps, InputToolbar, Composer, Send, Bubble, MessageImage, InputToolbarProps, ComposerProps } from 'react-native-gifted-chat'
6
6
  import { USER_TYPE } from '../../config/constants'
7
7
  import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIcons'
8
+ import AntDesignIcon from 'react-native-vector-icons/AntDesign'
8
9
  import { OIcon, OIconButton, OText, OButton } from '../shared'
9
10
  import { TouchableOpacity, ActivityIndicator, StyleSheet, View, Platform, Keyboard } from 'react-native'
10
11
  import { Header, TitleHeader, Wrapper, QuickMessageContainer, ProfileMessageHeader, MessageTypeItem } from './styles'
@@ -36,7 +37,7 @@ const ORDER_STATUS: any = {
36
37
  20: 'ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS',
37
38
  21: 'ORDER_CUSTOMER_ARRIVED_BUSINESS',
38
39
  22: 'ORDER_LOOKING_FOR_DRIVER',
39
- 23: 'ORDER_DRIVER_ON_WAY'
40
+ 23: 'ORDER_DRIVER_ON_WAY'
40
41
  }
41
42
 
42
43
  const filterSpecialStatus = ['prepared_in', 'delivered_in', 'delivery_datetime']
@@ -122,18 +123,17 @@ const MessagesUI = (props: MessagesParams) => {
122
123
 
123
124
  const messageConsole = (message: any) => {
124
125
  return message.change?.attribute !== 'driver_id'
125
- ?
126
- `${t('ORDER', 'Order')} ${t(message.change.attribute.toUpperCase(), message.change.attribute.replace('_', ' '))} ${t('CHANGED_FROM', 'Changed from')} ${
127
- filterSpecialStatus.includes(message.change.attribute) ?
128
- `${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)])}`
130
- }`
131
- : message.change.new
132
126
  ?
133
- `${message.driver?.name} ${message.driver?.lastname !== null ? message.driver.lastname : ''} ${t('WAS_ASSIGNED_AS_DRIVER', 'Was assigned as driver')} ${message.comment ? message.comment.length : ''}`
134
- :
135
- `${t('DRIVER_UNASSIGNED', 'Driver unassigned')}`
136
- }
127
+ `${t('ORDER', 'Order')} ${t(message.change.attribute.toUpperCase(), message.change.attribute.replace('_', ' '))} ${t('CHANGED_FROM', 'Changed from')} ${filterSpecialStatus.includes(message.change.attribute) ?
128
+ `${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)])}`
130
+ }`
131
+ : message.change.new
132
+ ?
133
+ `${message.driver?.name} ${message.driver?.lastname !== null ? message.driver.lastname : ''} ${t('WAS_ASSIGNED_AS_DRIVER', 'Was assigned as driver')} ${message.comment ? message.comment.length : ''}`
134
+ :
135
+ `${t('DRIVER_UNASSIGNED', 'Driver unassigned')}`
136
+ }
137
137
 
138
138
  useEffect(() => {
139
139
  let newMessages: Array<any> = []
@@ -141,7 +141,7 @@ const MessagesUI = (props: MessagesParams) => {
141
141
  const firstMessage = {
142
142
  _id: 0,
143
143
  text: _console,
144
- createdAt: order?.created_at,
144
+ createdAt: parseDate(order?.created_at, { outputFormat: 'YYYY-MM-DD HH:mm:ss' }),
145
145
  system: true
146
146
  }
147
147
  const newMessage: any = [];
@@ -150,7 +150,7 @@ const MessagesUI = (props: MessagesParams) => {
150
150
  newMessage.push({
151
151
  _id: message?.id,
152
152
  text: message.type === 1 ? messageConsole(message) : message.comment,
153
- createdAt: message.type !== 0 && message.created_at,
153
+ createdAt: message.type !== 0 && parseDate(message?.created_at, { outputFormat: 'YYYY-MM-DD HH:mm:ss' }),
154
154
  image: message.source,
155
155
  system: message.type === 1,
156
156
  user: {
@@ -165,7 +165,7 @@ const MessagesUI = (props: MessagesParams) => {
165
165
  newMessage.push({
166
166
  _id: message?.id,
167
167
  text: message.type === 1 ? messageConsole(message) : message.comment,
168
- createdAt: message.type !== 0 && message.created_at,
168
+ createdAt: message.type !== 0 && parseDate(message?.created_at, { outputFormat: 'YYYY-MM-DD HH:mm:ss' }),
169
169
  image: message.source,
170
170
  system: message.type === 1,
171
171
  user: {
@@ -402,7 +402,9 @@ const MessagesUI = (props: MessagesParams) => {
402
402
  <Wrapper>
403
403
  {!isMeesageListing ? (
404
404
  <Header>
405
- <OIconButton icon={theme.images.general.arrow_left} style={{ paddingStart: 10, borderColor: theme.colors.clear }} onClick={onClose} />
405
+ <TouchableOpacity onPress={onClose} style={{ paddingStart: 10, borderColor: theme.colors.clear }}>
406
+ <AntDesignIcon name='arrowleft' size={26} />
407
+ </TouchableOpacity>
406
408
  <View style={{ marginRight: 10, shadowColor: theme.colors.black, shadowOpacity: 0.1, shadowOffset: { width: 0, height: 1 }, shadowRadius: 2 }}>
407
409
  <OIcon
408
410
  url={type === USER_TYPE.DRIVER ? order?.driver?.photo : order?.business?.logo}
@@ -419,10 +421,8 @@ const MessagesUI = (props: MessagesParams) => {
419
421
  ) : (
420
422
  <ProfileMessageHeader>
421
423
  <View style={{ ...styles.headerTitle }}>
422
- <TouchableOpacity
423
- style={styles.headerItem}
424
- onPress={onClose}>
425
- <OIcon src={theme.images.general.arrow_left} width={16} />
424
+ <TouchableOpacity onPress={onClose} style={styles.headerItem}>
425
+ <AntDesignIcon name='arrowleft' size={26} />
426
426
  </TouchableOpacity>
427
427
  <OText size={18}>{t('ORDER', theme?.defaultLanguages?.ORDER || 'Order')} #{order?.id}</OText>
428
428
  </View>
@@ -28,6 +28,7 @@ import {
28
28
  TimeItem
29
29
  } from './styles';
30
30
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
31
+ import { locale, monthsEnum } from '../../utils';
31
32
 
32
33
  const MomentOptionUI = (props: MomentOptionParams) => {
33
34
  const {
@@ -258,7 +259,7 @@ const MomentOptionUI = (props: MomentOptionParams) => {
258
259
  onActionLeft={() => goToBack()}
259
260
  btnStyle={{ paddingLeft: 0 }}
260
261
  paddingTop={0}
261
- style={{ paddingBottom: 0, flexDirection: 'column', alignItems: 'flex-start' }}
262
+ style={{ paddingBottom: 0 }}
262
263
  title={t('QUESTION_WHEN_ORDER', 'When do you want your order?')}
263
264
  titleAlign={'center'}
264
265
  titleStyle={{ fontSize: 14, marginRight: 0, marginLeft: 0 }}
@@ -281,7 +282,7 @@ const MomentOptionUI = (props: MomentOptionParams) => {
281
282
  style={{ marginEnd: 24 }}
282
283
  />
283
284
  )}
284
- <OText color={optionSelected.isAsap ? theme.colors.textNormal : theme.colors.disabled}>{t('ASAP_ABBREVIATION', 'ASAP') + ` (${moment().format('dddd, MMM D, yyyy h:mm A')} + delivery time)`}</OText>
285
+ <OText color={optionSelected.isAsap ? theme.colors.textNormal : theme.colors.disabled}>{t('ASAP_ABBREVIATION', 'ASAP') + ` (${t(moment().format('dddd')?.toLocaleUpperCase(), moment().format('dddd'))}, ${t(monthsEnum[moment().format('MMM')], moment().format('MMM'))}${moment().format(' D, yyyy h:mm A')} + ${t('DELIVERY_TIME', 'delivery time')})`}</OText>
285
286
  </WrapSelectOption>
286
287
  <WrapSelectOption
287
288
  onPress={() => setOptionSelected({ isAsap: false, isSchedule: true })}
@@ -308,6 +309,7 @@ const MomentOptionUI = (props: MomentOptionParams) => {
308
309
  {selectDate && datesWhitelist[0]?.start !== null && (
309
310
  <CalendarStrip
310
311
  scrollable
312
+ locale={locale}
311
313
  style={styles.calendar}
312
314
  calendarHeaderContainerStyle={styles.calendarHeaderContainer}
313
315
  calendarHeaderStyle={styles.calendarHeader}
@@ -342,12 +344,12 @@ const MomentOptionUI = (props: MomentOptionParams) => {
342
344
  style={{
343
345
  lineHeight: 24
344
346
  }}
345
- >{is12hours ? (
346
- time.startTime.includes('12')
347
+ >{is12hours ? (
348
+ time.startTime.includes('12')
347
349
  ? `${time.startTime}PM`
348
350
  : parseTime(moment(time.startTime, 'HH:mm'), { outputFormat: 'hh:mma' })
349
- ) : time.startTime
350
- }</OText>
351
+ ) : time.startTime
352
+ }</OText>
351
353
  </TimeItem>
352
354
  </TouchableOpacity>
353
355
  ))}