ordering-ui-react-native 0.16.33 → 0.16.34-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 (199) hide show
  1. package/package.json +7 -5
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/ActiveOrders/index.tsx +61 -63
  4. package/src/components/ActiveOrders/styles.tsx +8 -14
  5. package/src/components/BusinessBasicInformation/index.tsx +11 -19
  6. package/src/components/BusinessInformation/index.tsx +33 -4
  7. package/src/components/BusinessInformation/styles.tsx +2 -2
  8. package/src/components/BusinessProductsList/index.tsx +10 -10
  9. package/src/components/BusinessesListing/index.tsx +1 -1
  10. package/src/components/Checkout/index.tsx +2 -1
  11. package/src/components/LanguageSelector/index.tsx +21 -16
  12. package/src/components/LoginForm/index.tsx +15 -0
  13. package/src/components/Messages/index.tsx +2 -2
  14. package/src/components/NotificationSetting/index.tsx +85 -0
  15. package/src/components/OrderDetails/index.tsx +2 -20
  16. package/src/components/OrdersOption/index.tsx +54 -56
  17. package/src/components/PaymentOptions/index.tsx +335 -365
  18. package/src/components/PaymentOptionsWebView/index.tsx +120 -121
  19. package/src/components/ReviewDriver/index.tsx +1 -1
  20. package/src/components/ReviewOrder/index.tsx +2 -1
  21. package/src/components/ReviewProducts/index.tsx +11 -0
  22. package/src/components/SignupForm/index.tsx +15 -0
  23. package/src/components/SingleProductReview/index.tsx +8 -5
  24. package/src/components/StripeElementsForm/index.tsx +25 -16
  25. package/src/components/VerifyPhone/styles.tsx +1 -2
  26. package/src/components/shared/OBottomPopup.tsx +6 -2
  27. package/src/index.tsx +2 -0
  28. package/src/pages/BusinessesListing.tsx +7 -6
  29. package/src/pages/OrderDetails.tsx +1 -1
  30. package/src/pages/ReviewDriver.tsx +2 -2
  31. package/src/pages/ReviewOrder.tsx +2 -2
  32. package/src/types/@fatnlazycat/react-native-recaptcha-v3/index.d.ts +1 -0
  33. package/src/utils/index.tsx +2 -1
  34. package/themes/business/index.tsx +4 -0
  35. package/themes/business/src/components/BusinessController/index.tsx +2 -2
  36. package/themes/business/src/components/Chat/index.tsx +38 -30
  37. package/themes/business/src/components/DriverMap/index.tsx +7 -5
  38. package/themes/business/src/components/DriverSchedule/index.tsx +71 -0
  39. package/themes/business/src/components/DriverSchedule/styles.tsx +6 -0
  40. package/themes/business/src/components/LoginForm/index.tsx +111 -74
  41. package/themes/business/src/components/MapView/index.tsx +12 -1
  42. package/themes/business/src/components/MessagesOption/index.tsx +11 -1
  43. package/themes/business/src/components/NewOrderNotification/index.tsx +26 -41
  44. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  45. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +25 -19
  46. package/themes/business/src/components/OrdersListManager/index.tsx +10 -3
  47. package/themes/business/src/components/OrdersOption/index.tsx +65 -21
  48. package/themes/business/src/components/OrdersOption/styles.tsx +5 -1
  49. package/themes/business/src/components/OrdersOptionBusiness/index.tsx +15 -1
  50. package/themes/business/src/components/OrdersOptionCity/index.tsx +15 -1
  51. package/themes/business/src/components/OrdersOptionDate/index.tsx +19 -6
  52. package/themes/business/src/components/OrdersOptionDelivery/index.tsx +15 -1
  53. package/themes/business/src/components/OrdersOptionDriver/index.tsx +15 -1
  54. package/themes/business/src/components/OrdersOptionPaymethod/index.tsx +15 -1
  55. package/themes/business/src/components/OrdersOptionStatus/index.tsx +10 -1
  56. package/themes/business/src/components/PreviousMessages/index.tsx +17 -18
  57. package/themes/business/src/components/PreviousOrders/index.tsx +21 -23
  58. package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
  59. package/themes/business/src/components/ReviewCustomer/index.tsx +27 -13
  60. package/themes/business/src/components/ScheduleBlocked/index.tsx +53 -0
  61. package/themes/business/src/components/UserFormDetails/index.tsx +5 -2
  62. package/themes/business/src/components/UserProfileForm/index.tsx +28 -4
  63. package/themes/business/src/components/shared/ODropDown.tsx +42 -8
  64. package/themes/business/src/components/shared/ODropDownCalendar.tsx +36 -7
  65. package/themes/business/src/components/shared/OModal.tsx +40 -37
  66. package/themes/business/src/types/index.tsx +15 -9
  67. package/themes/business/src/utils/index.tsx +10 -0
  68. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  69. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  70. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  71. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -1
  72. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  73. package/themes/kiosk/src/components/LoginForm/index.tsx +121 -10
  74. package/themes/kiosk/src/components/LoginForm/styles.tsx +5 -0
  75. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  76. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  77. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  78. package/themes/kiosk/src/components/ProductForm/index.tsx +1 -14
  79. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  80. package/themes/kiosk/src/types/index.d.ts +2 -0
  81. package/themes/original/index.tsx +4 -0
  82. package/themes/original/src/components/AddressDetails/index.tsx +2 -2
  83. package/themes/original/src/components/AddressForm/index.tsx +151 -140
  84. package/themes/original/src/components/AddressList/index.tsx +1 -1
  85. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  86. package/themes/original/src/components/BusinessBasicInformation/index.tsx +311 -161
  87. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +6 -2
  88. package/themes/original/src/components/BusinessController/index.tsx +190 -113
  89. package/themes/original/src/components/BusinessController/styles.tsx +0 -7
  90. package/themes/original/src/components/BusinessItemAccordion/index.tsx +4 -4
  91. package/themes/original/src/components/BusinessListingSearch/BusinessControllerSkeletons/index.tsx +57 -0
  92. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +59 -0
  93. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/styles.tsx +13 -0
  94. package/themes/original/src/components/BusinessListingSearch/index.tsx +80 -128
  95. package/themes/original/src/components/BusinessListingSearch/styles.tsx +10 -12
  96. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +87 -0
  97. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/styles.tsx +12 -0
  98. package/themes/original/src/components/BusinessProductsList/index.tsx +49 -52
  99. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  100. package/themes/original/src/components/BusinessProductsListing/index.tsx +173 -104
  101. package/themes/original/src/components/BusinessProductsListing/styles.tsx +18 -11
  102. package/themes/original/src/components/BusinessReviews/index.tsx +6 -1
  103. package/themes/original/src/components/BusinessTypeFilter/index.tsx +3 -2
  104. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +37 -25
  105. package/themes/original/src/components/BusinessesListing/Layout/Appointment/styles.tsx +5 -4
  106. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +278 -104
  107. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +47 -10
  108. package/themes/original/src/components/BusinessesListing/index.tsx +95 -7
  109. package/themes/original/src/components/Cart/index.tsx +44 -12
  110. package/themes/original/src/components/Cart/styles.tsx +4 -0
  111. package/themes/original/src/components/CartContent/index.tsx +22 -16
  112. package/themes/original/src/components/Checkout/index.tsx +101 -61
  113. package/themes/original/src/components/Checkout/styles.tsx +0 -1
  114. package/themes/original/src/components/DriverTips/index.tsx +4 -4
  115. package/themes/original/src/components/DriverTips/styles.tsx +2 -1
  116. package/themes/original/src/components/Favorite/index.tsx +1 -0
  117. package/themes/original/src/components/FavoriteList/index.tsx +32 -2
  118. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  119. package/themes/original/src/components/GPSButton/index.tsx +20 -19
  120. package/themes/original/src/components/GoogleMap/index.tsx +20 -12
  121. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +25 -10
  122. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +4 -0
  123. package/themes/original/src/components/HelpGuide/index.tsx +9 -8
  124. package/themes/original/src/components/HelpOrder/index.tsx +9 -8
  125. package/themes/original/src/components/LanguageSelector/index.tsx +19 -14
  126. package/themes/original/src/components/LoginForm/Otp/index.tsx +95 -72
  127. package/themes/original/src/components/LoginForm/index.tsx +90 -46
  128. package/themes/original/src/components/LottieAnimation/index.tsx +69 -0
  129. package/themes/original/src/components/Messages/index.tsx +17 -17
  130. package/themes/original/src/components/MomentOption/index.tsx +8 -6
  131. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +92 -92
  132. package/themes/original/src/components/MultiCheckout/index.tsx +6 -0
  133. package/themes/original/src/components/MultiOrdersDetails/index.tsx +20 -16
  134. package/themes/original/src/components/MyOrders/index.tsx +70 -6
  135. package/themes/original/src/components/NavBar/index.tsx +15 -9
  136. package/themes/original/src/components/NetworkError/index.tsx +5 -3
  137. package/themes/original/src/components/NotFoundSource/index.tsx +2 -1
  138. package/themes/original/src/components/Notifications/index.tsx +148 -0
  139. package/themes/original/src/components/Notifications/styles.tsx +17 -0
  140. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +167 -0
  141. package/themes/original/src/components/OrderDetails/index.tsx +200 -37
  142. package/themes/original/src/components/OrderDetails/styles.tsx +15 -2
  143. package/themes/original/src/components/OrderItAgain/index.tsx +75 -0
  144. package/themes/original/src/components/OrderItAgain/styles.tsx +10 -0
  145. package/themes/original/src/components/OrderProgress/index.tsx +77 -66
  146. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  147. package/themes/original/src/components/OrderSummary/index.tsx +3 -36
  148. package/themes/original/src/components/OrderTypeSelector/index.tsx +85 -36
  149. package/themes/original/src/components/OrderTypeSelector/styles.tsx +19 -1
  150. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +97 -106
  151. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +3 -0
  152. package/themes/original/src/components/OrdersOption/index.tsx +71 -55
  153. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  154. package/themes/original/src/components/PaymentOptions/index.tsx +41 -23
  155. package/themes/original/src/components/PhoneInputNumber/index.tsx +5 -11
  156. package/themes/original/src/components/PlaceSpot/index.tsx +243 -47
  157. package/themes/original/src/components/PlaceSpot/styles.tsx +0 -2
  158. package/themes/original/src/components/PreviousOrders/index.tsx +3 -2
  159. package/themes/original/src/components/ProductForm/index.tsx +635 -664
  160. package/themes/original/src/components/ProductForm/styles.tsx +9 -8
  161. package/themes/original/src/components/ProductItemAccordion/index.tsx +199 -128
  162. package/themes/original/src/components/ProductOption/index.tsx +1 -1
  163. package/themes/original/src/components/ProfessionalFilter/index.tsx +2 -1
  164. package/themes/original/src/components/ProfessionalProfile/index.tsx +26 -14
  165. package/themes/original/src/components/ReviewDriver/index.tsx +7 -7
  166. package/themes/original/src/components/ReviewOrder/index.tsx +18 -3
  167. package/themes/original/src/components/ReviewProducts/index.tsx +2 -2
  168. package/themes/original/src/components/ReviewTrigger/index.tsx +118 -0
  169. package/themes/original/src/components/ReviewTrigger/styles.tsx +34 -0
  170. package/themes/original/src/components/SearchBar/index.tsx +5 -3
  171. package/themes/original/src/components/ServiceForm/index.tsx +410 -258
  172. package/themes/original/src/components/SignupForm/index.tsx +350 -206
  173. package/themes/original/src/components/SingleOrderCard/index.tsx +229 -181
  174. package/themes/original/src/components/SingleOrderCard/styles.tsx +0 -7
  175. package/themes/original/src/components/SingleProductCard/index.tsx +200 -110
  176. package/themes/original/src/components/SingleProductCard/styles.tsx +2 -10
  177. package/themes/original/src/components/SingleProductReview/index.tsx +38 -5
  178. package/themes/original/src/components/SingleProductReview/styles.tsx +12 -0
  179. package/themes/original/src/components/StripeElementsForm/index.tsx +18 -7
  180. package/themes/original/src/components/UpsellingProducts/index.tsx +15 -5
  181. package/themes/original/src/components/UserDetails/index.tsx +31 -17
  182. package/themes/original/src/components/UserFormDetails/index.tsx +74 -81
  183. package/themes/original/src/components/UserProfile/index.tsx +54 -29
  184. package/themes/original/src/components/UserProfile/styles.ts +17 -0
  185. package/themes/original/src/components/UserProfileForm/index.tsx +15 -10
  186. package/themes/original/src/components/WalletTransactions/index.tsx +76 -0
  187. package/themes/original/src/components/WalletTransactions/styles.tsx +13 -0
  188. package/themes/original/src/components/Wallets/index.tsx +176 -164
  189. package/themes/original/src/components/Wallets/styles.tsx +12 -8
  190. package/themes/original/src/components/shared/CardAnimation.tsx +47 -0
  191. package/themes/original/src/components/shared/OBottomPopup.tsx +48 -15
  192. package/themes/original/src/components/shared/OButton.tsx +10 -3
  193. package/themes/original/src/components/shared/OIcon.tsx +8 -1
  194. package/themes/original/src/components/shared/OInput.tsx +13 -3
  195. package/themes/original/src/layouts/Container.tsx +13 -9
  196. package/themes/original/src/layouts/FloatingBottomContainer.tsx +5 -1
  197. package/themes/original/src/types/index.tsx +91 -30
  198. package/themes/original/src/utils/index.tsx +121 -10
  199. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -18,15 +18,12 @@ export const RibbonBox = styled.View`
18
18
  background-color: ${(props: any) => props.theme.colors.primary};
19
19
  padding: 2px 8px;
20
20
  max-width: 180px;
21
-
22
21
  ${(props: any) => props.bgColor && css`
23
22
  background-color: ${props.bgColor};
24
23
  `}
25
-
26
24
  ${(props: any) => props.isRoundRect && css`
27
25
  border-radius: 7.6px;
28
26
  `}
29
-
30
27
  ${(props: any) => props.isCapsule && css`
31
28
  border-radius: 50px;
32
29
  `}
@@ -1,5 +1,7 @@
1
1
  import React, { useCallback, useEffect, useRef, useState } from 'react'
2
2
  import { View, TouchableOpacity, StyleSheet, SafeAreaView, Dimensions, Platform, KeyboardAvoidingViewBase, KeyboardAvoidingView } from 'react-native'
3
+ import { IOScrollView } from 'react-native-intersection-observer'
4
+ import { useSafeAreaInsets } from 'react-native-safe-area-context'
3
5
  import { useTheme } from 'styled-components/native';
4
6
  import {
5
7
  BusinessAndProductList,
@@ -11,6 +13,7 @@ import {
11
13
  useToast,
12
14
  useConfig
13
15
  } from 'ordering-components/native'
16
+ import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
14
17
  import { OButton, OIcon, OModal, OText } from '../shared'
15
18
  import Alert from '../../providers/AlertProvider'
16
19
  import { BusinessBasicInformation } from '../BusinessBasicInformation'
@@ -19,21 +22,26 @@ import { BusinessProductsCategories } from '../BusinessProductsCategories'
19
22
  import { BusinessProductsList } from '../BusinessProductsList'
20
23
  import { BusinessProductsListingParams } from '../../types'
21
24
  import { _retrieveStoreData, _removeStoreData } from '../../providers/StoreUtil';
25
+ import IconAntDesign from 'react-native-vector-icons/AntDesign';
26
+ import { useIsFocused } from '@react-navigation/native';
27
+
22
28
  import {
23
29
  TopHeader,
24
30
  WrapSearchBar,
25
31
  WrapContent,
26
- BusinessProductsListingContainer,
27
32
  FiltProductsContainer,
28
33
  ContainerSafeAreaView,
29
34
  BackgroundGray,
30
- ProfessionalFilterWrapper
35
+ ProfessionalFilterWrapper,
36
+ NearBusiness,
37
+ TopActions
31
38
  } from './styles'
32
39
  import { FloatingButton } from '../FloatingButton'
33
40
  import { UpsellingRedirect } from './UpsellingRedirect'
34
41
  import Animated from 'react-native-reanimated'
35
42
  import { ProfessionalFilter } from '../ProfessionalFilter';
36
43
  import { ServiceForm } from '../ServiceForm';
44
+ import { BusinessesListing } from '../BusinessesListing/Layout/Original'
37
45
 
38
46
  const PIXELS_TO_SCROLL = 2000
39
47
 
@@ -58,9 +66,11 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
58
66
  getNextProducts,
59
67
  handleUpdateProducts,
60
68
  professionalSelected,
61
- handleChangeProfessionalSelected
69
+ handleChangeProfessionalSelected,
70
+ onBusinessClick
62
71
  } = props
63
72
 
73
+ const insets = useSafeAreaInsets()
64
74
  const theme = useTheme();
65
75
  const [, t] = useLanguage()
66
76
  const [{ auth }] = useSession()
@@ -68,10 +78,16 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
68
78
  const [{ parsePrice }] = useUtils()
69
79
  const [, { showToast }] = useToast()
70
80
  const [{ configs }] = useConfig()
81
+ const isFocused = useIsFocused();
71
82
  const isPreOrder = configs?.preorder_status_enabled?.value === '1'
83
+
84
+ const isChewLayout = theme?.business_view?.components?.header?.components?.layout?.type === 'chew'
85
+ const showLogo = !theme?.business_view?.components?.header?.components?.business?.components?.logo?.hidden
86
+ const hideBusinessNearCity = theme?.business_view?.components?.near_business?.hidden ?? true
87
+
72
88
  const styles = StyleSheet.create({
73
89
  mainContainer: {
74
- flex: 1,
90
+ flex: 1
75
91
  },
76
92
  BackIcon: {
77
93
  paddingRight: 20,
@@ -93,7 +109,13 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
93
109
  padding: 15,
94
110
  justifyContent: 'center',
95
111
  shadowColor: theme.colors.clear,
96
- }
112
+ },
113
+ businessSkeleton: {
114
+ borderRadius: 8,
115
+ marginRight: 20,
116
+ width: 56,
117
+ height: 56
118
+ },
97
119
  })
98
120
 
99
121
  const { business, loading, error } = businessState
@@ -108,17 +130,21 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
108
130
  const [subcategoriesSelected, setSubcategoriesSelected] = useState([])
109
131
  const [openService, setOpenService] = useState(false)
110
132
  const [currentProduct, setCurrentProduct] = useState(null)
133
+ const [searchBarHeight, setSearchBarHeight] = useState(60)
111
134
 
112
135
  const isCheckoutMultiBusinessEnabled: Boolean = configs?.checkout_multi_business_enabled?.value === '1'
136
+ const openCarts = (Object.values(orderState?.carts)?.filter((cart: any) => cart?.products && cart?.products?.length && cart?.status !== 2 && cart?.valid_schedule && cart?.valid_products && cart?.valid_address && cart?.valid_maximum && cart?.valid_minimum && !cart?.wallets) || null) || []
137
+
113
138
  const currentCart: any = Object.values(orderState.carts).find((cart: any) => cart?.business?.slug === business?.slug) ?? {}
114
139
  const isOpenFiltProducts = isOpenSearchBar && !!searchValue
115
- const filtProductsHeight = Platform.OS === 'ios' ? 0 : 35
140
+ const filtProductsHeight = Platform.OS === 'ios' ? 0 : 100
116
141
  const onRedirect = (route: string, params?: any) => {
117
142
  navigation.navigate(route, params)
118
143
  }
119
144
 
120
145
  const onProductClick = (product: any) => {
121
- if (product?.type === 'service' && professionalSelected) {
146
+ const productAddedToCartLength = currentCart?.products?.reduce((productsLength: number, Cproduct: any) => { return productsLength + (Cproduct?.id === product?.id ? Cproduct?.quantity : 0) }, 0) || 0
147
+ if (product?.type === 'service' && business?.professionals?.length > 0) {
122
148
  setCurrentProduct(product)
123
149
  setOpenService(true)
124
150
  return
@@ -127,6 +153,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
127
153
  product: product,
128
154
  businessSlug: business.slug,
129
155
  businessId: business.id,
156
+ productAddedToCartLength
130
157
  })
131
158
  }
132
159
 
@@ -136,7 +163,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
136
163
  }
137
164
 
138
165
  const handleUpsellingPage = () => {
139
- if (isCheckoutMultiBusinessEnabled) {
166
+ if (isCheckoutMultiBusinessEnabled && openCarts.length > 1) {
140
167
  onRedirect('CheckoutNavigator', {
141
168
  screen: 'MultiCheckout'
142
169
  })
@@ -203,7 +230,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
203
230
  multiRemoveProducts && await multiRemoveProducts(unavailableProducts, _carts)
204
231
  return
205
232
  }
206
-
233
+
207
234
  if (alreadyRemoved === 'removed') {
208
235
  setAlertState({ open: true, content: [t('NOT_AVAILABLE_PRODUCT', 'This product is not available.')] })
209
236
  }
@@ -221,32 +248,35 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
221
248
  removeCartByReOrder()
222
249
  }, [currentCart])
223
250
 
251
+ useEffect(() => {
252
+ if (!isFocused) {
253
+ handleChangeSearch('')
254
+ setIsOpenSearchBar(false)
255
+ }
256
+ }, [isFocused])
257
+
224
258
  return (
225
259
  <>
226
- <ContainerSafeAreaView
227
- style={{ flex: 1 }}
228
- isOpenFiltProducts={isOpenFiltProducts}
229
- >
260
+ <View style={{ flex: 1 }}>
230
261
  <Animated.View style={{ position: 'relative' }}>
231
- <TopHeader isIos={Platform.OS === 'ios'}>
262
+ <TopHeader
263
+ style={{
264
+ marginTop: Platform.OS === 'ios' ? insets.top : 0
265
+ }}
266
+ onLayout={(event: any) => setSearchBarHeight(event.nativeEvent.layout.height) }
267
+ >
232
268
  {!isOpenSearchBar && (
233
269
  <>
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: 16 }}
241
- />
242
- </View>
270
+ <TopActions onPress={() => handleBackNavigation()}>
271
+ <OIcon src={theme.images.general.arrow_left} color={theme.colors.textNormal} />
272
+ </TopActions>
243
273
  {!errorQuantityProducts && (
244
274
  <View style={{ ...styles.headerItem }}>
245
275
  <TouchableOpacity
246
276
  onPress={() => setIsOpenSearchBar(true)}
247
277
  style={styles.searchIcon}
248
278
  >
249
- <OIcon src={theme.images.general.search} color={theme.colors.textNormal} width={16} />
279
+ <OIcon src={theme.images.general.search} color={theme.colors.textNormal} width={20} />
250
280
  </TouchableOpacity>
251
281
  </View>
252
282
  )}
@@ -255,6 +285,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
255
285
  {isOpenSearchBar && (
256
286
  <WrapSearchBar>
257
287
  <SearchBar
288
+ autoFocus
258
289
  onSearch={handleChangeSearch}
259
290
  onCancel={() => handleCancel()}
260
291
  isCancelXButtonShow
@@ -265,57 +296,88 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
265
296
  </WrapSearchBar>
266
297
  )}
267
298
  </TopHeader>
299
+ {!hideBusinessNearCity && loading && (
300
+ <NearBusiness style={{ paddingBottom: 10 }}>
301
+ <Placeholder Animation={Fade}>
302
+ <View style={{ flexDirection: 'row' }}>
303
+ {[...Array(10).keys()].map(i => (
304
+ <View style={styles.businessSkeleton} key={i}>
305
+ <PlaceholderLine style={{ width: '100%', height: '100%' }} />
306
+ </View>
307
+ ))}
308
+ </View>
309
+ </Placeholder>
310
+ </NearBusiness>
311
+ )}
312
+ {!loading && !hideBusinessNearCity && businessState?.business?.city_id && (
313
+ <NearBusiness>
314
+ <BusinessesListing
315
+ logosLayout
316
+ propsToFetch={['id', 'logo', 'location', 'timezone', 'schedule', 'open', 'slug']}
317
+ cityId={businessState?.business?.city_id}
318
+ onBusinessClick={onBusinessClick}
319
+ actualSlug={businessState?.business?.slug}
320
+ />
321
+ </NearBusiness>
322
+ )}
268
323
  </Animated.View>
269
324
 
270
325
  {business?.categories?.length > 0 && isOpenFiltProducts && (
271
- <FiltProductsContainer
272
- isIos={Platform.OS === 'ios'}
273
- style={{
274
- height: Dimensions.get('window').height - filtProductsHeight
275
- }}
276
- >
277
- <View style={{ padding: 20, backgroundColor: theme.colors.white }}>
278
- <BusinessProductsList
279
- categories={[
280
- { id: null, name: t('ALL', 'All') },
281
- { id: 'featured', name: t('FEATURED', 'Featured') },
282
- ...business?.categories.sort((a: any, b: any) => a.rank - b.rank)
283
- ]}
284
- category={categorySelected}
285
- categoryState={categoryState}
286
- businessId={business.id}
287
- errors={errors}
288
- onProductClick={onProductClick}
289
- handleSearchRedirect={handleSearchRedirect}
290
- featured={featuredProducts}
291
- searchValue={searchValue}
292
- handleClearSearch={handleChangeSearch}
293
- errorQuantityProducts={errorQuantityProducts}
294
- handleCancelSearch={handleCancel}
295
- categoriesLayout={categoriesLayout}
296
- subcategoriesSelected={subcategoriesSelected}
297
- lazyLoadProductsRecommended={business?.lazy_load_products_recommended}
298
- setCategoriesLayout={setCategoriesLayout}
299
- currentCart={currentCart}
300
- setSubcategoriesSelected={setSubcategoriesSelected}
301
- onClickCategory={handleChangeCategory}
302
- handleUpdateProducts={handleUpdateProducts}
303
- isFiltMode
304
- />
305
- </View>
306
- </FiltProductsContainer>
326
+ <FiltProductsContainer
327
+ style={{
328
+ height: Dimensions.get('window').height - filtProductsHeight,
329
+ top: Platform.OS === 'ios' ? searchBarHeight + insets.top : searchBarHeight
330
+ }}
331
+ contentContainerStyle={{ flexGrow: 1 }}
332
+ >
333
+ <View style={{ padding: 20, backgroundColor: theme.colors.white }}>
334
+ <BusinessProductsList
335
+ categories={[
336
+ { id: null, name: t('ALL', 'All') },
337
+ { id: 'featured', name: t('FEATURED', 'Featured') },
338
+ ...business?.categories.sort((a: any, b: any) => a.rank - b.rank)
339
+ ]}
340
+ category={categorySelected}
341
+ categoryState={categoryState}
342
+ businessId={business.id}
343
+ errors={errors}
344
+ onProductClick={onProductClick}
345
+ handleSearchRedirect={handleSearchRedirect}
346
+ featured={featuredProducts}
347
+ searchValue={searchValue}
348
+ handleClearSearch={handleChangeSearch}
349
+ errorQuantityProducts={errorQuantityProducts}
350
+ handleCancelSearch={handleCancel}
351
+ categoriesLayout={categoriesLayout}
352
+ subcategoriesSelected={subcategoriesSelected}
353
+ lazyLoadProductsRecommended={business?.lazy_load_products_recommended}
354
+ setCategoriesLayout={setCategoriesLayout}
355
+ currentCart={currentCart}
356
+ setSubcategoriesSelected={setSubcategoriesSelected}
357
+ onClickCategory={handleChangeCategory}
358
+ handleUpdateProducts={handleUpdateProducts}
359
+ previouslyProducts={business?.previously_products}
360
+ navigation={navigation}
361
+ isFiltMode
362
+ />
363
+ </View>
364
+ </FiltProductsContainer>
307
365
  )}
308
366
  {isOpenFiltProducts && (
309
- <BackgroundGray />
367
+ <BackgroundGray isIos={Platform.OS === 'ios'} />
310
368
  )}
311
- <BusinessProductsListingContainer
312
- stickyHeaderIndices={[2]}
313
- style={styles.mainContainer}
369
+ <IOScrollView
370
+ stickyHeaderIndices={[business?.professionals?.length > 0 ? 3 : 2]}
371
+ style={{
372
+ ...styles.mainContainer,
373
+ marginBottom: currentCart?.products?.length > 0 && categoryState.products.length !== 0 ?
374
+ 50 : 0
375
+ }}
314
376
  ref={scrollViewRef}
315
- isActiveFloatingButtom={currentCart?.products?.length > 0 && categoryState.products.length !== 0}
316
377
  onScroll={handlePageScroll}
317
378
  onScrollBeginDrag={handleTouchDrag}
318
379
  scrollEventThrottle={16}
380
+ bounces={false}
319
381
  >
320
382
  <BusinessBasicInformation
321
383
  navigation={navigation}
@@ -341,27 +403,28 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
341
403
  />
342
404
  </ProfessionalFilterWrapper>
343
405
  )}
344
- <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100 }} />
345
- {!loading && business?.id && (
346
- <>
347
- {!(business?.categories?.length === 0) && (
348
- <BusinessProductsCategories
349
- categories={[{ id: null, name: t('ALL', 'All') }, { id: 'featured', name: t('FEATURED', 'Featured') }, ...business?.categories.sort((a: any, b: any) => a.rank - b.rank)]}
350
- categorySelected={categorySelected}
351
- onClickCategory={handleChangeCategory}
352
- featured={featuredProducts}
353
- openBusinessInformation={openBusinessInformation}
354
- scrollViewRef={scrollViewRef}
355
- productListLayout={productListLayout}
356
- categoriesLayout={categoriesLayout}
357
- selectedCategoryId={selectedCategoryId}
358
- lazyLoadProductsRecommended={business?.lazy_load_products_recommended}
359
- setSelectedCategoryId={setSelectedCategoryId}
360
- setCategoryClicked={setCategoryClicked}
361
-
362
- />
363
- )}
364
- </>
406
+ <View
407
+ style={{
408
+ height: 8,
409
+ backgroundColor: theme.colors.backgroundGray100,
410
+ marginTop: isChewLayout && showLogo ? 10 : 0
411
+ }}
412
+ />
413
+ {!loading && business?.id && !(business?.categories?.length === 0) && (
414
+ <BusinessProductsCategories
415
+ categories={[{ id: null, name: t('ALL', 'All') }, { id: 'featured', name: t('FEATURED', 'Featured') }, ...business?.categories.sort((a: any, b: any) => a.rank - b.rank)]}
416
+ categorySelected={categorySelected}
417
+ onClickCategory={handleChangeCategory}
418
+ featured={featuredProducts}
419
+ openBusinessInformation={openBusinessInformation}
420
+ scrollViewRef={scrollViewRef}
421
+ productListLayout={productListLayout}
422
+ categoriesLayout={categoriesLayout}
423
+ selectedCategoryId={selectedCategoryId}
424
+ lazyLoadProductsRecommended={business?.lazy_load_products_recommended}
425
+ setSelectedCategoryId={setSelectedCategoryId}
426
+ setCategoryClicked={setCategoryClicked}
427
+ />
365
428
  )}
366
429
  {!loading && business?.id && (
367
430
  <>
@@ -393,6 +456,8 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
393
456
  setSubcategoriesSelected={setSubcategoriesSelected}
394
457
  onClickCategory={handleChangeCategory}
395
458
  handleUpdateProducts={handleUpdateProducts}
459
+ navigation={navigation}
460
+ previouslyProducts={business?.previously_products}
396
461
  />
397
462
  </WrapContent>
398
463
  </>
@@ -415,28 +480,31 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
415
480
  isBusinessLoading={loading}
416
481
  errorQuantityProducts={errorQuantityProducts}
417
482
  handleUpdateProducts={handleUpdateProducts}
483
+ navigation={navigation}
418
484
  />
419
485
  </WrapContent>
420
486
  </>
421
487
  )}
422
- </BusinessProductsListingContainer>
488
+ </IOScrollView>
423
489
  {!loading && auth && currentCart?.products?.length > 0 && categoryState.products.length !== 0 && (
424
- <FloatingButton
425
- btnText={
426
- openUpselling
427
- ? t('LOADING', 'Loading')
428
- : currentCart?.subtotal >= currentCart?.minimum
429
- ? t('VIEW_ORDER', 'View Order')
430
- : `${t('MINIMUN_SUBTOTAL_ORDER', 'Minimum subtotal order:')} ${parsePrice(currentCart?.minimum)}`
431
- }
432
- isSecondaryBtn={currentCart?.subtotal < currentCart?.minimum || openUpselling}
433
- btnLeftValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
434
- btnRightValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
435
- btnLeftValue={currentCart?.products.reduce((prev: number, product: any) => prev + product.quantity, 0)}
436
- btnRightValue={parsePrice(currentCart?.total)}
437
- disabled={currentCart?.subtotal < currentCart?.minimum || openUpselling}
438
- handleClick={() => setOpenUpselling(true)}
439
- />
490
+ <View style={{ marginBottom: Platform.OS === 'ios' ? 20 : 0 }}>
491
+ <FloatingButton
492
+ btnText={
493
+ openUpselling
494
+ ? t('LOADING', 'Loading')
495
+ : currentCart?.subtotal >= currentCart?.minimum
496
+ ? t('VIEW_ORDER', 'View Order')
497
+ : `${t('MINIMUN_SUBTOTAL_ORDER', 'Minimum subtotal order:')} ${parsePrice(currentCart?.minimum)}`
498
+ }
499
+ isSecondaryBtn={currentCart?.subtotal < currentCart?.minimum || openUpselling}
500
+ btnLeftValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
501
+ btnRightValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
502
+ btnLeftValue={currentCart?.products.reduce((prev: number, product: any) => prev + product.quantity, 0)}
503
+ btnRightValue={parsePrice(currentCart?.total)}
504
+ disabled={currentCart?.subtotal < currentCart?.minimum || openUpselling}
505
+ handleClick={() => setOpenUpselling(true)}
506
+ />
507
+ </View>
440
508
  )}
441
509
  {openUpselling && (
442
510
  <UpsellingRedirect
@@ -460,7 +528,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
460
528
  onAccept={() => setAlertState({ open: false, content: [] })}
461
529
  onClose={() => setAlertState({ open: false, content: [] })}
462
530
  />
463
- </ContainerSafeAreaView>
531
+ </View>
464
532
  <OModal
465
533
  open={openService}
466
534
  onClose={() => setOpenService(false)}
@@ -485,6 +553,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
485
553
  export const BusinessProductsListing = (props: BusinessProductsListingParams) => {
486
554
  const businessProductslistingProps = {
487
555
  ...props,
556
+ isForceSearch: Platform.OS === 'ios',
488
557
  UIComponent: BusinessProductsListingUI
489
558
  }
490
559
  return (
@@ -1,8 +1,5 @@
1
1
  import styled, { css } from 'styled-components/native'
2
2
 
3
- export const ContainerSafeAreaView = styled.SafeAreaView`
4
- `
5
-
6
3
  export const WrapHeader = styled.View`
7
4
  position: relative;
8
5
  `
@@ -14,7 +11,6 @@ export const TopHeader = styled.View`
14
11
  z-index: 1;
15
12
  height: 60px;
16
13
  min-height: 60px;
17
- margin-top: ${(props : any) => props.isIos ? '0' : '40px'};
18
14
  `
19
15
  export const AddressInput = styled.TouchableOpacity`
20
16
  flex: 1;
@@ -41,18 +37,16 @@ export const BusinessProductsListingContainer = styled.ScrollView`
41
37
  export const FiltProductsContainer = styled.ScrollView`
42
38
  position: absolute;
43
39
  width: 100%;
44
- z-index: 2000;
45
- top: ${(props : any) => props.isIos ? '40px': '80px'};
46
- margin-top: 20px;
40
+ z-index: 20000;
47
41
  `
48
42
 
49
43
  export const BackgroundGray = styled.View`
50
44
  flex: 1;
51
- height: 100%;
45
+ height: ${(props: any) => props.isIos ? '80%' : '100%'};
52
46
  background-color: rgba(0,0,0,0.5);
53
- position: absolute;
54
- margin-top: 100px;
55
- z-index: 100;
47
+ position: absolute;
48
+ margin-top: 100px;
49
+ z-index: 10000;
56
50
  width: 100%;
57
51
  `
58
52
 
@@ -60,3 +54,16 @@ export const ProfessionalFilterWrapper = styled.View`
60
54
  padding-left: 40px;
61
55
  margin-bottom: 35px;
62
56
  `
57
+
58
+ export const NearBusiness = styled.View`
59
+ width: 100%;
60
+ padding-left: 20px;
61
+ max-height: 80px;
62
+ `
63
+
64
+ export const TopActions = styled.TouchableOpacity`
65
+ height: 60px;
66
+ justify-content: center;
67
+ padding-horizontal: 30px;
68
+ width: 100px;
69
+ `;
@@ -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
@@ -38,6 +38,7 @@ export const BusinessTypeFilterUI = (props: BusinessTypeFilterParams) => {
38
38
 
39
39
  const theme = useTheme();
40
40
  const [isOpenAllCategories, setIsOpenAllCategories] = useState(false)
41
+ const defaultImage = (name : string) => theme.images?.categories?.[name.toLowerCase().replace(' ', '')]
41
42
 
42
43
  useEffect(() => {
43
44
  if(typesState?.types?.length > 0){
@@ -197,9 +198,9 @@ export const BusinessTypeFilterUI = (props: BusinessTypeFilterParams) => {
197
198
  isOpenAllCategories && setIsOpenAllCategories(false)
198
199
  }}
199
200
  >
200
- {item.image ? (
201
+ {(defaultImage(item.name) || item.image) ? (
201
202
  <OIcon
202
- url={item.image}
203
+ url={typeof item.name === 'number' ? item.image || defaultImage(item.name) : defaultImage(item.name) || item.image}
203
204
  style={styles.logo}
204
205
  />
205
206
  ) : (