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