ordering-ui-react-native 0.12.7 → 0.12.11
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 +2 -1
- package/src/assets/images/business_list_banner.jpg +0 -0
- package/themes/original/index.tsx +2 -0
- package/themes/original/src/components/BusinessesListing/index.tsx +7 -0
- package/themes/original/src/components/BusinessesListing/styles.tsx +6 -1
- package/themes/original/src/components/OrderProgress/index.tsx +208 -0
- package/themes/original/src/components/OrderProgress/styles.tsx +30 -0
- package/themes/original/src/components/ProductForm/index.tsx +159 -56
- package/themes/original/src/components/ProductForm/styles.tsx +1 -1
- package/themes/single-business/src/components/ActiveOrders/index.tsx +20 -19
- package/themes/single-business/src/components/BusinessProductsListing/index.tsx +4 -4
- package/themes/single-business/src/components/Cart/index.tsx +39 -47
- package/themes/single-business/src/components/Cart/styles.tsx +1 -0
- package/themes/single-business/src/components/LoginForm/index.tsx +147 -89
- package/themes/single-business/src/components/LoginForm/styles.tsx +33 -28
- package/themes/single-business/src/components/OrderDetails/index.tsx +32 -12
- package/themes/single-business/src/components/OrdersOption/index.tsx +50 -50
- package/themes/single-business/src/components/OrdersOption/styles.tsx +1 -1
- package/themes/single-business/src/components/PreviousOrders/index.tsx +97 -83
- package/themes/single-business/src/components/PromotionCard/index.tsx +10 -2
- package/themes/single-business/src/components/Promotions/index.tsx +10 -15
- package/themes/single-business/src/components/ReviewOrder/index.tsx +299 -274
- package/themes/single-business/src/components/ReviewOrder/styles.tsx +23 -26
- package/themes/single-business/src/components/UpsellingProducts/index.tsx +230 -189
- package/themes/single-business/src/components/UpsellingProducts/styles.tsx +24 -18
- package/themes/single-business/src/types/index.tsx +10 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ordering-ui-react-native",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.11",
|
|
4
4
|
"description": "Reusable components made in react native",
|
|
5
5
|
"main": "src/index.tsx",
|
|
6
6
|
"author": "ordering.inc",
|
|
@@ -100,6 +100,7 @@
|
|
|
100
100
|
"react-native-snap-carousel": "^3.9.1",
|
|
101
101
|
"react-native-sound": "^0.11.1",
|
|
102
102
|
"react-native-swipe-gestures": "^1.0.5",
|
|
103
|
+
"react-native-swiper": "^1.6.0",
|
|
103
104
|
"react-native-uuid": "^2.0.1",
|
|
104
105
|
"react-native-vector-icons": "^7.1.0",
|
|
105
106
|
"react-native-webview": "^11.6.4",
|
|
Binary file
|
|
@@ -14,6 +14,7 @@ import { ForgotPasswordForm } from './src/components/ForgotPasswordForm';
|
|
|
14
14
|
import { MomentOption } from './src/components/MomentOption';
|
|
15
15
|
import { OrdersOption } from './src/components/OrdersOption';
|
|
16
16
|
import { OrderDetails } from './src/components/OrderDetails';
|
|
17
|
+
import { OrderProgress } from './src/components/OrderProgress';
|
|
17
18
|
import { UserProfileForm } from './src/components/UserProfileForm';
|
|
18
19
|
import { ReviewOrder } from './src/components/ReviewOrder';
|
|
19
20
|
import { UserProfile } from './src/components/UserProfile';
|
|
@@ -67,6 +68,7 @@ export {
|
|
|
67
68
|
MomentOption,
|
|
68
69
|
OrdersOption,
|
|
69
70
|
OrderDetails,
|
|
71
|
+
OrderProgress,
|
|
70
72
|
UserProfileForm,
|
|
71
73
|
ReviewOrder,
|
|
72
74
|
UserProfile,
|
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
HeaderWrapper,
|
|
26
26
|
ListWrapper,
|
|
27
27
|
FeaturedWrapper,
|
|
28
|
+
OrderProgressWrapper
|
|
28
29
|
} from './styles';
|
|
29
30
|
|
|
30
31
|
import { SearchBar } from '../SearchBar';
|
|
@@ -38,6 +39,7 @@ import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
|
38
39
|
import { BusinessFeaturedController } from '../BusinessFeaturedController';
|
|
39
40
|
import { HighestRatedBusinesses } from '../HighestRatedBusinesses';
|
|
40
41
|
import { getTypesText } from '../../utils';
|
|
42
|
+
import { OrderProgress } from '../OrderProgress';
|
|
41
43
|
|
|
42
44
|
const PIXELS_TO_SCROLL = 1000;
|
|
43
45
|
|
|
@@ -224,6 +226,11 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
|
|
|
224
226
|
</View>
|
|
225
227
|
</OrderControlContainer>
|
|
226
228
|
</HeaderWrapper>
|
|
229
|
+
<OrderProgressWrapper>
|
|
230
|
+
<OrderProgress
|
|
231
|
+
{...props}
|
|
232
|
+
/>
|
|
233
|
+
</OrderProgressWrapper>
|
|
227
234
|
{featuredBusiness && featuredBusiness.length > 0 && (
|
|
228
235
|
<FeaturedWrapper>
|
|
229
236
|
<OText size={16} style={{ marginLeft: 40 }} weight={Platform.OS === 'ios' ? '600' : 'bold'}>{t('FEATURED_BUSINESS', 'Featured business')}</OText>
|
|
@@ -67,4 +67,9 @@ export const FeaturedWrapper = styled.View`
|
|
|
67
67
|
background-color: ${(props: any) => props.theme.colors.backgroundLight};
|
|
68
68
|
height: 220px;
|
|
69
69
|
paddingVertical: 30px;
|
|
70
|
-
`;
|
|
70
|
+
`;
|
|
71
|
+
|
|
72
|
+
export const OrderProgressWrapper = styled.View`
|
|
73
|
+
margin-top: 37px;
|
|
74
|
+
padding-horizontal: 40px;
|
|
75
|
+
`
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import {
|
|
3
|
+
OrderList,
|
|
4
|
+
useLanguage,
|
|
5
|
+
useUtils
|
|
6
|
+
} from 'ordering-components/native'
|
|
7
|
+
import { useTheme } from 'styled-components/native';
|
|
8
|
+
import IconAntDesign from 'react-native-vector-icons/AntDesign'
|
|
9
|
+
import moment from 'moment';
|
|
10
|
+
import { OText } from '../shared'
|
|
11
|
+
import { NotFoundSource } from '../NotFoundSource'
|
|
12
|
+
import { View, StyleSheet, TouchableOpacity } from 'react-native'
|
|
13
|
+
import { Placeholder, Fade } from "rn-placeholder";
|
|
14
|
+
import FastImage from 'react-native-fast-image'
|
|
15
|
+
import {
|
|
16
|
+
ProgressContentWrapper,
|
|
17
|
+
ProgressBar,
|
|
18
|
+
TimeWrapper,
|
|
19
|
+
ProgressTextWrapper,
|
|
20
|
+
OrderInfoWrapper
|
|
21
|
+
} from './styles'
|
|
22
|
+
|
|
23
|
+
const OrderProgressUI = (props: any) => {
|
|
24
|
+
const {
|
|
25
|
+
orderList,
|
|
26
|
+
navigation
|
|
27
|
+
} = props
|
|
28
|
+
|
|
29
|
+
const theme = useTheme();
|
|
30
|
+
|
|
31
|
+
const [, t] = useLanguage()
|
|
32
|
+
const { loading, error, orders: values } = orderList
|
|
33
|
+
const [{ optimizeImage, parseDate, parseTime }] = useUtils()
|
|
34
|
+
const imageFails = theme.images.general.emptyActiveOrders
|
|
35
|
+
|
|
36
|
+
const styles = StyleSheet.create({
|
|
37
|
+
main: {
|
|
38
|
+
flexDirection: 'column',
|
|
39
|
+
backgroundColor: '#FFFFFF',
|
|
40
|
+
flex: 1,
|
|
41
|
+
padding: 15,
|
|
42
|
+
borderRadius: 8,
|
|
43
|
+
shadowOffset: {
|
|
44
|
+
width: 1,
|
|
45
|
+
height: 1
|
|
46
|
+
},
|
|
47
|
+
shadowColor: '#000',
|
|
48
|
+
shadowOpacity: 0.1,
|
|
49
|
+
shadowRadius: 1,
|
|
50
|
+
elevation: 2
|
|
51
|
+
},
|
|
52
|
+
logoWrapper: {
|
|
53
|
+
overflow: 'hidden',
|
|
54
|
+
backgroundColor: 'white',
|
|
55
|
+
borderRadius: 8,
|
|
56
|
+
shadowColor: '#000000',
|
|
57
|
+
shadowOffset: { width: 1, height: 1 },
|
|
58
|
+
shadowOpacity: 0.1,
|
|
59
|
+
shadowRadius: 1,
|
|
60
|
+
elevation: 3
|
|
61
|
+
},
|
|
62
|
+
logo: {
|
|
63
|
+
width: 50,
|
|
64
|
+
height: 50,
|
|
65
|
+
borderRadius: 8,
|
|
66
|
+
resizeMode: 'stretch',
|
|
67
|
+
},
|
|
68
|
+
navigationButton: {
|
|
69
|
+
flexDirection: 'row',
|
|
70
|
+
alignItems: 'center'
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
const getOrderStatus = (s: any) => {
|
|
75
|
+
const status = parseInt(s)
|
|
76
|
+
const orderStatus = [
|
|
77
|
+
{ key: 0, value: t('PENDING', theme?.defaultLanguages?.PENDING || 'Pending'), slug: 'PENDING', percentage: 25 },
|
|
78
|
+
{ key: 1, value: t('COMPLETED', theme?.defaultLanguages?.COMPLETED || 'Completed'), slug: 'COMPLETED', percentage: 100 },
|
|
79
|
+
{ key: 2, value: t('REJECTED', theme?.defaultLanguages?.REJECTED || 'Rejected'), slug: 'REJECTED', percentage: 0 },
|
|
80
|
+
{ key: 3, value: t('DRIVER_IN_BUSINESS', theme?.defaultLanguages?.DRIVER_IN_BUSINESS || 'Driver in business'), slug: 'DRIVER_IN_BUSINESS', percentage: 60 },
|
|
81
|
+
{ key: 4, value: t('PREPARATION_COMPLETED', theme?.defaultLanguages?.PREPARATION_COMPLETED || 'Preparation Completed'), slug: 'PREPARATION_COMPLETED', percentage: 70 },
|
|
82
|
+
{ key: 5, value: t('REJECTED_BY_BUSINESS', theme?.defaultLanguages?.REJECTED_BY_BUSINESS || 'Rejected by business'), slug: 'REJECTED_BY_BUSINESS', percentage: 0 },
|
|
83
|
+
{ key: 6, value: t('REJECTED_BY_DRIVER', theme?.defaultLanguages?.REJECTED_BY_DRIVER || 'Rejected by Driver'), slug: 'REJECTED_BY_DRIVER', percentage: 0 },
|
|
84
|
+
{ key: 7, value: t('ACCEPTED_BY_BUSINESS', theme?.defaultLanguages?.ACCEPTED_BY_BUSINESS || 'Accepted by business'), slug: 'ACCEPTED_BY_BUSINESS', percentage: 35 },
|
|
85
|
+
{ key: 8, value: t('ACCEPTED_BY_DRIVER', theme?.defaultLanguages?.ACCEPTED_BY_DRIVER || 'Accepted by driver'), slug: 'ACCEPTED_BY_DRIVER', percentage: 45 },
|
|
86
|
+
{ key: 9, value: t('PICK_UP_COMPLETED_BY_DRIVER', theme?.defaultLanguages?.PICK_UP_COMPLETED_BY_DRIVER || 'Pick up completed by driver'), slug: 'PICK_UP_COMPLETED_BY_DRIVER', percentage: 80 },
|
|
87
|
+
{ key: 10, value: t('PICK_UP_FAILED_BY_DRIVER', theme?.defaultLanguages?.PICK_UP_FAILED_BY_DRIVER || 'Pick up Failed by driver'), slug: 'PICK_UP_FAILED_BY_DRIVER', percentage: 0 },
|
|
88
|
+
{ key: 11, value: t('DELIVERY_COMPLETED_BY_DRIVER', theme?.defaultLanguages?.DELIVERY_COMPLETED_BY_DRIVER || 'Delivery completed by driver'), slug: 'DELIVERY_COMPLETED_BY_DRIVER', percentage: 100 },
|
|
89
|
+
{ key: 12, value: t('DELIVERY_FAILED_BY_DRIVER', theme?.defaultLanguages?.DELIVERY_FAILED_BY_DRIVER || 'Delivery Failed by driver'), slug: 'DELIVERY_FAILED_BY_DRIVER', percentage: 0 },
|
|
90
|
+
{ key: 13, value: t('PREORDER', theme?.defaultLanguages?.PREORDER || 'PreOrder'), slug: 'PREORDER', percentage: 0 },
|
|
91
|
+
{ key: 14, value: t('ORDER_NOT_READY', theme?.defaultLanguages?.ORDER_NOT_READY || 'Order not ready'), slug: 'ORDER_NOT_READY', percentage: 65 },
|
|
92
|
+
{ key: 15, value: t('ORDER_PICKEDUP_COMPLETED_BY_CUSTOMER', theme?.defaultLanguages?.ORDER_PICKEDUP_COMPLETED_BY_CUSTOMER || 'Order picked up completed by customer'), slug: 'ORDER_PICKEDUP_COMPLETED_BY_CUSTOMER', percentage: 100 },
|
|
93
|
+
{ key: 16, value: t('ORDER_STATUS_CANCELLED_BY_CUSTOMER', theme?.defaultLanguages?.ORDER_STATUS_CANCELLED_BY_CUSTOMER || 'Order cancelled by customer'), slug: 'ORDER_STATUS_CANCELLED_BY_CUSTOMER', percentage: 0 },
|
|
94
|
+
{ key: 17, value: t('ORDER_NOT_PICKEDUP_BY_CUSTOMER', theme?.defaultLanguages?.ORDER_NOT_PICKEDUP_BY_CUSTOMER || 'Order not picked up by customer'), slug: 'ORDER_NOT_PICKEDUP_BY_CUSTOMER', percentage: 0 },
|
|
95
|
+
{ key: 18, value: t('ORDER_DRIVER_ALMOST_ARRIVED_BUSINESS', theme?.defaultLanguages?.ORDER_DRIVER_ALMOST_ARRIVED_BUSINESS || 'Driver almost arrived to business'), slug: 'ORDER_DRIVER_ALMOST_ARRIVED_BUSINESS', percentage: 55 },
|
|
96
|
+
{ key: 19, value: t('ORDER_DRIVER_ALMOST_ARRIVED_CUSTOMER', theme?.defaultLanguages?.ORDER_DRIVER_ALMOST_ARRIVED_CUSTOMER || 'Driver almost arrived to customer'), slug: 'ORDER_DRIVER_ALMOST_ARRIVED_CUSTOMER', percentage: 90 },
|
|
97
|
+
{ key: 20, value: t('ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS', theme?.defaultLanguages?.ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS || 'Customer almost arrived to business'), slug: 'ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS', percentage: 90 },
|
|
98
|
+
{ key: 21, value: t('ORDER_CUSTOMER_ARRIVED_BUSINESS', theme?.defaultLanguages?.ORDER_CUSTOMER_ARRIVED_BUSINESS || 'Customer arrived to business'), slug: 'ORDER_CUSTOMER_ARRIVED_BUSINESS', percentage: 95 }
|
|
99
|
+
]
|
|
100
|
+
|
|
101
|
+
const objectStatus = orderStatus.find((o) => o.key === status)
|
|
102
|
+
|
|
103
|
+
return objectStatus && objectStatus
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const convertDiffToHours = (time: any, order: any) => {
|
|
107
|
+
const deliveryTime = order?.delivery_datetime_utc
|
|
108
|
+
? parseDate(order?.delivery_datetime_utc, { outputFormat: 'YYYY-MM-DD hh:mm A' })
|
|
109
|
+
: parseDate(order?.delivery_datetime, { utc: false, outputFormat: 'YYYY-MM-DD hh:mm A' })
|
|
110
|
+
const [hour, minute] = time.split(':')
|
|
111
|
+
const result = time ? (parseInt(hour, 10) * 60) + parseInt(minute, 10) : 0
|
|
112
|
+
const returnedDate = moment(new Date(deliveryTime)).add(result, 'minutes').format('hh:mm A')
|
|
113
|
+
return returnedDate
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const handleGoToOrder = (index: string) => {
|
|
117
|
+
navigation && navigation.navigate(index)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return (
|
|
121
|
+
<>
|
|
122
|
+
{orderList?.loading && <Placeholder height={150} Animation={Fade} />}
|
|
123
|
+
{!orderList?.loading && orderList?.orders?.length > 0 && orderList?.orders.map((order: any) => (
|
|
124
|
+
<View style={styles.main} key={order.id}>
|
|
125
|
+
<OrderInfoWrapper style={{ flex: 1 }}>
|
|
126
|
+
<View style={styles.logoWrapper}>
|
|
127
|
+
<FastImage
|
|
128
|
+
style={{ width: 50, height: 50 }}
|
|
129
|
+
source={{
|
|
130
|
+
uri: optimizeImage(order?.business?.logo, 'h_50,c_limit'),
|
|
131
|
+
priority: FastImage.priority.normal,
|
|
132
|
+
}}
|
|
133
|
+
resizeMode={FastImage.resizeMode.cover}
|
|
134
|
+
/>
|
|
135
|
+
</View>
|
|
136
|
+
<View style={{
|
|
137
|
+
paddingHorizontal: 10,
|
|
138
|
+
flex: 1
|
|
139
|
+
}}
|
|
140
|
+
>
|
|
141
|
+
<OText
|
|
142
|
+
size={13}
|
|
143
|
+
style={{
|
|
144
|
+
fontWeight: 'bold',
|
|
145
|
+
marginBottom: 3
|
|
146
|
+
}}
|
|
147
|
+
>{t('ORDER_IN_PROGRESS', 'Order in progress')}</OText>
|
|
148
|
+
<OText size={11} numberOfLines={1} ellipsizeMode='tail'>{t('RESTAURANT_PREPARING_YOUR_ORDER', 'The restaurant is preparing your order')}</OText>
|
|
149
|
+
<TouchableOpacity onPress={() => handleGoToOrder('MyOrders')}>
|
|
150
|
+
<View style={styles.navigationButton}>
|
|
151
|
+
<OText size={11} color={theme.colors.primary}>{t('GO_TO_MY_ORDERS', 'Go to my orders')}</OText>
|
|
152
|
+
<IconAntDesign
|
|
153
|
+
name='arrowright'
|
|
154
|
+
color={theme.colors.primary}
|
|
155
|
+
size={13}
|
|
156
|
+
style={{ marginHorizontal: 5 }}
|
|
157
|
+
/>
|
|
158
|
+
</View>
|
|
159
|
+
</TouchableOpacity>
|
|
160
|
+
</View>
|
|
161
|
+
</OrderInfoWrapper>
|
|
162
|
+
<View style={{ flex: 1 }}>
|
|
163
|
+
<ProgressContentWrapper>
|
|
164
|
+
<ProgressBar style={{ width: getOrderStatus(order.status)?.percentage ? `${getOrderStatus(order.status)?.percentage}%` : '0%' }} />
|
|
165
|
+
</ProgressContentWrapper>
|
|
166
|
+
<ProgressTextWrapper>
|
|
167
|
+
<OText size={12}>{getOrderStatus(order.status)?.value}</OText>
|
|
168
|
+
<TimeWrapper>
|
|
169
|
+
<OText size={11}>{t('ESTIMATED_DELIVERY', 'Estimated delivery')}</OText>
|
|
170
|
+
<OText size={11}>
|
|
171
|
+
{order?.delivery_datetime_utc
|
|
172
|
+
? parseTime(order?.delivery_datetime_utc, { outputFormat: 'hh:mm A' })
|
|
173
|
+
: parseTime(order?.delivery_datetime, { utc: false })}
|
|
174
|
+
-
|
|
175
|
+
{convertDiffToHours(order.delivery_type === 1 ? order?.business?.delivery_time : order?.business?.pickup_time, order)}
|
|
176
|
+
</OText>
|
|
177
|
+
</TimeWrapper>
|
|
178
|
+
</ProgressTextWrapper>
|
|
179
|
+
</View>
|
|
180
|
+
</View>
|
|
181
|
+
))}
|
|
182
|
+
{!orderList?.loading && orderList?.orders?.length === 0 && (
|
|
183
|
+
<NotFoundSource
|
|
184
|
+
image={imageFails}
|
|
185
|
+
content={t('NO_RESULTS_FOUND', 'Sorry, no results found')}
|
|
186
|
+
conditioned
|
|
187
|
+
/>
|
|
188
|
+
)}
|
|
189
|
+
</>
|
|
190
|
+
)
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export const OrderProgress = (props: any) => {
|
|
194
|
+
const orderProgressProps = {
|
|
195
|
+
...props,
|
|
196
|
+
UIComponent: OrderProgressUI,
|
|
197
|
+
orderStatus: [0, 3, 4, 7, 8, 9, 13, 14, 15, 18, 19, 20, 21],
|
|
198
|
+
useDefualtSessionManager: true,
|
|
199
|
+
paginationSettings: {
|
|
200
|
+
initialPage: 1,
|
|
201
|
+
pageSize: 1,
|
|
202
|
+
controlType: 'infinity'
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return <OrderList {...orderProgressProps} />
|
|
207
|
+
|
|
208
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import styled from 'styled-components/native'
|
|
2
|
+
|
|
3
|
+
export const ProgressContentWrapper = styled.View`
|
|
4
|
+
height: 12px;
|
|
5
|
+
background: #F8F9FA;
|
|
6
|
+
flex: 1;
|
|
7
|
+
`
|
|
8
|
+
|
|
9
|
+
export const ProgressBar = styled.View`
|
|
10
|
+
height: 12px;
|
|
11
|
+
background: ${(props: any) => props.theme.colors.primary};
|
|
12
|
+
`
|
|
13
|
+
|
|
14
|
+
export const TimeWrapper = styled.View`
|
|
15
|
+
flex-direction: column;
|
|
16
|
+
`
|
|
17
|
+
|
|
18
|
+
export const ProgressTextWrapper = styled.View`
|
|
19
|
+
margin-top: 7px;
|
|
20
|
+
flex-direction: row;
|
|
21
|
+
justify-content: space-between;
|
|
22
|
+
align-items: center;
|
|
23
|
+
`
|
|
24
|
+
|
|
25
|
+
export const OrderInfoWrapper = styled.View`
|
|
26
|
+
flex-direction: row;
|
|
27
|
+
width: 100%;
|
|
28
|
+
align-items: center;
|
|
29
|
+
margin-bottom: 15px;
|
|
30
|
+
`
|
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { useEffect } from 'react';
|
|
2
2
|
import {
|
|
3
3
|
ProductForm as ProductOptions,
|
|
4
4
|
useSession,
|
|
5
5
|
useLanguage,
|
|
6
6
|
useOrder,
|
|
7
|
-
useUtils
|
|
7
|
+
useUtils
|
|
8
8
|
} from 'ordering-components/native';
|
|
9
9
|
import { useTheme } from 'styled-components/native';
|
|
10
10
|
import { ProductIngredient } from '../ProductIngredient';
|
|
11
11
|
import { ProductOption } from '../ProductOption';
|
|
12
|
+
import Swiper from 'react-native-swiper'
|
|
13
|
+
import FastImage from 'react-native-fast-image';
|
|
14
|
+
import IconAntDesign from 'react-native-vector-icons/AntDesign';
|
|
12
15
|
|
|
13
|
-
import { View, TouchableOpacity, StyleSheet, Dimensions, Platform } from 'react-native';
|
|
16
|
+
import { View, TouchableOpacity, StyleSheet, Dimensions, Platform, AppRegistry } from 'react-native';
|
|
14
17
|
|
|
15
18
|
import {
|
|
16
19
|
ProductHeader,
|
|
@@ -25,7 +28,7 @@ import {
|
|
|
25
28
|
WrapperSubOption,
|
|
26
29
|
ProductComment,
|
|
27
30
|
ProductActions,
|
|
28
|
-
ExtraOptionWrap
|
|
31
|
+
ExtraOptionWrap
|
|
29
32
|
} from './styles';
|
|
30
33
|
import { OButton, OIcon, OInput, OText } from '../shared';
|
|
31
34
|
import { ScrollView } from 'react-native-gesture-handler';
|
|
@@ -110,13 +113,30 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
110
113
|
borderBottomColor: theme.colors.border,
|
|
111
114
|
justifyContent: 'center',
|
|
112
115
|
},
|
|
116
|
+
slide1: {
|
|
117
|
+
flex: 1,
|
|
118
|
+
},
|
|
119
|
+
mainSwiper : {
|
|
120
|
+
height: 258,
|
|
121
|
+
},
|
|
122
|
+
swiperButton: {
|
|
123
|
+
marginHorizontal: 30,
|
|
124
|
+
alignItems: 'center',
|
|
125
|
+
justifyContent: 'center',
|
|
126
|
+
width: 32,
|
|
127
|
+
height: 32,
|
|
128
|
+
borderRadius: 16,
|
|
129
|
+
backgroundColor: 'rgba(255,255,255,0.3)'
|
|
130
|
+
}
|
|
113
131
|
});
|
|
114
132
|
|
|
115
|
-
const [{ parsePrice }] = useUtils();
|
|
133
|
+
const [{ parsePrice, optimizeImage }] = useUtils();
|
|
116
134
|
const [, t] = useLanguage();
|
|
117
135
|
const [orderState] = useOrder();
|
|
118
136
|
const [{ auth }] = useSession();
|
|
119
137
|
const { product, loading, error } = productObject;
|
|
138
|
+
const [gallery, setGallery] = useState([])
|
|
139
|
+
const [thumbsSwiper, setThumbsSwiper] = useState(0)
|
|
120
140
|
|
|
121
141
|
const { top, bottom } = useSafeAreaInsets();
|
|
122
142
|
const { height } = useWindowDimensions();
|
|
@@ -154,63 +174,76 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
154
174
|
return sel[0]?.id !== undefined;
|
|
155
175
|
};
|
|
156
176
|
|
|
177
|
+
const handleChangeMainIndex = (index: number) => {
|
|
178
|
+
setThumbsSwiper(index)
|
|
179
|
+
}
|
|
180
|
+
|
|
157
181
|
const handleRedirectLogin = () => {
|
|
158
182
|
onClose();
|
|
159
183
|
navigation.navigate('Login');
|
|
160
184
|
};
|
|
161
185
|
|
|
186
|
+
useEffect(() => {
|
|
187
|
+
const productImgList: any = []
|
|
188
|
+
product?.images && productImgList.push(product.images)
|
|
189
|
+
for (const img of product?.gallery) {
|
|
190
|
+
productImgList.push(img.file)
|
|
191
|
+
}
|
|
192
|
+
setGallery(productImgList)
|
|
193
|
+
}, [product])
|
|
194
|
+
|
|
162
195
|
const saveErrors =
|
|
163
196
|
orderState.loading ||
|
|
164
197
|
maxProductQuantity === 0 ||
|
|
165
198
|
Object.keys(errors).length > 0;
|
|
166
199
|
|
|
167
200
|
const ExtraOptions = ({ eID, options }: any) => (
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
201
|
+
<>
|
|
202
|
+
{product?.ingredients.length > 0 && (
|
|
203
|
+
<TouchableOpacity
|
|
204
|
+
key={`eopt_all_00`}
|
|
205
|
+
onPress={() => setSelectedOpt(-1)}
|
|
206
|
+
style={[
|
|
207
|
+
styles.extraItem,
|
|
208
|
+
{
|
|
209
|
+
borderBottomColor:
|
|
210
|
+
selOpt == -1 ? theme.colors.textNormal : theme.colors.border,
|
|
211
|
+
},
|
|
212
|
+
]}>
|
|
213
|
+
<OText
|
|
214
|
+
color={selOpt == -1 ? theme.colors.textNormal : theme.colors.textSecondary}
|
|
215
|
+
size={selOpt == -1 ? 14 : 12}
|
|
216
|
+
weight={selOpt == -1 ? '600' : 'normal'}>
|
|
217
|
+
{t('INGREDIENTS', 'Ingredients')}
|
|
218
|
+
</OText>
|
|
219
|
+
</TouchableOpacity>
|
|
220
|
+
)}
|
|
221
|
+
{options.map(({ id, name, respect_to }: any) => (
|
|
222
|
+
<React.Fragment key={`cont_key_${id}`}>
|
|
223
|
+
{respect_to == null && (
|
|
224
|
+
<TouchableOpacity
|
|
225
|
+
key={`eopt_key_${id}`}
|
|
226
|
+
onPress={() => setSelectedOpt(id)}
|
|
227
|
+
style={[
|
|
228
|
+
styles.extraItem,
|
|
229
|
+
{
|
|
230
|
+
borderBottomColor:
|
|
231
|
+
selOpt == id ? theme.colors.textNormal : theme.colors.border,
|
|
232
|
+
},
|
|
233
|
+
]}>
|
|
234
|
+
<OText
|
|
235
|
+
color={
|
|
236
|
+
selOpt == id ? theme.colors.textNormal : theme.colors.textSecondary
|
|
237
|
+
}
|
|
238
|
+
size={selOpt == id ? 14 : 12}
|
|
239
|
+
weight={selOpt == id ? '600' : 'normal'}>
|
|
240
|
+
{name}
|
|
241
|
+
</OText>
|
|
242
|
+
</TouchableOpacity>
|
|
243
|
+
)}
|
|
244
|
+
</React.Fragment>
|
|
245
|
+
))}
|
|
246
|
+
</>
|
|
214
247
|
);
|
|
215
248
|
|
|
216
249
|
return (
|
|
@@ -238,11 +271,81 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
238
271
|
</View>
|
|
239
272
|
) : (
|
|
240
273
|
<>
|
|
241
|
-
<
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
274
|
+
<Swiper
|
|
275
|
+
loop={false}
|
|
276
|
+
showsButtons={true}
|
|
277
|
+
style={styles.mainSwiper}
|
|
278
|
+
// index={thumbsSwiper}
|
|
279
|
+
onIndexChanged={(index) => handleChangeMainIndex(index)}
|
|
280
|
+
prevButton={
|
|
281
|
+
<View style={styles.swiperButton}>
|
|
282
|
+
<IconAntDesign
|
|
283
|
+
name="caretleft"
|
|
284
|
+
color={theme.colors.white}
|
|
285
|
+
size={13}
|
|
286
|
+
// style={styles.starIcon}
|
|
287
|
+
/>
|
|
288
|
+
</View>
|
|
289
|
+
}
|
|
290
|
+
nextButton={
|
|
291
|
+
<View style={styles.swiperButton}>
|
|
292
|
+
<IconAntDesign
|
|
293
|
+
name="caretright"
|
|
294
|
+
color={theme.colors.white}
|
|
295
|
+
size={13}
|
|
296
|
+
// style={styles.starIcon}
|
|
297
|
+
/>
|
|
298
|
+
</View>
|
|
299
|
+
}
|
|
300
|
+
>
|
|
301
|
+
{gallery.length > 0 && gallery.map((img, i) => (
|
|
302
|
+
<View
|
|
303
|
+
style={styles.slide1}
|
|
304
|
+
key={i}
|
|
305
|
+
>
|
|
306
|
+
<FastImage
|
|
307
|
+
style={{ height: '100%' }}
|
|
308
|
+
source={{
|
|
309
|
+
uri: optimizeImage(img, 'h_258,c_limit'),
|
|
310
|
+
priority: FastImage.priority.normal,
|
|
311
|
+
}}
|
|
312
|
+
/>
|
|
313
|
+
</View>
|
|
314
|
+
))}
|
|
315
|
+
</Swiper>
|
|
316
|
+
<ScrollView
|
|
317
|
+
horizontal
|
|
318
|
+
contentContainerStyle={{
|
|
319
|
+
paddingHorizontal: 30,
|
|
320
|
+
paddingVertical: 15
|
|
321
|
+
}}
|
|
322
|
+
>
|
|
323
|
+
{gallery.length > 0 && gallery.map((img, index) => (
|
|
324
|
+
<View
|
|
325
|
+
key={index}
|
|
326
|
+
style={{
|
|
327
|
+
height: 56,
|
|
328
|
+
borderRadius: 8,
|
|
329
|
+
margin: 8,
|
|
330
|
+
opacity: index === thumbsSwiper ? 1 : 0.8
|
|
331
|
+
}}
|
|
332
|
+
>
|
|
333
|
+
<OIcon
|
|
334
|
+
url={img}
|
|
335
|
+
style={{
|
|
336
|
+
borderColor: theme.colors.lightGray,
|
|
337
|
+
borderRadius: 8,
|
|
338
|
+
minHeight: '100%'
|
|
339
|
+
}}
|
|
340
|
+
width={56}
|
|
341
|
+
height={56}
|
|
342
|
+
cover
|
|
343
|
+
/>
|
|
344
|
+
{/* {thumbsSwiper === 2 && <OText color='red'>{index.toString()}</OText>}
|
|
345
|
+
{thumbsSwiper === 3 && <OText color='red'>{index.toString()}</OText>} */}
|
|
346
|
+
</View>
|
|
347
|
+
))}
|
|
348
|
+
</ScrollView>
|
|
246
349
|
</>
|
|
247
350
|
)}
|
|
248
351
|
</WrapHeader>
|
|
@@ -10,12 +10,11 @@ import {
|
|
|
10
10
|
BusinessInformation,
|
|
11
11
|
Price,
|
|
12
12
|
} from './styles';
|
|
13
|
-
import { View, StyleSheet } from 'react-native';
|
|
13
|
+
import { View, StyleSheet, TouchableOpacity } from 'react-native';
|
|
14
14
|
|
|
15
15
|
import { ActiveOrdersParams } from '../../types';
|
|
16
16
|
import moment from 'moment';
|
|
17
17
|
import { useTheme } from 'styled-components/native';
|
|
18
|
-
import { TouchableOpacity } from 'react-native-gesture-handler';
|
|
19
18
|
|
|
20
19
|
export const ActiveOrders = (props: ActiveOrdersParams) => {
|
|
21
20
|
const {
|
|
@@ -85,11 +84,11 @@ export const ActiveOrders = (props: ActiveOrdersParams) => {
|
|
|
85
84
|
<OText size={12} lineHeight={18}>
|
|
86
85
|
{parsePrice(order?.summary?.total || order?.total)}
|
|
87
86
|
</OText>
|
|
88
|
-
{!isPreorders &&
|
|
87
|
+
{/* {!isPreorders &&
|
|
89
88
|
<TouchableOpacity onPress={handleLike}>
|
|
90
89
|
<OIcon src={theme.images.general.heart} color={theme.colors.red} width={16} />
|
|
91
90
|
</TouchableOpacity>
|
|
92
|
-
}
|
|
91
|
+
} */}
|
|
93
92
|
</Price>
|
|
94
93
|
</OrderInformation>
|
|
95
94
|
</Information>
|
|
@@ -98,21 +97,23 @@ export const ActiveOrders = (props: ActiveOrdersParams) => {
|
|
|
98
97
|
);
|
|
99
98
|
|
|
100
99
|
return (
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
100
|
+
orders.length === 0 ? null : (
|
|
101
|
+
<>
|
|
102
|
+
<ActiveOrdersContainer isMiniCards={configs?.google_maps_api_key?.value}>
|
|
103
|
+
{orders.length > 0 &&
|
|
104
|
+
orders.map((order: any, index: any) => (
|
|
105
|
+
<Order key={order?.id || order?.uuid} order={order} index={index} />
|
|
106
|
+
))}
|
|
107
|
+
</ActiveOrdersContainer>
|
|
108
|
+
<View
|
|
109
|
+
style={{
|
|
110
|
+
height: 8,
|
|
111
|
+
backgroundColor: theme.colors.backgroundGray100,
|
|
112
|
+
marginHorizontal: -40,
|
|
113
|
+
}}
|
|
114
|
+
/>
|
|
115
|
+
</>
|
|
116
|
+
)
|
|
116
117
|
);
|
|
117
118
|
};
|
|
118
119
|
|