ordering-ui-react-native 0.17.17 → 0.17.18-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 (209) hide show
  1. package/package.json +5 -7
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessesListing/index.tsx +1 -1
  4. package/src/components/OrderCreating/index.tsx +1 -21
  5. package/src/components/PaymentOptionsWebView/index.tsx +119 -120
  6. package/src/components/StripeMethodForm/index.tsx +108 -77
  7. package/src/components/VerifyPhone/styles.tsx +1 -2
  8. package/src/components/shared/OToast.tsx +4 -4
  9. package/src/types/index.tsx +5 -0
  10. package/src/utils/index.tsx +7 -1
  11. package/themes/business/index.tsx +2 -0
  12. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +265 -240
  13. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -4
  14. package/themes/business/src/components/BusinessController/index.tsx +0 -1
  15. package/themes/business/src/components/Chat/index.tsx +118 -107
  16. package/themes/business/src/components/DriverMap/index.tsx +17 -6
  17. package/themes/business/src/components/GoogleMap/index.tsx +58 -57
  18. package/themes/business/src/components/LoginForm/Otp/index.tsx +120 -0
  19. package/themes/business/src/components/LoginForm/Otp/styles.tsx +7 -0
  20. package/themes/business/src/components/LoginForm/index.tsx +238 -80
  21. package/themes/business/src/components/LoginForm/styles.tsx +10 -0
  22. package/themes/business/src/components/MapView/index.tsx +10 -10
  23. package/themes/business/src/components/NewOrderNotification/index.tsx +43 -50
  24. package/themes/business/src/components/OrderDetails/Delivery.tsx +4 -3
  25. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +90 -47
  26. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +59 -62
  27. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +195 -0
  28. package/themes/business/src/components/OrderDetailsLogistic/styles.tsx +5 -0
  29. package/themes/business/src/components/OrderMessage/index.tsx +18 -17
  30. package/themes/business/src/components/OrderSummary/index.tsx +113 -121
  31. package/themes/business/src/components/OrdersOption/index.tsx +32 -75
  32. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +250 -0
  33. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +115 -0
  34. package/themes/business/src/components/PreviousOrders/index.tsx +445 -243
  35. package/themes/business/src/components/PreviousOrders/styles.tsx +31 -3
  36. package/themes/business/src/components/ProductItemAccordion/index.tsx +27 -3
  37. package/themes/business/src/components/ReviewCustomer/index.tsx +41 -24
  38. package/themes/business/src/components/StoresList/index.tsx +2 -2
  39. package/themes/business/src/components/shared/OLink.tsx +33 -13
  40. package/themes/business/src/components/shared/OModal.tsx +16 -9
  41. package/themes/business/src/components/shared/OText.tsx +8 -2
  42. package/themes/business/src/types/index.tsx +32 -2
  43. package/themes/business/src/utils/index.tsx +44 -1
  44. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  45. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  46. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  47. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -1
  48. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  49. package/themes/kiosk/src/components/LoginForm/Otp/index.tsx +92 -0
  50. package/themes/kiosk/src/components/LoginForm/Otp/styles.tsx +7 -0
  51. package/themes/kiosk/src/components/LoginForm/index.tsx +473 -151
  52. package/themes/kiosk/src/components/LoginForm/styles.tsx +14 -1
  53. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  54. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  55. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  56. package/themes/kiosk/src/components/PhoneInputNumber/index.tsx +3 -2
  57. package/themes/kiosk/src/components/PhoneInputNumber/styles.tsx +1 -3
  58. package/themes/kiosk/src/components/ProductForm/index.tsx +1 -14
  59. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  60. package/themes/kiosk/src/components/shared/OModal.tsx +14 -11
  61. package/themes/kiosk/src/layouts/Container.tsx +7 -1
  62. package/themes/kiosk/src/types/index.d.ts +13 -0
  63. package/themes/kiosk/src/utils/index.tsx +15 -0
  64. package/themes/original/index.tsx +10 -2
  65. package/themes/original/src/components/AddressDetails/index.tsx +29 -11
  66. package/themes/original/src/components/AddressForm/index.tsx +41 -16
  67. package/themes/original/src/components/AddressList/index.tsx +26 -21
  68. package/themes/original/src/components/AddressList/styles.tsx +4 -2
  69. package/themes/original/src/components/AnalyticsSegment/index.tsx +195 -12
  70. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  71. package/themes/original/src/components/BusinessBasicInformation/index.tsx +166 -89
  72. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +9 -7
  73. package/themes/original/src/components/BusinessController/index.tsx +145 -68
  74. package/themes/original/src/components/BusinessController/styles.tsx +22 -9
  75. package/themes/original/src/components/BusinessFeaturedController/index.tsx +21 -54
  76. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +8 -0
  77. package/themes/original/src/components/BusinessInformation/index.tsx +10 -31
  78. package/themes/original/src/components/BusinessItemAccordion/index.tsx +23 -22
  79. package/themes/original/src/components/BusinessListingSearch/index.tsx +350 -323
  80. package/themes/original/src/components/BusinessPreorder/index.tsx +97 -16
  81. package/themes/original/src/components/BusinessProductsList/index.tsx +20 -11
  82. package/themes/original/src/components/BusinessProductsList/styles.tsx +8 -3
  83. package/themes/original/src/components/BusinessProductsListing/index.tsx +616 -495
  84. package/themes/original/src/components/BusinessProductsListing/styles.tsx +7 -9
  85. package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
  86. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +1 -1
  87. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +105 -78
  88. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -9
  89. package/themes/original/src/components/BusinessesListing/index.tsx +5 -3
  90. package/themes/original/src/components/Cart/index.tsx +88 -43
  91. package/themes/original/src/components/CartContent/index.tsx +110 -19
  92. package/themes/original/src/components/CartContent/styles.tsx +15 -1
  93. package/themes/original/src/components/Checkout/index.tsx +323 -178
  94. package/themes/original/src/components/Checkout/styles.tsx +4 -2
  95. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  96. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  97. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  98. package/themes/original/src/components/DriverTips/index.tsx +49 -34
  99. package/themes/original/src/components/Favorite/index.tsx +7 -4
  100. package/themes/original/src/components/Favorite/styles.tsx +1 -1
  101. package/themes/original/src/components/FavoriteList/index.tsx +51 -80
  102. package/themes/original/src/components/FloatingButton/index.tsx +1 -2
  103. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  104. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  105. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +96 -0
  106. package/themes/original/src/components/GiftCard/GiftCardUI/styles.tsx +5 -0
  107. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +100 -0
  108. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +8 -0
  109. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +178 -0
  110. package/themes/original/src/components/GiftCard/RedeemGiftCard/styles.tsx +8 -0
  111. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +165 -0
  112. package/themes/original/src/components/GiftCard/SendGiftCard/styles.tsx +9 -0
  113. package/themes/original/src/components/Help/index.tsx +8 -8
  114. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +11 -22
  115. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +6 -0
  116. package/themes/original/src/components/HelpGuide/index.tsx +12 -16
  117. package/themes/original/src/components/HelpGuide/styles.tsx +6 -0
  118. package/themes/original/src/components/HelpOrder/index.tsx +12 -25
  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/LanguageSelector/index.tsx +19 -14
  122. package/themes/original/src/components/LastOrder/index.tsx +1 -34
  123. package/themes/original/src/components/LoginForm/Otp/index.tsx +89 -73
  124. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  125. package/themes/original/src/components/LoginForm/index.tsx +48 -19
  126. package/themes/original/src/components/LottieAnimation/index.tsx +78 -0
  127. package/themes/original/src/components/MessageListing/index.tsx +16 -42
  128. package/themes/original/src/components/Messages/index.tsx +32 -10
  129. package/themes/original/src/components/MomentOption/index.tsx +195 -88
  130. package/themes/original/src/components/MultiCart/index.tsx +50 -0
  131. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +195 -116
  132. package/themes/original/src/components/MultiCheckout/index.tsx +262 -83
  133. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +37 -224
  134. package/themes/original/src/components/MultiOrdersDetails/index.tsx +67 -20
  135. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
  136. package/themes/original/src/components/MyOrders/index.tsx +55 -51
  137. package/themes/original/src/components/NavBar/index.tsx +6 -11
  138. package/themes/original/src/components/Notifications/index.tsx +144 -0
  139. package/themes/original/src/components/Notifications/styles.tsx +20 -0
  140. package/themes/original/src/components/OrderDetails/OrderEta.tsx +64 -0
  141. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +15 -3
  142. package/themes/original/src/components/OrderDetails/index.tsx +262 -347
  143. package/themes/original/src/components/OrderDetails/styles.tsx +10 -1
  144. package/themes/original/src/components/OrderItAgain/index.tsx +47 -43
  145. package/themes/original/src/components/OrderProgress/index.tsx +74 -112
  146. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  147. package/themes/original/src/components/OrderSummary/index.tsx +67 -29
  148. package/themes/original/src/components/OrderTypeSelector/index.tsx +3 -2
  149. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +24 -19
  150. package/themes/original/src/components/OrdersOption/index.tsx +96 -88
  151. package/themes/original/src/components/PageBanner/index.tsx +171 -0
  152. package/themes/original/src/components/PageBanner/styles.tsx +11 -0
  153. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +1 -1
  154. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  155. package/themes/original/src/components/PaymentOptions/index.tsx +34 -6
  156. package/themes/original/src/components/PhoneInputNumber/index.tsx +3 -3
  157. package/themes/original/src/components/PlaceSpot/index.tsx +12 -6
  158. package/themes/original/src/components/PreviousOrders/index.tsx +3 -2
  159. package/themes/original/src/components/ProductForm/index.tsx +231 -253
  160. package/themes/original/src/components/ProductForm/styles.tsx +4 -7
  161. package/themes/original/src/components/ProductItemAccordion/index.tsx +197 -138
  162. package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -10
  163. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +1 -2
  164. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  165. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -50
  166. package/themes/original/src/components/ProfessionalProfile/index.tsx +36 -7
  167. package/themes/original/src/components/Promotions/index.tsx +234 -220
  168. package/themes/original/src/components/Promotions/styles.tsx +10 -3
  169. package/themes/original/src/components/ReviewDriver/index.tsx +3 -3
  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 +7 -4
  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 +366 -288
  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 +82 -67
  181. package/themes/original/src/components/SingleOrderCard/index.tsx +148 -62
  182. package/themes/original/src/components/SingleOrderCard/styles.tsx +11 -9
  183. package/themes/original/src/components/SingleProductCard/index.tsx +99 -55
  184. package/themes/original/src/components/SingleProductCard/styles.tsx +27 -13
  185. package/themes/original/src/components/SingleProductReview/index.tsx +8 -2
  186. package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
  187. package/themes/original/src/components/StripeCardsList/index.tsx +9 -2
  188. package/themes/original/src/components/StripeElementsForm/index.tsx +28 -15
  189. package/themes/original/src/components/UpsellingProducts/index.tsx +238 -218
  190. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  191. package/themes/original/src/components/UserDetails/index.tsx +8 -4
  192. package/themes/original/src/components/UserFormDetails/index.tsx +53 -54
  193. package/themes/original/src/components/UserProfile/index.tsx +57 -41
  194. package/themes/original/src/components/UserProfile/styles.ts +17 -0
  195. package/themes/original/src/components/UserProfileForm/index.tsx +21 -28
  196. package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
  197. package/themes/original/src/components/Wallets/index.tsx +31 -17
  198. package/themes/original/src/components/Wallets/styles.tsx +2 -0
  199. package/themes/original/src/components/shared/CardAnimation.tsx +47 -0
  200. package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
  201. package/themes/original/src/components/shared/OBottomPopup.tsx +1 -1
  202. package/themes/original/src/components/shared/OButton.tsx +6 -2
  203. package/themes/original/src/components/shared/OIcon.tsx +8 -1
  204. package/themes/original/src/components/shared/OInput.tsx +10 -1
  205. package/themes/original/src/components/shared/OModal.tsx +3 -3
  206. package/themes/original/src/layouts/Container.tsx +13 -9
  207. package/themes/original/src/types/index.tsx +41 -10
  208. package/themes/original/src/utils/index.tsx +375 -58
  209. 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) => {
@@ -53,75 +58,113 @@ const MultiCheckoutUI = (props: any) => {
53
58
  paymethodSelected,
54
59
  handleSelectPaymethod,
55
60
  handleSelectWallet,
56
- handlePaymethodDataChange
61
+ handlePaymethodDataChange,
62
+ cartUuid,
63
+ loyaltyPlansState,
64
+ totalCartsFee,
65
+ cartGroup,
66
+ walletState,
67
+ onNavigationRedirectReplace,
68
+ merchantId
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) || []
83
92
 
84
- const [isUserDetailsEdit, setIsUserDetailsEdit] = useState(false);
85
- const [phoneUpdate, setPhoneUpdate] = useState(false);
86
- const [userErrors, setUserErrors] = useState<any>([]);
93
+ const driverTipsOptions = typeof configs?.driver_tip_options?.value === 'string'
94
+ ? JSON.parse(configs?.driver_tip_options?.value) || []
95
+ : configs?.driver_tip_options?.value || []
96
+
97
+ const creditPointGeneralPlan = loyaltyPlansState?.result?.find((loyal: any) => loyal.type === 'credit_point')
98
+ const loyalBusinessAvailable = creditPointGeneralPlan?.businesses?.filter((b: any) => b.accumulates) ?? []
99
+
100
+ const accumulationRateBusiness = (businessId: number) => {
101
+ const value = loyalBusinessAvailable?.find((loyal: any) => loyal.business_id === businessId)?.accumulation_rate ?? 0
102
+ return value || (creditPointGeneralPlan?.accumulation_rate ?? 0)
103
+ }
104
+
105
+ const getIncludedTaxes = (cart: any) => {
106
+ if (cart?.taxes === null || !cart?.taxes) {
107
+ return cart.business.tax_type === 1 ? cart?.tax : 0
108
+ } else {
109
+ return cart?.taxes.reduce((taxIncluded: number, tax: any) => {
110
+ return taxIncluded + (tax.type === 1 ? tax.summary?.tax : 0)
111
+ }, 0)
112
+ }
113
+ }
114
+
115
+ const clearAmount = (value: any) => parseFloat((Math.trunc(value * 100) / 100).toFixed(configs.format_number_decimal_length?.value ?? 2))
116
+
117
+ const loyaltyRewardValue = openCarts.reduce((sum: any, cart: any) => sum + clearAmount((cart?.subtotal + getIncludedTaxes(cart)) * accumulationRateBusiness(cart?.business_id)), 0)
118
+
119
+ const [isUserDetailsEdit, setIsUserDetailsEdit] = useState(false);
120
+ const [phoneUpdate, setPhoneUpdate] = useState(false);
121
+ const [userErrors, setUserErrors] = useState<any>([]);
122
+ const [placeByMethodPay, setPlaceByMethodPay] = useState(false)
123
+ const [methodPaySupported, setMethodPaySupported] = useState({ enabled: false, message: null, loading: true })
124
+ const methodsPay = ['global_google_pay', 'global_apple_pay']
125
+ const isDisablePlaceOrderButton = cartGroup?.loading || (!(paymethodSelected?.paymethod_id || paymethodSelected?.wallet_id) && cartGroup?.result?.balance > 0) ||
126
+ (paymethodSelected?.paymethod?.gateway === 'stripe' && !paymethodSelected?.paymethod_data) ||
127
+ walletCarts.length > 0
128
+ || (methodsPay.includes(paymethodSelected?.gateway) && (!methodPaySupported.enabled || methodPaySupported.loading))
129
+
87
130
  const handleMomentClick = () => {
88
- if (isPreOrder) {
89
- navigation.navigate('MomentOption')
90
- }
91
- }
131
+ if (isPreOrder) {
132
+ navigation.navigate('MomentOption')
133
+ }
134
+ }
92
135
 
93
136
  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
- }
137
+ setUserErrors([])
138
+ const errors = []
139
+ const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes']
140
+
141
+ Object.values(validationFields?.fields?.checkout).map((field: any) => {
142
+ if (field?.required && !notFields.includes(field.code)) {
143
+ if (!user[field?.code]) {
144
+ errors.push(t(`VALIDATION_ERROR_${field.code.toUpperCase()}_REQUIRED`, `The field ${field?.name} is required`))
145
+ }
146
+ }
147
+ })
148
+
149
+ if (
150
+ !user?.cellphone &&
151
+ ((validationFields?.fields?.checkout?.cellphone?.enabled &&
152
+ validationFields?.fields?.checkout?.cellphone?.required) ||
153
+ configs?.verification_phone_required?.value === '1')
154
+ ) {
155
+ errors.push(t('VALIDATION_ERROR_MOBILE_PHONE_REQUIRED', 'The field Phone number is required'))
156
+ }
157
+
158
+ if (phoneUpdate) {
159
+ errors.push(t('NECESSARY_UPDATE_COUNTRY_PHONE_CODE', 'It is necessary to update your phone number'))
160
+ }
161
+
162
+ setUserErrors(errors)
163
+ }
121
164
 
122
165
  const togglePhoneUpdate = (val: boolean) => {
123
- setPhoneUpdate(val)
124
- }
166
+ setPhoneUpdate(val)
167
+ }
125
168
 
126
169
  const handlePlaceOrder = () => {
127
170
  if (!userErrors.length) {
@@ -129,33 +172,52 @@ const MultiCheckoutUI = (props: any) => {
129
172
  return
130
173
  }
131
174
  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)
175
+ Object.values(userErrors).map((item: any, i: number) => {
176
+ stringError += (i + 1) === userErrors.length ? `- ${item?.message || item}` : `- ${item?.message || item}\n`
177
+ })
178
+ showToast(ToastType.Error, stringError)
136
179
  setIsUserDetailsEdit(true)
137
180
  }
138
181
 
139
182
  useEffect(() => {
140
- if (validationFields && validationFields?.fields?.checkout) {
141
- checkValidationFields()
142
- }
143
- }, [validationFields, user])
183
+ if (validationFields && validationFields?.fields?.checkout) {
184
+ checkValidationFields()
185
+ }
186
+ }, [validationFields, user])
187
+
188
+ useEffect(() => {
189
+ if (openCarts.length === 1) {
190
+ onNavigationRedirectReplace('CheckoutPage', {
191
+ cartUuid: openCarts[0]?.uuid,
192
+ fromMulti: true
193
+ })
194
+ return
195
+ }
196
+ }, [openCarts])
197
+
198
+ useEffect(() => {
199
+ if (walletState.error) {
200
+ showToast(ToastType.Error, t(walletState.error, walletState.error?.[0]?.replace(/_/g, ' ')))
201
+ }
202
+ }, [walletState.error])
203
+
204
+ useEffect(() => {
205
+ if (!cartUuid) {
206
+ onNavigationRedirectReplace('BottomTab', { screen: 'Cart' })
207
+ }
208
+ }, [cartUuid])
144
209
 
145
210
  return (
146
211
  <>
147
212
  <Container noPadding>
148
213
  <View style={styles.wrapperNavbar}>
149
214
  <NavBar
150
- isVertical
151
215
  title={t('CHECKOUT', 'Checkout')}
152
216
  titleAlign={'center'}
153
217
  onActionLeft={() => navigation?.canGoBack() && navigation.goBack()}
154
218
  showCall={false}
219
+ paddingTop={Platform.OS === 'ios' ? 0 : 4}
155
220
  btnStyle={{ paddingLeft: 0 }}
156
- style={{ marginTop: Platform.OS === 'ios' ? 0 : 30 }}
157
- titleWrapStyle={{ paddingHorizontal: 0 }}
158
- titleStyle={{ marginRight: 0, marginLeft: 0 }}
159
221
  />
160
222
  </View>
161
223
  <ChContainer style={styles.pagePadding}>
@@ -222,13 +284,74 @@ const MultiCheckoutUI = (props: any) => {
222
284
  <MultiCartsPaymethodsAndWallets
223
285
  openCarts={openCarts}
224
286
  paymethodSelected={paymethodSelected}
287
+ walletsPaymethod={cartGroup?.result?.wallets}
225
288
  handleSelectPaymethod={handleSelectPaymethod}
226
289
  handleSelectWallet={handleSelectWallet}
227
290
  handlePaymethodDataChange={handlePaymethodDataChange}
291
+ cartUuid={cartUuid}
292
+ merchantId={merchantId}
293
+ setMethodPaySupported={setMethodPaySupported}
294
+ methodPaySupported={methodPaySupported}
295
+ placeByMethodPay={placeByMethodPay}
296
+ setPlaceByMethodPay={setPlaceByMethodPay}
297
+ cartTotal={totalCartsPrice}
298
+ handlePlaceOrder={handlePlaceOrder}
228
299
  />
229
300
  <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
230
301
  </ChSection>
231
302
 
303
+ {
304
+ isMultiDriverTips &&
305
+ options?.type === 1 &&
306
+ validationFields?.fields?.checkout?.driver_tip?.enabled &&
307
+ openCarts.every((cart: any) => cart.business_id && cart.status !== 2) &&
308
+ driverTipsOptions && driverTipsOptions?.length > 0 &&
309
+ (
310
+ <ChSection>
311
+ <DriverTipsContainer>
312
+ <OText size={14} lineHeight={20} color={theme.colors.textNormal}>
313
+ {t('DRIVER_TIPS', 'Driver Tips')}
314
+ </OText>
315
+ <DriverTips
316
+ isMulti
317
+ carts={openCarts}
318
+ businessIds={openCarts.map((cart: any) => cart.business_id)}
319
+ driverTipsOptions={driverTipsOptions}
320
+ isFixedPrice={parseInt(configs?.driver_tip_type?.value, 10) === 1}
321
+ isDriverTipUseCustom={!!parseInt(configs?.driver_tip_use_custom?.value, 10)}
322
+ driverTip={parseInt(configs?.driver_tip_type?.value, 10) === 1
323
+ ? openCarts[0]?.driver_tip
324
+ : openCarts[0]?.driver_tip_rate}
325
+ useOrderContext
326
+ />
327
+ </DriverTipsContainer>
328
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
329
+ </ChSection>
330
+ )}
331
+
332
+ {
333
+ validationFields?.fields?.checkout?.coupon?.enabled &&
334
+ openCarts.every((cart: any) => cart.business_id && cart.status !== 2) &&
335
+ configs?.multi_business_checkout_coupon_input_style?.value === 'group' &&
336
+ (
337
+ <ChSection>
338
+ <OText size={14} lineHeight={20} color={theme.colors.textNormal}>
339
+ {t('DISCOUNT_COUPON', 'Discount coupon')}
340
+ </OText>
341
+ <OSTable>
342
+ <OSCoupon>
343
+ <CouponControl
344
+ isMulti
345
+ carts={openCarts}
346
+ businessIds={openCarts.map((cart: any) => cart.business_id)}
347
+ price={openCarts.reduce((total: any, cart: any) => total + cart.total, 0)}
348
+ />
349
+ </OSCoupon>
350
+ </OSTable>
351
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
352
+ </ChSection>
353
+ )}
354
+
232
355
  <ChSection>
233
356
  <ChCarts>
234
357
  <CartsHeader>
@@ -242,12 +365,18 @@ const MultiCheckoutUI = (props: any) => {
242
365
  cart={cart}
243
366
  cartuuid={cart.uuid}
244
367
  isMultiCheckout
368
+ hideCouponInput={configs?.multi_business_checkout_coupon_input_style?.value === 'group'}
369
+ hideDeliveryFee={configs?.multi_business_checkout_show_combined_delivery_fee?.value === '1'}
370
+ hideDriverTip={configs?.multi_business_checkout_show_combined_driver_tip?.value === '1'}
245
371
  onNavigationRedirect={(route: string, params: any) => props.navigation.navigate(route, params)}
372
+ businessConfigs={cart?.business?.configs}
246
373
  />
247
- <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
374
+ {openCarts.length > 1 && (
375
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
376
+ )}
248
377
  </React.Fragment>
249
378
  ))}
250
- {openCarts.length === 0 && (
379
+ {!cartGroup?.loading && openCarts.length === 0 && (
251
380
  <CCNotCarts>
252
381
  <OText size={24} style={{ textAlign: 'center' }}>
253
382
  {t('CARTS_NOT_FOUND', 'You don\'t have carts available')}
@@ -259,36 +388,61 @@ const MultiCheckoutUI = (props: any) => {
259
388
  {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
389
  </OText>
261
390
  )}
262
- {openCarts.length > 0 && (
391
+ {openCarts.length > 1 && (
263
392
  <ChCartsTotal>
393
+ {!!totalCartsFee && configs?.multi_business_checkout_show_combined_delivery_fee?.value === '1' && (
394
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
395
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
396
+ {t('TOTAL_DELIVERY_FEE', 'Total delivery fee')}
397
+ </OText>
398
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
399
+ {parsePrice(totalCartsFee)}
400
+ </OText>
401
+ </View>
402
+ )}
403
+ {openCarts.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0) > 0 &&
404
+ configs?.multi_business_checkout_show_combined_driver_tip?.value === '1' && (
405
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
406
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
407
+ {t('DRIVER_TIP', 'Driver tip')}
408
+ </OText>
409
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
410
+ {parsePrice(openCarts.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0))}
411
+ </OText>
412
+ </View>
413
+ )}
264
414
  <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
265
415
  <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>
266
416
  {t('TOTAL_FOR_ALL_CARTS', 'Total for all Carts')}
267
417
  </OText>
268
418
  <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>{parsePrice(totalCartsPrice)}</OText>
269
419
  </View>
420
+ {!!loyaltyRewardValue && (
421
+ <View style={{ flexDirection: 'row', marginTop: 10, justifyContent: 'flex-end' }}>
422
+ <OText size={12} color={theme.colors.textNormal}>
423
+ {t('REWARD_LOYALTY_POINT', 'Reward :amount: on loyalty points').replace(':amount:', loyaltyRewardValue)}
424
+ </OText>
425
+ </View>
426
+ )}
270
427
  <OText size={12} color={theme.colors.mediumGray} mRight={70} style={{ marginTop: 10 }}>
271
428
  {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
429
  </OText>
273
430
  </ChCartsTotal>
274
431
  )}
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
432
  </ChCarts>
281
433
  </ChSection>
282
434
  </ChContainer>
283
435
  </Container>
284
-
436
+
285
437
  <FloatingButton
286
- handleClick={() => handlePlaceOrder()}
438
+ handleClick={methodsPay.includes(paymethodSelected?.gateway)
439
+ ? () => setPlaceByMethodPay(true)
440
+ : () => handlePlaceOrder()}
287
441
  isSecondaryBtn={isDisablePlaceOrderButton}
288
442
  disabled={isDisablePlaceOrderButton}
289
443
  btnText={placing ? t('PLACING', 'Placing') : t('PLACE_ORDER', 'Place Order')}
290
444
  btnRightValueShow
291
- btnRightValue={parsePrice(totalCartsPrice)}
445
+ btnRightValue={parsePrice(totalCartsPrice)}
292
446
  iosBottom={30}
293
447
  />
294
448
  </>
@@ -296,9 +450,34 @@ const MultiCheckoutUI = (props: any) => {
296
450
  }
297
451
 
298
452
  export const MultiCheckout = (props: any) => {
453
+ const [loadMultiCarts, setLoadMultiCarts] = useState(!!props.route?.params?.checkCarts)
454
+ const [cartUuid, setCartUuid] = useState('')
455
+
299
456
  const multiCheckoutProps = {
300
457
  ...props,
458
+ cartUuid: props.route?.params?.cartUuid ?? cartUuid,
301
459
  UIComponent: MultiCheckoutUI
302
460
  }
303
- return <MultiCheckoutController {...multiCheckoutProps} />
461
+
462
+ const multiCartProps = {
463
+ ...props,
464
+ handleOnRedirectMultiCheckout: (cartUuid: string) => {
465
+ setCartUuid(cartUuid)
466
+ setLoadMultiCarts(false)
467
+ },
468
+ handleOnRedirectCheckout: (cartUuid: string) => {
469
+ props.navigation.navigate('CheckoutNavigator', {
470
+ screen: 'CheckoutPage',
471
+ cartUuid
472
+ })
473
+ }
474
+ }
475
+
476
+ return (
477
+ loadMultiCarts ? (
478
+ <MultiCartController {...multiCartProps} />
479
+ ) : (
480
+ <MultiCheckoutController {...multiCheckoutProps} />
481
+ )
482
+ )
304
483
  }