ordering-ui-react-native 0.17.67 → 0.17.68
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/components/shared/OToast.tsx +2 -2
- package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +8 -4
- package/themes/business/src/components/OrdersOption/index.tsx +14 -58
- package/themes/business/src/components/PreviousOrders/OrderItem.tsx +250 -0
- package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +115 -0
- package/themes/business/src/components/PreviousOrders/index.tsx +332 -242
- package/themes/business/src/components/PreviousOrders/styles.tsx +30 -2
- package/themes/business/src/components/ReviewCustomer/index.tsx +12 -2
- package/themes/business/src/components/shared/OLink.tsx +24 -12
- package/themes/business/src/components/shared/OText.tsx +3 -2
- package/themes/business/src/types/index.tsx +6 -1
- package/themes/original/src/components/LoginForm/Otp/index.tsx +0 -6
- package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import { Animated, StyleSheet, Text, View } from "react-native";
|
|
2
|
+
import { Animated, StyleSheet, Text, View, Platform } from "react-native";
|
|
3
3
|
import { ToastType, useToast, useLanguage } from "ordering-components/native";
|
|
4
4
|
import { useTheme } from 'styled-components/native';
|
|
5
5
|
import { getTraduction } from '../../utils'
|
|
6
6
|
|
|
7
7
|
const fadeDuration = 300;
|
|
8
|
-
const topPosition = 20
|
|
8
|
+
const topPosition = Platform.OS === 'ios' ? 40 : 20
|
|
9
9
|
|
|
10
10
|
export const Toast = (props: any) => {
|
|
11
11
|
const [toastConfig, { hideToast }] = useToast();
|
|
@@ -91,6 +91,10 @@ export const OrderContentComponent = (props: OrderContent) => {
|
|
|
91
91
|
return order?.taxes?.filter((tax: any) => tax?.type === 1)?.reduce((carry: number, tax: any) => carry + (tax?.summary?.tax_after_discount ?? tax?.summary?.tax), 0)
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
+
const containsOnlyNumbers = (str: string) => {
|
|
95
|
+
return /^\d+$/.test(str);
|
|
96
|
+
}
|
|
97
|
+
|
|
94
98
|
return (
|
|
95
99
|
<OrderContent isOrderGroup={isOrderGroup} lastOrder={lastOrder}>
|
|
96
100
|
{isOrderGroup && (
|
|
@@ -148,7 +152,7 @@ export const OrderContentComponent = (props: OrderContent) => {
|
|
|
148
152
|
<View style={styles.linkWithIcons}>
|
|
149
153
|
<OLink
|
|
150
154
|
PressStyle={styles.linkWithIcons}
|
|
151
|
-
url={`tel:${order?.business?.cellphone}`}
|
|
155
|
+
url={`tel:${containsOnlyNumbers(order?.business?.cellphone) ? order?.business?.cellphone : 'invalid'}`}
|
|
152
156
|
shorcut={`${order?.business?.cellphone}`}
|
|
153
157
|
TextStyle={styles.textLink}
|
|
154
158
|
/>
|
|
@@ -159,7 +163,7 @@ export const OrderContentComponent = (props: OrderContent) => {
|
|
|
159
163
|
<View style={styles.linkWithIcons}>
|
|
160
164
|
<OLink
|
|
161
165
|
PressStyle={styles.linkWithIcons}
|
|
162
|
-
url={`tel:${order?.business?.phone}`}
|
|
166
|
+
url={`tel:${containsOnlyNumbers(order?.business?.cellphone) ? order?.business?.phone : 'invalid'}`}
|
|
163
167
|
shorcut={order?.business?.phone}
|
|
164
168
|
TextStyle={styles.textLink}
|
|
165
169
|
/>
|
|
@@ -274,7 +278,7 @@ export const OrderContentComponent = (props: OrderContent) => {
|
|
|
274
278
|
<View style={styles.linkWithIcons}>
|
|
275
279
|
<OLink
|
|
276
280
|
PressStyle={styles.linkWithIcons}
|
|
277
|
-
url={`tel:${!!order?.customer?.country_phone_code ? '+' + order?.customer?.country_phone_code : ''} ${order?.customer?.cellphone}`}
|
|
281
|
+
url={`tel:${!!order?.customer?.country_phone_code ? '+' + order?.customer?.country_phone_code : ''} ${containsOnlyNumbers(order?.customer?.cellphone) ? order?.customer?.cellphone : 'invalid'}`}
|
|
278
282
|
shorcut={`${!!order?.customer?.country_phone_code ? '+' + order?.customer?.country_phone_code : ''} ${order?.customer?.cellphone}`}
|
|
279
283
|
TextStyle={styles.textLink}
|
|
280
284
|
/>
|
|
@@ -285,7 +289,7 @@ export const OrderContentComponent = (props: OrderContent) => {
|
|
|
285
289
|
<View style={styles.linkWithIcons}>
|
|
286
290
|
<OLink
|
|
287
291
|
PressStyle={styles.linkWithIcons}
|
|
288
|
-
url={`tel:${order?.customer?.phone}`}
|
|
292
|
+
url={`tel:${containsOnlyNumbers(order?.customer?.phone) ? order?.customer?.phone : 'invalid'}`}
|
|
289
293
|
shorcut={order?.customer?.phone}
|
|
290
294
|
TextStyle={styles.textLink}
|
|
291
295
|
/>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { useEffect, useState, useRef } from 'react';
|
|
2
|
-
import { View, Pressable, StyleSheet, ScrollView, RefreshControl,
|
|
3
|
-
import { useLanguage, useUtils, useToast,
|
|
2
|
+
import { View, Pressable, StyleSheet, ScrollView, RefreshControl, Platform } from 'react-native';
|
|
3
|
+
import { useLanguage, useUtils, useToast, OrderListGroups, useConfig } from 'ordering-components/native';
|
|
4
4
|
import SelectDropdown from 'react-native-select-dropdown'
|
|
5
5
|
import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder';
|
|
6
6
|
import FeatherIcon from 'react-native-vector-icons/Feather';
|
|
@@ -20,7 +20,6 @@ import {
|
|
|
20
20
|
IconWrapper,
|
|
21
21
|
ModalContainer,
|
|
22
22
|
ModalTitle,
|
|
23
|
-
FilterBtnWrapper,
|
|
24
23
|
TabPressable,
|
|
25
24
|
OrderStatus,
|
|
26
25
|
SlaOption,
|
|
@@ -34,42 +33,17 @@ import {
|
|
|
34
33
|
ItemContent,
|
|
35
34
|
TimerInputWrapper,
|
|
36
35
|
OverLine,
|
|
37
|
-
Actions,
|
|
38
36
|
InputContainer
|
|
39
37
|
} from './styles';
|
|
40
38
|
import { PreviousOrders } from '../PreviousOrders';
|
|
41
39
|
import { OrdersOptionParams } from '../../types';
|
|
42
40
|
|
|
43
|
-
import { TouchableOpacity } from 'react-native-gesture-handler';
|
|
44
|
-
import GestureRecognizer from 'react-native-swipe-gestures';
|
|
45
|
-
import ODropDown from '../shared/ODropDown';
|
|
46
|
-
import { OrdersOptionStatus } from '../OrdersOptionStatus'
|
|
47
41
|
import { OrdersOptionCity } from '../OrdersOptionCity';
|
|
48
42
|
import { OrdersOptionBusiness } from '../OrdersOptionBusiness';
|
|
49
43
|
import { OrdersOptionDelivery } from '../OrdersOptionDelivery';
|
|
50
44
|
import { OrdersOptionPaymethod } from '../OrdersOptionPaymethod';
|
|
51
45
|
import { OrdersOptionDriver } from '../OrdersOptionDriver';
|
|
52
46
|
import { OrdersOptionDate } from '../OrdersOptionDate';
|
|
53
|
-
import { GestureEvent, GestureDetector } from 'react-native-gesture-handler'
|
|
54
|
-
const tabsList: any = {
|
|
55
|
-
pending: 1,
|
|
56
|
-
inProgress: 2,
|
|
57
|
-
completed: 3,
|
|
58
|
-
cancelled: 4
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
const tabsListText: any = {
|
|
62
|
-
1: 'pending',
|
|
63
|
-
2: 'inProgress',
|
|
64
|
-
3: 'completed',
|
|
65
|
-
4: 'cancelled'
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
const swipeConfig = {
|
|
69
|
-
velocityThreshold: 0.3,
|
|
70
|
-
directionalOffsetThreshold: 80
|
|
71
|
-
};
|
|
72
|
-
|
|
73
47
|
const { useDeviceOrientation, PORTRAIT } = DeviceOrientationMethods
|
|
74
48
|
|
|
75
49
|
const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
@@ -81,10 +55,10 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
81
55
|
ordersGroup,
|
|
82
56
|
setOrdersGroup,
|
|
83
57
|
orderStatus,
|
|
58
|
+
ordersGroupedFormatted,
|
|
84
59
|
loadOrders,
|
|
85
60
|
loadMoreOrders,
|
|
86
61
|
onNavigationRedirect,
|
|
87
|
-
filtered,
|
|
88
62
|
onFiltered,
|
|
89
63
|
handleClickOrder,
|
|
90
64
|
isBusinessApp,
|
|
@@ -92,7 +66,9 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
92
66
|
logisticOrders,
|
|
93
67
|
loadLogisticOrders,
|
|
94
68
|
isLogisticActivated,
|
|
95
|
-
isAlsea
|
|
69
|
+
isAlsea,
|
|
70
|
+
handleChangeOrderStatus,
|
|
71
|
+
handleSendCustomerReview
|
|
96
72
|
} = props;
|
|
97
73
|
|
|
98
74
|
const defaultSearchList = {
|
|
@@ -346,26 +322,6 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
346
322
|
})
|
|
347
323
|
}
|
|
348
324
|
|
|
349
|
-
const onSwipeLeft = () => {
|
|
350
|
-
let currentTab = tabsList[currentTabSelected]
|
|
351
|
-
currentTab = currentTab >= 4 ? null : currentTab + 1
|
|
352
|
-
|
|
353
|
-
if (!currentTab) return
|
|
354
|
-
|
|
355
|
-
const nextTab = tabsListText[currentTab]
|
|
356
|
-
nextTab && setCurrentTabSelected(nextTab)
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
const onSwipeRight = () => {
|
|
360
|
-
let currentTab = tabsList[currentTabSelected]
|
|
361
|
-
currentTab = currentTab <= 1 ? null : currentTab - 1
|
|
362
|
-
|
|
363
|
-
if (!currentTab) return
|
|
364
|
-
|
|
365
|
-
const nextTab = tabsListText[currentTab]
|
|
366
|
-
nextTab && setCurrentTabSelected(nextTab)
|
|
367
|
-
}
|
|
368
|
-
|
|
369
325
|
const calculateDate = (type: any, from: any, to: any) => {
|
|
370
326
|
switch (type) {
|
|
371
327
|
case 'today':
|
|
@@ -419,14 +375,8 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
419
375
|
useEffect(() => {
|
|
420
376
|
setSelectedTabStatus(deliveryStatus)
|
|
421
377
|
}, [])
|
|
422
|
-
|
|
378
|
+
|
|
423
379
|
return (
|
|
424
|
-
// <GestureRecognizer
|
|
425
|
-
// onSwipeLeft={onSwipeLeft}
|
|
426
|
-
// onSwipeRight={onSwipeRight}
|
|
427
|
-
// config={swipeConfig}
|
|
428
|
-
// style={{ flex: 1 }}
|
|
429
|
-
// >
|
|
430
380
|
<>
|
|
431
381
|
<View style={styles.header}>
|
|
432
382
|
<OText style={styles.title}>{t('MY_ORDERS', 'My orders')}</OText>
|
|
@@ -636,11 +586,18 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
636
586
|
(
|
|
637
587
|
<PreviousOrders
|
|
638
588
|
orders={currentOrdersGroup?.orders}
|
|
589
|
+
navigation={props.navigation}
|
|
590
|
+
ordersGrouped={ordersGroupedFormatted}
|
|
639
591
|
onNavigationRedirect={onNavigationRedirect}
|
|
640
592
|
getOrderStatus={getOrderStatus}
|
|
641
593
|
handleClickOrder={handleClickOrder}
|
|
642
594
|
slaSettingTime={slaSettingTime}
|
|
643
595
|
currentTabSelected={currentTabSelected}
|
|
596
|
+
appTitle={props.orderDetailsProps?.appTitle}
|
|
597
|
+
actions={props.orderDetailsProps?.actions}
|
|
598
|
+
orderTitle={props.orderDetailsProps?.orderTitle}
|
|
599
|
+
handleChangeOrderStatus={handleChangeOrderStatus}
|
|
600
|
+
handleSendCustomerReview={handleSendCustomerReview}
|
|
644
601
|
/>
|
|
645
602
|
)}
|
|
646
603
|
{!logisticOrders?.error?.length &&
|
|
@@ -730,7 +687,6 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
730
687
|
)}
|
|
731
688
|
</ScrollView>
|
|
732
689
|
</View>
|
|
733
|
-
{/* </GestureRecognizer> */}
|
|
734
690
|
|
|
735
691
|
{isBusinessApp && (
|
|
736
692
|
<NewOrderNotification isBusinessApp={isBusinessApp} />
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
|
2
|
+
import { Platform, PlatformIOSStatic, StyleSheet, TouchableOpacity, View } from 'react-native';
|
|
3
|
+
import DeviceInfo from 'react-native-device-info';
|
|
4
|
+
import { useTheme } from 'styled-components/native';
|
|
5
|
+
import { useLanguage, useUtils, useConfig } from 'ordering-components/native';
|
|
6
|
+
import EntypoIcon from 'react-native-vector-icons/Entypo'
|
|
7
|
+
import FastImage from 'react-native-fast-image'
|
|
8
|
+
import moment from 'moment'
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
Card,
|
|
12
|
+
Logo,
|
|
13
|
+
Information,
|
|
14
|
+
MyOrderOptions,
|
|
15
|
+
NotificationIcon,
|
|
16
|
+
Timestatus
|
|
17
|
+
} from './styles'
|
|
18
|
+
|
|
19
|
+
import { OText } from '../shared';
|
|
20
|
+
import { DeviceOrientationMethods } from '../../../../../src/hooks/DeviceOrientation'
|
|
21
|
+
|
|
22
|
+
const { useDeviceOrientation, PORTRAIT } = DeviceOrientationMethods
|
|
23
|
+
|
|
24
|
+
export const OrderItem = (props: any) => {
|
|
25
|
+
const {
|
|
26
|
+
order,
|
|
27
|
+
_order,
|
|
28
|
+
isLogisticOrder,
|
|
29
|
+
currentTabSelected,
|
|
30
|
+
getOrderStatus,
|
|
31
|
+
handlePressOrder
|
|
32
|
+
} = props
|
|
33
|
+
|
|
34
|
+
const theme = useTheme()
|
|
35
|
+
const [, t] = useLanguage()
|
|
36
|
+
const [configState] = useConfig()
|
|
37
|
+
const [{ parseDate, optimizeImage }] = useUtils();
|
|
38
|
+
const [orientationState] = useDeviceOrientation();
|
|
39
|
+
|
|
40
|
+
const [allowColumns, setAllowColumns] = useState({
|
|
41
|
+
timer: configState?.configs?.order_deadlines_enabled?.value === '1',
|
|
42
|
+
slaBar: configState?.configs?.order_deadlines_enabled?.value === '1',
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
const IS_PORTRAIT = orientationState.orientation === PORTRAIT
|
|
46
|
+
const platformIOS = Platform as PlatformIOSStatic
|
|
47
|
+
|
|
48
|
+
const isIpad = platformIOS.isPad
|
|
49
|
+
const isTablet = DeviceInfo.isTablet();
|
|
50
|
+
|
|
51
|
+
const styles = StyleSheet.create({
|
|
52
|
+
cardButton: {
|
|
53
|
+
flex: 1,
|
|
54
|
+
paddingVertical: (isIpad || isTablet) ? 20 : 0,
|
|
55
|
+
marginBottom: IS_PORTRAIT ? 25 : 0,
|
|
56
|
+
marginLeft: 3,
|
|
57
|
+
},
|
|
58
|
+
icon: {
|
|
59
|
+
borderRadius: 7.6,
|
|
60
|
+
width: 60,
|
|
61
|
+
height: 60
|
|
62
|
+
},
|
|
63
|
+
logo: {
|
|
64
|
+
borderRadius: 10,
|
|
65
|
+
shadowColor: "#0000006e",
|
|
66
|
+
shadowRadius: 10,
|
|
67
|
+
elevation: 15,
|
|
68
|
+
justifyContent: 'center',
|
|
69
|
+
alignItems: 'center',
|
|
70
|
+
marginLeft: 3,
|
|
71
|
+
},
|
|
72
|
+
title: {
|
|
73
|
+
marginBottom: 6,
|
|
74
|
+
fontFamily: 'Poppins',
|
|
75
|
+
fontStyle: 'normal',
|
|
76
|
+
fontWeight: '600',
|
|
77
|
+
fontSize: 16,
|
|
78
|
+
color: theme.colors.textGray,
|
|
79
|
+
},
|
|
80
|
+
date: {
|
|
81
|
+
marginBottom: 6,
|
|
82
|
+
fontFamily: 'Poppins',
|
|
83
|
+
fontStyle: 'normal',
|
|
84
|
+
fontWeight: 'normal',
|
|
85
|
+
fontSize: 12,
|
|
86
|
+
},
|
|
87
|
+
orderType: {
|
|
88
|
+
fontSize: 12,
|
|
89
|
+
fontFamily: 'Poppins',
|
|
90
|
+
fontStyle: 'normal',
|
|
91
|
+
fontWeight: 'normal',
|
|
92
|
+
color: theme.colors.orderTypeColor,
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
const getDelayMinutes = (order: any) => {
|
|
97
|
+
const offset = 300
|
|
98
|
+
const cdtToutc = moment(order?.delivery_datetime).add(offset, 'minutes').format('YYYY-MM-DD HH:mm:ss')
|
|
99
|
+
const _delivery = order?.delivery_datetime_utc
|
|
100
|
+
? parseDate(order?.delivery_datetime_utc, { outputFormat: 'YYYY-MM-DD hh:mm A' })
|
|
101
|
+
: parseDate(cdtToutc, { outputFormat: 'YYYY-MM-DD hh:mm A' })
|
|
102
|
+
const _eta = order?.eta_time
|
|
103
|
+
const diffTimeAsSeconds = moment(_delivery, 'YYYY-MM-DD hh:mm A').add(_eta, 'minutes').diff(moment().utc(), 'seconds')
|
|
104
|
+
return Math.ceil(diffTimeAsSeconds / 60)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const displayDelayedTime = (order: any) => {
|
|
108
|
+
let tagetedMin = getDelayMinutes(order)
|
|
109
|
+
// get day, hour and minutes
|
|
110
|
+
const sign = tagetedMin >= 0 ? '' : '- '
|
|
111
|
+
tagetedMin = Math.abs(tagetedMin)
|
|
112
|
+
let day: string | number = Math.floor(tagetedMin / 1440)
|
|
113
|
+
const restMinOfTargetedMin = tagetedMin - 1440 * day
|
|
114
|
+
let restHours: string | number = Math.floor(restMinOfTargetedMin / 60)
|
|
115
|
+
let restMins: string | number = restMinOfTargetedMin - 60 * restHours
|
|
116
|
+
// make standard time format
|
|
117
|
+
day = day === 0 ? '' : day + 'day '
|
|
118
|
+
restHours = restHours < 10 ? '0' + restHours : restHours
|
|
119
|
+
restMins = restMins < 10 ? '0' + restMins : restMins
|
|
120
|
+
|
|
121
|
+
const finalTaget = sign + day + restHours + ':' + restMins
|
|
122
|
+
return finalTaget
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const getStatusClassName = (minutes: number) => {
|
|
126
|
+
if (isNaN(Number(minutes))) return 'in_time'
|
|
127
|
+
const delayTime = configState?.configs?.order_deadlines_delayed_time?.value
|
|
128
|
+
return minutes > 0 ? 'in_time' : Math.abs(minutes) <= delayTime ? 'at_risk' : 'delayed'
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
useEffect(() => {
|
|
132
|
+
const slaSettings = configState?.configs?.order_deadlines_enabled?.value === '1'
|
|
133
|
+
setAllowColumns({
|
|
134
|
+
...allowColumns,
|
|
135
|
+
timer: slaSettings,
|
|
136
|
+
slaBar: slaSettings
|
|
137
|
+
})
|
|
138
|
+
}, [configState.loading])
|
|
139
|
+
|
|
140
|
+
return (
|
|
141
|
+
<TouchableOpacity
|
|
142
|
+
activeOpacity={1}
|
|
143
|
+
disabled={order?.locked && isLogisticOrder}
|
|
144
|
+
style={styles.cardButton}
|
|
145
|
+
onPress={() => handlePressOrder({ ...order, logistic_order_id: _order?.id })}
|
|
146
|
+
>
|
|
147
|
+
<Card key={order.id}>
|
|
148
|
+
{allowColumns?.slaBar && (
|
|
149
|
+
<Timestatus
|
|
150
|
+
style={{
|
|
151
|
+
backgroundColor: getStatusClassName(getDelayMinutes(order)) === 'in_time'
|
|
152
|
+
? '#00D27A'
|
|
153
|
+
: getStatusClassName(getDelayMinutes(order)) === 'at_risk'
|
|
154
|
+
? '#FFC700'
|
|
155
|
+
: getStatusClassName(getDelayMinutes(order)) === 'delayed'
|
|
156
|
+
? '#E63757'
|
|
157
|
+
: ''
|
|
158
|
+
}}
|
|
159
|
+
/>
|
|
160
|
+
)}
|
|
161
|
+
<Logo style={styles.logo}>
|
|
162
|
+
<FastImage
|
|
163
|
+
style={styles.icon}
|
|
164
|
+
source={order.business?.logo ? {
|
|
165
|
+
uri: optimizeImage(order.business?.logo, 'h_100,c_limit'),
|
|
166
|
+
priority: FastImage.priority.normal,
|
|
167
|
+
} : theme?.images?.dummies?.businessLogo}
|
|
168
|
+
resizeMode={FastImage.resizeMode.cover}
|
|
169
|
+
/>
|
|
170
|
+
</Logo>
|
|
171
|
+
<Information>
|
|
172
|
+
{!!order?.order_group_id && (
|
|
173
|
+
<OText>
|
|
174
|
+
<OText>{(t('INVOICE_GROUP_NO', 'Group No.') + order?.order_group_id)}</OText>
|
|
175
|
+
</OText>
|
|
176
|
+
)}
|
|
177
|
+
{!!order.business?.name && (
|
|
178
|
+
<OText numberOfLines={1} style={styles.title}>
|
|
179
|
+
{order.business?.name}
|
|
180
|
+
</OText>
|
|
181
|
+
)}
|
|
182
|
+
{!!order?.showNotification && (
|
|
183
|
+
<NotificationIcon>
|
|
184
|
+
<EntypoIcon
|
|
185
|
+
name="dot-single"
|
|
186
|
+
size={32}
|
|
187
|
+
color={theme.colors.primary}
|
|
188
|
+
/>
|
|
189
|
+
</NotificationIcon>
|
|
190
|
+
)}
|
|
191
|
+
<View style={{ flexDirection: 'row', flexWrap: 'wrap' }}>
|
|
192
|
+
<OText
|
|
193
|
+
style={styles.date}
|
|
194
|
+
color={theme.colors.unselectText}
|
|
195
|
+
numberOfLines={1}
|
|
196
|
+
adjustsFontSizeToFit
|
|
197
|
+
>
|
|
198
|
+
{(order?.order_group_id && order?.order_group && isLogisticOrder
|
|
199
|
+
? `${order?.order_group?.orders?.length} ${t('ORDERS', 'Orders')}`
|
|
200
|
+
: (t('NO', 'Order No.') + order.id)
|
|
201
|
+
) + ' · '}
|
|
202
|
+
{order?.delivery_datetime_utc
|
|
203
|
+
? parseDate(order?.delivery_datetime_utc, { outputFormat: 'MM/DD/YY · HH:mm a' })
|
|
204
|
+
: parseDate(order?.delivery_datetime, { utc: false })}
|
|
205
|
+
</OText>
|
|
206
|
+
{((currentTabSelected === 'pending' || currentTabSelected === 'inProgress') && allowColumns?.timer) && (
|
|
207
|
+
<>
|
|
208
|
+
<OText> · </OText>
|
|
209
|
+
<OText
|
|
210
|
+
style={styles.date}
|
|
211
|
+
color={
|
|
212
|
+
getStatusClassName(getDelayMinutes(order)) === 'in_time'
|
|
213
|
+
? '#00D27A'
|
|
214
|
+
: getStatusClassName(getDelayMinutes(order)) === 'at_risk'
|
|
215
|
+
? '#FFC700'
|
|
216
|
+
: getStatusClassName(getDelayMinutes(order)) === 'delayed'
|
|
217
|
+
? '#E63757'
|
|
218
|
+
: ''}
|
|
219
|
+
>
|
|
220
|
+
{displayDelayedTime(order)}
|
|
221
|
+
</OText>
|
|
222
|
+
</>
|
|
223
|
+
)}
|
|
224
|
+
</View>
|
|
225
|
+
{!isLogisticOrder && (
|
|
226
|
+
<MyOrderOptions>
|
|
227
|
+
<OText
|
|
228
|
+
style={styles.orderType}
|
|
229
|
+
mRight={5}
|
|
230
|
+
numberOfLines={1}
|
|
231
|
+
adjustsFontSizeToFit
|
|
232
|
+
>
|
|
233
|
+
{order.delivery_type === 1
|
|
234
|
+
? t('DELIVERY', 'Delivery')
|
|
235
|
+
: order.delivery_type === 2
|
|
236
|
+
? t('PICKUP', 'Pickup')
|
|
237
|
+
: order.delivery_type === 3
|
|
238
|
+
? t('EAT_IN', 'Eat in')
|
|
239
|
+
: order.delivery_type === 4
|
|
240
|
+
? t('CURBSIDE', 'Curbside')
|
|
241
|
+
: t('DRIVER_THRU', 'Driver thru')}
|
|
242
|
+
{` · ${getOrderStatus(order.status)}`}
|
|
243
|
+
</OText>
|
|
244
|
+
</MyOrderOptions>
|
|
245
|
+
)}
|
|
246
|
+
</Information>
|
|
247
|
+
</Card>
|
|
248
|
+
</TouchableOpacity>
|
|
249
|
+
)
|
|
250
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import React, { useState } from 'react'
|
|
2
|
+
import { Animated, StyleSheet, View } from 'react-native'
|
|
3
|
+
import { useTheme } from 'styled-components/native';
|
|
4
|
+
import { useLanguage, useUtils } from 'ordering-components/native'
|
|
5
|
+
import FastImage from 'react-native-fast-image'
|
|
6
|
+
import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIcons'
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
AccordionSection,
|
|
10
|
+
Accordion,
|
|
11
|
+
ContentInfo,
|
|
12
|
+
AccordionContent,
|
|
13
|
+
ProductOptionsList
|
|
14
|
+
} from './styles'
|
|
15
|
+
|
|
16
|
+
import { OText } from '../shared';
|
|
17
|
+
|
|
18
|
+
export const OrdersGroupedItem = (props: any) => {
|
|
19
|
+
const { groupId, orders } = props
|
|
20
|
+
|
|
21
|
+
const theme = useTheme()
|
|
22
|
+
const [, t] = useLanguage()
|
|
23
|
+
const [{ parseDate }] = useUtils();
|
|
24
|
+
const [isActive, setActiveState] = useState(false)
|
|
25
|
+
|
|
26
|
+
const styles = StyleSheet.create({
|
|
27
|
+
productImage: {
|
|
28
|
+
borderRadius: 7.6,
|
|
29
|
+
width: 60,
|
|
30
|
+
height: 60
|
|
31
|
+
},
|
|
32
|
+
logo: {
|
|
33
|
+
borderRadius: 10,
|
|
34
|
+
shadowColor: "#0000006e",
|
|
35
|
+
shadowRadius: 10,
|
|
36
|
+
elevation: 15,
|
|
37
|
+
justifyContent: 'center',
|
|
38
|
+
alignItems: 'center',
|
|
39
|
+
marginLeft: 3,
|
|
40
|
+
height: 65,
|
|
41
|
+
width: 65
|
|
42
|
+
},
|
|
43
|
+
title: {
|
|
44
|
+
marginBottom: 2,
|
|
45
|
+
fontWeight: '600',
|
|
46
|
+
fontSize: 16,
|
|
47
|
+
color: theme.colors.textGray,
|
|
48
|
+
},
|
|
49
|
+
orderlength: {
|
|
50
|
+
marginBottom: 2,
|
|
51
|
+
fontSize: 12,
|
|
52
|
+
},
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<AccordionSection>
|
|
57
|
+
<Accordion
|
|
58
|
+
activeOpacity={1}
|
|
59
|
+
onPress={() => setActiveState(!isActive)}
|
|
60
|
+
>
|
|
61
|
+
<View style={{ flexDirection: 'row', alignItems: 'flex-start' }}>
|
|
62
|
+
<ContentInfo>
|
|
63
|
+
<View style={styles.logo}>
|
|
64
|
+
<FastImage
|
|
65
|
+
style={styles.productImage}
|
|
66
|
+
source={theme.images.general.ordersGroup}
|
|
67
|
+
resizeMode={FastImage.resizeMode.cover}
|
|
68
|
+
/>
|
|
69
|
+
</View>
|
|
70
|
+
<View style={{ flex: 1, marginLeft: 10, flexDirection: 'column' }}>
|
|
71
|
+
<View>
|
|
72
|
+
<OText numberOfLines={1} style={styles.title}>
|
|
73
|
+
{t('GROUP_NRO', 'Group No.')}{groupId}
|
|
74
|
+
</OText>
|
|
75
|
+
</View>
|
|
76
|
+
<OText
|
|
77
|
+
style={styles.orderlength}
|
|
78
|
+
color={theme.colors.unselectText}
|
|
79
|
+
numberOfLines={1}
|
|
80
|
+
adjustsFontSizeToFit
|
|
81
|
+
>
|
|
82
|
+
{orders.length}{' '}{t('ORDERS', 'Orders')}
|
|
83
|
+
</OText>
|
|
84
|
+
<OText
|
|
85
|
+
style={styles.orderlength}
|
|
86
|
+
color={theme.colors.unselectText}
|
|
87
|
+
numberOfLines={1}
|
|
88
|
+
adjustsFontSizeToFit
|
|
89
|
+
>
|
|
90
|
+
{orders[0]?.delivery_datetime_utc
|
|
91
|
+
? parseDate(orders[0]?.delivery_datetime_utc, { outputFormat: 'MM/DD/YY · HH:mm a' })
|
|
92
|
+
: parseDate(orders[0]?.delivery_datetime, { utc: false })}
|
|
93
|
+
</OText>
|
|
94
|
+
</View>
|
|
95
|
+
<View style={{ display: 'flex', flexDirection: 'column', flex: 1, alignItems: 'flex-end', maxWidth: 100 }}>
|
|
96
|
+
<View style={{ flexDirection: 'row' }}>
|
|
97
|
+
<MaterialCommunityIcon name={isActive ? 'chevron-up' : 'chevron-down'} size={18} />
|
|
98
|
+
</View>
|
|
99
|
+
</View>
|
|
100
|
+
</ContentInfo>
|
|
101
|
+
</View>
|
|
102
|
+
</Accordion>
|
|
103
|
+
|
|
104
|
+
<View style={{ display: isActive ? 'flex' : 'none' }}>
|
|
105
|
+
<Animated.View>
|
|
106
|
+
<AccordionContent>
|
|
107
|
+
<ProductOptionsList>
|
|
108
|
+
{props.children}
|
|
109
|
+
</ProductOptionsList>
|
|
110
|
+
</AccordionContent>
|
|
111
|
+
</Animated.View>
|
|
112
|
+
</View>
|
|
113
|
+
</AccordionSection>
|
|
114
|
+
)
|
|
115
|
+
}
|