ordering-ui-react-native 0.12.24 → 0.12.25

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ordering-ui-react-native",
3
- "version": "0.12.24",
3
+ "version": "0.12.25",
4
4
  "description": "Reusable components made in react native",
5
5
  "main": "src/index.tsx",
6
6
  "author": "ordering.inc",
@@ -45,6 +45,8 @@ import { OrderDetails } from './src/components/OrderDetails';
45
45
  import { OrdersOption } from './src/components/OrdersOption';
46
46
  import { OrderSummary } from './src/components/OrderSummary';
47
47
  import { OrderTypeSelector } from './src/components/OrderTypeSelector';
48
+ import { OrdersListing } from './src/components/OrdersListing';
49
+ import { OrderListOption } from './src/components/OrderListOption';
48
50
  import { PaymentOptionCash } from './src/components/PaymentOptionCash';
49
51
  import { PaymentOptions } from './src/components/PaymentOptions';
50
52
  import { PaymentOptionStripe } from './src/components/PaymentOptionStripe';
@@ -125,6 +127,8 @@ export {
125
127
  HelpOrder,
126
128
  HelpAccountAndPayment,
127
129
  OrderTypeSelector,
130
+ OrdersListing,
131
+ OrderListOption,
128
132
  Notifications,
129
133
  BottomWrapper,
130
134
  BusinessBasicInformation,
@@ -0,0 +1,231 @@
1
+ import React, { useState } from 'react';
2
+ import { StyleSheet, TouchableOpacity, View } from 'react-native';
3
+ import { useLanguage, useUtils } from 'ordering-components/native';
4
+ import {
5
+ OrdersContainer,
6
+ Card,
7
+ Information,
8
+ OrderInformation,
9
+ BusinessInformation,
10
+ Price,
11
+ OptionTitle,
12
+ Status,
13
+ } from './styles';
14
+
15
+ import { useTheme } from 'styled-components/native';
16
+ import { getTextOrderStatus } from '../../utils';
17
+ import { OButton, OText } from '../shared'
18
+
19
+ export const OrderListOption = (props: any) => {
20
+ const {
21
+ orders,
22
+ titleContent,
23
+ typeStyle,
24
+ allowedOrderStatus,
25
+ isLoadingReorder,
26
+ handleReorder,
27
+ onNavigationRedirect,
28
+ } = props;
29
+
30
+ const theme = useTheme();
31
+ const [, t] = useLanguage();
32
+ const [{ parseDate, parsePrice }] = useUtils();
33
+
34
+ const [reorderSelected, setReorderSelected] = useState<number | null>(null);
35
+ const [isReviewedOrders, setIsReviewedOrders] = useState<Array<any>>([])
36
+
37
+ const handleClickCard = (uuid: string) => {
38
+ onNavigationRedirect &&
39
+ onNavigationRedirect('OrderDetails', { orderId: uuid });
40
+ };
41
+
42
+ const handleReviewState = (orderId: any) => {
43
+ if (!orderId || isReviewedOrders.includes(orderId)) return
44
+ setIsReviewedOrders([...isReviewedOrders, orderId])
45
+ }
46
+
47
+ const handleClickOrderReview = (order: any) => {
48
+ onNavigationRedirect &&
49
+ onNavigationRedirect('ReviewOrder', {
50
+ order: {
51
+ id: order?.id,
52
+ business_id: order?.business_id,
53
+ logo: order.business?.logo,
54
+ driver: order?.driver,
55
+ products: order?.products,
56
+ review: order?.review,
57
+ user_review: order?.user_review
58
+ },
59
+ handleReviewState: handleReviewState
60
+ });
61
+ };
62
+
63
+ const handleReorderClick = (id: number) => {
64
+ setReorderSelected(id);
65
+ handleReorder(id);
66
+ };
67
+
68
+ const styles = StyleSheet.create({
69
+ reorderbutton: {
70
+ height: 23,
71
+ paddingLeft: 10,
72
+ paddingRight: 10,
73
+ borderRadius: 23,
74
+ shadowOpacity: 0,
75
+ backgroundColor: theme.colors.primaryContrast,
76
+ borderWidth: 0,
77
+ width: 80
78
+ },
79
+ reorderLoading: {
80
+ width: 80,
81
+ height: 23,
82
+ borderRadius: 23,
83
+ paddingHorizontal: 10,
84
+ },
85
+ reviewButton: {
86
+ width: 80,
87
+ height: 23,
88
+ maxHeight: 23,
89
+ backgroundColor: theme.colors.white,
90
+ alignItems: 'center',
91
+ justifyContent: 'center',
92
+ paddingHorizontal: 10,
93
+ borderRadius: 23,
94
+ borderWidth: 1,
95
+ borderColor: theme.colors.primaryContrast,
96
+ },
97
+ buttonText: {
98
+ color: theme.colors.primary,
99
+ fontSize: 10,
100
+ marginLeft: 2,
101
+ marginRight: 2,
102
+ },
103
+ });
104
+
105
+ const OrderStyleOne = ({ order }: any) => (
106
+ <Card
107
+ activeOpacity={1}
108
+ onPress={() => handleClickCard(order?.uuid)}
109
+ >
110
+ <Information>
111
+ <OrderInformation>
112
+ <BusinessInformation>
113
+ <OText size={12} lineHeight={18} weight={600} numberOfLines={1} ellipsizeMode={'tail'}>
114
+ {`${t('ORDER_NO', 'Order No')}.${order.id}`}
115
+ </OText>
116
+ <OText size={10} lineHeight={21} color={theme.colors.textSecondary}>
117
+ {order?.delivery_datetime_utc
118
+ ? parseDate(order?.delivery_datetime_utc)
119
+ : parseDate(order?.delivery_datetime, { utc: false })}
120
+ </OText>
121
+ <OText
122
+ color={theme.colors.primary}
123
+ size={10}
124
+ lineHeight={15}
125
+ weight={400}
126
+ numberOfLines={2}>
127
+ {getTextOrderStatus(order.status, t)?.value}
128
+ </OText>
129
+ </BusinessInformation>
130
+ <Price>
131
+ <OText size={12} lineHeight={18}>
132
+ {parsePrice(order?.summary?.total || order?.total)}
133
+ </OText>
134
+ </Price>
135
+ </OrderInformation>
136
+ </Information>
137
+ </Card>
138
+ );
139
+
140
+ const OrderStyleTwo = ({ order }: any) => (
141
+ <TouchableOpacity
142
+ onPress={() => handleClickCard(order?.uuid)}
143
+ activeOpacity={1}
144
+ style={{ flexDirection: 'row' }}
145
+ >
146
+ <Card themetwo>
147
+ <Information themetwo>
148
+ <OText size={12} lineHeight={18} weight={'600'} numberOfLines={1} ellipsizeMode={'tail'}>
149
+ {`${t('ORDER_NO', 'Order No')}.${order.id}`}
150
+ </OText>
151
+ <OText
152
+ size={10}
153
+ lineHeight={21}
154
+ color={theme.colors.textSecondary}
155
+ style={{ marginVertical: 3 }}
156
+ numberOfLines={1}>
157
+ {order?.delivery_datetime_utc
158
+ ? parseDate(order?.delivery_datetime_utc)
159
+ : parseDate(order?.delivery_datetime, { utc: false })}
160
+ </OText>
161
+ <OText
162
+ color={theme.colors.primary}
163
+ size={10}
164
+ lineHeight={15}
165
+ numberOfLines={1}>
166
+ {getTextOrderStatus(order.status, t)?.value}
167
+ </OText>
168
+ </Information>
169
+ <Status>
170
+ <OButton
171
+ text={t('REORDER', 'Reorder')}
172
+ imgRightSrc={''}
173
+ textStyle={styles.buttonText}
174
+ style={
175
+ isLoadingReorder && order.id === reorderSelected
176
+ ? styles.reorderLoading
177
+ : styles.reorderbutton
178
+ }
179
+ onClick={() => handleReorderClick(order.id)}
180
+ isLoading={isLoadingReorder && order.id === reorderSelected}
181
+ />
182
+ {allowedOrderStatus.includes(parseInt(order?.status)) &&
183
+ !order.review && !isReviewedOrders.includes(order?.id) &&
184
+ (
185
+ <TouchableOpacity
186
+ onPress={() => handleClickOrderReview(order)}
187
+ style={styles.reviewButton}>
188
+ <OText size={10} color={theme.colors.primary} numberOfLines={1}>
189
+ {t('REVIEW', 'Review')}
190
+ </OText>
191
+ </TouchableOpacity>
192
+ )}
193
+ </Status>
194
+ </Card>
195
+ </TouchableOpacity>
196
+ )
197
+
198
+ return (
199
+ <>
200
+ <OptionTitle>
201
+ <OText
202
+ size={16}
203
+ color={theme.colors.textPrimary}
204
+ mBottom={10}
205
+ >
206
+ {titleContent}
207
+ </OText>
208
+ </OptionTitle>
209
+ <OrdersContainer>
210
+ {orders.length > 0 &&
211
+ orders.map((order: any, index: any) => (
212
+ <React.Fragment key={order?.id || order?.uuid}>
213
+ {typeStyle === 1 && (
214
+ <OrderStyleOne order={order} />
215
+ )}
216
+ {typeStyle === 2 && (
217
+ <OrderStyleTwo order={order} />
218
+ )}
219
+ </React.Fragment>
220
+ ))}
221
+ </OrdersContainer>
222
+ <View
223
+ style={{
224
+ height: 8,
225
+ backgroundColor: theme.colors.backgroundGray100,
226
+ marginBottom: 10
227
+ }}
228
+ />
229
+ </>
230
+ );
231
+ };
@@ -0,0 +1,62 @@
1
+ import styled, { css } from 'styled-components/native'
2
+
3
+ export const OrdersContainer = styled.View`
4
+ margin-bottom: 10px;
5
+ `
6
+
7
+ export const Card = styled.TouchableOpacity`
8
+ ${(props: any) => props.themetwo ? css`
9
+ padding-vertical: 5px;
10
+ margin-bottom: 12px;
11
+ flex-direction: row;
12
+ width: 100%;
13
+ ` : css`
14
+ flex: 1;
15
+ `};
16
+ `
17
+
18
+ export const Map = styled.View`
19
+ flex: 1;
20
+ height: 125px;
21
+ margin-bottom: 22px;
22
+ `
23
+
24
+ export const Information = styled.View`
25
+ ${(props: any) => props.themetwo ? css`
26
+ justify-content: center;
27
+ align-items: flex-start;
28
+ margin-end: 7px;
29
+ flex: 1;
30
+ ` : css`
31
+ flex-direction: row;
32
+ align-items: center;
33
+ padding-vertical: 5px;
34
+ margin-bottom: 12px;
35
+ `};
36
+ `
37
+
38
+ export const OrderInformation = styled.View`
39
+ flex-direction: row;
40
+ justify-content: space-between;
41
+ flex: 1;
42
+ `
43
+
44
+ export const BusinessInformation = styled.View`
45
+ flex-basis: 65%;
46
+ `
47
+
48
+ export const Price = styled.View`
49
+ justify-content: flex-start;
50
+ align-items: flex-end;
51
+ margin-left: 10px;
52
+ width: 30%;
53
+ `
54
+
55
+ export const OptionTitle = styled.View`
56
+ margin-top: 10px;
57
+ `
58
+
59
+ export const Status = styled.View`
60
+ align-items: center;
61
+ justify-content: space-between;
62
+ `
@@ -0,0 +1,112 @@
1
+ import React from 'react'
2
+ import { View, useWindowDimensions } from 'react-native'
3
+ import { useTheme } from 'styled-components/native'
4
+ import { useLanguage, OrderVerticalList } from 'ordering-components/native'
5
+ import { Placeholder, PlaceholderLine, Fade } from "rn-placeholder";
6
+ import { OButton, OText } from '../shared'
7
+ import { NotFoundSource } from '../NotFoundSource'
8
+ import { OrderListOption } from '../OrderListOption'
9
+
10
+ const OrdersListingUI = (props: any) => {
11
+ const {
12
+ ordersGroup,
13
+ reorderLoading,
14
+ loadMoreOrders,
15
+ handleReorder,
16
+ onNavigationRedirect,
17
+ } = props
18
+
19
+ const theme = useTheme()
20
+ const [, t] = useLanguage()
21
+ const { height } = useWindowDimensions()
22
+
23
+ const imageFails = theme.images.general.emptyActiveOrders
24
+
25
+ return (
26
+ <>
27
+ <OText size={20} style={{ marginTop: 20 }}>
28
+ {t('MY_ORDERS', 'My Orders')}
29
+ </OText>
30
+
31
+ {!ordersGroup.error && ordersGroup.all?.orders?.length > 0 && (
32
+ <>
33
+ {ordersGroup.upcoming?.orders?.length > 0 && (
34
+ <OrderListOption
35
+ titleContent={t('UPCOMING', 'Upcoming')}
36
+ typeStyle={1}
37
+ orders={ordersGroup.upcoming?.orders}
38
+ onNavigationRedirect={onNavigationRedirect}
39
+ />
40
+ )}
41
+ {ordersGroup.active?.orders?.length > 0 && (
42
+ <OrderListOption
43
+ titleContent={t('ACTIVE', 'Active')}
44
+ typeStyle={1}
45
+ orders={ordersGroup.active?.orders}
46
+ onNavigationRedirect={onNavigationRedirect}
47
+ />
48
+ )}
49
+ {ordersGroup.past?.orders?.length > 0 && (
50
+ <OrderListOption
51
+ titleContent={t('PAST', 'Past')}
52
+ typeStyle={2}
53
+ orders={ordersGroup.past?.orders}
54
+ allowedOrderStatus={[1, 2, 5, 6, 10, 11, 12]}
55
+ isLoadingReorder={reorderLoading}
56
+ handleReorder={handleReorder}
57
+ onNavigationRedirect={onNavigationRedirect}
58
+ />
59
+ )}
60
+ {!ordersGroup.loading &&
61
+ ordersGroup?.pagination?.totalPages &&
62
+ ordersGroup?.pagination?.currentPage < ordersGroup?.pagination?.totalPages &&
63
+ (
64
+ <View>
65
+ <OButton
66
+ text={t('LOAD_MORE_ORDERS', 'Load more orders')}
67
+ imgRightSrc={null}
68
+ textStyle={{ color: theme.colors.white }}
69
+ style={{ borderRadius: 8, shadowOpacity: 0, marginTop: 20 }}
70
+ onClick={loadMoreOrders}
71
+ />
72
+ </View>
73
+ )}
74
+ </>
75
+ )}
76
+
77
+ {ordersGroup.loading && (
78
+ <View style={{ marginTop: 20 }}>
79
+ {[...Array(6)].map((_, i) => (
80
+ <Placeholder key={i} Animation={Fade}>
81
+ <View style={{ width: '100%', flexDirection: 'row' }}>
82
+ <PlaceholderLine width={20} height={70} style={{ marginRight: 20, marginBottom: 20 }} />
83
+ <Placeholder>
84
+ <PlaceholderLine width={30} style={{ marginTop: 5 }} />
85
+ <PlaceholderLine width={50} />
86
+ <PlaceholderLine width={20} />
87
+ </Placeholder>
88
+ </View>
89
+ </Placeholder>
90
+ ))}
91
+ </View>
92
+ )}
93
+
94
+ {!ordersGroup.loading && ordersGroup.all?.orders?.length === 0 && (
95
+ <View style={{ height: height * 0.7, justifyContent: 'center' }}>
96
+ <NotFoundSource
97
+ content={t('NO_RESULTS_FOUND', 'Sorry, no results found')}
98
+ image={imageFails}
99
+ />
100
+ </View>
101
+ )}
102
+ </>
103
+ )
104
+ }
105
+
106
+ export const OrdersListing = (props: any) => {
107
+ const ordersProps = {
108
+ ...props,
109
+ UIComponent: OrdersListingUI,
110
+ }
111
+ return <OrderVerticalList {...ordersProps} />
112
+ }
@@ -123,6 +123,12 @@ const ProfileListUI = (props: ProfileParams) => {
123
123
  onNavigationRedirect: (route: string, params: any) => props.navigation.navigate(route, params)
124
124
  }
125
125
 
126
+ const getName = () => {
127
+ return user?.lastname
128
+ ? `${user?.name} ${user?.lastname}`
129
+ : user?.name
130
+ }
131
+
126
132
  return (
127
133
  <View style={{ flex: 1, height: height - top - bottom - 62 }}>
128
134
  <OText size={24} color={theme.colors.textNormal} lineHeight={36} weight={Platform.OS === 'ios' ? '600' : 'bold'} style={{ marginTop: 14, marginBottom: 24, ...styles.pagePadding }}>{t('PROFILE', 'Profile')}</OText>
@@ -136,7 +142,7 @@ const ProfileListUI = (props: ProfileParams) => {
136
142
  />
137
143
  </View>
138
144
  <View style={{ flexBasis: '70%' }}>
139
- <OText size={20} lineHeight={30} weight={Platform.OS === 'ios' ? '500' : 'bold'} color={theme.colors.textNormal}>{`${user?.name} ${user?.lastname}`}</OText>
145
+ <OText size={20} lineHeight={30} weight={Platform.OS === 'ios' ? '500' : 'bold'} color={theme.colors.textNormal}>{getName()}</OText>
140
146
  <TouchableOpacity onPress={() => navigation.navigate('ProfileForm', { ...detailProps })}>
141
147
  <OText size={12} lineHeight={18} color={theme.colors.primary} style={{ textDecorationLine: 'underline' }}>{t('VIEW_ACCOUNT', 'View account')}</OText>
142
148
  </TouchableOpacity>
@@ -219,4 +219,35 @@ export const getOrderStatus = (status: number) => {
219
219
  default:
220
220
  return status
221
221
  }
222
- }
222
+ }
223
+
224
+ export const getTextOrderStatus = (s: string, t: any) => {
225
+ const status = parseInt(s)
226
+ const orderStatus = [
227
+ { key: 0, value: t('PENDING', 'Pending') },
228
+ { key: 1, value: t('COMPLETED', 'Completed') },
229
+ { key: 2, value: t('REJECTED', 'Rejected') },
230
+ { key: 3, value: t('DRIVER_IN_BUSINESS', 'Driver in business') },
231
+ { key: 4, value: t('PREPARATION_COMPLETED', 'Preparation Completed') },
232
+ { key: 5, value: t('REJECTED_BY_BUSINESS', 'Rejected by business') },
233
+ { key: 6, value: t('REJECTED_BY_DRIVER', 'Rejected by Driver') },
234
+ { key: 7, value: t('ACCEPTED_BY_BUSINESS', 'Accepted by business') },
235
+ { key: 8, value: t('ACCEPTED_BY_DRIVER', 'Accepted by driver') },
236
+ { key: 9, value: t('PICK_UP_COMPLETED_BY_DRIVER', 'Pick up completed by driver') },
237
+ { key: 10, value: t('PICK_UP_FAILED_BY_DRIVER', 'Pick up Failed by driver') },
238
+ { key: 11, value: t('DELIVERY_COMPLETED_BY_DRIVER', 'Delivery completed by driver') },
239
+ { key: 12, value: t('DELIVERY_FAILED_BY_DRIVER', 'Delivery Failed by driver') },
240
+ { key: 13, value: t('PREORDER', 'PreOrder') },
241
+ { key: 14, value: t('ORDER_NOT_READY', 'Order not ready') },
242
+ { key: 15, value: t('ORDER_PICKEDUP_COMPLETED_BY_CUSTOMER', 'Order picked up completed by customer') },
243
+ { key: 16, value: t('CANCELLED_BY_CUSTOMER', 'Cancelled by customer') },
244
+ { key: 17, value: t('ORDER_NOT_PICKEDUP_BY_CUSTOMER', 'Order not picked up by customer') },
245
+ { key: 18, value: t('DRIVER_ALMOST_ARRIVED_TO_BUSINESS', 'Driver almost arrived to business') },
246
+ { key: 19, value: t('DRIVER_ALMOST_ARRIVED_TO_CUSTOMER', 'Driver almost arrived to customer') },
247
+ { key: 20, value: t('ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS', 'Customer almost arrived to business') },
248
+ { key: 21, value: t('ORDER_CUSTOMER_ARRIVED_BUSINESS', 'Customer arrived to business') }
249
+ ]
250
+
251
+ const objectStatus = orderStatus.find((o) => o.key === status)
252
+ return objectStatus && objectStatus
253
+ }