ordering-ui-react-native 0.21.24 → 0.21.25-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 (236) hide show
  1. package/package.json +7 -6
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessesListing/index.tsx +1 -1
  4. package/src/components/PaymentOptionsWebView/index.tsx +1 -0
  5. package/src/components/StripeMethodForm/index.tsx +6 -4
  6. package/src/components/VerifyPhone/styles.tsx +1 -2
  7. package/src/types/index.tsx +3 -1
  8. package/src/utils/index.tsx +2 -2
  9. package/themes/business/index.tsx +4 -0
  10. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +9 -2
  11. package/themes/business/src/components/BusinessController/index.tsx +19 -17
  12. package/themes/business/src/components/BusinessProductList/AccordionDropdown.tsx +63 -0
  13. package/themes/business/src/components/BusinessProductList/IterateCategories.tsx +108 -0
  14. package/themes/business/src/components/BusinessProductList/ProductList.tsx +196 -0
  15. package/themes/business/src/components/BusinessProductList/index.tsx +196 -0
  16. package/themes/business/src/components/BusinessProductList/styles.tsx +10 -0
  17. package/themes/business/src/components/Chat/index.tsx +23 -14
  18. package/themes/business/src/components/DriverMap/index.tsx +4 -3
  19. package/themes/business/src/components/FloatingButton/index.tsx +34 -31
  20. package/themes/business/src/components/Home/index.tsx +5 -1
  21. package/themes/business/src/components/LanguageSelector/index.tsx +1 -2
  22. package/themes/business/src/components/LanguageSelector/lang_country.json +515 -70
  23. package/themes/business/src/components/MapView/index.tsx +11 -7
  24. package/themes/business/src/components/MessagesOption/index.tsx +2 -1
  25. package/themes/business/src/components/NewOrderNotification/index.tsx +163 -115
  26. package/themes/business/src/components/OrderDetails/Business.tsx +50 -2
  27. package/themes/business/src/components/OrderDetails/Delivery.tsx +23 -11
  28. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +61 -54
  29. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +58 -24
  30. package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +220 -0
  31. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +6 -1
  32. package/themes/business/src/components/OrderSummary/index.tsx +240 -76
  33. package/themes/business/src/components/OrdersListManager/index.tsx +7 -2
  34. package/themes/business/src/components/OrdersListManager/utils.tsx +1 -1
  35. package/themes/business/src/components/OrdersOption/index.tsx +125 -48
  36. package/themes/business/src/components/PhoneInputNumber/index.tsx +8 -5
  37. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +36 -38
  38. package/themes/business/src/components/PreviousOrders/OrderList.tsx +18 -13
  39. package/themes/business/src/components/PreviousOrders/index.tsx +80 -66
  40. package/themes/business/src/components/PreviousOrders/styles.tsx +10 -0
  41. package/themes/business/src/components/PrinterSettings/index.tsx +279 -0
  42. package/themes/business/src/components/PrinterSettings/styles.tsx +17 -0
  43. package/themes/business/src/components/ProductItemAccordion/index.tsx +2 -2
  44. package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
  45. package/themes/business/src/components/SearchBar/index.tsx +2 -1
  46. package/themes/business/src/components/Sessions/index.tsx +187 -0
  47. package/themes/business/src/components/Sessions/styles.tsx +20 -0
  48. package/themes/business/src/components/StoresList/index.tsx +5 -3
  49. package/themes/business/src/components/UserFormDetails/index.tsx +111 -107
  50. package/themes/business/src/components/UserProfileForm/index.tsx +105 -47
  51. package/themes/business/src/components/WebsocketStatus/index.tsx +171 -0
  52. package/themes/business/src/components/WebsocketStatus/styles.tsx +28 -0
  53. package/themes/business/src/components/shared/OInput.tsx +2 -0
  54. package/themes/business/src/hooks/useLocation.tsx +5 -4
  55. package/themes/business/src/types/index.tsx +15 -2
  56. package/themes/business/src/utils/index.tsx +5 -0
  57. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  58. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  59. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  60. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  61. package/themes/kiosk/src/components/LoginForm/index.tsx +7 -4
  62. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  63. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  64. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  65. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  66. package/themes/original/index.tsx +9 -4
  67. package/themes/original/src/components/AddressDetails/index.tsx +20 -10
  68. package/themes/original/src/components/AddressForm/index.tsx +10 -6
  69. package/themes/original/src/components/AddressForm/styles.tsx +1 -1
  70. package/themes/original/src/components/AddressList/styles.tsx +4 -4
  71. package/themes/original/src/components/AnalyticsSegment/index.tsx +6 -6
  72. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  73. package/themes/original/src/components/BusinessBasicInformation/index.tsx +3 -3
  74. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +1 -1
  75. package/themes/original/src/components/BusinessController/index.tsx +18 -10
  76. package/themes/original/src/components/BusinessController/styles.tsx +8 -7
  77. package/themes/original/src/components/BusinessInformation/styles.tsx +2 -2
  78. package/themes/original/src/components/BusinessItemAccordion/index.tsx +11 -7
  79. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +317 -0
  80. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +96 -0
  81. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +1 -1
  82. package/themes/original/src/components/BusinessListingSearch/index.tsx +47 -358
  83. package/themes/original/src/components/BusinessListingSearch/styles.tsx +1 -1
  84. package/themes/original/src/components/BusinessPreorder/index.tsx +2 -3
  85. package/themes/original/src/components/BusinessProductsCategories/index.tsx +1 -1
  86. package/themes/original/src/components/BusinessProductsList/index.tsx +3 -3
  87. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  88. package/themes/original/src/components/BusinessProductsListing/index.tsx +35 -19
  89. package/themes/original/src/components/BusinessProductsListing/styles.tsx +2 -2
  90. package/themes/original/src/components/BusinessReviews/index.tsx +1 -1
  91. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +1 -1
  92. package/themes/original/src/components/BusinessesListing/Layout/Appointment/styles.tsx +5 -5
  93. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListFooter.tsx +69 -0
  94. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListHeader.tsx +406 -0
  95. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListing.tsx +76 -0
  96. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +24 -404
  97. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  98. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  99. package/themes/original/src/components/Cart/index.tsx +32 -9
  100. package/themes/original/src/components/CartContent/index.tsx +96 -58
  101. package/themes/original/src/components/CartStoresListing/styles.tsx +2 -2
  102. package/themes/original/src/components/Checkout/index.tsx +181 -67
  103. package/themes/original/src/components/Checkout/styles.tsx +17 -0
  104. package/themes/original/src/components/CitiesControl/styles.tsx +1 -1
  105. package/themes/original/src/components/DatePicker/index.tsx +33 -0
  106. package/themes/original/src/components/DatePicker/styles.tsx +20 -0
  107. package/themes/original/src/components/Favorite/index.tsx +4 -9
  108. package/themes/original/src/components/Favorite/styles.tsx +0 -2
  109. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  110. package/themes/original/src/components/GPSButton/index.tsx +1 -1
  111. package/themes/original/src/components/GiftCard/GiftCardOrdersList/index.tsx +64 -0
  112. package/themes/original/src/components/GiftCard/GiftCardOrdersList/styles.tsx +8 -0
  113. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +8 -3
  114. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +36 -3
  115. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +1 -1
  116. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +67 -4
  117. package/themes/original/src/components/GiftCard/RedeemGiftCard/styles.tsx +1 -1
  118. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +2 -2
  119. package/themes/original/src/components/GiftCard/SendGiftCard/styles.tsx +1 -1
  120. package/themes/original/src/components/GiftCard/SingleGiftCard/index.tsx +101 -0
  121. package/themes/original/src/components/GiftCard/SingleGiftCard/styles.tsx +4 -0
  122. package/themes/original/src/components/GiftCard/VerticalGiftCardOrdersLayout/index.tsx +83 -0
  123. package/themes/original/src/components/GiftCard/VerticalGiftCardOrdersLayout/styles.tsx +9 -0
  124. package/themes/original/src/components/GoogleMap/index.tsx +6 -5
  125. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +2 -2
  126. package/themes/original/src/components/HighestRatedBusinesses/styles.tsx +1 -1
  127. package/themes/original/src/components/Home/index.tsx +2 -1
  128. package/themes/original/src/components/LastOrder/index.tsx +2 -1
  129. package/themes/original/src/components/LastOrders/index.tsx +2 -1
  130. package/themes/original/src/components/LoginForm/Otp/index.tsx +4 -16
  131. package/themes/original/src/components/Messages/index.tsx +2 -1
  132. package/themes/original/src/components/Messages/styles.tsx +1 -1
  133. package/themes/original/src/components/MomentOption/index.tsx +4 -3
  134. package/themes/original/src/components/MultiCart/index.tsx +1 -1
  135. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +1 -0
  136. package/themes/original/src/components/MultiCheckout/index.tsx +208 -21
  137. package/themes/original/src/components/MultiCheckout/styles.tsx +17 -0
  138. package/themes/original/src/components/MultiOrdersDetails/index.tsx +20 -15
  139. package/themes/original/src/components/MyOrders/index.tsx +24 -29
  140. package/themes/original/src/components/NavBar/index.tsx +3 -1
  141. package/themes/original/src/components/NetworkError/index.tsx +2 -3
  142. package/themes/original/src/components/NetworkError/styles.tsx +2 -2
  143. package/themes/original/src/components/Notifications/index.tsx +4 -8
  144. package/themes/original/src/components/Notifications/styles.tsx +0 -1
  145. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +1 -1
  146. package/themes/original/src/components/OrderDetails/index.tsx +706 -667
  147. package/themes/original/src/components/OrderDetails/styles.tsx +24 -8
  148. package/themes/original/src/components/OrderProgress/index.tsx +28 -6
  149. package/themes/original/src/components/OrderProgress/styles.tsx +1 -1
  150. package/themes/original/src/components/OrderSummary/index.tsx +3 -1
  151. package/themes/original/src/components/OrderTypeSelector/index.tsx +5 -6
  152. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +1 -1
  153. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +1 -1
  154. package/themes/original/src/components/OrdersOption/index.tsx +3 -5
  155. package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
  156. package/themes/original/src/components/PaymentOptionCard/index.tsx +4 -2
  157. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +3 -0
  158. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  159. package/themes/original/src/components/PaymentOptions/index.tsx +72 -6
  160. package/themes/original/src/components/ProductForm/ActionButton.tsx +120 -0
  161. package/themes/original/src/components/ProductForm/ExtraOptions.tsx +56 -0
  162. package/themes/original/src/components/ProductForm/index.tsx +68 -156
  163. package/themes/original/src/components/ProductItemAccordion/index.tsx +54 -44
  164. package/themes/original/src/components/ProductItemAccordion/styles.tsx +3 -4
  165. package/themes/original/src/components/ProductOptionSubOption/index.tsx +105 -91
  166. package/themes/original/src/components/ProfessionalProfile/styles.tsx +3 -3
  167. package/themes/original/src/components/Promotions/index.tsx +4 -4
  168. package/themes/original/src/components/Promotions/styles.tsx +0 -2
  169. package/themes/original/src/components/ReviewDriver/styles.tsx +1 -1
  170. package/themes/original/src/components/ReviewOrder/styles.tsx +1 -1
  171. package/themes/original/src/components/ReviewProducts/styles.tsx +1 -1
  172. package/themes/original/src/components/ServiceForm/index.tsx +2 -2
  173. package/themes/original/src/components/ServiceForm/styles.tsx +4 -4
  174. package/themes/original/src/components/SignupForm/index.tsx +60 -58
  175. package/themes/original/src/components/SingleOrderCard/index.tsx +3 -2
  176. package/themes/original/src/components/SingleProductCard/index.tsx +2 -2
  177. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  178. package/themes/original/src/components/StripeCardsList/index.tsx +17 -36
  179. package/themes/original/src/components/StripeElementsForm/index.tsx +74 -59
  180. package/themes/original/src/components/StripeElementsForm/naked.tsx +47 -0
  181. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +170 -0
  182. package/themes/original/src/components/UpsellingProducts/UpsellingLayout.tsx +86 -0
  183. package/themes/original/src/components/UpsellingProducts/index.tsx +15 -199
  184. package/themes/original/src/components/UpsellingProducts/styles.tsx +19 -0
  185. package/themes/original/src/components/UserFormDetails/index.tsx +123 -75
  186. package/themes/original/src/components/UserFormDetails/styles.tsx +7 -0
  187. package/themes/original/src/components/UserProfile/index.tsx +3 -2
  188. package/themes/original/src/components/WalletTransactions/styles.tsx +1 -0
  189. package/themes/original/src/components/Wallets/index.tsx +3 -4
  190. package/themes/original/src/components/Wallets/styles.tsx +1 -1
  191. package/themes/original/src/components/WebsocketStatus/index.tsx +172 -0
  192. package/themes/original/src/components/WebsocketStatus/styles.tsx +28 -0
  193. package/themes/original/src/components/shared/HeaderTitle.tsx +1 -1
  194. package/themes/original/src/components/shared/OButton.tsx +5 -5
  195. package/themes/original/src/components/shared/OInput.tsx +1 -4
  196. package/themes/original/src/components/shared/OModal.tsx +12 -14
  197. package/themes/original/src/layouts/Container.tsx +5 -3
  198. package/themes/original/src/types/index.tsx +1 -0
  199. package/themes/original/src/utils/index.tsx +125 -1
  200. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  201. package/src/navigators/BottomNavigator.tsx +0 -117
  202. package/src/navigators/CheckoutNavigator.tsx +0 -66
  203. package/src/navigators/HomeNavigator.tsx +0 -202
  204. package/src/navigators/NavigationRef.tsx +0 -7
  205. package/src/navigators/RootNavigator.tsx +0 -269
  206. package/src/pages/Account.tsx +0 -34
  207. package/src/pages/AddressForm.tsx +0 -62
  208. package/src/pages/AddressList.tsx +0 -24
  209. package/src/pages/BusinessProductsList.tsx +0 -81
  210. package/src/pages/BusinessesListing.tsx +0 -43
  211. package/src/pages/CartList.tsx +0 -49
  212. package/src/pages/Checkout.tsx +0 -101
  213. package/src/pages/ForgotPassword.tsx +0 -24
  214. package/src/pages/Help.tsx +0 -23
  215. package/src/pages/HelpAccountAndPayment.tsx +0 -23
  216. package/src/pages/HelpGuide.tsx +0 -23
  217. package/src/pages/HelpOrder.tsx +0 -23
  218. package/src/pages/Home.tsx +0 -36
  219. package/src/pages/IntroductoryTutorial.tsx +0 -170
  220. package/src/pages/Login.tsx +0 -47
  221. package/src/pages/MomentOption.tsx +0 -30
  222. package/src/pages/MultiCheckout.tsx +0 -31
  223. package/src/pages/MultiOrdersDetails.tsx +0 -27
  224. package/src/pages/MyOrders.tsx +0 -40
  225. package/src/pages/NetworkError.tsx +0 -24
  226. package/src/pages/NotFound.tsx +0 -22
  227. package/src/pages/OrderDetails.tsx +0 -25
  228. package/src/pages/ProductDetails.tsx +0 -55
  229. package/src/pages/Profile.tsx +0 -36
  230. package/src/pages/ReviewDriver.tsx +0 -30
  231. package/src/pages/ReviewOrder.tsx +0 -32
  232. package/src/pages/ReviewProducts.tsx +0 -30
  233. package/src/pages/Sessions.tsx +0 -22
  234. package/src/pages/Signup.tsx +0 -53
  235. package/src/pages/SpinnerLoader.tsx +0 -10
  236. package/src/pages/Splash.tsx +0 -21
@@ -1,6 +1,6 @@
1
- import React, { useState } from 'react';
1
+ import React, { useCallback, useEffect, useState } from 'react';
2
2
  import { View } from 'react-native';
3
- import { useLanguage, useConfig, useUtils } from 'ordering-components/native';
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';
6
6
 
@@ -11,10 +11,10 @@ import { NotFoundSource } from '../NotFoundSource';
11
11
 
12
12
  export const CartContent = (props: any) => {
13
13
  const {
14
- carts,
15
- isOrderStateCarts,
16
14
  onNavigationRedirect,
17
- singleBusiness
15
+ singleBusiness,
16
+ businessSlug,
17
+ navigation
18
18
  } = props
19
19
 
20
20
  const theme = useTheme();
@@ -22,16 +22,22 @@ export const CartContent = (props: any) => {
22
22
  const [{ configs }] = useConfig()
23
23
  const [{ parsePrice }] = useUtils();
24
24
  const [isCartsLoading, setIsCartsLoading] = useState(false)
25
-
26
- const isChewLayout = theme?.header?.components?.layout?.type === 'chew'
25
+ const [cartsOpened, setCartsOpened] = useState([])
26
+ const [{ carts: cartsContext }, { confirmCart }] = useOrder();
27
+ const cartsList =
28
+ (cartsContext &&
29
+ Object.values(cartsContext).filter((cart: any) => cart.products.length > 0)) ??
30
+ [];
31
+ const carts = businessSlug
32
+ ? cartsList.filter((cart: any) => cart?.business?.slug === businessSlug || parseInt(businessSlug) === cart?.business_id)
33
+ : cartsList
34
+ const isOrderStateCarts = !!carts
27
35
  const isMultiCheckout = configs?.checkout_multi_business_enabled?.value === '1'
28
- const cartsAvailable: any = Object.values(carts)?.filter((cart: any) => cart?.valid && cart?.status !== 2)
29
-
36
+ const cartsAvailable: any = Object.values(carts || {})?.filter((cart: any) => cart?.valid && cart?.status !== 2 && cart?.business_id)
30
37
  const totalCartsPrice = cartsAvailable?.length && cartsAvailable.reduce((total: any, cart: any) => { return total + cart?.total }, 0)
31
38
  const totalCartsFee = cartsAvailable?.length && cartsAvailable
32
39
  ?.filter((cart: any) => cart?.status !== 1 && cart?.valid && cart?.products?.length)
33
40
  ?.reduce((total: any, cart: any) => { return total + (cart?.delivery_price_with_discount) }, 0)
34
-
35
41
  const handleCheckoutRedirect = () => {
36
42
  if (cartsAvailable.length === 1) {
37
43
  onNavigationRedirect('CheckoutNavigator', {
@@ -66,9 +72,35 @@ export const CartContent = (props: any) => {
66
72
  }
67
73
  }
68
74
 
75
+ const changeActiveState = useCallback((isClosed: boolean, uuid: string) => {
76
+ const isActive = cartsOpened?.includes?.(uuid) || !!singleBusiness
77
+ if (isActive || !isClosed) {
78
+ setCartsOpened(cartsOpened?.filter?.((_uuid) => _uuid !== uuid))
79
+ } else {
80
+ setCartsOpened([
81
+ ...cartsOpened,
82
+ uuid
83
+ ])
84
+ }
85
+ }, [cartsOpened])
86
+
87
+ useEffect(() => {
88
+ const unsuscribe = navigation.addListener('focus', () => {
89
+ const cartsListBlockedByPaypal = carts?.filter((cart: any) => cart?.status === 2 && cart?.paymethod_data?.gateway === 'paypal')
90
+ if (cartsListBlockedByPaypal?.length > 0) {
91
+ cartsListBlockedByPaypal.map(async (cart: any) => {
92
+ await confirmCart(cart?.uuid)
93
+ })
94
+ }
95
+ })
96
+ return () => {
97
+ return unsuscribe()
98
+ }
99
+ }, [carts, navigation])
100
+
69
101
  return (
70
102
  <CCContainer
71
- style={{ paddingHorizontal: isChewLayout ? 20 : 40 }}
103
+ style={{ paddingHorizontal: 20 }}
72
104
  >
73
105
  {isOrderStateCarts && carts?.length > 0 && (
74
106
  <>
@@ -88,8 +120,12 @@ export const CartContent = (props: any) => {
88
120
  hideUpselling
89
121
  businessConfigs={cart?.business?.configs}
90
122
  hideCouponInput={configs?.multi_business_checkout_coupon_input_style?.value === 'group'}
91
- hideDeliveryFee={configs?.multi_business_checkout_show_combined_delivery_fee?.value === '1'}
123
+ hideDeliveryFee={configs?.multi_business_checkout_show_combined_delivery_fee?.value === '1'}
92
124
  hideDriverTip={configs?.multi_business_checkout_show_combined_driver_tip?.value === '1'}
125
+ cartsOpened={cartsOpened}
126
+ setCartsOpened={setCartsOpened}
127
+ changeActiveState={changeActiveState}
128
+ isActive={cartsOpened?.includes?.(cart?.uuid) || !!singleBusiness}
93
129
  />
94
130
  <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginHorizontal: -40, marginTop: 20 }} />
95
131
  </>
@@ -99,53 +135,55 @@ export const CartContent = (props: any) => {
99
135
  {isMultiCheckout && (
100
136
  <>
101
137
  {!!cartsAvailable.length && (
102
- <ChCartsTotal>
103
- {!!totalCartsFee && configs?.multi_business_checkout_show_combined_delivery_fee?.value === '1' && (
104
- <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
105
- <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
106
- {t('TOTAL_DELIVERY_FEE', 'Total delivery fee')}
107
- </OText>
108
- <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
109
- {parsePrice(totalCartsFee)}
110
- </OText>
111
- </View>
112
- )}
113
- {cartsAvailable.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0) > 0 &&
114
- configs?.multi_business_checkout_show_combined_driver_tip?.value === '1' && (
115
- <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
116
- <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
117
- {t('DRIVER_TIP', 'Driver tip')}
118
- </OText>
119
- <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
120
- {parsePrice(cartsAvailable.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0))}
121
- </OText>
122
- </View>
123
- )}
124
- <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
125
- <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>
126
- {t('TOTAL_FOR_ALL_CARTS', 'Total for all Carts')}
127
- </OText>
128
- <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>{parsePrice(totalCartsPrice)}</OText>
129
- </View>
130
- <View style={{ flexDirection: 'row', justifyContent: 'center', marginVertical: 20 }}>
131
- <OText size={14} color={theme.colors.textNormal} weight={'300'} style={{ textAlign: 'center' }}>
132
- {t('CART_GROUP_MESSAGE_ALERT', 'Discounts may be applied at the time of payment for this group.')}
133
- </OText>
134
- </View>
135
- </ChCartsTotal>
138
+ <>
139
+ <ChCartsTotal>
140
+ {!!totalCartsFee && configs?.multi_business_checkout_show_combined_delivery_fee?.value === '1' && (
141
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
142
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
143
+ {t('TOTAL_DELIVERY_FEE', 'Total delivery fee')}
144
+ </OText>
145
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
146
+ {parsePrice(totalCartsFee)}
147
+ </OText>
148
+ </View>
149
+ )}
150
+ {cartsAvailable.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0) > 0 &&
151
+ configs?.multi_business_checkout_show_combined_driver_tip?.value === '1' && (
152
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
153
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
154
+ {t('DRIVER_TIP', 'Driver tip')}
155
+ </OText>
156
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
157
+ {parsePrice(cartsAvailable.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0))}
158
+ </OText>
159
+ </View>
160
+ )}
161
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
162
+ <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>
163
+ {t('TOTAL_FOR_ALL_CARTS', 'Total for all Carts')}
164
+ </OText>
165
+ <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>{parsePrice(totalCartsPrice)}</OText>
166
+ </View>
167
+ <View style={{ flexDirection: 'row', justifyContent: 'center', marginVertical: 20 }}>
168
+ <OText size={14} color={theme.colors.textNormal} weight={'300'} style={{ textAlign: 'center' }}>
169
+ {t('CART_GROUP_MESSAGE_ALERT', 'Discounts may be applied at the time of payment for this group.')}
170
+ </OText>
171
+ </View>
172
+ </ChCartsTotal>
173
+ <CheckoutAction style={{ marginTop: 0 }}>
174
+ <OButton
175
+ text={t('CHECKOUT', 'Checkout')}
176
+ bgColor={!cartsAvailable.length ? theme.colors.secundary : theme.colors.primary}
177
+ isDisabled={!cartsAvailable.length}
178
+ borderColor={theme.colors.primary}
179
+ imgRightSrc={null}
180
+ textStyle={{ color: 'white', textAlign: 'center', flex: 1 }}
181
+ onClick={() => handleCheckoutRedirect()}
182
+ style={{ width: '100%', flexDirection: 'row', justifyContent: 'center', borderRadius: 7.6, shadowOpacity: 0 }}
183
+ />
184
+ </CheckoutAction>
185
+ </>
136
186
  )}
137
- <CheckoutAction style={{ marginTop: 0 }}>
138
- <OButton
139
- text={t('CHECKOUT', 'Checkout')}
140
- bgColor={!cartsAvailable.length ? theme.colors.secundary : theme.colors.primary}
141
- isDisabled={!cartsAvailable.length}
142
- borderColor={theme.colors.primary}
143
- imgRightSrc={null}
144
- textStyle={{ color: 'white', textAlign: 'center', flex: 1 }}
145
- onClick={() => handleCheckoutRedirect()}
146
- style={{ width: '100%', flexDirection: 'row', justifyContent: 'center', borderRadius: 7.6, shadowOpacity: 0 }}
147
- />
148
- </CheckoutAction>
149
187
  </>
150
188
  )}
151
189
  </>
@@ -9,7 +9,7 @@ export const Container = styled.View`
9
9
  `
10
10
 
11
11
  export const ItemListing = styled.ScrollView`
12
- padding: 0 40px;
12
+ padding: 0 20px;
13
13
  margin: 0 0 140px;
14
14
  `
15
15
 
@@ -19,7 +19,7 @@ export const TopHeader = styled.View`
19
19
  align-items: center;
20
20
  justify-content: space-between;
21
21
  z-index: 1;
22
- padding: 0 40px;
22
+ padding: 0 20px;
23
23
  `
24
24
 
25
25
  export const HeaderItem = styled.TouchableOpacity`
@@ -1,8 +1,12 @@
1
- import React, { useState, useEffect, useCallback } from 'react';
2
- import { View, StyleSheet, TouchableOpacity, Platform, I18nManager, ScrollView } from 'react-native';
1
+ import React, { useState, useEffect, useCallback, useRef } from 'react';
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
+ import NativeStripeSdk from '@stripe/stripe-react-native/src/NativeStripeSdk'
4
5
  import Picker from 'react-native-country-picker-modal';
5
6
  import MaterialIcons from 'react-native-vector-icons/MaterialIcons'
7
+ import IconAntDesign from 'react-native-vector-icons/AntDesign';
8
+ import { useIsFocused } from '@react-navigation/native';
9
+
6
10
  import ReactNativeHapticFeedback from "react-native-haptic-feedback";
7
11
  import {
8
12
  Checkout as CheckoutController,
@@ -45,10 +49,11 @@ import {
45
49
  DeliveryOptionsContainer,
46
50
  DeliveryOptionItem,
47
51
  WalletPaymentOptionContainer,
48
- CartHeader
52
+ CartHeader,
53
+ TopHeader,
54
+ TopActions
49
55
  } from './styles';
50
56
  import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
51
-
52
57
  import { FloatingButton } from '../FloatingButton';
53
58
  import { Container } from '../../layouts/Container';
54
59
  import NavBar from '../NavBar';
@@ -96,10 +101,13 @@ const CheckoutUI = (props: any) => {
96
101
  currency,
97
102
  merchantId,
98
103
  setPlaceSpotNumber,
99
- maxDate
104
+ maxDate,
105
+ androidAppId,
106
+ urlscheme
100
107
  } = props
101
108
 
102
109
  const theme = useTheme();
110
+ const isFocused = useIsFocused();
103
111
 
104
112
  const styles = StyleSheet.create({
105
113
  btnBackArrow: {
@@ -115,7 +123,7 @@ const CheckoutUI = (props: any) => {
115
123
  padding: 20
116
124
  },
117
125
  pagePadding: {
118
- paddingHorizontal: 40
126
+ paddingHorizontal: 20
119
127
  },
120
128
  icon: {
121
129
  top: 15,
@@ -124,13 +132,14 @@ const CheckoutUI = (props: any) => {
124
132
  fontSize: 20
125
133
  },
126
134
  detailWrapper: {
127
- paddingHorizontal: 40,
135
+ paddingHorizontal: 20,
128
136
  width: '100%'
129
137
  },
130
138
  wrapperNavbar: {
131
- paddingVertical: 0,
132
- paddingHorizontal: 40,
133
- marginVertical: 2
139
+ paddingVertical: 2,
140
+ paddingHorizontal: 20,
141
+ backgroundColor: theme?.colors?.white,
142
+ borderWidth: 0
134
143
  }
135
144
  })
136
145
 
@@ -154,19 +163,23 @@ const CheckoutUI = (props: any) => {
154
163
  const [phoneUpdate, setPhoneUpdate] = useState(false);
155
164
  const [openChangeStore, setOpenChangeStore] = useState(false)
156
165
  const [isDeliveryOptionModalVisible, setIsDeliveryOptionModalVisible] = useState(false)
157
- const [showGateway, setShowGateway] = useState<any>({ closedByUsed: false, open: false });
166
+ const [showGateway, setShowGateway] = useState<any>({ closedByUser: false, open: false });
158
167
  const [webviewPaymethod, setWebviewPaymethod] = useState<any>(null)
159
168
  const [isOpen, setIsOpen] = useState(false)
160
169
  const [requiredFields, setRequiredFields] = useState<any>([])
161
- const [openModal, setOpenModal] = useState({ login: false, signup: false })
170
+ const [openModal, setOpenModal] = useState({ login: false, signup: false, isGuest: false })
162
171
  const [allowedGuest, setAllowedGuest] = useState(false)
163
172
  const [placeByMethodPay, setPlaceByMethodPay] = useState(false)
164
173
  const [methodPaySupported, setMethodPaySupported] = useState({ enabled: false, message: null, loading: true })
174
+ const [paymethodClicked, setPaymethodClicked] = useState<any>(null)
175
+ const [showTitle, setShowTitle] = useState(false)
165
176
  const [cardList, setCardList] = useState<any>({ cards: [], loading: false, error: null })
177
+ const [isGiftCardCart, setIsGiftCardCart] = useState(!cart?.business_id)
178
+ const containerRef = useRef<any>()
166
179
  const cardsMethods = ['credomatic']
180
+ const stripePaymethods: any = ['stripe', 'stripe_direct', 'stripe_connect', 'stripe_redirect']
167
181
  const placeSpotTypes = [3, 4, 5]
168
182
  const placeSpotsEnabled = placeSpotTypes.includes(options?.type)
169
- const isGiftCardCart = !cart?.business_id
170
183
  const businessConfigs = businessDetails?.business?.configs ?? []
171
184
  const isWalletCashEnabled = businessConfigs.find((config: any) => config.key === 'wallet_cash_enabled')?.value === '1'
172
185
  const isWalletCreditPointsEnabled = businessConfigs.find((config: any) => config.key === 'wallet_credit_point_enabled')?.value === '1'
@@ -190,15 +203,21 @@ const CheckoutUI = (props: any) => {
190
203
  }, cart?.subtotal)
191
204
 
192
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'
193
211
 
194
212
  const isDisabledButtonPlace = loading || !cart?.valid || (!paymethodSelected && cart?.balance > 0) ||
195
213
  placing || errorCash || subtotalWithTaxes < cart?.minimum ||
196
214
  (cardsMethods.includes(paymethodSelected?.gateway) && cardList?.cards?.length === 0) ||
197
- (options.type === 1 &&
215
+ (options.type === 1 && !isGiftCardCart &&
198
216
  validationFields?.fields?.checkout?.driver_tip?.enabled &&
199
217
  validationFields?.fields?.checkout?.driver_tip?.required &&
200
218
  (Number(cart?.driver_tip) <= 0)) ||
201
- (validateCommentsCartField)
219
+ (validateCommentsCartField) ||
220
+ (validateZipcodeCard)
202
221
  || (methodsPay.includes(paymethodSelected?.gateway) && (!methodPaySupported.enabled || methodPaySupported.loading))
203
222
 
204
223
  const driverTipsOptions = typeof configs?.driver_tip_options?.value === 'string'
@@ -237,7 +256,8 @@ const CheckoutUI = (props: any) => {
237
256
  user,
238
257
  token: user?.session?.access_token
239
258
  })
240
- setOpenModal({ ...openModal, signup: false })
259
+ openModal?.isGuest && handlePlaceOrderAsGuest()
260
+ setOpenModal({ ...openModal, signup: false, isGuest: false })
241
261
  }
242
262
 
243
263
  const handleSuccessLogin = (user: any) => {
@@ -245,9 +265,14 @@ const CheckoutUI = (props: any) => {
245
265
  }
246
266
 
247
267
  const handlePlaceOrder = (confirmPayment: any, forcePlace: boolean = false) => {
268
+ if (stripePaymethods.includes(paymethodSelected?.gateway) && user?.guest_id) {
269
+ setOpenModal({ ...openModal, signup: true, isGuest: true })
270
+ return
271
+ }
272
+
248
273
  if (!userErrors.length && (!requiredFields?.length || allowedGuest) || forcePlace) {
249
274
  vibrateApp()
250
- handlerClickPlaceOrder && handlerClickPlaceOrder(null, { isNative: true }, confirmPayment)
275
+ handlerClickPlaceOrder && handlerClickPlaceOrder(null, { isNative: true }, confirmPayment, NativeStripeSdk?.dismissPlatformPay)
251
276
  return
252
277
  }
253
278
  if (requiredFields?.length) {
@@ -317,6 +342,10 @@ const CheckoutUI = (props: any) => {
317
342
  setPhoneUpdate(val)
318
343
  }
319
344
 
345
+ const handleScroll = ({ nativeEvent: { contentOffset } }: any) => {
346
+ setShowTitle(contentOffset.y > 30)
347
+ }
348
+
320
349
  useEffect(() => {
321
350
  if (validationFields && validationFields?.fields?.checkout) {
322
351
  checkValidationFields()
@@ -332,13 +361,23 @@ const CheckoutUI = (props: any) => {
332
361
 
333
362
  useEffect(() => {
334
363
  if (cart?.products?.length === 0) {
335
- if (cart?.business?.slug) {
364
+ if (cart?.business_id !== null) {
336
365
  onNavigationRedirect('Business', { store: cart?.business?.slug, header: null, logo: null, fromMulti: props.fromMulti })
337
- } else {
366
+ } else if (isGiftCardCart) {
338
367
  onNavigationRedirect('Wallets')
339
368
  }
340
369
  }
341
- }, [cart?.products])
370
+ }, [cart?.products?.length])
371
+
372
+ useEffect(() => {
373
+ if (cart?.products?.length > 0) {
374
+ if (cart?.uuid && cart?.business_id === null) {
375
+ setIsGiftCardCart(true)
376
+ } else {
377
+ setIsGiftCardCart(false)
378
+ }
379
+ }
380
+ }, [cart?.uuid, cart?.products?.length])
342
381
 
343
382
  useEffect(() => {
344
383
  onFailPaypal()
@@ -378,6 +417,7 @@ const CheckoutUI = (props: any) => {
378
417
  }, [])
379
418
 
380
419
  useEffect(() => {
420
+ if (!isFocused) return
381
421
  if (!cartState?.loading && (cartState?.error || typeof cartState?.cart === 'string')) {
382
422
  const error = cartState?.error || typeof cartState.cart === 'string' && cartState.cart
383
423
  if (error) {
@@ -385,13 +425,61 @@ const CheckoutUI = (props: any) => {
385
425
  navigation.navigate('BusinessList')
386
426
  }
387
427
  }
388
- }, [cartState?.error, cartState?.cart, cartState?.loading])
428
+ }, [cartState?.error, cartState?.cart, cartState?.loading, isFocused])
429
+
430
+ useEffect(() => {
431
+ const keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', () => {
432
+ containerRef?.current?.scrollToEnd && containerRef.current.scrollToEnd({ animated: true })
433
+ })
434
+ return () => {
435
+ keyboardDidShowListener.remove()
436
+ }
437
+ }, [])
438
+
439
+ useEffect(() => {
440
+ const onBackFunction = () => {
441
+ if (webviewPaymethod?.gateway === 'paypal' && showGateway.open) {
442
+ setShowGateway({ open: false, closedByUser: true })
443
+ return true
444
+ } else {
445
+ return false
446
+ }
447
+ }
448
+ BackHandler.addEventListener('hardwareBackPress', onBackFunction)
449
+ return () => {
450
+ BackHandler.removeEventListener('hardwareBackPress', onBackFunction)
451
+ }
452
+ }, [BackHandler, webviewPaymethod?.gateway, showGateway.open])
389
453
 
390
454
  return (
391
455
  <>
392
- <Container noPadding>
456
+ <SafeAreaView style={{ backgroundColor: theme.colors.backgroundPage }}>
457
+ <View style={styles.wrapperNavbar}>
458
+ <TopHeader>
459
+ <TopActions onPress={() => onNavigationRedirect('BottomTab', { screen: 'Cart' }, !props.fromMulti)}>
460
+ <IconAntDesign
461
+ name='arrowleft'
462
+ size={26}
463
+ />
464
+ </TopActions>
465
+ {showTitle && (
466
+ <OText
467
+ size={16}
468
+ style={{ flex: 1, textAlign: 'center', right: 15 }}
469
+ weight={Platform.OS === 'ios' ? '600' : 'bold'}
470
+ numberOfLines={2}
471
+ ellipsizeMode='tail'
472
+ >
473
+ {t('CHECKOUT', 'Checkout')}
474
+ </OText>
475
+ )}
476
+ </TopHeader>
477
+ </View>
478
+ </SafeAreaView>
479
+ <Container pt={0} forwardRef={containerRef} showsVerticalScrollIndicator={false} noPadding onScroll={handleScroll}>
393
480
  <View style={styles.wrapperNavbar}>
394
481
  <NavBar
482
+ hideArrowLeft
395
483
  title={t('CHECKOUT', 'Checkout')}
396
484
  titleAlign={'center'}
397
485
  onActionLeft={() => onNavigationRedirect('BottomTab', { screen: 'Cart' }, !props.fromMulti)}
@@ -403,44 +491,46 @@ const CheckoutUI = (props: any) => {
403
491
  />
404
492
  </View>
405
493
  <ChContainer style={styles.pagePadding}>
406
- <ChSection style={{ paddingTop: 0 }}>
407
- <ChHeader>
408
- <CHMomentWrapper isCustomColor={isChewLayout} onPress={() => navigation.navigate('OrderTypes', { configTypes: configTypes })}>
409
- <OText
410
- size={12}
411
- numberOfLines={1}
412
- ellipsizeMode={'tail'}
413
- color={theme.colors?.[isChewLayout ? 'white' : 'textSecondary']}
414
- >
415
- {t(getTypesText(options?.type || 1), 'Delivery')}
416
- </OText>
417
- <OIcon
418
- src={theme.images.general.arrow_down}
419
- width={10}
420
- style={{ marginStart: 8 }}
421
- {...(isChewLayout && { color: 'white' })}
422
- />
423
- </CHMomentWrapper>
424
- <CHMomentWrapper
425
- onPress={() => handleMomentClick()}
426
- disabled={loading}
427
- >
428
- <OText size={12} numberOfLines={1} ellipsizeMode='tail' color={theme.colors.textSecondary}>
429
- {options?.moment
430
- ? parseDate(options?.moment, { outputFormat: configs?.dates_moment_format?.value })
431
- : t('ASAP_ABBREVIATION', 'ASAP')}
432
- </OText>
433
- {isPreOrder && (
494
+ {!isGiftCardCart && (
495
+ <ChSection style={{ paddingTop: 0 }}>
496
+ <ChHeader>
497
+ <CHMomentWrapper isCustomColor={isChewLayout} onPress={() => navigation.navigate('OrderTypes', { configTypes: configTypes })}>
498
+ <OText
499
+ size={12}
500
+ numberOfLines={1}
501
+ ellipsizeMode={'tail'}
502
+ color={theme.colors?.[isChewLayout ? 'white' : 'textSecondary']}
503
+ >
504
+ {t(getTypesText(options?.type || 1), 'Delivery')}
505
+ </OText>
434
506
  <OIcon
435
507
  src={theme.images.general.arrow_down}
436
508
  width={10}
437
509
  style={{ marginStart: 8 }}
510
+ {...(isChewLayout && { color: 'white' })}
438
511
  />
439
- )}
440
- </CHMomentWrapper>
441
- </ChHeader>
442
- <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 18, marginHorizontal: -40 }} />
443
- </ChSection>
512
+ </CHMomentWrapper>
513
+ <CHMomentWrapper
514
+ onPress={() => handleMomentClick()}
515
+ disabled={loading}
516
+ >
517
+ <OText size={12} numberOfLines={1} ellipsizeMode='tail' color={theme.colors.textSecondary}>
518
+ {options?.moment
519
+ ? parseDate(options?.moment, { outputFormat: configs?.dates_moment_format?.value })
520
+ : t('ASAP_ABBREVIATION', 'ASAP')}
521
+ </OText>
522
+ {isPreOrder && (
523
+ <OIcon
524
+ src={theme.images.general.arrow_down}
525
+ width={10}
526
+ style={{ marginStart: 8 }}
527
+ />
528
+ )}
529
+ </CHMomentWrapper>
530
+ </ChHeader>
531
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 18, marginHorizontal: -40 }} />
532
+ </ChSection>
533
+ )}
444
534
 
445
535
  {!isGiftCardCart && !hideBusinessDetails && (
446
536
  <ChSection>
@@ -681,7 +771,7 @@ const CheckoutUI = (props: any) => {
681
771
  cart?.status !== 2 &&
682
772
  validationFields?.fields?.checkout?.driver_tip?.enabled &&
683
773
  driverTipsOptions && driverTipsOptions?.length > 0 &&
684
- !isGiftCardCart &&
774
+ cart?.business_id &&
685
775
  (
686
776
  <ChSection>
687
777
  <ChDriverTips>
@@ -729,12 +819,18 @@ const CheckoutUI = (props: any) => {
729
819
  handlePaymentMethodClickCustom={handlePaymentMethodClick}
730
820
  handlePlaceOrder={handlePlaceOrder}
731
821
  merchantId={merchantId}
822
+ urlscheme={urlscheme}
823
+ androidAppId={androidAppId}
732
824
  setMethodPaySupported={setMethodPaySupported}
733
825
  methodPaySupported={methodPaySupported}
734
826
  placeByMethodPay={placeByMethodPay}
735
827
  setPlaceByMethodPay={setPlaceByMethodPay}
736
828
  cardList={cardList}
737
829
  setCardList={setCardList}
830
+ requiredFields={requiredFields}
831
+ openUserModal={setIsOpen}
832
+ paymethodClicked={paymethodClicked}
833
+ setPaymethodClicked={setPaymethodClicked}
738
834
  />
739
835
  </ChPaymethods>
740
836
  </ChSection>
@@ -770,7 +866,7 @@ const CheckoutUI = (props: any) => {
770
866
  {!cartState.loading && cart && (
771
867
  <ChSection>
772
868
  <ChCart>
773
- {cartsWithProducts && cart?.products?.length === 0 ? (
869
+ {cartsWithProducts?.length > 0 && cart?.products?.length === 0 ? (
774
870
  <NotFoundSource
775
871
  content={t('NOT_FOUND_CARTS', 'Sorry, You don\'t seem to have any carts.')}
776
872
  btnTitle={t('SEARCH_REDIRECT', 'Go to Businesses')}
@@ -848,13 +944,15 @@ const CheckoutUI = (props: any) => {
848
944
  </OText>
849
945
  )}
850
946
 
851
- {!cart?.valid_products && cart?.status !== 2 && (
852
- <OText
853
- color={theme.colors.error}
854
- size={12}
855
- >
856
- {t('WARNING_INVALID_PRODUCTS_CHECKOUT', 'To continue with your checkout, please remove from your cart the products that are not available.')}
857
- </OText>
947
+ {!cart?.valid_products && cart?.status !== 2 && cart?.total !== 0 && (
948
+ <>
949
+ <OText
950
+ color={theme.colors.error}
951
+ size={12}
952
+ >
953
+ {t('WARNING_INVALID_PRODUCTS_CHECKOUT', 'To continue with your checkout, please remove from your cart the products that are not available.')}
954
+ </OText>
955
+ </>
858
956
  )}
859
957
  {cart?.valid_preorder !== undefined && !cart?.valid_preorder && (
860
958
  <OText
@@ -864,7 +962,7 @@ const CheckoutUI = (props: any) => {
864
962
  {t('INVALID_CART_MOMENT', 'Selected schedule time is invalid, please select a schedule into the business schedule interval.')}
865
963
  </OText>
866
964
  )}
867
- {options.type === 1 &&
965
+ {options.type === 1 && !isGiftCardCart &&
868
966
  validationFields?.fields?.checkout?.driver_tip?.enabled &&
869
967
  validationFields?.fields?.checkout?.driver_tip?.required &&
870
968
  (Number(cart?.driver_tip) <= 0) && (
@@ -884,6 +982,15 @@ const CheckoutUI = (props: any) => {
884
982
  {t('WARNING_INVALID_CART_COMMENTS', 'Cart comments is required.')}
885
983
  </OText>
886
984
  )}
985
+
986
+ {validateZipcodeCard && (
987
+ <OText
988
+ color={theme.colors.error}
989
+ size={12}
990
+ >
991
+ {t('WARNING_CARD_ZIPCODE_REQUIRED', 'Your card selected has not zipcode')}
992
+ </OText>
993
+ )}
887
994
  </ChErrors>
888
995
  </View>
889
996
  )}
@@ -919,7 +1026,14 @@ const CheckoutUI = (props: any) => {
919
1026
  handlePlaceOrderAsGuest={handlePlaceOrderAsGuest}
920
1027
  onClose={() => {
921
1028
  setIsOpen(false)
922
- handlePlaceOrder(null, true)
1029
+ if (paymethodClicked) {
1030
+ setPaymethodClicked({
1031
+ ...paymethodClicked,
1032
+ confirmed: true
1033
+ })
1034
+ } else {
1035
+ handlePlaceOrder(null, true)
1036
+ }
923
1037
  }}
924
1038
  setIsOpen={setIsOpen}
925
1039
  />
@@ -927,7 +1041,7 @@ const CheckoutUI = (props: any) => {
927
1041
  </OModal>
928
1042
  <OModal
929
1043
  open={openModal.signup}
930
- onClose={() => setOpenModal({ ...openModal, signup: false })}
1044
+ onClose={() => setOpenModal({ ...openModal, signup: false, isGuest: false })}
931
1045
  >
932
1046
  <ScrollView style={{ paddingHorizontal: 20, width: '100%' }}>
933
1047
  <SignupForm