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