ordering-ui-react-native 0.17.37 → 0.17.38-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 (214) 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/StripeMethodForm/index.tsx +103 -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 +79 -44
  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 +159 -90
  72. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +9 -7
  73. package/themes/original/src/components/BusinessController/index.tsx +154 -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 +351 -326
  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/UpsellingRedirect.tsx +1 -1
  84. package/themes/original/src/components/BusinessProductsListing/index.tsx +684 -524
  85. package/themes/original/src/components/BusinessProductsListing/styles.tsx +4 -6
  86. package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
  87. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +1 -1
  88. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +106 -79
  89. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -9
  90. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  91. package/themes/original/src/components/Cart/index.tsx +102 -69
  92. package/themes/original/src/components/CartContent/index.tsx +115 -19
  93. package/themes/original/src/components/CartContent/styles.tsx +17 -7
  94. package/themes/original/src/components/Checkout/index.tsx +375 -179
  95. package/themes/original/src/components/Checkout/styles.tsx +4 -2
  96. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  97. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  98. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  99. package/themes/original/src/components/DriverTips/index.tsx +52 -34
  100. package/themes/original/src/components/Favorite/index.tsx +7 -4
  101. package/themes/original/src/components/Favorite/styles.tsx +1 -1
  102. package/themes/original/src/components/FavoriteList/index.tsx +51 -80
  103. package/themes/original/src/components/FloatingButton/index.tsx +1 -2
  104. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  105. package/themes/original/src/components/GPSButton/index.tsx +6 -4
  106. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  107. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +96 -0
  108. package/themes/original/src/components/GiftCard/GiftCardUI/styles.tsx +5 -0
  109. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +100 -0
  110. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +8 -0
  111. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +191 -0
  112. package/themes/original/src/components/GiftCard/RedeemGiftCard/styles.tsx +8 -0
  113. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +165 -0
  114. package/themes/original/src/components/GiftCard/SendGiftCard/styles.tsx +9 -0
  115. package/themes/original/src/components/GoogleMap/index.tsx +15 -4
  116. package/themes/original/src/components/Help/index.tsx +8 -8
  117. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +11 -22
  118. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +6 -0
  119. package/themes/original/src/components/HelpGuide/index.tsx +12 -16
  120. package/themes/original/src/components/HelpGuide/styles.tsx +6 -0
  121. package/themes/original/src/components/HelpOrder/index.tsx +12 -25
  122. package/themes/original/src/components/HelpOrder/styles.tsx +8 -1
  123. package/themes/original/src/components/Home/index.tsx +13 -4
  124. package/themes/original/src/components/LastOrder/index.tsx +1 -34
  125. package/themes/original/src/components/LoginForm/Otp/index.tsx +139 -75
  126. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  127. package/themes/original/src/components/LoginForm/index.tsx +71 -28
  128. package/themes/original/src/components/LottieAnimation/index.tsx +103 -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 +219 -117
  134. package/themes/original/src/components/MultiCheckout/index.tsx +298 -88
  135. package/themes/original/src/components/MultiCheckout/styles.tsx +3 -1
  136. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +37 -224
  137. package/themes/original/src/components/MultiOrdersDetails/index.tsx +68 -21
  138. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
  139. package/themes/original/src/components/MyOrders/index.tsx +53 -51
  140. package/themes/original/src/components/NavBar/index.tsx +18 -18
  141. package/themes/original/src/components/NotFoundSource/index.tsx +14 -10
  142. package/themes/original/src/components/Notifications/index.tsx +46 -50
  143. package/themes/original/src/components/Notifications/styles.tsx +6 -3
  144. package/themes/original/src/components/OrderDetails/OrderEta.tsx +76 -0
  145. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +15 -3
  146. package/themes/original/src/components/OrderDetails/index.tsx +199 -359
  147. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  148. package/themes/original/src/components/OrderItAgain/index.tsx +3 -1
  149. package/themes/original/src/components/OrderProgress/index.tsx +93 -114
  150. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  151. package/themes/original/src/components/OrderSummary/index.tsx +87 -59
  152. package/themes/original/src/components/OrderTypeSelector/index.tsx +1 -1
  153. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +24 -19
  154. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +14 -14
  155. package/themes/original/src/components/OrdersOption/index.tsx +70 -65
  156. package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
  157. package/themes/original/src/components/PageBanner/index.tsx +171 -0
  158. package/themes/original/src/components/PageBanner/styles.tsx +11 -0
  159. package/themes/original/src/components/PaymentOptionCard/index.tsx +180 -0
  160. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +1 -1
  161. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  162. package/themes/original/src/components/PaymentOptions/index.tsx +64 -7
  163. package/themes/original/src/components/PhoneInputNumber/index.tsx +3 -3
  164. package/themes/original/src/components/PlaceSpot/index.tsx +12 -6
  165. package/themes/original/src/components/ProductForm/index.tsx +223 -232
  166. package/themes/original/src/components/ProductForm/styles.tsx +5 -8
  167. package/themes/original/src/components/ProductItemAccordion/index.tsx +59 -29
  168. package/themes/original/src/components/ProductOptionSubOption/index.tsx +19 -11
  169. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +1 -2
  170. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  171. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -50
  172. package/themes/original/src/components/ProfessionalProfile/index.tsx +36 -7
  173. package/themes/original/src/components/Promotions/index.tsx +234 -220
  174. package/themes/original/src/components/Promotions/styles.tsx +10 -3
  175. package/themes/original/src/components/ReviewDriver/index.tsx +3 -3
  176. package/themes/original/src/components/ReviewOrder/index.tsx +26 -9
  177. package/themes/original/src/components/ReviewOrder/styles.tsx +7 -0
  178. package/themes/original/src/components/ReviewProducts/index.tsx +23 -11
  179. package/themes/original/src/components/ReviewTrigger/index.tsx +27 -9
  180. package/themes/original/src/components/ReviewTrigger/styles.tsx +8 -1
  181. package/themes/original/src/components/ScheduleAccordion/index.tsx +68 -0
  182. package/themes/original/src/components/ScheduleAccordion/styles.tsx +14 -0
  183. package/themes/original/src/components/ServiceForm/index.tsx +74 -19
  184. package/themes/original/src/components/Sessions/index.tsx +11 -8
  185. package/themes/original/src/components/Sessions/styles.tsx +5 -0
  186. package/themes/original/src/components/SignupForm/index.tsx +42 -19
  187. package/themes/original/src/components/SingleOrderCard/index.tsx +156 -65
  188. package/themes/original/src/components/SingleOrderCard/styles.tsx +11 -9
  189. package/themes/original/src/components/SingleProductCard/index.tsx +100 -56
  190. package/themes/original/src/components/SingleProductCard/styles.tsx +22 -13
  191. package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
  192. package/themes/original/src/components/StripeCardsList/index.tsx +13 -3
  193. package/themes/original/src/components/StripeElementsForm/index.tsx +28 -15
  194. package/themes/original/src/components/UpsellingProducts/index.tsx +238 -224
  195. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  196. package/themes/original/src/components/UserDetails/index.tsx +8 -4
  197. package/themes/original/src/components/UserFormDetails/index.tsx +47 -7
  198. package/themes/original/src/components/UserProfile/index.tsx +5 -7
  199. package/themes/original/src/components/UserProfileForm/index.tsx +25 -28
  200. package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
  201. package/themes/original/src/components/WalletTransactionItem/index.tsx +2 -2
  202. package/themes/original/src/components/WalletTransactions/index.tsx +3 -3
  203. package/themes/original/src/components/Wallets/index.tsx +79 -36
  204. package/themes/original/src/components/Wallets/styles.tsx +5 -4
  205. package/themes/original/src/components/shared/CardAnimation.tsx +47 -0
  206. package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
  207. package/themes/original/src/components/shared/OBottomPopup.tsx +1 -1
  208. package/themes/original/src/components/shared/OButton.tsx +6 -2
  209. package/themes/original/src/components/shared/OInput.tsx +16 -2
  210. package/themes/original/src/components/shared/OModal.tsx +3 -3
  211. package/themes/original/src/layouts/Container.tsx +13 -9
  212. package/themes/original/src/types/index.tsx +38 -9
  213. package/themes/original/src/utils/index.tsx +364 -58
  214. 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,198 @@ 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])
144
222
 
145
223
  return (
146
224
  <>
147
225
  <Container noPadding>
148
226
  <View style={styles.wrapperNavbar}>
149
227
  <NavBar
150
- isVertical
151
228
  title={t('CHECKOUT', 'Checkout')}
152
229
  titleAlign={'center'}
153
230
  onActionLeft={() => navigation?.canGoBack() && navigation.goBack()}
154
231
  showCall={false}
232
+ paddingTop={Platform.OS === 'ios' ? 0 : 4}
155
233
  btnStyle={{ paddingLeft: 0 }}
156
- style={{ marginTop: Platform.OS === 'ios' ? 0 : 30 }}
157
- titleWrapStyle={{ paddingHorizontal: 0 }}
158
- titleStyle={{ marginRight: 0, marginLeft: 0 }}
159
234
  />
160
235
  </View>
161
236
  <ChContainer style={styles.pagePadding}>
162
237
  <ChSection style={{ paddingTop: 0 }}>
163
238
  <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>
239
+ <CHMomentWrapper isCustomColor={isChewLayout} onPress={() => navigation.navigate('OrderTypes', { configTypes: configTypes })}>
240
+ <OText
241
+ size={12}
242
+ numberOfLines={1}
243
+ ellipsizeMode={'tail'}
244
+ color={theme.colors?.[isChewLayout ? 'white' : 'textSecondary']}
245
+ >
246
+ {t(getTypesText(options?.type || 1), 'Delivery')}
247
+ </OText>
166
248
  <OIcon
167
249
  src={theme.images.general.arrow_down}
168
250
  width={10}
@@ -222,13 +304,75 @@ const MultiCheckoutUI = (props: any) => {
222
304
  <MultiCartsPaymethodsAndWallets
223
305
  openCarts={openCarts}
224
306
  paymethodSelected={paymethodSelected}
307
+ walletsPaymethod={cartGroup?.result?.wallets}
225
308
  handleSelectPaymethod={handleSelectPaymethod}
226
309
  handleSelectWallet={handleSelectWallet}
227
310
  handlePaymethodDataChange={handlePaymethodDataChange}
311
+ cartUuid={cartUuid}
312
+ merchantId={merchantId}
313
+ setMethodPaySupported={setMethodPaySupported}
314
+ methodPaySupported={methodPaySupported}
315
+ placeByMethodPay={placeByMethodPay}
316
+ setPlaceByMethodPay={setPlaceByMethodPay}
317
+ cartTotal={totalCartsPrice}
318
+ handlePlaceOrder={handlePlaceOrder}
228
319
  />
229
320
  <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
230
321
  </ChSection>
231
322
 
323
+ {
324
+ isMultiDriverTips &&
325
+ options?.type === 1 &&
326
+ validationFields?.fields?.checkout?.driver_tip?.enabled &&
327
+ openCarts.every((cart: any) => cart.business_id && cart.status !== 2) &&
328
+ driverTipsOptions && driverTipsOptions?.length > 0 &&
329
+ (
330
+ <ChSection>
331
+ <DriverTipsContainer>
332
+ <OText size={14} lineHeight={20} color={theme.colors.textNormal}>
333
+ {t('DRIVER_TIPS', 'Driver Tips')}
334
+ </OText>
335
+ <DriverTips
336
+ isMulti
337
+ isLoading={loading}
338
+ carts={openCarts}
339
+ businessIds={openCarts.map((cart: any) => cart.business_id)}
340
+ driverTipsOptions={driverTipsOptions}
341
+ isFixedPrice={parseInt(configs?.driver_tip_type?.value, 10) === 1}
342
+ isDriverTipUseCustom={!!parseInt(configs?.driver_tip_use_custom?.value, 10)}
343
+ driverTip={parseInt(configs?.driver_tip_type?.value, 10) === 1
344
+ ? openCarts?.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0)
345
+ : openCarts[0]?.driver_tip_rate}
346
+ useOrderContext
347
+ />
348
+ </DriverTipsContainer>
349
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
350
+ </ChSection>
351
+ )}
352
+
353
+ {
354
+ validationFields?.fields?.checkout?.coupon?.enabled &&
355
+ openCarts.every((cart: any) => cart.business_id && cart.status !== 2) &&
356
+ configs?.multi_business_checkout_coupon_input_style?.value === 'group' &&
357
+ (
358
+ <ChSection>
359
+ <OText size={14} lineHeight={20} color={theme.colors.textNormal}>
360
+ {t('DISCOUNT_COUPON', 'Discount coupon')}
361
+ </OText>
362
+ <OSTable>
363
+ <OSCoupon>
364
+ <CouponControl
365
+ isMulti
366
+ carts={openCarts}
367
+ businessIds={openCarts.map((cart: any) => cart.business_id)}
368
+ price={openCarts.reduce((total: any, cart: any) => total + cart.total, 0)}
369
+ />
370
+ </OSCoupon>
371
+ </OSTable>
372
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
373
+ </ChSection>
374
+ )}
375
+
232
376
  <ChSection>
233
377
  <ChCarts>
234
378
  <CartsHeader>
@@ -242,12 +386,18 @@ const MultiCheckoutUI = (props: any) => {
242
386
  cart={cart}
243
387
  cartuuid={cart.uuid}
244
388
  isMultiCheckout
389
+ hideCouponInput={configs?.multi_business_checkout_coupon_input_style?.value === 'group'}
390
+ hideDeliveryFee={configs?.multi_business_checkout_show_combined_delivery_fee?.value === '1'}
391
+ hideDriverTip={configs?.multi_business_checkout_show_combined_driver_tip?.value === '1'}
245
392
  onNavigationRedirect={(route: string, params: any) => props.navigation.navigate(route, params)}
393
+ businessConfigs={cart?.business?.configs}
246
394
  />
247
- <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
395
+ {openCarts.length > 1 && (
396
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
397
+ )}
248
398
  </React.Fragment>
249
399
  ))}
250
- {openCarts.length === 0 && (
400
+ {!cartGroup?.loading && openCarts.length === 0 && (
251
401
  <CCNotCarts>
252
402
  <OText size={24} style={{ textAlign: 'center' }}>
253
403
  {t('CARTS_NOT_FOUND', 'You don\'t have carts available')}
@@ -259,36 +409,71 @@ const MultiCheckoutUI = (props: any) => {
259
409
  {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
410
  </OText>
261
411
  )}
262
- {openCarts.length > 0 && (
412
+ {openCarts.length > 1 && (
263
413
  <ChCartsTotal>
414
+ {!!totalCartsFee && configs?.multi_business_checkout_show_combined_delivery_fee?.value === '1' && (
415
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
416
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
417
+ {t('TOTAL_DELIVERY_FEE', 'Total delivery fee')}
418
+ </OText>
419
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
420
+ {parsePrice(totalCartsFee)}
421
+ </OText>
422
+ </View>
423
+ )}
424
+ {openCarts.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0) > 0 &&
425
+ configs?.multi_business_checkout_show_combined_driver_tip?.value === '1' && (
426
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
427
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
428
+ {t('DRIVER_TIP', 'Driver tip')}
429
+ </OText>
430
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
431
+ {parsePrice(openCarts.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0))}
432
+ </OText>
433
+ </View>
434
+ )}
435
+ {!cartGroup?.loading && cartGroup?.result?.payment_events?.length > 0 && cartGroup?.result?.payment_events?.map((event: any) => (
436
+ <View key={event.id} style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
437
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
438
+ {walletName[cartGroup?.result?.wallets?.find((wallet: any) => wallet.wallet_id === event.wallet_id)?.type]?.name}
439
+ </OText>
440
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
441
+ -{parsePrice(event.amount, { isTruncable: true })}
442
+ </OText>
443
+ </View>
444
+ ))}
264
445
  <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
265
446
  <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>
266
447
  {t('TOTAL_FOR_ALL_CARTS', 'Total for all Carts')}
267
448
  </OText>
268
449
  <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>{parsePrice(totalCartsPrice)}</OText>
269
450
  </View>
451
+ {!!loyaltyRewardValue && (
452
+ <View style={{ flexDirection: 'row', marginTop: 10, justifyContent: 'flex-end' }}>
453
+ <OText size={12} color={theme.colors.textNormal}>
454
+ {t('REWARD_LOYALTY_POINT', 'Reward :amount: on loyalty points').replace(':amount:', loyaltyRewardValue)}
455
+ </OText>
456
+ </View>
457
+ )}
270
458
  <OText size={12} color={theme.colors.mediumGray} mRight={70} style={{ marginTop: 10 }}>
271
459
  {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
460
  </OText>
273
461
  </ChCartsTotal>
274
462
  )}
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
463
  </ChCarts>
281
464
  </ChSection>
282
465
  </ChContainer>
283
466
  </Container>
284
-
467
+
285
468
  <FloatingButton
286
- handleClick={() => handlePlaceOrder()}
469
+ handleClick={methodsPay.includes(paymethodSelected?.gateway)
470
+ ? () => setPlaceByMethodPay(true)
471
+ : () => handlePlaceOrder()}
287
472
  isSecondaryBtn={isDisablePlaceOrderButton}
288
473
  disabled={isDisablePlaceOrderButton}
289
474
  btnText={placing ? t('PLACING', 'Placing') : t('PLACE_ORDER', 'Place Order')}
290
475
  btnRightValueShow
291
- btnRightValue={parsePrice(totalCartsPrice)}
476
+ btnRightValue={parsePrice(totalCartsPrice)}
292
477
  iosBottom={30}
293
478
  />
294
479
  </>
@@ -296,9 +481,34 @@ const MultiCheckoutUI = (props: any) => {
296
481
  }
297
482
 
298
483
  export const MultiCheckout = (props: any) => {
484
+ const [loadMultiCarts, setLoadMultiCarts] = useState(!!props.route?.params?.checkCarts)
485
+ const [cartUuid, setCartUuid] = useState('')
486
+
299
487
  const multiCheckoutProps = {
300
488
  ...props,
489
+ cartUuid: props.route?.params?.cartUuid ?? cartUuid,
301
490
  UIComponent: MultiCheckoutUI
302
491
  }
303
- return <MultiCheckoutController {...multiCheckoutProps} />
492
+
493
+ const multiCartProps = {
494
+ ...props,
495
+ handleOnRedirectMultiCheckout: (cartUuid: string) => {
496
+ setCartUuid(cartUuid)
497
+ setLoadMultiCarts(false)
498
+ },
499
+ handleOnRedirectCheckout: (cartUuid: string) => {
500
+ props.navigation.navigate('CheckoutNavigator', {
501
+ screen: 'CheckoutPage',
502
+ cartUuid
503
+ })
504
+ }
505
+ }
506
+
507
+ return (
508
+ loadMultiCarts ? (
509
+ <MultiCartController {...multiCartProps} />
510
+ ) : (
511
+ <MultiCheckoutController {...multiCheckoutProps} />
512
+ )
513
+ )
304
514
  }
@@ -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;