ordering-ui-react-native 0.15.61 → 0.15.63-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 (210) 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 +1 -2
  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 +7 -12
  94. package/themes/original/src/components/BusinessBasicInformation/index.tsx +137 -46
  95. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +4 -0
  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 +52 -53
  106. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  107. package/themes/original/src/components/BusinessProductsListing/index.tsx +291 -155
  108. package/themes/original/src/components/BusinessProductsListing/styles.tsx +27 -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/Layout/Appointment/styles.tsx +107 -0
  114. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +559 -0
  115. package/themes/original/src/components/BusinessesListing/{styles.tsx → Layout/Original/styles.tsx} +11 -3
  116. package/themes/original/src/components/BusinessesListing/index.tsx +99 -458
  117. package/themes/original/src/components/Cart/index.tsx +62 -43
  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/MomentOption/index.tsx +10 -1
  137. package/themes/original/src/components/MomentOption/styles.tsx +1 -1
  138. package/themes/original/src/components/MomentSelector/index.tsx +197 -0
  139. package/themes/original/src/components/MomentSelector/styles.tsx +6 -0
  140. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +243 -0
  141. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/styles.tsx +46 -0
  142. package/themes/original/src/components/MultiCheckout/index.tsx +298 -0
  143. package/themes/original/src/components/MultiCheckout/styles.tsx +59 -0
  144. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +372 -0
  145. package/themes/original/src/components/MultiOrdersDetails/index.tsx +258 -0
  146. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +50 -0
  147. package/themes/original/src/components/MyOrders/index.tsx +120 -32
  148. package/themes/original/src/components/MyOrders/styles.tsx +8 -1
  149. package/themes/original/src/components/NavBar/index.tsx +4 -4
  150. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +167 -0
  151. package/themes/original/src/components/OrderDetails/index.tsx +151 -65
  152. package/themes/original/src/components/OrderDetails/styles.tsx +1 -2
  153. package/themes/original/src/components/OrderSummary/index.tsx +6 -6
  154. package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -2
  155. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +153 -0
  156. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +6 -0
  157. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +53 -0
  158. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +6 -0
  159. package/themes/original/src/components/OrdersOption/index.tsx +137 -38
  160. package/themes/original/src/components/OrdersOption/styles.tsx +4 -1
  161. package/themes/original/src/components/PaymentOptionCash/index.tsx +2 -2
  162. package/themes/original/src/components/PaymentOptionWallet/index.tsx +17 -23
  163. package/themes/original/src/components/PaymentOptionWallet/styles.tsx +1 -1
  164. package/themes/original/src/components/PaymentOptions/index.tsx +58 -37
  165. package/themes/original/src/components/PhoneInputNumber/index.tsx +5 -11
  166. package/themes/original/src/components/PreviousOrders/index.tsx +18 -147
  167. package/themes/original/src/components/ProductForm/index.tsx +718 -679
  168. package/themes/original/src/components/ProductForm/styles.tsx +6 -2
  169. package/themes/original/src/components/ProductItemAccordion/index.tsx +2 -2
  170. package/themes/original/src/components/ProductOption/index.tsx +1 -1
  171. package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -12
  172. package/themes/original/src/components/ProfessionalFilter/index.tsx +128 -0
  173. package/themes/original/src/components/ProfessionalFilter/styles.tsx +0 -0
  174. package/themes/original/src/components/ProfessionalProfile/index.tsx +298 -0
  175. package/themes/original/src/components/ProfessionalProfile/styles.tsx +46 -0
  176. package/themes/original/src/components/Promotions/index.tsx +151 -133
  177. package/themes/original/src/components/Promotions/styles.tsx +3 -23
  178. package/themes/original/src/components/ReviewDriver/index.tsx +6 -6
  179. package/themes/original/src/components/ReviewOrder/index.tsx +1 -1
  180. package/themes/original/src/components/ReviewTrigger/index.tsx +118 -0
  181. package/themes/original/src/components/ReviewTrigger/styles.tsx +34 -0
  182. package/themes/original/src/components/SearchBar/index.tsx +13 -5
  183. package/themes/original/src/components/ServiceForm/index.tsx +579 -0
  184. package/themes/original/src/components/ServiceForm/styles.tsx +50 -0
  185. package/themes/original/src/components/Sessions/index.tsx +160 -0
  186. package/themes/original/src/components/Sessions/styles.tsx +15 -0
  187. package/themes/original/src/components/SignupForm/index.tsx +237 -126
  188. package/themes/original/src/components/SingleOrderCard/index.tsx +275 -0
  189. package/themes/original/src/components/SingleOrderCard/styles.tsx +54 -0
  190. package/themes/original/src/components/SingleProductCard/index.tsx +150 -84
  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 +52 -5
  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/OInput.tsx +3 -2
  205. package/themes/original/src/components/shared/OModal.tsx +4 -2
  206. package/themes/original/src/layouts/FloatingBottomContainer.tsx +5 -1
  207. package/themes/original/src/types/index.tsx +186 -35
  208. package/themes/original/src/utils/index.tsx +96 -2
  209. package/themes/single-business/src/components/OrderTypeSelector/index.tsx +1 -1
  210. 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,
@@ -12,6 +13,7 @@ import {
12
13
  useConfig
13
14
  } from 'ordering-components/native'
14
15
  import { OButton, OIcon, OModal, OText } from '../shared'
16
+ import Alert from '../../providers/AlertProvider'
15
17
  import { BusinessBasicInformation } from '../BusinessBasicInformation'
16
18
  import { SearchBar } from '../SearchBar'
17
19
  import { BusinessProductsCategories } from '../BusinessProductsCategories'
@@ -22,13 +24,18 @@ import {
22
24
  TopHeader,
23
25
  WrapSearchBar,
24
26
  WrapContent,
25
- BusinessProductsListingContainer
27
+ FiltProductsContainer,
28
+ ContainerSafeAreaView,
29
+ BackgroundGray,
30
+ ProfessionalFilterWrapper
26
31
  } from './styles'
27
32
  import { FloatingButton } from '../FloatingButton'
28
33
  import { UpsellingRedirect } from './UpsellingRedirect'
29
34
  import Animated from 'react-native-reanimated'
35
+ import { ProfessionalFilter } from '../ProfessionalFilter';
36
+ import { ServiceForm } from '../ServiceForm';
30
37
 
31
- const PIXELS_TO_SCROLL = 1000
38
+ const PIXELS_TO_SCROLL = 2000
32
39
 
33
40
  const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
34
41
  const {
@@ -45,7 +52,13 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
45
52
  errorQuantityProducts,
46
53
  header,
47
54
  logo,
55
+ alertState,
56
+ setAlertState,
57
+ multiRemoveProducts,
48
58
  getNextProducts,
59
+ handleUpdateProducts,
60
+ professionalSelected,
61
+ handleChangeProfessionalSelected
49
62
  } = props
50
63
 
51
64
  const theme = useTheme();
@@ -58,7 +71,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
58
71
  const isPreOrder = configs?.preorder_status_enabled?.value === '1'
59
72
  const styles = StyleSheet.create({
60
73
  mainContainer: {
61
- flex: 1,
74
+ flex: 1
62
75
  },
63
76
  BackIcon: {
64
77
  paddingRight: 20,
@@ -93,14 +106,23 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
93
106
  const [productListLayout, setProductListLayout] = useState<any>(null)
94
107
  const [isCategoryClicked, setCategoryClicked] = useState(false)
95
108
  const [subcategoriesSelected, setSubcategoriesSelected] = useState([])
109
+ const [openService, setOpenService] = useState(false)
110
+ const [currentProduct, setCurrentProduct] = useState(null)
96
111
 
112
+ const isCheckoutMultiBusinessEnabled: Boolean = configs?.checkout_multi_business_enabled?.value === '1'
97
113
  const currentCart: any = Object.values(orderState.carts).find((cart: any) => cart?.business?.slug === business?.slug) ?? {}
98
-
114
+ const isOpenFiltProducts = isOpenSearchBar && !!searchValue
115
+ const filtProductsHeight = Platform.OS === 'ios' ? 0 : 35
99
116
  const onRedirect = (route: string, params?: any) => {
100
117
  navigation.navigate(route, params)
101
118
  }
102
119
 
103
120
  const onProductClick = (product: any) => {
121
+ if (product?.type === 'service' && professionalSelected) {
122
+ setCurrentProduct(product)
123
+ setOpenService(true)
124
+ return
125
+ }
104
126
  onRedirect('ProductDetails', {
105
127
  product: product,
106
128
  businessSlug: business.slug,
@@ -114,13 +136,19 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
114
136
  }
115
137
 
116
138
  const handleUpsellingPage = () => {
117
- onRedirect('CheckoutNavigator', {
118
- screen: 'CheckoutPage',
119
- cartUuid: currentCart?.uuid,
120
- businessLogo: logo,
121
- businessName: business?.name,
122
- cartTotal: currentCart?.total
123
- })
139
+ if (isCheckoutMultiBusinessEnabled) {
140
+ onRedirect('CheckoutNavigator', {
141
+ screen: 'MultiCheckout'
142
+ })
143
+ } else {
144
+ onRedirect('CheckoutNavigator', {
145
+ screen: 'CheckoutPage',
146
+ cartUuid: currentCart?.uuid,
147
+ businessLogo: logo,
148
+ businessName: business?.name,
149
+ cartTotal: currentCart?.total
150
+ })
151
+ }
124
152
  setOpenUpselling(false)
125
153
  }
126
154
 
@@ -165,106 +193,89 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
165
193
  navigation?.canGoBack() ? navigation.goBack() : navigation.navigate('BottomTab')
166
194
  }
167
195
 
196
+ const adjustBusiness = async (adjustBusinessId: number) => {
197
+ const _carts = orderState?.carts?.[adjustBusinessId]
198
+ const products = _carts?.products
199
+ const unavailableProducts = products.filter((product: any) => product.valid !== true)
200
+ const alreadyRemoved = await _retrieveStoreData('already-removed')
201
+ _removeStoreData('already-removed')
202
+ if (unavailableProducts.length > 0) {
203
+ multiRemoveProducts && await multiRemoveProducts(unavailableProducts, _carts)
204
+ return
205
+ }
206
+
207
+ if (alreadyRemoved === 'removed') {
208
+ setAlertState({ open: true, content: [t('NOT_AVAILABLE_PRODUCT', 'This product is not available.')] })
209
+ }
210
+ }
211
+
168
212
  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'))
213
+ const adjustBusinessId = await _retrieveStoreData('adjust-cart-products')
214
+ if (currentCart && adjustBusinessId) {
215
+ _removeStoreData('adjust-cart-products')
216
+ adjustBusiness(adjustBusinessId)
174
217
  }
175
218
  }
176
219
 
177
220
  useEffect(() => {
178
221
  removeCartByReOrder()
179
- }, [])
222
+ }, [currentCart])
180
223
 
181
224
  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>
206
- </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}
219
- />
220
- </WrapSearchBar>
221
- )}
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}
225
+ <>
226
+ <ContainerSafeAreaView
227
+ style={{ flex: 1 }}
228
+ isOpenFiltProducts={isOpenFiltProducts}
232
229
  >
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
- />
230
+ <Animated.View style={{ position: 'relative' }}>
231
+ <TopHeader isIos={Platform.OS === 'ios'}>
232
+ {!isOpenSearchBar && (
233
+ <>
234
+ <View style={{ ...styles.headerItem, flex: 1 }}>
235
+ <OButton
236
+ imgLeftSrc={theme.images.general.arrow_left}
237
+ imgRightSrc={null}
238
+ style={styles.btnBackArrow}
239
+ onClick={() => handleBackNavigation()}
240
+ imgLeftStyle={{ tintColor: theme.colors.textNormal, width: 30 }}
241
+ />
242
+ </View>
243
+ {!errorQuantityProducts && (
244
+ <View style={{ ...styles.headerItem }}>
245
+ <TouchableOpacity
246
+ onPress={() => setIsOpenSearchBar(true)}
247
+ style={styles.searchIcon}
248
+ >
249
+ <OIcon src={theme.images.general.search} color={theme.colors.textNormal} width={16} />
250
+ </TouchableOpacity>
251
+ </View>
252
+ )}
253
+ </>
260
254
  )}
261
- </>
262
- )}
263
- {!loading && business?.id && (
264
- <>
265
- <WrapContent
266
- onLayout={(event: any) => setProductListLayout(event.nativeEvent.layout)}
267
- >
255
+ {isOpenSearchBar && (
256
+ <WrapSearchBar>
257
+ <SearchBar
258
+ autoFocus
259
+ onSearch={handleChangeSearch}
260
+ onCancel={() => handleCancel()}
261
+ isCancelXButtonShow
262
+ noBorderShow
263
+ placeholder={t('SEARCH_PRODUCTS', 'Search Products')}
264
+ lazyLoad={businessState?.business?.lazy_load_products_recommended}
265
+ />
266
+ </WrapSearchBar>
267
+ )}
268
+ </TopHeader>
269
+ </Animated.View>
270
+
271
+ {business?.categories?.length > 0 && isOpenFiltProducts && (
272
+ <FiltProductsContainer
273
+ isIos={Platform.OS === 'ios'}
274
+ style={{
275
+ height: Dimensions.get('window').height - filtProductsHeight
276
+ }}
277
+ >
278
+ <View style={{ padding: 20, backgroundColor: theme.colors.white }}>
268
279
  <BusinessProductsList
269
280
  categories={[
270
281
  { id: null, name: t('ALL', 'All') },
@@ -288,66 +299,191 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
288
299
  setCategoriesLayout={setCategoriesLayout}
289
300
  currentCart={currentCart}
290
301
  setSubcategoriesSelected={setSubcategoriesSelected}
302
+ onClickCategory={handleChangeCategory}
303
+ handleUpdateProducts={handleUpdateProducts}
304
+ isFiltMode
291
305
  />
292
- </WrapContent>
293
- </>
306
+ </View>
307
+ </FiltProductsContainer>
294
308
  )}
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
309
+ {isOpenFiltProducts && (
310
+ <BackgroundGray />
311
+ )}
312
+ <IOScrollView
313
+ stickyHeaderIndices={[2]}
314
+ style={{
315
+ ...styles.mainContainer,
316
+ marginBottom: currentCart?.products?.length > 0 && categoryState.products.length !== 0 ?
317
+ 50 : 0
318
+ }}
319
+ ref={scrollViewRef}
320
+ onScroll={handlePageScroll}
321
+ onScrollBeginDrag={handleTouchDrag}
322
+ scrollEventThrottle={16}
323
+ >
324
+ <BusinessBasicInformation
325
+ navigation={navigation}
326
+ businessState={businessState}
327
+ openBusinessInformation={openBusinessInformation}
328
+ header={header}
329
+ logo={logo}
330
+ isPreOrder={isPreOrder}
331
+ />
332
+ {business?.professionals?.length > 0 && (
333
+ <ProfessionalFilterWrapper>
334
+ <OText
335
+ size={16}
336
+ style={{ marginBottom: 16 }}
337
+ weight={Platform.OS === 'ios' ? '600' : 'bold'}
338
+ >
339
+ {t('PROFESSIONALS', 'Professionals')}
340
+ </OText>
341
+ <ProfessionalFilter
342
+ professionals={business?.professionals}
343
+ professionalSelected={professionalSelected}
344
+ handleChangeProfessionalSelected={handleChangeProfessionalSelected}
345
+ />
346
+ </ProfessionalFilterWrapper>
347
+ )}
348
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100 }} />
349
+ {!loading && business?.id && (
350
+ <>
351
+ {!(business?.categories?.length === 0) && (
352
+ <BusinessProductsCategories
353
+ categories={[{ id: null, name: t('ALL', 'All') }, { id: 'featured', name: t('FEATURED', 'Featured') }, ...business?.categories.sort((a: any, b: any) => a.rank - b.rank)]}
354
+ categorySelected={categorySelected}
355
+ onClickCategory={handleChangeCategory}
356
+ featured={featuredProducts}
357
+ openBusinessInformation={openBusinessInformation}
358
+ scrollViewRef={scrollViewRef}
359
+ productListLayout={productListLayout}
360
+ categoriesLayout={categoriesLayout}
361
+ selectedCategoryId={selectedCategoryId}
362
+ lazyLoadProductsRecommended={business?.lazy_load_products_recommended}
363
+ setSelectedCategoryId={setSelectedCategoryId}
364
+ setCategoryClicked={setCategoryClicked}
365
+
366
+ />
367
+ )}
368
+ </>
369
+ )}
370
+ {!loading && business?.id && (
371
+ <IOScrollView rootMargin={{ top: 0, bottom: 0 }}>
372
+ <WrapContent
373
+ onLayout={(event: any) => setProductListLayout(event.nativeEvent.layout)}
374
+ >
375
+ <BusinessProductsList
376
+ categories={[
377
+ { id: null, name: t('ALL', 'All') },
378
+ { id: 'featured', name: t('FEATURED', 'Featured') },
379
+ ...business?.categories.sort((a: any, b: any) => a.rank - b.rank)
380
+ ]}
381
+ category={categorySelected}
382
+ categoryState={categoryState}
383
+ businessId={business.id}
384
+ errors={errors}
385
+ onProductClick={onProductClick}
386
+ handleSearchRedirect={handleSearchRedirect}
387
+ featured={featuredProducts}
388
+ searchValue={searchValue}
389
+ handleClearSearch={handleChangeSearch}
390
+ errorQuantityProducts={errorQuantityProducts}
391
+ handleCancelSearch={handleCancel}
392
+ categoriesLayout={categoriesLayout}
393
+ subcategoriesSelected={subcategoriesSelected}
394
+ lazyLoadProductsRecommended={business?.lazy_load_products_recommended}
395
+ setCategoriesLayout={setCategoriesLayout}
396
+ currentCart={currentCart}
397
+ setSubcategoriesSelected={setSubcategoriesSelected}
398
+ onClickCategory={handleChangeCategory}
399
+ handleUpdateProducts={handleUpdateProducts}
400
+ />
401
+ </WrapContent>
402
+ </IOScrollView>
403
+ )}
404
+ {loading && !error && (
405
+ <>
406
+ <BusinessProductsCategories
307
407
  categories={[]}
308
- category={categorySelected}
309
- categoryState={categoryState}
310
- isBusinessLoading={loading}
311
- errorQuantityProducts={errorQuantityProducts}
408
+ categorySelected={categorySelected}
409
+ onClickCategory={handleChangeCategory}
410
+ featured={featuredProducts}
411
+ openBusinessInformation={openBusinessInformation}
412
+ loading={loading}
312
413
  />
313
- </WrapContent>
314
- </>
414
+ <WrapContent>
415
+ <BusinessProductsList
416
+ categories={[]}
417
+ category={categorySelected}
418
+ categoryState={categoryState}
419
+ isBusinessLoading={loading}
420
+ errorQuantityProducts={errorQuantityProducts}
421
+ handleUpdateProducts={handleUpdateProducts}
422
+ />
423
+ </WrapContent>
424
+ </>
425
+ )}
426
+ </BusinessProductsListingContainer>
427
+
428
+ {!loading && auth && currentCart?.products?.length > 0 && categoryState.products.length !== 0 && (
429
+ <FloatingButton
430
+ btnText={
431
+ openUpselling
432
+ ? t('LOADING', 'Loading')
433
+ : currentCart?.subtotal >= currentCart?.minimum
434
+ ? t('VIEW_ORDER', 'View Order')
435
+ : `${t('MINIMUN_SUBTOTAL_ORDER', 'Minimum subtotal order:')} ${parsePrice(currentCart?.minimum)}`
436
+ }
437
+ isSecondaryBtn={currentCart?.subtotal < currentCart?.minimum || openUpselling}
438
+ btnLeftValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
439
+ btnRightValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
440
+ btnLeftValue={currentCart?.products.reduce((prev: number, product: any) => prev + product.quantity, 0)}
441
+ btnRightValue={parsePrice(currentCart?.total)}
442
+ disabled={currentCart?.subtotal < currentCart?.minimum || openUpselling}
443
+ handleClick={() => setOpenUpselling(true)}
444
+ />
315
445
  )}
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)}
446
+ {openUpselling && (
447
+ <UpsellingRedirect
448
+ businessId={currentCart?.business_id}
449
+ business={currentCart?.business}
450
+ cartProducts={currentCart?.products}
451
+ cart={currentCart}
452
+ setOpenUpselling={setOpenUpselling}
453
+ handleUpsellingPage={handleUpsellingPage}
454
+ handleCloseUpsellingPage={handleCloseUpsellingPage}
455
+ openUpselling={openUpselling}
456
+ canOpenUpselling={canOpenUpselling}
457
+ setCanOpenUpselling={setCanOpenUpselling}
458
+ onRedirect={onRedirect}
459
+ />
460
+ )}
461
+ <Alert
462
+ open={alertState?.open || false}
463
+ title=''
464
+ content={[t('NOT_AVAILABLE_PRODUCTS', 'These products are not available.')]}
465
+ onAccept={() => setAlertState({ open: false, content: [] })}
466
+ onClose={() => setAlertState({ open: false, content: [] })}
333
467
  />
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}
468
+ </ContainerSafeAreaView>
469
+ <OModal
470
+ open={openService}
471
+ onClose={() => setOpenService(false)}
472
+ entireModal
473
+ >
474
+ <ServiceForm
475
+ navigation={navigation}
476
+ product={currentProduct}
477
+ businessSlug={business.slug}
478
+ businessId={business.id}
479
+ professionalList={business?.professionals}
480
+ professionalSelected={professionalSelected}
481
+ handleChangeProfessional={handleChangeProfessionalSelected}
482
+ onSave={() => setOpenService(false)}
483
+ onClose={() => setOpenService(false)}
348
484
  />
349
- )}
350
- </SafeAreaView>
485
+ </OModal>
486
+ </>
351
487
  )
352
488
  }
353
489
 
@@ -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,26 @@ 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
+ `
@@ -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