ordering-ui-react-native 0.14.37 → 0.14.38
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 +1 -1
- package/src/types/react-native-color-matrix-image-filters/index.d.ts +1 -0
- package/themes/original/index.tsx +4 -0
- package/themes/original/src/components/BusinessProductsListing/UpsellingRedirect.tsx +35 -0
- package/themes/original/src/components/BusinessProductsListing/index.tsx +16 -47
- package/themes/original/src/components/Cart/index.tsx +10 -31
- package/themes/original/src/components/Checkout/index.tsx +1 -0
- package/themes/original/src/components/OrderSummary/index.tsx +11 -30
- package/themes/original/src/components/ProductForm/index.tsx +18 -26
- package/themes/original/src/components/ProductForm/styles.tsx +3 -2
- package/themes/original/src/components/UpsellingProducts/index.tsx +84 -86
- package/themes/original/src/types/index.tsx +4 -0
package/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
declare module 'react-native-color-matrix-image-filters'
|
|
@@ -30,6 +30,8 @@ import { NotFoundSource } from './src/components/NotFoundSource';
|
|
|
30
30
|
import { OrderTypeSelector } from './src/components/OrderTypeSelector';
|
|
31
31
|
import { Wallets } from './src/components/Wallets';
|
|
32
32
|
import { PaymentOptionWallet } from './src/components/PaymentOptionWallet';
|
|
33
|
+
import { ProductForm } from './src/components/ProductForm';
|
|
34
|
+
import { UpsellingProducts } from './src/components/UpsellingProducts';
|
|
33
35
|
|
|
34
36
|
import { Toast } from './src/components/shared/OToast';
|
|
35
37
|
import {
|
|
@@ -90,6 +92,8 @@ export {
|
|
|
90
92
|
OrderTypeSelector,
|
|
91
93
|
Wallets,
|
|
92
94
|
PaymentOptionWallet,
|
|
95
|
+
ProductForm,
|
|
96
|
+
UpsellingProducts,
|
|
93
97
|
|
|
94
98
|
// OComponents
|
|
95
99
|
Toast,
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React, { useEffect } from 'react'
|
|
2
|
+
import { UpsellingPage as UpsellingPageController } from 'ordering-components/native'
|
|
3
|
+
|
|
4
|
+
const UpsellingRedirectUI = (props: any) => {
|
|
5
|
+
const {
|
|
6
|
+
setOpenUpselling,
|
|
7
|
+
upsellingProducts,
|
|
8
|
+
handleUpsellingPage,
|
|
9
|
+
onRedirect,
|
|
10
|
+
} = props
|
|
11
|
+
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (!upsellingProducts.loading) {
|
|
14
|
+
if (upsellingProducts?.products?.length) {
|
|
15
|
+
onRedirect &&
|
|
16
|
+
onRedirect('UpsellingPage', props)
|
|
17
|
+
} else {
|
|
18
|
+
handleUpsellingPage && handleUpsellingPage()
|
|
19
|
+
}
|
|
20
|
+
setOpenUpselling(false)
|
|
21
|
+
}
|
|
22
|
+
}, [upsellingProducts.loading, upsellingProducts?.products.length])
|
|
23
|
+
|
|
24
|
+
return (<>{null}</>)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const UpsellingRedirect = (props: any) => {
|
|
28
|
+
const upsellingProps = {
|
|
29
|
+
...props,
|
|
30
|
+
UIComponent: UpsellingRedirectUI
|
|
31
|
+
}
|
|
32
|
+
return (
|
|
33
|
+
<UpsellingPageController {...upsellingProps} />
|
|
34
|
+
)
|
|
35
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { useCallback, useEffect, useRef, useState } from 'react'
|
|
2
|
-
import { View, TouchableOpacity, StyleSheet, SafeAreaView
|
|
2
|
+
import { View, TouchableOpacity, StyleSheet, SafeAreaView } from 'react-native'
|
|
3
3
|
import { useTheme } from 'styled-components/native';
|
|
4
4
|
import {
|
|
5
5
|
BusinessAndProductList,
|
|
@@ -17,17 +17,13 @@ import { BusinessProductsCategories } from '../BusinessProductsCategories'
|
|
|
17
17
|
import { BusinessProductsList } from '../BusinessProductsList'
|
|
18
18
|
import { BusinessProductsListingParams } from '../../types'
|
|
19
19
|
import {
|
|
20
|
-
WrapHeader,
|
|
21
20
|
TopHeader,
|
|
22
|
-
AddressInput,
|
|
23
21
|
WrapSearchBar,
|
|
24
22
|
WrapContent,
|
|
25
23
|
BusinessProductsListingContainer
|
|
26
24
|
} from './styles'
|
|
27
25
|
import { FloatingButton } from '../FloatingButton'
|
|
28
|
-
import {
|
|
29
|
-
import { UpsellingProducts } from '../UpsellingProducts'
|
|
30
|
-
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
26
|
+
import { UpsellingRedirect } from './UpsellingRedirect'
|
|
31
27
|
import Animated from 'react-native-reanimated'
|
|
32
28
|
|
|
33
29
|
const PIXELS_TO_SCROLL = 1000
|
|
@@ -47,7 +43,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
|
|
|
47
43
|
errorQuantityProducts,
|
|
48
44
|
header,
|
|
49
45
|
logo,
|
|
50
|
-
getNextProducts
|
|
46
|
+
getNextProducts,
|
|
51
47
|
} = props
|
|
52
48
|
|
|
53
49
|
const theme = useTheme();
|
|
@@ -56,7 +52,6 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
|
|
|
56
52
|
const [orderState] = useOrder()
|
|
57
53
|
const [{ parsePrice }] = useUtils()
|
|
58
54
|
const [, { showToast }] = useToast()
|
|
59
|
-
const { top } = useSafeAreaInsets();
|
|
60
55
|
|
|
61
56
|
const styles = StyleSheet.create({
|
|
62
57
|
mainContainer: {
|
|
@@ -87,7 +82,6 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
|
|
|
87
82
|
const { business, loading, error } = businessState
|
|
88
83
|
const [openBusinessInformation, setOpenBusinessInformation] = useState(false)
|
|
89
84
|
const [isOpenSearchBar, setIsOpenSearchBar] = useState(false)
|
|
90
|
-
const [curProduct, setCurProduct] = useState(null)
|
|
91
85
|
const [openUpselling, setOpenUpselling] = useState(false)
|
|
92
86
|
const [canOpenUpselling, setCanOpenUpselling] = useState(false)
|
|
93
87
|
const scrollViewRef = useRef<any>(null)
|
|
@@ -102,7 +96,11 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
|
|
|
102
96
|
}
|
|
103
97
|
|
|
104
98
|
const onProductClick = (product: any) => {
|
|
105
|
-
|
|
99
|
+
onRedirect('ProductDetails', {
|
|
100
|
+
product: product,
|
|
101
|
+
businessSlug: business.slug,
|
|
102
|
+
businessId: business.id,
|
|
103
|
+
})
|
|
106
104
|
}
|
|
107
105
|
|
|
108
106
|
const handleCancel = () => {
|
|
@@ -110,14 +108,6 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
|
|
|
110
108
|
handleChangeSearch('')
|
|
111
109
|
}
|
|
112
110
|
|
|
113
|
-
const handleCloseProductModal = () => {
|
|
114
|
-
setCurProduct(null)
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
const handlerProductAction = () => {
|
|
118
|
-
handleCloseProductModal()
|
|
119
|
-
}
|
|
120
|
-
|
|
121
111
|
const handleUpsellingPage = () => {
|
|
122
112
|
onRedirect('CheckoutNavigator', {
|
|
123
113
|
screen: 'CheckoutPage',
|
|
@@ -166,13 +156,6 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
|
|
|
166
156
|
setCategoryClicked(false);
|
|
167
157
|
}, []);
|
|
168
158
|
|
|
169
|
-
|
|
170
|
-
useEffect(() => {
|
|
171
|
-
if (!orderState.loading) {
|
|
172
|
-
handleCloseProductModal()
|
|
173
|
-
}
|
|
174
|
-
}, [orderState.loading])
|
|
175
|
-
|
|
176
159
|
return (
|
|
177
160
|
<SafeAreaView
|
|
178
161
|
style={{ flex: 1 }}
|
|
@@ -304,49 +287,35 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
|
|
|
304
287
|
</>
|
|
305
288
|
)}
|
|
306
289
|
</BusinessProductsListingContainer>
|
|
307
|
-
{!loading && auth &&
|
|
290
|
+
{!loading && auth && currentCart?.products?.length > 0 && categoryState.products.length !== 0 && (
|
|
308
291
|
<FloatingButton
|
|
309
292
|
btnText={
|
|
310
293
|
currentCart?.subtotal >= currentCart?.minimum
|
|
311
|
-
?
|
|
294
|
+
? t('VIEW_ORDER', 'View Order')
|
|
312
295
|
: `${t('MINIMUN_SUBTOTAL_ORDER', 'Minimum subtotal order:')} ${parsePrice(currentCart?.minimum)}`
|
|
313
296
|
}
|
|
314
297
|
isSecondaryBtn={currentCart?.subtotal < currentCart?.minimum}
|
|
315
|
-
btnLeftValueShow={currentCart?.subtotal >= currentCart?.minimum &&
|
|
316
|
-
btnRightValueShow={currentCart?.subtotal >= currentCart?.minimum &&
|
|
298
|
+
btnLeftValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
|
|
299
|
+
btnRightValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
|
|
317
300
|
btnLeftValue={currentCart?.products?.length}
|
|
318
301
|
btnRightValue={parsePrice(currentCart?.total)}
|
|
319
|
-
disabled={
|
|
302
|
+
disabled={currentCart?.subtotal < currentCart?.minimum}
|
|
320
303
|
handleClick={() => setOpenUpselling(true)}
|
|
321
304
|
/>
|
|
322
305
|
)}
|
|
323
|
-
<OModal
|
|
324
|
-
open={!!curProduct}
|
|
325
|
-
onClose={handleCloseProductModal}
|
|
326
|
-
entireModal
|
|
327
|
-
customClose
|
|
328
|
-
isAvoidKeyBoardView
|
|
329
|
-
>
|
|
330
|
-
<ProductForm
|
|
331
|
-
product={curProduct}
|
|
332
|
-
businessSlug={business.slug}
|
|
333
|
-
businessId={business.id}
|
|
334
|
-
onClose={handleCloseProductModal}
|
|
335
|
-
navigation={navigation}
|
|
336
|
-
onSave={handlerProductAction}
|
|
337
|
-
/>
|
|
338
|
-
</OModal>
|
|
339
306
|
{openUpselling && (
|
|
340
|
-
<
|
|
307
|
+
<UpsellingRedirect
|
|
341
308
|
businessId={currentCart?.business_id}
|
|
342
309
|
business={currentCart?.business}
|
|
343
310
|
cartProducts={currentCart?.products}
|
|
344
311
|
cart={currentCart}
|
|
312
|
+
setOpenUpselling={setOpenUpselling}
|
|
345
313
|
handleUpsellingPage={handleUpsellingPage}
|
|
346
314
|
handleCloseUpsellingPage={handleCloseUpsellingPage}
|
|
347
315
|
openUpselling={openUpselling}
|
|
348
316
|
canOpenUpselling={canOpenUpselling}
|
|
349
317
|
setCanOpenUpselling={setCanOpenUpselling}
|
|
318
|
+
onRedirect={onRedirect}
|
|
350
319
|
/>
|
|
351
320
|
)}
|
|
352
321
|
</SafeAreaView>
|
|
@@ -17,7 +17,6 @@ import { BusinessItemAccordion } from '../BusinessItemAccordion';
|
|
|
17
17
|
import { CouponControl } from '../CouponControl';
|
|
18
18
|
|
|
19
19
|
import { OButton, OInput, OModal, OText } from '../shared';
|
|
20
|
-
import { ProductForm } from '../ProductForm';
|
|
21
20
|
import { UpsellingProducts } from '../UpsellingProducts';
|
|
22
21
|
import { verifyDecimals } from '../../utils';
|
|
23
22
|
import { ActivityIndicator, TouchableOpacity, View } from 'react-native';
|
|
@@ -35,10 +34,9 @@ const CartUI = (props: any) => {
|
|
|
35
34
|
removeProduct,
|
|
36
35
|
handleCartOpen,
|
|
37
36
|
setIsCartsLoading,
|
|
38
|
-
hideUpselling,
|
|
39
37
|
handleChangeComment,
|
|
40
|
-
commentState
|
|
41
|
-
|
|
38
|
+
commentState,
|
|
39
|
+
onNavigationRedirect
|
|
42
40
|
} = props
|
|
43
41
|
|
|
44
42
|
const theme = useTheme();
|
|
@@ -49,8 +47,6 @@ const CartUI = (props: any) => {
|
|
|
49
47
|
const [{ parsePrice, parseNumber, parseDate }] = useUtils()
|
|
50
48
|
const [validationFields] = useValidationFields()
|
|
51
49
|
|
|
52
|
-
const [openProduct, setModalIsOpen] = useState(false)
|
|
53
|
-
const [curProduct, setCurProduct] = useState<any>(null)
|
|
54
50
|
const [openUpselling, setOpenUpselling] = useState(false)
|
|
55
51
|
const [openChangeStore, setOpenChangeStore] = useState(false)
|
|
56
52
|
const [canOpenUpselling, setCanOpenUpselling] = useState(false)
|
|
@@ -71,14 +67,14 @@ const CartUI = (props: any) => {
|
|
|
71
67
|
}
|
|
72
68
|
|
|
73
69
|
const handleEditProduct = (product: any) => {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
70
|
+
onNavigationRedirect('ProductDetails', {
|
|
71
|
+
businessId,
|
|
72
|
+
isCartProduct: true,
|
|
73
|
+
productCart: product,
|
|
74
|
+
businessSlug: cart?.business?.slug,
|
|
75
|
+
categoryId: product?.category_id,
|
|
76
|
+
productId: product?.id,
|
|
77
|
+
})
|
|
82
78
|
}
|
|
83
79
|
|
|
84
80
|
const handleClearProducts = async () => {
|
|
@@ -329,23 +325,6 @@ const CartUI = (props: any) => {
|
|
|
329
325
|
</CheckoutAction>
|
|
330
326
|
)}
|
|
331
327
|
</BusinessItemAccordion>
|
|
332
|
-
<OModal
|
|
333
|
-
open={openProduct}
|
|
334
|
-
entireModal
|
|
335
|
-
customClose
|
|
336
|
-
onClose={() => setModalIsOpen(false)}
|
|
337
|
-
>
|
|
338
|
-
<ProductForm
|
|
339
|
-
isCartProduct
|
|
340
|
-
productCart={curProduct}
|
|
341
|
-
businessSlug={cart?.business?.slug}
|
|
342
|
-
businessId={businessId}
|
|
343
|
-
categoryId={curProduct?.category_id}
|
|
344
|
-
productId={curProduct?.id}
|
|
345
|
-
onSave={handlerProductAction}
|
|
346
|
-
onClose={() => setModalIsOpen(false)}
|
|
347
|
-
/>
|
|
348
|
-
</OModal>
|
|
349
328
|
|
|
350
329
|
<OModal
|
|
351
330
|
open={openChangeStore && props.isFranchiseApp}
|
|
@@ -20,7 +20,6 @@ import {
|
|
|
20
20
|
import { ProductItemAccordion } from '../ProductItemAccordion';
|
|
21
21
|
import { CouponControl } from '../CouponControl';
|
|
22
22
|
import { OInput, OModal, OText } from '../shared';
|
|
23
|
-
import { ProductForm } from '../ProductForm';
|
|
24
23
|
import { verifyDecimals } from '../../utils';
|
|
25
24
|
import AntIcon from 'react-native-vector-icons/AntDesign'
|
|
26
25
|
import { TaxInformation } from '../TaxInformation';
|
|
@@ -35,7 +34,8 @@ const OrderSummaryUI = (props: any) => {
|
|
|
35
34
|
isCartPending,
|
|
36
35
|
isFromCheckout,
|
|
37
36
|
commentState,
|
|
38
|
-
handleChangeComment
|
|
37
|
+
handleChangeComment,
|
|
38
|
+
onNavigationRedirect
|
|
39
39
|
} = props;
|
|
40
40
|
|
|
41
41
|
const theme = useTheme()
|
|
@@ -44,8 +44,6 @@ const OrderSummaryUI = (props: any) => {
|
|
|
44
44
|
const [orderState] = useOrder();
|
|
45
45
|
const [{ parsePrice, parseNumber }] = useUtils();
|
|
46
46
|
const [validationFields] = useValidationFields();
|
|
47
|
-
const [openProduct, setModalIsOpen] = useState(false)
|
|
48
|
-
const [curProduct, setCurProduct] = useState<any>(null)
|
|
49
47
|
const [openTaxModal, setOpenTaxModal] = useState<any>({ open: false, data: null })
|
|
50
48
|
|
|
51
49
|
const isCouponEnabled = validationFields?.fields?.checkout?.coupon?.enabled;
|
|
@@ -55,14 +53,15 @@ const OrderSummaryUI = (props: any) => {
|
|
|
55
53
|
}
|
|
56
54
|
|
|
57
55
|
const handleEditProduct = (product: any) => {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
56
|
+
onNavigationRedirect('ProductDetails', {
|
|
57
|
+
isCartProduct: true,
|
|
58
|
+
productCart: product,
|
|
59
|
+
businessSlug: cart?.business?.slug,
|
|
60
|
+
businessId: cart?.business_id,
|
|
61
|
+
categoryId: product?.category_id,
|
|
62
|
+
productId: product?.id,
|
|
63
|
+
isFromCheckout: isFromCheckout,
|
|
64
|
+
})
|
|
66
65
|
}
|
|
67
66
|
|
|
68
67
|
const getIncludedTaxes = () => {
|
|
@@ -242,24 +241,6 @@ const OrderSummaryUI = (props: any) => {
|
|
|
242
241
|
)}
|
|
243
242
|
</OSBill>
|
|
244
243
|
)}
|
|
245
|
-
<OModal
|
|
246
|
-
open={openProduct}
|
|
247
|
-
entireModal
|
|
248
|
-
customClose
|
|
249
|
-
onClose={() => setModalIsOpen(false)}
|
|
250
|
-
>
|
|
251
|
-
<ProductForm
|
|
252
|
-
isCartProduct
|
|
253
|
-
productCart={curProduct}
|
|
254
|
-
businessSlug={cart?.business?.slug}
|
|
255
|
-
businessId={cart?.business_id}
|
|
256
|
-
categoryId={curProduct?.category_id}
|
|
257
|
-
productId={curProduct?.id}
|
|
258
|
-
onSave={handlerProductAction}
|
|
259
|
-
onClose={() => setModalIsOpen(false)}
|
|
260
|
-
isFromCheckout={isFromCheckout}
|
|
261
|
-
/>
|
|
262
|
-
</OModal>
|
|
263
244
|
<OModal
|
|
264
245
|
open={openTaxModal.open}
|
|
265
246
|
onClose={() => setOpenTaxModal({ open: false, data: null })}
|
|
@@ -16,10 +16,9 @@ import {
|
|
|
16
16
|
Grayscale
|
|
17
17
|
} from 'react-native-color-matrix-image-filters'
|
|
18
18
|
|
|
19
|
-
import { View, TouchableOpacity, StyleSheet, Dimensions,
|
|
19
|
+
import { View, TouchableOpacity, StyleSheet, Dimensions, I18nManager, SafeAreaView } from 'react-native';
|
|
20
20
|
|
|
21
21
|
import {
|
|
22
|
-
ProductHeader,
|
|
23
22
|
WrapHeader,
|
|
24
23
|
TopHeader,
|
|
25
24
|
WrapContent,
|
|
@@ -40,9 +39,7 @@ import { ScrollView } from 'react-native-gesture-handler';
|
|
|
40
39
|
import { ProductOptionSubOption } from '../ProductOptionSubOption';
|
|
41
40
|
import { NotFoundSource } from '../NotFoundSource';
|
|
42
41
|
import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder';
|
|
43
|
-
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
44
42
|
import { useState } from 'react';
|
|
45
|
-
import { useWindowDimensions } from 'react-native';
|
|
46
43
|
|
|
47
44
|
const windowHeight = Dimensions.get('window').height;
|
|
48
45
|
const windowWidth = Dimensions.get('window').width;
|
|
@@ -63,8 +60,6 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
63
60
|
handleChangeSuboptionState,
|
|
64
61
|
handleChangeCommentState,
|
|
65
62
|
productObject,
|
|
66
|
-
onClose,
|
|
67
|
-
isFromCheckout,
|
|
68
63
|
} = props;
|
|
69
64
|
|
|
70
65
|
const theme = useTheme();
|
|
@@ -97,7 +92,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
97
92
|
},
|
|
98
93
|
btnBackArrow: {
|
|
99
94
|
borderWidth: 0,
|
|
100
|
-
backgroundColor: '
|
|
95
|
+
backgroundColor: '#FFF',
|
|
101
96
|
borderRadius: 24,
|
|
102
97
|
marginRight: 15,
|
|
103
98
|
},
|
|
@@ -160,15 +155,13 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
160
155
|
const [gallery, setGallery] = useState([])
|
|
161
156
|
const [thumbsSwiper, setThumbsSwiper] = useState(0)
|
|
162
157
|
|
|
163
|
-
const { top, bottom } = useSafeAreaInsets();
|
|
164
|
-
const { height } = useWindowDimensions();
|
|
165
158
|
const [selOpt, setSelectedOpt] = useState(0);
|
|
166
159
|
const [isHaveWeight, setIsHaveWeight] = useState(false)
|
|
167
160
|
const [qtyBy, setQtyBy] = useState({
|
|
168
161
|
weight_unit: false,
|
|
169
162
|
pieces: true
|
|
170
163
|
})
|
|
171
|
-
const [pricePerWeightUnit, setPricePerWeightUnit] = useState(null)
|
|
164
|
+
const [pricePerWeightUnit, setPricePerWeightUnit] = useState<any>(null)
|
|
172
165
|
|
|
173
166
|
const swiperRef: any = useRef(null)
|
|
174
167
|
|
|
@@ -187,10 +180,8 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
187
180
|
};
|
|
188
181
|
|
|
189
182
|
const handleSaveProduct = () => {
|
|
190
|
-
console.log('----- click handle ------')
|
|
191
183
|
const isErrors = Object.values(errors).length > 0;
|
|
192
184
|
if (!isErrors) {
|
|
193
|
-
console.log('----- save handle ------')
|
|
194
185
|
handleSave && handleSave();
|
|
195
186
|
return;
|
|
196
187
|
}
|
|
@@ -220,7 +211,6 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
220
211
|
}
|
|
221
212
|
|
|
222
213
|
const handleRedirectLogin = () => {
|
|
223
|
-
onClose();
|
|
224
214
|
navigation.navigate('Login');
|
|
225
215
|
};
|
|
226
216
|
|
|
@@ -298,14 +288,20 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
298
288
|
</>
|
|
299
289
|
);
|
|
300
290
|
|
|
291
|
+
const handleGoBack = navigation?.canGoBack()
|
|
292
|
+
? () => navigation.goBack()
|
|
293
|
+
: () => navigation.navigate('Business', { store: props.businessSlug })
|
|
294
|
+
|
|
301
295
|
return (
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
296
|
+
<SafeAreaView style={{ flex: 1 }}>
|
|
297
|
+
<TopHeader>
|
|
298
|
+
<OButton
|
|
299
|
+
imgLeftSrc={theme.images.general.arrow_left}
|
|
300
|
+
imgRightSrc={null}
|
|
301
|
+
style={styles.btnBackArrow}
|
|
302
|
+
onClick={() => handleGoBack()}
|
|
303
|
+
imgLeftStyle={{ tintColor: theme.colors.textNormal, width: 16 }}
|
|
304
|
+
/>
|
|
309
305
|
</TopHeader>
|
|
310
306
|
<ScrollView>
|
|
311
307
|
{!error && (
|
|
@@ -773,11 +769,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
773
769
|
)}
|
|
774
770
|
</ScrollView>
|
|
775
771
|
{!loading && !error && product && (
|
|
776
|
-
<ProductActions
|
|
777
|
-
style={{
|
|
778
|
-
paddingBottom: Platform.OS === 'ios' ? bottom + 30 : bottom + 80
|
|
779
|
-
}}
|
|
780
|
-
>
|
|
772
|
+
<ProductActions>
|
|
781
773
|
<OText size={16} lineHeight={24} weight={'600'}>
|
|
782
774
|
{productCart.total ? parsePrice(productCart?.total) : ''}
|
|
783
775
|
</OText>
|
|
@@ -921,7 +913,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
921
913
|
</View>
|
|
922
914
|
</ProductActions>
|
|
923
915
|
)}
|
|
924
|
-
|
|
916
|
+
</SafeAreaView>
|
|
925
917
|
);
|
|
926
918
|
};
|
|
927
919
|
|
|
@@ -11,7 +11,8 @@ export const TopHeader = styled.View`
|
|
|
11
11
|
align-items: center;
|
|
12
12
|
justify-content: space-between;
|
|
13
13
|
z-index: 1;
|
|
14
|
-
|
|
14
|
+
height: 60px;
|
|
15
|
+
min-height: 60px;
|
|
15
16
|
`
|
|
16
17
|
|
|
17
18
|
export const ProductHeader = styled.ImageBackground`
|
|
@@ -89,4 +90,4 @@ export const WeightUnitItem = styled.View`
|
|
|
89
90
|
${({ active }: any) => active && css`
|
|
90
91
|
background-color: ${(props: any) => props.theme.colors.primary}20;
|
|
91
92
|
`}
|
|
92
|
-
`
|
|
93
|
+
`
|
|
@@ -4,9 +4,10 @@ import {
|
|
|
4
4
|
UpsellingPage as UpsellingPageController,
|
|
5
5
|
useUtils,
|
|
6
6
|
useLanguage,
|
|
7
|
+
useOrder
|
|
7
8
|
} from 'ordering-components/native'
|
|
8
9
|
import { useTheme } from 'styled-components/native';
|
|
9
|
-
import { OText, OIcon,
|
|
10
|
+
import { OText, OIcon, OBottomPopup, OButton } from '../shared'
|
|
10
11
|
import { UpsellingProductsParams } from '../../types'
|
|
11
12
|
import {
|
|
12
13
|
Container,
|
|
@@ -14,11 +15,9 @@ import {
|
|
|
14
15
|
Item,
|
|
15
16
|
Details,
|
|
16
17
|
AddButton,
|
|
17
|
-
CloseUpselling,
|
|
18
18
|
TopBar,
|
|
19
19
|
TopActions
|
|
20
20
|
} from './styles'
|
|
21
|
-
import { ProductForm } from '../ProductForm';
|
|
22
21
|
import { OrderSummary } from '../OrderSummary';
|
|
23
22
|
import { ScrollView } from 'react-native-gesture-handler';
|
|
24
23
|
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
@@ -28,18 +27,18 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
|
|
|
28
27
|
isCustomMode,
|
|
29
28
|
upsellingProducts,
|
|
30
29
|
business,
|
|
31
|
-
cart,
|
|
32
30
|
handleUpsellingPage,
|
|
33
31
|
handleCloseUpsellingPage,
|
|
34
32
|
openUpselling,
|
|
35
33
|
canOpenUpselling,
|
|
36
34
|
setCanOpenUpselling,
|
|
37
|
-
isFromCart
|
|
35
|
+
isFromCart,
|
|
36
|
+
onNavigationRedirect,
|
|
37
|
+
onGoBack
|
|
38
38
|
} = props
|
|
39
39
|
|
|
40
40
|
const theme = useTheme();
|
|
41
41
|
|
|
42
|
-
|
|
43
42
|
const styles = StyleSheet.create({
|
|
44
43
|
imageStyle: {
|
|
45
44
|
width: 73,
|
|
@@ -66,14 +65,25 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
|
|
|
66
65
|
}
|
|
67
66
|
})
|
|
68
67
|
|
|
69
|
-
const [actualProduct, setActualProduct] = useState<any>(null)
|
|
70
68
|
const [modalIsOpen, setModalIsOpen] = useState(false)
|
|
69
|
+
const [{ carts }] = useOrder()
|
|
71
70
|
const [{ parsePrice }] = useUtils()
|
|
72
71
|
const [, t] = useLanguage()
|
|
73
72
|
const { bottom } = useSafeAreaInsets()
|
|
74
73
|
|
|
74
|
+
const cart = carts?.[`businessId:${props.businessId}`] ?? {}
|
|
75
|
+
const cartProducts = cart?.products?.length
|
|
76
|
+
? cart?.products.map((product: any) => product.id)
|
|
77
|
+
: []
|
|
78
|
+
|
|
79
|
+
const productsList = !upsellingProducts.loading && !upsellingProducts.error
|
|
80
|
+
? upsellingProducts?.products?.length
|
|
81
|
+
? upsellingProducts?.products.filter((product: any) => !cartProducts.includes(product.id))
|
|
82
|
+
: (props?.products ?? []).filter((product: any) => !cartProducts.includes(product.id)) ?? []
|
|
83
|
+
: []
|
|
84
|
+
|
|
75
85
|
useEffect(() => {
|
|
76
|
-
if (!isCustomMode) {
|
|
86
|
+
if (!isCustomMode && !props.products) {
|
|
77
87
|
if (!upsellingProducts.loading) {
|
|
78
88
|
if (upsellingProducts?.products?.length && !isFromCart) {
|
|
79
89
|
setCanOpenUpselling && setCanOpenUpselling(true)
|
|
@@ -81,25 +91,15 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
|
|
|
81
91
|
handleUpsellingPage && handleUpsellingPage()
|
|
82
92
|
}
|
|
83
93
|
}
|
|
84
|
-
// if ((!upsellingProducts?.products?.length && !upsellingProducts.loading && !canOpenUpselling && openUpselling) ||
|
|
85
|
-
// (!upsellingProducts?.products?.length && !upsellingProducts.loading && openUpselling)) {
|
|
86
|
-
// handleUpsellingPage && handleUpsellingPage()
|
|
87
|
-
// }
|
|
88
94
|
}
|
|
89
95
|
}, [upsellingProducts.loading, upsellingProducts?.products.length])
|
|
90
96
|
|
|
91
|
-
useEffect(() => {
|
|
92
|
-
if (!cart?.validate && cart?.products?.length == 0) handleCloseUpsellingPage()
|
|
93
|
-
}, [cart])
|
|
94
|
-
|
|
95
97
|
const handleFormProduct = (product: any) => {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
setActualProduct(null)
|
|
102
|
-
setModalIsOpen(false)
|
|
98
|
+
onNavigationRedirect && onNavigationRedirect('ProductDetails', {
|
|
99
|
+
product: product,
|
|
100
|
+
businessId: product?.api?.businessId,
|
|
101
|
+
businessSlug: business.slug,
|
|
102
|
+
})
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
const UpsellingLayout = () => {
|
|
@@ -114,7 +114,7 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
|
|
|
114
114
|
!upsellingProducts.loading && (
|
|
115
115
|
<>
|
|
116
116
|
{
|
|
117
|
-
!upsellingProducts.error ?
|
|
117
|
+
!upsellingProducts.error ? productsList.map((product: any) => (
|
|
118
118
|
<Item key={product.id}>
|
|
119
119
|
<View style={{ flexBasis: '57%' }}>
|
|
120
120
|
<Details>
|
|
@@ -125,7 +125,7 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
|
|
|
125
125
|
<OText size={10} color={theme.colors.primary}>{t('ADD', 'Add')}</OText>
|
|
126
126
|
</AddButton>
|
|
127
127
|
</View>
|
|
128
|
-
<View
|
|
128
|
+
<View>
|
|
129
129
|
<OIcon url={product.images} style={styles.imageStyle} />
|
|
130
130
|
</View>
|
|
131
131
|
</Item>
|
|
@@ -143,75 +143,73 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
|
|
|
143
143
|
)
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
+
const UpsellingContent = () => {
|
|
147
|
+
return (
|
|
148
|
+
<>
|
|
149
|
+
<TopBar style={{ paddingTop: Platform.OS == 'ios' ? 10 : 30 }}>
|
|
150
|
+
<TopActions onPress={() => onGoBack()}>
|
|
151
|
+
<OIcon src={theme.images.general.arrow_left} width={15} />
|
|
152
|
+
</TopActions>
|
|
153
|
+
<TopActions style={styles.cancelBtn} onPress={() => handleUpsellingPage()}>
|
|
154
|
+
<OText size={12} color={theme.colors.textSecondary}>{t('CANCEL', 'Cancel')}</OText>
|
|
155
|
+
</TopActions>
|
|
156
|
+
</TopBar>
|
|
157
|
+
<ScrollView style={{ marginBottom: props.isPage ? 40 : bottom + (Platform.OS == 'ios' ? 96 : 130) }} showsVerticalScrollIndicator={false}>
|
|
158
|
+
{productsList.length > 0 &&
|
|
159
|
+
<View style={{ paddingHorizontal: 40, overflow: 'visible' }}>
|
|
160
|
+
<OText size={16} lineHeight={24} weight={'500'}>{t('WANT_SOMETHING_ELSE', 'Do you want something else?')}</OText>
|
|
161
|
+
<UpsellingLayout />
|
|
162
|
+
</View>
|
|
163
|
+
}
|
|
164
|
+
<View style={{ paddingHorizontal: 40 }}>
|
|
165
|
+
<OText size={20} lineHeight={30} weight={600} style={{ marginTop: 10, marginBottom: 17 }}>{t('YOUR_CART', 'Your cart')}</OText>
|
|
166
|
+
<OrderSummary
|
|
167
|
+
cart={cart}
|
|
168
|
+
isCartPending={cart?.status === 2}
|
|
169
|
+
onNavigationRedirect={onNavigationRedirect}
|
|
170
|
+
/>
|
|
171
|
+
</View>
|
|
172
|
+
</ScrollView>
|
|
173
|
+
<View
|
|
174
|
+
style={{
|
|
175
|
+
alignItems: 'center',
|
|
176
|
+
bottom: props.isPage ? 20 : Platform.OS === 'ios' ? bottom + 59 : bottom + 125
|
|
177
|
+
}}
|
|
178
|
+
>
|
|
179
|
+
<OButton
|
|
180
|
+
imgRightSrc=''
|
|
181
|
+
text={t('CHECKOUT', 'Checkout')}
|
|
182
|
+
style={{...styles.closeUpsellingButton}}
|
|
183
|
+
textStyle={{ color: theme.colors.white, fontSize: 14 }}
|
|
184
|
+
onClick={() => handleUpsellingPage()}
|
|
185
|
+
/>
|
|
186
|
+
</View>
|
|
187
|
+
</>
|
|
188
|
+
)
|
|
189
|
+
}
|
|
190
|
+
|
|
146
191
|
return (
|
|
147
192
|
<>
|
|
148
193
|
{isCustomMode ? (
|
|
149
194
|
<UpsellingLayout />
|
|
150
195
|
) : (
|
|
151
196
|
<>
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
<OText size={12} color={theme.colors.textSecondary}>{t('CANCEL', 'Cancel')}</OText>
|
|
167
|
-
</TopActions>
|
|
168
|
-
</TopBar>
|
|
169
|
-
<ScrollView style={{ marginBottom: bottom + (Platform.OS == 'ios' ? 96 : 130) }} showsVerticalScrollIndicator={false}>
|
|
170
|
-
{upsellingProducts?.products?.length > 0 &&
|
|
171
|
-
<View style={{ paddingHorizontal: 40, overflow: 'visible' }}>
|
|
172
|
-
<OText size={16} lineHeight={24} weight={'500'}>{t('WANT_SOMETHING_ELSE', 'Do you want something else?')}</OText>
|
|
173
|
-
<UpsellingLayout />
|
|
174
|
-
</View>
|
|
175
|
-
}
|
|
176
|
-
<View style={{ paddingHorizontal: 40 }}>
|
|
177
|
-
<OText size={20} lineHeight={30} weight={600} style={{ marginTop: 10, marginBottom: 17 }}>{t('YOUR_CART', 'Your cart')}</OText>
|
|
178
|
-
<OrderSummary
|
|
179
|
-
cart={cart}
|
|
180
|
-
isCartPending={cart?.status === 2}
|
|
181
|
-
/>
|
|
182
|
-
</View>
|
|
183
|
-
</ScrollView>
|
|
184
|
-
<View style={{alignItems: 'center', bottom: Platform.OS === 'ios' ? bottom + 59 : bottom + 125}}>
|
|
185
|
-
<OButton
|
|
186
|
-
imgRightSrc=''
|
|
187
|
-
text={t('CHECKOUT', 'Checkout')}
|
|
188
|
-
style={{...styles.closeUpsellingButton}}
|
|
189
|
-
textStyle={{ color: theme.colors.white, fontSize: 14 }}
|
|
190
|
-
onClick={() => handleUpsellingPage()}
|
|
191
|
-
/>
|
|
192
|
-
</View>
|
|
193
|
-
</OBottomPopup>
|
|
194
|
-
)}
|
|
195
|
-
</>
|
|
196
|
-
)}
|
|
197
|
+
{props.isPage ? (
|
|
198
|
+
<UpsellingContent />
|
|
199
|
+
) : (
|
|
200
|
+
canOpenUpselling && !modalIsOpen && (
|
|
201
|
+
<OBottomPopup
|
|
202
|
+
title={''}
|
|
203
|
+
open={openUpselling}
|
|
204
|
+
onClose={() => handleUpsellingPage()}
|
|
205
|
+
isStatusBar
|
|
206
|
+
>
|
|
207
|
+
<UpsellingContent />
|
|
208
|
+
</OBottomPopup>
|
|
209
|
+
)
|
|
210
|
+
)}
|
|
197
211
|
</>
|
|
198
212
|
)}
|
|
199
|
-
<OModal
|
|
200
|
-
open={modalIsOpen}
|
|
201
|
-
onClose={() => setModalIsOpen(false)}
|
|
202
|
-
entireModal
|
|
203
|
-
customClose
|
|
204
|
-
>
|
|
205
|
-
{actualProduct && (
|
|
206
|
-
<ProductForm
|
|
207
|
-
product={actualProduct}
|
|
208
|
-
businessId={actualProduct?.api?.businessId}
|
|
209
|
-
businessSlug={business.slug}
|
|
210
|
-
onSave={() => handleSaveProduct()}
|
|
211
|
-
onClose={() => setModalIsOpen(false)}
|
|
212
|
-
/>
|
|
213
|
-
)}
|
|
214
|
-
</OModal>
|
|
215
213
|
</>
|
|
216
214
|
)
|
|
217
215
|
}
|
|
@@ -438,6 +438,10 @@ export interface UpsellingProductsParams {
|
|
|
438
438
|
cart?: any;
|
|
439
439
|
handleCloseUpsellingPage: () => void;
|
|
440
440
|
isFromCart?: boolean;
|
|
441
|
+
isPage?: boolean;
|
|
442
|
+
products?: any;
|
|
443
|
+
onNavigationRedirect?: any;
|
|
444
|
+
onGoBack?: any;
|
|
441
445
|
}
|
|
442
446
|
|
|
443
447
|
export interface GoogleMapsParams {
|