ordering-ui-react-native 0.15.64 → 0.15.65-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 (211) hide show
  1. package/package.json +7 -3
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/AddressForm/index.tsx +18 -2
  4. package/src/components/BusinessBasicInformation/index.tsx +11 -19
  5. package/src/components/BusinessController/index.tsx +16 -8
  6. package/src/components/BusinessInformation/index.tsx +14 -0
  7. package/src/components/BusinessTypeFilter/index.tsx +1 -2
  8. package/src/components/BusinessesListing/index.tsx +1 -1
  9. package/src/components/Checkout/index.tsx +23 -2
  10. package/src/components/DriverTips/index.tsx +11 -6
  11. package/src/components/LanguageSelector/index.tsx +6 -2
  12. package/src/components/LoginForm/index.tsx +120 -30
  13. package/src/components/LoginForm/styles.tsx +6 -0
  14. package/src/components/OrderDetails/index.tsx +7 -21
  15. package/src/components/PaymentOptions/index.tsx +67 -50
  16. package/src/components/PaymentOptionsWebView/index.tsx +120 -121
  17. package/src/components/ReviewDriver/index.tsx +1 -1
  18. package/src/components/ReviewOrder/index.tsx +2 -1
  19. package/src/components/ReviewProducts/index.tsx +11 -0
  20. package/src/components/SignupForm/index.tsx +145 -61
  21. package/src/components/SingleProductCard/index.tsx +16 -4
  22. package/src/components/SingleProductReview/index.tsx +1 -1
  23. package/src/components/StripeMethodForm/index.tsx +22 -24
  24. package/src/components/UpsellingProducts/index.tsx +1 -1
  25. package/src/components/UserProfileForm/index.tsx +63 -6
  26. package/src/components/UserProfileForm/styles.tsx +8 -0
  27. package/src/components/VerifyPhone/styles.tsx +1 -2
  28. package/src/components/shared/OModal.tsx +1 -1
  29. package/src/hooks/useCountdownTimer.tsx +26 -0
  30. package/src/navigators/CheckoutNavigator.tsx +6 -0
  31. package/src/navigators/HomeNavigator.tsx +12 -0
  32. package/src/pages/BusinessesListing.tsx +7 -6
  33. package/src/pages/MultiCheckout.tsx +31 -0
  34. package/src/pages/MultiOrdersDetails.tsx +27 -0
  35. package/src/pages/OrderDetails.tsx +1 -1
  36. package/src/pages/ReviewDriver.tsx +2 -2
  37. package/src/pages/ReviewOrder.tsx +2 -2
  38. package/src/pages/Sessions.tsx +22 -0
  39. package/src/theme.json +0 -1
  40. package/src/types/index.tsx +18 -11
  41. package/src/utils/index.tsx +68 -1
  42. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +103 -15
  43. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -0
  44. package/themes/business/src/components/Chat/index.tsx +42 -90
  45. package/themes/business/src/components/DriverMap/index.tsx +6 -5
  46. package/themes/business/src/components/LoginForm/index.tsx +89 -2
  47. package/themes/business/src/components/LoginForm/styles.tsx +6 -0
  48. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  49. package/themes/business/src/components/NewOrderNotification/index.tsx +26 -13
  50. package/themes/business/src/components/OrderDetails/Business.tsx +2 -2
  51. package/themes/business/src/components/OrderDetails/Delivery.tsx +28 -11
  52. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +14 -7
  53. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +6 -0
  54. package/themes/business/src/components/OrdersListManager/index.tsx +1 -1
  55. package/themes/business/src/components/OrdersOption/index.tsx +8 -4
  56. package/themes/business/src/components/PreviousOrders/index.tsx +7 -7
  57. package/themes/business/src/components/ProductItemAccordion/index.tsx +2 -2
  58. package/themes/business/src/components/UserFormDetails/index.tsx +5 -2
  59. package/themes/business/src/components/UserProfileForm/index.tsx +2 -0
  60. package/themes/business/src/components/shared/OModal.tsx +1 -1
  61. package/themes/business/src/types/index.tsx +8 -2
  62. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  63. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  64. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  65. package/themes/kiosk/src/components/BusinessMenu/index.tsx +39 -28
  66. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -3
  67. package/themes/kiosk/src/components/Cart/index.tsx +11 -12
  68. package/themes/kiosk/src/components/CartBottomSheet/index.tsx +9 -2
  69. package/themes/kiosk/src/components/CartContent/index.tsx +0 -11
  70. package/themes/kiosk/src/components/CartItem/index.tsx +4 -3
  71. package/themes/kiosk/src/components/CategoriesMenu/index.tsx +107 -62
  72. package/themes/kiosk/src/components/Checkout/index.tsx +40 -22
  73. package/themes/kiosk/src/components/CustomerName/index.tsx +0 -6
  74. package/themes/kiosk/src/components/DrawerView/index.tsx +1 -0
  75. package/themes/kiosk/src/components/DrawerView/styles.tsx +2 -2
  76. package/themes/kiosk/src/components/NavBar/index.tsx +29 -20
  77. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  78. package/themes/kiosk/src/components/OrderDetails/index.tsx +32 -27
  79. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +9 -11
  80. package/themes/kiosk/src/components/PaymentOptions/index.tsx +56 -54
  81. package/themes/kiosk/src/components/ProductForm/index.tsx +7 -8
  82. package/themes/kiosk/src/components/ProductItemAccordion/index.tsx +2 -2
  83. package/themes/kiosk/src/components/ProductOption/index.tsx +1 -1
  84. package/themes/kiosk/src/components/ProductOptionSubOption/index.tsx +3 -1
  85. package/themes/kiosk/src/components/UpsellingProducts/index.tsx +16 -5
  86. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  87. package/themes/kiosk/src/types/index.d.ts +1 -0
  88. package/themes/original/index.tsx +30 -8
  89. package/themes/original/src/components/ActiveOrders/index.tsx +15 -132
  90. package/themes/original/src/components/ActiveOrders/styles.tsx +0 -54
  91. package/themes/original/src/components/AddressForm/index.tsx +7 -6
  92. package/themes/original/src/components/AddressList/index.tsx +30 -18
  93. package/themes/original/src/components/AppleLogin/index.tsx +6 -8
  94. package/themes/original/src/components/BusinessBasicInformation/index.tsx +304 -158
  95. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +6 -2
  96. package/themes/original/src/components/BusinessController/index.tsx +168 -96
  97. package/themes/original/src/components/BusinessController/styles.tsx +5 -0
  98. package/themes/original/src/components/BusinessItemAccordion/index.tsx +8 -5
  99. package/themes/original/src/components/BusinessItemAccordion/styles.tsx +3 -1
  100. package/themes/original/src/components/BusinessListingSearch/index.tsx +231 -63
  101. package/themes/original/src/components/BusinessListingSearch/styles.tsx +22 -2
  102. package/themes/original/src/components/BusinessPreorder/index.tsx +1 -1
  103. package/themes/original/src/components/BusinessProductsCategories/index.tsx +2 -2
  104. package/themes/original/src/components/BusinessProductsList/CategoryDescription/index.tsx +44 -0
  105. package/themes/original/src/components/BusinessProductsList/index.tsx +51 -52
  106. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  107. package/themes/original/src/components/BusinessProductsListing/index.tsx +318 -155
  108. package/themes/original/src/components/BusinessProductsListing/styles.tsx +32 -0
  109. package/themes/original/src/components/BusinessReviews/index.tsx +6 -1
  110. package/themes/original/src/components/BusinessTypeFilter/index.tsx +106 -39
  111. package/themes/original/src/components/BusinessTypeFilter/styles.tsx +2 -0
  112. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +560 -0
  113. package/themes/original/src/components/BusinessesListing/{styles.tsx → Layout/Appointment/styles.tsx} +24 -2
  114. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +679 -0
  115. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +137 -0
  116. package/themes/original/src/components/BusinessesListing/index.tsx +99 -458
  117. package/themes/original/src/components/Cart/index.tsx +61 -42
  118. package/themes/original/src/components/Checkout/index.tsx +90 -39
  119. package/themes/original/src/components/DriverTips/index.tsx +17 -12
  120. package/themes/original/src/components/Favorite/index.tsx +92 -0
  121. package/themes/original/src/components/Favorite/styles.tsx +22 -0
  122. package/themes/original/src/components/FavoriteList/index.tsx +298 -0
  123. package/themes/original/src/components/FavoriteList/styles.tsx +5 -0
  124. package/themes/original/src/components/ForgotPasswordForm/index.tsx +84 -4
  125. package/themes/original/src/components/GPSButton/index.tsx +15 -8
  126. package/themes/original/src/components/GoogleMap/index.tsx +11 -11
  127. package/themes/original/src/components/Help/index.tsx +21 -4
  128. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +18 -1
  129. package/themes/original/src/components/LastOrders/index.tsx +12 -1
  130. package/themes/original/src/components/LoginForm/Otp/index.tsx +91 -0
  131. package/themes/original/src/components/LoginForm/Otp/styles.tsx +7 -0
  132. package/themes/original/src/components/LoginForm/index.tsx +332 -164
  133. package/themes/original/src/components/LoginForm/styles.tsx +1 -3
  134. package/themes/original/src/components/MessageListing/index.tsx +10 -1
  135. package/themes/original/src/components/Messages/index.tsx +1 -1
  136. package/themes/original/src/components/MomentSelector/index.tsx +197 -0
  137. package/themes/original/src/components/MomentSelector/styles.tsx +6 -0
  138. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +243 -0
  139. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/styles.tsx +46 -0
  140. package/themes/original/src/components/MultiCheckout/index.tsx +298 -0
  141. package/themes/original/src/components/MultiCheckout/styles.tsx +59 -0
  142. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +372 -0
  143. package/themes/original/src/components/MultiOrdersDetails/index.tsx +258 -0
  144. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +50 -0
  145. package/themes/original/src/components/MyOrders/index.tsx +120 -32
  146. package/themes/original/src/components/MyOrders/styles.tsx +8 -1
  147. package/themes/original/src/components/NavBar/index.tsx +4 -4
  148. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +167 -0
  149. package/themes/original/src/components/OrderDetails/index.tsx +150 -64
  150. package/themes/original/src/components/OrderDetails/styles.tsx +1 -2
  151. package/themes/original/src/components/OrderSummary/index.tsx +6 -6
  152. package/themes/original/src/components/OrderTypeSelector/index.tsx +79 -35
  153. package/themes/original/src/components/OrderTypeSelector/styles.tsx +19 -1
  154. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +153 -0
  155. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +6 -0
  156. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +53 -0
  157. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +6 -0
  158. package/themes/original/src/components/OrdersOption/index.tsx +137 -38
  159. package/themes/original/src/components/OrdersOption/styles.tsx +4 -1
  160. package/themes/original/src/components/PaymentOptionCash/index.tsx +2 -2
  161. package/themes/original/src/components/PaymentOptionWallet/index.tsx +17 -23
  162. package/themes/original/src/components/PaymentOptionWallet/styles.tsx +1 -1
  163. package/themes/original/src/components/PaymentOptions/index.tsx +58 -37
  164. package/themes/original/src/components/PhoneInputNumber/index.tsx +5 -11
  165. package/themes/original/src/components/PreviousOrders/index.tsx +18 -147
  166. package/themes/original/src/components/ProductForm/index.tsx +718 -679
  167. package/themes/original/src/components/ProductForm/styles.tsx +6 -2
  168. package/themes/original/src/components/ProductItemAccordion/index.tsx +2 -2
  169. package/themes/original/src/components/ProductOption/index.tsx +1 -1
  170. package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -12
  171. package/themes/original/src/components/ProfessionalFilter/index.tsx +128 -0
  172. package/themes/original/src/components/ProfessionalFilter/styles.tsx +0 -0
  173. package/themes/original/src/components/ProfessionalProfile/index.tsx +298 -0
  174. package/themes/original/src/components/ProfessionalProfile/styles.tsx +46 -0
  175. package/themes/original/src/components/Promotions/index.tsx +151 -133
  176. package/themes/original/src/components/Promotions/styles.tsx +3 -23
  177. package/themes/original/src/components/ReviewDriver/index.tsx +6 -6
  178. package/themes/original/src/components/ReviewOrder/index.tsx +1 -1
  179. package/themes/original/src/components/ReviewTrigger/index.tsx +118 -0
  180. package/themes/original/src/components/ReviewTrigger/styles.tsx +34 -0
  181. package/themes/original/src/components/SearchBar/index.tsx +13 -5
  182. package/themes/original/src/components/ServiceForm/index.tsx +579 -0
  183. package/themes/original/src/components/ServiceForm/styles.tsx +50 -0
  184. package/themes/original/src/components/Sessions/index.tsx +160 -0
  185. package/themes/original/src/components/Sessions/styles.tsx +15 -0
  186. package/themes/original/src/components/SignupForm/index.tsx +237 -126
  187. package/themes/original/src/components/SingleOrderCard/index.tsx +275 -0
  188. package/themes/original/src/components/SingleOrderCard/styles.tsx +54 -0
  189. package/themes/original/src/components/SingleProductCard/index.tsx +161 -88
  190. package/themes/original/src/components/SingleProductCard/styles.tsx +2 -2
  191. package/themes/original/src/components/StripeElementsForm/index.tsx +16 -8
  192. package/themes/original/src/components/StripeElementsForm/naked.tsx +2 -2
  193. package/themes/original/src/components/UpsellingProducts/index.tsx +86 -74
  194. package/themes/original/src/components/UserDetails/index.tsx +15 -81
  195. package/themes/original/src/components/UserFormDetails/index.tsx +98 -66
  196. package/themes/original/src/components/UserProfile/index.tsx +11 -2
  197. package/themes/original/src/components/UserProfileForm/index.tsx +33 -22
  198. package/themes/original/src/components/UserVerification/index.tsx +178 -192
  199. package/themes/original/src/components/VerifyPhone/index.tsx +10 -7
  200. package/themes/original/src/components/VerifyPhone/styles.tsx +2 -1
  201. package/themes/original/src/components/Wallets/index.tsx +76 -9
  202. package/themes/original/src/components/Wallets/styles.tsx +21 -0
  203. package/themes/original/src/components/shared/OBottomPopup.tsx +44 -13
  204. package/themes/original/src/components/shared/OButton.tsx +2 -0
  205. package/themes/original/src/components/shared/OInput.tsx +3 -2
  206. package/themes/original/src/components/shared/OModal.tsx +4 -2
  207. package/themes/original/src/layouts/FloatingBottomContainer.tsx +5 -1
  208. package/themes/original/src/types/index.tsx +187 -35
  209. package/themes/original/src/utils/index.tsx +96 -2
  210. package/themes/single-business/src/components/OrderTypeSelector/index.tsx +1 -1
  211. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -1,5 +1,6 @@
1
1
  import React, { useCallback, useEffect, useRef, useState } from 'react'
2
- import { View, TouchableOpacity, StyleSheet, SafeAreaView } from 'react-native'
2
+ import { View, TouchableOpacity, StyleSheet, SafeAreaView, Dimensions, Platform, KeyboardAvoidingViewBase, KeyboardAvoidingView } from 'react-native'
3
+ import { IOScrollView } from 'react-native-intersection-observer'
3
4
  import { useTheme } from 'styled-components/native';
4
5
  import {
5
6
  BusinessAndProductList,
@@ -9,9 +10,11 @@ import {
9
10
  useUtils,
10
11
  ToastType,
11
12
  useToast,
12
- useConfig
13
+ useConfig,
14
+ useOrderingTheme
13
15
  } from 'ordering-components/native'
14
16
  import { OButton, OIcon, OModal, OText } from '../shared'
17
+ import Alert from '../../providers/AlertProvider'
15
18
  import { BusinessBasicInformation } from '../BusinessBasicInformation'
16
19
  import { SearchBar } from '../SearchBar'
17
20
  import { BusinessProductsCategories } from '../BusinessProductsCategories'
@@ -22,13 +25,20 @@ import {
22
25
  TopHeader,
23
26
  WrapSearchBar,
24
27
  WrapContent,
25
- BusinessProductsListingContainer
28
+ FiltProductsContainer,
29
+ ContainerSafeAreaView,
30
+ BackgroundGray,
31
+ ProfessionalFilterWrapper,
32
+ NearBusiness
26
33
  } from './styles'
27
34
  import { FloatingButton } from '../FloatingButton'
28
35
  import { UpsellingRedirect } from './UpsellingRedirect'
29
36
  import Animated from 'react-native-reanimated'
37
+ import { ProfessionalFilter } from '../ProfessionalFilter';
38
+ import { ServiceForm } from '../ServiceForm';
39
+ import { BusinessesListing } from '../BusinessesListing/Layout/Original'
30
40
 
31
- const PIXELS_TO_SCROLL = 1000
41
+ const PIXELS_TO_SCROLL = 2000
32
42
 
33
43
  const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
34
44
  const {
@@ -45,10 +55,18 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
45
55
  errorQuantityProducts,
46
56
  header,
47
57
  logo,
58
+ alertState,
59
+ setAlertState,
60
+ multiRemoveProducts,
48
61
  getNextProducts,
62
+ handleUpdateProducts,
63
+ professionalSelected,
64
+ handleChangeProfessionalSelected,
65
+ onBusinessClick
49
66
  } = props
50
67
 
51
68
  const theme = useTheme();
69
+ const [orderingTheme] = useOrderingTheme()
52
70
  const [, t] = useLanguage()
53
71
  const [{ auth }] = useSession()
54
72
  const [orderState, { clearCart }] = useOrder()
@@ -56,9 +74,14 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
56
74
  const [, { showToast }] = useToast()
57
75
  const [{ configs }] = useConfig()
58
76
  const isPreOrder = configs?.preorder_status_enabled?.value === '1'
77
+
78
+ const isChewLayout = orderingTheme?.theme?.business_view?.components?.header?.components?.layout?.type === 'chew'
79
+ const showLogo = !orderingTheme?.theme?.business_view?.components?.header?.components?.business?.components?.logo?.hidden
80
+ const hideBusinessNearCity = orderingTheme?.theme?.business_view?.components?.near_business?.hidden
81
+
59
82
  const styles = StyleSheet.create({
60
83
  mainContainer: {
61
- flex: 1,
84
+ flex: 1
62
85
  },
63
86
  BackIcon: {
64
87
  paddingRight: 20,
@@ -93,14 +116,23 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
93
116
  const [productListLayout, setProductListLayout] = useState<any>(null)
94
117
  const [isCategoryClicked, setCategoryClicked] = useState(false)
95
118
  const [subcategoriesSelected, setSubcategoriesSelected] = useState([])
119
+ const [openService, setOpenService] = useState(false)
120
+ const [currentProduct, setCurrentProduct] = useState(null)
96
121
 
122
+ const isCheckoutMultiBusinessEnabled: Boolean = configs?.checkout_multi_business_enabled?.value === '1'
97
123
  const currentCart: any = Object.values(orderState.carts).find((cart: any) => cart?.business?.slug === business?.slug) ?? {}
98
-
124
+ const isOpenFiltProducts = isOpenSearchBar && !!searchValue
125
+ const filtProductsHeight = Platform.OS === 'ios' ? 0 : 35
99
126
  const onRedirect = (route: string, params?: any) => {
100
127
  navigation.navigate(route, params)
101
128
  }
102
129
 
103
130
  const onProductClick = (product: any) => {
131
+ if (product?.type === 'service' && professionalSelected) {
132
+ setCurrentProduct(product)
133
+ setOpenService(true)
134
+ return
135
+ }
104
136
  onRedirect('ProductDetails', {
105
137
  product: product,
106
138
  businessSlug: business.slug,
@@ -114,13 +146,19 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
114
146
  }
115
147
 
116
148
  const handleUpsellingPage = () => {
117
- onRedirect('CheckoutNavigator', {
118
- screen: 'CheckoutPage',
119
- cartUuid: currentCart?.uuid,
120
- businessLogo: logo,
121
- businessName: business?.name,
122
- cartTotal: currentCart?.total
123
- })
149
+ if (isCheckoutMultiBusinessEnabled) {
150
+ onRedirect('CheckoutNavigator', {
151
+ screen: 'MultiCheckout'
152
+ })
153
+ } else {
154
+ onRedirect('CheckoutNavigator', {
155
+ screen: 'CheckoutPage',
156
+ cartUuid: currentCart?.uuid,
157
+ businessLogo: logo,
158
+ businessName: business?.name,
159
+ cartTotal: currentCart?.total
160
+ })
161
+ }
124
162
  setOpenUpselling(false)
125
163
  }
126
164
 
@@ -165,106 +203,101 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
165
203
  navigation?.canGoBack() ? navigation.goBack() : navigation.navigate('BottomTab')
166
204
  }
167
205
 
206
+ const adjustBusiness = async (adjustBusinessId: number) => {
207
+ const _carts = orderState?.carts?.[adjustBusinessId]
208
+ const products = _carts?.products
209
+ const unavailableProducts = products.filter((product: any) => product.valid !== true)
210
+ const alreadyRemoved = await _retrieveStoreData('already-removed')
211
+ _removeStoreData('already-removed')
212
+ if (unavailableProducts.length > 0) {
213
+ multiRemoveProducts && await multiRemoveProducts(unavailableProducts, _carts)
214
+ return
215
+ }
216
+
217
+ if (alreadyRemoved === 'removed') {
218
+ setAlertState({ open: true, content: [t('NOT_AVAILABLE_PRODUCT', 'This product is not available.')] })
219
+ }
220
+ }
221
+
168
222
  const removeCartByReOrder = async () => {
169
- const removeCardId = await _retrieveStoreData('remove-cartId')
170
- if (currentCart && removeCardId) {
171
- clearCart(removeCardId)
172
- _removeStoreData('remove-cartId')
173
- showToast(ToastType.Info, t('PRODUCT_REMOVED', 'Products removed from cart'))
223
+ const adjustBusinessId = await _retrieveStoreData('adjust-cart-products')
224
+ if (currentCart && adjustBusinessId) {
225
+ _removeStoreData('adjust-cart-products')
226
+ adjustBusiness(adjustBusinessId)
174
227
  }
175
228
  }
176
229
 
177
230
  useEffect(() => {
178
231
  removeCartByReOrder()
179
- }, [])
232
+ }, [currentCart])
180
233
 
181
234
  return (
182
- <SafeAreaView
183
- style={{ flex: 1 }}
184
- >
185
- <Animated.View style={{ position: 'relative' }}>
186
- <TopHeader>
187
- {!isOpenSearchBar && (
188
- <>
189
- <View style={{ ...styles.headerItem, flex: 1 }}>
190
- <OButton
191
- imgLeftSrc={theme.images.general.arrow_left}
192
- imgRightSrc={null}
193
- style={styles.btnBackArrow}
194
- onClick={() => handleBackNavigation()}
195
- imgLeftStyle={{ tintColor: theme.colors.textNormal, width: 16 }}
196
- />
197
- </View>
198
- {!errorQuantityProducts && (
199
- <View style={{ ...styles.headerItem }}>
200
- <TouchableOpacity
201
- onPress={() => setIsOpenSearchBar(true)}
202
- style={styles.searchIcon}
203
- >
204
- <OIcon src={theme.images.general.search} color={theme.colors.textNormal} width={16} />
205
- </TouchableOpacity>
235
+ <>
236
+ <ContainerSafeAreaView
237
+ style={{ flex: 1 }}
238
+ isOpenFiltProducts={isOpenFiltProducts}
239
+ >
240
+ <Animated.View style={{ position: 'relative' }}>
241
+ <TopHeader isIos={Platform.OS === 'ios'}>
242
+ {!isOpenSearchBar && (
243
+ <>
244
+ <View style={{ ...styles.headerItem, flex: 1 }}>
245
+ <OButton
246
+ imgLeftSrc={theme.images.general.arrow_left}
247
+ imgRightSrc={null}
248
+ style={styles.btnBackArrow}
249
+ onClick={() => handleBackNavigation()}
250
+ imgLeftStyle={{ tintColor: theme.colors.textNormal, width: 30 }}
251
+ />
252
+
206
253
  </View>
207
- )}
208
- </>
209
- )}
210
- {isOpenSearchBar && (
211
- <WrapSearchBar>
212
- <SearchBar
213
- onSearch={handleChangeSearch}
214
- onCancel={() => handleCancel()}
215
- isCancelXButtonShow
216
- noBorderShow
217
- placeholder={t('SEARCH_PRODUCTS', 'Search Products')}
218
- lazyLoad={businessState?.business?.lazy_load_products_recommended}
254
+ {!errorQuantityProducts && (
255
+ <View style={{ ...styles.headerItem }}>
256
+ <TouchableOpacity
257
+ onPress={() => setIsOpenSearchBar(true)}
258
+ style={styles.searchIcon}
259
+ >
260
+ <OIcon src={theme.images.general.search} color={theme.colors.textNormal} width={16} />
261
+ </TouchableOpacity>
262
+ </View>
263
+ )}
264
+ </>
265
+ )}
266
+ {isOpenSearchBar && (
267
+ <WrapSearchBar>
268
+ <SearchBar
269
+ autoFocus
270
+ onSearch={handleChangeSearch}
271
+ onCancel={() => handleCancel()}
272
+ isCancelXButtonShow
273
+ noBorderShow
274
+ placeholder={t('SEARCH_PRODUCTS', 'Search Products')}
275
+ lazyLoad={businessState?.business?.lazy_load_products_recommended}
276
+ />
277
+ </WrapSearchBar>
278
+ )}
279
+ </TopHeader>
280
+ {!hideBusinessNearCity && businessState?.business?.city_id && (
281
+ <NearBusiness>
282
+ <BusinessesListing
283
+ logosLayout
284
+ propsToFetch={['id', 'logo', 'location', 'timezone', 'schedule', 'open', 'slug']}
285
+ cityId={businessState?.business?.city_id}
286
+ onBusinessClick={onBusinessClick}
287
+ actualSlug={businessState?.business?.slug}
219
288
  />
220
- </WrapSearchBar>
289
+ </NearBusiness>
221
290
  )}
222
- </TopHeader>
223
- </Animated.View>
224
- <BusinessProductsListingContainer
225
- stickyHeaderIndices={[2]}
226
- style={styles.mainContainer}
227
- ref={scrollViewRef}
228
- isActiveFloatingButtom={currentCart?.products?.length > 0 && categoryState.products.length !== 0}
229
- onScroll={handlePageScroll}
230
- onScrollBeginDrag={handleTouchDrag}
231
- scrollEventThrottle={16}
232
- >
233
- <BusinessBasicInformation
234
- navigation={navigation}
235
- businessState={businessState}
236
- openBusinessInformation={openBusinessInformation}
237
- header={header}
238
- logo={logo}
239
- isPreOrder={isPreOrder}
240
- />
241
- <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100 }} />
242
- {!loading && business?.id && (
243
- <>
244
- {!(business?.categories?.length === 0) && (
245
- <BusinessProductsCategories
246
- categories={[{ id: null, name: t('ALL', 'All') }, { id: 'featured', name: t('FEATURED', 'Featured') }, ...business?.categories.sort((a: any, b: any) => a.rank - b.rank)]}
247
- categorySelected={categorySelected}
248
- onClickCategory={handleChangeCategory}
249
- featured={featuredProducts}
250
- openBusinessInformation={openBusinessInformation}
251
- scrollViewRef={scrollViewRef}
252
- productListLayout={productListLayout}
253
- categoriesLayout={categoriesLayout}
254
- selectedCategoryId={selectedCategoryId}
255
- lazyLoadProductsRecommended={business?.lazy_load_products_recommended}
256
- setSelectedCategoryId={setSelectedCategoryId}
257
- setCategoryClicked={setCategoryClicked}
258
-
259
- />
260
- )}
261
- </>
262
- )}
263
- {!loading && business?.id && (
264
- <>
265
- <WrapContent
266
- onLayout={(event: any) => setProductListLayout(event.nativeEvent.layout)}
267
- >
291
+ </Animated.View>
292
+
293
+ {business?.categories?.length > 0 && isOpenFiltProducts && (
294
+ <FiltProductsContainer
295
+ isIos={Platform.OS === 'ios'}
296
+ style={{
297
+ height: Dimensions.get('window').height - filtProductsHeight
298
+ }}
299
+ >
300
+ <View style={{ padding: 20, backgroundColor: theme.colors.white }}>
268
301
  <BusinessProductsList
269
302
  categories={[
270
303
  { id: null, name: t('ALL', 'All') },
@@ -288,66 +321,196 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
288
321
  setCategoriesLayout={setCategoriesLayout}
289
322
  currentCart={currentCart}
290
323
  setSubcategoriesSelected={setSubcategoriesSelected}
324
+ onClickCategory={handleChangeCategory}
325
+ handleUpdateProducts={handleUpdateProducts}
326
+ isFiltMode
291
327
  />
292
- </WrapContent>
293
- </>
328
+ </View>
329
+ </FiltProductsContainer>
294
330
  )}
295
- {loading && !error && (
296
- <>
297
- <BusinessProductsCategories
298
- categories={[]}
299
- categorySelected={categorySelected}
300
- onClickCategory={handleChangeCategory}
301
- featured={featuredProducts}
302
- openBusinessInformation={openBusinessInformation}
303
- loading={loading}
304
- />
305
- <WrapContent>
306
- <BusinessProductsList
331
+ {isOpenFiltProducts && (
332
+ <BackgroundGray />
333
+ )}
334
+ <IOScrollView
335
+ stickyHeaderIndices={[2]}
336
+ style={{
337
+ ...styles.mainContainer,
338
+ marginBottom: currentCart?.products?.length > 0 && categoryState.products.length !== 0 ?
339
+ 50 : 0
340
+ }}
341
+ ref={scrollViewRef}
342
+ onScroll={handlePageScroll}
343
+ onScrollBeginDrag={handleTouchDrag}
344
+ scrollEventThrottle={16}
345
+ >
346
+ <BusinessBasicInformation
347
+ navigation={navigation}
348
+ businessState={businessState}
349
+ openBusinessInformation={openBusinessInformation}
350
+ header={header}
351
+ logo={logo}
352
+ isPreOrder={isPreOrder}
353
+ />
354
+ {business?.professionals?.length > 0 && (
355
+ <ProfessionalFilterWrapper>
356
+ <OText
357
+ size={16}
358
+ style={{ marginBottom: 16 }}
359
+ weight={Platform.OS === 'ios' ? '600' : 'bold'}
360
+ >
361
+ {t('PROFESSIONALS', 'Professionals')}
362
+ </OText>
363
+ <ProfessionalFilter
364
+ professionals={business?.professionals}
365
+ professionalSelected={professionalSelected}
366
+ handleChangeProfessionalSelected={handleChangeProfessionalSelected}
367
+ />
368
+ </ProfessionalFilterWrapper>
369
+ )}
370
+ <View
371
+ style={{
372
+ height: 8,
373
+ backgroundColor: theme.colors.backgroundGray100,
374
+ marginTop: isChewLayout && showLogo ? 10 : 0
375
+ }}
376
+ />
377
+ {!loading && business?.id && (
378
+ <>
379
+ {!(business?.categories?.length === 0) && (
380
+ <BusinessProductsCategories
381
+ categories={[{ id: null, name: t('ALL', 'All') }, { id: 'featured', name: t('FEATURED', 'Featured') }, ...business?.categories.sort((a: any, b: any) => a.rank - b.rank)]}
382
+ categorySelected={categorySelected}
383
+ onClickCategory={handleChangeCategory}
384
+ featured={featuredProducts}
385
+ openBusinessInformation={openBusinessInformation}
386
+ scrollViewRef={scrollViewRef}
387
+ productListLayout={productListLayout}
388
+ categoriesLayout={categoriesLayout}
389
+ selectedCategoryId={selectedCategoryId}
390
+ lazyLoadProductsRecommended={business?.lazy_load_products_recommended}
391
+ setSelectedCategoryId={setSelectedCategoryId}
392
+ setCategoryClicked={setCategoryClicked}
393
+
394
+ />
395
+ )}
396
+ </>
397
+ )}
398
+ {!loading && business?.id && (
399
+ <>
400
+ <WrapContent
401
+ onLayout={(event: any) => setProductListLayout(event.nativeEvent.layout)}
402
+ >
403
+ <BusinessProductsList
404
+ categories={[
405
+ { id: null, name: t('ALL', 'All') },
406
+ { id: 'featured', name: t('FEATURED', 'Featured') },
407
+ ...business?.categories.sort((a: any, b: any) => a.rank - b.rank)
408
+ ]}
409
+ category={categorySelected}
410
+ categoryState={categoryState}
411
+ businessId={business.id}
412
+ errors={errors}
413
+ onProductClick={onProductClick}
414
+ handleSearchRedirect={handleSearchRedirect}
415
+ featured={featuredProducts}
416
+ searchValue={searchValue}
417
+ handleClearSearch={handleChangeSearch}
418
+ errorQuantityProducts={errorQuantityProducts}
419
+ handleCancelSearch={handleCancel}
420
+ categoriesLayout={categoriesLayout}
421
+ subcategoriesSelected={subcategoriesSelected}
422
+ lazyLoadProductsRecommended={business?.lazy_load_products_recommended}
423
+ setCategoriesLayout={setCategoriesLayout}
424
+ currentCart={currentCart}
425
+ setSubcategoriesSelected={setSubcategoriesSelected}
426
+ onClickCategory={handleChangeCategory}
427
+ handleUpdateProducts={handleUpdateProducts}
428
+ />
429
+ </WrapContent>
430
+ </>
431
+ )}
432
+ {loading && !error && (
433
+ <>
434
+ <BusinessProductsCategories
307
435
  categories={[]}
308
- category={categorySelected}
309
- categoryState={categoryState}
310
- isBusinessLoading={loading}
311
- errorQuantityProducts={errorQuantityProducts}
436
+ categorySelected={categorySelected}
437
+ onClickCategory={handleChangeCategory}
438
+ featured={featuredProducts}
439
+ openBusinessInformation={openBusinessInformation}
440
+ loading={loading}
312
441
  />
313
- </WrapContent>
314
- </>
442
+ <WrapContent>
443
+ <BusinessProductsList
444
+ categories={[]}
445
+ category={categorySelected}
446
+ categoryState={categoryState}
447
+ isBusinessLoading={loading}
448
+ errorQuantityProducts={errorQuantityProducts}
449
+ handleUpdateProducts={handleUpdateProducts}
450
+ />
451
+ </WrapContent>
452
+ </>
453
+ )}
454
+ </IOScrollView>
455
+ {!loading && auth && currentCart?.products?.length > 0 && categoryState.products.length !== 0 && (
456
+ <FloatingButton
457
+ btnText={
458
+ openUpselling
459
+ ? t('LOADING', 'Loading')
460
+ : currentCart?.subtotal >= currentCart?.minimum
461
+ ? t('VIEW_ORDER', 'View Order')
462
+ : `${t('MINIMUN_SUBTOTAL_ORDER', 'Minimum subtotal order:')} ${parsePrice(currentCart?.minimum)}`
463
+ }
464
+ isSecondaryBtn={currentCart?.subtotal < currentCart?.minimum || openUpselling}
465
+ btnLeftValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
466
+ btnRightValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
467
+ btnLeftValue={currentCart?.products.reduce((prev: number, product: any) => prev + product.quantity, 0)}
468
+ btnRightValue={parsePrice(currentCart?.total)}
469
+ disabled={currentCart?.subtotal < currentCart?.minimum || openUpselling}
470
+ handleClick={() => setOpenUpselling(true)}
471
+ />
315
472
  )}
316
- </BusinessProductsListingContainer>
317
- {!loading && auth && currentCart?.products?.length > 0 && categoryState.products.length !== 0 && (
318
- <FloatingButton
319
- btnText={
320
- openUpselling
321
- ? t('LOADING', 'Loading')
322
- : currentCart?.subtotal >= currentCart?.minimum
323
- ? t('VIEW_ORDER', 'View Order')
324
- : `${t('MINIMUN_SUBTOTAL_ORDER', 'Minimum subtotal order:')} ${parsePrice(currentCart?.minimum)}`
325
- }
326
- isSecondaryBtn={currentCart?.subtotal < currentCart?.minimum || openUpselling}
327
- btnLeftValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
328
- btnRightValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
329
- btnLeftValue={currentCart?.products?.length}
330
- btnRightValue={parsePrice(currentCart?.total)}
331
- disabled={currentCart?.subtotal < currentCart?.minimum || openUpselling}
332
- handleClick={() => setOpenUpselling(true)}
473
+ {openUpselling && (
474
+ <UpsellingRedirect
475
+ businessId={currentCart?.business_id}
476
+ business={currentCart?.business}
477
+ cartProducts={currentCart?.products}
478
+ cart={currentCart}
479
+ setOpenUpselling={setOpenUpselling}
480
+ handleUpsellingPage={handleUpsellingPage}
481
+ handleCloseUpsellingPage={handleCloseUpsellingPage}
482
+ openUpselling={openUpselling}
483
+ canOpenUpselling={canOpenUpselling}
484
+ setCanOpenUpselling={setCanOpenUpselling}
485
+ onRedirect={onRedirect}
486
+ />
487
+ )}
488
+ <Alert
489
+ open={alertState?.open || false}
490
+ title=''
491
+ content={[t('NOT_AVAILABLE_PRODUCTS', 'These products are not available.')]}
492
+ onAccept={() => setAlertState({ open: false, content: [] })}
493
+ onClose={() => setAlertState({ open: false, content: [] })}
333
494
  />
334
- )}
335
- {openUpselling && (
336
- <UpsellingRedirect
337
- businessId={currentCart?.business_id}
338
- business={currentCart?.business}
339
- cartProducts={currentCart?.products}
340
- cart={currentCart}
341
- setOpenUpselling={setOpenUpselling}
342
- handleUpsellingPage={handleUpsellingPage}
343
- handleCloseUpsellingPage={handleCloseUpsellingPage}
344
- openUpselling={openUpselling}
345
- canOpenUpselling={canOpenUpselling}
346
- setCanOpenUpselling={setCanOpenUpselling}
347
- onRedirect={onRedirect}
495
+ </ContainerSafeAreaView>
496
+ <OModal
497
+ open={openService}
498
+ onClose={() => setOpenService(false)}
499
+ entireModal
500
+ >
501
+ <ServiceForm
502
+ navigation={navigation}
503
+ product={currentProduct}
504
+ businessSlug={business.slug}
505
+ businessId={business.id}
506
+ professionalList={business?.professionals}
507
+ professionalSelected={professionalSelected}
508
+ handleChangeProfessional={handleChangeProfessionalSelected}
509
+ onSave={() => setOpenService(false)}
510
+ onClose={() => setOpenService(false)}
348
511
  />
349
- )}
350
- </SafeAreaView>
512
+ </OModal>
513
+ </>
351
514
  )
352
515
  }
353
516
 
@@ -1,5 +1,8 @@
1
1
  import styled, { css } from 'styled-components/native'
2
2
 
3
+ export const ContainerSafeAreaView = styled.SafeAreaView`
4
+ `
5
+
3
6
  export const WrapHeader = styled.View`
4
7
  position: relative;
5
8
  `
@@ -11,6 +14,7 @@ export const TopHeader = styled.View`
11
14
  z-index: 1;
12
15
  height: 60px;
13
16
  min-height: 60px;
17
+ margin-top: ${(props : any) => props.isIos ? '0' : '40px'};
14
18
  `
15
19
  export const AddressInput = styled.TouchableOpacity`
16
20
  flex: 1;
@@ -33,3 +37,31 @@ export const BusinessProductsListingContainer = styled.ScrollView`
33
37
  margin-bottom: 50px;
34
38
  `}
35
39
  `
40
+
41
+ export const FiltProductsContainer = styled.ScrollView`
42
+ position: absolute;
43
+ width: 100%;
44
+ z-index: 2000;
45
+ top: ${(props : any) => props.isIos ? '40px': '80px'};
46
+ margin-top: 20px;
47
+ `
48
+
49
+ export const BackgroundGray = styled.View`
50
+ flex: 1;
51
+ height: 100%;
52
+ background-color: rgba(0,0,0,0.5);
53
+ position: absolute;
54
+ margin-top: 100px;
55
+ z-index: 100;
56
+ width: 100%;
57
+ `
58
+
59
+ export const ProfessionalFilterWrapper = styled.View`
60
+ padding-left: 40px;
61
+ margin-bottom: 35px;
62
+ `
63
+
64
+ export const NearBusiness = styled.View`
65
+ width: 100%;
66
+ padding-left: 20px;
67
+ `
@@ -1,4 +1,4 @@
1
- import React, { useState } from 'react';
1
+ import React, { useEffect, useState } from 'react';
2
2
  import {
3
3
  BusinessReviews as BusinessReviewController,
4
4
  useLanguage,
@@ -22,6 +22,7 @@ import {
22
22
  import { BusinessReviewsParams } from '../../types';
23
23
  import { ProgressBar, TouchableRipple } from 'react-native-paper';
24
24
  import moment from 'moment';
25
+ import { setLocalMoment } from '../../utils';
25
26
 
26
27
  const BusinessReviewsUI = (props: BusinessReviewsParams) => {
27
28
  const { businessState, reviewsList } = props;
@@ -99,6 +100,10 @@ const BusinessReviewsUI = (props: BusinessReviewsParams) => {
99
100
  </View>
100
101
  );
101
102
 
103
+ useEffect(() => {
104
+ setLocalMoment(moment, t)
105
+ }, [])
106
+
102
107
  return (
103
108
  <BusinessReviewsContainer>
104
109
  <BusinessReviewContent