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.
Files changed (26) hide show
  1. package/package.json +2 -1
  2. package/src/assets/images/business_list_banner.jpg +0 -0
  3. package/themes/original/index.tsx +2 -0
  4. package/themes/original/src/components/BusinessesListing/index.tsx +7 -0
  5. package/themes/original/src/components/BusinessesListing/styles.tsx +6 -1
  6. package/themes/original/src/components/OrderProgress/index.tsx +208 -0
  7. package/themes/original/src/components/OrderProgress/styles.tsx +30 -0
  8. package/themes/original/src/components/ProductForm/index.tsx +159 -56
  9. package/themes/original/src/components/ProductForm/styles.tsx +1 -1
  10. package/themes/single-business/src/components/ActiveOrders/index.tsx +20 -19
  11. package/themes/single-business/src/components/BusinessProductsListing/index.tsx +4 -4
  12. package/themes/single-business/src/components/Cart/index.tsx +39 -47
  13. package/themes/single-business/src/components/Cart/styles.tsx +1 -0
  14. package/themes/single-business/src/components/LoginForm/index.tsx +147 -89
  15. package/themes/single-business/src/components/LoginForm/styles.tsx +33 -28
  16. package/themes/single-business/src/components/OrderDetails/index.tsx +32 -12
  17. package/themes/single-business/src/components/OrdersOption/index.tsx +50 -50
  18. package/themes/single-business/src/components/OrdersOption/styles.tsx +1 -1
  19. package/themes/single-business/src/components/PreviousOrders/index.tsx +97 -83
  20. package/themes/single-business/src/components/PromotionCard/index.tsx +10 -2
  21. package/themes/single-business/src/components/Promotions/index.tsx +10 -15
  22. package/themes/single-business/src/components/ReviewOrder/index.tsx +299 -274
  23. package/themes/single-business/src/components/ReviewOrder/styles.tsx +23 -26
  24. package/themes/single-business/src/components/UpsellingProducts/index.tsx +230 -189
  25. package/themes/single-business/src/components/UpsellingProducts/styles.tsx +24 -18
  26. 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.7",
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",
@@ -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
+ &nbsp;-&nbsp;
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
- {product?.ingredients.length > 0 && (
170
- <TouchableOpacity
171
- key={`eopt_all_00`}
172
- onPress={() => setSelectedOpt(-1)}
173
- style={[
174
- styles.extraItem,
175
- {
176
- borderBottomColor:
177
- selOpt == -1 ? theme.colors.textNormal : theme.colors.border,
178
- },
179
- ]}>
180
- <OText
181
- color={selOpt == -1 ? theme.colors.textNormal : theme.colors.textSecondary}
182
- size={selOpt == -1 ? 14 : 12}
183
- weight={selOpt == -1 ? '600' : 'normal'}>
184
- {t('INGREDIENTS', 'Ingredients')}
185
- </OText>
186
- </TouchableOpacity>
187
- )}
188
- {options.map(({ id, name, respect_to }: any) => (
189
- <React.Fragment key={`cont_key_${id}`}>
190
- {respect_to == null && (
191
- <TouchableOpacity
192
- key={`eopt_key_${id}`}
193
- onPress={() => setSelectedOpt(id)}
194
- style={[
195
- styles.extraItem,
196
- {
197
- borderBottomColor:
198
- selOpt == id ? theme.colors.textNormal : theme.colors.border,
199
- },
200
- ]}>
201
- <OText
202
- color={
203
- selOpt == id ? theme.colors.textNormal : theme.colors.textSecondary
204
- }
205
- size={selOpt == id ? 14 : 12}
206
- weight={selOpt == id ? '600' : 'normal'}>
207
- {name}
208
- </OText>
209
- </TouchableOpacity>
210
- )}
211
- </React.Fragment>
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
- <ProductHeader
242
- source={{ uri: product?.images || productCart?.images }}
243
- style={{height: windowWidth}}
244
- resizeMode={'contain'}
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>
@@ -77,4 +77,4 @@ export const ProductActions = styled.View`
77
77
  `
78
78
  export const ExtraOptionWrap = styled.ScrollView`
79
79
  margin-horizontal: -40px;
80
- `;
80
+ `;
@@ -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
- <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
- </>
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