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