ordering-ui-react-native 0.14.87 → 0.14.90
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/utils/index.tsx +126 -0
- package/themes/business/src/components/OrdersOption/index.tsx +400 -58
- package/themes/business/src/components/OrdersOption/styles.tsx +98 -7
- package/themes/business/src/components/PreviousOrders/index.tsx +34 -38
- package/themes/business/src/components/PreviousOrders/styles.tsx +5 -10
- package/themes/original/src/components/Cart/index.tsx +1 -1
- package/themes/original/src/components/OrderSummary/index.tsx +1 -1
- package/themes/original/src/components/PaymentOptionWallet/index.tsx +1 -1
- package/themes/original/src/components/ReviewDriver/index.tsx +7 -8
- package/themes/original/src/components/ReviewOrder/index.tsx +7 -10
- package/themes/original/src/components/SingleProductReview/index.tsx +4 -8
package/package.json
CHANGED
package/src/utils/index.tsx
CHANGED
|
@@ -201,6 +201,62 @@ export const transformCountryCode = (countryCode : number) => {
|
|
|
201
201
|
const [, t] = useLanguage()
|
|
202
202
|
|
|
203
203
|
const reviews: any = {
|
|
204
|
+
order: {
|
|
205
|
+
1: {
|
|
206
|
+
title: t('QUICK_COMMENT_TITLE_1', "What went wrong?"),
|
|
207
|
+
list: [
|
|
208
|
+
{ key: 0, content: t('QUICK_COMMENT_1_0', "Not handled with care") },
|
|
209
|
+
{ key: 1, content: t('QUICK_COMMENT_1_1', "Poor communication") },
|
|
210
|
+
{ key: 2, content: t('QUICK_COMMENT_1_2', "COVID-19 issue") },
|
|
211
|
+
{ key: 3, content: t('QUICK_COMMENT_1_3', "Didn't follow instructions") },
|
|
212
|
+
{ key: 4, content: t('QUICK_COMMENT_1_4', "Rude") },
|
|
213
|
+
{ key: 5, content: t('QUICK_COMMENT_1_5', "Not on-time") },
|
|
214
|
+
]
|
|
215
|
+
},
|
|
216
|
+
2: {
|
|
217
|
+
title: t('QUICK_COMMENT_TITLE_2', "What went wrong?"),
|
|
218
|
+
list: [
|
|
219
|
+
{ key: 0, content: t('QUICK_COMMENT_2_0', "Not handled with care") },
|
|
220
|
+
{ key: 1, content: t('QUICK_COMMENT_2_1', "Poor communication") },
|
|
221
|
+
{ key: 2, content: t('QUICK_COMMENT_2_2', "COVID-19 issue") },
|
|
222
|
+
{ key: 3, content: t('QUICK_COMMENT_2_3', "Didn't follow instructions") },
|
|
223
|
+
{ key: 4, content: t('QUICK_COMMENT_2_4', "Rude") },
|
|
224
|
+
{ key: 5, content: t('QUICK_COMMENT_2_5', "Not on-time") },
|
|
225
|
+
]
|
|
226
|
+
},
|
|
227
|
+
3: {
|
|
228
|
+
title: t('QUICK_COMMENT_TITLE_3', "What could have been better?"),
|
|
229
|
+
list: [
|
|
230
|
+
{ key: 0, content: t('QUICK_COMMENT_3_0', "Not handled with care") },
|
|
231
|
+
{ key: 1, content: t('QUICK_COMMENT_3_1', "Poor communication") },
|
|
232
|
+
{ key: 2, content: t('QUICK_COMMENT_3_2', "COVID-19 issue") },
|
|
233
|
+
{ key: 3, content: t('QUICK_COMMENT_3_3', "Didn't follow instructions") },
|
|
234
|
+
{ key: 4, content: t('QUICK_COMMENT_3_4', "Rude") },
|
|
235
|
+
{ key: 5, content: t('QUICK_COMMENT_3_5', "Not on-time") },
|
|
236
|
+
]
|
|
237
|
+
},
|
|
238
|
+
4: {
|
|
239
|
+
title: t('QUICK_COMMENT_TITLE_4', " Tell us more"),
|
|
240
|
+
list: [
|
|
241
|
+
{ key: 0, content: t('QUICK_COMMENT_4_0', "Not handled with care") },
|
|
242
|
+
{ key: 1, content: t('QUICK_COMMENT_4_1', "Poor communication") },
|
|
243
|
+
{ key: 2, content: t('QUICK_COMMENT_4_2', "COVID-19 issue") },
|
|
244
|
+
{ key: 3, content: t('QUICK_COMMENT_4_3', "Didn't follow instructions") },
|
|
245
|
+
{ key: 4, content: t('QUICK_COMMENT_4_4', "Rude") },
|
|
246
|
+
{ key: 5, content: t('QUICK_COMMENT_4_5', "Not on-time") },
|
|
247
|
+
]
|
|
248
|
+
},
|
|
249
|
+
5: {
|
|
250
|
+
title: t('QUICK_COMMENT_TITLE_5', "What went well?"),
|
|
251
|
+
list: [
|
|
252
|
+
{ key: 0, content: t('QUICK_COMMENT_5_0', "Good communication") },
|
|
253
|
+
{ key: 1, content: t('QUICK_COMMENT_5_1', "Followed instructions") },
|
|
254
|
+
{ key: 2, content: t('QUICK_COMMENT_5_2', "Friendly") },
|
|
255
|
+
{ key: 3, content: t('QUICK_COMMENT_5_3', 'Handled with care') },
|
|
256
|
+
{ key: 4, content: t('QUICK_COMMENT_5_4', "Above and beyond") },
|
|
257
|
+
]
|
|
258
|
+
},
|
|
259
|
+
},
|
|
204
260
|
customer: {
|
|
205
261
|
1: {
|
|
206
262
|
title: t('CUSTOMER_QUICK_COMMENT_TITLE_1', "What went wrong?"),
|
|
@@ -254,6 +310,76 @@ export const transformCountryCode = (countryCode : number) => {
|
|
|
254
310
|
{ key: 2, content: t('CUSTOMER_QUICK_COMMENT_5_2', "Above and beyond") },
|
|
255
311
|
]
|
|
256
312
|
},
|
|
313
|
+
},
|
|
314
|
+
driver: {
|
|
315
|
+
1: {
|
|
316
|
+
title: t('DRIVER_QUICK_COMMENT_TITLE_1', "What went wrong?"),
|
|
317
|
+
list: [
|
|
318
|
+
{ key: 0, content: t('DRIVER_QUICK_COMMENT_1_0', "Not handled with care") },
|
|
319
|
+
{ key: 1, content: t('DRIVER_QUICK_COMMENT_1_1', "Poor communication") },
|
|
320
|
+
{ key: 2, content: t('DRIVER_QUICK_COMMENT_1_2', "COVID-19 issue") },
|
|
321
|
+
{ key: 3, content: t('DRIVER_QUICK_COMMENT_1_3', "Didn't follow instructions") },
|
|
322
|
+
{ key: 4, content: t('DRIVER_QUICK_COMMENT_1_4', "Rude") },
|
|
323
|
+
{ key: 5, content: t('DRIVER_QUICK_COMMENT_1_5', "Not on-time") },
|
|
324
|
+
]
|
|
325
|
+
},
|
|
326
|
+
2: {
|
|
327
|
+
title: t('DRIVER_QUICK_COMMENT_TITLE_2', "What went wrong?"),
|
|
328
|
+
list: [
|
|
329
|
+
{ key: 0, content: t('DRIVER_QUICK_COMMENT_2_0', "Not handled with care") },
|
|
330
|
+
{ key: 1, content: t('DRIVER_QUICK_COMMENT_2_1', "Poor communication") },
|
|
331
|
+
{ key: 2, content: t('DRIVER_QUICK_COMMENT_2_2', "COVID-19 issue") },
|
|
332
|
+
{ key: 3, content: t('DRIVER_QUICK_COMMENT_2_3', "Didn't follow instructions") },
|
|
333
|
+
{ key: 4, content: t('DRIVER_QUICK_COMMENT_2_4', "Rude") },
|
|
334
|
+
{ key: 5, content: t('DRIVER_QUICK_COMMENT_2_5', "Not on-time") },
|
|
335
|
+
]
|
|
336
|
+
},
|
|
337
|
+
3: {
|
|
338
|
+
title: t('DRIVER_QUICK_COMMENT_TITLE_3', "What could have been better?"),
|
|
339
|
+
list: [
|
|
340
|
+
{ key: 0, content: t('DRIVER_QUICK_COMMENT_3_0', "Not handled with care") },
|
|
341
|
+
{ key: 1, content: t('DRIVER_QUICK_COMMENT_3_1', "Poor communication") },
|
|
342
|
+
{ key: 2, content: t('DRIVER_QUICK_COMMENT_3_2', "COVID-19 issue") },
|
|
343
|
+
{ key: 3, content: t('DRIVER_QUICK_COMMENT_3_3', "Didn't follow instructions") },
|
|
344
|
+
{ key: 4, content: t('DRIVER_QUICK_COMMENT_3_4', "Rude") },
|
|
345
|
+
{ key: 5, content: t('DRIVER_QUICK_COMMENT_3_5', "Not on-time") },
|
|
346
|
+
]
|
|
347
|
+
},
|
|
348
|
+
4: {
|
|
349
|
+
title: t('DRIVER_QUICK_COMMENT_TITLE_4', " Tell us more"),
|
|
350
|
+
list: [
|
|
351
|
+
{ key: 0, content: t('DRIVER_QUICK_COMMENT_4_0', "Not handled with care") },
|
|
352
|
+
{ key: 1, content: t('DRIVER_QUICK_COMMENT_4_1', "Poor communication") },
|
|
353
|
+
{ key: 2, content: t('DRIVER_QUICK_COMMENT_4_2', "COVID-19 issue") },
|
|
354
|
+
{ key: 3, content: t('DRIVER_QUICK_COMMENT_4_3', "Didn't follow instructions") },
|
|
355
|
+
{ key: 4, content: t('DRIVER_QUICK_COMMENT_4_4', "Rude") },
|
|
356
|
+
{ key: 5, content: t('DRIVER_QUICK_COMMENT_4_5', "Not on-time") },
|
|
357
|
+
]
|
|
358
|
+
},
|
|
359
|
+
5: {
|
|
360
|
+
title: t('DRIVER_QUICK_COMMENT_TITLE_5', "What went well?"),
|
|
361
|
+
list: [
|
|
362
|
+
{ key: 0, content: t('DRIVER_QUICK_COMMENT_5_0', "Good communication") },
|
|
363
|
+
{ key: 1, content: t('DRIVER_QUICK_COMMENT_5_1', "Followed instructions") },
|
|
364
|
+
{ key: 2, content: t('DRIVER_QUICK_COMMENT_5_2', "Friendly") },
|
|
365
|
+
{ key: 3, content: t('DRIVER_QUICK_COMMENT_5_3', 'Handled with care') },
|
|
366
|
+
{ key: 4, content: t('DRIVER_QUICK_COMMENT_5_4', "Above and beyond") },
|
|
367
|
+
]
|
|
368
|
+
},
|
|
369
|
+
},
|
|
370
|
+
product: {
|
|
371
|
+
like: [
|
|
372
|
+
{ key: 0, content: t('QUICK_COMMENT_LIKE_0', "Tasty") },
|
|
373
|
+
{ key: 1, content: t('QUICK_COMMENT_LIKE_1', "Good price") },
|
|
374
|
+
{ key: 2, content: t('QUICK_COMMENT_LIKE_2', "Good portion size") },
|
|
375
|
+
{ key: 3, content: t('QUICK_COMMENT_LIKE_3', "Packed well") },
|
|
376
|
+
],
|
|
377
|
+
dislike: [
|
|
378
|
+
{ key: 0, content: t('QUICK_COMMENT_DISLIKE_0', "Not tasty") },
|
|
379
|
+
{ key: 1, content: t('QUICK_COMMENT_DISLIKE_1', "High price") },
|
|
380
|
+
{ key: 2, content: t('QUICK_COMMENT_DISLIKE_2', "Bad portion size") },
|
|
381
|
+
{ key: 3, content: t('QUICK_COMMENT_DISLIKE_3', "Not packed well") },
|
|
382
|
+
]
|
|
257
383
|
}
|
|
258
384
|
}
|
|
259
385
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, { useEffect, useState, useRef } from 'react';
|
|
2
|
-
import { View, Pressable, StyleSheet, ScrollView, RefreshControl, Linking, Platform } from 'react-native';
|
|
3
|
-
import { useLanguage, useUtils, OrderListGroups } from 'ordering-components/native';
|
|
2
|
+
import { View, Pressable, StyleSheet, ScrollView, RefreshControl, Linking, Platform, TextInput } from 'react-native';
|
|
3
|
+
import { useLanguage, useUtils, useToast, ToastType, OrderListGroups } from 'ordering-components/native';
|
|
4
|
+
import SelectDropdown from 'react-native-select-dropdown'
|
|
4
5
|
import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder';
|
|
5
6
|
import FeatherIcon from 'react-native-vector-icons/Feather';
|
|
6
7
|
import FontistoIcon from 'react-native-vector-icons/Fontisto'
|
|
@@ -18,7 +19,20 @@ import {
|
|
|
18
19
|
ModalContainer,
|
|
19
20
|
ModalTitle,
|
|
20
21
|
FilterBtnWrapper,
|
|
21
|
-
TabPressable
|
|
22
|
+
TabPressable,
|
|
23
|
+
OrderStatus,
|
|
24
|
+
SlaOption,
|
|
25
|
+
SearchModalContent,
|
|
26
|
+
SlaSettingModalContent,
|
|
27
|
+
DeliveryStatusWrapper,
|
|
28
|
+
VerticalLine,
|
|
29
|
+
StatusItems,
|
|
30
|
+
ItemHeader,
|
|
31
|
+
ItemStatus,
|
|
32
|
+
ItemContent,
|
|
33
|
+
TimerInputWrapper,
|
|
34
|
+
OverLine,
|
|
35
|
+
Actions
|
|
22
36
|
} from './styles';
|
|
23
37
|
import { PreviousOrders } from '../PreviousOrders';
|
|
24
38
|
import { OrdersOptionParams } from '../../types';
|
|
@@ -85,6 +99,7 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
85
99
|
delivery_type: '',
|
|
86
100
|
paymethod: '',
|
|
87
101
|
driver: '',
|
|
102
|
+
timeStatus: '',
|
|
88
103
|
date: {
|
|
89
104
|
from: '',
|
|
90
105
|
to: '',
|
|
@@ -96,12 +111,59 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
96
111
|
const [, t] = useLanguage();
|
|
97
112
|
const [{ parseDate }] = useUtils()
|
|
98
113
|
const [orientationState] = useDeviceOrientation();
|
|
99
|
-
const [
|
|
114
|
+
const [, { showToast }] = useToast();
|
|
115
|
+
const [openSearchModal, setOpenSearchModal] = useState(false)
|
|
116
|
+
const [openSLASettingModal, setOpenSLASettingModal] = useState(false)
|
|
117
|
+
const [slaSettingTime, setSlaSettingTime] = useState(6000)
|
|
118
|
+
const [currentDeliveryType, setCurrentDeliveryType] = useState('Delivery')
|
|
100
119
|
const [search, setSearch] = useState(defaultSearchList)
|
|
120
|
+
const [selectedTabStatus, setSelectedTabStatus] = useState([])
|
|
121
|
+
const [hour, setHour] = useState(0)
|
|
122
|
+
const [minute, setMinute] = useState(0)
|
|
123
|
+
|
|
101
124
|
const WIDTH_SCREEN = orientationState?.dimensions?.width
|
|
102
125
|
const HEIGHT_SCREEN = orientationState?.dimensions?.height
|
|
103
126
|
const IS_PORTRAIT = orientationState.orientation === PORTRAIT
|
|
104
127
|
|
|
128
|
+
const preorderTypeList = [
|
|
129
|
+
{ key: null, name: t('SLA', 'SLA\'s') },
|
|
130
|
+
{ key: 'in_time', name: t('OK', 'Ok') },
|
|
131
|
+
{ key: 'at_risk', name: t('AT_RISK', 'At Risk') },
|
|
132
|
+
{ key: 'delayed', name: t('DELAYED', 'Delayed') }
|
|
133
|
+
]
|
|
134
|
+
|
|
135
|
+
const defaultOrderTypes = [
|
|
136
|
+
{ key: 1, name: t('DELIVERY', 'Delivery') },
|
|
137
|
+
{ key: 2, name: t('PICKUP', 'Pickup') },
|
|
138
|
+
{ key: 3, name: t('EAT_IN', 'Eat in') },
|
|
139
|
+
{ key: 4, name: t('CURBSIDE', 'Curbside') },
|
|
140
|
+
{ key: 5, name: t('DRIVE_THRU', 'Drive thru') }
|
|
141
|
+
]
|
|
142
|
+
|
|
143
|
+
const deliveryStatus = [
|
|
144
|
+
{
|
|
145
|
+
key: t('OK', 'Ok'),
|
|
146
|
+
des: t('DELIVERY_OK_STATUS_DESC', 'Get delivery time from the businesses.'),
|
|
147
|
+
timmer: false,
|
|
148
|
+
icon: theme.images.general?.clock1,
|
|
149
|
+
backColor: '#00D27A'
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
key: t('AT_RISK', 'At risk'),
|
|
153
|
+
des: t('DELIVERY_ATRISK_STATUS_DESC', 'Is the time between delivery time of busines and the delayed time.'),
|
|
154
|
+
timmer: false,
|
|
155
|
+
icon: theme.images.general?.clockRisk,
|
|
156
|
+
backColor: '#FFC700'
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
key: t('DELAYED', 'Delayed'),
|
|
160
|
+
des: t('DELIVERY_DELAYED_STATUS_DESC', 'If this time is exceeded, the order will be delayed.'),
|
|
161
|
+
timmer: true,
|
|
162
|
+
icon: theme.images.general?.clockDelayed,
|
|
163
|
+
backColor: '#E63757'
|
|
164
|
+
}
|
|
165
|
+
]
|
|
166
|
+
|
|
105
167
|
const styles = StyleSheet.create({
|
|
106
168
|
header: {
|
|
107
169
|
marginBottom: isBusinessApp ? 10 : 20,
|
|
@@ -127,6 +189,7 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
127
189
|
marginBottom: -1,
|
|
128
190
|
zIndex: 100,
|
|
129
191
|
borderColor: theme.colors.textGray,
|
|
192
|
+
textTransform: 'capitalize'
|
|
130
193
|
},
|
|
131
194
|
icon: {
|
|
132
195
|
paddingBottom: 10,
|
|
@@ -165,6 +228,51 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
165
228
|
borderColor: '#DEE2E6',
|
|
166
229
|
borderRadius: 7.6,
|
|
167
230
|
marginBottom: 24
|
|
231
|
+
},
|
|
232
|
+
SLAwrapper: {
|
|
233
|
+
flexDirection: 'row',
|
|
234
|
+
marginBottom: 15
|
|
235
|
+
},
|
|
236
|
+
selectOption: {
|
|
237
|
+
alignItems: 'center',
|
|
238
|
+
justifyContent: 'space-between',
|
|
239
|
+
minHeight: 40,
|
|
240
|
+
width: '100%',
|
|
241
|
+
paddingHorizontal: 15,
|
|
242
|
+
backgroundColor: theme.colors.inputChat,
|
|
243
|
+
borderRadius: 7.6,
|
|
244
|
+
},
|
|
245
|
+
buttonTextStyle: {
|
|
246
|
+
textAlign: 'left',
|
|
247
|
+
marginHorizontal: 0,
|
|
248
|
+
fontSize: 16,
|
|
249
|
+
lineHeight: 24,
|
|
250
|
+
color: '#748194'
|
|
251
|
+
},
|
|
252
|
+
dropdownStyle: {
|
|
253
|
+
borderWidth: 1,
|
|
254
|
+
borderRadius: 8,
|
|
255
|
+
paddingTop: 5,
|
|
256
|
+
backgroundColor: '#fff',
|
|
257
|
+
borderColor: theme.colors.lightGray,
|
|
258
|
+
overflow: 'hidden',
|
|
259
|
+
minHeight: 155
|
|
260
|
+
},
|
|
261
|
+
rowStyle: {
|
|
262
|
+
display: 'flex',
|
|
263
|
+
borderBottomWidth: 0,
|
|
264
|
+
height: 36,
|
|
265
|
+
alignItems: 'center',
|
|
266
|
+
paddingHorizontal: 10
|
|
267
|
+
},
|
|
268
|
+
acceptButtonStyle: {
|
|
269
|
+
borderRadius: 7.6,
|
|
270
|
+
width: 130,
|
|
271
|
+
height: 42,
|
|
272
|
+
},
|
|
273
|
+
errorMessage: {
|
|
274
|
+
marginBottom: 10,
|
|
275
|
+
color: theme.colors.error,
|
|
168
276
|
}
|
|
169
277
|
});
|
|
170
278
|
|
|
@@ -201,7 +309,7 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
201
309
|
})
|
|
202
310
|
const dateRange = calculateDate(search.date.type, search.date.from, search.date.to)
|
|
203
311
|
onFiltered && onFiltered({ ...search, date: { ...dateRange } })
|
|
204
|
-
|
|
312
|
+
setOpenSearchModal(false)
|
|
205
313
|
}
|
|
206
314
|
|
|
207
315
|
const handleTagSelected = (tag: any) => {
|
|
@@ -283,6 +391,29 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
283
391
|
}
|
|
284
392
|
}
|
|
285
393
|
|
|
394
|
+
const onClickSetting = () => {
|
|
395
|
+
setOpenSLASettingModal(true)
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
const handleClose = () => {
|
|
399
|
+
setOpenSearchModal(false)
|
|
400
|
+
setOpenSLASettingModal(false)
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
const [settingTimeErrorMessage, setSettingTimeErrorMessage] = useState('')
|
|
404
|
+
|
|
405
|
+
const handlSLASettingTime = () => {
|
|
406
|
+
if (!hour || !minute) {
|
|
407
|
+
setSettingTimeErrorMessage(t('SLA_SETTING_ERROR', 'Time value is invalid'))
|
|
408
|
+
return
|
|
409
|
+
}
|
|
410
|
+
const _settingTimeSecond = hour * 3600 + minute * 60
|
|
411
|
+
setSlaSettingTime(_settingTimeSecond)
|
|
412
|
+
handleClose()
|
|
413
|
+
showToast(ToastType.Success, t('SLA_SETTING_UPDATED', 'SLAs setting updated'))
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
|
|
286
417
|
useEffect(() => {
|
|
287
418
|
setCurrentFilters(null)
|
|
288
419
|
onFiltered && onFiltered(null)
|
|
@@ -292,6 +423,10 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
292
423
|
scrollRef.current?.scrollTo({ y: 0, animated: true });
|
|
293
424
|
}, [currentTabSelected])
|
|
294
425
|
|
|
426
|
+
useEffect(() => {
|
|
427
|
+
setSelectedTabStatus(deliveryStatus)
|
|
428
|
+
}, [])
|
|
429
|
+
|
|
295
430
|
return (
|
|
296
431
|
// <GestureRecognizer
|
|
297
432
|
// onSwipeLeft={onSwipeLeft}
|
|
@@ -314,10 +449,59 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
314
449
|
name='search'
|
|
315
450
|
color={theme.colors.backgroundDark}
|
|
316
451
|
size={24}
|
|
317
|
-
onPress={() =>
|
|
452
|
+
onPress={() => setOpenSearchModal(true)}
|
|
318
453
|
/>
|
|
319
454
|
</IconWrapper>
|
|
320
455
|
</View>
|
|
456
|
+
<View style={styles.SLAwrapper}>
|
|
457
|
+
<View style={{ flex: 0.5 }}>
|
|
458
|
+
<OButton
|
|
459
|
+
text={t('SLA_SETTING', 'SLA’s Settings')}
|
|
460
|
+
textStyle={{ color: theme.colors.backArrow }}
|
|
461
|
+
imgRightSrc={null}
|
|
462
|
+
style={{
|
|
463
|
+
backgroundColor: theme.colors.inputChat,
|
|
464
|
+
borderRadius: 7.6,
|
|
465
|
+
zIndex: 10,
|
|
466
|
+
borderWidth: 0,
|
|
467
|
+
minHeight: 40
|
|
468
|
+
}}
|
|
469
|
+
onClick={onClickSetting}
|
|
470
|
+
/>
|
|
471
|
+
</View>
|
|
472
|
+
<View style={{ width: 10, height: '100%' }} />
|
|
473
|
+
<View style={{ flex: 0.5, justifyContent: 'center' }}>
|
|
474
|
+
<SelectDropdown
|
|
475
|
+
defaultButtonText={t('SLA', 'SLA\'s')}
|
|
476
|
+
data={preorderTypeList}
|
|
477
|
+
onSelect={(selectedItem, index) => {
|
|
478
|
+
onFiltered && onFiltered({ ...search, timeStatus: selectedItem?.key })
|
|
479
|
+
}}
|
|
480
|
+
buttonTextAfterSelection={(selectedItem, index) => {
|
|
481
|
+
return selectedItem.name
|
|
482
|
+
}}
|
|
483
|
+
rowTextForSelection={(item, index) => {
|
|
484
|
+
return item.key
|
|
485
|
+
}}
|
|
486
|
+
buttonStyle={styles.selectOption}
|
|
487
|
+
buttonTextStyle={styles.buttonTextStyle}
|
|
488
|
+
renderDropdownIcon={isOpened => {
|
|
489
|
+
return <FeatherIcon name={isOpened ? 'chevron-up' : 'chevron-down'} color={'#444'} size={18} />;
|
|
490
|
+
}}
|
|
491
|
+
dropdownStyle={styles.dropdownStyle}
|
|
492
|
+
dropdownOverlayColor='transparent'
|
|
493
|
+
rowStyle={styles.rowStyle}
|
|
494
|
+
renderCustomizedRowChild={(item, index) => {
|
|
495
|
+
return (
|
|
496
|
+
<SlaOption>
|
|
497
|
+
{index !== 0 && <OrderStatus timeState={item?.key} />}
|
|
498
|
+
<View><OText size={14} color={'#748194'} >{item?.name}</OText></View>
|
|
499
|
+
</SlaOption>
|
|
500
|
+
);
|
|
501
|
+
}}
|
|
502
|
+
/>
|
|
503
|
+
</View>
|
|
504
|
+
</View>
|
|
321
505
|
<FiltersTab>
|
|
322
506
|
<ScrollView
|
|
323
507
|
ref={scrollRefTab}
|
|
@@ -460,6 +644,7 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
460
644
|
onNavigationRedirect={onNavigationRedirect}
|
|
461
645
|
getOrderStatus={getOrderStatus}
|
|
462
646
|
handleClickOrder={handleClickOrder}
|
|
647
|
+
slaSettingTime={slaSettingTime}
|
|
463
648
|
/>
|
|
464
649
|
)}
|
|
465
650
|
{!logisticOrders?.error?.length &&
|
|
@@ -552,8 +737,8 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
552
737
|
{/* </GestureRecognizer> */}
|
|
553
738
|
|
|
554
739
|
<NewOrderNotification />
|
|
555
|
-
{
|
|
556
|
-
<OModal open={
|
|
740
|
+
{(openSearchModal || openSLASettingModal) && (
|
|
741
|
+
<OModal open={openSearchModal || openSLASettingModal} entireModal customClose>
|
|
557
742
|
<ModalContainer
|
|
558
743
|
nestedScrollEnabled={true}
|
|
559
744
|
>
|
|
@@ -569,62 +754,131 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
569
754
|
marginBottom: 30,
|
|
570
755
|
marginTop: 30
|
|
571
756
|
}}
|
|
572
|
-
onClick={() =>
|
|
757
|
+
onClick={() => handleClose()}
|
|
573
758
|
/>
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
{...props}
|
|
584
|
-
search={search}
|
|
585
|
-
onSearch={setSearch}
|
|
586
|
-
/>
|
|
587
|
-
<OrdersOptionCity
|
|
588
|
-
{...props}
|
|
589
|
-
search={search}
|
|
590
|
-
onSearch={setSearch}
|
|
591
|
-
/>
|
|
592
|
-
{isBusinessApp && (
|
|
593
|
-
<>
|
|
594
|
-
<OrdersOptionBusiness
|
|
595
|
-
{...props}
|
|
596
|
-
search={search}
|
|
597
|
-
onSearch={setSearch}
|
|
759
|
+
{openSearchModal && (
|
|
760
|
+
<SearchModalContent>
|
|
761
|
+
<ModalTitle>{t('SEARCH_ORDERS', 'Search orders')}</ModalTitle>
|
|
762
|
+
<OInput
|
|
763
|
+
value={search.id}
|
|
764
|
+
onChange={(value: any) => setSearch({ ...search, id: value })}
|
|
765
|
+
style={styles.inputStyle}
|
|
766
|
+
placeholder={t('ORDER_NUMBER', 'Order number')}
|
|
767
|
+
autoCorrect={false}
|
|
598
768
|
/>
|
|
599
|
-
<
|
|
769
|
+
<OrdersOptionDate
|
|
600
770
|
{...props}
|
|
601
771
|
search={search}
|
|
602
772
|
onSearch={setSearch}
|
|
603
773
|
/>
|
|
604
|
-
<
|
|
774
|
+
<OrdersOptionCity
|
|
605
775
|
{...props}
|
|
606
776
|
search={search}
|
|
607
777
|
onSearch={setSearch}
|
|
608
778
|
/>
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
779
|
+
{isBusinessApp && (
|
|
780
|
+
<>
|
|
781
|
+
<OrdersOptionBusiness
|
|
782
|
+
{...props}
|
|
783
|
+
search={search}
|
|
784
|
+
onSearch={setSearch}
|
|
785
|
+
/>
|
|
786
|
+
<OrdersOptionDelivery
|
|
787
|
+
{...props}
|
|
788
|
+
search={search}
|
|
789
|
+
onSearch={setSearch}
|
|
790
|
+
/>
|
|
791
|
+
<OrdersOptionDriver
|
|
792
|
+
{...props}
|
|
793
|
+
search={search}
|
|
794
|
+
onSearch={setSearch}
|
|
795
|
+
/>
|
|
796
|
+
<OrdersOptionPaymethod
|
|
797
|
+
{...props}
|
|
798
|
+
search={search}
|
|
799
|
+
onSearch={setSearch}
|
|
800
|
+
/>
|
|
801
|
+
</>
|
|
802
|
+
)}
|
|
803
|
+
<OButton
|
|
804
|
+
text={t('SEARCH', 'Search')}
|
|
805
|
+
textStyle={{ color: theme.colors.white }}
|
|
806
|
+
imgRightSrc={null}
|
|
807
|
+
style={{
|
|
808
|
+
borderRadius: 7.6,
|
|
809
|
+
marginBottom: 70,
|
|
810
|
+
marginTop: 60,
|
|
811
|
+
zIndex: 12
|
|
812
|
+
}}
|
|
813
|
+
onClick={applyFilters}
|
|
613
814
|
/>
|
|
614
|
-
|
|
815
|
+
|
|
816
|
+
</SearchModalContent>
|
|
817
|
+
)}
|
|
818
|
+
{openSLASettingModal && (
|
|
819
|
+
<SlaSettingModalContent>
|
|
820
|
+
<ModalTitle>{t('SLA_SETTINGS', 'SLA’s Settings')}</ModalTitle>
|
|
821
|
+
<FiltersTab>
|
|
822
|
+
<ScrollView
|
|
823
|
+
ref={scrollRefTab}
|
|
824
|
+
showsVerticalScrollIndicator={false}
|
|
825
|
+
showsHorizontalScrollIndicator={false}
|
|
826
|
+
horizontal
|
|
827
|
+
nestedScrollEnabled={true}
|
|
828
|
+
>
|
|
829
|
+
<TabsContainer>
|
|
830
|
+
{defaultOrderTypes && defaultOrderTypes.map(tab => (
|
|
831
|
+
<TabPressable
|
|
832
|
+
key={tab.key}
|
|
833
|
+
onPress={() => setCurrentDeliveryType(tab?.name)}
|
|
834
|
+
isSelected={tab.name.toUpperCase() === currentDeliveryType.toUpperCase() ? 1 : 0}
|
|
835
|
+
>
|
|
836
|
+
<OText
|
|
837
|
+
style={{
|
|
838
|
+
...styles.tab,
|
|
839
|
+
fontSize: tab.name.toUpperCase() === currentDeliveryType.toUpperCase() ? 14 : 12,
|
|
840
|
+
borderBottomWidth: Platform.OS === 'ios' && tab.name.toUpperCase() === currentDeliveryType.toUpperCase() ? 1 : 0,
|
|
841
|
+
}}
|
|
842
|
+
color={
|
|
843
|
+
tab.name.toUpperCase() === currentDeliveryType.toUpperCase()
|
|
844
|
+
? theme.colors.textGray
|
|
845
|
+
: theme.colors.unselectText
|
|
846
|
+
}
|
|
847
|
+
weight={tab.name.toUpperCase() === currentDeliveryType ? '600' : 'normal'}
|
|
848
|
+
>
|
|
849
|
+
{tab.name}
|
|
850
|
+
</OText>
|
|
851
|
+
</TabPressable>
|
|
852
|
+
))}
|
|
853
|
+
</TabsContainer>
|
|
854
|
+
</ScrollView>
|
|
855
|
+
</FiltersTab>
|
|
856
|
+
<DeliveryStatusWrapper>
|
|
857
|
+
{selectedTabStatus && selectedTabStatus.length > 0 && selectedTabStatus.map((item, i) => (
|
|
858
|
+
<StatusBlock
|
|
859
|
+
key={i}
|
|
860
|
+
item={item}
|
|
861
|
+
last={i + 1 === selectedTabStatus.length}
|
|
862
|
+
setHour={setHour}
|
|
863
|
+
setMinute={setMinute}
|
|
864
|
+
setSettingTimeErrorMessage={setSettingTimeErrorMessage}
|
|
865
|
+
/>
|
|
866
|
+
))}
|
|
867
|
+
<VerticalLine />
|
|
868
|
+
</DeliveryStatusWrapper>
|
|
869
|
+
{settingTimeErrorMessage !== '' && (
|
|
870
|
+
<OText style={styles.errorMessage}>{settingTimeErrorMessage}</OText>
|
|
871
|
+
)}
|
|
872
|
+
<Actions>
|
|
873
|
+
<OButton
|
|
874
|
+
text={t('ACCEPT', 'Accept')}
|
|
875
|
+
textStyle={{ color: 'white', fontSize: 14 }}
|
|
876
|
+
onClick={handlSLASettingTime}
|
|
877
|
+
style={styles.acceptButtonStyle}
|
|
878
|
+
/>
|
|
879
|
+
</Actions>
|
|
880
|
+
</SlaSettingModalContent>
|
|
615
881
|
)}
|
|
616
|
-
<OButton
|
|
617
|
-
text={t('SEARCH', 'Search')}
|
|
618
|
-
textStyle={{ color: theme.colors.white }}
|
|
619
|
-
imgRightSrc={null}
|
|
620
|
-
style={{
|
|
621
|
-
borderRadius: 7.6,
|
|
622
|
-
marginBottom: 70,
|
|
623
|
-
marginTop: 60,
|
|
624
|
-
zIndex: 12
|
|
625
|
-
}}
|
|
626
|
-
onClick={applyFilters}
|
|
627
|
-
/>
|
|
628
882
|
</ModalContainer>
|
|
629
883
|
</OModal>
|
|
630
884
|
)}
|
|
@@ -632,6 +886,94 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
|
|
|
632
886
|
);
|
|
633
887
|
};
|
|
634
888
|
|
|
889
|
+
export const StatusBlock = (props: any) => {
|
|
890
|
+
const { item, last, setHour, setMinute, setSettingTimeErrorMessage } = props
|
|
891
|
+
const [showTime, setShowTime] = useState(false)
|
|
892
|
+
|
|
893
|
+
useEffect(() => {
|
|
894
|
+
if (last) {
|
|
895
|
+
setShowTime(true)
|
|
896
|
+
}
|
|
897
|
+
}, [last])
|
|
898
|
+
|
|
899
|
+
return (
|
|
900
|
+
<StatusItems>
|
|
901
|
+
<Pressable onPress={() => setShowTime(!showTime)} style={{ marginBottom: 5 }}>
|
|
902
|
+
<ItemHeader>
|
|
903
|
+
<IconWrapper>
|
|
904
|
+
<OIcon
|
|
905
|
+
src={item?.icon}
|
|
906
|
+
width={16}
|
|
907
|
+
height={16}
|
|
908
|
+
color={item?.backColor}
|
|
909
|
+
/>
|
|
910
|
+
</IconWrapper>
|
|
911
|
+
<ItemStatus backColor={item?.backColor} />
|
|
912
|
+
<OText>{item?.key}</OText>
|
|
913
|
+
</ItemHeader>
|
|
914
|
+
</Pressable>
|
|
915
|
+
<ItemContent>
|
|
916
|
+
<OText>{item?.des}</OText>
|
|
917
|
+
</ItemContent>
|
|
918
|
+
{showTime && (
|
|
919
|
+
<Timer
|
|
920
|
+
setHour={setHour}
|
|
921
|
+
setMinute={setMinute}
|
|
922
|
+
setSettingTimeErrorMessage={setSettingTimeErrorMessage}
|
|
923
|
+
/>
|
|
924
|
+
)}
|
|
925
|
+
{last && (
|
|
926
|
+
<OverLine />
|
|
927
|
+
)}
|
|
928
|
+
</StatusItems>
|
|
929
|
+
)
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
export const Timer = (props: any) => {
|
|
933
|
+
const { setHour, setMinute, setSettingTimeErrorMessage } = props
|
|
934
|
+
const [, t] = useLanguage()
|
|
935
|
+
const theme = useTheme()
|
|
936
|
+
|
|
937
|
+
const styles = StyleSheet.create({
|
|
938
|
+
inputStyle: {
|
|
939
|
+
paddingHorizontal: 7,
|
|
940
|
+
paddingVertical: 2,
|
|
941
|
+
borderRadius: 0,
|
|
942
|
+
fontSize: 14,
|
|
943
|
+
}
|
|
944
|
+
})
|
|
945
|
+
|
|
946
|
+
const handleChangeInput = (val: any, type: string) => {
|
|
947
|
+
setSettingTimeErrorMessage('')
|
|
948
|
+
if (type === 'hour') {
|
|
949
|
+
setHour(val)
|
|
950
|
+
}
|
|
951
|
+
if (type === 'minute') {
|
|
952
|
+
setMinute(val)
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
return (
|
|
957
|
+
<TimerInputWrapper>
|
|
958
|
+
<TextInput
|
|
959
|
+
placeholder='HH'
|
|
960
|
+
keyboardType='number-pad'
|
|
961
|
+
maxLength={2}
|
|
962
|
+
style={{ ...styles.inputStyle, width: 36 }}
|
|
963
|
+
onChangeText={hour => handleChangeInput(hour, 'hour')}
|
|
964
|
+
/>
|
|
965
|
+
<OText color={theme.colors.disabled}>:</OText>
|
|
966
|
+
<TextInput
|
|
967
|
+
placeholder='MM'
|
|
968
|
+
keyboardType='number-pad'
|
|
969
|
+
maxLength={2}
|
|
970
|
+
style={{ ...styles.inputStyle, width: 40 }}
|
|
971
|
+
onChangeText={minute => handleChangeInput(minute, 'minute')}
|
|
972
|
+
/>
|
|
973
|
+
</TimerInputWrapper>
|
|
974
|
+
)
|
|
975
|
+
}
|
|
976
|
+
|
|
635
977
|
export const OrdersOption = (props: OrdersOptionParams) => {
|
|
636
978
|
const [, t] = useLanguage();
|
|
637
979
|
const theme = useTheme()
|
|
@@ -712,13 +1054,13 @@ export const OrdersOption = (props: OrdersOptionParams) => {
|
|
|
712
1054
|
'Customer arrived to business',
|
|
713
1055
|
),
|
|
714
1056
|
},
|
|
715
|
-
{
|
|
716
|
-
key: 22,
|
|
717
|
-
text: t('ORDER_LOOKING_FOR_DRIVER', 'Looking for driver')
|
|
1057
|
+
{
|
|
1058
|
+
key: 22,
|
|
1059
|
+
text: t('ORDER_LOOKING_FOR_DRIVER', 'Looking for driver')
|
|
718
1060
|
},
|
|
719
|
-
{
|
|
720
|
-
key: 23,
|
|
721
|
-
text: t('ORDER_DRIVER_ON_WAY', 'Driver on way')
|
|
1061
|
+
{
|
|
1062
|
+
key: 23,
|
|
1063
|
+
text: t('ORDER_DRIVER_ON_WAY', 'Driver on way')
|
|
722
1064
|
}
|
|
723
1065
|
],
|
|
724
1066
|
tabs: [
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import styled from 'styled-components/native';
|
|
1
|
+
import styled, { css } from 'styled-components/native';
|
|
2
2
|
|
|
3
3
|
export const FiltersTab = styled.View`
|
|
4
4
|
margin-bottom: 20px;
|
|
5
5
|
min-height: 30px;
|
|
6
6
|
max-height: 35px;
|
|
7
7
|
flex: 1;
|
|
8
|
-
|
|
8
|
+
width: 100%;
|
|
9
|
+
`
|
|
9
10
|
|
|
10
11
|
export const TabsContainer = styled.View`
|
|
11
12
|
display: flex;
|
|
@@ -13,8 +14,9 @@ export const TabsContainer = styled.View`
|
|
|
13
14
|
justify-content: space-between;
|
|
14
15
|
border-bottom-width: 1px;
|
|
15
16
|
flex: 1;
|
|
17
|
+
width: 100%;
|
|
16
18
|
border-bottom-color: ${(props: any) => props.theme.colors.tabBar};
|
|
17
|
-
|
|
19
|
+
`
|
|
18
20
|
|
|
19
21
|
export const Tag = styled.Pressable`
|
|
20
22
|
background-color: ${({ isSelected }: { isSelected: string }) => isSelected};
|
|
@@ -24,24 +26,24 @@ export const Tag = styled.Pressable`
|
|
|
24
26
|
padding: 4px 10px;
|
|
25
27
|
border-radius: 50px;
|
|
26
28
|
margin-right: 15px;
|
|
27
|
-
|
|
29
|
+
`
|
|
28
30
|
|
|
29
31
|
export const IconWrapper = styled.View`
|
|
30
32
|
flex-direction: row;
|
|
31
33
|
align-items: center;
|
|
34
|
+
background: #fff;
|
|
32
35
|
`
|
|
33
36
|
|
|
34
37
|
export const ModalContainer = styled.ScrollView`
|
|
35
|
-
padding:
|
|
38
|
+
padding: 0px 30px;
|
|
36
39
|
`
|
|
37
40
|
|
|
38
41
|
export const ModalTitle = styled.Text`
|
|
39
42
|
font-family: Poppins;
|
|
40
43
|
font-style: normal;
|
|
41
|
-
font-weight:
|
|
44
|
+
font-weight: bold;
|
|
42
45
|
font-size: 20px;
|
|
43
46
|
color: ${(props: any) => props.theme.colors.textGray};
|
|
44
|
-
text-transform: capitalize;
|
|
45
47
|
margin-bottom: 24px;
|
|
46
48
|
`
|
|
47
49
|
|
|
@@ -61,4 +63,93 @@ export const TabPressable = styled.Pressable`
|
|
|
61
63
|
border-color: ${(props: any) => props.theme.colors.textGray};
|
|
62
64
|
border-bottom-width: ${(props: any) => props.isSelected ? '1px' : '0px'};
|
|
63
65
|
padding-horizontal: 10px;
|
|
66
|
+
`
|
|
67
|
+
export const OrderStatus = styled.View`
|
|
68
|
+
margin-right: 5px;
|
|
69
|
+
width: 3px;
|
|
70
|
+
height: 90%;
|
|
71
|
+
border-radius: 6px;
|
|
72
|
+
|
|
73
|
+
${(props: any) => props.timeState === 'in_time' && css`
|
|
74
|
+
background-color: #00D27A;
|
|
75
|
+
`}
|
|
76
|
+
|
|
77
|
+
${(props: any) => props.timeState === 'at_risk' && css`
|
|
78
|
+
background-color: #FFC700;
|
|
79
|
+
`}
|
|
80
|
+
|
|
81
|
+
${(props: any) => props.timeState === 'delayed' && css`
|
|
82
|
+
background-color: #E63757;
|
|
83
|
+
`}
|
|
84
|
+
`
|
|
85
|
+
|
|
86
|
+
export const SlaOption = styled.View`
|
|
87
|
+
flex-direction: row;
|
|
88
|
+
align-items: center;
|
|
89
|
+
`
|
|
90
|
+
|
|
91
|
+
export const SearchModalContent = styled.View`
|
|
92
|
+
|
|
93
|
+
`
|
|
94
|
+
|
|
95
|
+
export const SlaSettingModalContent = styled.View`
|
|
96
|
+
|
|
97
|
+
`
|
|
98
|
+
|
|
99
|
+
export const DeliveryStatusWrapper = styled.View`
|
|
100
|
+
position: relative;
|
|
101
|
+
`
|
|
102
|
+
export const VerticalLine = styled.View`
|
|
103
|
+
position: absolute;
|
|
104
|
+
background: #E9ECEF;
|
|
105
|
+
position: absolute;
|
|
106
|
+
width: 1px;
|
|
107
|
+
height: 100%;
|
|
108
|
+
top: 7px;
|
|
109
|
+
left: 7px;
|
|
110
|
+
`
|
|
111
|
+
export const StatusItems = styled.View`
|
|
112
|
+
position: relative;
|
|
113
|
+
margin-bottom: 20px;
|
|
114
|
+
z-index: 2;
|
|
115
|
+
`
|
|
116
|
+
export const ItemHeader = styled.View`
|
|
117
|
+
flex-direction: row;
|
|
118
|
+
margin-bottom: 5px;
|
|
119
|
+
`
|
|
120
|
+
export const ItemStatus = styled.View`
|
|
121
|
+
width: 4px;
|
|
122
|
+
height: 22px;
|
|
123
|
+
margin: 0 15px;
|
|
124
|
+
border-radius: 4px;
|
|
125
|
+
background: ${(props: any) => props.backColor};
|
|
126
|
+
`
|
|
127
|
+
export const ItemContent = styled.View`
|
|
128
|
+
display: flex;
|
|
129
|
+
padding: 0 30px;
|
|
130
|
+
`
|
|
131
|
+
|
|
132
|
+
export const TimerInputWrapper = styled.View`
|
|
133
|
+
border-width: 1px;
|
|
134
|
+
border-radius: 7.6px;
|
|
135
|
+
color: ${(props: any) => props.theme.colors.disabled};
|
|
136
|
+
border-color: ${(props: any) => props.theme.colors.disabled};
|
|
137
|
+
margin-left: 30px;
|
|
138
|
+
margin-right: 30px;
|
|
139
|
+
flex-direction: row;
|
|
140
|
+
align-items: center;
|
|
141
|
+
width: 80px;
|
|
142
|
+
`
|
|
143
|
+
export const OverLine = styled.View`
|
|
144
|
+
position: absolute;
|
|
145
|
+
height: 100%;
|
|
146
|
+
width: 15px;
|
|
147
|
+
top: 20px;
|
|
148
|
+
left: 0;
|
|
149
|
+
/* border-width: 1px; */
|
|
150
|
+
background-color: #fff;
|
|
151
|
+
z-index: 2;
|
|
152
|
+
`
|
|
153
|
+
export const Actions = styled.View`
|
|
154
|
+
|
|
64
155
|
`
|
|
@@ -16,7 +16,8 @@ export const PreviousOrders = (props: any) => {
|
|
|
16
16
|
getOrderStatus,
|
|
17
17
|
handleClickOrder,
|
|
18
18
|
isLogisticOrder,
|
|
19
|
-
handleClickLogisticOrder
|
|
19
|
+
handleClickLogisticOrder,
|
|
20
|
+
slaSettingTime
|
|
20
21
|
} = props;
|
|
21
22
|
const [, t] = useLanguage();
|
|
22
23
|
const [{ parseDate, optimizeImage }] = useUtils();
|
|
@@ -39,19 +40,14 @@ export const PreviousOrders = (props: any) => {
|
|
|
39
40
|
},
|
|
40
41
|
icon: {
|
|
41
42
|
borderRadius: 7.6,
|
|
42
|
-
width:
|
|
43
|
-
height:
|
|
43
|
+
width: 60,
|
|
44
|
+
height: 60
|
|
44
45
|
},
|
|
45
46
|
logo: {
|
|
46
47
|
borderRadius: 10,
|
|
47
|
-
shadowColor: "#
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
height: 1,
|
|
51
|
-
},
|
|
52
|
-
shadowOpacity: 0.20,
|
|
53
|
-
shadowRadius: 1.41,
|
|
54
|
-
elevation: 2,
|
|
48
|
+
shadowColor: "#0000006e",
|
|
49
|
+
shadowRadius: 10,
|
|
50
|
+
elevation: 15,
|
|
55
51
|
justifyContent: 'center',
|
|
56
52
|
alignItems: 'center',
|
|
57
53
|
marginLeft: 3,
|
|
@@ -99,9 +95,9 @@ export const PreviousOrders = (props: any) => {
|
|
|
99
95
|
|
|
100
96
|
useEffect(() => {
|
|
101
97
|
const interval = setInterval(() => {
|
|
102
|
-
const date:any = Date.now()
|
|
98
|
+
const date: any = Date.now()
|
|
103
99
|
setCurrentTime(date)
|
|
104
|
-
},
|
|
100
|
+
}, slaSettingTime)
|
|
105
101
|
|
|
106
102
|
return () => clearInterval(interval)
|
|
107
103
|
}, [])
|
|
@@ -130,7 +126,7 @@ export const PreviousOrders = (props: any) => {
|
|
|
130
126
|
activeOpacity={1}
|
|
131
127
|
>
|
|
132
128
|
<Card key={order.id}>
|
|
133
|
-
<Timestatus style={{backgroundColor: order?.time_status === 'in_time' ? '#00D27A' : order?.time_status === 'at_risk' ? '#FFC700' : order?.time_status === 'delayed' ? '#E63757' : '' }}/>
|
|
129
|
+
<Timestatus style={{ backgroundColor: order?.time_status === 'in_time' ? '#00D27A' : order?.time_status === 'at_risk' ? '#FFC700' : order?.time_status === 'delayed' ? '#E63757' : '' }} />
|
|
134
130
|
{
|
|
135
131
|
order.business?.logo && (
|
|
136
132
|
<Logo style={styles.logo}>
|
|
@@ -163,7 +159,7 @@ export const PreviousOrders = (props: any) => {
|
|
|
163
159
|
/>
|
|
164
160
|
</NotificationIcon>
|
|
165
161
|
)}
|
|
166
|
-
<View style={{flexDirection: 'row'}}>
|
|
162
|
+
<View style={{ flexDirection: 'row' }}>
|
|
167
163
|
<OText
|
|
168
164
|
style={styles.date}
|
|
169
165
|
color={theme.colors.unselectText}
|
|
@@ -175,7 +171,7 @@ export const PreviousOrders = (props: any) => {
|
|
|
175
171
|
? parseDate(order?.delivery_datetime_utc, { outputFormat: 'MM/DD/YY · HH:mm a' })
|
|
176
172
|
: parseDate(order?.delivery_datetime, { utc: false })}{' · '}
|
|
177
173
|
</OText>
|
|
178
|
-
<OText style={styles.date} color={order?.time_status === 'in_time' ? '#00D27A' : order?.time_status === 'at_risk' ? '#FFC700' : order?.time_status === 'delayed' ? '#E63757' : ''
|
|
174
|
+
<OText style={styles.date} color={order?.time_status === 'in_time' ? '#00D27A' : order?.time_status === 'at_risk' ? '#FFC700' : order?.time_status === 'delayed' ? '#E63757' : ''} >{getDelayTime(order)}</OText>
|
|
179
175
|
</View>
|
|
180
176
|
{!isLogisticOrder && (
|
|
181
177
|
<MyOrderOptions>
|
|
@@ -215,28 +211,28 @@ export const PreviousOrders = (props: any) => {
|
|
|
215
211
|
textStyle={{ color: theme.colors.primary }}
|
|
216
212
|
/>
|
|
217
213
|
) : (
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
214
|
+
<>
|
|
215
|
+
<OButton
|
|
216
|
+
text={t('REJECT', 'Reject')}
|
|
217
|
+
onClick={() => handleClickLogisticOrder(2, _order?.id)}
|
|
218
|
+
bgColor={theme.colors.danger}
|
|
219
|
+
borderColor={theme.colors.danger}
|
|
220
|
+
imgRightSrc={null}
|
|
221
|
+
style={{ borderRadius: 7, height: 40 }}
|
|
222
|
+
parentStyle={{ width: '45%' }}
|
|
223
|
+
textStyle={{ color: theme.colors.dangerText }}
|
|
224
|
+
/>
|
|
225
|
+
<OButton
|
|
226
|
+
text={t('ACCEPT', 'Accept')}
|
|
227
|
+
onClick={() => handleClickLogisticOrder(1, _order?.id)}
|
|
228
|
+
bgColor={theme.colors.successOrder}
|
|
229
|
+
borderColor={theme.colors.successOrder}
|
|
230
|
+
imgRightSrc={null}
|
|
231
|
+
style={{ borderRadius: 7, height: 40 }}
|
|
232
|
+
parentStyle={{ width: '45%' }}
|
|
233
|
+
textStyle={{ color: theme.colors.successText }}
|
|
234
|
+
/>
|
|
235
|
+
</>
|
|
240
236
|
)}
|
|
241
237
|
</AcceptOrRejectOrder>
|
|
242
238
|
)}
|
|
@@ -8,16 +8,16 @@ export const Card = styled.View`
|
|
|
8
8
|
`;
|
|
9
9
|
|
|
10
10
|
export const Logo = styled.View`
|
|
11
|
-
height:
|
|
12
|
-
width:
|
|
11
|
+
height: 65px;
|
|
12
|
+
width: 65px;
|
|
13
13
|
`;
|
|
14
14
|
|
|
15
15
|
export const Information = styled.View`
|
|
16
16
|
position: relative;
|
|
17
17
|
justify-content: flex-start;
|
|
18
|
-
margin-horizontal:
|
|
18
|
+
margin-horizontal: 5px;
|
|
19
19
|
flex: 1;
|
|
20
|
-
max-height:
|
|
20
|
+
max-height: 60px;
|
|
21
21
|
`;
|
|
22
22
|
|
|
23
23
|
export const MyOrderOptions = styled.View`
|
|
@@ -39,12 +39,7 @@ export const AcceptOrRejectOrder = styled.View`
|
|
|
39
39
|
export const Timestatus = styled.View`
|
|
40
40
|
position: relative;;
|
|
41
41
|
width: 4px;
|
|
42
|
-
height:
|
|
42
|
+
height: 55px;
|
|
43
43
|
border-radius: 20px;
|
|
44
44
|
top: 5px;
|
|
45
|
-
margin-right: 5px;
|
|
46
|
-
${(props: any) => props.theme?.rtl && css`
|
|
47
|
-
left: unset;
|
|
48
|
-
right: -5px;
|
|
49
|
-
`}
|
|
50
45
|
`
|
|
@@ -329,7 +329,7 @@ const CartUI = (props: any) => {
|
|
|
329
329
|
<OText size={12} numberOfLines={1}>
|
|
330
330
|
{walletName[cart?.wallets?.find((wallet: any) => wallet.id === event.wallet_id)?.type]?.name}
|
|
331
331
|
</OText>
|
|
332
|
-
<OText size={12}>-{parsePrice(event.amount)}</OText>
|
|
332
|
+
<OText size={12}>-{parsePrice(event.amount, { isTruncable: true })}</OText>
|
|
333
333
|
</OSTable>
|
|
334
334
|
))}
|
|
335
335
|
{isCouponEnabled && !isCartPending && (
|
|
@@ -276,7 +276,7 @@ const OrderSummaryUI = (props: any) => {
|
|
|
276
276
|
<OText size={12} numberOfLines={1}>
|
|
277
277
|
{walletName[cart?.wallets?.find((wallet: any) => wallet.id === event.wallet_id)?.type]?.name}
|
|
278
278
|
</OText>
|
|
279
|
-
<OText size={12}>-{parsePrice(event.amount)}</OText>
|
|
279
|
+
<OText size={12}>-{parsePrice(event.amount, { isTruncable: true })}</OText>
|
|
280
280
|
</OSTable>
|
|
281
281
|
))}
|
|
282
282
|
{isCouponEnabled && !isCartPending && (
|
|
@@ -48,7 +48,7 @@ const PaymentOptionWalletUI = (props: any) => {
|
|
|
48
48
|
new Array(walletsState.result?.length).fill(false)
|
|
49
49
|
);
|
|
50
50
|
|
|
51
|
-
const creditBalance: any = (wallet: any) => ` = ${parsePrice(
|
|
51
|
+
const creditBalance: any = (wallet: any) => ` = ${parsePrice(wallet.balance / wallet.redemption_rate)}`
|
|
52
52
|
|
|
53
53
|
const walletName: any = {
|
|
54
54
|
cash: {
|
|
@@ -10,6 +10,8 @@ import LinearGradient from 'react-native-linear-gradient'
|
|
|
10
10
|
import { FloatingBottomContainer } from '../../layouts/FloatingBottomContainer'
|
|
11
11
|
import Spinner from 'react-native-loading-spinner-overlay'
|
|
12
12
|
|
|
13
|
+
import { reviewCommentList } from '../../../../../src/utils'
|
|
14
|
+
|
|
13
15
|
import {
|
|
14
16
|
ReviewDriverContainer,
|
|
15
17
|
DriverPhotoContainer,
|
|
@@ -91,12 +93,7 @@ const ReviewDriverUI = (props: ReviewDriverParams) => {
|
|
|
91
93
|
{ key: 5, text: t('GREAT', 'Great'), percent: 1, parentStyle: { right: '0%' }, isInnerStyle: false, pointerColor: false }
|
|
92
94
|
]
|
|
93
95
|
|
|
94
|
-
const commentsList =
|
|
95
|
-
{ key: 0, content: t('FAST_AND_EFFICIENT', "Fast and efficient") },
|
|
96
|
-
{ key: 1, content: t('DELIVERY_PERFECT', "Delivery perfect") },
|
|
97
|
-
{ key: 2, content: t('EXCELLENT_COMMUNICATION', "Excellent communication") },
|
|
98
|
-
{ key: 3, content: t('CORDIAL_SERVICE', 'Cordial service') }
|
|
99
|
-
]
|
|
96
|
+
const commentsList = reviewCommentList('driver')
|
|
100
97
|
|
|
101
98
|
const onSubmit = () => {
|
|
102
99
|
if (dirverReviews?.qualification === 0) {
|
|
@@ -248,9 +245,11 @@ const ReviewDriverUI = (props: ReviewDriverParams) => {
|
|
|
248
245
|
</RatingTextContainer>
|
|
249
246
|
</RatingBarContainer>
|
|
250
247
|
|
|
251
|
-
<OText style={{ marginTop: 30 }} color={theme.colors.textNormal}>
|
|
248
|
+
<OText style={{ marginTop: 30 }} color={theme.colors.textNormal}>
|
|
249
|
+
{commentsList[dirverReviews?.qualification || 1]?.title}
|
|
250
|
+
</OText>
|
|
252
251
|
<CommentsButtonGroup>
|
|
253
|
-
{commentsList
|
|
252
|
+
{commentsList[dirverReviews?.qualification || 1]?.list?.map(commentItem => (
|
|
254
253
|
<OButton
|
|
255
254
|
key={commentItem.key}
|
|
256
255
|
text={commentItem.content}
|
|
@@ -22,6 +22,8 @@ import Spinner from 'react-native-loading-spinner-overlay'
|
|
|
22
22
|
import { ReviewOrderParams } from '../../types'
|
|
23
23
|
import { useTheme } from 'styled-components/native'
|
|
24
24
|
|
|
25
|
+
import { reviewCommentList } from '../../../../../src/utils'
|
|
26
|
+
|
|
25
27
|
export const ReviewOrderUI = (props: ReviewOrderParams) => {
|
|
26
28
|
const {
|
|
27
29
|
order,
|
|
@@ -113,14 +115,7 @@ export const ReviewOrderUI = (props: ReviewOrderParams) => {
|
|
|
113
115
|
{ key: 5, text: t('GREAT', 'Great'), percent: 1, parentStyle: { right: '0%' }, isInnerStyle: false, pointerColor: false }
|
|
114
116
|
]
|
|
115
117
|
|
|
116
|
-
const commentsList =
|
|
117
|
-
{ key: 0, content: t('IT_WASNT_TASTY', "It wasn't tasty") },
|
|
118
|
-
{ key: 1, content: t('IT_DOESNT_PACK_WELL', "It doesn't pack well") },
|
|
119
|
-
{ key: 2, content: t('IT_ISNT_WORTH_WHAT_IT_COSTS', "It isn't worth what it costs") },
|
|
120
|
-
{ key: 3, content: t('TOO_SLOW', 'Too slow') },
|
|
121
|
-
{ key: 4, content: t('SUSTAINABLE_PACKAGING_WASNT_USED', "Sustainable packaging wasn't used") },
|
|
122
|
-
{ key: 5, content: t('THEY_DID_NOT_FOLLOW_THE_ORDER_NOTES', 'They did not follow the order notes') }
|
|
123
|
-
]
|
|
118
|
+
const commentsList = reviewCommentList('order')
|
|
124
119
|
|
|
125
120
|
const handleChangeStars = (index: number) => {
|
|
126
121
|
switch (index) {
|
|
@@ -268,9 +263,11 @@ export const ReviewOrderUI = (props: ReviewOrderParams) => {
|
|
|
268
263
|
</RatingTextContainer>
|
|
269
264
|
</RatingBarContainer>
|
|
270
265
|
|
|
271
|
-
<OText style={{ marginTop: 30 }} color={theme.colors.textNormal}>
|
|
266
|
+
<OText style={{ marginTop: 30 }} color={theme.colors.textNormal}>
|
|
267
|
+
{commentsList[stars?.quality || 1]?.title}
|
|
268
|
+
</OText>
|
|
272
269
|
<CommentsButtonGroup>
|
|
273
|
-
{commentsList
|
|
270
|
+
{commentsList[stars?.quality || 1]?.list?.map(commentItem => (
|
|
274
271
|
<OButton
|
|
275
272
|
key={commentItem.key}
|
|
276
273
|
text={commentItem.content}
|
|
@@ -6,6 +6,8 @@ import AntDesignIcons from 'react-native-vector-icons/AntDesign'
|
|
|
6
6
|
import { useTheme } from 'styled-components/native'
|
|
7
7
|
import { SingleProductReviewParams } from '../../types'
|
|
8
8
|
|
|
9
|
+
import { reviewCommentList } from '../../../../../src/utils'
|
|
10
|
+
|
|
9
11
|
import {
|
|
10
12
|
ProductContainer,
|
|
11
13
|
ProductHeader,
|
|
@@ -45,13 +47,7 @@ export const SingleProductReview = (props: SingleProductReviewParams) => {
|
|
|
45
47
|
const [isShowTextArea, setIsShowTextArea] = useState(false)
|
|
46
48
|
const [qualification, setQualification] = useState(5)
|
|
47
49
|
|
|
48
|
-
const commentsList =
|
|
49
|
-
{ key: 0, content: t('IT_WASNT_TASTY', "It wasn't tasty") },
|
|
50
|
-
{ key: 1, content: t('SMALL_PORTION', 'Small portion') },
|
|
51
|
-
{ key: 2, content: t('WET_OR_LEAKY', 'Wet or leaky') },
|
|
52
|
-
{ key: 3, content: t('SLOPPY_PRESENTATION', 'Sloppy presentation') },
|
|
53
|
-
{ key: 4, content: t('COLD_OR_MELTED', 'Cold or melted') }
|
|
54
|
-
]
|
|
50
|
+
const commentsList = reviewCommentList('product')
|
|
55
51
|
|
|
56
52
|
const isSelectedComment = (commentKey: number) => {
|
|
57
53
|
const found = comments.find((comment: any) => comment?.key === commentKey)
|
|
@@ -115,7 +111,7 @@ export const SingleProductReview = (props: SingleProductReviewParams) => {
|
|
|
115
111
|
</LikeHandsActionContainer>
|
|
116
112
|
</ProductHeader>
|
|
117
113
|
<CommentsButtonGroup>
|
|
118
|
-
{commentsList
|
|
114
|
+
{commentsList[qualification === 5 ? 'like' : 'dislike']?.map(commentItem => (
|
|
119
115
|
<OButton
|
|
120
116
|
key={commentItem.key}
|
|
121
117
|
text={commentItem.content}
|