ordering-ui-react-native 0.22.13 → 0.22.14-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 (164) hide show
  1. package/package.json +6 -7
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessesListing/index.tsx +1 -1
  4. package/src/components/Checkout/index.tsx +40 -39
  5. package/src/components/StripeMethodForm/index.tsx +4 -2
  6. package/src/components/VerifyPhone/styles.tsx +1 -2
  7. package/src/context/OfflineActions/index.tsx +236 -0
  8. package/src/types/index.tsx +2 -1
  9. package/themes/business/index.tsx +2 -0
  10. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +9 -6
  11. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +1 -0
  12. package/themes/business/src/components/BusinessController/index.tsx +8 -3
  13. package/themes/business/src/components/BusinessProductList/index.tsx +2 -1
  14. package/themes/business/src/components/Chat/index.tsx +15 -3
  15. package/themes/business/src/components/DriverMap/index.tsx +49 -26
  16. package/themes/business/src/components/FloatingButton/index.tsx +3 -2
  17. package/themes/business/src/components/GoogleMap/index.tsx +15 -8
  18. package/themes/business/src/components/LanguageSelector/index.tsx +2 -3
  19. package/themes/business/src/components/LanguageSelector/lang_country.json +515 -70
  20. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  21. package/themes/business/src/components/MapView/index.tsx +36 -17
  22. package/themes/business/src/components/NewOrderNotification/index.tsx +40 -27
  23. package/themes/business/src/components/OrderDetails/Business.tsx +47 -27
  24. package/themes/business/src/components/OrderDetails/Delivery.tsx +134 -53
  25. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +128 -41
  26. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +46 -19
  27. package/themes/business/src/components/OrderDetails/styles.tsx +39 -3
  28. package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +46 -21
  29. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +3 -2
  30. package/themes/business/src/components/OrderSummary/index.tsx +7 -5
  31. package/themes/business/src/components/OrdersListManager/index.tsx +13 -1
  32. package/themes/business/src/components/OrdersOption/index.tsx +217 -156
  33. package/themes/business/src/components/PhoneInputNumber/index.tsx +8 -5
  34. package/themes/business/src/components/PreviousMessages/index.tsx +26 -3
  35. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +39 -16
  36. package/themes/business/src/components/PreviousOrders/index.tsx +74 -66
  37. package/themes/business/src/components/PrinterEdition/MessageAlert.tsx +33 -0
  38. package/themes/business/src/components/PrinterEdition/index.tsx +431 -0
  39. package/themes/business/src/components/PrinterEdition/printerList.tsx +23 -0
  40. package/themes/business/src/components/PrinterEdition/styles.tsx +61 -0
  41. package/themes/business/src/components/PrinterSettings/index.tsx +162 -174
  42. package/themes/business/src/components/PrinterSettings/styles.tsx +14 -1
  43. package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
  44. package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
  45. package/themes/business/src/components/StoresList/index.tsx +2 -2
  46. package/themes/business/src/components/UserProfileForm/index.tsx +16 -17
  47. package/themes/business/src/components/WebsocketStatus/index.tsx +2 -2
  48. package/themes/business/src/components/shared/OTextarea.tsx +8 -9
  49. package/themes/business/src/config/currency.tsx +1010 -0
  50. package/themes/business/src/layouts/SafeAreaContainer.tsx +35 -19
  51. package/themes/business/src/types/index.tsx +13 -4
  52. package/themes/business/src/utils/index.tsx +33 -3
  53. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  54. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  55. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  56. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  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/shared/OButton.tsx +5 -18
  61. package/themes/original/index.tsx +11 -0
  62. package/themes/original/src/components/AddressForm/index.tsx +32 -17
  63. package/themes/original/src/components/AddressList/index.tsx +8 -7
  64. package/themes/original/src/components/AnalyticsSegment/index.tsx +6 -6
  65. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  66. package/themes/original/src/components/BusinessBasicInformation/index.tsx +5 -8
  67. package/themes/original/src/components/BusinessController/index.tsx +3 -3
  68. package/themes/original/src/components/BusinessItemAccordion/index.tsx +13 -5
  69. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +103 -92
  70. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +8 -6
  71. package/themes/original/src/components/BusinessListingSearch/index.tsx +1 -2
  72. package/themes/original/src/components/BusinessPreorder/index.tsx +46 -28
  73. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +73 -70
  74. package/themes/original/src/components/BusinessProductsList/index.tsx +6 -7
  75. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  76. package/themes/original/src/components/BusinessProductsListing/index.tsx +18 -6
  77. package/themes/original/src/components/BusinessTypeFilter/index.tsx +9 -8
  78. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
  79. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  80. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  81. package/themes/original/src/components/Cart/index.tsx +46 -14
  82. package/themes/original/src/components/CartContent/index.tsx +2 -4
  83. package/themes/original/src/components/Checkout/index.tsx +113 -59
  84. package/themes/original/src/components/CitiesControl/index.tsx +0 -3
  85. package/themes/original/src/components/CouponControl/index.tsx +1 -3
  86. package/themes/original/src/components/DriverTips/index.tsx +1 -3
  87. package/themes/original/src/components/Favorite/index.tsx +1 -5
  88. package/themes/original/src/components/FavoriteList/index.tsx +0 -1
  89. package/themes/original/src/components/ForgotPasswordForm/index.tsx +5 -7
  90. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +15 -17
  91. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +3 -7
  92. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +24 -32
  93. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +7 -9
  94. package/themes/original/src/components/GiftCard/VerticalGiftCardOrdersLayout/index.tsx +11 -12
  95. package/themes/original/src/components/GoogleMap/index.tsx +39 -18
  96. package/themes/original/src/components/Help/index.tsx +2 -0
  97. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  98. package/themes/original/src/components/Home/index.tsx +3 -11
  99. package/themes/original/src/components/LoginForm/Otp/index.tsx +0 -3
  100. package/themes/original/src/components/LoginForm/index.tsx +4 -7
  101. package/themes/original/src/components/MessageListing/index.tsx +2 -1
  102. package/themes/original/src/components/Messages/index.tsx +27 -19
  103. package/themes/original/src/components/MomentOption/TimeListItem.tsx +56 -0
  104. package/themes/original/src/components/MomentOption/index.tsx +80 -51
  105. package/themes/original/src/components/MomentSelector/index.tsx +5 -2
  106. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +7 -3
  107. package/themes/original/src/components/MultiCheckout/index.tsx +55 -27
  108. package/themes/original/src/components/MultiOrdersDetails/index.tsx +1 -0
  109. package/themes/original/src/components/MyOrders/index.tsx +2 -2
  110. package/themes/original/src/components/NavBar/index.tsx +7 -4
  111. package/themes/original/src/components/NetworkError/index.tsx +0 -5
  112. package/themes/original/src/components/NotFoundSource/index.tsx +0 -3
  113. package/themes/original/src/components/OrderDetails/OrderEta.tsx +4 -3
  114. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +13 -10
  115. package/themes/original/src/components/OrderDetails/index.tsx +44 -21
  116. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  117. package/themes/original/src/components/OrderProgress/index.tsx +5 -4
  118. package/themes/original/src/components/OrderSummary/index.tsx +29 -10
  119. package/themes/original/src/components/OrderTypeSelector/index.tsx +7 -6
  120. package/themes/original/src/components/OrdersOption/index.tsx +3 -6
  121. package/themes/original/src/components/PaymentOptionStripe/index.tsx +0 -5
  122. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  123. package/themes/original/src/components/PaymentOptions/index.tsx +0 -2
  124. package/themes/original/src/components/PhoneInputNumber/index.tsx +74 -4
  125. package/themes/original/src/components/PlaceSpot/index.tsx +1 -3
  126. package/themes/original/src/components/PreviousOrders/index.tsx +1 -2
  127. package/themes/original/src/components/ProductForm/ActionButton.tsx +17 -20
  128. package/themes/original/src/components/ProductForm/index.tsx +107 -102
  129. package/themes/original/src/components/ProductItemAccordion/index.tsx +50 -43
  130. package/themes/original/src/components/ProductItemAccordion/styles.tsx +0 -3
  131. package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
  132. package/themes/original/src/components/ProfessionalProfile/index.tsx +4 -5
  133. package/themes/original/src/components/Promotions/index.tsx +6 -9
  134. package/themes/original/src/components/ReviewDriver/index.tsx +1 -1
  135. package/themes/original/src/components/ReviewOrder/index.tsx +2 -2
  136. package/themes/original/src/components/ReviewProducts/index.tsx +1 -1
  137. package/themes/original/src/components/ReviewTrigger/index.tsx +2 -2
  138. package/themes/original/src/components/ServiceForm/index.tsx +52 -54
  139. package/themes/original/src/components/Sessions/index.tsx +3 -3
  140. package/themes/original/src/components/SignupForm/index.tsx +86 -78
  141. package/themes/original/src/components/SingleOrderCard/index.tsx +6 -4
  142. package/themes/original/src/components/SingleProductCard/index.tsx +5 -5
  143. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  144. package/themes/original/src/components/StripeCardForm/index.tsx +0 -3
  145. package/themes/original/src/components/StripeCardsList/index.tsx +10 -3
  146. package/themes/original/src/components/StripeElementsForm/index.tsx +76 -62
  147. package/themes/original/src/components/StripeElementsForm/naked.tsx +48 -1
  148. package/themes/original/src/components/StripeRedirectForm/index.tsx +0 -3
  149. package/themes/original/src/components/TaxInformation/index.tsx +3 -2
  150. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +10 -7
  151. package/themes/original/src/components/UpsellingProducts/UpsellingLayout.tsx +8 -3
  152. package/themes/original/src/components/UserDetails/index.tsx +17 -16
  153. package/themes/original/src/components/UserFormDetails/index.tsx +161 -134
  154. package/themes/original/src/components/UserProfile/index.tsx +9 -1
  155. package/themes/original/src/components/UserVerification/index.tsx +15 -4
  156. package/themes/original/src/components/Wallets/index.tsx +6 -3
  157. package/themes/original/src/components/WebsocketStatus/index.tsx +1 -4
  158. package/themes/original/src/components/shared/OAlert.tsx +2 -1
  159. package/themes/original/src/components/shared/OButton.tsx +5 -4
  160. package/themes/original/src/components/shared/OInput.tsx +4 -8
  161. package/themes/original/src/components/shared/OModal.tsx +7 -2
  162. package/themes/original/src/types/index.tsx +7 -2
  163. package/themes/original/src/utils/index.tsx +30 -1
  164. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -1,5 +1,5 @@
1
1
  import React, { useCallback, useEffect, useState } from 'react';
2
- import { View } from 'react-native';
2
+ import { Vibration, View } from 'react-native';
3
3
  import { useLanguage, useConfig, useUtils, useOrder } from 'ordering-components/native';
4
4
  import { useTheme } from 'styled-components/native';
5
5
  import { CCContainer, CCNotCarts, CCList, CheckoutAction, ChCartsTotal } from './styles';
@@ -39,6 +39,7 @@ export const CartContent = (props: any) => {
39
39
  ?.filter((cart: any) => cart?.status !== 1 && cart?.valid && cart?.products?.length)
40
40
  ?.reduce((total: any, cart: any) => { return total + (cart?.delivery_price_with_discount) }, 0)
41
41
  const handleCheckoutRedirect = () => {
42
+ Vibration.vibrate(100)
42
43
  if (cartsAvailable.length === 1) {
43
44
  onNavigationRedirect('CheckoutNavigator', {
44
45
  screen: 'CheckoutPage',
@@ -173,11 +174,8 @@ export const CartContent = (props: any) => {
173
174
  <CheckoutAction style={{ marginTop: 0 }}>
174
175
  <OButton
175
176
  text={t('CHECKOUT', 'Checkout')}
176
- bgColor={!cartsAvailable.length ? theme.colors.secundary : theme.colors.primary}
177
177
  isDisabled={!cartsAvailable.length}
178
- borderColor={theme.colors.primary}
179
178
  imgRightSrc={null}
180
- textStyle={{ color: 'white', textAlign: 'center', flex: 1 }}
181
179
  onClick={() => handleCheckoutRedirect()}
182
180
  style={{ width: '100%', flexDirection: 'row', justifyContent: 'center', borderRadius: 7.6, shadowOpacity: 0 }}
183
181
  />
@@ -1,4 +1,4 @@
1
- import React, { useState, useEffect, useCallback, useRef } from 'react';
1
+ import React, { useState, useEffect, useCallback, useRef, useMemo } from 'react';
2
2
  import { View, StyleSheet, TouchableOpacity, Platform, I18nManager, ScrollView, Keyboard, BackHandler, SafeAreaView } from 'react-native';
3
3
  import { initStripe, useConfirmPayment } from '@stripe/stripe-react-native';
4
4
  import NativeStripeSdk from '@stripe/stripe-react-native/src/NativeStripeSdk'
@@ -7,7 +7,7 @@ import MaterialIcons from 'react-native-vector-icons/MaterialIcons'
7
7
  import IconAntDesign from 'react-native-vector-icons/AntDesign';
8
8
  import { useIsFocused } from '@react-navigation/native';
9
9
 
10
- import ReactNativeHapticFeedback from "react-native-haptic-feedback";
10
+ import ReactNativeHapticFeedback, { HapticFeedbackTypes } from "react-native-haptic-feedback";
11
11
  import {
12
12
  Checkout as CheckoutController,
13
13
  useOrder,
@@ -15,7 +15,6 @@ import {
15
15
  useApi,
16
16
  useLanguage,
17
17
  useUtils,
18
- useValidationFields,
19
18
  useConfig,
20
19
  useToast,
21
20
  ToastType,
@@ -103,7 +102,8 @@ const CheckoutUI = (props: any) => {
103
102
  setPlaceSpotNumber,
104
103
  maxDate,
105
104
  androidAppId,
106
- urlscheme
105
+ urlscheme,
106
+ checkoutFieldsState
107
107
  } = props
108
108
 
109
109
  const theme = useTheme();
@@ -145,12 +145,11 @@ const CheckoutUI = (props: any) => {
145
145
 
146
146
  const [, { showToast }] = useToast();
147
147
  const [, t] = useLanguage();
148
- const [{ user, token }, { login }] = useSession();
148
+ const [{ user, token, loading: userLoading }, { login }] = useSession();
149
149
  const [ordering] = useApi()
150
150
  const [{ configs }] = useConfig();
151
151
  const [{ parsePrice, parseDate }] = useUtils();
152
152
  const [{ options, carts, loading }, { confirmCart }] = useOrder();
153
- const [validationFields] = useValidationFields();
154
153
  const [events] = useEvent()
155
154
  const [orientationState] = useDeviceOrientation();
156
155
  const [isReadMore, setIsReadMore] = useState(false)
@@ -167,6 +166,7 @@ const CheckoutUI = (props: any) => {
167
166
  const [webviewPaymethod, setWebviewPaymethod] = useState<any>(null)
168
167
  const [isOpen, setIsOpen] = useState(false)
169
168
  const [requiredFields, setRequiredFields] = useState<any>([])
169
+ const [orderTypeValidationFields, setOrderTypeValidationFields] = useState<any>([])
170
170
  const [openModal, setOpenModal] = useState({ login: false, signup: false, isGuest: false })
171
171
  const [allowedGuest, setAllowedGuest] = useState(false)
172
172
  const [placeByMethodPay, setPlaceByMethodPay] = useState(false)
@@ -177,7 +177,15 @@ const CheckoutUI = (props: any) => {
177
177
  const [isGiftCardCart, setIsGiftCardCart] = useState(!cart?.business_id)
178
178
  const containerRef = useRef<any>()
179
179
  const cardsMethods = ['credomatic']
180
- const stripePaymethods: any = ['stripe', 'stripe_direct', 'stripe_connect', 'stripe_redirect']
180
+ const stripePaymethods: any = ['stripe', 'stripe_connect', 'stripe_redirect']
181
+ const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes', 'comments']
182
+
183
+ const checkoutFields = useMemo(() => checkoutFieldsState?.fields?.filter((field: any) => field.order_type_id === options?.type), [checkoutFieldsState, options])
184
+ const guestCheckoutDriveTip = useMemo(() => checkoutFields?.find((field: any) => field.order_type_id === 1 && field?.validation_field?.code === 'driver_tip'), [JSON.stringify(checkoutFields), options])
185
+ const guestCheckoutComment = useMemo(() => checkoutFields?.find((field: any) => field.order_type_id === options?.type && field?.validation_field?.code === 'comments'), [JSON.stringify(checkoutFields), options])
186
+ const guestCheckoutCoupon = useMemo(() => checkoutFields?.find((field: any) => field.order_type_id === options?.type && field?.validation_field?.code === 'coupon'), [JSON.stringify(checkoutFields), options])
187
+ const guestCheckoutZipcode = useMemo(() => checkoutFields?.find((field: any) => field.order_type_id === options?.type && field?.validation_field?.code === 'zipcode'), [JSON.stringify(checkoutFields), options])
188
+
181
189
  const placeSpotTypes = [3, 4, 5]
182
190
  const placeSpotsEnabled = placeSpotTypes.includes(options?.type)
183
191
  const businessConfigs = businessDetails?.business?.configs ?? []
@@ -195,6 +203,7 @@ const CheckoutUI = (props: any) => {
195
203
  const creditPointPlanOnBusiness = creditPointPlan?.businesses?.find((b: any) => b.business_id === cart?.business_id && b.accumulates)
196
204
  const methodsPay = ['google_pay', 'apple_pay']
197
205
 
206
+ const commentDelayTime = 1500
198
207
  const isPreOrder = configs?.preorder_status_enabled?.value === '1'
199
208
  const subtotalWithTaxes = cart?.taxes?.reduce((acc: any, item: any) => {
200
209
  if (item?.type === 1)
@@ -202,27 +211,28 @@ const CheckoutUI = (props: any) => {
202
211
  return acc = acc
203
212
  }, cart?.subtotal)
204
213
 
205
- const validateCommentsCartField = validationFields?.fields?.checkout?.comments?.enabled && validationFields?.fields?.checkout?.comments?.required && (cart?.comment === null || cart?.comment?.trim().length === 0)
206
- const validateZipcodeCard = validationFields?.fields?.card?.zipcode?.enabled &&
207
- validationFields?.fields?.card?.zipcode?.required &&
208
- paymethodSelected?.data?.card &&
209
- !paymethodSelected?.data?.card?.zipcode &&
210
- paymethodSelected?.gateway === 'stripe'
214
+ const validateCommentsCartField = (guestCheckoutComment?.enabled && (user?.guest_id ? guestCheckoutComment?.required_with_guest : guestCheckoutComment?.required)) && (cart?.comment === null || cart?.comment?.trim().length === 0)
215
+ const validateDriverTipField = options.type === 1 && (guestCheckoutDriveTip?.enabled && (user?.guest_id ? guestCheckoutDriveTip?.required_with_guest : guestCheckoutDriveTip?.required)) && (Number(cart?.driver_tip) <= 0)
216
+ const validateCouponField = (guestCheckoutCoupon?.enabled && (user?.guest_id ? guestCheckoutCoupon?.required_with_guest : guestCheckoutCoupon?.required)) && !cart?.offers?.some((offer: any) => offer?.type === 2)
217
+ const validateZipcodeCard = (guestCheckoutZipcode?.enabled && (user?.guest_id ? guestCheckoutZipcode?.required_with_guest : guestCheckoutZipcode?.required)) && paymethodSelected?.gateway === 'stripe' && paymethodSelected?.data?.card && !paymethodSelected?.data?.card?.zipcode
211
218
 
212
219
  const isDisabledButtonPlace = loading || !cart?.valid || (!paymethodSelected && cart?.balance > 0) ||
213
220
  placing || errorCash || subtotalWithTaxes < cart?.minimum ||
214
221
  (cardsMethods.includes(paymethodSelected?.gateway) && cardList?.cards?.length === 0) ||
215
- (options.type === 1 && !isGiftCardCart &&
216
- validationFields?.fields?.checkout?.driver_tip?.enabled &&
217
- validationFields?.fields?.checkout?.driver_tip?.required &&
218
- (Number(cart?.driver_tip) <= 0)) ||
219
222
  (validateCommentsCartField) ||
220
- (validateZipcodeCard)
221
- || (methodsPay.includes(paymethodSelected?.gateway) && (!methodPaySupported.enabled || methodPaySupported.loading))
223
+ (validateDriverTipField && !isGiftCardCart) ||
224
+ (validateZipcodeCard) ||
225
+ (methodsPay.includes(paymethodSelected?.gateway) && (!methodPaySupported.enabled || methodPaySupported.loading)) ||
226
+ validateCommentsCartField ||
227
+ validateDriverTipField ||
228
+ validateCouponField ||
229
+ validateZipcodeCard
230
+
222
231
 
223
232
  const driverTipsOptions = typeof configs?.driver_tip_options?.value === 'string'
224
233
  ? JSON.parse(configs?.driver_tip_options?.value) || []
225
234
  : configs?.driver_tip_options?.value || []
235
+ const driverTipsField = !cartState.loading && cart && cart?.business_id && options.type === 1 && cart?.status !== 2 && (guestCheckoutDriveTip?.enabled) && driverTipsOptions.length > 0
226
236
 
227
237
  const configTypes = configs?.order_types_allowed?.value.split('|').map((value: any) => Number(value)) || []
228
238
 
@@ -243,7 +253,7 @@ const CheckoutUI = (props: any) => {
243
253
  }
244
254
  }
245
255
 
246
- const vibrateApp = (impact?: string) => {
256
+ const vibrateApp = (impact?: HapticFeedbackTypes) => {
247
257
  const options = {
248
258
  enableVibrateFallback: true,
249
259
  ignoreAndroidSystemSettings: false
@@ -270,7 +280,7 @@ const CheckoutUI = (props: any) => {
270
280
  return
271
281
  }
272
282
 
273
- if (!userErrors.length && (!requiredFields?.length || allowedGuest) || forcePlace) {
283
+ if (!userErrors.length && (!requiredFields?.length) || forcePlace) {
274
284
  vibrateApp()
275
285
  handlerClickPlaceOrder && handlerClickPlaceOrder(null, { isNative: true }, confirmPayment, NativeStripeSdk?.dismissPlatformPay)
276
286
  return
@@ -309,35 +319,65 @@ const CheckoutUI = (props: any) => {
309
319
 
310
320
  const checkValidationFields = () => {
311
321
  setUserErrors([])
312
- const errors = []
313
- const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes', 'comments']
314
- const _requiredFields: any = []
315
-
316
- Object.values(validationFields?.fields?.checkout).map((field: any) => {
317
- if (field?.required && !notFields.includes(field.code) && field?.enabled) {
318
- if (!user[field?.code]) {
319
- _requiredFields.push(field?.code)
322
+ const errors: Array<string> = []
323
+ const userSelected = user
324
+ const _requiredFields: Array<string> = []
325
+ Object.values(checkoutFieldsState?.fields).map((field: any) => {
326
+ if (options?.type === field?.order_type_id &&
327
+ field?.enabled &&
328
+ field?.required &&
329
+ !notFields.includes(field?.validation_field?.code)
330
+ ) {
331
+ if (userSelected && !userSelected[field?.validation_field?.code]) {
332
+ _requiredFields.push(field?.validation_field?.code)
320
333
  }
321
334
  }
322
335
  })
323
-
336
+ const mobilePhoneField: any = Object.values(checkoutFieldsState?.fields)?.find((field: any) => field?.order_type_id === options?.type && field?.validation_field?.code === 'mobile_phone')
324
337
  if (
325
- !user?.cellphone &&
326
- ((validationFields?.fields?.checkout?.cellphone?.enabled &&
327
- validationFields?.fields?.checkout?.cellphone?.required) ||
338
+ userSelected &&
339
+ !userSelected?.cellphone &&
340
+ ((mobilePhoneField?.enabled &&
341
+ mobilePhoneField?.required) ||
328
342
  configs?.verification_phone_required?.value === '1')
329
343
  ) {
330
344
  _requiredFields.push('cellphone')
331
345
  }
332
346
  setRequiredFields(_requiredFields)
333
347
 
334
- if (phoneUpdate) {
335
- errors.push(t('NECESSARY_UPDATE_COUNTRY_PHONE_CODE', 'It is necessary to update your phone number'))
336
- }
337
-
338
348
  setUserErrors(errors)
339
349
  }
340
350
 
351
+ const checkGuestValidationFields = () => {
352
+ const userSelected = user
353
+ const _requiredFields = checkoutFieldsState?.fields
354
+ .filter((field: any) => (field?.order_type_id === options?.type) && field?.enabled && field?.required_with_guest &&
355
+ !notFields.includes(field?.validation_field?.code) &&
356
+ field?.validation_field?.code !== 'email' &&
357
+ userSelected && !userSelected[field?.validation_field?.code])
358
+ const requiredFieldsCode = _requiredFields.map((item: any) => item?.validation_field?.code)
359
+ const guestCheckoutCellPhone = checkoutFieldsState?.fields?.find((field: any) => field.order_type_id === options?.type && field?.validation_field?.code === 'mobile_phone')
360
+ const guestCheckoutEmail = checkoutFieldsState?.fields?.find((field: any) => field.order_type_id === options?.type && field?.validation_field?.code === 'email')
361
+ if (
362
+ userSelected &&
363
+ !userSelected?.guest_cellphone &&
364
+ ((guestCheckoutCellPhone?.enabled &&
365
+ guestCheckoutCellPhone?.required_with_guest) ||
366
+ configs?.verification_phone_required?.value === '1')
367
+ ) {
368
+ requiredFieldsCode.push('cellphone')
369
+ }
370
+ if (
371
+ userSelected &&
372
+ !userSelected?.guest_email &&
373
+ guestCheckoutEmail?.enabled &&
374
+ guestCheckoutEmail?.required_with_guest
375
+ ) {
376
+ requiredFieldsCode.push('email')
377
+ }
378
+ setRequiredFields(requiredFieldsCode)
379
+ }
380
+
341
381
  const togglePhoneUpdate = (val: boolean) => {
342
382
  setPhoneUpdate(val)
343
383
  }
@@ -346,11 +386,20 @@ const CheckoutUI = (props: any) => {
346
386
  setShowTitle(contentOffset.y > 30)
347
387
  }
348
388
 
389
+ const handleRedirect = () => {
390
+ props.fromProductsList
391
+ ? navigation?.goBack()
392
+ : onNavigationRedirect('BottomTab', { screen: 'Cart' }, !props.fromMulti)
393
+ }
394
+
349
395
  useEffect(() => {
350
- if (validationFields && validationFields?.fields?.checkout) {
396
+ if (checkoutFieldsState?.loading || userLoading) return
397
+ if (user?.guest_id) {
398
+ checkGuestValidationFields()
399
+ } else {
351
400
  checkValidationFields()
352
401
  }
353
- }, [validationFields, user])
402
+ }, [checkoutFieldsState, user, options?.type])
354
403
 
355
404
  useEffect(() => {
356
405
  if (errors) {
@@ -456,7 +505,7 @@ const CheckoutUI = (props: any) => {
456
505
  <SafeAreaView style={{ backgroundColor: theme.colors.backgroundPage }}>
457
506
  <View style={styles.wrapperNavbar}>
458
507
  <TopHeader>
459
- <TopActions onPress={() => onNavigationRedirect('BottomTab', { screen: 'Cart' }, !props.fromMulti)}>
508
+ <TopActions onPress={() => handleRedirect()}>
460
509
  <IconAntDesign
461
510
  name='arrowleft'
462
511
  size={26}
@@ -482,7 +531,7 @@ const CheckoutUI = (props: any) => {
482
531
  hideArrowLeft
483
532
  title={t('CHECKOUT', 'Checkout')}
484
533
  titleAlign={'center'}
485
- onActionLeft={() => onNavigationRedirect('BottomTab', { screen: 'Cart' }, !props.fromMulti)}
534
+ onActionLeft={() => handleRedirect()}
486
535
  showCall={false}
487
536
  btnStyle={{ paddingLeft: 0, paddingTop: Platform.OS == 'ios' ? 0 : 2 }}
488
537
  titleWrapStyle={{ paddingHorizontal: 0 }}
@@ -619,15 +668,11 @@ const CheckoutUI = (props: any) => {
619
668
  <HeaderTitle text={t('CUSTOMER_DETAILS', 'Customer details')} />
620
669
  <OButton
621
670
  text={t('SIGN_UP', 'Sign up')}
622
- textStyle={{ color: theme.colors.white }}
623
671
  style={{ borderRadius: 7.6, marginTop: 20 }}
624
672
  onClick={() => setOpenModal({ ...openModal, signup: true })}
625
673
  />
626
674
  <OButton
627
675
  text={t('LOGIN', 'Login')}
628
- textStyle={{ color: theme.colors.primary }}
629
- bgColor={theme.colors.white}
630
- borderColor={theme.colors.primary}
631
676
  style={{ borderRadius: 7.6, marginTop: 20 }}
632
677
  onClick={() => setOpenModal({ ...openModal, login: true })}
633
678
  />
@@ -652,6 +697,9 @@ const CheckoutUI = (props: any) => {
652
697
  isCheckout
653
698
  phoneUpdate={phoneUpdate}
654
699
  togglePhoneUpdate={togglePhoneUpdate}
700
+ isOrderTypeValidationField
701
+ requiredFields={requiredFields}
702
+ checkoutFields={checkoutFields}
655
703
  />
656
704
  )
657
705
  )}
@@ -749,6 +797,7 @@ const CheckoutUI = (props: any) => {
749
797
  </Placeholder>
750
798
  ) : (
751
799
  <AddressDetails
800
+ cart={cart}
752
801
  navigation={navigation}
753
802
  location={options?.address?.location}
754
803
  businessLogo={businessDetails?.business?.logo}
@@ -764,14 +813,7 @@ const CheckoutUI = (props: any) => {
764
813
  </ChSection>
765
814
  )}
766
815
 
767
- {!cartState.loading &&
768
- cart &&
769
- cart?.valid &&
770
- options.type === 1 &&
771
- cart?.status !== 2 &&
772
- validationFields?.fields?.checkout?.driver_tip?.enabled &&
773
- driverTipsOptions && driverTipsOptions?.length > 0 &&
774
- cart?.business_id &&
816
+ {driverTipsField &&
775
817
  (
776
818
  <ChSection>
777
819
  <ChDriverTips>
@@ -909,6 +951,7 @@ const CheckoutUI = (props: any) => {
909
951
  cart={cart}
910
952
  isCartPending={cart?.status === 2}
911
953
  onNavigationRedirect={onNavigationRedirect}
954
+ commentDelayTime={commentDelayTime}
912
955
  placeSpotTypes={placeSpotTypes}
913
956
  businessConfigs={businessConfigs}
914
957
  maxDate={maxDate}
@@ -916,6 +959,8 @@ const CheckoutUI = (props: any) => {
916
959
  creditPointPlanOnBusiness?.accumulation_rate ??
917
960
  (!!creditPointPlanOnBusiness && creditPointPlan?.accumulation_rate) ?? 0
918
961
  }
962
+ hideCommentsByValidationCheckout={!guestCheckoutComment?.enabled}
963
+ hideCouponByValidationCheckout={!guestCheckoutCoupon?.enabled}
919
964
  />
920
965
  </>
921
966
  )}
@@ -962,10 +1007,8 @@ const CheckoutUI = (props: any) => {
962
1007
  {t('INVALID_CART_MOMENT', 'Selected schedule time is invalid, please select a schedule into the business schedule interval.')}
963
1008
  </OText>
964
1009
  )}
965
- {options.type === 1 && !isGiftCardCart &&
966
- validationFields?.fields?.checkout?.driver_tip?.enabled &&
967
- validationFields?.fields?.checkout?.driver_tip?.required &&
968
- (Number(cart?.driver_tip) <= 0) && (
1010
+ {validateDriverTipField && !isGiftCardCart &&
1011
+ (
969
1012
  <OText
970
1013
  color={theme.colors.error}
971
1014
  size={12}
@@ -973,7 +1016,6 @@ const CheckoutUI = (props: any) => {
973
1016
  {t('WARNING_INVALID_DRIVER_TIP', 'Driver Tip is required.')}
974
1017
  </OText>
975
1018
  )}
976
-
977
1019
  {validateCommentsCartField && (
978
1020
  <OText
979
1021
  color={theme.colors.error}
@@ -991,6 +1033,15 @@ const CheckoutUI = (props: any) => {
991
1033
  {t('WARNING_CARD_ZIPCODE_REQUIRED', 'Your card selected has not zipcode')}
992
1034
  </OText>
993
1035
  )}
1036
+ {validateCouponField &&
1037
+ (
1038
+ <OText
1039
+ color={theme.colors.error}
1040
+ size={12}
1041
+ >
1042
+ {t('WARNING_INVALID_COUPON_FIELD', 'Coupon is required.')}
1043
+ </OText>
1044
+ )}
994
1045
  </ChErrors>
995
1046
  </View>
996
1047
  )}
@@ -1008,20 +1059,23 @@ const CheckoutUI = (props: any) => {
1008
1059
  <OModal
1009
1060
  open={isOpen}
1010
1061
  onClose={() => setIsOpen(false)}
1062
+ showToastInsideModal
1011
1063
  >
1012
1064
  <View style={styles.detailWrapper}>
1013
1065
  <UserDetails
1014
1066
  isUserDetailsEdit
1015
1067
  cartStatus={cart?.status}
1016
1068
  businessId={cart?.business_id}
1017
- useValidationFields
1018
1069
  useDefualtSessionManager
1019
1070
  useSessionUser
1020
1071
  isCheckout
1021
1072
  isEdit
1022
1073
  phoneUpdate={phoneUpdate}
1023
1074
  togglePhoneUpdate={togglePhoneUpdate}
1075
+ isOrderTypeValidationField
1024
1076
  requiredFields={requiredFields}
1077
+ checkoutFields={checkoutFields}
1078
+ isCheckoutPlace
1025
1079
  hideUpdateButton
1026
1080
  handlePlaceOrderAsGuest={handlePlaceOrderAsGuest}
1027
1081
  onClose={() => {
@@ -69,10 +69,7 @@ export const CitiesControl = (props: any) => {
69
69
  </View>
70
70
  <OButton
71
71
  text={t('CONTINUE', 'Continue')}
72
- bgColor={theme.colors.primary}
73
- borderColor={theme.colors.primary}
74
72
  style={styles.btnStyle}
75
- textStyle={{ color: 'white' }}
76
73
  onClick={() => handleClick()}
77
74
  />
78
75
  </Container>
@@ -102,9 +102,7 @@ const CouponControlUI = (props: any) => {
102
102
  />
103
103
  <OButton
104
104
  onClick={() => onButtonApplyClick()}
105
- bgColor={theme.colors.primary}
106
- borderColor={theme.colors.primary}
107
- textStyle={{ color: 'white', fontSize: 12 }}
105
+ textStyle={{ fontSize: 12 }}
108
106
  imgRightSrc={null}
109
107
  text={t('APPLY', 'Apply')}
110
108
  isDisabled={!couponInput}
@@ -125,9 +125,7 @@ const DriverTipsUI = (props: any) => {
125
125
  />
126
126
  <OButton
127
127
  text={t('APPLY_TIP', 'Apply Tip')}
128
- bgColor={theme.colors.primary}
129
- borderColor={theme.colors.primary}
130
- textStyle={{ color: 'white', fontSize: 14 }}
128
+ textStyle={{ fontSize: 14 }}
131
129
  imgRightSrc={null}
132
130
  style={{ borderRadius: 5, height: 44 }}
133
131
  isDisabled={parseFloat(value || '0') < 0 || parseFloat(value || '0') === driverTip || value === ''}
@@ -14,8 +14,7 @@ import {
14
14
 
15
15
  export const Favorite = (props: any) => {
16
16
  const {
17
- navigation,
18
- franchiseId
17
+ navigation
19
18
  } = props
20
19
  const [, t] = useLanguage()
21
20
  const theme = useTheme()
@@ -72,7 +71,6 @@ export const Favorite = (props: any) => {
72
71
  originalURL='business'
73
72
  location={`${orderState.options?.address?.location?.lat},${orderState.options?.address?.location?.lng}`}
74
73
  propsToFetch={['id', 'name', 'header', 'logo', 'location', 'address', 'ribbon', 'timezone', 'schedule', 'open', 'delivery_price', 'distance', 'delivery_time', 'pickup_time', 'reviews', 'featured', 'offers', 'food', 'laundry', 'alcohol', 'groceries', 'slug']}
75
- franchiseId={franchiseId}
76
74
  />
77
75
  )}
78
76
  {tabSelected === 'products' && (
@@ -81,7 +79,6 @@ export const Favorite = (props: any) => {
81
79
  originalURL='products'
82
80
  onNavigationRedirect={onRedirect}
83
81
  isProduct
84
- franchiseId={franchiseId}
85
82
  />
86
83
  )}
87
84
  {tabSelected === 'orders' && (
@@ -90,7 +87,6 @@ export const Favorite = (props: any) => {
90
87
  favoriteURL='favorite_orders'
91
88
  originalURL='orders'
92
89
  isOrder
93
- franchiseId={franchiseId}
94
90
  />
95
91
  )}
96
92
  </Container>
@@ -270,7 +270,6 @@ const FavoriteListUI = (props: FavoriteParams) => {
270
270
  onClick={() => getFavoriteList(pagination?.currentPage + 1)}
271
271
  text={t('LOAD_MORE_ITEMS', 'Load more items')}
272
272
  imgRightSrc={null}
273
- textStyle={{ color: theme.colors.white }}
274
273
  style={{ borderRadius: 7.6, shadowOpacity: 0, marginTop: 20 }}
275
274
  />
276
275
  </WrappButton>
@@ -64,7 +64,7 @@ const ForgotPasswordUI = (props: any) => {
64
64
  handleReCaptcha(null)
65
65
  if (reCaptchaValue) return
66
66
 
67
- if (!recaptchaConfig?.siteKey) {
67
+ if (!recaptchaConfig?.siteKey) {
68
68
  showToast(ToastType.Error, t('NO_RECAPTCHA_SITE_KEY', 'The config doesn\'t have recaptcha site key'));
69
69
  return
70
70
  }
@@ -73,7 +73,7 @@ const ForgotPasswordUI = (props: any) => {
73
73
  return
74
74
  }
75
75
  recaptchaRef.current.open()
76
- }
76
+ }
77
77
 
78
78
  const onRecaptchaVerify = (token: any) => {
79
79
  setRecaptchaVerified(true)
@@ -92,8 +92,8 @@ const ForgotPasswordUI = (props: any) => {
92
92
  formState.result?.result && showToast(
93
93
  ToastType.Error,
94
94
  typeof formState.result?.result === 'string'
95
- ? formState.result?.result
96
- : formState.result?.result[0]
95
+ ? formState.result?.result
96
+ : formState.result?.result[0]
97
97
  )
98
98
  return
99
99
  }
@@ -208,9 +208,7 @@ const ForgotPasswordUI = (props: any) => {
208
208
 
209
209
  <OButton
210
210
  text={emailSent && !formState.result?.error ? t('LINK_SEND_FORGOT_PASSWORD', 'Link Sent') : t('FRONT_RECOVER_PASSWORD', 'Recover Password')}
211
- textStyle={{ color: 'white' }}
212
- bgColor={emailSent && !formState.result?.error ? theme.colors.disabled : theme.colors.primary}
213
- borderColor={emailSent && !formState.result?.error ? theme.colors.disabled : theme.colors.primary}
211
+ isDisabled={formState.loading || emailSent && !formState.result?.error}
214
212
  isLoading={formState.loading}
215
213
  imgRightSrc={null}
216
214
  onClick={emailSent && !formState.result?.error ? () => { } : handleSubmit(onSubmit)}
@@ -12,7 +12,7 @@ import {
12
12
  Container
13
13
  } from './styles'
14
14
 
15
- export const GiftCardUI = React.memo((props: any) => {
15
+ export const GiftCardUI = React.memo((props: any) => {
16
16
  const {
17
17
  navigation
18
18
  } = props
@@ -57,9 +57,7 @@ export const GiftCardUI = React.memo((props: any) => {
57
57
  <OButton
58
58
  onClick={() => setOpenModal('purchase')}
59
59
  text={t('PURCHASE', 'Purchase')}
60
- bgColor={theme.colors.primary}
61
- borderColor={theme.colors.primary}
62
- textStyle={{ color: 'white', fontSize: 13 }}
60
+ textStyle={{ fontSize: 13 }}
63
61
  imgRightSrc={null}
64
62
  style={{ ...style.btnStyle, marginRight: 14 }}
65
63
  />
@@ -76,26 +74,26 @@ export const GiftCardUI = React.memo((props: any) => {
76
74
  </View>
77
75
 
78
76
  <OModal
79
- open={openModal === 'purchase'}
80
- onClose={() => setOpenModal(null)}
81
- entireModal
77
+ open={openModal === 'purchase'}
78
+ onClose={() => setOpenModal(null)}
79
+ entireModal
82
80
  customClose
83
- >
84
- <PurchaseGiftCard
81
+ >
82
+ <PurchaseGiftCard
85
83
  handleCustomGoToCheckout={handleCustomGoToCheckout}
86
84
  onClose={() => setOpenModal(null)}
87
85
  />
88
- </OModal>
86
+ </OModal>
89
87
  <OModal
90
- open={openModal === 'redeem'}
91
- onClose={() => setOpenModal(null)}
92
- entireModal
88
+ open={openModal === 'redeem'}
89
+ onClose={() => setOpenModal(null)}
90
+ entireModal
93
91
  customClose
94
- >
95
- <RedeemGiftCard
92
+ >
93
+ <RedeemGiftCard
96
94
  onClose={() => setOpenModal(null)}
97
95
  />
98
- </OModal>
96
+ </OModal>
99
97
  </Container>
100
98
  )
101
- })
99
+ })
@@ -58,12 +58,10 @@ const PurchaseGiftCardUI = (props: any) => {
58
58
  borderWidth: 0,
59
59
  width: 26,
60
60
  height: 26,
61
- backgroundColor: '#FFF',
62
- borderColor: '#FFF',
63
- shadowColor: '#FFF',
64
61
  paddingLeft: 0,
65
62
  paddingRight: 0,
66
63
  }}
64
+ useArrow
67
65
  onClick={onClose}
68
66
  icon={AntDesignIcon}
69
67
  iconProps={{
@@ -113,9 +111,7 @@ const PurchaseGiftCardUI = (props: any) => {
113
111
  <OButton
114
112
  onClick={() => handleAccept()}
115
113
  text={t('ACCEPT', 'Accept')}
116
- bgColor={theme.colors.primary}
117
- borderColor={theme.colors.primary}
118
- textStyle={{ color: 'white', fontSize: 13 }}
114
+ textStyle={{ fontSize: 13 }}
119
115
  imgRightSrc={null}
120
116
  style={style.btnStyle}
121
117
  isDisabled={!selectedProduct}
@@ -130,4 +126,4 @@ export const PurchaseGiftCard = (props: any) => {
130
126
  UIComponent: PurchaseGiftCardUI
131
127
  }
132
128
  return <PurchaseGiftCardController {...purchaseGiftCardProps} />
133
- }
129
+ }