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