ordering-ui-react-native 0.19.0-testing → 0.19.1-release

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/package.json +6 -5
  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/VerifyPhone/styles.tsx +1 -2
  6. package/src/components/shared/OToast.tsx +3 -2
  7. package/src/utils/index.tsx +2 -2
  8. package/themes/business/index.tsx +2 -0
  9. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +14 -7
  10. package/themes/business/src/components/BusinessController/index.tsx +19 -17
  11. package/themes/business/src/components/BusinessProductList/AccordionDropdown.tsx +63 -0
  12. package/themes/business/src/components/BusinessProductList/IterateCategories.tsx +108 -0
  13. package/themes/business/src/components/BusinessProductList/ProductList.tsx +196 -0
  14. package/themes/business/src/components/BusinessProductList/index.tsx +196 -0
  15. package/themes/business/src/components/BusinessProductList/styles.tsx +10 -0
  16. package/themes/business/src/components/Chat/index.tsx +41 -13
  17. package/themes/business/src/components/DriverMap/index.tsx +4 -2
  18. package/themes/business/src/components/DriverSchedule/index.tsx +16 -6
  19. package/themes/business/src/components/FloatingButton/index.tsx +34 -31
  20. package/themes/business/src/components/MapView/index.tsx +11 -7
  21. package/themes/business/src/components/MessagesOption/index.tsx +22 -94
  22. package/themes/business/src/components/NewOrderNotification/index.tsx +121 -104
  23. package/themes/business/src/components/OrderDetails/Delivery.tsx +19 -10
  24. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +88 -51
  25. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +26 -6
  26. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +6 -1
  27. package/themes/business/src/components/OrderSummary/index.tsx +7 -8
  28. package/themes/business/src/components/OrdersListManager/index.tsx +7 -2
  29. package/themes/business/src/components/OrdersListManager/utils.tsx +1 -1
  30. package/themes/business/src/components/OrdersOption/index.tsx +43 -32
  31. package/themes/business/src/components/PreviousMessages/FooterMessageComponent.tsx +103 -0
  32. package/themes/business/src/components/PreviousMessages/index.tsx +97 -55
  33. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +21 -28
  34. package/themes/business/src/components/PreviousOrders/OrderList.tsx +93 -0
  35. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +1 -1
  36. package/themes/business/src/components/PreviousOrders/index.tsx +192 -220
  37. package/themes/business/src/components/PreviousOrders/styles.tsx +10 -0
  38. package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
  39. package/themes/business/src/components/SearchBar/index.tsx +2 -1
  40. package/themes/business/src/components/StoresList/index.tsx +5 -3
  41. package/themes/business/src/components/UserProfileForm/index.tsx +9 -8
  42. package/themes/business/src/components/WebsocketStatus/index.tsx +171 -0
  43. package/themes/business/src/components/WebsocketStatus/styles.tsx +28 -0
  44. package/themes/business/src/types/index.tsx +9 -0
  45. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  46. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  47. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  48. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  49. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  50. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  51. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  52. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  53. package/themes/original/index.tsx +7 -3
  54. package/themes/original/src/components/AddressForm/index.tsx +2 -2
  55. package/themes/original/src/components/AddressForm/styles.tsx +1 -1
  56. package/themes/original/src/components/AddressList/index.tsx +4 -7
  57. package/themes/original/src/components/AddressList/styles.tsx +4 -4
  58. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  59. package/themes/original/src/components/BusinessBasicInformation/index.tsx +3 -3
  60. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +1 -1
  61. package/themes/original/src/components/BusinessController/index.tsx +9 -6
  62. package/themes/original/src/components/BusinessController/styles.tsx +8 -7
  63. package/themes/original/src/components/BusinessInformation/index.tsx +35 -3
  64. package/themes/original/src/components/BusinessInformation/styles.tsx +2 -2
  65. package/themes/original/src/components/BusinessItemAccordion/index.tsx +11 -7
  66. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +317 -0
  67. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +96 -0
  68. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +1 -1
  69. package/themes/original/src/components/BusinessListingSearch/index.tsx +56 -361
  70. package/themes/original/src/components/BusinessListingSearch/styles.tsx +1 -1
  71. package/themes/original/src/components/BusinessPreorder/index.tsx +3 -4
  72. package/themes/original/src/components/BusinessProductsCategories/index.tsx +1 -1
  73. package/themes/original/src/components/BusinessProductsList/index.tsx +2 -2
  74. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  75. package/themes/original/src/components/BusinessProductsListing/index.tsx +35 -15
  76. package/themes/original/src/components/BusinessProductsListing/styles.tsx +3 -4
  77. package/themes/original/src/components/BusinessReviews/index.tsx +1 -1
  78. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +1 -1
  79. package/themes/original/src/components/BusinessesListing/Layout/Appointment/styles.tsx +5 -5
  80. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListFooter.tsx +69 -0
  81. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListHeader.tsx +406 -0
  82. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListing.tsx +76 -0
  83. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +29 -402
  84. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  85. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  86. package/themes/original/src/components/Cart/index.tsx +25 -6
  87. package/themes/original/src/components/CartContent/index.tsx +61 -39
  88. package/themes/original/src/components/CartStoresListing/styles.tsx +2 -2
  89. package/themes/original/src/components/Checkout/index.tsx +136 -19
  90. package/themes/original/src/components/Checkout/styles.tsx +17 -0
  91. package/themes/original/src/components/CitiesControl/styles.tsx +1 -1
  92. package/themes/original/src/components/DatePicker/index.tsx +17 -0
  93. package/themes/original/src/components/DatePicker/styles.tsx +20 -0
  94. package/themes/original/src/components/Favorite/index.tsx +4 -9
  95. package/themes/original/src/components/Favorite/styles.tsx +0 -2
  96. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  97. package/themes/original/src/components/GPSButton/index.tsx +1 -1
  98. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +8 -3
  99. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +36 -3
  100. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +1 -1
  101. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +67 -4
  102. package/themes/original/src/components/GiftCard/RedeemGiftCard/styles.tsx +1 -1
  103. package/themes/original/src/components/GiftCard/SendGiftCard/styles.tsx +1 -1
  104. package/themes/original/src/components/GoogleMap/index.tsx +50 -5
  105. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  106. package/themes/original/src/components/HighestRatedBusinesses/styles.tsx +1 -1
  107. package/themes/original/src/components/Home/index.tsx +1 -1
  108. package/themes/original/src/components/LastOrder/index.tsx +2 -1
  109. package/themes/original/src/components/LastOrders/index.tsx +2 -1
  110. package/themes/original/src/components/LoginForm/Otp/index.tsx +53 -47
  111. package/themes/original/src/components/LoginForm/index.tsx +6 -1
  112. package/themes/original/src/components/Messages/index.tsx +9 -4
  113. package/themes/original/src/components/Messages/styles.tsx +1 -1
  114. package/themes/original/src/components/MomentOption/index.tsx +4 -4
  115. package/themes/original/src/components/MomentSelector/index.tsx +1 -1
  116. package/themes/original/src/components/MultiCart/index.tsx +1 -1
  117. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +13 -4
  118. package/themes/original/src/components/MultiCheckout/index.tsx +184 -51
  119. package/themes/original/src/components/MultiOrdersDetails/index.tsx +1 -1
  120. package/themes/original/src/components/MyOrders/index.tsx +5 -5
  121. package/themes/original/src/components/NavBar/index.tsx +3 -1
  122. package/themes/original/src/components/NetworkError/index.tsx +2 -3
  123. package/themes/original/src/components/NetworkError/styles.tsx +2 -2
  124. package/themes/original/src/components/Notifications/index.tsx +4 -8
  125. package/themes/original/src/components/Notifications/styles.tsx +0 -1
  126. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +7 -3
  127. package/themes/original/src/components/OrderDetails/index.tsx +717 -667
  128. package/themes/original/src/components/OrderDetails/styles.tsx +24 -8
  129. package/themes/original/src/components/OrderProgress/index.tsx +7 -7
  130. package/themes/original/src/components/OrderProgress/styles.tsx +1 -1
  131. package/themes/original/src/components/OrderSummary/index.tsx +5 -3
  132. package/themes/original/src/components/OrderTypeSelector/index.tsx +5 -6
  133. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +1 -1
  134. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +1 -1
  135. package/themes/original/src/components/OrdersOption/index.tsx +4 -3
  136. package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
  137. package/themes/original/src/components/PageBanner/index.tsx +3 -0
  138. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +3 -0
  139. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  140. package/themes/original/src/components/PaymentOptions/index.tsx +41 -32
  141. package/themes/original/src/components/PhoneInputNumber/index.tsx +15 -1
  142. package/themes/original/src/components/ProductForm/ActionButton.tsx +120 -0
  143. package/themes/original/src/components/ProductForm/ExtraOptions.tsx +56 -0
  144. package/themes/original/src/components/ProductForm/index.tsx +81 -167
  145. package/themes/original/src/components/ProductForm/styles.tsx +1 -1
  146. package/themes/original/src/components/ProductItemAccordion/index.tsx +5 -0
  147. package/themes/original/src/components/ProductOptionSubOption/index.tsx +120 -79
  148. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +10 -9
  149. package/themes/original/src/components/ProfessionalProfile/styles.tsx +3 -3
  150. package/themes/original/src/components/Promotions/index.tsx +4 -4
  151. package/themes/original/src/components/Promotions/styles.tsx +0 -2
  152. package/themes/original/src/components/ReviewDriver/styles.tsx +1 -1
  153. package/themes/original/src/components/ReviewOrder/styles.tsx +1 -1
  154. package/themes/original/src/components/ReviewProducts/styles.tsx +1 -1
  155. package/themes/original/src/components/ServiceForm/index.tsx +2 -2
  156. package/themes/original/src/components/ServiceForm/styles.tsx +4 -4
  157. package/themes/original/src/components/SingleOrderCard/index.tsx +4 -3
  158. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  159. package/themes/original/src/components/StripeCardsList/index.tsx +53 -7
  160. package/themes/original/src/components/StripeElementsForm/index.tsx +1 -1
  161. package/themes/original/src/components/StripeElementsForm/naked.tsx +12 -1
  162. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +170 -0
  163. package/themes/original/src/components/UpsellingProducts/UpsellingLayout.tsx +86 -0
  164. package/themes/original/src/components/UpsellingProducts/index.tsx +15 -199
  165. package/themes/original/src/components/UpsellingProducts/styles.tsx +19 -0
  166. package/themes/original/src/components/UserFormDetails/index.tsx +53 -7
  167. package/themes/original/src/components/UserProfile/index.tsx +1 -1
  168. package/themes/original/src/components/UserProfileForm/index.tsx +30 -36
  169. package/themes/original/src/components/UserVerification/index.tsx +55 -50
  170. package/themes/original/src/components/WalletTransactions/styles.tsx +1 -0
  171. package/themes/original/src/components/Wallets/index.tsx +8 -9
  172. package/themes/original/src/components/Wallets/styles.tsx +1 -1
  173. package/themes/original/src/components/shared/HeaderTitle.tsx +1 -1
  174. package/themes/original/src/components/shared/OInput.tsx +1 -4
  175. package/themes/original/src/components/shared/OModal.tsx +12 -14
  176. package/themes/original/src/layouts/Container.tsx +5 -3
  177. package/themes/original/src/types/index.tsx +10 -2
  178. package/themes/original/src/utils/index.tsx +124 -0
  179. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  180. package/src/navigators/BottomNavigator.tsx +0 -117
  181. package/src/navigators/CheckoutNavigator.tsx +0 -66
  182. package/src/navigators/HomeNavigator.tsx +0 -202
  183. package/src/navigators/NavigationRef.tsx +0 -7
  184. package/src/navigators/RootNavigator.tsx +0 -269
  185. package/src/pages/Account.tsx +0 -34
  186. package/src/pages/AddressForm.tsx +0 -62
  187. package/src/pages/AddressList.tsx +0 -24
  188. package/src/pages/BusinessProductsList.tsx +0 -81
  189. package/src/pages/BusinessesListing.tsx +0 -43
  190. package/src/pages/CartList.tsx +0 -49
  191. package/src/pages/Checkout.tsx +0 -101
  192. package/src/pages/ForgotPassword.tsx +0 -24
  193. package/src/pages/Help.tsx +0 -23
  194. package/src/pages/HelpAccountAndPayment.tsx +0 -23
  195. package/src/pages/HelpGuide.tsx +0 -23
  196. package/src/pages/HelpOrder.tsx +0 -23
  197. package/src/pages/Home.tsx +0 -36
  198. package/src/pages/IntroductoryTutorial.tsx +0 -170
  199. package/src/pages/Login.tsx +0 -47
  200. package/src/pages/MomentOption.tsx +0 -30
  201. package/src/pages/MultiCheckout.tsx +0 -31
  202. package/src/pages/MultiOrdersDetails.tsx +0 -27
  203. package/src/pages/MyOrders.tsx +0 -40
  204. package/src/pages/NetworkError.tsx +0 -24
  205. package/src/pages/NotFound.tsx +0 -22
  206. package/src/pages/OrderDetails.tsx +0 -25
  207. package/src/pages/ProductDetails.tsx +0 -55
  208. package/src/pages/Profile.tsx +0 -36
  209. package/src/pages/ReviewDriver.tsx +0 -30
  210. package/src/pages/ReviewOrder.tsx +0 -32
  211. package/src/pages/ReviewProducts.tsx +0 -30
  212. package/src/pages/Sessions.tsx +0 -22
  213. package/src/pages/Signup.tsx +0 -53
  214. package/src/pages/SpinnerLoader.tsx +0 -10
  215. package/src/pages/Splash.tsx +0 -21
@@ -1,6 +1,6 @@
1
- import React, { useState } from 'react';
1
+ import React, { useCallback, 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,9 +11,9 @@ import { NotFoundSource } from '../NotFoundSource';
11
11
 
12
12
  export const CartContent = (props: any) => {
13
13
  const {
14
- carts,
15
- isOrderStateCarts,
16
- onNavigationRedirect
14
+ onNavigationRedirect,
15
+ singleBusiness,
16
+ businessSlug
17
17
  } = props
18
18
 
19
19
  const theme = useTheme();
@@ -21,16 +21,22 @@ export const CartContent = (props: any) => {
21
21
  const [{ configs }] = useConfig()
22
22
  const [{ parsePrice }] = useUtils();
23
23
  const [isCartsLoading, setIsCartsLoading] = useState(false)
24
-
25
- const isChewLayout = theme?.header?.components?.layout?.type === 'chew'
24
+ const [cartsOpened, setCartsOpened] = useState([])
25
+ const [{ carts: cartsContext }] = useOrder();
26
+ const cartsList =
27
+ (cartsContext &&
28
+ Object.values(cartsContext).filter((cart: any) => cart.products.length > 0)) ??
29
+ [];
30
+ const carts = businessSlug
31
+ ? cartsList.filter((cart: any) => cart?.business?.slug === businessSlug || parseInt(businessSlug) === cart?.business_id)
32
+ : cartsList
33
+ const isOrderStateCarts = !!carts
26
34
  const isMultiCheckout = configs?.checkout_multi_business_enabled?.value === '1'
27
- const cartsAvailable: any = Object.values(carts)?.filter((cart: any) => cart?.valid && cart?.status !== 2)
28
-
35
+ const cartsAvailable: any = Object.values(carts || {})?.filter((cart: any) => cart?.valid && cart?.status !== 2)
29
36
  const totalCartsPrice = cartsAvailable?.length && cartsAvailable.reduce((total: any, cart: any) => { return total + cart?.total }, 0)
30
37
  const totalCartsFee = cartsAvailable?.length && cartsAvailable
31
38
  ?.filter((cart: any) => cart?.status !== 1 && cart?.valid && cart?.products?.length)
32
39
  ?.reduce((total: any, cart: any) => { return total + (cart?.delivery_price_with_discount) }, 0)
33
-
34
40
  const handleCheckoutRedirect = () => {
35
41
  if (cartsAvailable.length === 1) {
36
42
  onNavigationRedirect('CheckoutNavigator', {
@@ -65,9 +71,21 @@ export const CartContent = (props: any) => {
65
71
  }
66
72
  }
67
73
 
74
+ const changeActiveState = useCallback((isClosed : boolean, uuid : string) => {
75
+ const isActive = cartsOpened?.includes?.(uuid) || !!singleBusiness
76
+ if (isActive || !isClosed) {
77
+ setCartsOpened(cartsOpened?.filter?.((_uuid) => _uuid !== uuid))
78
+ } else {
79
+ setCartsOpened([
80
+ ...cartsOpened,
81
+ uuid
82
+ ])
83
+ }
84
+ }, [cartsOpened])
85
+
68
86
  return (
69
87
  <CCContainer
70
- style={{ paddingHorizontal: isChewLayout ? 20 : 40 }}
88
+ style={{ paddingHorizontal: 20 }}
71
89
  >
72
90
  {isOrderStateCarts && carts?.length > 0 && (
73
91
  <>
@@ -87,8 +105,12 @@ export const CartContent = (props: any) => {
87
105
  hideUpselling
88
106
  businessConfigs={cart?.business?.configs}
89
107
  hideCouponInput={configs?.multi_business_checkout_coupon_input_style?.value === 'group'}
90
- hideDeliveryFee={configs?.multi_business_checkout_show_combined_delivery_fee?.value === '1'}
108
+ hideDeliveryFee={configs?.multi_business_checkout_show_combined_delivery_fee?.value === '1'}
91
109
  hideDriverTip={configs?.multi_business_checkout_show_combined_driver_tip?.value === '1'}
110
+ cartsOpened={cartsOpened}
111
+ setCartsOpened={setCartsOpened}
112
+ changeActiveState={changeActiveState}
113
+ isActive={cartsOpened?.includes?.(cart?.uuid) || !!singleBusiness}
92
114
  />
93
115
  <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginHorizontal: -40, marginTop: 20 }} />
94
116
  </>
@@ -100,32 +122,32 @@ export const CartContent = (props: any) => {
100
122
  {!!cartsAvailable.length && (
101
123
  <ChCartsTotal>
102
124
  {!!totalCartsFee && configs?.multi_business_checkout_show_combined_delivery_fee?.value === '1' && (
103
- <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
104
- <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
105
- {t('TOTAL_DELIVERY_FEE', 'Total delivery fee')}
106
- </OText>
107
- <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
108
- {parsePrice(totalCartsFee)}
109
- </OText>
110
- </View>
111
- )}
112
- {cartsAvailable.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0) > 0 &&
113
- configs?.multi_business_checkout_show_combined_driver_tip?.value === '1' && (
114
- <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
115
- <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
116
- {t('DRIVER_TIP', 'Driver tip')}
117
- </OText>
118
- <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
119
- {parsePrice(cartsAvailable.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0))}
120
- </OText>
121
- </View>
122
- )}
123
- <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
124
- <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>
125
- {t('TOTAL_FOR_ALL_CARTS', 'Total for all Carts')}
126
- </OText>
127
- <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>{parsePrice(totalCartsPrice)}</OText>
128
- </View>
125
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
126
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
127
+ {t('TOTAL_DELIVERY_FEE', 'Total delivery fee')}
128
+ </OText>
129
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
130
+ {parsePrice(totalCartsFee)}
131
+ </OText>
132
+ </View>
133
+ )}
134
+ {cartsAvailable.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0) > 0 &&
135
+ configs?.multi_business_checkout_show_combined_driver_tip?.value === '1' && (
136
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
137
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
138
+ {t('DRIVER_TIP', 'Driver tip')}
139
+ </OText>
140
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
141
+ {parsePrice(cartsAvailable.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0))}
142
+ </OText>
143
+ </View>
144
+ )}
145
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
146
+ <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>
147
+ {t('TOTAL_FOR_ALL_CARTS', 'Total for all Carts')}
148
+ </OText>
149
+ <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>{parsePrice(totalCartsPrice)}</OText>
150
+ </View>
129
151
  <View style={{ flexDirection: 'row', justifyContent: 'center', marginVertical: 20 }}>
130
152
  <OText size={14} color={theme.colors.textNormal} weight={'300'} style={{ textAlign: 'center' }}>
131
153
  {t('CART_GROUP_MESSAGE_ALERT', 'Discounts may be applied at the time of payment for this group.')}
@@ -156,7 +178,7 @@ export const CartContent = (props: any) => {
156
178
  btnStyle={{ borderRadius: 8 }}
157
179
  content={t('CARTS_NOT_FOUND', 'You don\'t have carts available')}
158
180
  btnTitle={t('START_SHOPPING', 'Start shopping')}
159
- onClickButton={() => onNavigationRedirect('BusinessList')}
181
+ onClickButton={() => singleBusiness ? onNavigationRedirect('Business') : onNavigationRedirect('BusinessList')}
160
182
  />
161
183
  </CCNotCarts>
162
184
  )}
@@ -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,11 @@
1
- import React, { useState, useEffect } 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 } 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
+
6
9
  import ReactNativeHapticFeedback from "react-native-haptic-feedback";
7
10
  import {
8
11
  Checkout as CheckoutController,
@@ -45,10 +48,11 @@ import {
45
48
  DeliveryOptionsContainer,
46
49
  DeliveryOptionItem,
47
50
  WalletPaymentOptionContainer,
48
- CartHeader
51
+ CartHeader,
52
+ TopHeader,
53
+ TopActions
49
54
  } from './styles';
50
55
  import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
51
-
52
56
  import { FloatingButton } from '../FloatingButton';
53
57
  import { Container } from '../../layouts/Container';
54
58
  import NavBar from '../NavBar';
@@ -56,6 +60,8 @@ import { OrderSummary } from '../OrderSummary';
56
60
  import { getTypesText } from '../../utils';
57
61
  import { CartStoresListing } from '../CartStoresListing';
58
62
  import { PaymentOptionsWebView } from '../../../../../src/components/PaymentOptionsWebView';
63
+ import { DeviceOrientationMethods } from '../../../../../src/hooks/DeviceOrientation'
64
+ const { useDeviceOrientation } = DeviceOrientationMethods
59
65
 
60
66
  const mapConfigs = {
61
67
  mapZoom: 16,
@@ -113,7 +119,7 @@ const CheckoutUI = (props: any) => {
113
119
  padding: 20
114
120
  },
115
121
  pagePadding: {
116
- paddingHorizontal: 40
122
+ paddingHorizontal: 20
117
123
  },
118
124
  icon: {
119
125
  top: 15,
@@ -122,13 +128,14 @@ const CheckoutUI = (props: any) => {
122
128
  fontSize: 20
123
129
  },
124
130
  detailWrapper: {
125
- paddingHorizontal: 40,
131
+ paddingHorizontal: 20,
126
132
  width: '100%'
127
133
  },
128
134
  wrapperNavbar: {
129
- paddingVertical: 0,
130
- paddingHorizontal: 40,
131
- marginVertical: 2
135
+ paddingVertical: 2,
136
+ paddingHorizontal: 20,
137
+ backgroundColor: theme?.colors?.white,
138
+ borderWidth: 0
132
139
  }
133
140
  })
134
141
 
@@ -141,6 +148,10 @@ const CheckoutUI = (props: any) => {
141
148
  const [{ options, carts, loading }, { confirmCart }] = useOrder();
142
149
  const [validationFields] = useValidationFields();
143
150
  const [events] = useEvent()
151
+ const [orientationState] = useDeviceOrientation();
152
+ const [isReadMore, setIsReadMore] = useState(false)
153
+ const [lengthMore, setLengthMore] = useState(false)
154
+ const WIDTH_SCREEN = orientationState?.dimensions?.width
144
155
 
145
156
  const [errorCash, setErrorCash] = useState(false);
146
157
  const [userErrors, setUserErrors] = useState<any>([]);
@@ -152,12 +163,16 @@ const CheckoutUI = (props: any) => {
152
163
  const [webviewPaymethod, setWebviewPaymethod] = useState<any>(null)
153
164
  const [isOpen, setIsOpen] = useState(false)
154
165
  const [requiredFields, setRequiredFields] = useState<any>([])
155
- const [openModal, setOpenModal] = useState({ login: false, signup: false })
166
+ const [openModal, setOpenModal] = useState({ login: false, signup: false, isGuest: false })
156
167
  const [allowedGuest, setAllowedGuest] = useState(false)
157
168
  const [placeByMethodPay, setPlaceByMethodPay] = useState(false)
158
169
  const [methodPaySupported, setMethodPaySupported] = useState({ enabled: false, message: null, loading: true })
170
+ const [paymethodClicked, setPaymethodClicked] = useState<any>(null)
171
+ const [showTitle, setShowTitle] = useState(false)
159
172
  const [cardList, setCardList] = useState<any>({ cards: [], loading: false, error: null })
173
+ const containerRef = useRef<any>()
160
174
  const cardsMethods = ['credomatic']
175
+ const stripePaymethods: any = ['stripe', 'stripe_direct', 'stripe_connect', 'stripe_redirect']
161
176
  const placeSpotTypes = [3, 4, 5]
162
177
  const placeSpotsEnabled = placeSpotTypes.includes(options?.type)
163
178
  const isGiftCardCart = !cart?.business_id
@@ -184,6 +199,11 @@ const CheckoutUI = (props: any) => {
184
199
  }, cart?.subtotal)
185
200
 
186
201
  const validateCommentsCartField = validationFields?.fields?.checkout?.comments?.enabled && validationFields?.fields?.checkout?.comments?.required && (cart?.comment === null || cart?.comment?.trim().length === 0)
202
+ const validateZipcodeCard = validationFields?.fields?.card?.zipcode?.enabled &&
203
+ validationFields?.fields?.card?.zipcode?.required &&
204
+ paymethodSelected?.data?.card &&
205
+ !paymethodSelected?.data?.card?.zipcode &&
206
+ paymethodSelected?.gateway === 'stripe'
187
207
 
188
208
  const isDisabledButtonPlace = loading || !cart?.valid || (!paymethodSelected && cart?.balance > 0) ||
189
209
  placing || errorCash || subtotalWithTaxes < cart?.minimum ||
@@ -192,7 +212,8 @@ const CheckoutUI = (props: any) => {
192
212
  validationFields?.fields?.checkout?.driver_tip?.enabled &&
193
213
  validationFields?.fields?.checkout?.driver_tip?.required &&
194
214
  (Number(cart?.driver_tip) <= 0)) ||
195
- (validateCommentsCartField)
215
+ (validateCommentsCartField) ||
216
+ (validateZipcodeCard)
196
217
  || (methodsPay.includes(paymethodSelected?.gateway) && (!methodPaySupported.enabled || methodPaySupported.loading))
197
218
 
198
219
  const driverTipsOptions = typeof configs?.driver_tip_options?.value === 'string'
@@ -231,7 +252,8 @@ const CheckoutUI = (props: any) => {
231
252
  user,
232
253
  token: user?.session?.access_token
233
254
  })
234
- setOpenModal({ ...openModal, signup: false })
255
+ openModal?.isGuest && handlePlaceOrderAsGuest()
256
+ setOpenModal({ ...openModal, signup: false, isGuest: false })
235
257
  }
236
258
 
237
259
  const handleSuccessLogin = (user: any) => {
@@ -239,9 +261,14 @@ const CheckoutUI = (props: any) => {
239
261
  }
240
262
 
241
263
  const handlePlaceOrder = (confirmPayment: any, forcePlace: boolean = false) => {
264
+ if (stripePaymethods.includes(paymethodSelected?.gateway) && user?.guest_id) {
265
+ setOpenModal({ ...openModal, signup: true, isGuest: true })
266
+ return
267
+ }
268
+
242
269
  if (!userErrors.length && (!requiredFields?.length || allowedGuest) || forcePlace) {
243
270
  vibrateApp()
244
- handlerClickPlaceOrder && handlerClickPlaceOrder(null, { isNative: true }, confirmPayment)
271
+ handlerClickPlaceOrder && handlerClickPlaceOrder(null, { isNative: true }, confirmPayment, NativeStripeSdk?.dismissPlatformPay)
245
272
  return
246
273
  }
247
274
  if (requiredFields?.length) {
@@ -279,7 +306,7 @@ const CheckoutUI = (props: any) => {
279
306
  const checkValidationFields = () => {
280
307
  setUserErrors([])
281
308
  const errors = []
282
- const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes']
309
+ const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes', 'comments']
283
310
  const _requiredFields: any = []
284
311
 
285
312
  Object.values(validationFields?.fields?.checkout).map((field: any) => {
@@ -311,6 +338,10 @@ const CheckoutUI = (props: any) => {
311
338
  setPhoneUpdate(val)
312
339
  }
313
340
 
341
+ const handleScroll = ({ nativeEvent: { contentOffset } }: any) => {
342
+ setShowTitle(contentOffset.y > 30)
343
+ }
344
+
314
345
  useEffect(() => {
315
346
  if (validationFields && validationFields?.fields?.checkout) {
316
347
  checkValidationFields()
@@ -326,8 +357,8 @@ const CheckoutUI = (props: any) => {
326
357
 
327
358
  useEffect(() => {
328
359
  if (cart?.products?.length === 0) {
329
- if (cart?.business?.slug) {
330
- onNavigationRedirect('Business', { store: cart?.business?.slug, header: null, logo: null })
360
+ if (cart?.business_id !== null) {
361
+ onNavigationRedirect('Business', { store: cart?.business?.slug, header: null, logo: null, fromMulti: props.fromMulti })
331
362
  } else {
332
363
  onNavigationRedirect('Wallets')
333
364
  }
@@ -367,11 +398,58 @@ const CheckoutUI = (props: any) => {
367
398
  }
368
399
  }, [cart?.paymethod_data])
369
400
 
401
+ const onTextLayout = useCallback((e: any) => {
402
+ setLengthMore((e.nativeEvent.lines.length == 3 && e.nativeEvent.lines[2].width > WIDTH_SCREEN * .76) || e.nativeEvent.lines.length > 3)
403
+ }, [])
404
+
405
+ useEffect(() => {
406
+ if (!cartState?.loading && (cartState?.error || typeof cartState?.cart === 'string')) {
407
+ const error = cartState?.error || typeof cartState.cart === 'string' && cartState.cart
408
+ if (error) {
409
+ showToast(ToastType.Error, cartState?.error || cartState.cart)
410
+ navigation.navigate('BusinessList')
411
+ }
412
+ }
413
+ }, [cartState?.error, cartState?.cart, cartState?.loading])
414
+
415
+ useEffect(() => {
416
+ const keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', () => {
417
+ containerRef?.current?.scrollToEnd && containerRef.current.scrollToEnd({ animated: true })
418
+ })
419
+ return () => {
420
+ keyboardDidShowListener.remove()
421
+ }
422
+ }, [])
423
+
370
424
  return (
371
425
  <>
372
- <Container noPadding>
426
+ <View style={styles.wrapperNavbar}>
427
+ <TopHeader>
428
+ <>
429
+ <TopActions onPress={() => onNavigationRedirect('BottomTab', { screen: 'Cart' }, !props.fromMulti)}>
430
+ <IconAntDesign
431
+ name='arrowleft'
432
+ size={26}
433
+ />
434
+ </TopActions>
435
+ {showTitle && (
436
+ <OText
437
+ size={16}
438
+ style={{ flex: 1, textAlign: 'center', right: 15 }}
439
+ weight={Platform.OS === 'ios' ? '600' : 'bold'}
440
+ numberOfLines={2}
441
+ ellipsizeMode='tail'
442
+ >
443
+ {t('CHECKOUT', 'Checkout')}
444
+ </OText>
445
+ )}
446
+ </>
447
+ </TopHeader>
448
+ </View>
449
+ <Container forwardRef={containerRef} noPadding onScroll={handleScroll}>
373
450
  <View style={styles.wrapperNavbar}>
374
451
  <NavBar
452
+ hideArrowLeft
375
453
  title={t('CHECKOUT', 'Checkout')}
376
454
  titleAlign={'center'}
377
455
  onActionLeft={() => onNavigationRedirect('BottomTab', { screen: 'Cart' }, !props.fromMulti)}
@@ -458,6 +536,25 @@ const CheckoutUI = (props: any) => {
458
536
  {businessDetails?.business?.address}
459
537
  </OText>
460
538
  )}
539
+ {businessDetails?.business?.address_notes && (
540
+ <>
541
+ <OText
542
+ size={12}
543
+ lineHeight={18}
544
+ numberOfLines={isReadMore ? 20 : 3}
545
+ onTextLayout={onTextLayout}
546
+ >
547
+ {businessDetails?.business?.address_notes}
548
+ </OText>
549
+ {lengthMore && (
550
+ <TouchableOpacity
551
+ onPress={() => setIsReadMore(!isReadMore)}
552
+ >
553
+ <OText size={12} color={theme.colors.primary}>{isReadMore ? t('SHOW_LESS', 'Show less') : t('READ_MORE', 'Read more')}</OText>
554
+ </TouchableOpacity>
555
+ )}
556
+ </>
557
+ )}
461
558
  </View>
462
559
  </>
463
560
  )}
@@ -696,6 +793,10 @@ const CheckoutUI = (props: any) => {
696
793
  setPlaceByMethodPay={setPlaceByMethodPay}
697
794
  cardList={cardList}
698
795
  setCardList={setCardList}
796
+ requiredFields={requiredFields}
797
+ openUserModal={setIsOpen}
798
+ paymethodClicked={paymethodClicked}
799
+ setPaymethodClicked={setPaymethodClicked}
699
800
  />
700
801
  </ChPaymethods>
701
802
  </ChSection>
@@ -845,6 +946,15 @@ const CheckoutUI = (props: any) => {
845
946
  {t('WARNING_INVALID_CART_COMMENTS', 'Cart comments is required.')}
846
947
  </OText>
847
948
  )}
949
+
950
+ {validateZipcodeCard && (
951
+ <OText
952
+ color={theme.colors.error}
953
+ size={12}
954
+ >
955
+ {t('WARNING_CARD_ZIPCODE_REQUIRED', 'Your card selected has not zipcode')}
956
+ </OText>
957
+ )}
848
958
  </ChErrors>
849
959
  </View>
850
960
  )}
@@ -880,7 +990,14 @@ const CheckoutUI = (props: any) => {
880
990
  handlePlaceOrderAsGuest={handlePlaceOrderAsGuest}
881
991
  onClose={() => {
882
992
  setIsOpen(false)
883
- handlePlaceOrder(null, true)
993
+ if (paymethodClicked) {
994
+ setPaymethodClicked({
995
+ ...paymethodClicked,
996
+ confirmed: true
997
+ })
998
+ } else {
999
+ handlePlaceOrder(null, true)
1000
+ }
884
1001
  }}
885
1002
  setIsOpen={setIsOpen}
886
1003
  />
@@ -888,7 +1005,7 @@ const CheckoutUI = (props: any) => {
888
1005
  </OModal>
889
1006
  <OModal
890
1007
  open={openModal.signup}
891
- onClose={() => setOpenModal({ ...openModal, signup: false })}
1008
+ onClose={() => setOpenModal({ ...openModal, signup: false, isGuest: false })}
892
1009
  >
893
1010
  <ScrollView style={{ paddingHorizontal: 20, width: '100%' }}>
894
1011
  <SignupForm
@@ -113,3 +113,20 @@ export const CartHeader = styled.View`
113
113
  justify-content: space-between;
114
114
  margin-bottom: 10px;
115
115
  `
116
+
117
+ export const TopActions = styled.TouchableOpacity`
118
+ height: 60px;
119
+ justify-content: center;
120
+ min-width: 30px;
121
+ padding-right: 15px;
122
+ `;
123
+
124
+ export const TopHeader = styled.View`
125
+ width: 100%;
126
+ flex-direction: row;
127
+ align-items: center;
128
+ justify-content: space-between;
129
+ z-index: 1;
130
+ height: 60px;
131
+ min-height: 60px;
132
+ `
@@ -2,7 +2,7 @@ import styled, { css } from 'styled-components/native'
2
2
 
3
3
  export const Container = styled.View`
4
4
  width: 100%;
5
- padding: 0 40px;
5
+ padding: 0 20px;
6
6
  justify-content: space-between;
7
7
  padding-bottom: 12px;
8
8
 
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import DatePicker from 'react-native-date-picker'
3
+ import { DateContainer } from './styles';
4
+
5
+ export const DatePickerUI = (props: any) => {
6
+ const {
7
+ birthdate,
8
+ handleChangeDate
9
+ } = props;
10
+
11
+ return (
12
+ <DateContainer>
13
+ <DatePicker mode="date" date={birthdate ? new Date(birthdate) : new Date()} onDateChange={handleChangeDate} />
14
+ </DateContainer>
15
+ );
16
+ };
17
+
@@ -0,0 +1,20 @@
1
+ import styled from 'styled-components/native';
2
+
3
+ export const DateContainer = styled.View`
4
+ display: flex;
5
+ align-items: center;
6
+ margin-bottom: 20px;
7
+
8
+ input {
9
+ border-radius: 20px;
10
+ width: 140px;
11
+ outline: none;
12
+ padding: 10px 15px;
13
+ border: 1px solid #E9ECEF;
14
+ }
15
+
16
+ .react-datepicker__triangle {
17
+ transform: translate(40px, 0px) !important;
18
+ }
19
+
20
+ `
@@ -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()
@@ -35,15 +34,14 @@ export const Favorite = (props: any) => {
35
34
  }
36
35
 
37
36
  return (
38
- <Container
39
- pdng={Platform.OS === 'ios' ? '10px' : '20px'}
40
- >
37
+ <Container>
41
38
  <NavBar
42
39
  title={t('FAVORITE', 'Favorite')}
43
40
  titleAlign={'center'}
44
41
  onActionLeft={goToBack}
45
42
  showCall={false}
46
- paddingTop={10}
43
+ paddingTop={Platform.OS === 'ios' ? 20 : 10}
44
+ style={{ paddingVertical: 0 }}
47
45
  btnStyle={{ paddingLeft: 0 }}
48
46
  />
49
47
  <TabContainer>
@@ -73,7 +71,6 @@ export const Favorite = (props: any) => {
73
71
  originalURL='business'
74
72
  location={`${orderState.options?.address?.location?.lat},${orderState.options?.address?.location?.lng}`}
75
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']}
76
- franchiseId={franchiseId}
77
74
  />
78
75
  )}
79
76
  {tabSelected === 'products' && (
@@ -82,7 +79,6 @@ export const Favorite = (props: any) => {
82
79
  originalURL='products'
83
80
  onNavigationRedirect={onRedirect}
84
81
  isProduct
85
- franchiseId={franchiseId}
86
82
  />
87
83
  )}
88
84
  {tabSelected === 'orders' && (
@@ -91,7 +87,6 @@ export const Favorite = (props: any) => {
91
87
  favoriteURL='favorite_orders'
92
88
  originalURL='orders'
93
89
  isOrder
94
- franchiseId={franchiseId}
95
90
  />
96
91
  )}
97
92
  </Container>
@@ -16,7 +16,5 @@ export const Tab = styled.TouchableOpacity`
16
16
  `
17
17
 
18
18
  export const Container = styled.View`
19
- padding-horizontal: 40px;
20
19
  padding-bottom: 20px;
21
- padding-top: ${(props: any) => props.pdng};
22
20
  `
@@ -5,7 +5,7 @@ export const Container = styled.View`
5
5
  bottom: 0px;
6
6
  left: 0;
7
7
  right: 0;
8
- padding: 12px 40px;
8
+ padding: 12px 20px;
9
9
  flex-direction: row;
10
10
  border-top-width: 1px;
11
11
  border-color: ${(props: any) => props.theme.colors.border};
@@ -61,7 +61,7 @@ export const GPSButton = (props: any) => {
61
61
  if (trackingStatus === 'not-determined') {
62
62
  trackingStatus = await requestTrackingPermission()
63
63
  }
64
- if (trackingStatus === 'authorized' || trackingStatus === 'unavailable') {
64
+ if ( trackingStatus === 'authorized' || trackingStatus === 'denied' || trackingStatus === 'unavailable') {
65
65
  setLoading(true)
66
66
  Geolocation.getCurrentPosition((pos) => {
67
67
  geoCodePosition(pos.coords)
@@ -56,7 +56,7 @@ export const GiftCardUI = React.memo((props: any) => {
56
56
  <View style={style.actionWrapper}>
57
57
  <OButton
58
58
  onClick={() => setOpenModal('purchase')}
59
- text={t('PURCHASE_GIFT_CARD', 'Purchase gift card')}
59
+ text={t('PURCHASE', 'Purchase')}
60
60
  bgColor={theme.colors.primary}
61
61
  borderColor={theme.colors.primary}
62
62
  textStyle={{ color: 'white', fontSize: 13 }}
@@ -66,7 +66,7 @@ export const GiftCardUI = React.memo((props: any) => {
66
66
 
67
67
  <OButton
68
68
  onClick={() => setOpenModal('redeem')}
69
- text={t('REDEEM_GIFT_CARD', 'Redeem gift card')}
69
+ text={t('REDEEM', 'Redeem')}
70
70
  bgColor={theme.colors.lightPrimary}
71
71
  borderColor={theme.colors.lightPrimary}
72
72
  textStyle={{ color: theme.colors.primary, fontSize: 13 }}
@@ -79,13 +79,18 @@ export const GiftCardUI = React.memo((props: any) => {
79
79
  open={openModal === 'purchase'}
80
80
  onClose={() => setOpenModal(null)}
81
81
  entireModal
82
+ customClose
82
83
  >
83
- <PurchaseGiftCard handleCustomGoToCheckout={handleCustomGoToCheckout} />
84
+ <PurchaseGiftCard
85
+ handleCustomGoToCheckout={handleCustomGoToCheckout}
86
+ onClose={() => setOpenModal(null)}
87
+ />
84
88
  </OModal>
85
89
  <OModal
86
90
  open={openModal === 'redeem'}
87
91
  onClose={() => setOpenModal(null)}
88
92
  entireModal
93
+ customClose
89
94
  >
90
95
  <RedeemGiftCard
91
96
  onClose={() => setOpenModal(null)}