ordering-ui-react-native 0.15.33 → 0.15.35-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 (182) hide show
  1. package/package.json +4 -2
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessController/index.tsx +8 -2
  4. package/src/components/BusinessTypeFilter/index.tsx +4 -1
  5. package/src/components/BusinessesListing/index.tsx +1 -1
  6. package/src/components/Checkout/index.tsx +23 -3
  7. package/src/components/DriverTips/index.tsx +11 -6
  8. package/src/components/LanguageSelector/index.tsx +7 -2
  9. package/src/components/LoginForm/index.tsx +3 -1
  10. package/src/components/OrderDetails/index.tsx +2 -2
  11. package/src/components/PaymentOptions/index.tsx +9 -16
  12. package/src/components/PaymentOptionsWebView/index.tsx +123 -124
  13. package/src/components/SignupForm/index.tsx +3 -1
  14. package/src/components/SingleProductCard/index.tsx +16 -4
  15. package/src/components/StripeElementsForm/index.tsx +27 -48
  16. package/src/components/UpsellingProducts/index.tsx +1 -1
  17. package/src/components/UserProfileForm/index.tsx +63 -6
  18. package/src/components/UserProfileForm/styles.tsx +8 -0
  19. package/src/components/VerifyPhone/styles.tsx +1 -2
  20. package/src/components/shared/OModal.tsx +1 -1
  21. package/src/config.json +0 -2
  22. package/src/hooks/useCountdownTimer.tsx +26 -0
  23. package/src/navigators/CheckoutNavigator.tsx +6 -0
  24. package/src/navigators/HomeNavigator.tsx +12 -0
  25. package/src/pages/BusinessProductsList.tsx +1 -0
  26. package/src/pages/BusinessesListing.tsx +1 -1
  27. package/src/pages/Checkout.tsx +1 -1
  28. package/src/pages/MultiCheckout.tsx +31 -0
  29. package/src/pages/MultiOrdersDetails.tsx +27 -0
  30. package/src/pages/Sessions.tsx +22 -0
  31. package/src/types/index.tsx +5 -11
  32. package/src/utils/index.tsx +68 -1
  33. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +103 -15
  34. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -0
  35. package/themes/business/src/components/Chat/index.tsx +38 -86
  36. package/themes/business/src/components/DriverMap/index.tsx +6 -5
  37. package/themes/business/src/components/Home/index.tsx +128 -55
  38. package/themes/business/src/components/Home/styles.tsx +8 -1
  39. package/themes/business/src/components/LoginForm/index.tsx +89 -2
  40. package/themes/business/src/components/LoginForm/styles.tsx +6 -0
  41. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  42. package/themes/business/src/components/NewOrderNotification/index.tsx +79 -105
  43. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  44. package/themes/business/src/components/OrderDetails/Delivery.tsx +32 -15
  45. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +157 -89
  46. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +6 -0
  47. package/themes/business/src/components/OrderDetails/styles.tsx +7 -0
  48. package/themes/business/src/components/OrdersListManager/index.tsx +52 -49
  49. package/themes/business/src/components/OrdersOption/index.tsx +57 -50
  50. package/themes/business/src/components/PreviousOrders/index.tsx +50 -14
  51. package/themes/business/src/components/ProductItemAccordion/index.tsx +2 -2
  52. package/themes/business/src/components/shared/OModal.tsx +1 -1
  53. package/themes/business/src/types/index.tsx +5 -1
  54. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  55. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  56. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  57. package/themes/kiosk/src/components/Cart/index.tsx +99 -25
  58. package/themes/kiosk/src/components/Cart/styles.tsx +6 -0
  59. package/themes/kiosk/src/components/Checkout/index.tsx +34 -22
  60. package/themes/kiosk/src/components/CustomerName/index.tsx +0 -6
  61. package/themes/kiosk/src/components/Intro/index.tsx +12 -12
  62. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  63. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  64. package/themes/kiosk/src/components/OrderDetails/index.tsx +165 -65
  65. package/themes/kiosk/src/components/OrderDetails/styles.tsx +5 -0
  66. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +10 -12
  67. package/themes/kiosk/src/components/PaymentOptions/index.tsx +1 -1
  68. package/themes/kiosk/src/components/ProductForm/index.tsx +2 -2
  69. package/themes/kiosk/src/components/UpsellingProducts/index.tsx +48 -34
  70. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  71. package/themes/kiosk/src/types/index.d.ts +2 -0
  72. package/themes/original/index.tsx +188 -1
  73. package/themes/original/src/components/ActiveOrders/index.tsx +15 -132
  74. package/themes/original/src/components/ActiveOrders/styles.tsx +0 -54
  75. package/themes/original/src/components/AddressForm/index.tsx +15 -10
  76. package/themes/original/src/components/AddressList/index.tsx +56 -18
  77. package/themes/original/src/components/AppleLogin/index.tsx +117 -78
  78. package/themes/original/src/components/BusinessBasicInformation/index.tsx +96 -45
  79. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +28 -1
  80. package/themes/original/src/components/BusinessController/index.tsx +56 -16
  81. package/themes/original/src/components/BusinessController/styles.tsx +27 -0
  82. package/themes/original/src/components/BusinessFeaturedController/index.tsx +20 -1
  83. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +23 -0
  84. package/themes/original/src/components/BusinessItemAccordion/index.tsx +4 -3
  85. package/themes/original/src/components/BusinessItemAccordion/styles.tsx +3 -1
  86. package/themes/original/src/components/BusinessListingSearch/index.tsx +125 -7
  87. package/themes/original/src/components/BusinessListingSearch/styles.tsx +14 -1
  88. package/themes/original/src/components/BusinessMenuList/index.tsx +11 -4
  89. package/themes/original/src/components/BusinessPreorder/index.tsx +142 -122
  90. package/themes/original/src/components/BusinessProductsCategories/index.tsx +9 -7
  91. package/themes/original/src/components/BusinessProductsList/CategoryDescription/index.tsx +44 -0
  92. package/themes/original/src/components/BusinessProductsList/index.tsx +139 -36
  93. package/themes/original/src/components/BusinessProductsList/styles.tsx +29 -2
  94. package/themes/original/src/components/BusinessProductsListing/index.tsx +125 -21
  95. package/themes/original/src/components/BusinessProductsListing/styles.tsx +22 -0
  96. package/themes/original/src/components/BusinessReviews/index.tsx +4 -25
  97. package/themes/original/src/components/BusinessTypeFilter/index.tsx +1 -2
  98. package/themes/original/src/components/BusinessesListing/index.tsx +85 -45
  99. package/themes/original/src/components/Cart/index.tsx +60 -43
  100. package/themes/original/src/components/CartContent/index.tsx +2 -2
  101. package/themes/original/src/components/Checkout/index.tsx +59 -48
  102. package/themes/original/src/components/DriverTips/index.tsx +17 -12
  103. package/themes/original/src/components/Favorite/index.tsx +91 -0
  104. package/themes/original/src/components/Favorite/styles.tsx +22 -0
  105. package/themes/original/src/components/FavoriteList/index.tsx +287 -0
  106. package/themes/original/src/components/FavoriteList/styles.tsx +5 -0
  107. package/themes/original/src/components/ForgotPasswordForm/index.tsx +84 -4
  108. package/themes/original/src/components/GPSButton/index.tsx +15 -8
  109. package/themes/original/src/components/GoogleMap/index.tsx +1 -0
  110. package/themes/original/src/components/Help/index.tsx +21 -4
  111. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +18 -1
  112. package/themes/original/src/components/Home/index.tsx +1 -1
  113. package/themes/original/src/components/LastOrders/index.tsx +12 -1
  114. package/themes/original/src/components/LoginForm/Otp/index.tsx +90 -0
  115. package/themes/original/src/components/LoginForm/Otp/styles.tsx +7 -0
  116. package/themes/original/src/components/LoginForm/index.tsx +394 -155
  117. package/themes/original/src/components/LoginForm/styles.tsx +7 -4
  118. package/themes/original/src/components/LogoutButton/index.tsx +7 -1
  119. package/themes/original/src/components/MessageListing/index.tsx +10 -1
  120. package/themes/original/src/components/Messages/index.tsx +6 -1
  121. package/themes/original/src/components/Messages/styles.tsx +1 -3
  122. package/themes/original/src/components/MomentOption/index.tsx +10 -1
  123. package/themes/original/src/components/MomentOption/styles.tsx +1 -1
  124. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +243 -0
  125. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/styles.tsx +46 -0
  126. package/themes/original/src/components/MultiCheckout/index.tsx +298 -0
  127. package/themes/original/src/components/MultiCheckout/styles.tsx +59 -0
  128. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +372 -0
  129. package/themes/original/src/components/MultiOrdersDetails/index.tsx +258 -0
  130. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +50 -0
  131. package/themes/original/src/components/OrderDetails/index.tsx +56 -33
  132. package/themes/original/src/components/OrderDetails/styles.tsx +1 -2
  133. package/themes/original/src/components/OrderProgress/index.tsx +3 -3
  134. package/themes/original/src/components/OrderProgress/styles.tsx +1 -0
  135. package/themes/original/src/components/OrderSummary/index.tsx +3 -3
  136. package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -2
  137. package/themes/original/src/components/OrdersOption/index.tsx +57 -56
  138. package/themes/original/src/components/OrdersOption/styles.tsx +0 -6
  139. package/themes/original/src/components/PaymentOptionCash/index.tsx +2 -2
  140. package/themes/original/src/components/PaymentOptionWallet/index.tsx +22 -24
  141. package/themes/original/src/components/PaymentOptionWallet/styles.tsx +1 -1
  142. package/themes/original/src/components/PaymentOptions/index.tsx +9 -21
  143. package/themes/original/src/components/PhoneInputNumber/index.tsx +1 -1
  144. package/themes/original/src/components/PreviousOrders/index.tsx +18 -145
  145. package/themes/original/src/components/ProductForm/index.tsx +76 -61
  146. package/themes/original/src/components/ProductForm/styles.tsx +0 -1
  147. package/themes/original/src/components/ProductItemAccordion/index.tsx +2 -2
  148. package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -12
  149. package/themes/original/src/components/Promotions/index.tsx +250 -0
  150. package/themes/original/src/components/Promotions/styles.tsx +60 -0
  151. package/themes/original/src/components/SearchBar/index.tsx +4 -1
  152. package/themes/original/src/components/Sessions/index.tsx +160 -0
  153. package/themes/original/src/components/Sessions/styles.tsx +15 -0
  154. package/themes/original/src/components/SignupForm/index.tsx +9 -4
  155. package/themes/original/src/components/SingleOrderCard/index.tsx +282 -0
  156. package/themes/original/src/components/SingleOrderCard/styles.tsx +54 -0
  157. package/themes/original/src/components/SingleProductCard/index.tsx +82 -30
  158. package/themes/original/src/components/SingleProductCard/styles.tsx +28 -1
  159. package/themes/original/src/components/StripeElementsForm/index.tsx +10 -2
  160. package/themes/original/src/components/StripeElementsForm/naked.tsx +2 -2
  161. package/themes/original/src/components/TaxInformation/index.tsx +10 -4
  162. package/themes/original/src/components/UpsellingProducts/index.tsx +86 -74
  163. package/themes/original/src/components/UserDetails/index.tsx +5 -96
  164. package/themes/original/src/components/UserFormDetails/index.tsx +34 -24
  165. package/themes/original/src/components/UserProfile/index.tsx +62 -8
  166. package/themes/original/src/components/UserProfileForm/index.tsx +20 -18
  167. package/themes/original/src/components/UserVerification/index.tsx +178 -192
  168. package/themes/original/src/components/VerifyPhone/index.tsx +10 -7
  169. package/themes/original/src/components/VerifyPhone/styles.tsx +2 -1
  170. package/themes/original/src/components/Wallets/index.tsx +76 -9
  171. package/themes/original/src/components/Wallets/styles.tsx +21 -0
  172. package/themes/original/src/components/shared/HeaderTitle.tsx +21 -0
  173. package/themes/original/src/components/shared/OModal.tsx +4 -2
  174. package/themes/original/src/components/shared/index.tsx +2 -0
  175. package/themes/original/src/config/constants.tsx +6 -6
  176. package/themes/original/src/types/index.tsx +107 -9
  177. package/themes/original/src/utils/index.tsx +28 -2
  178. package/themes/single-business/src/components/AddressList/index.tsx +1 -1
  179. package/themes/single-business/src/components/OrderTypeSelector/index.tsx +6 -6
  180. package/themes/single-business/src/components/UserProfile/index.tsx +1 -1
  181. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  182. package/src/components/StripeMethodForm/index.tsx +0 -174
@@ -1,4 +1,4 @@
1
- import styled from 'styled-components/native'
1
+ import styled, { css } from 'styled-components/native'
2
2
 
3
3
  export const ProductsContainer = styled.View`
4
4
  `
@@ -11,4 +11,31 @@ export const ErrorMessage = styled.View`
11
11
 
12
12
  export const WrapperNotFound = styled.View`
13
13
  height: 500px;
14
- `
14
+ `
15
+
16
+ export const RibbonBox = styled.View`
17
+ margin-left: 5px;
18
+ background-color: ${(props: any) => props.theme.colors.primary};
19
+ padding: 2px 8px;
20
+ max-width: 180px;
21
+ ${(props: any) => props.bgColor && css`
22
+ background-color: ${props.bgColor};
23
+ `}
24
+ ${(props: any) => props.isRoundRect && css`
25
+ border-radius: 7.6px;
26
+ `}
27
+ ${(props: any) => props.isCapsule && css`
28
+ border-radius: 50px;
29
+ `}
30
+ `
31
+
32
+ export const SubCategoriesContainer = styled.View`
33
+ flex-direction: row;
34
+ flex-wrap: wrap;
35
+ margin-bottom: 10px;
36
+ `
37
+
38
+ export const ContainerButton = styled.View`
39
+ `
40
+
41
+ export const HeaderWrapper = styled.View``
@@ -1,5 +1,5 @@
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
3
  import { useTheme } from 'styled-components/native';
4
4
  import {
5
5
  BusinessAndProductList,
@@ -12,22 +12,27 @@ import {
12
12
  useConfig
13
13
  } from 'ordering-components/native'
14
14
  import { OButton, OIcon, OModal, OText } from '../shared'
15
+ import Alert from '../../providers/AlertProvider'
15
16
  import { BusinessBasicInformation } from '../BusinessBasicInformation'
16
17
  import { SearchBar } from '../SearchBar'
17
18
  import { BusinessProductsCategories } from '../BusinessProductsCategories'
18
19
  import { BusinessProductsList } from '../BusinessProductsList'
19
20
  import { BusinessProductsListingParams } from '../../types'
21
+ import { _retrieveStoreData, _removeStoreData } from '../../providers/StoreUtil';
20
22
  import {
21
23
  TopHeader,
22
24
  WrapSearchBar,
23
25
  WrapContent,
24
- BusinessProductsListingContainer
26
+ BusinessProductsListingContainer,
27
+ FiltProductsContainer,
28
+ ContainerSafeAreaView,
29
+ BackgroundGray
25
30
  } from './styles'
26
31
  import { FloatingButton } from '../FloatingButton'
27
32
  import { UpsellingRedirect } from './UpsellingRedirect'
28
33
  import Animated from 'react-native-reanimated'
29
34
 
30
- const PIXELS_TO_SCROLL = 1000
35
+ const PIXELS_TO_SCROLL = 2000
31
36
 
32
37
  const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
33
38
  const {
@@ -44,13 +49,17 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
44
49
  errorQuantityProducts,
45
50
  header,
46
51
  logo,
52
+ alertState,
53
+ setAlertState,
54
+ multiRemoveProducts,
47
55
  getNextProducts,
56
+ handleUpdateProducts
48
57
  } = props
49
58
 
50
59
  const theme = useTheme();
51
60
  const [, t] = useLanguage()
52
61
  const [{ auth }] = useSession()
53
- const [orderState] = useOrder()
62
+ const [orderState, { clearCart }] = useOrder()
54
63
  const [{ parsePrice }] = useUtils()
55
64
  const [, { showToast }] = useToast()
56
65
  const [{ configs }] = useConfig()
@@ -91,9 +100,12 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
91
100
  const [categoriesLayout, setCategoriesLayout] = useState<any>({})
92
101
  const [productListLayout, setProductListLayout] = useState<any>(null)
93
102
  const [isCategoryClicked, setCategoryClicked] = useState(false)
103
+ const [subcategoriesSelected, setSubcategoriesSelected] = useState([])
94
104
 
105
+ const isCheckoutMultiBusinessEnabled: Boolean = configs?.checkout_multi_business_enabled?.value === '1'
95
106
  const currentCart: any = Object.values(orderState.carts).find((cart: any) => cart?.business?.slug === business?.slug) ?? {}
96
-
107
+ const isOpenFiltProducts = isOpenSearchBar && !!searchValue
108
+ const filtProductsHeight = Platform.OS === 'ios' ? 0 : 35
97
109
  const onRedirect = (route: string, params?: any) => {
98
110
  navigation.navigate(route, params)
99
111
  }
@@ -112,13 +124,19 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
112
124
  }
113
125
 
114
126
  const handleUpsellingPage = () => {
115
- onRedirect('CheckoutNavigator', {
116
- screen: 'CheckoutPage',
117
- cartUuid: currentCart?.uuid,
118
- businessLogo: logo,
119
- businessName: business?.name,
120
- cartTotal: currentCart?.total
121
- })
127
+ if (isCheckoutMultiBusinessEnabled) {
128
+ onRedirect('CheckoutNavigator', {
129
+ screen: 'MultiCheckout'
130
+ })
131
+ } else {
132
+ onRedirect('CheckoutNavigator', {
133
+ screen: 'CheckoutPage',
134
+ cartUuid: currentCart?.uuid,
135
+ businessLogo: logo,
136
+ businessName: business?.name,
137
+ cartTotal: currentCart?.total
138
+ })
139
+ }
122
140
  setOpenUpselling(false)
123
141
  }
124
142
 
@@ -163,12 +181,41 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
163
181
  navigation?.canGoBack() ? navigation.goBack() : navigation.navigate('BottomTab')
164
182
  }
165
183
 
184
+ const adjustBusiness = async (adjustBusinessId: number) => {
185
+ const _carts = orderState?.carts?.[adjustBusinessId]
186
+ const products = _carts?.products
187
+ const unavailableProducts = products.filter((product: any) => product.valid !== true)
188
+ const alreadyRemoved = await _retrieveStoreData('already-removed')
189
+ _removeStoreData('already-removed')
190
+ if (unavailableProducts.length > 0) {
191
+ multiRemoveProducts && await multiRemoveProducts(unavailableProducts, _carts)
192
+ return
193
+ }
194
+
195
+ if (alreadyRemoved === 'removed') {
196
+ setAlertState({ open: true, content: [t('NOT_AVAILABLE_PRODUCT', 'This product is not available.')] })
197
+ }
198
+ }
199
+
200
+ const removeCartByReOrder = async () => {
201
+ const adjustBusinessId = await _retrieveStoreData('adjust-cart-products')
202
+ if (currentCart && adjustBusinessId) {
203
+ _removeStoreData('adjust-cart-products')
204
+ adjustBusiness(adjustBusinessId)
205
+ }
206
+ }
207
+
208
+ useEffect(() => {
209
+ removeCartByReOrder()
210
+ }, [currentCart])
211
+
166
212
  return (
167
- <SafeAreaView
213
+ <ContainerSafeAreaView
168
214
  style={{ flex: 1 }}
215
+ isOpenFiltProducts={isOpenFiltProducts}
169
216
  >
170
217
  <Animated.View style={{ position: 'relative' }}>
171
- <TopHeader>
218
+ <TopHeader isIos={Platform.OS === 'ios'}>
172
219
  {!isOpenSearchBar && (
173
220
  <>
174
221
  <View style={{ ...styles.headerItem, flex: 1 }}>
@@ -206,6 +253,47 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
206
253
  )}
207
254
  </TopHeader>
208
255
  </Animated.View>
256
+
257
+ {business?.categories?.length > 0 && isOpenFiltProducts && (
258
+ <FiltProductsContainer
259
+ style={{
260
+ height: Dimensions.get('window').height - filtProductsHeight
261
+ }}
262
+ >
263
+ <View style={{ padding: 20, backgroundColor: theme.colors.white }}>
264
+ <BusinessProductsList
265
+ categories={[
266
+ { id: null, name: t('ALL', 'All') },
267
+ { id: 'featured', name: t('FEATURED', 'Featured') },
268
+ ...business?.categories.sort((a: any, b: any) => a.rank - b.rank)
269
+ ]}
270
+ category={categorySelected}
271
+ categoryState={categoryState}
272
+ businessId={business.id}
273
+ errors={errors}
274
+ onProductClick={onProductClick}
275
+ handleSearchRedirect={handleSearchRedirect}
276
+ featured={featuredProducts}
277
+ searchValue={searchValue}
278
+ handleClearSearch={handleChangeSearch}
279
+ errorQuantityProducts={errorQuantityProducts}
280
+ handleCancelSearch={handleCancel}
281
+ categoriesLayout={categoriesLayout}
282
+ subcategoriesSelected={subcategoriesSelected}
283
+ lazyLoadProductsRecommended={business?.lazy_load_products_recommended}
284
+ setCategoriesLayout={setCategoriesLayout}
285
+ currentCart={currentCart}
286
+ setSubcategoriesSelected={setSubcategoriesSelected}
287
+ onClickCategory={handleChangeCategory}
288
+ handleUpdateProducts={handleUpdateProducts}
289
+ isFiltMode
290
+ />
291
+ </View>
292
+ </FiltProductsContainer>
293
+ )}
294
+ {isOpenFiltProducts && (
295
+ <BackgroundGray />
296
+ )}
209
297
  <BusinessProductsListingContainer
210
298
  stickyHeaderIndices={[2]}
211
299
  style={styles.mainContainer}
@@ -240,6 +328,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
240
328
  lazyLoadProductsRecommended={business?.lazy_load_products_recommended}
241
329
  setSelectedCategoryId={setSelectedCategoryId}
242
330
  setCategoryClicked={setCategoryClicked}
331
+
243
332
  />
244
333
  )}
245
334
  </>
@@ -267,8 +356,13 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
267
356
  errorQuantityProducts={errorQuantityProducts}
268
357
  handleCancelSearch={handleCancel}
269
358
  categoriesLayout={categoriesLayout}
359
+ subcategoriesSelected={subcategoriesSelected}
360
+ lazyLoadProductsRecommended={business?.lazy_load_products_recommended}
270
361
  setCategoriesLayout={setCategoriesLayout}
271
362
  currentCart={currentCart}
363
+ setSubcategoriesSelected={setSubcategoriesSelected}
364
+ onClickCategory={handleChangeCategory}
365
+ handleUpdateProducts={handleUpdateProducts}
272
366
  />
273
367
  </WrapContent>
274
368
  </>
@@ -290,6 +384,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
290
384
  categoryState={categoryState}
291
385
  isBusinessLoading={loading}
292
386
  errorQuantityProducts={errorQuantityProducts}
387
+ handleUpdateProducts={handleUpdateProducts}
293
388
  />
294
389
  </WrapContent>
295
390
  </>
@@ -298,16 +393,18 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
298
393
  {!loading && auth && currentCart?.products?.length > 0 && categoryState.products.length !== 0 && (
299
394
  <FloatingButton
300
395
  btnText={
301
- currentCart?.subtotal >= currentCart?.minimum
302
- ? t('VIEW_ORDER', 'View Order')
303
- : `${t('MINIMUN_SUBTOTAL_ORDER', 'Minimum subtotal order:')} ${parsePrice(currentCart?.minimum)}`
396
+ openUpselling
397
+ ? t('LOADING', 'Loading')
398
+ : currentCart?.subtotal >= currentCart?.minimum
399
+ ? t('VIEW_ORDER', 'View Order')
400
+ : `${t('MINIMUN_SUBTOTAL_ORDER', 'Minimum subtotal order:')} ${parsePrice(currentCart?.minimum)}`
304
401
  }
305
- isSecondaryBtn={currentCart?.subtotal < currentCart?.minimum}
402
+ isSecondaryBtn={currentCart?.subtotal < currentCart?.minimum || openUpselling}
306
403
  btnLeftValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
307
404
  btnRightValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
308
- btnLeftValue={currentCart?.products?.length}
405
+ btnLeftValue={currentCart?.products.reduce((prev: number, product: any) => prev + product.quantity, 0)}
309
406
  btnRightValue={parsePrice(currentCart?.total)}
310
- disabled={currentCart?.subtotal < currentCart?.minimum}
407
+ disabled={currentCart?.subtotal < currentCart?.minimum || openUpselling}
311
408
  handleClick={() => setOpenUpselling(true)}
312
409
  />
313
410
  )}
@@ -326,7 +423,14 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
326
423
  onRedirect={onRedirect}
327
424
  />
328
425
  )}
329
- </SafeAreaView>
426
+ <Alert
427
+ open={alertState?.open || false}
428
+ title=''
429
+ content={[t('NOT_AVAILABLE_PRODUCTS', 'These products are not available.')]}
430
+ onAccept={() => setAlertState({ open: false, content: [] })}
431
+ onClose={() => setAlertState({ open: false, content: [] })}
432
+ />
433
+ </ContainerSafeAreaView>
330
434
  )
331
435
  }
332
436
 
@@ -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,21 @@ 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
+ `
@@ -90,33 +90,12 @@ const BusinessReviewsUI = (props: BusinessReviewsParams) => {
90
90
  </View>
91
91
  );
92
92
 
93
- const ReviewItem = ({ comment, created_at, total, customer }: any) => (
93
+ const ReviewItem = ({ comment, created_at, total }: any) => (
94
94
  <View style={{ marginBottom: 30 }}>
95
- <View
96
- style={{ flexDirection: 'row', marginBottom: 19, alignItems: 'center' }}>
97
- <OIcon
98
- url={theme.images.dummies.customerPhoto}
99
- width={38}
100
- height={38}
101
- style={{
102
- borderRadius: 7.6,
103
- borderWidth: 1,
104
- borderColor: theme.colors.border,
105
- marginEnd: 9,
106
- }}
107
- />
108
- <View>
109
- <OText size={12} color={theme.colors.textNormal} weight={'500'}>
110
- {customer?.name || 'Jane Cooper'}
111
- </OText>
112
- <OText size={10} color={theme.colors.textSecondary}>
113
- {moment(created_at).format('MMMM d, yyyy • hh:mm')}
114
- </OText>
115
- </View>
116
- </View>
117
- <OText size={10} color={theme.colors.textNormal}>
118
- {comment}
95
+ <OText size={12} color={theme.colors.textSecondary}>
96
+ {moment(created_at).format('MMMM d, yyyy hh:mm')}
119
97
  </OText>
98
+ <OText size={12} color={theme.colors.textNormal}>{comment}</OText>
120
99
  </View>
121
100
  );
122
101
 
@@ -45,7 +45,6 @@ export const BusinessTypeFilterUI = (props: BusinessTypeFilterParams) => {
45
45
  const renderTypes = ({ item }: any) => {
46
46
  return (
47
47
  <TouchableOpacity
48
- key={item.id}
49
48
  onPress={() => handleChangeBusinessType(item.id)}
50
49
  style={{
51
50
  height: 34,
@@ -103,7 +102,7 @@ export const BusinessTypeFilterUI = (props: BusinessTypeFilterParams) => {
103
102
  showsHorizontalScrollIndicator={false}
104
103
  data={typesState?.types}
105
104
  renderItem={renderTypes}
106
- keyExtractor={(type) => type.name}
105
+ keyExtractor={(type, index) => `${type.name}_${index}`}
107
106
  />
108
107
  <TouchableOpacity
109
108
  style={{ marginLeft: 15 }}
@@ -1,6 +1,7 @@
1
1
  import React, { useCallback, useEffect, useRef, useState } from 'react';
2
2
  import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
3
3
  import Geolocation from '@react-native-community/geolocation'
4
+ import { getTrackingStatus, requestTrackingPermission } from 'react-native-tracking-transparency'
4
5
  import {
5
6
  View,
6
7
  StyleSheet,
@@ -47,7 +48,7 @@ import { getTypesText, convertToRadian } from '../../utils';
47
48
  import { OrderProgress } from '../OrderProgress';
48
49
  import { useFocusEffect, useIsFocused } from '@react-navigation/native';
49
50
 
50
- const PIXELS_TO_SCROLL = 1000;
51
+ const PIXELS_TO_SCROLL = 2000;
51
52
 
52
53
  const BusinessesListingUI = (props: BusinessesListingParams) => {
53
54
  const {
@@ -59,9 +60,10 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
59
60
  handleBusinessClick,
60
61
  paginationProps,
61
62
  handleChangeSearch,
62
- businessId
63
+ businessId,
64
+ isGuestUser,
65
+ handleUpdateBusinessList
63
66
  } = props;
64
-
65
67
  const theme = useTheme();
66
68
  const isFocused = useIsFocused();
67
69
  const appState = useRef(AppState.currentState)
@@ -117,11 +119,13 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
117
119
  const [featuredBusiness, setFeaturedBusinesses] = useState(Array);
118
120
  const [isFarAway, setIsFarAway] = useState(false)
119
121
  const [businessTypes, setBusinessTypes] = useState(null)
120
-
122
+ const [orderTypeValue, setOrderTypeValue] = useState(orderState?.options.value)
121
123
  const isPreorderEnabled = (configs?.preorder_status_enabled?.value === '1' || configs?.preorder_status_enabled?.value === 'true') &&
122
124
  Number(configs?.max_days_preorder?.value) > 0
123
-
125
+ const isPreOrderSetting = configs?.preorder_status_enabled?.value === '1'
124
126
  const timerId = useRef<any>(false)
127
+ const [favoriteIds, setFavoriteIds] = useState<any>([])
128
+
125
129
  // const panResponder = useRef(
126
130
  // PanResponder.create({
127
131
  // onMoveShouldSetPanResponder: (e, gestureState) => {
@@ -191,19 +195,35 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
191
195
  }
192
196
  }
193
197
 
198
+ const checkUserLocation = async () => {
199
+ let trackingStatus = await getTrackingStatus()
200
+ if (trackingStatus === 'not-determined') {
201
+ trackingStatus = await requestTrackingPermission()
202
+ }
203
+ if (trackingStatus === 'authorized' || trackingStatus === 'unavailable') {
204
+ Geolocation.getCurrentPosition((pos) => {
205
+ const crd = pos.coords
206
+ const distance = getDistance(crd.latitude, crd.longitude, orderState?.options?.address?.location?.lat, orderState?.options?.address?.location?.lng)
207
+ if (distance > 20) setIsFarAway(true)
208
+ else setIsFarAway(false)
209
+ }, (err) => {
210
+ console.log(`ERROR(${err.code}): ${err.message}`)
211
+ }, {
212
+ enableHighAccuracy: true, timeout: 15000, maximumAge: 10000
213
+ })
214
+ }
215
+ }
216
+
194
217
  useEffect(() => {
195
- Geolocation.getCurrentPosition((pos) => {
196
- const crd = pos.coords
197
- const distance = getDistance(crd.latitude, crd.longitude, orderState?.options?.address?.location?.lat, orderState?.options?.address?.location?.lng)
198
- if (distance > 20) setIsFarAway(true)
199
- else setIsFarAway(false)
200
- }, (err) => {
201
- console.log(`ERROR(${err.code}): ${err.message}`)
202
- }, {
203
- enableHighAccuracy: true, timeout: 15000, maximumAge: 10000
204
- })
218
+ checkUserLocation()
205
219
  }, [orderState?.options?.address?.location])
206
220
 
221
+ useEffect(() => {
222
+ if(!orderState?.loading){
223
+ setOrderTypeValue(orderState?.options?.type)
224
+ }
225
+ }, [orderState?.options?.type])
226
+
207
227
  useFocusEffect(
208
228
  useCallback(() => {
209
229
  resetInactivityTimeout()
@@ -211,6 +231,17 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
211
231
  }, [navigation])
212
232
  )
213
233
 
234
+ useEffect(() => {
235
+ if (!businessesList?.businesses?.length) return
236
+ const ids = [...favoriteIds]
237
+ businessesList.businesses.forEach((business: any) => {
238
+ if (business?.favorite) {
239
+ ids.push(business?.id)
240
+ }
241
+ })
242
+ setFavoriteIds([...new Set(ids)])
243
+ }, [businessesList?.businesses?.length])
244
+
214
245
  return (
215
246
  <ScrollView style={styles.container} onScroll={(e) => handleScroll(e)} showsVerticalScrollIndicator={false}
216
247
  refreshControl={
@@ -221,7 +252,7 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
221
252
  }
222
253
  >
223
254
  <HeaderWrapper
224
- source={theme.images.backgrounds.business_list_header}
255
+ source={theme.images.general.homeHero}
225
256
  style={{ paddingTop: top + 20 }}>
226
257
  {!auth && (
227
258
  <TouchableOpacity onPress={() => navigation?.canGoBack() && navigation.goBack()} style={{ position: 'absolute', marginStart: 40, paddingVertical: 20 }}>
@@ -237,6 +268,7 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
237
268
  : navigation.navigate('AddressForm', {
238
269
  address: orderState.options?.address,
239
270
  isFromBusinesses: true,
271
+ isGuestUser: isGuestUser
240
272
  })
241
273
  }>
242
274
  <OIcon
@@ -258,33 +290,35 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
258
290
  )}
259
291
  <OrderControlContainer>
260
292
  <View style={styles.wrapperOrderOptions}>
261
- <WrapMomentOption onPress={() => navigation.navigate('OrderTypes', { configTypes: configTypes })}>
262
- <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textSecondary}>{t(getTypesText(orderState?.options?.type || 1), 'Delivery')}</OText>
293
+ <WrapMomentOption onPress={() => navigation.navigate('OrderTypes', { configTypes: configTypes, setOrderTypeValue })}>
294
+ <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textSecondary}>{t(getTypesText(orderTypeValue || orderState?.options?.type || 1), 'Delivery')}</OText>
263
295
  <OIcon
264
296
  src={theme.images.general.arrow_down}
265
297
  width={10}
266
298
  style={{ marginStart: 8 }}
267
299
  />
268
300
  </WrapMomentOption>
269
- <WrapMomentOption
270
- onPress={() => handleMomentClick()}>
271
- <OText
272
- size={12}
273
- numberOfLines={1}
274
- ellipsizeMode="tail"
275
- color={theme.colors.textSecondary}>
276
- {orderState.options?.momentß
277
- ? parseDate(orderState.options?.moment, { outputFormat: configs?.dates_moment_format?.value })
278
- : t('ASAP_ABBREVIATION', 'ASAP')}
279
- </OText>
280
- {isPreorderEnabled && (
281
- <OIcon
282
- src={theme.images.general.arrow_down}
283
- width={10}
284
- style={{ marginStart: 8 }}
285
- />
286
- )}
287
- </WrapMomentOption>
301
+ {isPreOrderSetting && (
302
+ <WrapMomentOption
303
+ onPress={() => handleMomentClick()}>
304
+ <OText
305
+ size={12}
306
+ numberOfLines={1}
307
+ ellipsizeMode="tail"
308
+ color={theme.colors.textSecondary}>
309
+ {orderState.options?.moment
310
+ ? parseDate(orderState.options?.moment, { outputFormat: configs?.dates_moment_format?.value })
311
+ : t('ASAP_ABBREVIATION', 'ASAP')}
312
+ </OText>
313
+ {isPreorderEnabled && (
314
+ <OIcon
315
+ src={theme.images.general.arrow_down}
316
+ width={10}
317
+ style={{ marginStart: 8 }}
318
+ />
319
+ )}
320
+ </WrapMomentOption>
321
+ )}
288
322
 
289
323
  {!businessId && (
290
324
  <SearchBar
@@ -296,9 +330,9 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
296
330
  onCancel={() => handleChangeSearch('')}
297
331
  placeholder={t('SEARCH', 'Search')}
298
332
  height={26}
299
- isDisabled={configs?.advanced_business_search_enabled?.value === '1' || !businessTypes}
333
+ isDisabled={!businessTypes}
300
334
  inputStyle={{ ...styles.searchInput, ...Platform.OS === 'ios' ? {} : { paddingBottom: 4 } }}
301
- onPress={() => { configs?.advanced_business_search_enabled?.value === '1' && navigation.navigate('BusinessSearch', { businessTypes }) }}
335
+ onSubmitEditing={() => { configs?.advanced_business_search_enabled?.value === '1' && navigation.navigate('BusinessSearch', { businessTypes, defaultTerm: searchValue }) }}
302
336
  />
303
337
  )}
304
338
 
@@ -316,7 +350,7 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
316
350
  {
317
351
  !businessId && !props.franchiseId && featuredBusiness && featuredBusiness.length > 0 && (
318
352
  <FeaturedWrapper>
319
- <OText size={16} style={{ marginLeft: 40 }} weight={Platform.OS === 'ios' ? '600' : 'bold'}>{t('FEATURED_BUSINESS', 'Featured business')}</OText>
353
+ <OText size={16} style={{ marginLeft: 40 }} weight={Platform.OS === 'ios' ? '600' : 'bold'}>{t('BUSINESS_FEATURE', 'Featured business')}</OText>
320
354
  <ScrollView
321
355
  showsHorizontalScrollIndicator={false}
322
356
  nestedScrollEnabled
@@ -324,7 +358,6 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
324
358
  {featuredBusiness.map((bAry: any, idx) => (
325
359
  <View key={'f-listing_' + idx}>
326
360
  <BusinessFeaturedController
327
- key={bAry[0].id}
328
361
  business={bAry[0]}
329
362
  isBusinessOpen={bAry[0]?.open}
330
363
  handleCustomClick={handleBusinessClick}
@@ -332,7 +365,6 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
332
365
  />
333
366
  {bAry.length > 1 && (
334
367
  <BusinessFeaturedController
335
- key={bAry[1].id}
336
368
  business={bAry[1]}
337
369
  isBusinessOpen={bAry[1]?.open}
338
370
  handleCustomClick={handleBusinessClick}
@@ -348,7 +380,12 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
348
380
  <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100 }} />
349
381
  {
350
382
  !businessId && !props.franchiseId && (
351
- <HighestRatedBusinesses onBusinessClick={handleBusinessClick} navigation={navigation} />
383
+ <HighestRatedBusinesses
384
+ onBusinessClick={handleBusinessClick}
385
+ navigation={navigation}
386
+ favoriteIds={favoriteIds}
387
+ setFavoriteIds={setFavoriteIds}
388
+ />
352
389
  )
353
390
  }
354
391
  <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100 }} />
@@ -371,9 +408,9 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
371
408
  />
372
409
  )}
373
410
  {businessesList.businesses?.map(
374
- (business: any) => (
411
+ (business: any, i : number) => (
375
412
  <BusinessController
376
- key={business.id}
413
+ key={`${business.id}_` + i}
377
414
  business={business}
378
415
  isBusinessOpen={business.open}
379
416
  handleCustomClick={handleBusinessClick}
@@ -387,6 +424,9 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
387
424
  businessDeliveryTime={business?.delivery_time}
388
425
  businessPickupTime={business?.pickup_time}
389
426
  businessDistance={business?.distance}
427
+ handleUpdateBusinessList={handleUpdateBusinessList}
428
+ favoriteIds={favoriteIds}
429
+ setFavoriteIds={setFavoriteIds}
390
430
  />
391
431
  )
392
432
  )}