ordering-ui-react-native 0.14.91 → 0.14.93-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 +6 -3
- package/src/DeliveryApp.tsx +34 -2
- package/src/assets/images/no-network.png +0 -0
- package/src/components/BusinessTypeFilter/index.tsx +9 -2
- package/src/components/BusinessTypeFilter/styles.tsx +1 -1
- package/src/components/BusinessesListing/index.tsx +1 -1
- package/src/components/Cart/index.tsx +1 -1
- package/src/components/Checkout/index.tsx +0 -1
- package/src/components/Home/index.tsx +3 -5
- package/src/components/LanguageSelector/index.tsx +65 -97
- package/src/components/LanguageSelector/styles.tsx +4 -17
- package/src/components/Messages/index.tsx +38 -30
- package/src/components/MomentOption/index.tsx +3 -1
- package/src/components/OrderDetails/index.tsx +26 -5
- package/src/components/PaymentOptions/index.tsx +7 -16
- package/src/components/PaymentOptionsWebView/index.tsx +123 -124
- package/src/components/ProductForm/index.tsx +1 -1
- package/src/components/ProductForm/styles.tsx +1 -0
- package/src/components/StripeElementsForm/index.tsx +27 -48
- package/src/components/UserProfileForm/index.tsx +35 -1
- package/src/components/VerifyPhone/styles.tsx +1 -2
- package/src/config.json +0 -2
- package/src/pages/Checkout.tsx +1 -1
- package/src/providers/AlertProvider.tsx +4 -1
- package/src/theme.json +2 -1
- package/src/types/index.tsx +2 -9
- package/src/utils/index.tsx +2 -1
- package/themes/business/index.tsx +4 -0
- package/themes/business/src/components/Chat/index.tsx +32 -31
- package/themes/business/src/components/NetworkError/index.tsx +61 -0
- package/themes/business/src/components/NetworkError/styles.tsx +11 -0
- package/themes/business/src/components/OrderDetails/Business.tsx +1 -0
- package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +85 -17
- package/themes/business/src/components/OrdersListManager/index.tsx +871 -0
- package/themes/business/src/components/OrdersListManager/styles.tsx +123 -0
- package/themes/business/src/components/OrdersListManager/utils.tsx +216 -0
- package/themes/business/src/components/OrdersOption/index.tsx +18 -68
- package/themes/business/src/components/OrdersOption/styles.tsx +2 -5
- package/themes/business/src/components/PreviousOrders/index.tsx +80 -23
- package/themes/business/src/types/index.tsx +4 -0
- 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/index.tsx +2 -0
- package/themes/kiosk/src/components/BusinessController/index.tsx +27 -6
- package/themes/kiosk/src/components/BusinessController/styles.tsx +1 -1
- package/themes/kiosk/src/components/BusinessProductsListing/index.tsx +51 -24
- package/themes/kiosk/src/components/Cart/index.tsx +1 -1
- package/themes/kiosk/src/components/CartBottomSheet/index.tsx +1 -1
- package/themes/kiosk/src/components/CartBottomSheet/styles.tsx +1 -1
- package/themes/kiosk/src/components/CartContent/index.tsx +13 -3
- package/themes/kiosk/src/components/CartItem/index.tsx +20 -8
- package/themes/kiosk/src/components/CategoriesMenu/index.tsx +7 -5
- package/themes/kiosk/src/components/CustomerName/index.tsx +89 -88
- package/themes/kiosk/src/components/Intro/index.tsx +13 -13
- package/themes/kiosk/src/components/LanguageSelector/index.tsx +12 -8
- package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
- package/themes/kiosk/src/components/NetworkError/index.tsx +60 -0
- package/themes/kiosk/src/components/NetworkError/styles.tsx +11 -0
- package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
- package/themes/kiosk/src/components/OrderDetails/index.tsx +2 -2
- package/themes/kiosk/src/components/OrderSummary/index.tsx +1 -1
- package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +10 -12
- package/themes/kiosk/src/components/ProductForm/index.tsx +172 -124
- package/themes/kiosk/src/components/ProductForm/styles.tsx +1 -1
- package/themes/kiosk/src/components/ProductOption/index.tsx +1 -0
- package/themes/kiosk/src/components/ProductOption/styles.tsx +1 -0
- package/themes/kiosk/src/components/UpsellingProducts/index.tsx +48 -34
- package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
- package/themes/kiosk/src/components/shared/OCard.tsx +112 -78
- package/themes/kiosk/src/types/index.d.ts +4 -0
- package/themes/original/index.tsx +36 -6
- package/themes/original/src/components/AddressForm/index.tsx +15 -10
- package/themes/original/src/components/AddressList/index.tsx +27 -1
- package/themes/original/src/components/AnalyticsSegment/index.tsx +127 -0
- package/themes/original/src/components/BusinessBasicInformation/index.tsx +75 -40
- package/themes/original/src/components/BusinessController/index.tsx +34 -18
- package/themes/original/src/components/BusinessMenuList/index.tsx +14 -5
- package/themes/original/src/components/BusinessPreorder/index.tsx +142 -121
- package/themes/original/src/components/BusinessProductsCategories/index.tsx +7 -5
- package/themes/original/src/components/BusinessProductsList/index.tsx +52 -8
- package/themes/original/src/components/BusinessProductsListing/index.tsx +21 -15
- package/themes/original/src/components/BusinessReviews/index.tsx +4 -3
- package/themes/original/src/components/BusinessesListing/index.tsx +39 -52
- package/themes/original/src/components/Cart/index.tsx +42 -9
- package/themes/original/src/components/CartContent/index.tsx +2 -2
- package/themes/original/src/components/Checkout/index.tsx +56 -32
- package/themes/original/src/components/Checkout/styles.tsx +7 -0
- package/themes/original/src/components/CouponControl/index.tsx +1 -0
- package/themes/original/src/components/DriverTips/index.tsx +1 -1
- package/themes/original/src/components/ForgotPasswordForm/index.tsx +8 -12
- package/themes/original/src/components/HighestRatedBusinesses/index.tsx +105 -90
- package/themes/original/src/components/LoginForm/index.tsx +83 -68
- package/themes/original/src/components/Messages/index.tsx +52 -45
- package/themes/original/src/components/Messages/styles.tsx +1 -3
- package/themes/original/src/components/MomentOption/index.tsx +127 -152
- package/themes/original/src/components/MomentOption/styles.tsx +42 -18
- package/themes/original/src/components/NetworkError/index.tsx +61 -0
- package/themes/original/src/components/NetworkError/styles.tsx +11 -0
- package/themes/original/src/components/OrderDetails/index.tsx +103 -124
- package/themes/original/src/components/OrderDetails/styles.tsx +3 -1
- package/themes/original/src/components/OrderProgress/index.tsx +5 -6
- package/themes/original/src/components/OrderSummary/index.tsx +34 -1
- package/themes/original/src/components/OrdersOption/index.tsx +18 -42
- package/themes/original/src/components/OrdersOption/styles.tsx +0 -5
- package/themes/original/src/components/PaymentOptions/index.tsx +24 -25
- package/themes/original/src/components/PhoneInputNumber/index.tsx +15 -8
- package/themes/original/src/components/PlaceSpot/index.tsx +114 -0
- package/themes/original/src/components/PlaceSpot/styles.tsx +11 -0
- package/themes/original/src/components/PreviousOrders/index.tsx +19 -13
- package/themes/original/src/components/ProductForm/index.tsx +154 -105
- package/themes/original/src/components/ProductForm/styles.tsx +5 -3
- package/themes/original/src/components/ProductOptionSubOption/index.tsx +6 -1
- package/themes/original/src/components/ReviewOrder/index.tsx +10 -9
- package/themes/original/src/components/ReviewProducts/index.tsx +1 -1
- package/themes/original/src/components/SignupForm/index.tsx +173 -154
- package/themes/original/src/components/SingleProductCard/index.tsx +6 -13
- package/themes/original/src/components/SingleProductCard/styles.tsx +1 -1
- package/themes/original/src/components/StripeElementsForm/index.tsx +55 -72
- package/themes/original/src/components/UpsellingProducts/index.tsx +6 -6
- package/themes/original/src/components/UserDetails/index.tsx +4 -95
- package/themes/original/src/components/UserFormDetails/index.tsx +2 -14
- package/themes/original/src/components/UserProfile/index.tsx +16 -11
- package/themes/original/src/components/UserProfileForm/index.tsx +16 -8
- 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/shared/HeaderTitle.tsx +20 -0
- package/themes/original/src/components/shared/index.tsx +2 -0
- package/themes/original/src/types/index.tsx +28 -9
- package/themes/single-business/src/components/OrderTypeSelector/index.tsx +5 -5
- package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
- package/src/components/StripeMethodForm/index.tsx +0 -163
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
2
|
import { ProductsList, useLanguage, useUtils, useConfig } from 'ordering-components/native';
|
|
3
3
|
import { SingleProductCard } from '../SingleProductCard';
|
|
4
4
|
import { NotFoundSource } from '../NotFoundSource';
|
|
5
5
|
import { BusinessProductsListParams } from '../../types';
|
|
6
|
-
import { OIcon, OText } from '../shared';
|
|
6
|
+
import { OButton, OIcon, OModal, OText } from '../shared';
|
|
7
7
|
import { ProductsContainer, ErrorMessage, WrapperNotFound } from './styles';
|
|
8
8
|
import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
|
|
9
9
|
import { View } from 'react-native';
|
|
10
10
|
import { StyleSheet } from 'react-native';
|
|
11
|
+
import { useTheme } from 'styled-components/native';
|
|
11
12
|
|
|
12
13
|
const BusinessProductsListUI = (props: BusinessProductsListParams) => {
|
|
13
14
|
const {
|
|
@@ -32,8 +33,9 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
|
|
|
32
33
|
const [, t] = useLanguage();
|
|
33
34
|
const [{ optimizeImage }] = useUtils()
|
|
34
35
|
const [{ configs }] = useConfig()
|
|
36
|
+
const theme = useTheme()
|
|
35
37
|
const isUseParentCategory = configs?.use_parent_category?.value === 'true' || configs?.use_parent_category?.value === '1'
|
|
36
|
-
|
|
38
|
+
const [openDescription, setOpenDescription] = useState<any>(null)
|
|
37
39
|
const handleOnLayout = (event: any, categoryId: any) => {
|
|
38
40
|
const _categoriesLayout = { ...categoriesLayout }
|
|
39
41
|
const categoryKey = 'cat_' + categoryId
|
|
@@ -42,7 +44,7 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
|
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
return (
|
|
45
|
-
<ProductsContainer>
|
|
47
|
+
<ProductsContainer renderToHardwareTextureAndroid={categoryState.loading || isBusinessLoading}>
|
|
46
48
|
{category.id &&
|
|
47
49
|
categoryState.products?.sort((a: any, b: any) => a.rank - b.rank).map((product: any) => (
|
|
48
50
|
<SingleProductCard
|
|
@@ -84,8 +86,11 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
|
|
|
84
86
|
|
|
85
87
|
{!category?.id && categories.filter(category => category?.id !== null).map((category, i, _categories) => {
|
|
86
88
|
const products = !isUseParentCategory
|
|
87
|
-
? categoryState?.products?.filter((product
|
|
88
|
-
: categoryState?.products?.filter((product
|
|
89
|
+
? categoryState?.products?.filter((product: any) => product?.category_id === category?.id) ?? []
|
|
90
|
+
: categoryState?.products?.filter((product: any) => category?.children?.some((cat: any) => cat.category_id === product?.category_id)) ?? []
|
|
91
|
+
|
|
92
|
+
const shortCategoryDescription = category?.description?.length > 80 ? `${category?.description?.substring(0, 80)}...` : category?.description
|
|
93
|
+
|
|
89
94
|
return (
|
|
90
95
|
<React.Fragment key={'cat_' + category.id}>
|
|
91
96
|
{products.length > 0 && (
|
|
@@ -96,7 +101,7 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
|
|
|
96
101
|
>
|
|
97
102
|
<View style={bpStyles.catIcon}>
|
|
98
103
|
<OIcon
|
|
99
|
-
url={optimizeImage(category.image, '
|
|
104
|
+
url={optimizeImage(category.image, 'h_250,c_limit')}
|
|
100
105
|
width={41}
|
|
101
106
|
height={41}
|
|
102
107
|
style={{ borderRadius: 7.6 }}
|
|
@@ -106,6 +111,28 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
|
|
|
106
111
|
{category.name}
|
|
107
112
|
</OText>
|
|
108
113
|
</View>
|
|
114
|
+
{!!category?.description && (
|
|
115
|
+
<View style={{ position: 'relative' }}>
|
|
116
|
+
<OText size={12} weight={'500'} mBottom={5}>
|
|
117
|
+
{shortCategoryDescription}
|
|
118
|
+
{category?.description?.length > 80 && (
|
|
119
|
+
<OButton
|
|
120
|
+
style={{ height: 15, paddingRight: 0, paddingLeft: 0, borderWidth: 0 }}
|
|
121
|
+
text={t('SEE_MORE', 'See more')}
|
|
122
|
+
parentStyle={{ padding: 0 }}
|
|
123
|
+
onClick={() => setOpenDescription(category)}
|
|
124
|
+
bgColor='transparent'
|
|
125
|
+
textStyle={{
|
|
126
|
+
fontSize: 12,
|
|
127
|
+
borderBottomWidth: 1,
|
|
128
|
+
borderBottomColor: theme.colors.primary,
|
|
129
|
+
color: theme.colors.primary
|
|
130
|
+
}}
|
|
131
|
+
/>
|
|
132
|
+
)}
|
|
133
|
+
</OText>
|
|
134
|
+
</View>
|
|
135
|
+
)}
|
|
109
136
|
<>
|
|
110
137
|
{products.sort((a: any, b: any) => a.rank - b.rank).map((product: any, i: any) => (
|
|
111
138
|
<SingleProductCard
|
|
@@ -188,12 +215,29 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
|
|
|
188
215
|
<OText>{e}</OText>
|
|
189
216
|
</ErrorMessage>
|
|
190
217
|
))}
|
|
218
|
+
<OModal
|
|
219
|
+
open={!!openDescription}
|
|
220
|
+
title={openDescription?.name}
|
|
221
|
+
onClose={() => setOpenDescription(null)}
|
|
222
|
+
>
|
|
223
|
+
<View style={{ padding: 20 }}>
|
|
224
|
+
{!!openDescription?.image && (
|
|
225
|
+
<OIcon
|
|
226
|
+
url={optimizeImage(openDescription?.image, 'h_100,c_limit')}
|
|
227
|
+
width={240}
|
|
228
|
+
height={240}
|
|
229
|
+
style={{ borderRadius: 7.6 }}
|
|
230
|
+
/>
|
|
231
|
+
)}
|
|
232
|
+
<OText>{openDescription?.description}</OText>
|
|
233
|
+
</View>
|
|
234
|
+
</OModal>
|
|
191
235
|
</ProductsContainer>
|
|
192
236
|
);
|
|
193
237
|
};
|
|
194
238
|
|
|
195
239
|
const bpStyles = StyleSheet.create({
|
|
196
|
-
catWrap: { flexDirection: 'row', alignItems: 'center',
|
|
240
|
+
catWrap: { flexDirection: 'row', alignItems: 'center', marginBottom: 19 },
|
|
197
241
|
catIcon: {
|
|
198
242
|
borderRadius: 7.6,
|
|
199
243
|
shadowColor: '#000000',
|
|
@@ -8,7 +8,8 @@ import {
|
|
|
8
8
|
useSession,
|
|
9
9
|
useUtils,
|
|
10
10
|
ToastType,
|
|
11
|
-
useToast
|
|
11
|
+
useToast,
|
|
12
|
+
useConfig
|
|
12
13
|
} from 'ordering-components/native'
|
|
13
14
|
import { OButton, OIcon, OModal, OText } from '../shared'
|
|
14
15
|
import { BusinessBasicInformation } from '../BusinessBasicInformation'
|
|
@@ -52,7 +53,8 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
|
|
|
52
53
|
const [orderState] = useOrder()
|
|
53
54
|
const [{ parsePrice }] = useUtils()
|
|
54
55
|
const [, { showToast }] = useToast()
|
|
55
|
-
|
|
56
|
+
const [{ configs }] = useConfig()
|
|
57
|
+
const isPreOrder = configs?.preorder_status_enabled?.value === '1'
|
|
56
58
|
const styles = StyleSheet.create({
|
|
57
59
|
mainContainer: {
|
|
58
60
|
flex: 1,
|
|
@@ -70,6 +72,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
|
|
|
70
72
|
borderWidth: 0,
|
|
71
73
|
backgroundColor: theme.colors.clear,
|
|
72
74
|
shadowColor: theme.colors.clear,
|
|
75
|
+
padding: 40,
|
|
73
76
|
},
|
|
74
77
|
searchIcon: {
|
|
75
78
|
borderWidth: 0,
|
|
@@ -96,10 +99,10 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
|
|
|
96
99
|
}
|
|
97
100
|
|
|
98
101
|
const onProductClick = (product: any) => {
|
|
99
|
-
|
|
102
|
+
onRedirect('ProductDetails', {
|
|
100
103
|
product: product,
|
|
101
|
-
|
|
102
|
-
|
|
104
|
+
businessSlug: business.slug,
|
|
105
|
+
businessId: business.id,
|
|
103
106
|
})
|
|
104
107
|
}
|
|
105
108
|
|
|
@@ -154,8 +157,8 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
|
|
|
154
157
|
|
|
155
158
|
const handleTouchDrag = useCallback(() => {
|
|
156
159
|
setCategoryClicked(false);
|
|
157
|
-
|
|
158
|
-
|
|
160
|
+
}, []);
|
|
161
|
+
|
|
159
162
|
const handleBackNavigation = () => {
|
|
160
163
|
navigation?.canGoBack() ? navigation.goBack() : navigation.navigate('BottomTab')
|
|
161
164
|
}
|
|
@@ -218,6 +221,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
|
|
|
218
221
|
openBusinessInformation={openBusinessInformation}
|
|
219
222
|
header={header}
|
|
220
223
|
logo={logo}
|
|
224
|
+
isPreOrder={isPreOrder}
|
|
221
225
|
/>
|
|
222
226
|
<View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100 }} />
|
|
223
227
|
{!loading && business?.id && (
|
|
@@ -235,7 +239,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
|
|
|
235
239
|
selectedCategoryId={selectedCategoryId}
|
|
236
240
|
lazyLoadProductsRecommended={business?.lazy_load_products_recommended}
|
|
237
241
|
setSelectedCategoryId={setSelectedCategoryId}
|
|
238
|
-
|
|
242
|
+
setCategoryClicked={setCategoryClicked}
|
|
239
243
|
/>
|
|
240
244
|
)}
|
|
241
245
|
</>
|
|
@@ -294,16 +298,18 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
|
|
|
294
298
|
{!loading && auth && currentCart?.products?.length > 0 && categoryState.products.length !== 0 && (
|
|
295
299
|
<FloatingButton
|
|
296
300
|
btnText={
|
|
297
|
-
|
|
298
|
-
? t('
|
|
299
|
-
:
|
|
301
|
+
openUpselling
|
|
302
|
+
? t('LOADING', 'Loading')
|
|
303
|
+
: currentCart?.subtotal >= currentCart?.minimum
|
|
304
|
+
? t('VIEW_ORDER', 'View Order')
|
|
305
|
+
: `${t('MINIMUN_SUBTOTAL_ORDER', 'Minimum subtotal order:')} ${parsePrice(currentCart?.minimum)}`
|
|
300
306
|
}
|
|
301
|
-
isSecondaryBtn={currentCart?.subtotal < currentCart?.minimum}
|
|
307
|
+
isSecondaryBtn={currentCart?.subtotal < currentCart?.minimum || openUpselling}
|
|
302
308
|
btnLeftValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
|
|
303
309
|
btnRightValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
|
|
304
310
|
btnLeftValue={currentCart?.products?.length}
|
|
305
311
|
btnRightValue={parsePrice(currentCart?.total)}
|
|
306
|
-
disabled={currentCart?.subtotal < currentCart?.minimum}
|
|
312
|
+
disabled={currentCart?.subtotal < currentCart?.minimum || openUpselling}
|
|
307
313
|
handleClick={() => setOpenUpselling(true)}
|
|
308
314
|
/>
|
|
309
315
|
)}
|
|
@@ -313,13 +319,13 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
|
|
|
313
319
|
business={currentCart?.business}
|
|
314
320
|
cartProducts={currentCart?.products}
|
|
315
321
|
cart={currentCart}
|
|
316
|
-
|
|
322
|
+
setOpenUpselling={setOpenUpselling}
|
|
317
323
|
handleUpsellingPage={handleUpsellingPage}
|
|
318
324
|
handleCloseUpsellingPage={handleCloseUpsellingPage}
|
|
319
325
|
openUpselling={openUpselling}
|
|
320
326
|
canOpenUpselling={canOpenUpselling}
|
|
321
327
|
setCanOpenUpselling={setCanOpenUpselling}
|
|
322
|
-
|
|
328
|
+
onRedirect={onRedirect}
|
|
323
329
|
/>
|
|
324
330
|
)}
|
|
325
331
|
</SafeAreaView>
|
|
@@ -237,9 +237,10 @@ const BusinessReviewsUI = (props: BusinessReviewsParams) => {
|
|
|
237
237
|
))}
|
|
238
238
|
</>
|
|
239
239
|
)}
|
|
240
|
-
{
|
|
241
|
-
|
|
242
|
-
|
|
240
|
+
{reviewsList?.reviews
|
|
241
|
+
.filter((review: any) => searchReview !== '' ? review.comment?.toLowerCase()?.includes(searchReview?.toLowerCase()) : true).length === 0 && (
|
|
242
|
+
<OText>{t('REVIEWS_NOT_FOUND', 'Reviews Not Found')}</OText>
|
|
243
|
+
)}
|
|
243
244
|
</BusinessReviewContent>
|
|
244
245
|
</BusinessReviewsContainer>
|
|
245
246
|
);
|
|
@@ -61,7 +61,6 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
|
|
|
61
61
|
handleChangeSearch,
|
|
62
62
|
businessId
|
|
63
63
|
} = props;
|
|
64
|
-
|
|
65
64
|
const theme = useTheme();
|
|
66
65
|
const isFocused = useIsFocused();
|
|
67
66
|
const appState = useRef(AppState.currentState)
|
|
@@ -119,7 +118,7 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
|
|
|
119
118
|
|
|
120
119
|
const isPreorderEnabled = (configs?.preorder_status_enabled?.value === '1' || configs?.preorder_status_enabled?.value === 'true') &&
|
|
121
120
|
Number(configs?.max_days_preorder?.value) > 0
|
|
122
|
-
|
|
121
|
+
const isPreOrderSetting = configs?.preorder_status_enabled?.value === '1'
|
|
123
122
|
const timerId = useRef<any>(false)
|
|
124
123
|
// const panResponder = useRef(
|
|
125
124
|
// PanResponder.create({
|
|
@@ -165,25 +164,22 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
|
|
|
165
164
|
return R * c
|
|
166
165
|
}
|
|
167
166
|
|
|
168
|
-
useEffect(() => {
|
|
169
|
-
if (businessesList.businesses.length > 0) {
|
|
170
|
-
const fb = businessesList.businesses.filter((b) => b.featured == true);
|
|
171
|
-
const ary = [];
|
|
172
|
-
while (fb.length > 0) {
|
|
173
|
-
ary.push(fb.splice(0, 2));
|
|
174
|
-
}
|
|
175
|
-
setFeaturedBusinesses(ary);
|
|
176
|
-
}
|
|
177
|
-
}, [businessesList.businesses]);
|
|
178
|
-
|
|
179
167
|
const resetInactivityTimeout = () => {
|
|
180
168
|
clearTimeout(timerId.current)
|
|
181
169
|
timerId.current = setInterval(() => {
|
|
182
170
|
getBusinesses(true)
|
|
183
|
-
},
|
|
171
|
+
}, 120000)
|
|
184
172
|
}
|
|
185
173
|
|
|
186
174
|
useEffect(() => {
|
|
175
|
+
if (!businessesList?.loading) {
|
|
176
|
+
const fb = businessesList.businesses.filter((b) => b.featured === true && b?.open);
|
|
177
|
+
const ary = [];
|
|
178
|
+
while (fb.length > 0) {
|
|
179
|
+
ary.push(fb.splice(0, 2));
|
|
180
|
+
}
|
|
181
|
+
setFeaturedBusinesses(ary);
|
|
182
|
+
}
|
|
187
183
|
resetInactivityTimeout()
|
|
188
184
|
}, [businessesList.loading])
|
|
189
185
|
|
|
@@ -206,27 +202,8 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
|
|
|
206
202
|
})
|
|
207
203
|
}, [orderState?.options?.address?.location])
|
|
208
204
|
|
|
209
|
-
useEffect(() => {
|
|
210
|
-
const onFocusApp = (nextAppState: any) => {
|
|
211
|
-
if (
|
|
212
|
-
appState.current.match(/inactive|background/) &&
|
|
213
|
-
nextAppState === "active"
|
|
214
|
-
) {
|
|
215
|
-
getBusinesses(true);
|
|
216
|
-
}
|
|
217
|
-
appState.current = nextAppState;
|
|
218
|
-
setAppStateVisible(appState.current);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
AppState.addEventListener("change", onFocusApp);
|
|
222
|
-
return () => {
|
|
223
|
-
AppState.removeEventListener('change', onFocusApp);
|
|
224
|
-
};
|
|
225
|
-
}, [])
|
|
226
|
-
|
|
227
205
|
useFocusEffect(
|
|
228
206
|
useCallback(() => {
|
|
229
|
-
getBusinesses(true)
|
|
230
207
|
resetInactivityTimeout()
|
|
231
208
|
return () => clearTimeout(timerId.current)
|
|
232
209
|
}, [navigation])
|
|
@@ -287,25 +264,27 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
|
|
|
287
264
|
style={{ marginStart: 8 }}
|
|
288
265
|
/>
|
|
289
266
|
</WrapMomentOption>
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
267
|
+
{isPreOrderSetting && (
|
|
268
|
+
<WrapMomentOption
|
|
269
|
+
onPress={() => handleMomentClick()}>
|
|
270
|
+
<OText
|
|
271
|
+
size={12}
|
|
272
|
+
numberOfLines={1}
|
|
273
|
+
ellipsizeMode="tail"
|
|
274
|
+
color={theme.colors.textSecondary}>
|
|
275
|
+
{orderState.options?.momentß
|
|
276
|
+
? parseDate(orderState.options?.moment, { outputFormat: configs?.dates_moment_format?.value })
|
|
277
|
+
: t('ASAP_ABBREVIATION', 'ASAP')}
|
|
278
|
+
</OText>
|
|
279
|
+
{isPreorderEnabled && (
|
|
280
|
+
<OIcon
|
|
281
|
+
src={theme.images.general.arrow_down}
|
|
282
|
+
width={10}
|
|
283
|
+
style={{ marginStart: 8 }}
|
|
284
|
+
/>
|
|
285
|
+
)}
|
|
286
|
+
</WrapMomentOption>
|
|
287
|
+
)}
|
|
309
288
|
|
|
310
289
|
{!businessId && (
|
|
311
290
|
<SearchBar
|
|
@@ -397,6 +376,14 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
|
|
|
397
376
|
handleCustomClick={handleBusinessClick}
|
|
398
377
|
orderType={orderState?.options?.type}
|
|
399
378
|
navigation={navigation}
|
|
379
|
+
businessHeader={business?.header}
|
|
380
|
+
businessFeatured={business?.featured}
|
|
381
|
+
businessLogo={business?.logo}
|
|
382
|
+
businessReviews={business?.reviews}
|
|
383
|
+
businessDeliveryPrice={business?.delivery_price}
|
|
384
|
+
businessDeliveryTime={business?.delivery_time}
|
|
385
|
+
businessPickupTime={business?.pickup_time}
|
|
386
|
+
businessDistance={business?.distance}
|
|
400
387
|
/>
|
|
401
388
|
)
|
|
402
389
|
)}
|
|
@@ -24,6 +24,7 @@ import AntIcon from 'react-native-vector-icons/AntDesign'
|
|
|
24
24
|
import { TaxInformation } from '../TaxInformation';
|
|
25
25
|
import { CartStoresListing } from '../CartStoresListing';
|
|
26
26
|
import { OAlert } from '../../../../../src/components/shared'
|
|
27
|
+
import { PlaceSpot } from '../PlaceSpot'
|
|
27
28
|
|
|
28
29
|
const CartUI = (props: any) => {
|
|
29
30
|
const {
|
|
@@ -54,12 +55,14 @@ const CartUI = (props: any) => {
|
|
|
54
55
|
const [canOpenUpselling, setCanOpenUpselling] = useState(false)
|
|
55
56
|
const [openTaxModal, setOpenTaxModal] = useState<any>({ open: false, data: null, type: '' })
|
|
56
57
|
const [confirm, setConfirm] = useState<any>({ open: false, content: null, handleOnAccept: null, id: null, title: null })
|
|
58
|
+
const [openPlaceModal, setOpenPlaceModal] = useState(false)
|
|
57
59
|
|
|
58
60
|
const isCartPending = cart?.status === 2
|
|
59
61
|
const isCouponEnabled = validationFields?.fields?.checkout?.coupon?.enabled
|
|
60
62
|
|
|
61
63
|
const business: any = (orderState?.carts && Object.values(orderState.carts).find((_cart: any) => _cart?.uuid === props.cartuuid)) ?? {}
|
|
62
64
|
const businessId = business?.business_id ?? null
|
|
65
|
+
const placeSpotTypes = [3, 4]
|
|
63
66
|
|
|
64
67
|
const momentFormatted = !orderState?.option?.moment
|
|
65
68
|
? t('RIGHT_NOW', 'Right Now')
|
|
@@ -219,7 +222,7 @@ const CartUI = (props: any) => {
|
|
|
219
222
|
</OSTable>
|
|
220
223
|
))
|
|
221
224
|
}
|
|
222
|
-
<Divider />
|
|
225
|
+
{/* <Divider /> */}
|
|
223
226
|
{cart?.subtotal_with_discount > 0 && cart?.discount > 0 && cart?.total >= 0 && (
|
|
224
227
|
<OSTable>
|
|
225
228
|
<OText size={12} lineHeight={18} numberOfLines={1}>{t('SUBTOTAL_WITH_DISCOUNT', 'Subtotal with discount')}</OText>
|
|
@@ -252,7 +255,7 @@ const CartUI = (props: any) => {
|
|
|
252
255
|
<OSRow>
|
|
253
256
|
<OText size={12} lineHeight={18} numberOfLines={1}>
|
|
254
257
|
{fee.name || t('INHERIT_FROM_BUSINESS', 'Inherit from business')}{' '}
|
|
255
|
-
({parsePrice(fee?.fixed)} + {fee
|
|
258
|
+
({fee?.fixed > 0 && `${parsePrice(fee?.fixed)} + `}{fee.percentage}%){' '}
|
|
256
259
|
</OText>
|
|
257
260
|
<TouchableOpacity onPress={() => setOpenTaxModal({ open: true, data: fee, type: 'fee' })} >
|
|
258
261
|
<AntIcon name='infocirlceo' size={16} color={theme.colors.primary} />
|
|
@@ -353,6 +356,24 @@ const CartUI = (props: any) => {
|
|
|
353
356
|
</OText>
|
|
354
357
|
</OSTable>
|
|
355
358
|
</OSTotal>
|
|
359
|
+
{placeSpotTypes.includes(orderState?.options?.type) && (
|
|
360
|
+
<OSTable style={{ marginTop: 15 }}>
|
|
361
|
+
<OText size={14} lineHeight={21} weight={'600'}>
|
|
362
|
+
{t('SPOT', 'Spot')}: {cart?.place?.name || t('NO_SELECTED', 'No selected')}
|
|
363
|
+
</OText>
|
|
364
|
+
<TouchableOpacity onPress={() => setOpenPlaceModal(true)}>
|
|
365
|
+
<OText
|
|
366
|
+
size={14}
|
|
367
|
+
lineHeight={21}
|
|
368
|
+
weight={'600'}
|
|
369
|
+
color={theme.colors.primary}
|
|
370
|
+
style={{ textDecorationLine: 'underline' }}
|
|
371
|
+
>
|
|
372
|
+
{t('EDIT', 'Edit')}
|
|
373
|
+
</OText>
|
|
374
|
+
</TouchableOpacity>
|
|
375
|
+
</OSTable>
|
|
376
|
+
)}
|
|
356
377
|
{cart?.status !== 2 && (
|
|
357
378
|
<OSTable>
|
|
358
379
|
<View style={{ width: '100%', marginTop: 20 }}>
|
|
@@ -434,14 +455,26 @@ const CartUI = (props: any) => {
|
|
|
434
455
|
products={cart?.products}
|
|
435
456
|
/>
|
|
436
457
|
</OModal>
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
458
|
+
<OModal
|
|
459
|
+
open={openPlaceModal}
|
|
460
|
+
title={t('CHOOSE_YOUR_SPOT', 'Choose your spot')}
|
|
461
|
+
onClose={() => setOpenPlaceModal(false)}
|
|
462
|
+
entireModal
|
|
463
|
+
>
|
|
464
|
+
<PlaceSpot
|
|
465
|
+
cart={cart}
|
|
466
|
+
isOpenPlaceSpot={openPlaceModal}
|
|
467
|
+
setOpenPlaceModal={setOpenPlaceModal}
|
|
444
468
|
/>
|
|
469
|
+
</OModal>
|
|
470
|
+
<OAlert
|
|
471
|
+
open={confirm.open}
|
|
472
|
+
title={confirm.title}
|
|
473
|
+
content={confirm.content}
|
|
474
|
+
onAccept={confirm.handleOnAccept}
|
|
475
|
+
onCancel={() => setConfirm({ ...confirm, open: false, title: null })}
|
|
476
|
+
onClose={() => setConfirm({ ...confirm, open: false, title: null })}
|
|
477
|
+
/>
|
|
445
478
|
</CContainer>
|
|
446
479
|
)
|
|
447
480
|
}
|
|
@@ -22,9 +22,9 @@ export const CartContent = (props: any) => {
|
|
|
22
22
|
<CCContainer>
|
|
23
23
|
{isOrderStateCarts && carts?.length > 0 && (
|
|
24
24
|
<>
|
|
25
|
-
<OText size={24} lineHeight={36} weight={'600'} style={{ marginBottom: 20 }}>
|
|
25
|
+
{/* <OText size={24} lineHeight={36} weight={'600'} style={{ marginBottom: 20 }}>
|
|
26
26
|
{carts.length > 1 ? t('MY_CARTS', 'My Carts') : t('CART', 'Cart')}
|
|
27
|
-
</OText>
|
|
27
|
+
</OText> */}
|
|
28
28
|
{carts.map((cart: any, i: number) => (
|
|
29
29
|
<CCList key={i} style={{ overflow: 'visible' }}>
|
|
30
30
|
{cart.products.length > 0 && (
|
|
@@ -39,7 +39,8 @@ import {
|
|
|
39
39
|
ChCart,
|
|
40
40
|
DeliveryOptionsContainer,
|
|
41
41
|
DeliveryOptionItem,
|
|
42
|
-
WalletPaymentOptionContainer
|
|
42
|
+
WalletPaymentOptionContainer,
|
|
43
|
+
CartHeader
|
|
43
44
|
} from './styles';
|
|
44
45
|
import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
|
|
45
46
|
|
|
@@ -131,9 +132,11 @@ const CheckoutUI = (props: any) => {
|
|
|
131
132
|
const [isDeliveryOptionModalVisible, setIsDeliveryOptionModalVisible] = useState(false)
|
|
132
133
|
const [showGateway, setShowGateway] = useState<any>({ closedByUsed: false, open: false });
|
|
133
134
|
const [webviewPaymethod, setWebviewPaymethod] = useState<any>(null)
|
|
134
|
-
|
|
135
|
-
|
|
135
|
+
|
|
136
|
+
const placeSpotTypes = [3, 4]
|
|
136
137
|
const isWalletEnabled = configs?.wallet_enabled?.value === '1' && (configs?.wallet_cash_enabled?.value === '1' || configs?.wallet_credit_point_enabled?.value === '1')
|
|
138
|
+
const isPreOrder = configs?.preorder_status_enabled?.value === '1'
|
|
139
|
+
const isDisabledButtonPlace = loading || !cart?.valid || (!paymethodSelected && cart?.balance > 0) || placing || errorCash || cart?.subtotal < cart?.minimum || (placeSpotTypes.includes(options?.type) && !cart?.place)
|
|
137
140
|
|
|
138
141
|
const driverTipsOptions = typeof configs?.driver_tip_options?.value === 'string'
|
|
139
142
|
? JSON.parse(configs?.driver_tip_options?.value) || []
|
|
@@ -149,6 +152,12 @@ const CheckoutUI = (props: any) => {
|
|
|
149
152
|
}
|
|
150
153
|
})
|
|
151
154
|
|
|
155
|
+
const handleMomentClick = () => {
|
|
156
|
+
if (isPreOrder) {
|
|
157
|
+
navigation.navigate('MomentOption')
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
152
161
|
const handlePlaceOrder = () => {
|
|
153
162
|
if (!userErrors.length) {
|
|
154
163
|
handlerClickPlaceOrder && handlerClickPlaceOrder()
|
|
@@ -193,8 +202,8 @@ const CheckoutUI = (props: any) => {
|
|
|
193
202
|
if (
|
|
194
203
|
!user?.cellphone &&
|
|
195
204
|
((validationFields?.fields?.checkout?.cellphone?.enabled &&
|
|
196
|
-
|
|
197
|
-
|
|
205
|
+
validationFields?.fields?.checkout?.cellphone?.required) ||
|
|
206
|
+
configs?.verification_phone_required?.value === '1')
|
|
198
207
|
) {
|
|
199
208
|
errors.push(t('VALIDATION_ERROR_MOBILE_PHONE_REQUIRED', 'The field Phone number is required'))
|
|
200
209
|
}
|
|
@@ -244,8 +253,8 @@ const CheckoutUI = (props: any) => {
|
|
|
244
253
|
isVertical
|
|
245
254
|
onActionLeft={() => navigation?.canGoBack() && navigation.goBack()}
|
|
246
255
|
title={t('CHECKOUT', 'Checkout')}
|
|
247
|
-
|
|
248
|
-
|
|
256
|
+
titleStyle={{ marginLeft: 0, marginRight: 0, paddingLeft: 40 }}
|
|
257
|
+
btnStyle={{ marginLeft: 40, padding: 40 }}
|
|
249
258
|
/>
|
|
250
259
|
<ChContainer style={styles.pagePadding}>
|
|
251
260
|
<ChSection style={{ paddingTop: 0 }}>
|
|
@@ -260,7 +269,7 @@ const CheckoutUI = (props: any) => {
|
|
|
260
269
|
/>
|
|
261
270
|
</CHMomentWrapper>
|
|
262
271
|
<CHMomentWrapper
|
|
263
|
-
onPress={() =>
|
|
272
|
+
onPress={() => handleMomentClick()}
|
|
264
273
|
disabled={loading}
|
|
265
274
|
>
|
|
266
275
|
<OText size={12} numberOfLines={1} ellipsizeMode='tail' color={theme.colors.textSecondary}>
|
|
@@ -268,11 +277,13 @@ const CheckoutUI = (props: any) => {
|
|
|
268
277
|
? parseDate(options?.moment, { outputFormat: configs?.dates_moment_format?.value })
|
|
269
278
|
: t('ASAP_ABBREVIATION', 'ASAP')}
|
|
270
279
|
</OText>
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
280
|
+
{isPreOrder && (
|
|
281
|
+
<OIcon
|
|
282
|
+
src={theme.images.general.arrow_down}
|
|
283
|
+
width={10}
|
|
284
|
+
style={{ marginStart: 8 }}
|
|
285
|
+
/>
|
|
286
|
+
)}
|
|
276
287
|
</CHMomentWrapper>
|
|
277
288
|
</ChHeader>
|
|
278
289
|
<View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 18, marginHorizontal: -40 }} />
|
|
@@ -535,7 +546,6 @@ const CheckoutUI = (props: any) => {
|
|
|
535
546
|
onNavigationRedirect={onNavigationRedirect}
|
|
536
547
|
paySelected={paymethodSelected}
|
|
537
548
|
handlePaymentMethodClickCustom={handlePaymentMethodClick}
|
|
538
|
-
handlePlaceOrder={handlePlaceOrder}
|
|
539
549
|
/>
|
|
540
550
|
</ChPaymethods>
|
|
541
551
|
</ChSection>
|
|
@@ -561,9 +571,28 @@ const CheckoutUI = (props: any) => {
|
|
|
561
571
|
/>
|
|
562
572
|
) : (
|
|
563
573
|
<>
|
|
564
|
-
<
|
|
565
|
-
|
|
566
|
-
|
|
574
|
+
<CartHeader>
|
|
575
|
+
<OText
|
|
576
|
+
size={16}
|
|
577
|
+
lineHeight={24}
|
|
578
|
+
color={theme.colors.textNormal}
|
|
579
|
+
style={{ fontWeight: '500' }}
|
|
580
|
+
>
|
|
581
|
+
{t('MOBILE_FRONT_YOUR_ORDER', 'Your order')}
|
|
582
|
+
</OText>
|
|
583
|
+
<TouchableOpacity
|
|
584
|
+
onPress={() => onNavigationRedirect('Business', { store: cart?.business?.slug })}
|
|
585
|
+
>
|
|
586
|
+
<OText
|
|
587
|
+
size={10}
|
|
588
|
+
lineHeight={15}
|
|
589
|
+
color={theme.colors.primary}
|
|
590
|
+
style={{ textDecorationLine: 'underline' }}
|
|
591
|
+
>
|
|
592
|
+
{t('ADD_PRODUCTS', 'Add products')}
|
|
593
|
+
</OText>
|
|
594
|
+
</TouchableOpacity>
|
|
595
|
+
</CartHeader>
|
|
567
596
|
{props.isFranchiseApp && (
|
|
568
597
|
<TouchableOpacity
|
|
569
598
|
onPress={() => setOpenChangeStore(true)}
|
|
@@ -619,6 +648,14 @@ const CheckoutUI = (props: any) => {
|
|
|
619
648
|
{t('WARNING_INVALID_PRODUCTS', 'Some products are invalid, please check them.')}
|
|
620
649
|
</OText>
|
|
621
650
|
)}
|
|
651
|
+
{placeSpotTypes.includes(options?.type) && !cart?.place && (
|
|
652
|
+
<OText
|
|
653
|
+
color={theme.colors.error}
|
|
654
|
+
size={12}
|
|
655
|
+
>
|
|
656
|
+
{t('WARNING_PLACE_SPOT', 'Please, select your spot to place order.')}
|
|
657
|
+
</OText>
|
|
658
|
+
)}
|
|
622
659
|
</ChErrors>
|
|
623
660
|
</View>
|
|
624
661
|
)}
|
|
@@ -638,8 +675,8 @@ const CheckoutUI = (props: any) => {
|
|
|
638
675
|
{!cartState.loading && cart && cart?.status !== 2 && (
|
|
639
676
|
<FloatingButton
|
|
640
677
|
handleClick={() => handlePlaceOrder()}
|
|
641
|
-
isSecondaryBtn={
|
|
642
|
-
disabled={
|
|
678
|
+
isSecondaryBtn={isDisabledButtonPlace}
|
|
679
|
+
disabled={isDisabledButtonPlace}
|
|
643
680
|
btnText={cart?.subtotal >= cart?.minimum
|
|
644
681
|
? (
|
|
645
682
|
placing
|
|
@@ -667,19 +704,6 @@ const CheckoutUI = (props: any) => {
|
|
|
667
704
|
setShowGateway={setShowGateway}
|
|
668
705
|
/>
|
|
669
706
|
)}
|
|
670
|
-
{webviewPaymethod?.gateway === 'square' && showGateway.open && (
|
|
671
|
-
<PaymentOptionsWebView
|
|
672
|
-
onNavigationRedirect={onNavigationRedirect}
|
|
673
|
-
uri={`https://test-square-f50f7.web.app`}
|
|
674
|
-
user={user}
|
|
675
|
-
token={token}
|
|
676
|
-
cart={cart}
|
|
677
|
-
currency={currency}
|
|
678
|
-
webviewPaymethod={webviewPaymethod}
|
|
679
|
-
setShowGateway={setShowGateway}
|
|
680
|
-
locationId={'L1NGAY5M6KJRX'}
|
|
681
|
-
/>
|
|
682
|
-
)}
|
|
683
707
|
</>
|
|
684
708
|
)
|
|
685
709
|
}
|
|
@@ -105,3 +105,10 @@ export const DeliveryOptionItem = styled.View`
|
|
|
105
105
|
flex-direction: row;
|
|
106
106
|
background-color: ${(props : any) => props?.backgroundColor ?? '#fff'};
|
|
107
107
|
`;
|
|
108
|
+
|
|
109
|
+
export const CartHeader = styled.View`
|
|
110
|
+
align-items: center;
|
|
111
|
+
flex-direction: row;
|
|
112
|
+
justify-content: space-between;
|
|
113
|
+
margin-bottom: 10px;
|
|
114
|
+
`
|