ordering-ui-react-native 0.17.71 → 0.17.72-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 (201) hide show
  1. package/package.json +8 -7
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessInformation/index.tsx +10 -9
  4. package/src/components/BusinessesListing/index.tsx +1 -1
  5. package/src/components/OrderCreating/index.tsx +1 -21
  6. package/src/components/PaymentOptionsWebView/index.tsx +29 -8
  7. package/src/components/PhoneInputNumber/index.tsx +6 -2
  8. package/src/components/StripeMethodForm/index.tsx +136 -102
  9. package/src/components/VerifyPhone/styles.tsx +1 -2
  10. package/src/components/shared/OToast.tsx +3 -2
  11. package/src/types/index.tsx +5 -0
  12. package/src/utils/index.tsx +5 -0
  13. package/themes/business/index.tsx +2 -0
  14. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +28 -24
  15. package/themes/business/src/components/BusinessController/index.tsx +0 -1
  16. package/themes/business/src/components/Chat/index.tsx +149 -118
  17. package/themes/business/src/components/DriverMap/index.tsx +17 -6
  18. package/themes/business/src/components/DriverSchedule/index.tsx +45 -8
  19. package/themes/business/src/components/GoogleMap/index.tsx +58 -57
  20. package/themes/business/src/components/LoginForm/Otp/index.tsx +31 -3
  21. package/themes/business/src/components/LoginForm/index.tsx +15 -22
  22. package/themes/business/src/components/MapView/index.tsx +10 -10
  23. package/themes/business/src/components/MessagesOption/index.tsx +20 -93
  24. package/themes/business/src/components/NewOrderNotification/index.tsx +35 -21
  25. package/themes/business/src/components/NotFoundSource/index.tsx +2 -2
  26. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  27. package/themes/business/src/components/OrderDetails/Delivery.tsx +191 -6
  28. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +103 -39
  29. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +61 -60
  30. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +195 -0
  31. package/themes/business/src/components/OrderDetailsLogistic/styles.tsx +5 -0
  32. package/themes/business/src/components/OrderMessage/index.tsx +19 -18
  33. package/themes/business/src/components/OrderSummary/index.tsx +114 -123
  34. package/themes/business/src/components/OrdersOption/index.tsx +17 -15
  35. package/themes/business/src/components/PreviousMessages/FooterMessageComponent.tsx +103 -0
  36. package/themes/business/src/components/PreviousMessages/index.tsx +97 -55
  37. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +17 -12
  38. package/themes/business/src/components/PreviousOrders/OrderList.tsx +88 -0
  39. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +1 -1
  40. package/themes/business/src/components/PreviousOrders/index.tsx +186 -114
  41. package/themes/business/src/components/PreviousOrders/styles.tsx +1 -1
  42. package/themes/business/src/components/ProductItemAccordion/index.tsx +27 -3
  43. package/themes/business/src/components/ReviewCustomer/index.tsx +18 -13
  44. package/themes/business/src/components/StoresList/index.tsx +3 -4
  45. package/themes/business/src/components/UserProfileForm/index.tsx +14 -15
  46. package/themes/business/src/components/shared/OLink.tsx +11 -3
  47. package/themes/business/src/components/shared/OModal.tsx +16 -9
  48. package/themes/business/src/components/shared/OText.tsx +6 -1
  49. package/themes/business/src/types/index.tsx +25 -10
  50. package/themes/business/src/utils/index.tsx +29 -2
  51. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  52. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  53. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  54. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  55. package/themes/kiosk/src/components/Intro/index.tsx +16 -1
  56. package/themes/kiosk/src/components/LoginForm/index.tsx +7 -9
  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 +2 -2
  61. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  62. package/themes/original/index.tsx +1 -1
  63. package/themes/original/src/components/AddressDetails/index.tsx +19 -3
  64. package/themes/original/src/components/AddressForm/index.tsx +61 -39
  65. package/themes/original/src/components/AddressList/index.tsx +25 -24
  66. package/themes/original/src/components/AddressList/styles.tsx +4 -2
  67. package/themes/original/src/components/AnalyticsSegment/index.tsx +193 -10
  68. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  69. package/themes/original/src/components/AppleLogin/styles.tsx +3 -1
  70. package/themes/original/src/components/BusinessBasicInformation/index.tsx +153 -96
  71. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +10 -12
  72. package/themes/original/src/components/BusinessController/index.tsx +80 -66
  73. package/themes/original/src/components/BusinessController/styles.tsx +12 -5
  74. package/themes/original/src/components/BusinessFeaturedController/index.tsx +21 -54
  75. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +8 -0
  76. package/themes/original/src/components/BusinessInformation/index.tsx +139 -85
  77. package/themes/original/src/components/BusinessItemAccordion/index.tsx +15 -20
  78. package/themes/original/src/components/BusinessListingSearch/index.tsx +349 -339
  79. package/themes/original/src/components/BusinessListingSearch/styles.tsx +0 -18
  80. package/themes/original/src/components/BusinessPreorder/index.tsx +103 -19
  81. package/themes/original/src/components/BusinessProductsCategories/index.tsx +1 -2
  82. package/themes/original/src/components/BusinessProductsList/index.tsx +15 -7
  83. package/themes/original/src/components/BusinessProductsList/styles.tsx +8 -3
  84. package/themes/original/src/components/BusinessProductsListing/UpsellingRedirect.tsx +1 -1
  85. package/themes/original/src/components/BusinessProductsListing/index.tsx +684 -555
  86. package/themes/original/src/components/BusinessProductsListing/styles.tsx +2 -2
  87. package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
  88. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +69 -38
  89. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +0 -1
  90. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  91. package/themes/original/src/components/Cart/index.tsx +77 -79
  92. package/themes/original/src/components/CartContent/index.tsx +117 -20
  93. package/themes/original/src/components/CartContent/styles.tsx +17 -7
  94. package/themes/original/src/components/Checkout/index.tsx +356 -124
  95. package/themes/original/src/components/CitiesControl/index.tsx +1 -1
  96. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  97. package/themes/original/src/components/DriverTips/index.tsx +52 -34
  98. package/themes/original/src/components/FacebookLogin/styles.tsx +3 -1
  99. package/themes/original/src/components/Favorite/index.tsx +2 -6
  100. package/themes/original/src/components/FavoriteList/index.tsx +1 -35
  101. package/themes/original/src/components/FloatingButton/index.tsx +10 -13
  102. package/themes/original/src/components/GPSButton/index.tsx +6 -4
  103. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +96 -0
  104. package/themes/original/src/components/GiftCard/GiftCardUI/styles.tsx +5 -0
  105. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +100 -0
  106. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +8 -0
  107. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +191 -0
  108. package/themes/original/src/components/GiftCard/RedeemGiftCard/styles.tsx +8 -0
  109. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +165 -0
  110. package/themes/original/src/components/GiftCard/SendGiftCard/styles.tsx +9 -0
  111. package/themes/original/src/components/GoogleLogin/styles.tsx +1 -1
  112. package/themes/original/src/components/GoogleMap/index.tsx +60 -5
  113. package/themes/original/src/components/Help/index.tsx +2 -2
  114. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +10 -31
  115. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +5 -3
  116. package/themes/original/src/components/HelpGuide/index.tsx +6 -6
  117. package/themes/original/src/components/HelpGuide/styles.tsx +6 -0
  118. package/themes/original/src/components/HelpOrder/index.tsx +6 -15
  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/LastOrder/index.tsx +1 -34
  122. package/themes/original/src/components/LoginForm/Otp/index.tsx +91 -25
  123. package/themes/original/src/components/LoginForm/index.tsx +64 -34
  124. package/themes/original/src/components/LottieAnimation/index.tsx +88 -63
  125. package/themes/original/src/components/MessageListing/index.tsx +16 -42
  126. package/themes/original/src/components/Messages/index.tsx +14 -7
  127. package/themes/original/src/components/MomentOption/index.tsx +193 -90
  128. package/themes/original/src/components/MomentSelector/index.tsx +1 -1
  129. package/themes/original/src/components/MultiCart/index.tsx +41 -54
  130. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +162 -50
  131. package/themes/original/src/components/MultiCheckout/index.tsx +329 -100
  132. package/themes/original/src/components/MultiCheckout/styles.tsx +3 -1
  133. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +37 -224
  134. package/themes/original/src/components/MultiOrdersDetails/index.tsx +54 -21
  135. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
  136. package/themes/original/src/components/MyOrders/index.tsx +40 -29
  137. package/themes/original/src/components/NavBar/index.tsx +20 -17
  138. package/themes/original/src/components/NotFoundSource/index.tsx +14 -10
  139. package/themes/original/src/components/Notifications/index.tsx +42 -52
  140. package/themes/original/src/components/Notifications/styles.tsx +6 -3
  141. package/themes/original/src/components/OrderDetails/OrderEta.tsx +76 -0
  142. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +21 -5
  143. package/themes/original/src/components/OrderDetails/index.tsx +191 -363
  144. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  145. package/themes/original/src/components/OrderItAgain/index.tsx +3 -1
  146. package/themes/original/src/components/OrderProgress/index.tsx +30 -56
  147. package/themes/original/src/components/OrderSummary/index.tsx +88 -59
  148. package/themes/original/src/components/OrderTypeSelector/index.tsx +2 -1
  149. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +14 -14
  150. package/themes/original/src/components/OrdersOption/index.tsx +68 -87
  151. package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
  152. package/themes/original/src/components/PageBanner/index.tsx +98 -38
  153. package/themes/original/src/components/PageBanner/styles.tsx +0 -10
  154. package/themes/original/src/components/PaymentOptionCard/index.tsx +180 -0
  155. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +1 -1
  156. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  157. package/themes/original/src/components/PaymentOptions/index.tsx +78 -35
  158. package/themes/original/src/components/PhoneInputNumber/index.tsx +18 -4
  159. package/themes/original/src/components/ProductForm/index.tsx +104 -29
  160. package/themes/original/src/components/ProductForm/styles.tsx +5 -5
  161. package/themes/original/src/components/ProductItemAccordion/index.tsx +12 -9
  162. package/themes/original/src/components/ProductOptionSubOption/index.tsx +20 -18
  163. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +5 -9
  164. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  165. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -50
  166. package/themes/original/src/components/ProfessionalProfile/index.tsx +36 -7
  167. package/themes/original/src/components/Promotions/index.tsx +2 -2
  168. package/themes/original/src/components/Promotions/styles.tsx +3 -1
  169. package/themes/original/src/components/ReviewProducts/index.tsx +16 -7
  170. package/themes/original/src/components/ScheduleAccordion/index.tsx +3 -3
  171. package/themes/original/src/components/ServiceForm/index.tsx +66 -17
  172. package/themes/original/src/components/Sessions/index.tsx +11 -8
  173. package/themes/original/src/components/Sessions/styles.tsx +5 -0
  174. package/themes/original/src/components/SignupForm/index.tsx +43 -27
  175. package/themes/original/src/components/SingleOrderCard/index.tsx +102 -63
  176. package/themes/original/src/components/SingleOrderCard/styles.tsx +1 -1
  177. package/themes/original/src/components/SingleProductCard/index.tsx +72 -31
  178. package/themes/original/src/components/SingleProductCard/styles.tsx +20 -4
  179. package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
  180. package/themes/original/src/components/StripeCardsList/index.tsx +49 -5
  181. package/themes/original/src/components/StripeElementsForm/index.tsx +48 -34
  182. package/themes/original/src/components/StripeElementsForm/naked.tsx +12 -1
  183. package/themes/original/src/components/UpsellingProducts/index.tsx +238 -224
  184. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  185. package/themes/original/src/components/UserDetails/index.tsx +3 -1
  186. package/themes/original/src/components/UserFormDetails/index.tsx +76 -7
  187. package/themes/original/src/components/UserFormDetails/styles.tsx +1 -1
  188. package/themes/original/src/components/UserProfile/index.tsx +88 -79
  189. package/themes/original/src/components/UserProfileForm/index.tsx +17 -21
  190. package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
  191. package/themes/original/src/components/UserVerification/index.tsx +55 -50
  192. package/themes/original/src/components/WalletTransactionItem/index.tsx +2 -2
  193. package/themes/original/src/components/WalletTransactions/index.tsx +3 -3
  194. package/themes/original/src/components/Wallets/index.tsx +66 -30
  195. package/themes/original/src/components/Wallets/styles.tsx +3 -4
  196. package/themes/original/src/components/shared/OButton.tsx +6 -2
  197. package/themes/original/src/components/shared/OInput.tsx +6 -1
  198. package/themes/original/src/components/shared/OModal.tsx +3 -3
  199. package/themes/original/src/types/index.tsx +41 -11
  200. package/themes/original/src/utils/index.tsx +273 -1
  201. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -1,8 +1,9 @@
1
- import React, { useState, useEffect } from 'react';
2
- import { View, StyleSheet, TouchableOpacity, Platform, I18nManager, Vibration } from 'react-native';
1
+ import React, { useState, useEffect, useCallback } from 'react';
2
+ import { View, StyleSheet, TouchableOpacity, Platform, I18nManager, ScrollView } from 'react-native';
3
3
  import { initStripe, useConfirmPayment } from '@stripe/stripe-react-native';
4
4
  import Picker from 'react-native-country-picker-modal';
5
5
  import MaterialIcons from 'react-native-vector-icons/MaterialIcons'
6
+ import ReactNativeHapticFeedback from "react-native-haptic-feedback";
6
7
  import {
7
8
  Checkout as CheckoutController,
8
9
  useOrder,
@@ -14,9 +15,10 @@ import {
14
15
  useConfig,
15
16
  useToast,
16
17
  ToastType,
18
+ useEvent
17
19
  } from 'ordering-components/native';
18
20
  import { useTheme } from 'styled-components/native';
19
- import { OText, OIcon, OModal } from '../shared';
21
+ import { OText, OIcon, OModal, OButton } from '../shared';
20
22
 
21
23
  import { AddressDetails } from '../AddressDetails';
22
24
  import { PaymentOptions } from '../PaymentOptions';
@@ -25,6 +27,8 @@ import { NotFoundSource } from '../NotFoundSource';
25
27
  import { UserDetails } from '../UserDetails';
26
28
  import { PaymentOptionWallet } from '../PaymentOptionWallet';
27
29
  import { PlaceSpot } from '../PlaceSpot'
30
+ import { SignupForm } from '../SignupForm'
31
+ import { LoginForm } from '../LoginForm'
28
32
 
29
33
  import {
30
34
  ChContainer,
@@ -52,6 +56,8 @@ import { OrderSummary } from '../OrderSummary';
52
56
  import { getTypesText } from '../../utils';
53
57
  import { CartStoresListing } from '../CartStoresListing';
54
58
  import { PaymentOptionsWebView } from '../../../../../src/components/PaymentOptionsWebView';
59
+ import { DeviceOrientationMethods } from '../../../../../src/hooks/DeviceOrientation'
60
+ const { useDeviceOrientation } = DeviceOrientationMethods
55
61
 
56
62
  const mapConfigs = {
57
63
  mapZoom: 16,
@@ -78,6 +84,7 @@ const CheckoutUI = (props: any) => {
78
84
  placing,
79
85
  cartState,
80
86
  cartUuid,
87
+ loyaltyPlansState,
81
88
  businessDetails,
82
89
  paymethodSelected,
83
90
  handlePaymethodChange,
@@ -88,7 +95,8 @@ const CheckoutUI = (props: any) => {
88
95
  handleChangeDeliveryOption,
89
96
  currency,
90
97
  merchantId,
91
- setPlaceSpotNumber
98
+ setPlaceSpotNumber,
99
+ maxDate
92
100
  } = props
93
101
 
94
102
  const theme = useTheme();
@@ -128,12 +136,17 @@ const CheckoutUI = (props: any) => {
128
136
 
129
137
  const [, { showToast }] = useToast();
130
138
  const [, t] = useLanguage();
131
- const [{ user, token }] = useSession();
139
+ const [{ user, token }, { login }] = useSession();
132
140
  const [ordering] = useApi()
133
141
  const [{ configs }] = useConfig();
134
142
  const [{ parsePrice, parseDate }] = useUtils();
135
143
  const [{ options, carts, loading }, { confirmCart }] = useOrder();
136
144
  const [validationFields] = useValidationFields();
145
+ const [events] = useEvent()
146
+ const [orientationState] = useDeviceOrientation();
147
+ const [isReadMore, setIsReadMore] = useState(false)
148
+ const [lengthMore, setLengthMore] = useState(false)
149
+ const WIDTH_SCREEN = orientationState?.dimensions?.width
137
150
 
138
151
  const [errorCash, setErrorCash] = useState(false);
139
152
  const [userErrors, setUserErrors] = useState<any>([]);
@@ -145,15 +158,29 @@ const CheckoutUI = (props: any) => {
145
158
  const [webviewPaymethod, setWebviewPaymethod] = useState<any>(null)
146
159
  const [isOpen, setIsOpen] = useState(false)
147
160
  const [requiredFields, setRequiredFields] = useState<any>([])
148
-
161
+ const [openModal, setOpenModal] = useState({ login: false, signup: false })
162
+ const [allowedGuest, setAllowedGuest] = useState(false)
163
+ const [placeByMethodPay, setPlaceByMethodPay] = useState(false)
164
+ const [methodPaySupported, setMethodPaySupported] = useState({ enabled: false, message: null, loading: true })
165
+ const [cardList, setCardList] = useState<any>({ cards: [], loading: false, error: null })
166
+ const cardsMethods = ['credomatic']
149
167
  const placeSpotTypes = [3, 4, 5]
150
168
  const placeSpotsEnabled = placeSpotTypes.includes(options?.type)
169
+ const isGiftCardCart = !cart?.business_id
151
170
  const businessConfigs = businessDetails?.business?.configs ?? []
152
171
  const isWalletCashEnabled = businessConfigs.find((config: any) => config.key === 'wallet_cash_enabled')?.value === '1'
153
172
  const isWalletCreditPointsEnabled = businessConfigs.find((config: any) => config.key === 'wallet_credit_point_enabled')?.value === '1'
154
173
  const isWalletEnabled = configs?.cash_wallet?.value && configs?.wallet_enabled?.value === '1' && (isWalletCashEnabled || isWalletCreditPointsEnabled)
155
174
  const isBusinessChangeEnabled = configs?.cart_change_business_validation?.value === '1'
156
- const isChewLayout = theme?.business_view?.components?.header?.components?.layout?.type === 'chew'
175
+ const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
176
+ const hideBusinessAddress = theme?.checkout?.components?.business?.components?.address?.hidden
177
+ const hideBusinessDetails = theme?.checkout?.components?.business?.hidden
178
+ const hideBusinessMap = theme?.checkout?.components?.business?.components?.map?.hidden
179
+ const hideCustomerDetails = theme?.checkout?.components?.customer?.hidden
180
+
181
+ const creditPointPlan = loyaltyPlansState?.result?.find((loyal: any) => loyal.type === 'credit_point')
182
+ const creditPointPlanOnBusiness = creditPointPlan?.businesses?.find((b: any) => b.business_id === cart?.business_id && b.accumulates)
183
+ const methodsPay = ['google_pay', 'apple_pay']
157
184
 
158
185
  const isPreOrder = configs?.preorder_status_enabled?.value === '1'
159
186
  const subtotalWithTaxes = cart?.taxes?.reduce((acc: any, item: any) => {
@@ -161,12 +188,18 @@ const CheckoutUI = (props: any) => {
161
188
  return acc = acc + item?.summary?.tax
162
189
  return acc = acc
163
190
  }, cart?.subtotal)
191
+
192
+ const validateCommentsCartField = validationFields?.fields?.checkout?.comments?.enabled && validationFields?.fields?.checkout?.comments?.required && (cart?.comment === null || cart?.comment?.trim().length === 0)
193
+
164
194
  const isDisabledButtonPlace = loading || !cart?.valid || (!paymethodSelected && cart?.balance > 0) ||
165
195
  placing || errorCash || subtotalWithTaxes < cart?.minimum ||
196
+ (cardsMethods.includes(paymethodSelected?.gateway) && cardList?.cards?.length === 0) ||
166
197
  (options.type === 1 &&
167
198
  validationFields?.fields?.checkout?.driver_tip?.enabled &&
168
199
  validationFields?.fields?.checkout?.driver_tip?.required &&
169
- (Number(cart?.driver_tip) <= 0))
200
+ (Number(cart?.driver_tip) <= 0)) ||
201
+ (validateCommentsCartField)
202
+ || (methodsPay.includes(paymethodSelected?.gateway) && (!methodPaySupported.enabled || methodPaySupported.loading))
170
203
 
171
204
  const driverTipsOptions = typeof configs?.driver_tip_options?.value === 'string'
172
205
  ? JSON.parse(configs?.driver_tip_options?.value) || []
@@ -176,6 +209,9 @@ const CheckoutUI = (props: any) => {
176
209
 
177
210
  const cartsWithProducts = carts && Object.values(carts).filter((cart: any) => cart.products.length) || null
178
211
 
212
+ const isSandboxCredomatic = configs?.credomatic_integration_sandbox?.value === '1'
213
+ const credomaticKeyId = isSandboxCredomatic ? configs?.credomatic_integration_public_sandbox_key?.value : configs?.credomatic_integration_public_production_key?.value
214
+ const credomaticUrl = `https://integrations.ordering.co/credomatic/front/auth_mobile.html?title=${t('CREDOMATIC_PAYMENT', 'Credomatic payment')}&body=${t('CREDOMATIC_PROCESSING', 'Processing transaction')}`
179
215
  const deliveryOptions = instructionsOptions?.result && instructionsOptions?.result?.filter((option: any) => option?.enabled)?.map((option: any) => {
180
216
  return {
181
217
  value: option?.id, key: option?.id, label: t(option?.name.toUpperCase().replace(/\s/g, '_'), option?.name)
@@ -188,9 +224,30 @@ const CheckoutUI = (props: any) => {
188
224
  }
189
225
  }
190
226
 
227
+ const vibrateApp = (impact?: string) => {
228
+ const options = {
229
+ enableVibrateFallback: true,
230
+ ignoreAndroidSystemSettings: false
231
+ };
232
+ ReactNativeHapticFeedback.trigger(impact || "impactLight", options);
233
+ }
234
+
235
+ const handleSuccessSignup = (user: any) => {
236
+ login({
237
+ user,
238
+ token: user?.session?.access_token
239
+ })
240
+ setOpenModal({ ...openModal, signup: false })
241
+ }
242
+
243
+ const handleSuccessLogin = (user: any) => {
244
+ if (user) setOpenModal({ ...openModal, login: false })
245
+ }
246
+
191
247
  const handlePlaceOrder = (confirmPayment: any, forcePlace: boolean = false) => {
192
- if (!userErrors.length && !requiredFields?.length || forcePlace) {
193
- handlerClickPlaceOrder && handlerClickPlaceOrder(null, null, confirmPayment)
248
+ if (!userErrors.length && (!requiredFields?.length || allowedGuest) || forcePlace) {
249
+ vibrateApp()
250
+ handlerClickPlaceOrder && handlerClickPlaceOrder(null, { isNative: true }, confirmPayment)
194
251
  return
195
252
  }
196
253
  if (requiredFields?.length) {
@@ -205,6 +262,11 @@ const CheckoutUI = (props: any) => {
205
262
  setIsUserDetailsEdit(true)
206
263
  }
207
264
 
265
+ const handlePlaceOrderAsGuest = () => {
266
+ setIsOpen(false)
267
+ handlerClickPlaceOrder && handlerClickPlaceOrder()
268
+ }
269
+
208
270
  const handlePaymentMethodClick = (paymethod: any) => {
209
271
  setShowGateway({ closedByUser: false, open: true })
210
272
  setWebviewPaymethod(paymethod)
@@ -223,7 +285,7 @@ const CheckoutUI = (props: any) => {
223
285
  const checkValidationFields = () => {
224
286
  setUserErrors([])
225
287
  const errors = []
226
- const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes']
288
+ const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes', 'comments']
227
289
  const _requiredFields: any = []
228
290
 
229
291
  Object.values(validationFields?.fields?.checkout).map((field: any) => {
@@ -270,7 +332,11 @@ const CheckoutUI = (props: any) => {
270
332
 
271
333
  useEffect(() => {
272
334
  if (cart?.products?.length === 0) {
273
- onNavigationRedirect('Business', { store: cart?.business?.slug, header: null, logo: null })
335
+ if (cart?.business?.slug) {
336
+ onNavigationRedirect('Business', { store: cart?.business?.slug, header: null, logo: null, fromMulti: props.fromMulti })
337
+ } else {
338
+ onNavigationRedirect('Wallets')
339
+ }
274
340
  }
275
341
  }, [cart?.products])
276
342
 
@@ -293,6 +359,24 @@ const CheckoutUI = (props: any) => {
293
359
  )
294
360
  }
295
361
 
362
+ useEffect(() => {
363
+ cart && events.emit('checkout_started', cart)
364
+ }, [])
365
+
366
+ useEffect(() => {
367
+ if (cart?.paymethod_data?.gateway === 'credomatic') {
368
+ if (cart?.paymethod_data?.status === 2) {
369
+ setShowGateway({ ...showGateway, open: true })
370
+ } else if (cart?.paymethod_data?.gateway === 'credomatic' && cart?.paymethod_data?.status === 4) {
371
+ setShowGateway({ ...showGateway, open: false })
372
+ }
373
+ }
374
+ }, [cart?.paymethod_data])
375
+
376
+ const onTextLayout = useCallback((e: any) => {
377
+ setLengthMore((e.nativeEvent.lines.length == 3 && e.nativeEvent.lines[2].width > WIDTH_SCREEN * .76) || e.nativeEvent.lines.length > 3)
378
+ }, [])
379
+
296
380
  return (
297
381
  <>
298
382
  <Container noPadding>
@@ -300,11 +384,12 @@ const CheckoutUI = (props: any) => {
300
384
  <NavBar
301
385
  title={t('CHECKOUT', 'Checkout')}
302
386
  titleAlign={'center'}
303
- onActionLeft={() => navigation?.canGoBack() && navigation.goBack()}
387
+ onActionLeft={() => onNavigationRedirect('BottomTab', { screen: 'Cart' }, !props.fromMulti)}
304
388
  showCall={false}
305
- btnStyle={{ paddingLeft: 0 }}
389
+ btnStyle={{ paddingLeft: 0, paddingTop: Platform.OS == 'ios' ? 0 : 2 }}
306
390
  titleWrapStyle={{ paddingHorizontal: 0 }}
307
391
  titleStyle={{ marginRight: 0, marginLeft: 0 }}
392
+ style={{ marginTop: 20 }}
308
393
  />
309
394
  </View>
310
395
  <ChContainer style={styles.pagePadding}>
@@ -347,82 +432,135 @@ const CheckoutUI = (props: any) => {
347
432
  <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 18, marginHorizontal: -40 }} />
348
433
  </ChSection>
349
434
 
350
- <ChSection>
351
- <ChBusinessDetails>
352
- {
353
- (businessDetails?.loading || cartState.loading || !businessDetails?.business || Object.values(businessDetails?.business).length === 0) &&
354
- !businessDetails?.error &&
355
- (
435
+ {!isGiftCardCart && !hideBusinessDetails && (
436
+ <ChSection>
437
+ <ChBusinessDetails>
438
+ {
439
+ (businessDetails?.loading || cartState.loading || !businessDetails?.business || Object.values(businessDetails?.business).length === 0) &&
440
+ !businessDetails?.error &&
441
+ (
442
+ <Placeholder Animation={Fade}>
443
+ <PlaceholderLine height={20} />
444
+ <PlaceholderLine height={12} />
445
+ <PlaceholderLine height={12} />
446
+ <PlaceholderLine height={12} style={{ marginBottom: 20 }} />
447
+ </Placeholder>
448
+ )}
449
+ {
450
+ !cartState.loading &&
451
+ businessDetails?.business &&
452
+ Object.values(businessDetails?.business).length > 0 &&
453
+ (
454
+ <>
455
+ <HeaderTitle text={t('BUSINESS_DETAILS', 'Business Details')} />
456
+ <View>
457
+ <OText size={12} lineHeight={18} weight={'400'}>
458
+ {businessDetails?.business?.name}
459
+ </OText>
460
+ <OText size={12} lineHeight={18} weight={'400'}>
461
+ {businessDetails?.business?.email}
462
+ </OText>
463
+ <OText size={12} lineHeight={18} weight={'400'}>
464
+ {businessDetails?.business?.cellphone}
465
+ </OText>
466
+ {!hideBusinessAddress && (
467
+ <OText size={12} lineHeight={18} weight={'400'}>
468
+ {businessDetails?.business?.address}
469
+ </OText>
470
+ )}
471
+ {businessDetails?.business?.address_notes && (
472
+ <>
473
+ <OText
474
+ size={12}
475
+ lineHeight={18}
476
+ numberOfLines={isReadMore ? 20 : 3}
477
+ onTextLayout={onTextLayout}
478
+ >
479
+ {businessDetails?.business?.address_notes}
480
+ </OText>
481
+ {lengthMore && (
482
+ <TouchableOpacity
483
+ onPress={() => setIsReadMore(!isReadMore)}
484
+ >
485
+ <OText size={12} color={theme.colors.primary}>{isReadMore ? t('SHOW_LESS', 'Show less') : t('READ_MORE', 'Read more')}</OText>
486
+ </TouchableOpacity>
487
+ )}
488
+ </>
489
+ )}
490
+ </View>
491
+ </>
492
+ )}
493
+ {businessDetails?.error && businessDetails?.error?.length > 0 && (
494
+ <View>
495
+ <HeaderTitle text={t('BUSINESS_DETAILS', 'Business Details')} />
496
+ <NotFoundSource
497
+ content={businessDetails?.error[0]?.message || businessDetails?.error[0]}
498
+ />
499
+ </View>
500
+ )}
501
+ </ChBusinessDetails>
502
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginHorizontal: -40 }} />
503
+ </ChSection>
504
+ )}
505
+ {!hideCustomerDetails && (
506
+
507
+ <ChSection>
508
+ <ChUserDetails>
509
+ {cartState.loading ? (
356
510
  <Placeholder Animation={Fade}>
357
511
  <PlaceholderLine height={20} />
358
512
  <PlaceholderLine height={12} />
359
513
  <PlaceholderLine height={12} />
360
514
  <PlaceholderLine height={12} style={{ marginBottom: 20 }} />
361
515
  </Placeholder>
362
- )}
363
- {
364
- !cartState.loading &&
365
- businessDetails?.business &&
366
- Object.values(businessDetails?.business).length > 0 &&
367
- (
368
- <>
369
- <HeaderTitle text={t('BUSINESS_DETAILS', 'Business Details')} />
516
+ ) : (
517
+ (user?.guest_id && !allowedGuest) ? (
370
518
  <View>
371
- <OText size={12} lineHeight={18} weight={'400'}>
372
- {businessDetails?.business?.name}
373
- </OText>
374
- <OText size={12} lineHeight={18} weight={'400'}>
375
- {businessDetails?.business?.email}
376
- </OText>
377
- <OText size={12} lineHeight={18} weight={'400'}>
378
- {businessDetails?.business?.cellphone}
379
- </OText>
380
- <OText size={12} lineHeight={18} weight={'400'}>
381
- {businessDetails?.business?.address}
382
- </OText>
519
+ <HeaderTitle text={t('CUSTOMER_DETAILS', 'Customer details')} />
520
+ <OButton
521
+ text={t('SIGN_UP', 'Sign up')}
522
+ textStyle={{ color: theme.colors.white }}
523
+ style={{ borderRadius: 7.6, marginTop: 20 }}
524
+ onClick={() => setOpenModal({ ...openModal, signup: true })}
525
+ />
526
+ <OButton
527
+ text={t('LOGIN', 'Login')}
528
+ textStyle={{ color: theme.colors.primary }}
529
+ bgColor={theme.colors.white}
530
+ borderColor={theme.colors.primary}
531
+ style={{ borderRadius: 7.6, marginTop: 20 }}
532
+ onClick={() => setOpenModal({ ...openModal, login: true })}
533
+ />
534
+ <OButton
535
+ text={t('CONTINUE_AS_GUEST', 'Continue as guest')}
536
+ textStyle={{ color: theme.colors.black }}
537
+ bgColor={theme.colors.white}
538
+ borderColor={theme.colors.black}
539
+ style={{ borderRadius: 7.6, marginTop: 20 }}
540
+ onClick={() => setAllowedGuest(true)}
541
+ />
383
542
  </View>
384
- </>
543
+ ) : (
544
+ <UserDetails
545
+ isUserDetailsEdit={isUserDetailsEdit}
546
+ HeaderTitle={<HeaderTitle text={t('CUSTOMER_DETAILS', 'Customer Details')} mb={0} />}
547
+ cartStatus={cart?.status}
548
+ businessId={cart?.business_id}
549
+ useValidationFields
550
+ useDefualtSessionManager
551
+ useSessionUser
552
+ isCheckout
553
+ phoneUpdate={phoneUpdate}
554
+ togglePhoneUpdate={togglePhoneUpdate}
555
+ />
556
+ )
385
557
  )}
386
- {businessDetails?.error && businessDetails?.error?.length > 0 && (
387
- <View>
388
- <HeaderTitle text={t('BUSINESS_DETAILS', 'Business Details')} />
389
- <NotFoundSource
390
- content={businessDetails?.error[0]?.message || businessDetails?.error[0]}
391
- />
392
- </View>
393
- )}
394
- </ChBusinessDetails>
395
- <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginHorizontal: -40 }} />
396
- </ChSection>
397
-
398
- <ChSection>
399
- <ChUserDetails>
400
- {cartState.loading ? (
401
- <Placeholder Animation={Fade}>
402
- <PlaceholderLine height={20} />
403
- <PlaceholderLine height={12} />
404
- <PlaceholderLine height={12} />
405
- <PlaceholderLine height={12} style={{ marginBottom: 20 }} />
406
- </Placeholder>
407
- ) : (
408
- <UserDetails
409
- isUserDetailsEdit={isUserDetailsEdit}
410
- HeaderTitle={<HeaderTitle text={t('CUSTOMER_DETAILS', 'Customer Details')} mb={0} />}
411
- cartStatus={cart?.status}
412
- businessId={cart?.business_id}
413
- useValidationFields
414
- useDefualtSessionManager
415
- useSessionUser
416
- isCheckout
417
- phoneUpdate={phoneUpdate}
418
- togglePhoneUpdate={togglePhoneUpdate}
419
- />
420
- )}
421
- </ChUserDetails>
422
- <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginHorizontal: -40 }} />
423
- </ChSection>
558
+ </ChUserDetails>
559
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginHorizontal: -40 }} />
560
+ </ChSection>
561
+ )}
424
562
 
425
- {options?.type === 1 && (
563
+ {options?.type === 1 && !isGiftCardCart && (
426
564
  <DeliveryOptionsContainer>
427
565
  {cartState.loading || deliveryOptionSelected === undefined ? (
428
566
  <View style={{ height: 110 }}>
@@ -452,7 +590,7 @@ const CheckoutUI = (props: any) => {
452
590
  <OText
453
591
  size={14}
454
592
  >
455
- {deliveryOptions.find((option: any) => option.value === deliveryOptionSelected).label}
593
+ {deliveryOptions.find((option: any) => option.value === deliveryOptionSelected)?.label}
456
594
  </OText>
457
595
  <MaterialIcons name='keyboard-arrow-down' style={styles.icon} />
458
596
  </DeliveryOptionItem>
@@ -463,7 +601,7 @@ const CheckoutUI = (props: any) => {
463
601
  data: deliveryOptions || [],
464
602
  renderItem: ({ item }: any) => (
465
603
  <TouchableOpacity
466
- onPress={() => changeDeliveryOption(item.value)}
604
+ onPress={() => !!cart?.uuid && changeDeliveryOption(item.value)}
467
605
  disabled={
468
606
  deliveryOptionSelected === item.value
469
607
  }
@@ -501,28 +639,30 @@ const CheckoutUI = (props: any) => {
501
639
  </ChSection>
502
640
  )}
503
641
 
504
- <ChSection>
505
- <ChAddress>
506
- {(businessDetails?.loading || cartState.loading) ? (
507
- <Placeholder Animation={Fade}>
508
- <PlaceholderLine height={20} style={{ marginBottom: 50 }} />
509
- <PlaceholderLine height={100} />
510
- </Placeholder>
511
- ) : (
512
- <AddressDetails
513
- navigation={navigation}
514
- location={businessDetails?.business?.location}
515
- businessLogo={businessDetails?.business?.logo}
516
- isCartPending={cart?.status === 2}
517
- uuid={cartUuid}
518
- apiKey={configs?.google_maps_api_key?.value}
519
- mapConfigs={mapConfigs}
520
- HeaderTitle={<HeaderTitle text={t('DELIVERY_ADDRESS', 'Delivery address')} mb={0} />}
521
- />
522
- )}
523
- </ChAddress>
524
- <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
525
- </ChSection>
642
+ {!isGiftCardCart && !hideBusinessMap && (
643
+ <ChSection>
644
+ <ChAddress>
645
+ {(businessDetails?.loading || cartState.loading) ? (
646
+ <Placeholder Animation={Fade}>
647
+ <PlaceholderLine height={20} style={{ marginBottom: 50 }} />
648
+ <PlaceholderLine height={100} />
649
+ </Placeholder>
650
+ ) : (
651
+ <AddressDetails
652
+ navigation={navigation}
653
+ location={options?.address?.location}
654
+ businessLogo={businessDetails?.business?.logo}
655
+ isCartPending={cart?.status === 2}
656
+ uuid={cartUuid}
657
+ apiKey={configs?.google_maps_api_key?.value}
658
+ mapConfigs={mapConfigs}
659
+ HeaderTitle={<HeaderTitle text={t('DELIVERY_ADDRESS', 'Delivery address')} mb={0} />}
660
+ />
661
+ )}
662
+ </ChAddress>
663
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
664
+ </ChSection>
665
+ )}
526
666
 
527
667
  {!cartState.loading &&
528
668
  cart &&
@@ -531,6 +671,7 @@ const CheckoutUI = (props: any) => {
531
671
  cart?.status !== 2 &&
532
672
  validationFields?.fields?.checkout?.driver_tip?.enabled &&
533
673
  driverTipsOptions && driverTipsOptions?.length > 0 &&
674
+ !isGiftCardCart &&
534
675
  (
535
676
  <ChSection>
536
677
  <ChDriverTips>
@@ -538,13 +679,14 @@ const CheckoutUI = (props: any) => {
538
679
  <DriverTips
539
680
  uuid={cartUuid}
540
681
  businessId={cart?.business_id}
541
- driverTipsOptions={driverTipsOptions}
542
- isFixedPrice={parseInt(configs?.driver_tip_type?.value, 10) === 1 || !!parseInt(configs?.driver_tip_use_custom?.value, 10)}
682
+ driverTipsOptions={!driverTipsOptions.includes(0) ? [0, ...driverTipsOptions] : driverTipsOptions}
683
+ isFixedPrice={parseInt(configs?.driver_tip_type?.value, 10) === 1}
543
684
  isDriverTipUseCustom={!!parseInt(configs?.driver_tip_use_custom?.value, 10)}
544
- driverTip={parseInt(configs?.driver_tip_type?.value, 10) === 1 || !!parseInt(configs?.driver_tip_use_custom?.value, 10)
685
+ driverTip={parseInt(configs?.driver_tip_type?.value, 10) === 1
545
686
  ? cart?.driver_tip
546
687
  : cart?.driver_tip_rate}
547
688
  useOrderContext
689
+ cart={cart}
548
690
  />
549
691
  </ChDriverTips>
550
692
  </ChSection>
@@ -566,8 +708,8 @@ const CheckoutUI = (props: any) => {
566
708
  <PaymentOptions
567
709
  cart={cart}
568
710
  isDisabled={cart?.status === 2}
569
- businessId={businessDetails?.business?.id}
570
- isLoading={businessDetails.loading}
711
+ businessId={!isGiftCardCart ? businessDetails?.business?.id : -1}
712
+ isLoading={!isGiftCardCart ? businessDetails.loading : false}
571
713
  paymethods={businessDetails?.business?.paymethods}
572
714
  onPaymentChange={handlePaymethodChange}
573
715
  errorCash={errorCash}
@@ -577,6 +719,12 @@ const CheckoutUI = (props: any) => {
577
719
  handlePaymentMethodClickCustom={handlePaymentMethodClick}
578
720
  handlePlaceOrder={handlePlaceOrder}
579
721
  merchantId={merchantId}
722
+ setMethodPaySupported={setMethodPaySupported}
723
+ methodPaySupported={methodPaySupported}
724
+ placeByMethodPay={placeByMethodPay}
725
+ setPlaceByMethodPay={setPlaceByMethodPay}
726
+ cardList={cardList}
727
+ setCardList={setCardList}
580
728
  />
581
729
  </ChPaymethods>
582
730
  </ChSection>
@@ -586,6 +734,7 @@ const CheckoutUI = (props: any) => {
586
734
  <WalletPaymentOptionContainer>
587
735
  <PaymentOptionWallet
588
736
  cart={cart}
737
+ loyaltyPlansState={loyaltyPlansState}
589
738
  businessId={cart?.business_id}
590
739
  businessConfigs={businessDetails?.business?.configs}
591
740
  />
@@ -593,7 +742,7 @@ const CheckoutUI = (props: any) => {
593
742
  )}
594
743
 
595
744
 
596
- {!cartState.loading && placeSpotsEnabled && (
745
+ {!cartState.loading && placeSpotsEnabled && !isGiftCardCart && (
597
746
  <>
598
747
  <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 30, marginHorizontal: -40 }} />
599
748
  <PlaceSpot
@@ -620,18 +769,20 @@ const CheckoutUI = (props: any) => {
620
769
  <>
621
770
  <CartHeader>
622
771
  <HeaderTitle text={t('MOBILE_FRONT_YOUR_ORDER', 'Your order')} mb={0} />
623
- <TouchableOpacity
624
- onPress={() => onNavigationRedirect('Business', { store: cart?.business?.slug })}
625
- >
626
- <OText
627
- size={12}
628
- lineHeight={15}
629
- color={theme.colors.primary}
630
- style={{ textDecorationLine: 'underline' }}
772
+ {!isGiftCardCart && (
773
+ <TouchableOpacity
774
+ onPress={() => onNavigationRedirect('Business', { store: cart?.business?.slug })}
631
775
  >
632
- {t('ADD_PRODUCTS', 'Add products')}
633
- </OText>
634
- </TouchableOpacity>
776
+ <OText
777
+ size={12}
778
+ lineHeight={15}
779
+ color={theme.colors.primary}
780
+ style={{ textDecorationLine: 'underline' }}
781
+ >
782
+ {t('ADD_PRODUCTS', 'Add products')}
783
+ </OText>
784
+ </TouchableOpacity>
785
+ )}
635
786
  </CartHeader>
636
787
  {isBusinessChangeEnabled && (
637
788
  <TouchableOpacity
@@ -653,6 +804,12 @@ const CheckoutUI = (props: any) => {
653
804
  isCartPending={cart?.status === 2}
654
805
  onNavigationRedirect={onNavigationRedirect}
655
806
  placeSpotTypes={placeSpotTypes}
807
+ businessConfigs={businessConfigs}
808
+ maxDate={maxDate}
809
+ loyaltyRewardRate={
810
+ creditPointPlanOnBusiness?.accumulation_rate ??
811
+ (!!creditPointPlanOnBusiness && creditPointPlan?.accumulation_rate) ?? 0
812
+ }
656
813
  />
657
814
  </>
658
815
  )}
@@ -662,7 +819,7 @@ const CheckoutUI = (props: any) => {
662
819
 
663
820
  {!cartState.loading && cart && (
664
821
  <View>
665
- <ChErrors style={{ marginBottom: 10 }}>
822
+ <ChErrors style={{ marginBottom: Platform.OS === 'ios' ? 35 : 10 }}>
666
823
  {!cart?.valid_address && cart?.status !== 2 && (
667
824
  <OText
668
825
  color={theme.colors.error}
@@ -689,6 +846,14 @@ const CheckoutUI = (props: any) => {
689
846
  {t('WARNING_INVALID_PRODUCTS_CHECKOUT', 'To continue with your checkout, please remove from your cart the products that are not available.')}
690
847
  </OText>
691
848
  )}
849
+ {cart?.valid_preorder !== undefined && !cart?.valid_preorder && (
850
+ <OText
851
+ color={theme.colors.error}
852
+ size={12}
853
+ >
854
+ {t('INVALID_CART_MOMENT', 'Selected schedule time is invalid, please select a schedule into the business schedule interval.')}
855
+ </OText>
856
+ )}
692
857
  {options.type === 1 &&
693
858
  validationFields?.fields?.checkout?.driver_tip?.enabled &&
694
859
  validationFields?.fields?.checkout?.driver_tip?.required &&
@@ -700,6 +865,15 @@ const CheckoutUI = (props: any) => {
700
865
  {t('WARNING_INVALID_DRIVER_TIP', 'Driver Tip is required.')}
701
866
  </OText>
702
867
  )}
868
+
869
+ {validateCommentsCartField && (
870
+ <OText
871
+ color={theme.colors.error}
872
+ size={12}
873
+ >
874
+ {t('WARNING_INVALID_CART_COMMENTS', 'Cart comments is required.')}
875
+ </OText>
876
+ )}
703
877
  </ChErrors>
704
878
  </View>
705
879
  )}
@@ -732,18 +906,52 @@ const CheckoutUI = (props: any) => {
732
906
  togglePhoneUpdate={togglePhoneUpdate}
733
907
  requiredFields={requiredFields}
734
908
  hideUpdateButton
909
+ handlePlaceOrderAsGuest={handlePlaceOrderAsGuest}
735
910
  onClose={() => {
736
911
  setIsOpen(false)
737
912
  handlePlaceOrder(null, true)
738
913
  }}
914
+ setIsOpen={setIsOpen}
739
915
  />
740
916
  </View>
741
917
  </OModal>
918
+ <OModal
919
+ open={openModal.signup}
920
+ onClose={() => setOpenModal({ ...openModal, signup: false })}
921
+ >
922
+ <ScrollView style={{ paddingHorizontal: 20, width: '100%' }}>
923
+ <SignupForm
924
+ handleSuccessSignup={handleSuccessSignup}
925
+ isGuest
926
+ signupButtonText={t('SIGNUP', 'Signup')}
927
+ useSignupByEmail
928
+ useChekoutFileds
929
+ />
930
+ </ScrollView>
931
+ </OModal>
932
+ <OModal
933
+ open={openModal.login}
934
+ onClose={() => setOpenModal({ ...openModal, login: false })}
935
+ >
936
+ <ScrollView style={{ paddingHorizontal: 20, width: '100%' }}>
937
+ <LoginForm
938
+ handleSuccessLogin={handleSuccessLogin}
939
+ isGuest
940
+ loginButtonText={t('LOGIN', 'Login')}
941
+ loginButtonBackground={theme.colors.primary}
942
+ />
943
+ </ScrollView>
944
+ </OModal>
742
945
  </ChContainer>
743
946
  </Container>
744
947
  {!cartState.loading && cart && cart?.status !== 2 && (
745
948
  <FloatingButton
746
- handleClick={isDisabledButtonPlace ? () => Vibration.vibrate() : () => handlePlaceOrder(null)}
949
+ handleClick={
950
+ isDisabledButtonPlace
951
+ ? () => vibrateApp()
952
+ : methodsPay.includes(paymethodSelected?.gateway)
953
+ ? () => setPlaceByMethodPay(true)
954
+ : () => handlePlaceOrder(null)}
747
955
  isSecondaryBtn={isDisabledButtonPlace}
748
956
  disabled={isDisabledButtonPlace}
749
957
  btnText={subtotalWithTaxes >= cart?.minimum
@@ -786,6 +994,29 @@ const CheckoutUI = (props: any) => {
786
994
  locationId={'L1NGAY5M6KJRX'}
787
995
  />
788
996
  )}
997
+ {cart?.paymethod_data?.gateway === 'credomatic' && cart?.paymethod_data?.status === 2 && showGateway.open && (
998
+ <PaymentOptionsWebView
999
+ title={t('CREDOMATIC_PAYMENT', 'Credomatic payment')}
1000
+ onNavigationRedirect={onNavigationRedirect}
1001
+ uri={credomaticUrl}
1002
+ user={user}
1003
+ cart={cart}
1004
+ additionalParams={{
1005
+ type: 'auth',
1006
+ key_id: credomaticKeyId,
1007
+ hash: cart?.paymethod_data?.result?.hash,
1008
+ time: cart?.paymethod_data?.result?.time,
1009
+ amount: cart?.total,
1010
+ orderid: cart?.uuid,
1011
+ ccnumber: cardList?.cards?.[0]?.number,
1012
+ ccexp: cardList?.cards?.[0]?.expiryString,
1013
+ cvv: cardList?.cards?.[0]?.cvc,
1014
+ redirect: credomaticUrl
1015
+ }}
1016
+ webviewPaymethod={webviewPaymethod}
1017
+ setShowGateway={setShowGateway}
1018
+ />
1019
+ )}
789
1020
  </>
790
1021
  )
791
1022
  }
@@ -812,7 +1043,8 @@ export const Checkout = (props: any) => {
812
1043
  const getOrder = async (cartId: any) => {
813
1044
  try {
814
1045
  let result: any = {}
815
- const cart = orderState?.carts.find((cart: any) => cart.uuid === cartId)
1046
+ const cartsWithProducts = orderState?.carts && (Object.values(orderState?.carts)?.filter(cart => cart?.products && cart?.products?.length) || null)
1047
+ const cart = cartsWithProducts?.find((cart: any) => cart.uuid === cartId)
816
1048
  if (cart) {
817
1049
  result = { ...cart }
818
1050
  } else {