ordering-ui-react-native 0.17.64 → 0.17.65-release

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