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