ordering-ui-react-native 0.19.1 → 0.19.2-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 +9 -2
  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 +5 -5
  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 -103
  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 +148 -21
  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,15 +163,19 @@ 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 [isGiftCardCart, setIsGiftCardCart] = useState(!cart?.business_id)
174
+ const containerRef = useRef<any>()
160
175
  const cardsMethods = ['credomatic']
176
+ const stripePaymethods: any = ['stripe', 'stripe_direct', 'stripe_connect', 'stripe_redirect']
161
177
  const placeSpotTypes = [3, 4, 5]
162
178
  const placeSpotsEnabled = placeSpotTypes.includes(options?.type)
163
- const isGiftCardCart = !cart?.business_id
164
179
  const businessConfigs = businessDetails?.business?.configs ?? []
165
180
  const isWalletCashEnabled = businessConfigs.find((config: any) => config.key === 'wallet_cash_enabled')?.value === '1'
166
181
  const isWalletCreditPointsEnabled = businessConfigs.find((config: any) => config.key === 'wallet_credit_point_enabled')?.value === '1'
@@ -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) {
@@ -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,13 +357,23 @@ 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 })
331
- } else {
360
+ if (cart?.business_id !== null) {
361
+ onNavigationRedirect('Business', { store: cart?.business?.slug, header: null, logo: null, fromMulti: props.fromMulti })
362
+ } else if (isGiftCardCart) {
332
363
  onNavigationRedirect('Wallets')
333
364
  }
334
365
  }
335
- }, [cart?.products])
366
+ }, [cart?.products?.length])
367
+
368
+ useEffect(() => {
369
+ if (cart?.products?.length > 0) {
370
+ if (cart?.uuid && cart?.business_id === null) {
371
+ setIsGiftCardCart(true)
372
+ } else {
373
+ setIsGiftCardCart(false)
374
+ }
375
+ }
376
+ }, [cart?.uuid, cart?.products?.length])
336
377
 
337
378
  useEffect(() => {
338
379
  onFailPaypal()
@@ -367,11 +408,58 @@ const CheckoutUI = (props: any) => {
367
408
  }
368
409
  }, [cart?.paymethod_data])
369
410
 
411
+ const onTextLayout = useCallback((e: any) => {
412
+ setLengthMore((e.nativeEvent.lines.length == 3 && e.nativeEvent.lines[2].width > WIDTH_SCREEN * .76) || e.nativeEvent.lines.length > 3)
413
+ }, [])
414
+
415
+ useEffect(() => {
416
+ if (!cartState?.loading && (cartState?.error || typeof cartState?.cart === 'string')) {
417
+ const error = cartState?.error || typeof cartState.cart === 'string' && cartState.cart
418
+ if (error) {
419
+ showToast(ToastType.Error, cartState?.error || cartState.cart)
420
+ navigation.navigate('BusinessList')
421
+ }
422
+ }
423
+ }, [cartState?.error, cartState?.cart, cartState?.loading])
424
+
425
+ useEffect(() => {
426
+ const keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', () => {
427
+ containerRef?.current?.scrollToEnd && containerRef.current.scrollToEnd({ animated: true })
428
+ })
429
+ return () => {
430
+ keyboardDidShowListener.remove()
431
+ }
432
+ }, [])
433
+
370
434
  return (
371
435
  <>
372
- <Container noPadding>
436
+ <View style={styles.wrapperNavbar}>
437
+ <TopHeader>
438
+ <>
439
+ <TopActions onPress={() => onNavigationRedirect('BottomTab', { screen: 'Cart' }, !props.fromMulti)}>
440
+ <IconAntDesign
441
+ name='arrowleft'
442
+ size={26}
443
+ />
444
+ </TopActions>
445
+ {showTitle && (
446
+ <OText
447
+ size={16}
448
+ style={{ flex: 1, textAlign: 'center', right: 15 }}
449
+ weight={Platform.OS === 'ios' ? '600' : 'bold'}
450
+ numberOfLines={2}
451
+ ellipsizeMode='tail'
452
+ >
453
+ {t('CHECKOUT', 'Checkout')}
454
+ </OText>
455
+ )}
456
+ </>
457
+ </TopHeader>
458
+ </View>
459
+ <Container forwardRef={containerRef} noPadding onScroll={handleScroll}>
373
460
  <View style={styles.wrapperNavbar}>
374
461
  <NavBar
462
+ hideArrowLeft
375
463
  title={t('CHECKOUT', 'Checkout')}
376
464
  titleAlign={'center'}
377
465
  onActionLeft={() => onNavigationRedirect('BottomTab', { screen: 'Cart' }, !props.fromMulti)}
@@ -458,6 +546,25 @@ const CheckoutUI = (props: any) => {
458
546
  {businessDetails?.business?.address}
459
547
  </OText>
460
548
  )}
549
+ {businessDetails?.business?.address_notes && (
550
+ <>
551
+ <OText
552
+ size={12}
553
+ lineHeight={18}
554
+ numberOfLines={isReadMore ? 20 : 3}
555
+ onTextLayout={onTextLayout}
556
+ >
557
+ {businessDetails?.business?.address_notes}
558
+ </OText>
559
+ {lengthMore && (
560
+ <TouchableOpacity
561
+ onPress={() => setIsReadMore(!isReadMore)}
562
+ >
563
+ <OText size={12} color={theme.colors.primary}>{isReadMore ? t('SHOW_LESS', 'Show less') : t('READ_MORE', 'Read more')}</OText>
564
+ </TouchableOpacity>
565
+ )}
566
+ </>
567
+ )}
461
568
  </View>
462
569
  </>
463
570
  )}
@@ -696,6 +803,10 @@ const CheckoutUI = (props: any) => {
696
803
  setPlaceByMethodPay={setPlaceByMethodPay}
697
804
  cardList={cardList}
698
805
  setCardList={setCardList}
806
+ requiredFields={requiredFields}
807
+ openUserModal={setIsOpen}
808
+ paymethodClicked={paymethodClicked}
809
+ setPaymethodClicked={setPaymethodClicked}
699
810
  />
700
811
  </ChPaymethods>
701
812
  </ChSection>
@@ -845,6 +956,15 @@ const CheckoutUI = (props: any) => {
845
956
  {t('WARNING_INVALID_CART_COMMENTS', 'Cart comments is required.')}
846
957
  </OText>
847
958
  )}
959
+
960
+ {validateZipcodeCard && (
961
+ <OText
962
+ color={theme.colors.error}
963
+ size={12}
964
+ >
965
+ {t('WARNING_CARD_ZIPCODE_REQUIRED', 'Your card selected has not zipcode')}
966
+ </OText>
967
+ )}
848
968
  </ChErrors>
849
969
  </View>
850
970
  )}
@@ -880,7 +1000,14 @@ const CheckoutUI = (props: any) => {
880
1000
  handlePlaceOrderAsGuest={handlePlaceOrderAsGuest}
881
1001
  onClose={() => {
882
1002
  setIsOpen(false)
883
- handlePlaceOrder(null, true)
1003
+ if (paymethodClicked) {
1004
+ setPaymethodClicked({
1005
+ ...paymethodClicked,
1006
+ confirmed: true
1007
+ })
1008
+ } else {
1009
+ handlePlaceOrder(null, true)
1010
+ }
884
1011
  }}
885
1012
  setIsOpen={setIsOpen}
886
1013
  />
@@ -888,7 +1015,7 @@ const CheckoutUI = (props: any) => {
888
1015
  </OModal>
889
1016
  <OModal
890
1017
  open={openModal.signup}
891
- onClose={() => setOpenModal({ ...openModal, signup: false })}
1018
+ onClose={() => setOpenModal({ ...openModal, signup: false, isGuest: false })}
892
1019
  >
893
1020
  <ScrollView style={{ paddingHorizontal: 20, width: '100%' }}>
894
1021
  <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)