ordering-ui-react-native 0.15.82 → 0.15.83-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 (216) hide show
  1. package/package.json +7 -3
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/ActiveOrders/index.tsx +61 -63
  4. package/src/components/ActiveOrders/styles.tsx +1 -1
  5. package/src/components/AddressForm/index.tsx +18 -2
  6. package/src/components/BusinessBasicInformation/index.tsx +11 -19
  7. package/src/components/BusinessController/index.tsx +16 -8
  8. package/src/components/BusinessInformation/index.tsx +14 -0
  9. package/src/components/BusinessTypeFilter/index.tsx +1 -2
  10. package/src/components/BusinessesListing/index.tsx +1 -1
  11. package/src/components/Checkout/index.tsx +25 -3
  12. package/src/components/DriverTips/index.tsx +11 -6
  13. package/src/components/LanguageSelector/index.tsx +24 -15
  14. package/src/components/LoginForm/index.tsx +120 -30
  15. package/src/components/LoginForm/styles.tsx +6 -0
  16. package/src/components/NotificationSetting/index.tsx +85 -0
  17. package/src/components/OrderDetails/index.tsx +7 -21
  18. package/src/components/PaymentOptions/index.tsx +335 -365
  19. package/src/components/PaymentOptionsWebView/index.tsx +120 -121
  20. package/src/components/ReviewDriver/index.tsx +1 -1
  21. package/src/components/ReviewOrder/index.tsx +2 -1
  22. package/src/components/ReviewProducts/index.tsx +11 -0
  23. package/src/components/SignupForm/index.tsx +145 -61
  24. package/src/components/SingleProductCard/index.tsx +16 -4
  25. package/src/components/SingleProductReview/index.tsx +1 -1
  26. package/src/components/StripeElementsForm/index.tsx +25 -16
  27. package/src/components/StripeMethodForm/index.tsx +22 -24
  28. package/src/components/UpsellingProducts/index.tsx +1 -1
  29. package/src/components/UserProfileForm/index.tsx +63 -6
  30. package/src/components/UserProfileForm/styles.tsx +8 -0
  31. package/src/components/VerifyPhone/styles.tsx +1 -2
  32. package/src/components/shared/OBottomPopup.tsx +6 -2
  33. package/src/components/shared/OModal.tsx +1 -1
  34. package/src/hooks/useCountdownTimer.tsx +26 -0
  35. package/src/index.tsx +2 -0
  36. package/src/navigators/CheckoutNavigator.tsx +6 -0
  37. package/src/navigators/HomeNavigator.tsx +6 -0
  38. package/src/pages/BusinessesListing.tsx +7 -6
  39. package/src/pages/MultiCheckout.tsx +31 -0
  40. package/src/pages/MultiOrdersDetails.tsx +27 -0
  41. package/src/pages/OrderDetails.tsx +1 -1
  42. package/src/pages/ReviewDriver.tsx +2 -2
  43. package/src/pages/ReviewOrder.tsx +2 -2
  44. package/src/theme.json +0 -1
  45. package/src/types/index.tsx +18 -11
  46. package/src/utils/index.tsx +28 -29
  47. package/themes/business/index.tsx +4 -0
  48. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +100 -60
  49. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +1 -0
  50. package/themes/business/src/components/Chat/index.tsx +51 -91
  51. package/themes/business/src/components/DriverMap/index.tsx +6 -5
  52. package/themes/business/src/components/DriverSchedule/index.tsx +71 -0
  53. package/themes/business/src/components/DriverSchedule/styles.tsx +6 -0
  54. package/themes/business/src/components/LoginForm/index.tsx +89 -2
  55. package/themes/business/src/components/LoginForm/styles.tsx +6 -0
  56. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  57. package/themes/business/src/components/MapView/index.tsx +1 -1
  58. package/themes/business/src/components/NewOrderNotification/index.tsx +26 -13
  59. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  60. package/themes/business/src/components/OrderDetails/Delivery.tsx +17 -7
  61. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +26 -18
  62. package/themes/business/src/components/OrdersListManager/index.tsx +11 -4
  63. package/themes/business/src/components/OrdersOption/index.tsx +16 -4
  64. package/themes/business/src/components/PreviousOrders/index.tsx +7 -7
  65. package/themes/business/src/components/ProductItemAccordion/index.tsx +5 -4
  66. package/themes/business/src/components/ScheduleBlocked/index.tsx +53 -0
  67. package/themes/business/src/components/UserFormDetails/index.tsx +5 -2
  68. package/themes/business/src/components/UserProfileForm/index.tsx +28 -4
  69. package/themes/business/src/components/shared/OModal.tsx +41 -38
  70. package/themes/business/src/types/index.tsx +13 -6
  71. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  72. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  73. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  74. package/themes/kiosk/src/components/BusinessMenu/index.tsx +25 -26
  75. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -3
  76. package/themes/kiosk/src/components/Cart/index.tsx +10 -11
  77. package/themes/kiosk/src/components/CartBottomSheet/index.tsx +9 -2
  78. package/themes/kiosk/src/components/CartContent/index.tsx +0 -11
  79. package/themes/kiosk/src/components/CartItem/index.tsx +4 -3
  80. package/themes/kiosk/src/components/CategoriesMenu/index.tsx +107 -62
  81. package/themes/kiosk/src/components/Checkout/index.tsx +40 -22
  82. package/themes/kiosk/src/components/CustomerName/index.tsx +0 -6
  83. package/themes/kiosk/src/components/DrawerView/index.tsx +1 -0
  84. package/themes/kiosk/src/components/DrawerView/styles.tsx +2 -2
  85. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  86. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  87. package/themes/kiosk/src/components/OrderDetails/index.tsx +2 -2
  88. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +9 -11
  89. package/themes/kiosk/src/components/PaymentOptions/index.tsx +55 -53
  90. package/themes/kiosk/src/components/ProductForm/index.tsx +6 -7
  91. package/themes/kiosk/src/components/ProductOptionSubOption/index.tsx +3 -1
  92. package/themes/kiosk/src/components/UpsellingProducts/index.tsx +16 -5
  93. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  94. package/themes/kiosk/src/types/index.d.ts +1 -0
  95. package/themes/original/index.tsx +22 -0
  96. package/themes/original/src/components/ActiveOrders/index.tsx +15 -132
  97. package/themes/original/src/components/ActiveOrders/styles.tsx +0 -54
  98. package/themes/original/src/components/AddressForm/index.tsx +7 -6
  99. package/themes/original/src/components/AddressList/index.tsx +1 -1
  100. package/themes/original/src/components/AppleLogin/index.tsx +6 -8
  101. package/themes/original/src/components/BusinessBasicInformation/index.tsx +291 -150
  102. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +6 -2
  103. package/themes/original/src/components/BusinessController/index.tsx +179 -96
  104. package/themes/original/src/components/BusinessController/styles.tsx +5 -0
  105. package/themes/original/src/components/BusinessItemAccordion/index.tsx +8 -5
  106. package/themes/original/src/components/BusinessItemAccordion/styles.tsx +3 -1
  107. package/themes/original/src/components/BusinessListingSearch/index.tsx +234 -64
  108. package/themes/original/src/components/BusinessListingSearch/styles.tsx +22 -2
  109. package/themes/original/src/components/BusinessPreorder/index.tsx +1 -1
  110. package/themes/original/src/components/BusinessProductsCategories/index.tsx +2 -2
  111. package/themes/original/src/components/BusinessProductsList/CategoryDescription/index.tsx +44 -0
  112. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +87 -0
  113. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/styles.tsx +12 -0
  114. package/themes/original/src/components/BusinessProductsList/index.tsx +65 -73
  115. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  116. package/themes/original/src/components/BusinessProductsListing/index.tsx +315 -176
  117. package/themes/original/src/components/BusinessProductsListing/styles.tsx +11 -0
  118. package/themes/original/src/components/BusinessReviews/index.tsx +6 -1
  119. package/themes/original/src/components/BusinessTypeFilter/index.tsx +106 -38
  120. package/themes/original/src/components/BusinessTypeFilter/styles.tsx +2 -0
  121. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +560 -0
  122. package/themes/original/src/components/BusinessesListing/{styles.tsx → Layout/Appointment/styles.tsx} +24 -2
  123. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +661 -0
  124. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +137 -0
  125. package/themes/original/src/components/BusinessesListing/index.tsx +104 -462
  126. package/themes/original/src/components/Cart/index.tsx +83 -38
  127. package/themes/original/src/components/Cart/styles.tsx +4 -0
  128. package/themes/original/src/components/Checkout/index.tsx +128 -67
  129. package/themes/original/src/components/Checkout/styles.tsx +0 -1
  130. package/themes/original/src/components/DriverTips/index.tsx +17 -12
  131. package/themes/original/src/components/Favorite/index.tsx +92 -0
  132. package/themes/original/src/components/Favorite/styles.tsx +22 -0
  133. package/themes/original/src/components/FavoriteList/index.tsx +298 -0
  134. package/themes/original/src/components/FavoriteList/styles.tsx +5 -0
  135. package/themes/original/src/components/ForgotPasswordForm/index.tsx +84 -4
  136. package/themes/original/src/components/GPSButton/index.tsx +15 -8
  137. package/themes/original/src/components/GoogleMap/index.tsx +11 -11
  138. package/themes/original/src/components/Help/index.tsx +21 -4
  139. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +18 -1
  140. package/themes/original/src/components/LastOrders/index.tsx +12 -1
  141. package/themes/original/src/components/LoginForm/Otp/index.tsx +91 -0
  142. package/themes/original/src/components/LoginForm/Otp/styles.tsx +7 -0
  143. package/themes/original/src/components/LoginForm/index.tsx +332 -164
  144. package/themes/original/src/components/LoginForm/styles.tsx +1 -3
  145. package/themes/original/src/components/MomentSelector/index.tsx +197 -0
  146. package/themes/original/src/components/MomentSelector/styles.tsx +6 -0
  147. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +243 -0
  148. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/styles.tsx +46 -0
  149. package/themes/original/src/components/MultiCheckout/index.tsx +304 -0
  150. package/themes/original/src/components/MultiCheckout/styles.tsx +59 -0
  151. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +372 -0
  152. package/themes/original/src/components/MultiOrdersDetails/index.tsx +258 -0
  153. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +50 -0
  154. package/themes/original/src/components/MyOrders/index.tsx +132 -27
  155. package/themes/original/src/components/MyOrders/styles.tsx +8 -1
  156. package/themes/original/src/components/NavBar/index.tsx +4 -4
  157. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +167 -0
  158. package/themes/original/src/components/OrderDetails/index.tsx +164 -64
  159. package/themes/original/src/components/OrderDetails/styles.tsx +5 -2
  160. package/themes/original/src/components/OrderItAgain/index.tsx +72 -0
  161. package/themes/original/src/components/OrderItAgain/styles.tsx +10 -0
  162. package/themes/original/src/components/OrderSummary/index.tsx +2 -35
  163. package/themes/original/src/components/OrderTypeSelector/index.tsx +77 -35
  164. package/themes/original/src/components/OrderTypeSelector/styles.tsx +19 -1
  165. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +153 -0
  166. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +6 -0
  167. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +53 -0
  168. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +6 -0
  169. package/themes/original/src/components/OrdersOption/index.tsx +139 -46
  170. package/themes/original/src/components/OrdersOption/styles.tsx +4 -1
  171. package/themes/original/src/components/PaymentOptionCash/index.tsx +2 -2
  172. package/themes/original/src/components/PaymentOptionWallet/index.tsx +15 -22
  173. package/themes/original/src/components/PaymentOptions/index.tsx +57 -37
  174. package/themes/original/src/components/PhoneInputNumber/index.tsx +5 -11
  175. package/themes/original/src/components/PlaceSpot/index.tsx +243 -47
  176. package/themes/original/src/components/PlaceSpot/styles.tsx +0 -2
  177. package/themes/original/src/components/PreviousOrders/index.tsx +18 -147
  178. package/themes/original/src/components/ProductForm/index.tsx +712 -673
  179. package/themes/original/src/components/ProductForm/styles.tsx +9 -7
  180. package/themes/original/src/components/ProductItemAccordion/index.tsx +2 -2
  181. package/themes/original/src/components/ProductOption/index.tsx +1 -1
  182. package/themes/original/src/components/ProductOptionSubOption/index.tsx +13 -9
  183. package/themes/original/src/components/ProfessionalFilter/index.tsx +128 -0
  184. package/themes/original/src/components/ProfessionalFilter/styles.tsx +0 -0
  185. package/themes/original/src/components/ProfessionalProfile/index.tsx +298 -0
  186. package/themes/original/src/components/ProfessionalProfile/styles.tsx +46 -0
  187. package/themes/original/src/components/Promotions/index.tsx +22 -6
  188. package/themes/original/src/components/ReviewDriver/index.tsx +6 -6
  189. package/themes/original/src/components/ReviewOrder/index.tsx +1 -1
  190. package/themes/original/src/components/ReviewTrigger/index.tsx +118 -0
  191. package/themes/original/src/components/ReviewTrigger/styles.tsx +34 -0
  192. package/themes/original/src/components/SearchBar/index.tsx +13 -5
  193. package/themes/original/src/components/ServiceForm/index.tsx +579 -0
  194. package/themes/original/src/components/ServiceForm/styles.tsx +50 -0
  195. package/themes/original/src/components/SignupForm/index.tsx +237 -126
  196. package/themes/original/src/components/SingleOrderCard/index.tsx +316 -0
  197. package/themes/original/src/components/SingleOrderCard/styles.tsx +54 -0
  198. package/themes/original/src/components/SingleProductCard/index.tsx +196 -94
  199. package/themes/original/src/components/SingleProductCard/styles.tsx +2 -2
  200. package/themes/original/src/components/StripeElementsForm/index.tsx +25 -9
  201. package/themes/original/src/components/StripeElementsForm/naked.tsx +2 -2
  202. package/themes/original/src/components/UpsellingProducts/index.tsx +0 -4
  203. package/themes/original/src/components/UserDetails/index.tsx +32 -18
  204. package/themes/original/src/components/UserFormDetails/index.tsx +108 -74
  205. package/themes/original/src/components/UserProfile/index.tsx +5 -1
  206. package/themes/original/src/components/UserProfileForm/index.tsx +15 -10
  207. package/themes/original/src/components/UserVerification/index.tsx +178 -192
  208. package/themes/original/src/components/Wallets/index.tsx +2 -2
  209. package/themes/original/src/components/shared/OBottomPopup.tsx +47 -14
  210. package/themes/original/src/components/shared/OButton.tsx +2 -0
  211. package/themes/original/src/components/shared/OInput.tsx +3 -2
  212. package/themes/original/src/components/shared/OModal.tsx +4 -2
  213. package/themes/original/src/layouts/FloatingBottomContainer.tsx +5 -1
  214. package/themes/original/src/types/index.tsx +208 -44
  215. package/themes/original/src/utils/index.tsx +94 -1
  216. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -8,7 +8,7 @@ import {
8
8
  useValidationFields,
9
9
  } from 'ordering-components/native';
10
10
  import { useTheme } from 'styled-components/native';
11
- import { CContainer, CheckoutAction, Divider } from './styles';
11
+ import { CContainer, CheckoutAction, Divider, DriverTipsContainer } from './styles';
12
12
 
13
13
  import { OSBill, OSTable, OSCoupon, OSTotal, OSRow } from '../OrderSummary/styles';
14
14
 
@@ -25,6 +25,7 @@ import { TaxInformation } from '../TaxInformation';
25
25
  import { CartStoresListing } from '../CartStoresListing';
26
26
  import { OAlert } from '../../../../../src/components/shared'
27
27
  import { PlaceSpot } from '../PlaceSpot'
28
+ import { DriverTips } from '../DriverTips'
28
29
 
29
30
  const CartUI = (props: any) => {
30
31
  const {
@@ -39,7 +40,8 @@ const CartUI = (props: any) => {
39
40
  handleChangeComment,
40
41
  commentState,
41
42
  onNavigationRedirect,
42
- handleRemoveOfferClick
43
+ handleRemoveOfferClick,
44
+ isMultiCheckout
43
45
  } = props
44
46
 
45
47
  const theme = useTheme();
@@ -59,10 +61,16 @@ const CartUI = (props: any) => {
59
61
 
60
62
  const isCartPending = cart?.status === 2
61
63
  const isCouponEnabled = validationFields?.fields?.checkout?.coupon?.enabled
64
+ const isCheckoutMultiBusinessEnabled: Boolean = configs?.checkout_multi_business_enabled?.value === '1'
65
+ const openCarts = (Object.values(orderState?.carts)?.filter((cart: any) => cart?.products && cart?.products?.length && cart?.status !== 2 && cart?.valid_schedule && cart?.valid_products && cart?.valid_address && cart?.valid_maximum && cart?.valid_minimum && !cart?.wallets) || null) || []
62
66
 
63
67
  const business: any = (orderState?.carts && Object.values(orderState.carts).find((_cart: any) => _cart?.uuid === props.cartuuid)) ?? {}
64
68
  const businessId = business?.business_id ?? null
65
- const placeSpotTypes = [3, 4]
69
+ const placeSpotTypes = [4]
70
+
71
+ const driverTipsOptions = typeof configs?.driver_tip_options?.value === 'string'
72
+ ? JSON.parse(configs?.driver_tip_options?.value) || []
73
+ : configs?.driver_tip_options?.value || []
66
74
 
67
75
  const momentFormatted = !orderState?.option?.moment
68
76
  ? t('RIGHT_NOW', 'Right Now')
@@ -96,17 +104,23 @@ const CartUI = (props: any) => {
96
104
  const handleUpsellingPage = () => {
97
105
  setOpenUpselling(false)
98
106
  setCanOpenUpselling(false)
99
- props.onNavigationRedirect('CheckoutNavigator', {
100
- screen: 'CheckoutPage',
101
- cartUuid: cart?.uuid,
102
- businessLogo: cart?.business?.logo,
103
- businessName: cart?.business?.name,
104
- cartTotal: cart?.total
105
- })
107
+ if (isCheckoutMultiBusinessEnabled && openCarts.length > 1) {
108
+ props.onNavigationRedirect('CheckoutNavigator', {
109
+ screen: 'MultiCheckout'
110
+ })
111
+ } else {
112
+ props.onNavigationRedirect('CheckoutNavigator', {
113
+ screen: 'CheckoutPage',
114
+ cartUuid: cart?.uuid,
115
+ businessLogo: cart?.business?.logo,
116
+ businessName: cart?.business?.name,
117
+ cartTotal: cart?.total
118
+ })
119
+ }
106
120
  }
107
121
 
108
122
  const getIncludedTaxes = () => {
109
- if (cart?.taxes === null) {
123
+ if (cart?.taxes === null || !cart?.taxes) {
110
124
  return cart.business.tax_type === 1 ? cart?.tax : 0
111
125
  } else {
112
126
  return cart?.taxes.reduce((taxIncluded: number, tax: any) => {
@@ -165,6 +179,7 @@ const CartUI = (props: any) => {
165
179
  handleChangeStore={() => setOpenChangeStore(true)}
166
180
  handleClickCheckout={() => setOpenUpselling(true)}
167
181
  checkoutButtonDisabled={(openUpselling && !canOpenUpselling) || cart?.subtotal < cart?.minimum || !cart?.valid_address}
182
+ isMultiCheckout={isMultiCheckout}
168
183
  >
169
184
  {cart?.products?.length > 0 && cart?.products.map((product: any, i: number) => (
170
185
  <ProductItemAccordion
@@ -346,13 +361,39 @@ const CartUI = (props: any) => {
346
361
  </OSTable>
347
362
  )}
348
363
 
364
+ {isMultiCheckout &&
365
+ cart &&
366
+ cart?.valid &&
367
+ orderState?.options?.type === 1 &&
368
+ cart?.status !== 2 &&
369
+ validationFields?.fields?.checkout?.driver_tip?.enabled &&
370
+ driverTipsOptions && driverTipsOptions?.length > 0 &&
371
+ (
372
+ <DriverTipsContainer>
373
+ <OText size={14} lineHeight={20} color={theme.colors.textNormal}>
374
+ {t('DRIVER_TIPS', 'Driver Tips')}
375
+ </OText>
376
+ <DriverTips
377
+ uuid={cart?.uuid}
378
+ businessId={cart?.business_id}
379
+ driverTipsOptions={driverTipsOptions}
380
+ isFixedPrice={parseInt(configs?.driver_tip_type?.value, 10) === 1 || !!parseInt(configs?.driver_tip_use_custom?.value, 10)}
381
+ isDriverTipUseCustom={!!parseInt(configs?.driver_tip_use_custom?.value, 10)}
382
+ driverTip={parseInt(configs?.driver_tip_type?.value, 10) === 1 || !!parseInt(configs?.driver_tip_use_custom?.value, 10)
383
+ ? cart?.driver_tip
384
+ : cart?.driver_tip_rate}
385
+ useOrderContext
386
+ />
387
+ </DriverTipsContainer>
388
+ )}
389
+
349
390
  <OSTotal>
350
391
  <OSTable style={{ marginTop: 15 }}>
351
392
  <OText size={14} lineHeight={21} weight={'600'}>
352
393
  {t('TOTAL', 'Total')}
353
394
  </OText>
354
395
  <OText size={14} lineHeight={21} weight={'600'}>
355
- {parsePrice(cart?.total >= 0 ? cart?.total : 0)}
396
+ {parsePrice(cart?.balance >= 0 ? cart?.balance : 0)}
356
397
  </OText>
357
398
  </OSTable>
358
399
  </OSTotal>
@@ -409,36 +450,40 @@ const CartUI = (props: any) => {
409
450
  )}
410
451
  </OSBill>
411
452
  )}
412
- {cart?.valid_products ? (
413
- <CheckoutAction>
414
- <OButton
415
- text={(cart?.subtotal >= cart?.minimum || !cart?.minimum) && cart?.valid_address ? (
416
- !openUpselling !== canOpenUpselling ? t('CHECKOUT', 'Checkout') : t('LOADING', 'Loading')
417
- ) : !cart?.valid_address ? (
418
- `${t('OUT_OF_COVERAGE', 'Out of Coverage')}`
419
- ) : (
420
- `${t('MINIMUN_SUBTOTAL_ORDER', 'Minimum subtotal order:')} ${parsePrice(cart?.minimum)}`
421
- )}
422
- bgColor={(cart?.subtotal < cart?.minimum || !cart?.valid_address) ? theme.colors.secundary : theme.colors.primary}
423
- isDisabled={(openUpselling && !canOpenUpselling) || cart?.subtotal < cart?.minimum || !cart?.valid_address}
424
- borderColor={theme.colors.primary}
425
- imgRightSrc={null}
426
- textStyle={{ color: 'white', textAlign: 'center', flex: 1 }}
427
- onClick={() => setOpenUpselling(true)}
428
- style={{ width: '100%', flexDirection: 'row', justifyContent: 'center', borderRadius: 7.6, shadowOpacity: 0 }}
429
- />
430
- </CheckoutAction>
431
- ) : (
432
- <View style={{ alignItems: 'center', width: '100%' }}>
433
- <OText size={12} color={theme.colors.red} style={{ textAlign: 'center', marginTop: 5 }}>
434
- {t('WARNING_INVALID_PRODUCTS_CHECKOUT', 'To continue with your checkout, please remove from your cart the products that are not available.')}
435
- </OText>
436
- </View>
453
+ {!isMultiCheckout && (
454
+ <>
455
+ {cart?.valid_products ? (
456
+ <CheckoutAction>
457
+ <OButton
458
+ text={(cart?.subtotal >= cart?.minimum || !cart?.minimum) && cart?.valid_address ? (
459
+ !openUpselling !== canOpenUpselling ? t('CHECKOUT', 'Checkout') : t('LOADING', 'Loading')
460
+ ) : !cart?.valid_address ? (
461
+ `${t('OUT_OF_COVERAGE', 'Out of Coverage')}`
462
+ ) : (
463
+ `${t('MINIMUN_SUBTOTAL_ORDER', 'Minimum subtotal order:')} ${parsePrice(cart?.minimum)}`
464
+ )}
465
+ bgColor={(cart?.subtotal < cart?.minimum || !cart?.valid_address) ? theme.colors.secundary : theme.colors.primary}
466
+ isDisabled={(openUpselling && !canOpenUpselling) || cart?.subtotal < cart?.minimum || !cart?.valid_address}
467
+ borderColor={theme.colors.primary}
468
+ imgRightSrc={null}
469
+ textStyle={{ color: 'white', textAlign: 'center', flex: 1 }}
470
+ onClick={() => setOpenUpselling(true)}
471
+ style={{ width: '100%', flexDirection: 'row', justifyContent: 'center', borderRadius: 7.6, shadowOpacity: 0 }}
472
+ />
473
+ </CheckoutAction>
474
+ ) : (
475
+ <View style={{ alignItems: 'center', width: '100%' }}>
476
+ <OText size={12} color={theme.colors.red} style={{ textAlign: 'center', marginTop: 5 }}>
477
+ {t('WARNING_INVALID_PRODUCTS_CHECKOUT', 'To continue with your checkout, please remove from your cart the products that are not available.')}
478
+ </OText>
479
+ </View>
480
+ )}
481
+ </>
437
482
  )}
438
483
  </BusinessItemAccordion>
439
484
 
440
485
  <OModal
441
- open={openChangeStore && props.isFranchiseApp}
486
+ open={openChangeStore}
442
487
  entireModal
443
488
  customClose
444
489
  onClose={() => setOpenChangeStore(false)}
@@ -33,3 +33,7 @@ export const Divider = styled.View`
33
33
  margin-top: 5px;
34
34
  margin-bottom: 10px;
35
35
  `
36
+
37
+ export const DriverTipsContainer = styled.View`
38
+ padding: 5px 0;
39
+ `
@@ -24,6 +24,7 @@ import { DriverTips } from '../DriverTips';
24
24
  import { NotFoundSource } from '../NotFoundSource';
25
25
  import { UserDetails } from '../UserDetails';
26
26
  import { PaymentOptionWallet } from '../PaymentOptionWallet';
27
+ import { PlaceSpot } from '../PlaceSpot'
27
28
 
28
29
  import {
29
30
  ChContainer,
@@ -105,15 +106,21 @@ const CheckoutUI = (props: any) => {
105
106
  padding: 20
106
107
  },
107
108
  pagePadding: {
108
- paddingLeft: 40,
109
- paddingRight: 40
109
+ paddingHorizontal: 40
110
110
  },
111
111
  icon: {
112
112
  top: 15,
113
113
  right: Platform.OS === 'ios' ? 5 : (I18nManager.isRTL ? 30 : 0),
114
114
  position: 'absolute',
115
115
  fontSize: 20
116
- }
116
+ },
117
+ detailWrapper: {
118
+ paddingHorizontal: 40,
119
+ width: '100%'
120
+ },
121
+ wrapperNavbar: Platform.OS === 'ios'
122
+ ? { paddingVertical: 0, paddingHorizontal: 40 }
123
+ : { paddingVertical: 20, paddingHorizontal: 40 }
117
124
  })
118
125
 
119
126
  const [, { showToast }] = useToast();
@@ -133,11 +140,25 @@ const CheckoutUI = (props: any) => {
133
140
  const [isDeliveryOptionModalVisible, setIsDeliveryOptionModalVisible] = useState(false)
134
141
  const [showGateway, setShowGateway] = useState<any>({ closedByUsed: false, open: false });
135
142
  const [webviewPaymethod, setWebviewPaymethod] = useState<any>(null)
136
-
137
- const placeSpotTypes = [3, 4]
138
- const isWalletEnabled = configs?.wallet_enabled?.value === '1' && (configs?.wallet_cash_enabled?.value === '1' || configs?.wallet_credit_point_enabled?.value === '1')
143
+ const [isOpen, setIsOpen] = useState(false)
144
+ const [requiredFields, setRequiredFields] = useState<any>([])
145
+
146
+ const placeSpotTypes = [3, 4, 5]
147
+ const placeSpotsEnabled = placeSpotTypes.includes(options?.type)
148
+ const businessConfigs = businessDetails?.business?.configs ?? []
149
+ const isWalletCashEnabled = businessConfigs.find((config: any) => config.key === 'wallet_cash_enabled')?.value === '1'
150
+ const isWalletCreditPointsEnabled = businessConfigs.find((config: any) => config.key === 'wallet_credit_point_enabled')?.value === '1'
151
+ const isWalletEnabled = configs?.cash_wallet?.value && configs?.wallet_enabled?.value === '1' && (isWalletCashEnabled || isWalletCreditPointsEnabled)
152
+ const isBusinessChangeEnabled = configs?.cart_change_business_validation?.value === '1'
153
+
139
154
  const isPreOrder = configs?.preorder_status_enabled?.value === '1'
140
- const isDisabledButtonPlace = loading || !cart?.valid || (!paymethodSelected && cart?.balance > 0) || placing || errorCash || cart?.subtotal < cart?.minimum || (placeSpotTypes.includes(options?.type) && !cart?.place)
155
+ const isDisabledButtonPlace = loading || !cart?.valid || (!paymethodSelected && cart?.balance > 0) ||
156
+ placing || errorCash || cart?.subtotal < cart?.minimum ||
157
+ // (placeSpotTypes.includes(options?.type) && !cart?.place) ||
158
+ (options.type === 1 &&
159
+ validationFields?.fields?.checkout?.driver_tip?.enabled &&
160
+ validationFields?.fields?.checkout?.driver_tip?.required &&
161
+ (Number(cart?.driver_tip) <= 0))
141
162
 
142
163
  const driverTipsOptions = typeof configs?.driver_tip_options?.value === 'string'
143
164
  ? JSON.parse(configs?.driver_tip_options?.value) || []
@@ -159,9 +180,13 @@ const CheckoutUI = (props: any) => {
159
180
  }
160
181
  }
161
182
 
162
- const handlePlaceOrder = () => {
163
- if (!userErrors.length) {
164
- handlerClickPlaceOrder && handlerClickPlaceOrder()
183
+ const handlePlaceOrder = (confirmPayment: any) => {
184
+ if (!userErrors.length && !requiredFields?.length) {
185
+ handlerClickPlaceOrder && handlerClickPlaceOrder(null, null, confirmPayment)
186
+ return
187
+ }
188
+ if (requiredFields?.length) {
189
+ setIsOpen(true)
165
190
  return
166
191
  }
167
192
  let stringError = ''
@@ -191,11 +216,12 @@ const CheckoutUI = (props: any) => {
191
216
  setUserErrors([])
192
217
  const errors = []
193
218
  const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes']
219
+ const _requiredFields: any = []
194
220
 
195
221
  Object.values(validationFields?.fields?.checkout).map((field: any) => {
196
- if (field?.required && !notFields.includes(field.code)) {
222
+ if (field?.required && !notFields.includes(field.code) && field?.enabled) {
197
223
  if (!user[field?.code]) {
198
- errors.push(t(`VALIDATION_ERROR_${field.code.toUpperCase()}_REQUIRED`, `The field ${field?.name} is required`))
224
+ _requiredFields.push(field?.code)
199
225
  }
200
226
  }
201
227
  })
@@ -206,8 +232,9 @@ const CheckoutUI = (props: any) => {
206
232
  validationFields?.fields?.checkout?.cellphone?.required) ||
207
233
  configs?.verification_phone_required?.value === '1')
208
234
  ) {
209
- errors.push(t('VALIDATION_ERROR_MOBILE_PHONE_REQUIRED', 'The field Phone number is required'))
235
+ _requiredFields.push('cellphone')
210
236
  }
237
+ setRequiredFields(_requiredFields)
211
238
 
212
239
  if (phoneUpdate) {
213
240
  errors.push(t('NECESSARY_UPDATE_COUNTRY_PHONE_CODE', 'It is necessary to update your phone number'))
@@ -239,7 +266,7 @@ const CheckoutUI = (props: any) => {
239
266
 
240
267
  useEffect(() => {
241
268
  if (cart?.products?.length === 0) {
242
- navigation?.canGoBack() && navigation.goBack();
269
+ onNavigationRedirect('Business', { store: cart?.business?.slug, header: null, logo: null })
243
270
  }
244
271
  }, [cart?.products])
245
272
 
@@ -250,13 +277,18 @@ const CheckoutUI = (props: any) => {
250
277
  return (
251
278
  <>
252
279
  <Container noPadding>
253
- <NavBar
254
- isVertical
255
- onActionLeft={() => navigation?.canGoBack() && navigation.goBack()}
256
- title={t('CHECKOUT', 'Checkout')}
257
- titleStyle={{ marginLeft: 0, marginRight: 0, paddingLeft: 40 }}
258
- btnStyle={{ marginLeft: 40, padding: 40 }}
259
- />
280
+ <View style={styles.wrapperNavbar}>
281
+ <NavBar
282
+ title={t('CHECKOUT', 'Checkout')}
283
+ titleAlign={'center'}
284
+ onActionLeft={() => navigation?.canGoBack() && navigation.goBack()}
285
+ showCall={false}
286
+ btnStyle={{ paddingLeft: 0 }}
287
+ style={{ marginTop: Platform.OS === 'ios' ? 0 : 30 }}
288
+ titleWrapStyle={{ paddingHorizontal: 0 }}
289
+ titleStyle={{ marginRight: 0, marginLeft: 0 }}
290
+ />
291
+ </View>
260
292
  <ChContainer style={styles.pagePadding}>
261
293
  <ChSection style={{ paddingTop: 0 }}>
262
294
  <ChHeader>
@@ -297,10 +329,10 @@ const CheckoutUI = (props: any) => {
297
329
  !businessDetails?.error &&
298
330
  (
299
331
  <Placeholder Animation={Fade}>
300
- <PlaceholderLine height={20} width={70} />
301
- <PlaceholderLine height={10} width={60} />
302
- <PlaceholderLine height={10} width={60} />
303
- <PlaceholderLine height={10} width={80} style={{ marginBottom: 20 }} />
332
+ <PlaceholderLine height={20} />
333
+ <PlaceholderLine height={12} />
334
+ <PlaceholderLine height={12} />
335
+ <PlaceholderLine height={12} style={{ marginBottom: 20 }} />
304
336
  </Placeholder>
305
337
  )}
306
338
  {
@@ -346,10 +378,10 @@ const CheckoutUI = (props: any) => {
346
378
  <ChUserDetails>
347
379
  {cartState.loading ? (
348
380
  <Placeholder Animation={Fade}>
349
- <PlaceholderLine height={20} width={70} />
350
- <PlaceholderLine height={10} width={60} />
351
- <PlaceholderLine height={10} width={60} />
352
- <PlaceholderLine height={10} width={80} style={{ marginBottom: 20 }} />
381
+ <PlaceholderLine height={20} />
382
+ <PlaceholderLine height={12} />
383
+ <PlaceholderLine height={12} />
384
+ <PlaceholderLine height={12} style={{ marginBottom: 20 }} />
353
385
  </Placeholder>
354
386
  ) : (
355
387
  <UserDetails
@@ -373,8 +405,8 @@ const CheckoutUI = (props: any) => {
373
405
  {cartState.loading || deliveryOptionSelected === undefined ? (
374
406
  <View style={{ height: 110 }}>
375
407
  <Placeholder Animation={Fade}>
376
- <PlaceholderLine height={20} width={70} />
377
- <PlaceholderLine height={40} width={100} />
408
+ <PlaceholderLine height={20} />
409
+ <PlaceholderLine height={40} />
378
410
  </Placeholder>
379
411
  </View>
380
412
  ) : (
@@ -565,6 +597,20 @@ const CheckoutUI = (props: any) => {
565
597
  )}
566
598
 
567
599
 
600
+ {!cartState.loading && placeSpotsEnabled && (
601
+ <>
602
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 30, marginHorizontal: -40 }} />
603
+ <PlaceSpot
604
+ isCheckout
605
+ isInputMode
606
+ cart={cart}
607
+ spotNumberDefault={cartState?.cart?.spot_number ?? cart?.spot_number}
608
+ vehicleDefault={cart?.vehicle}
609
+ />
610
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginHorizontal: -40 }} />
611
+ </>
612
+ )}
613
+
568
614
  {!cartState.loading && cart && (
569
615
  <ChSection>
570
616
  <ChCart>
@@ -597,23 +643,26 @@ const CheckoutUI = (props: any) => {
597
643
  </OText>
598
644
  </TouchableOpacity>
599
645
  </CartHeader>
600
- <TouchableOpacity
601
- onPress={() => setOpenChangeStore(true)}
602
- style={{ alignSelf: 'flex-start' }}
603
- >
604
- <OText
605
- size={12}
606
- lineHeight={18}
607
- color={theme.colors.textSecondary}
608
- style={{ textDecorationLine: 'underline' }}
646
+ {isBusinessChangeEnabled && (
647
+ <TouchableOpacity
648
+ onPress={() => setOpenChangeStore(true)}
649
+ style={{ alignSelf: 'flex-start' }}
609
650
  >
610
- {t('CHANGE_STORE', 'Change store')}
611
- </OText>
612
- </TouchableOpacity>
651
+ <OText
652
+ size={12}
653
+ lineHeight={18}
654
+ color={theme.colors.textSecondary}
655
+ style={{ textDecorationLine: 'underline' }}
656
+ >
657
+ {t('CHANGE_STORE', 'Change store')}
658
+ </OText>
659
+ </TouchableOpacity>
660
+ )}
613
661
  <OrderSummary
614
662
  cart={cart}
615
663
  isCartPending={cart?.status === 2}
616
664
  onNavigationRedirect={onNavigationRedirect}
665
+ placeSpotTypes={placeSpotTypes}
617
666
  />
618
667
  </>
619
668
  )}
@@ -623,7 +672,7 @@ const CheckoutUI = (props: any) => {
623
672
 
624
673
  {!cartState.loading && cart && (
625
674
  <View>
626
- <ChErrors style={{ marginBottom: 0 }}>
675
+ <ChErrors style={{ marginBottom: 10 }}>
627
676
  {!cart?.valid_address && cart?.status !== 2 && (
628
677
  <OText
629
678
  color={theme.colors.error}
@@ -650,14 +699,17 @@ const CheckoutUI = (props: any) => {
650
699
  {t('WARNING_INVALID_PRODUCTS_CHECKOUT', 'To continue with your checkout, please remove from your cart the products that are not available.')}
651
700
  </OText>
652
701
  )}
653
- {placeSpotTypes.includes(options?.type) && !cart?.place && (
654
- <OText
655
- color={theme.colors.error}
656
- size={12}
657
- >
658
- {t('WARNING_PLACE_SPOT', 'Please, select your spot to place order.')}
659
- </OText>
660
- )}
702
+ {options.type === 1 &&
703
+ validationFields?.fields?.checkout?.driver_tip?.enabled &&
704
+ validationFields?.fields?.checkout?.driver_tip?.required &&
705
+ (Number(cart?.driver_tip) <= 0) && (
706
+ <OText
707
+ color={theme.colors.error}
708
+ size={12}
709
+ >
710
+ {t('WARNING_INVALID_DRIVER_TIP', 'Driver Tip is required.')}
711
+ </OText>
712
+ )}
661
713
  </ChErrors>
662
714
  </View>
663
715
  )}
@@ -672,11 +724,33 @@ const CheckoutUI = (props: any) => {
672
724
  onClose={() => setOpenChangeStore(false)}
673
725
  />
674
726
  </OModal>
727
+ <OModal
728
+ open={isOpen}
729
+ onClose={() => setIsOpen(false)}
730
+ >
731
+ <View style={styles.detailWrapper}>
732
+ <UserDetails
733
+ isUserDetailsEdit
734
+ cartStatus={cart?.status}
735
+ businessId={cart?.business_id}
736
+ useValidationFields
737
+ useDefualtSessionManager
738
+ useSessionUser
739
+ isCheckout
740
+ isEdit
741
+ phoneUpdate={phoneUpdate}
742
+ togglePhoneUpdate={togglePhoneUpdate}
743
+ requiredFields={requiredFields}
744
+ hideUpdateButton
745
+ onClose={() => setIsOpen(false)}
746
+ />
747
+ </View>
748
+ </OModal>
675
749
  </ChContainer>
676
750
  </Container>
677
751
  {!cartState.loading && cart && cart?.status !== 2 && (
678
752
  <FloatingButton
679
- handleClick={() => handlePlaceOrder()}
753
+ handleClick={() => handlePlaceOrder(null)}
680
754
  isSecondaryBtn={isDisabledButtonPlace}
681
755
  disabled={isDisabledButtonPlace}
682
756
  btnText={cart?.subtotal >= cart?.minimum
@@ -690,7 +764,7 @@ const CheckoutUI = (props: any) => {
690
764
  : (`${t('MINIMUN_SUBTOTAL_ORDER', 'Minimum subtotal order:')} ${parsePrice(cart?.minimum)}`)
691
765
  }
692
766
  btnRightValueShow
693
- btnRightValue={parsePrice(cart?.total)}
767
+ btnRightValue={parsePrice(cart?.balance)}
694
768
  iosBottom={30}
695
769
  />
696
770
  )}
@@ -706,19 +780,6 @@ const CheckoutUI = (props: any) => {
706
780
  setShowGateway={setShowGateway}
707
781
  />
708
782
  )}
709
- {webviewPaymethod?.gateway === 'square' && showGateway.open && (
710
- <PaymentOptionsWebView
711
- onNavigationRedirect={onNavigationRedirect}
712
- uri={`https://test-square-f50f7.web.app`}
713
- user={user}
714
- token={token}
715
- cart={cart}
716
- currency={currency}
717
- webviewPaymethod={webviewPaymethod}
718
- setShowGateway={setShowGateway}
719
- locationId={'L1NGAY5M6KJRX'}
720
- />
721
- )}
722
783
  </>
723
784
  )
724
785
  }
@@ -76,7 +76,6 @@ export const ChCart = styled(ChPaymethods)``
76
76
 
77
77
  export const WalletPaymentOptionContainer = styled(ChPaymethods)`
78
78
  padding-bottom: 0;
79
- margin-left: -20px;
80
79
  `
81
80
 
82
81
  export const ChPlaceOrderBtn = styled.View`
@@ -48,22 +48,28 @@ const DriverTipsUI = (props: any) => {
48
48
  }
49
49
  })
50
50
 
51
- const [value, setvalue] = useState(0);
51
+ const [value, setvalue] = useState('');
52
52
 
53
53
  const placeholderCurrency = (configs?.currency_position?.value || 'left') === 'left'
54
54
  ? `${configs?.format_number_currency?.value}0`
55
55
  : `0${configs?.format_number_currency?.value}`
56
56
 
57
57
  const handleChangeDriverTip = (val: any) => {
58
- let tip = parseFloat(val)
59
- tip = isNaN(tip) ? 0 : tip
60
- setvalue(tip)
58
+ const tip = Number(val)
59
+ if ((isNaN(tip) || tip < 0)) {
60
+ setvalue(value)
61
+ return
62
+ }
63
+ setvalue(val)
61
64
  }
62
-
65
+
63
66
  return (
64
67
  <DTContainer>
68
+ <DTLabel>
69
+ {t('CUSTOM_DRIVER_TIP_MESSAGE', '100% of these tips go directly to your driver')}
70
+ </DTLabel>
65
71
  <DTWrapperTips>
66
- {driverTipsOptions.map((option: any, i: number) => (
72
+ {!isDriverTipUseCustom && driverTipsOptions.map((option: any, i: number) => (
67
73
  <TouchableOpacity
68
74
  key={i}
69
75
  onPress={() => handlerChangeOption(option)}
@@ -79,7 +85,7 @@ const DriverTipsUI = (props: any) => {
79
85
  </TouchableOpacity>
80
86
  ))}
81
87
  </DTWrapperTips>
82
- {!driverTipsOptions.includes(driverTip) && driverTip > 0 && (
88
+ {(!isDriverTipUseCustom && !driverTipsOptions.includes(driverTip) && driverTip > 0) && (
83
89
  <OText
84
90
  color={theme.colors.error}
85
91
  size={16}
@@ -90,13 +96,12 @@ const DriverTipsUI = (props: any) => {
90
96
  )}
91
97
  {isDriverTipUseCustom && (
92
98
  <DTForm>
93
- <DTLabel>
94
- {t('CUSTOM_DRIVER_TIP_MESSAGE', '100% of these tips go directly to your driver')}
95
- </DTLabel>
96
99
  <DTWrapperInput>
97
100
  <OInput
98
101
  placeholder={placeholderCurrency}
99
102
  style={style.inputStyle}
103
+ value={value}
104
+ type={'numeric'}
100
105
  onChange={handleChangeDriverTip}
101
106
  autoCapitalize='none'
102
107
  autoCorrect={false}
@@ -108,10 +113,10 @@ const DriverTipsUI = (props: any) => {
108
113
  textStyle={{ color: 'white', fontSize: 14 }}
109
114
  imgRightSrc={null}
110
115
  style={{ borderRadius: 5, height: 44 }}
111
- isDisabled={!(value > 0 && value !== driverTip) || !value}
116
+ isDisabled={parseFloat(value || '0') < 0 || parseFloat(value || '0') === driverTip || value === ''}
112
117
  onClick={() => {
113
118
  handlerChangeOption(value)
114
- setvalue(0)
119
+ setvalue('')
115
120
  }}
116
121
  />
117
122
  </DTWrapperInput>