ordering-ui-react-native 0.15.34 → 0.15.36-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.
- package/package.json +4 -2
- package/src/DeliveryApp.tsx +43 -1
- package/src/components/BusinessController/index.tsx +8 -2
- package/src/components/BusinessTypeFilter/index.tsx +4 -1
- package/src/components/BusinessesListing/index.tsx +1 -1
- package/src/components/Checkout/index.tsx +23 -3
- package/src/components/DriverTips/index.tsx +11 -6
- package/src/components/LanguageSelector/index.tsx +7 -2
- package/src/components/LoginForm/index.tsx +3 -1
- package/src/components/OrderDetails/index.tsx +2 -2
- package/src/components/PaymentOptions/index.tsx +9 -16
- package/src/components/PaymentOptionsWebView/index.tsx +123 -124
- package/src/components/SignupForm/index.tsx +3 -1
- package/src/components/SingleProductCard/index.tsx +16 -4
- package/src/components/StripeElementsForm/index.tsx +27 -48
- package/src/components/StripeMethodForm/index.tsx +1 -2
- package/src/components/UpsellingProducts/index.tsx +1 -1
- package/src/components/UserProfileForm/index.tsx +63 -6
- package/src/components/UserProfileForm/styles.tsx +8 -0
- package/src/components/VerifyPhone/styles.tsx +1 -2
- package/src/components/shared/OModal.tsx +1 -1
- package/src/config.json +0 -2
- package/src/hooks/useCountdownTimer.tsx +26 -0
- package/src/navigators/CheckoutNavigator.tsx +6 -0
- package/src/navigators/HomeNavigator.tsx +12 -0
- package/src/pages/BusinessProductsList.tsx +1 -0
- package/src/pages/BusinessesListing.tsx +1 -1
- package/src/pages/Checkout.tsx +1 -1
- package/src/pages/MultiCheckout.tsx +31 -0
- package/src/pages/MultiOrdersDetails.tsx +27 -0
- package/src/pages/Sessions.tsx +22 -0
- package/src/types/index.tsx +5 -11
- package/src/utils/index.tsx +68 -1
- package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +103 -15
- package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -0
- package/themes/business/src/components/Chat/index.tsx +38 -86
- package/themes/business/src/components/DriverMap/index.tsx +6 -5
- package/themes/business/src/components/Home/index.tsx +128 -55
- package/themes/business/src/components/Home/styles.tsx +8 -1
- package/themes/business/src/components/LoginForm/index.tsx +89 -2
- package/themes/business/src/components/LoginForm/styles.tsx +6 -0
- package/themes/business/src/components/LogoutButton/index.tsx +1 -1
- package/themes/business/src/components/NewOrderNotification/index.tsx +79 -105
- package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
- package/themes/business/src/components/OrderDetails/Delivery.tsx +32 -15
- package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +157 -89
- package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +6 -0
- package/themes/business/src/components/OrderDetails/styles.tsx +7 -0
- package/themes/business/src/components/OrdersListManager/index.tsx +52 -49
- package/themes/business/src/components/OrdersOption/index.tsx +57 -50
- package/themes/business/src/components/PreviousOrders/index.tsx +50 -14
- package/themes/business/src/components/ProductItemAccordion/index.tsx +2 -2
- package/themes/business/src/components/shared/OModal.tsx +1 -1
- package/themes/business/src/types/index.tsx +5 -1
- package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
- package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
- package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
- package/themes/kiosk/src/components/Cart/index.tsx +99 -25
- package/themes/kiosk/src/components/Cart/styles.tsx +6 -0
- package/themes/kiosk/src/components/Checkout/index.tsx +34 -22
- package/themes/kiosk/src/components/CustomerName/index.tsx +0 -6
- package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
- package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
- package/themes/kiosk/src/components/OrderDetails/index.tsx +165 -65
- package/themes/kiosk/src/components/OrderDetails/styles.tsx +5 -0
- package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +10 -12
- package/themes/kiosk/src/components/PaymentOptions/index.tsx +1 -1
- package/themes/kiosk/src/components/ProductForm/index.tsx +2 -2
- package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
- package/themes/kiosk/src/types/index.d.ts +2 -0
- package/themes/original/index.tsx +188 -1
- package/themes/original/src/components/ActiveOrders/index.tsx +15 -132
- package/themes/original/src/components/ActiveOrders/styles.tsx +0 -54
- package/themes/original/src/components/AddressForm/index.tsx +15 -10
- package/themes/original/src/components/AddressList/index.tsx +56 -18
- package/themes/original/src/components/AppleLogin/index.tsx +117 -78
- package/themes/original/src/components/BusinessBasicInformation/index.tsx +96 -45
- package/themes/original/src/components/BusinessBasicInformation/styles.tsx +28 -1
- package/themes/original/src/components/BusinessController/index.tsx +56 -16
- package/themes/original/src/components/BusinessController/styles.tsx +27 -0
- package/themes/original/src/components/BusinessFeaturedController/index.tsx +20 -1
- package/themes/original/src/components/BusinessFeaturedController/styles.tsx +23 -0
- package/themes/original/src/components/BusinessItemAccordion/index.tsx +4 -3
- package/themes/original/src/components/BusinessItemAccordion/styles.tsx +3 -1
- package/themes/original/src/components/BusinessListingSearch/index.tsx +125 -7
- package/themes/original/src/components/BusinessListingSearch/styles.tsx +14 -1
- package/themes/original/src/components/BusinessMenuList/index.tsx +11 -4
- package/themes/original/src/components/BusinessPreorder/index.tsx +142 -122
- package/themes/original/src/components/BusinessProductsCategories/index.tsx +9 -7
- package/themes/original/src/components/BusinessProductsList/CategoryDescription/index.tsx +44 -0
- package/themes/original/src/components/BusinessProductsList/index.tsx +139 -36
- package/themes/original/src/components/BusinessProductsList/styles.tsx +29 -2
- package/themes/original/src/components/BusinessProductsListing/index.tsx +125 -21
- package/themes/original/src/components/BusinessProductsListing/styles.tsx +22 -0
- package/themes/original/src/components/BusinessReviews/index.tsx +4 -25
- package/themes/original/src/components/BusinessTypeFilter/index.tsx +1 -2
- package/themes/original/src/components/BusinessesListing/index.tsx +85 -45
- package/themes/original/src/components/Cart/index.tsx +60 -43
- package/themes/original/src/components/CartContent/index.tsx +2 -2
- package/themes/original/src/components/Checkout/index.tsx +59 -48
- package/themes/original/src/components/DriverTips/index.tsx +17 -12
- package/themes/original/src/components/Favorite/index.tsx +91 -0
- package/themes/original/src/components/Favorite/styles.tsx +22 -0
- package/themes/original/src/components/FavoriteList/index.tsx +287 -0
- package/themes/original/src/components/FavoriteList/styles.tsx +5 -0
- package/themes/original/src/components/ForgotPasswordForm/index.tsx +84 -4
- package/themes/original/src/components/GPSButton/index.tsx +15 -8
- package/themes/original/src/components/GoogleMap/index.tsx +1 -0
- package/themes/original/src/components/Help/index.tsx +21 -4
- package/themes/original/src/components/HighestRatedBusinesses/index.tsx +18 -1
- package/themes/original/src/components/Home/index.tsx +1 -1
- package/themes/original/src/components/LastOrders/index.tsx +12 -1
- package/themes/original/src/components/LoginForm/Otp/index.tsx +90 -0
- package/themes/original/src/components/LoginForm/Otp/styles.tsx +7 -0
- package/themes/original/src/components/LoginForm/index.tsx +394 -155
- package/themes/original/src/components/LoginForm/styles.tsx +7 -4
- package/themes/original/src/components/LogoutButton/index.tsx +7 -1
- package/themes/original/src/components/MessageListing/index.tsx +10 -1
- package/themes/original/src/components/Messages/index.tsx +6 -1
- package/themes/original/src/components/Messages/styles.tsx +1 -3
- package/themes/original/src/components/MomentOption/index.tsx +10 -1
- package/themes/original/src/components/MomentOption/styles.tsx +1 -1
- package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +243 -0
- package/themes/original/src/components/MultiCartsPaymethodsAndWallets/styles.tsx +46 -0
- package/themes/original/src/components/MultiCheckout/index.tsx +298 -0
- package/themes/original/src/components/MultiCheckout/styles.tsx +59 -0
- package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +372 -0
- package/themes/original/src/components/MultiOrdersDetails/index.tsx +258 -0
- package/themes/original/src/components/MultiOrdersDetails/styles.tsx +50 -0
- package/themes/original/src/components/OrderDetails/index.tsx +56 -33
- package/themes/original/src/components/OrderDetails/styles.tsx +1 -2
- package/themes/original/src/components/OrderProgress/index.tsx +3 -3
- package/themes/original/src/components/OrderProgress/styles.tsx +1 -0
- package/themes/original/src/components/OrderSummary/index.tsx +3 -3
- package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -2
- package/themes/original/src/components/OrdersOption/index.tsx +57 -56
- package/themes/original/src/components/OrdersOption/styles.tsx +0 -6
- package/themes/original/src/components/PaymentOptionCash/index.tsx +2 -2
- package/themes/original/src/components/PaymentOptionWallet/index.tsx +22 -24
- package/themes/original/src/components/PaymentOptionWallet/styles.tsx +1 -1
- package/themes/original/src/components/PaymentOptions/index.tsx +9 -21
- package/themes/original/src/components/PhoneInputNumber/index.tsx +1 -1
- package/themes/original/src/components/PreviousOrders/index.tsx +18 -145
- package/themes/original/src/components/ProductForm/index.tsx +76 -61
- package/themes/original/src/components/ProductForm/styles.tsx +0 -1
- package/themes/original/src/components/ProductItemAccordion/index.tsx +2 -2
- package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -12
- package/themes/original/src/components/Promotions/index.tsx +250 -0
- package/themes/original/src/components/Promotions/styles.tsx +60 -0
- package/themes/original/src/components/SearchBar/index.tsx +4 -1
- package/themes/original/src/components/Sessions/index.tsx +160 -0
- package/themes/original/src/components/Sessions/styles.tsx +15 -0
- package/themes/original/src/components/SignupForm/index.tsx +9 -4
- package/themes/original/src/components/SingleOrderCard/index.tsx +282 -0
- package/themes/original/src/components/SingleOrderCard/styles.tsx +54 -0
- package/themes/original/src/components/SingleProductCard/index.tsx +82 -30
- package/themes/original/src/components/SingleProductCard/styles.tsx +28 -1
- package/themes/original/src/components/StripeElementsForm/index.tsx +10 -2
- package/themes/original/src/components/StripeElementsForm/naked.tsx +2 -2
- package/themes/original/src/components/TaxInformation/index.tsx +10 -4
- package/themes/original/src/components/UpsellingProducts/index.tsx +86 -74
- package/themes/original/src/components/UserDetails/index.tsx +5 -96
- package/themes/original/src/components/UserFormDetails/index.tsx +34 -24
- package/themes/original/src/components/UserProfile/index.tsx +62 -8
- package/themes/original/src/components/UserProfileForm/index.tsx +20 -18
- package/themes/original/src/components/UserVerification/index.tsx +178 -192
- package/themes/original/src/components/VerifyPhone/index.tsx +10 -7
- package/themes/original/src/components/VerifyPhone/styles.tsx +2 -1
- package/themes/original/src/components/Wallets/index.tsx +76 -9
- package/themes/original/src/components/Wallets/styles.tsx +21 -0
- package/themes/original/src/components/shared/HeaderTitle.tsx +21 -0
- package/themes/original/src/components/shared/OModal.tsx +4 -2
- package/themes/original/src/components/shared/index.tsx +2 -0
- package/themes/original/src/config/constants.tsx +6 -6
- package/themes/original/src/types/index.tsx +107 -9
- package/themes/original/src/utils/index.tsx +28 -2
- package/themes/single-business/src/components/AddressList/index.tsx +1 -1
- package/themes/single-business/src/components/OrderTypeSelector/index.tsx +6 -6
- package/themes/single-business/src/components/UserProfile/index.tsx +1 -1
- package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
|
@@ -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 =
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
<
|
|
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
|
-
|
|
302
|
-
? t('
|
|
303
|
-
:
|
|
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
|
|
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
|
-
|
|
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
|
|
93
|
+
const ReviewItem = ({ comment, created_at, total }: any) => (
|
|
94
94
|
<View style={{ marginBottom: 30 }}>
|
|
95
|
-
<
|
|
96
|
-
|
|
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 =
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
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={
|
|
333
|
+
isDisabled={!businessTypes}
|
|
300
334
|
inputStyle={{ ...styles.searchInput, ...Platform.OS === 'ios' ? {} : { paddingBottom: 4 } }}
|
|
301
|
-
|
|
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('
|
|
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
|
|
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
|
)}
|