ordering-ui-react-native 0.17.66 → 0.17.67-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 (207) hide show
  1. package/package.json +8 -7
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessInformation/index.tsx +10 -9
  4. package/src/components/BusinessesListing/index.tsx +1 -1
  5. package/src/components/OrderCreating/index.tsx +1 -21
  6. package/src/components/PaymentOptionsWebView/index.tsx +29 -8
  7. package/src/components/PhoneInputNumber/index.tsx +6 -2
  8. package/src/components/StripeMethodForm/index.tsx +136 -102
  9. package/src/components/VerifyPhone/styles.tsx +1 -2
  10. package/src/components/shared/OToast.tsx +2 -1
  11. package/src/types/index.tsx +5 -0
  12. package/src/utils/index.tsx +5 -0
  13. package/themes/business/index.tsx +2 -0
  14. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +270 -245
  15. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -4
  16. package/themes/business/src/components/BusinessController/index.tsx +0 -1
  17. package/themes/business/src/components/Chat/index.tsx +123 -111
  18. package/themes/business/src/components/DriverMap/index.tsx +17 -6
  19. package/themes/business/src/components/DriverSchedule/index.tsx +42 -5
  20. package/themes/business/src/components/GoogleMap/index.tsx +58 -57
  21. package/themes/business/src/components/LoginForm/Otp/index.tsx +31 -3
  22. package/themes/business/src/components/LoginForm/index.tsx +15 -22
  23. package/themes/business/src/components/MapView/index.tsx +10 -10
  24. package/themes/business/src/components/NewOrderNotification/index.tsx +35 -21
  25. package/themes/business/src/components/NotFoundSource/index.tsx +2 -2
  26. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  27. package/themes/business/src/components/OrderDetails/Delivery.tsx +191 -6
  28. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +133 -65
  29. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +64 -63
  30. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +195 -0
  31. package/themes/business/src/components/OrderDetailsLogistic/styles.tsx +5 -0
  32. package/themes/business/src/components/OrderMessage/index.tsx +19 -18
  33. package/themes/business/src/components/OrderSummary/index.tsx +114 -123
  34. package/themes/business/src/components/OrdersOption/index.tsx +32 -75
  35. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +249 -0
  36. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +115 -0
  37. package/themes/business/src/components/PreviousOrders/index.tsx +444 -242
  38. package/themes/business/src/components/PreviousOrders/styles.tsx +31 -3
  39. package/themes/business/src/components/ProductItemAccordion/index.tsx +27 -3
  40. package/themes/business/src/components/ReviewCustomer/index.tsx +30 -15
  41. package/themes/business/src/components/StoresList/index.tsx +3 -4
  42. package/themes/business/src/components/UserProfileForm/index.tsx +11 -13
  43. package/themes/business/src/components/shared/OLink.tsx +33 -13
  44. package/themes/business/src/components/shared/OModal.tsx +16 -9
  45. package/themes/business/src/components/shared/OText.tsx +8 -2
  46. package/themes/business/src/types/index.tsx +28 -12
  47. package/themes/business/src/utils/index.tsx +29 -2
  48. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  49. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  50. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  51. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  52. package/themes/kiosk/src/components/Intro/index.tsx +16 -1
  53. package/themes/kiosk/src/components/LoginForm/index.tsx +7 -9
  54. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  55. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  56. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  57. package/themes/kiosk/src/components/PhoneInputNumber/index.tsx +2 -2
  58. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  59. package/themes/original/index.tsx +4 -0
  60. package/themes/original/src/components/AddressDetails/index.tsx +19 -3
  61. package/themes/original/src/components/AddressForm/index.tsx +61 -39
  62. package/themes/original/src/components/AddressList/index.tsx +27 -22
  63. package/themes/original/src/components/AddressList/styles.tsx +4 -2
  64. package/themes/original/src/components/AnalyticsSegment/index.tsx +193 -10
  65. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  66. package/themes/original/src/components/AppleLogin/styles.tsx +3 -1
  67. package/themes/original/src/components/BusinessBasicInformation/index.tsx +153 -96
  68. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +10 -12
  69. package/themes/original/src/components/BusinessController/index.tsx +94 -66
  70. package/themes/original/src/components/BusinessController/styles.tsx +22 -3
  71. package/themes/original/src/components/BusinessFeaturedController/index.tsx +21 -54
  72. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +8 -0
  73. package/themes/original/src/components/BusinessInformation/index.tsx +142 -109
  74. package/themes/original/src/components/BusinessItemAccordion/index.tsx +15 -20
  75. package/themes/original/src/components/BusinessListingSearch/index.tsx +349 -339
  76. package/themes/original/src/components/BusinessListingSearch/styles.tsx +0 -18
  77. package/themes/original/src/components/BusinessPreorder/index.tsx +103 -19
  78. package/themes/original/src/components/BusinessProductsCategories/index.tsx +1 -2
  79. package/themes/original/src/components/BusinessProductsList/index.tsx +15 -7
  80. package/themes/original/src/components/BusinessProductsList/styles.tsx +8 -3
  81. package/themes/original/src/components/BusinessProductsListing/UpsellingRedirect.tsx +1 -1
  82. package/themes/original/src/components/BusinessProductsListing/index.tsx +684 -555
  83. package/themes/original/src/components/BusinessProductsListing/styles.tsx +2 -2
  84. package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
  85. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +1 -1
  86. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +69 -38
  87. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +0 -1
  88. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  89. package/themes/original/src/components/Cart/index.tsx +77 -50
  90. package/themes/original/src/components/CartContent/index.tsx +117 -20
  91. package/themes/original/src/components/CartContent/styles.tsx +17 -7
  92. package/themes/original/src/components/Checkout/index.tsx +356 -124
  93. package/themes/original/src/components/CitiesControl/index.tsx +1 -1
  94. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  95. package/themes/original/src/components/DriverTips/index.tsx +52 -34
  96. package/themes/original/src/components/FacebookLogin/styles.tsx +3 -1
  97. package/themes/original/src/components/Favorite/index.tsx +8 -9
  98. package/themes/original/src/components/Favorite/styles.tsx +1 -1
  99. package/themes/original/src/components/FavoriteList/index.tsx +1 -35
  100. package/themes/original/src/components/FloatingButton/index.tsx +1 -2
  101. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  102. package/themes/original/src/components/GPSButton/index.tsx +6 -4
  103. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +96 -0
  104. package/themes/original/src/components/GiftCard/GiftCardUI/styles.tsx +5 -0
  105. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +100 -0
  106. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +8 -0
  107. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +191 -0
  108. package/themes/original/src/components/GiftCard/RedeemGiftCard/styles.tsx +8 -0
  109. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +165 -0
  110. package/themes/original/src/components/GiftCard/SendGiftCard/styles.tsx +9 -0
  111. package/themes/original/src/components/GoogleLogin/styles.tsx +1 -1
  112. package/themes/original/src/components/GoogleMap/index.tsx +60 -5
  113. package/themes/original/src/components/Help/index.tsx +8 -8
  114. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +10 -31
  115. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +5 -3
  116. package/themes/original/src/components/HelpGuide/index.tsx +6 -6
  117. package/themes/original/src/components/HelpGuide/styles.tsx +6 -0
  118. package/themes/original/src/components/HelpOrder/index.tsx +6 -15
  119. package/themes/original/src/components/HelpOrder/styles.tsx +8 -1
  120. package/themes/original/src/components/Home/index.tsx +13 -4
  121. package/themes/original/src/components/LastOrder/index.tsx +1 -34
  122. package/themes/original/src/components/LoginForm/Otp/index.tsx +91 -31
  123. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  124. package/themes/original/src/components/LoginForm/index.tsx +64 -34
  125. package/themes/original/src/components/LottieAnimation/index.tsx +89 -55
  126. package/themes/original/src/components/MessageListing/index.tsx +16 -42
  127. package/themes/original/src/components/Messages/index.tsx +29 -7
  128. package/themes/original/src/components/MomentOption/index.tsx +195 -90
  129. package/themes/original/src/components/MomentSelector/index.tsx +1 -1
  130. package/themes/original/src/components/MultiCart/index.tsx +50 -0
  131. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +162 -51
  132. package/themes/original/src/components/MultiCheckout/index.tsx +330 -99
  133. package/themes/original/src/components/MultiCheckout/styles.tsx +3 -1
  134. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +37 -224
  135. package/themes/original/src/components/MultiOrdersDetails/index.tsx +68 -21
  136. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
  137. package/themes/original/src/components/MyOrders/index.tsx +40 -29
  138. package/themes/original/src/components/NavBar/index.tsx +20 -17
  139. package/themes/original/src/components/NotFoundSource/index.tsx +14 -10
  140. package/themes/original/src/components/Notifications/index.tsx +46 -50
  141. package/themes/original/src/components/Notifications/styles.tsx +6 -3
  142. package/themes/original/src/components/OrderDetails/OrderEta.tsx +76 -0
  143. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +21 -5
  144. package/themes/original/src/components/OrderDetails/index.tsx +191 -363
  145. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  146. package/themes/original/src/components/OrderItAgain/index.tsx +3 -1
  147. package/themes/original/src/components/OrderProgress/index.tsx +30 -56
  148. package/themes/original/src/components/OrderSummary/index.tsx +88 -59
  149. package/themes/original/src/components/OrderTypeSelector/index.tsx +2 -1
  150. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +14 -14
  151. package/themes/original/src/components/OrdersOption/index.tsx +78 -67
  152. package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
  153. package/themes/original/src/components/PageBanner/index.tsx +98 -38
  154. package/themes/original/src/components/PageBanner/styles.tsx +0 -10
  155. package/themes/original/src/components/PaymentOptionCard/index.tsx +180 -0
  156. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +1 -1
  157. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  158. package/themes/original/src/components/PaymentOptions/index.tsx +78 -35
  159. package/themes/original/src/components/PhoneInputNumber/index.tsx +3 -3
  160. package/themes/original/src/components/ProductForm/index.tsx +105 -30
  161. package/themes/original/src/components/ProductForm/styles.tsx +5 -5
  162. package/themes/original/src/components/ProductItemAccordion/index.tsx +14 -11
  163. package/themes/original/src/components/ProductOptionSubOption/index.tsx +20 -18
  164. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +5 -9
  165. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  166. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -50
  167. package/themes/original/src/components/ProfessionalProfile/index.tsx +36 -7
  168. package/themes/original/src/components/Promotions/index.tsx +5 -4
  169. package/themes/original/src/components/Promotions/styles.tsx +3 -1
  170. package/themes/original/src/components/ReviewOrder/index.tsx +26 -9
  171. package/themes/original/src/components/ReviewOrder/styles.tsx +7 -0
  172. package/themes/original/src/components/ReviewProducts/index.tsx +16 -7
  173. package/themes/original/src/components/ReviewTrigger/index.tsx +27 -9
  174. package/themes/original/src/components/ReviewTrigger/styles.tsx +8 -1
  175. package/themes/original/src/components/ScheduleAccordion/index.tsx +68 -0
  176. package/themes/original/src/components/ScheduleAccordion/styles.tsx +14 -0
  177. package/themes/original/src/components/ServiceForm/index.tsx +66 -17
  178. package/themes/original/src/components/Sessions/index.tsx +11 -8
  179. package/themes/original/src/components/Sessions/styles.tsx +5 -0
  180. package/themes/original/src/components/SignupForm/index.tsx +43 -27
  181. package/themes/original/src/components/SingleOrderCard/index.tsx +130 -56
  182. package/themes/original/src/components/SingleOrderCard/styles.tsx +11 -2
  183. package/themes/original/src/components/SingleProductCard/index.tsx +72 -31
  184. package/themes/original/src/components/SingleProductCard/styles.tsx +20 -4
  185. package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
  186. package/themes/original/src/components/StripeCardsList/index.tsx +49 -5
  187. package/themes/original/src/components/StripeElementsForm/index.tsx +48 -34
  188. package/themes/original/src/components/StripeElementsForm/naked.tsx +12 -1
  189. package/themes/original/src/components/UpsellingProducts/index.tsx +238 -224
  190. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  191. package/themes/original/src/components/UserDetails/index.tsx +3 -1
  192. package/themes/original/src/components/UserFormDetails/index.tsx +76 -7
  193. package/themes/original/src/components/UserFormDetails/styles.tsx +1 -1
  194. package/themes/original/src/components/UserProfile/index.tsx +88 -79
  195. package/themes/original/src/components/UserProfileForm/index.tsx +27 -29
  196. package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
  197. package/themes/original/src/components/UserVerification/index.tsx +52 -49
  198. package/themes/original/src/components/WalletTransactionItem/index.tsx +2 -2
  199. package/themes/original/src/components/WalletTransactions/index.tsx +3 -3
  200. package/themes/original/src/components/Wallets/index.tsx +66 -30
  201. package/themes/original/src/components/Wallets/styles.tsx +3 -4
  202. package/themes/original/src/components/shared/OButton.tsx +6 -2
  203. package/themes/original/src/components/shared/OInput.tsx +6 -1
  204. package/themes/original/src/components/shared/OModal.tsx +3 -3
  205. package/themes/original/src/types/index.tsx +42 -10
  206. package/themes/original/src/utils/index.tsx +273 -1
  207. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -7,7 +7,7 @@ import {
7
7
  useValidationFields,
8
8
  useSession,
9
9
  useToast,
10
- ToastType,
10
+ ToastType,
11
11
  MultiCheckout as MultiCheckoutController
12
12
  } from 'ordering-components/native'
13
13
  import { View, StyleSheet, Platform } from 'react-native'
@@ -18,9 +18,14 @@ import { OText, OIcon, OModal } from '../shared';
18
18
  import { getTypesText } from '../../utils';
19
19
  import { UserDetails } from '../UserDetails'
20
20
  import { AddressDetails } from '../AddressDetails'
21
+ import { MultiCart as MultiCartController } from '../MultiCart'
21
22
  import { MultiCartsPaymethodsAndWallets } from '../MultiCartsPaymethodsAndWallets'
22
23
  import { Cart } from '../Cart'
23
24
  import { FloatingButton } from '../FloatingButton'
25
+ import { DriverTips } from '../DriverTips'
26
+ import { CouponControl } from '../CouponControl';
27
+ import { DriverTipsContainer } from '../Cart/styles'
28
+ import { OSTable, OSCoupon } from '../OrderSummary/styles';
24
29
 
25
30
  import {
26
31
  ChContainer,
@@ -36,11 +41,11 @@ import {
36
41
  } from './styles'
37
42
 
38
43
  const mapConfigs = {
39
- mapZoom: 16,
40
- mapSize: {
41
- width: 640,
42
- height: 190
43
- }
44
+ mapZoom: 16,
45
+ mapSize: {
46
+ width: 640,
47
+ height: 190
48
+ }
44
49
  }
45
50
 
46
51
  const MultiCheckoutUI = (props: any) => {
@@ -48,121 +53,209 @@ const MultiCheckoutUI = (props: any) => {
48
53
  navigation,
49
54
  placing,
50
55
  openCarts,
51
- totalCartsPrice,
52
56
  handleGroupPlaceOrder,
53
57
  paymethodSelected,
54
58
  handleSelectPaymethod,
55
59
  handleSelectWallet,
56
- handlePaymethodDataChange
60
+ handlePaymethodDataChange,
61
+ cartUuid,
62
+ loyaltyPlansState,
63
+ totalCartsFee,
64
+ cartGroup,
65
+ walletState,
66
+ onNavigationRedirectReplace,
67
+ merchantId,
68
+ cartsInvalid
57
69
  } = props
58
70
 
59
- const theme = useTheme();
71
+ const theme = useTheme();
60
72
  const styles = StyleSheet.create({
61
73
  pagePadding: {
62
- paddingLeft: 40,
63
- paddingRight: 40
64
- },
65
- wrapperNavbar: Platform.OS === 'ios'
66
- ? { paddingVertical: 0, paddingHorizontal: 40 }
67
- : { paddingVertical: 20, paddingHorizontal: 40 }
74
+ paddingLeft: 40,
75
+ paddingRight: 40
76
+ },
77
+ wrapperNavbar: { paddingHorizontal: 40 }
68
78
  })
69
79
 
70
- const [, { showToast }] = useToast();
80
+ const [, { showToast }] = useToast();
71
81
  const [, t] = useLanguage()
72
- const [{ configs }] = useConfig();
73
- const [{ parsePrice, parseDate }] = useUtils();
74
- const [{ options, carts, loading }, { confirmCart }] = useOrder();
75
- const [validationFields] = useValidationFields();
82
+ const [{ configs }] = useConfig();
83
+ const [{ parsePrice, parseDate }] = useUtils();
84
+ const [{ options, carts, loading }, { confirmCart }] = useOrder();
85
+ const [validationFields] = useValidationFields();
76
86
  const [{ user }] = useSession()
77
87
 
78
- const configTypes = configs?.order_types_allowed?.value.split('|').map((value: any) => Number(value)) || []
79
- const isPreOrder = configs?.preorder_status_enabled?.value === '1'
80
- const maximumCarts = 5
81
- const isDisablePlaceOrderButton = !(paymethodSelected?.paymethod_id || paymethodSelected?.wallet_id) || openCarts.length > maximumCarts
88
+ const configTypes = configs?.order_types_allowed?.value.split('|').map((value: any) => Number(value)) || []
89
+ const isPreOrder = configs?.preorder_status_enabled?.value === '1'
90
+ const isMultiDriverTips = configs?.checkout_multi_business_enabled?.value === '1'
82
91
  const walletCarts = (Object.values(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) || []
92
+ const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
93
+ const cartsToShow = openCarts?.length > 0 ? openCarts : cartsInvalid
94
+ const walletName: any = {
95
+ cash: {
96
+ name: t('PAY_WITH_CASH_WALLET', 'Pay with Cash Wallet'),
97
+ },
98
+ credit_point: {
99
+ name: t('PAY_WITH_CREDITS_POINTS_WALLET', 'Pay with Credit Points Wallet'),
100
+ }
101
+ }
102
+
103
+ const totalCartsPrice = cartGroup?.result?.balance
104
+
105
+ const driverTipsOptions = typeof configs?.driver_tip_options?.value === 'string'
106
+ ? JSON.parse(configs?.driver_tip_options?.value) || []
107
+ : configs?.driver_tip_options?.value || []
108
+
109
+ const creditPointGeneralPlan = loyaltyPlansState?.result?.find((loyal: any) => loyal.type === 'credit_point')
110
+ const loyalBusinessAvailable = creditPointGeneralPlan?.businesses?.filter((b: any) => b.accumulates) ?? []
111
+
112
+ const accumulationRateBusiness = (businessId: number) => {
113
+ const value = loyalBusinessAvailable?.find((loyal: any) => loyal.business_id === businessId)?.accumulation_rate ?? 0
114
+ return value || (creditPointGeneralPlan?.accumulation_rate ?? 0)
115
+ }
116
+
117
+ const getIncludedTaxes = (cart: any) => {
118
+ if (cart?.taxes === null || !cart?.taxes) {
119
+ return cart.business.tax_type === 1 ? cart?.tax : 0
120
+ } else {
121
+ return cart?.taxes.reduce((taxIncluded: number, tax: any) => {
122
+ return taxIncluded + (tax.type === 1 ? tax.summary?.tax : 0)
123
+ }, 0)
124
+ }
125
+ }
126
+
127
+ const clearAmount = (value: any) => parseFloat((Math.trunc(value * 100) / 100).toFixed(configs.format_number_decimal_length?.value ?? 2))
128
+
129
+ const loyaltyRewardValue = openCarts
130
+ ?.reduce((sum: any, cart: any) => sum + clearAmount((cart?.subtotal + getIncludedTaxes(cart)) * accumulationRateBusiness(cart?.business_id)), 0)
131
+ ?.toFixed(configs.format_number_decimal_length?.value ?? 2)
132
+
133
+ const [isUserDetailsEdit, setIsUserDetailsEdit] = useState(false);
134
+ const [phoneUpdate, setPhoneUpdate] = useState(false);
135
+ const [userErrors, setUserErrors] = useState<any>([]);
136
+ const [placeByMethodPay, setPlaceByMethodPay] = useState(false)
137
+ const [methodPaySupported, setMethodPaySupported] = useState({ enabled: false, message: null, loading: true })
138
+ const methodsPay = ['global_google_pay', 'global_apple_pay']
139
+ const isDisablePlaceOrderButton = cartGroup?.loading || (!(paymethodSelected?.paymethod_id || paymethodSelected?.wallet_id) && cartGroup?.result?.balance > 0) ||
140
+ (paymethodSelected?.paymethod?.gateway === 'stripe' && !paymethodSelected?.paymethod_data) ||
141
+ walletCarts.length > 0
142
+ || (methodsPay.includes(paymethodSelected?.gateway) && (!methodPaySupported.enabled || methodPaySupported.loading)) || openCarts?.length === 0
83
143
 
84
- const [isUserDetailsEdit, setIsUserDetailsEdit] = useState(false);
85
- const [phoneUpdate, setPhoneUpdate] = useState(false);
86
- const [userErrors, setUserErrors] = useState<any>([]);
87
144
  const handleMomentClick = () => {
88
- if (isPreOrder) {
89
- navigation.navigate('MomentOption')
90
- }
91
- }
145
+ if (isPreOrder) {
146
+ navigation.navigate('MomentOption')
147
+ }
148
+ }
92
149
 
93
150
  const checkValidationFields = () => {
94
- setUserErrors([])
95
- const errors = []
96
- const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes']
97
-
98
- Object.values(validationFields?.fields?.checkout).map((field: any) => {
99
- if (field?.required && !notFields.includes(field.code)) {
100
- if (!user[field?.code]) {
101
- errors.push(t(`VALIDATION_ERROR_${field.code.toUpperCase()}_REQUIRED`, `The field ${field?.name} is required`))
102
- }
103
- }
104
- })
105
-
106
- if (
107
- !user?.cellphone &&
108
- ((validationFields?.fields?.checkout?.cellphone?.enabled &&
109
- validationFields?.fields?.checkout?.cellphone?.required) ||
110
- configs?.verification_phone_required?.value === '1')
111
- ) {
112
- errors.push(t('VALIDATION_ERROR_MOBILE_PHONE_REQUIRED', 'The field Phone number is required'))
113
- }
114
-
115
- if (phoneUpdate) {
116
- errors.push(t('NECESSARY_UPDATE_COUNTRY_PHONE_CODE', 'It is necessary to update your phone number'))
117
- }
118
-
119
- setUserErrors(errors)
120
- }
151
+ setUserErrors([])
152
+ const errors = []
153
+ const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes']
154
+
155
+ Object.values(validationFields?.fields?.checkout).map((field: any) => {
156
+ if (field?.required && !notFields.includes(field.code)) {
157
+ if (!user[field?.code]) {
158
+ errors.push(t(`VALIDATION_ERROR_${field.code.toUpperCase()}_REQUIRED`, `The field ${field?.name} is required`))
159
+ }
160
+ }
161
+ })
162
+
163
+ if (
164
+ !user?.cellphone &&
165
+ ((validationFields?.fields?.checkout?.cellphone?.enabled &&
166
+ validationFields?.fields?.checkout?.cellphone?.required) ||
167
+ configs?.verification_phone_required?.value === '1')
168
+ ) {
169
+ errors.push(t('VALIDATION_ERROR_MOBILE_PHONE_REQUIRED', 'The field Phone number is required'))
170
+ }
171
+
172
+ if (phoneUpdate) {
173
+ errors.push(t('NECESSARY_UPDATE_COUNTRY_PHONE_CODE', 'It is necessary to update your phone number'))
174
+ }
175
+
176
+ setUserErrors(errors)
177
+ }
121
178
 
122
179
  const togglePhoneUpdate = (val: boolean) => {
123
- setPhoneUpdate(val)
124
- }
180
+ setPhoneUpdate(val)
181
+ }
125
182
 
126
- const handlePlaceOrder = () => {
183
+ const handlePlaceOrder = (confirmPayment?: any) => {
127
184
  if (!userErrors.length) {
128
- handleGroupPlaceOrder && handleGroupPlaceOrder()
185
+ handleGroupPlaceOrder && handleGroupPlaceOrder(confirmPayment)
129
186
  return
130
187
  }
131
188
  let stringError = ''
132
- Object.values(userErrors).map((item: any, i: number) => {
133
- stringError += (i + 1) === userErrors.length ? `- ${item?.message || item}` : `- ${item?.message || item}\n`
134
- })
135
- showToast(ToastType.Error, stringError)
189
+ Object.values(userErrors).map((item: any, i: number) => {
190
+ stringError += (i + 1) === userErrors.length ? `- ${item?.message || item}` : `- ${item?.message || item}\n`
191
+ })
192
+ showToast(ToastType.Error, stringError)
136
193
  setIsUserDetailsEdit(true)
137
194
  }
138
195
 
139
196
  useEffect(() => {
140
- if (validationFields && validationFields?.fields?.checkout) {
141
- checkValidationFields()
142
- }
143
- }, [validationFields, user])
197
+ if (validationFields && validationFields?.fields?.checkout) {
198
+ checkValidationFields()
199
+ }
200
+ }, [validationFields, user])
201
+
202
+ useEffect(() => {
203
+ if (cartsToShow?.length === 1) {
204
+ onNavigationRedirectReplace('CheckoutPage', {
205
+ cartUuid: cartsToShow[0]?.uuid,
206
+ fromMulti: true
207
+ })
208
+ return
209
+ }
210
+ }, [cartsToShow])
211
+
212
+ useEffect(() => {
213
+ if (walletState.error) {
214
+ showToast(ToastType.Error, t(walletState.error, walletState.error?.[0]?.replace(/_/g, ' ')))
215
+ }
216
+ }, [walletState.error])
217
+
218
+ useEffect(() => {
219
+ if (!cartUuid) {
220
+ onNavigationRedirectReplace('BottomTab', { screen: 'Cart' })
221
+ }
222
+ }, [cartUuid])
223
+
224
+ useEffect(() => {
225
+ if (paymethodSelected?.gateway === 'global_google_pay') {
226
+ setMethodPaySupported({
227
+ enabled: true,
228
+ loading: false,
229
+ message: null
230
+ })
231
+ }
232
+ }, [paymethodSelected])
144
233
 
145
234
  return (
146
235
  <>
147
236
  <Container noPadding>
148
237
  <View style={styles.wrapperNavbar}>
149
238
  <NavBar
150
- isVertical
151
239
  title={t('CHECKOUT', 'Checkout')}
152
240
  titleAlign={'center'}
153
241
  onActionLeft={() => navigation?.canGoBack() && navigation.goBack()}
154
242
  showCall={false}
243
+ paddingTop={Platform.OS === 'ios' ? 0 : 4}
155
244
  btnStyle={{ paddingLeft: 0 }}
156
- style={{ marginTop: Platform.OS === 'ios' ? 0 : 30 }}
157
- titleWrapStyle={{ paddingHorizontal: 0 }}
158
- titleStyle={{ marginRight: 0, marginLeft: 0 }}
159
245
  />
160
246
  </View>
161
247
  <ChContainer style={styles.pagePadding}>
162
248
  <ChSection style={{ paddingTop: 0 }}>
163
249
  <ChHeader>
164
- <CHMomentWrapper onPress={() => navigation.navigate('OrderTypes', { configTypes: configTypes })}>
165
- <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textSecondary}>{t(getTypesText(options?.type || 1), 'Delivery')}</OText>
250
+ <CHMomentWrapper isCustomColor={isChewLayout} onPress={() => navigation.navigate('OrderTypes', { configTypes: configTypes })}>
251
+ <OText
252
+ size={12}
253
+ numberOfLines={1}
254
+ ellipsizeMode={'tail'}
255
+ color={theme.colors?.[isChewLayout ? 'white' : 'textSecondary']}
256
+ >
257
+ {t(getTypesText(options?.type || 1), 'Delivery')}
258
+ </OText>
166
259
  <OIcon
167
260
  src={theme.images.general.arrow_down}
168
261
  width={10}
@@ -217,17 +310,80 @@ const MultiCheckoutUI = (props: any) => {
217
310
  </ChAddress>
218
311
  <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
219
312
  </ChSection>
313
+ {openCarts?.length > 0 && (
314
+ <ChSection>
315
+ <MultiCartsPaymethodsAndWallets
316
+ openCarts={openCarts}
317
+ paymethodSelected={paymethodSelected}
318
+ walletsPaymethod={cartGroup?.result?.wallets}
319
+ handleSelectPaymethod={handleSelectPaymethod}
320
+ handleSelectWallet={handleSelectWallet}
321
+ handlePaymethodDataChange={handlePaymethodDataChange}
322
+ cartUuid={cartUuid}
323
+ merchantId={merchantId}
324
+ setMethodPaySupported={setMethodPaySupported}
325
+ methodPaySupported={methodPaySupported}
326
+ placeByMethodPay={placeByMethodPay}
327
+ setPlaceByMethodPay={setPlaceByMethodPay}
328
+ cartTotal={totalCartsPrice}
329
+ handlePlaceOrder={handlePlaceOrder}
330
+ />
331
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
332
+ </ChSection>
333
+ )}
334
+ {
335
+ isMultiDriverTips &&
336
+ options?.type === 1 &&
337
+ validationFields?.fields?.checkout?.driver_tip?.enabled &&
338
+ openCarts.every((cart: any) => cart.business_id && cart.status !== 2) &&
339
+ driverTipsOptions && driverTipsOptions?.length > 0 &&
340
+ (
341
+ <ChSection>
342
+ <DriverTipsContainer>
343
+ <OText size={14} lineHeight={20} color={theme.colors.textNormal}>
344
+ {t('DRIVER_TIPS', 'Driver Tips')}
345
+ </OText>
346
+ <DriverTips
347
+ isMulti
348
+ isLoading={loading}
349
+ carts={openCarts}
350
+ businessIds={openCarts.map((cart: any) => cart.business_id)}
351
+ driverTipsOptions={driverTipsOptions}
352
+ isFixedPrice={parseInt(configs?.driver_tip_type?.value, 10) === 1}
353
+ isDriverTipUseCustom={!!parseInt(configs?.driver_tip_use_custom?.value, 10)}
354
+ driverTip={parseInt(configs?.driver_tip_type?.value, 10) === 1
355
+ ? openCarts?.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0)
356
+ : openCarts[0]?.driver_tip_rate}
357
+ useOrderContext
358
+ />
359
+ </DriverTipsContainer>
360
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
361
+ </ChSection>
362
+ )}
220
363
 
221
- <ChSection>
222
- <MultiCartsPaymethodsAndWallets
223
- openCarts={openCarts}
224
- paymethodSelected={paymethodSelected}
225
- handleSelectPaymethod={handleSelectPaymethod}
226
- handleSelectWallet={handleSelectWallet}
227
- handlePaymethodDataChange={handlePaymethodDataChange}
228
- />
229
- <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
230
- </ChSection>
364
+ {
365
+ validationFields?.fields?.checkout?.coupon?.enabled &&
366
+ openCarts.every((cart: any) => cart.business_id && cart.status !== 2) &&
367
+ configs?.multi_business_checkout_coupon_input_style?.value === 'group' &&
368
+ openCarts?.length > 0 &&
369
+ (
370
+ <ChSection>
371
+ <OText size={14} lineHeight={20} color={theme.colors.textNormal}>
372
+ {t('DISCOUNT_COUPON', 'Discount coupon')}
373
+ </OText>
374
+ <OSTable>
375
+ <OSCoupon>
376
+ <CouponControl
377
+ isMulti
378
+ carts={openCarts}
379
+ businessIds={openCarts.map((cart: any) => cart.business_id)}
380
+ price={openCarts.reduce((total: any, cart: any) => total + cart.total, 0)}
381
+ />
382
+ </OSCoupon>
383
+ </OSTable>
384
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
385
+ </ChSection>
386
+ )}
231
387
 
232
388
  <ChSection>
233
389
  <ChCarts>
@@ -236,18 +392,24 @@ const MultiCheckoutUI = (props: any) => {
236
392
  {t('MOBILE_FRONT_YOUR_ORDER', 'Your order')}
237
393
  </OText>
238
394
  </CartsHeader>
239
- {openCarts.map((cart: any) => (
395
+ {cartsToShow.map((cart: any) => (
240
396
  <React.Fragment key={cart.uuid}>
241
397
  <Cart
242
398
  cart={cart}
243
399
  cartuuid={cart.uuid}
244
400
  isMultiCheckout
401
+ hideCouponInput={configs?.multi_business_checkout_coupon_input_style?.value === 'group'}
402
+ hideDeliveryFee={configs?.multi_business_checkout_show_combined_delivery_fee?.value === '1'}
403
+ hideDriverTip={configs?.multi_business_checkout_show_combined_driver_tip?.value === '1'}
245
404
  onNavigationRedirect={(route: string, params: any) => props.navigation.navigate(route, params)}
405
+ businessConfigs={cart?.business?.configs}
246
406
  />
247
- <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
407
+ {openCarts.length > 1 && (
408
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
409
+ )}
248
410
  </React.Fragment>
249
411
  ))}
250
- {openCarts.length === 0 && (
412
+ {!cartGroup?.loading && openCarts.length === 0 && cartsInvalid?.length === 0 && (
251
413
  <CCNotCarts>
252
414
  <OText size={24} style={{ textAlign: 'center' }}>
253
415
  {t('CARTS_NOT_FOUND', 'You don\'t have carts available')}
@@ -259,36 +421,80 @@ const MultiCheckoutUI = (props: any) => {
259
421
  {t('WARNING_PARTIAL_WALLET_CARTS', 'Important: One or more carts can`t be completed due a partial payment with cash/points wallet and requires to be paid individually')}
260
422
  </OText>
261
423
  )}
262
- {openCarts.length > 0 && (
424
+ {openCarts.length > 1 && (
263
425
  <ChCartsTotal>
426
+ {!!totalCartsFee && configs?.multi_business_checkout_show_combined_delivery_fee?.value === '1' && (
427
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
428
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
429
+ {t('TOTAL_DELIVERY_FEE', 'Total delivery fee')}
430
+ </OText>
431
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
432
+ {parsePrice(totalCartsFee)}
433
+ </OText>
434
+ </View>
435
+ )}
436
+ {openCarts.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0) > 0 &&
437
+ configs?.multi_business_checkout_show_combined_driver_tip?.value === '1' && (
438
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
439
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
440
+ {t('DRIVER_TIP', 'Driver tip')}
441
+ </OText>
442
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
443
+ {parsePrice(openCarts.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0))}
444
+ </OText>
445
+ </View>
446
+ )}
447
+ {!cartGroup?.loading && cartGroup?.result?.payment_events?.length > 0 && cartGroup?.result?.payment_events?.map((event: any) => (
448
+ <View key={event.id} style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
449
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
450
+ {walletName[cartGroup?.result?.wallets?.find((wallet: any) => wallet.wallet_id === event.wallet_id)?.type]?.name}
451
+ </OText>
452
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
453
+ -{parsePrice(event.amount, { isTruncable: true })}
454
+ </OText>
455
+ </View>
456
+ ))}
264
457
  <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
265
458
  <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>
266
459
  {t('TOTAL_FOR_ALL_CARTS', 'Total for all Carts')}
267
460
  </OText>
268
461
  <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>{parsePrice(totalCartsPrice)}</OText>
269
462
  </View>
463
+ {!!loyaltyRewardValue && (
464
+ <View style={{ flexDirection: 'row', marginTop: 10, justifyContent: 'flex-end' }}>
465
+ <OText size={12} color={theme.colors.textNormal}>
466
+ {t('REWARD_LOYALTY_POINT', 'Reward :amount: on loyalty points').replace(':amount:', loyaltyRewardValue)}
467
+ </OText>
468
+ </View>
469
+ )}
470
+
270
471
  <OText size={12} color={theme.colors.mediumGray} mRight={70} style={{ marginTop: 10 }}>
271
472
  {t('MULTI_CHECKOUT_DESCRIPTION', 'You will receive a receipt for each business. The payment is not combined between multiple stores. Each payment is processed by the store')}
272
473
  </OText>
273
474
  </ChCartsTotal>
274
475
  )}
275
- {openCarts.length > maximumCarts && (
276
- <OText size={14} color={theme.colors.danger5} style={{ marginVertical: 20 }}>
277
- {t('WARNING_MAXIMUM_CARTS', 'You can only pay for a maximum of 5 carts, please discard one or more to continue.')}
278
- </OText>
279
- )}
280
476
  </ChCarts>
281
477
  </ChSection>
478
+ {cartsToShow?.some((cart: any) => !cart?.valid_products && cart?.status !== 2) && (
479
+ <OText
480
+ color={theme.colors.error}
481
+ size={12}
482
+ >
483
+ {t('WARNING_INVALID_PRODUCTS_CHECKOUT', 'To continue with your checkout, please remove from your cart the products that are not available.')}
484
+ </OText>
485
+ )}
282
486
  </ChContainer>
283
487
  </Container>
284
-
488
+
285
489
  <FloatingButton
286
- handleClick={() => handlePlaceOrder()}
490
+ handleClick={methodsPay.includes(paymethodSelected?.gateway)
491
+ ? () => setPlaceByMethodPay(true)
492
+ : () => handlePlaceOrder()}
287
493
  isSecondaryBtn={isDisablePlaceOrderButton}
288
494
  disabled={isDisablePlaceOrderButton}
289
495
  btnText={placing ? t('PLACING', 'Placing') : t('PLACE_ORDER', 'Place Order')}
290
496
  btnRightValueShow
291
- btnRightValue={parsePrice(totalCartsPrice)}
497
+ btnRightValue={parsePrice(totalCartsPrice)}
292
498
  iosBottom={30}
293
499
  />
294
500
  </>
@@ -296,9 +502,34 @@ const MultiCheckoutUI = (props: any) => {
296
502
  }
297
503
 
298
504
  export const MultiCheckout = (props: any) => {
505
+ const [loadMultiCarts, setLoadMultiCarts] = useState(!!props.route?.params?.checkCarts)
506
+ const [cartUuid, setCartUuid] = useState('')
507
+
299
508
  const multiCheckoutProps = {
300
509
  ...props,
510
+ cartUuid: props.route?.params?.cartUuid ?? cartUuid,
301
511
  UIComponent: MultiCheckoutUI
302
512
  }
303
- return <MultiCheckoutController {...multiCheckoutProps} />
513
+
514
+ const multiCartProps = {
515
+ ...props,
516
+ handleOnRedirectMultiCheckout: (cartUuid: string) => {
517
+ setCartUuid(cartUuid)
518
+ setLoadMultiCarts(false)
519
+ },
520
+ handleOnRedirectCheckout: (cartUuid: string) => {
521
+ props.navigation.navigate('CheckoutNavigator', {
522
+ screen: 'CheckoutPage',
523
+ cartUuid
524
+ })
525
+ }
526
+ }
527
+
528
+ return (
529
+ loadMultiCarts ? (
530
+ <MultiCartController {...multiCartProps} />
531
+ ) : (
532
+ <MultiCheckoutController {...multiCheckoutProps} />
533
+ )
534
+ )
304
535
  }
@@ -13,7 +13,9 @@ export const ChHeader = styled.View`
13
13
  margin: 0px;
14
14
  `
15
15
  export const CHMomentWrapper = styled.TouchableOpacity`
16
- background-color: ${(props: any) => props.theme.colors.backgroundGray100};
16
+ background-color: ${(props: any) => props.isCustomColor
17
+ ? props.theme.colors.primary
18
+ : props.theme.colors.backgroundGray100};
17
19
  border-radius: 7.6px;
18
20
  font-size: 12px;
19
21
  max-width: 240px;