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