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