ordering-ui-react-native 0.22.67 → 0.22.68-release
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 +5 -7
- package/src/components/BusinessesListing/index.tsx +1 -1
- package/src/components/Checkout/index.tsx +40 -39
- package/src/components/VerifyPhone/styles.tsx +1 -2
- package/src/context/OfflineActions/index.tsx +236 -0
- package/src/providers/AlertProvider.tsx +3 -1
- package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +5 -3
- package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +1 -0
- package/themes/business/src/components/BusinessController/index.tsx +8 -3
- package/themes/business/src/components/BusinessProductList/index.tsx +3 -2
- package/themes/business/src/components/Chat/index.tsx +15 -3
- package/themes/business/src/components/DriverMap/index.tsx +44 -33
- package/themes/business/src/components/FloatingButton/index.tsx +3 -2
- package/themes/business/src/components/LanguageSelector/index.tsx +1 -1
- package/themes/business/src/components/LoginForm/index.tsx +123 -98
- package/themes/business/src/components/LogoutButton/index.tsx +13 -4
- package/themes/business/src/components/MapView/RenderMarker.tsx +146 -0
- package/themes/business/src/components/MapView/index.tsx +68 -142
- package/themes/business/src/components/NewOrderNotification/index.tsx +38 -54
- package/themes/business/src/components/OrderDetails/Business.tsx +56 -20
- package/themes/business/src/components/OrderDetails/Delivery.tsx +123 -54
- package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +146 -36
- package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +51 -28
- package/themes/business/src/components/OrderDetails/styles.tsx +39 -3
- package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +17 -16
- package/themes/business/src/components/OrderDetailsLogistic/index.tsx +3 -2
- package/themes/business/src/components/OrderSummary/index.tsx +271 -176
- package/themes/business/src/components/OrdersListManager/index.tsx +13 -1
- package/themes/business/src/components/OrdersOption/index.tsx +342 -228
- package/themes/business/src/components/OrdersOption/styles.tsx +14 -0
- package/themes/business/src/components/PreviousMessages/index.tsx +26 -3
- package/themes/business/src/components/PreviousOrders/OrderItem.tsx +20 -8
- package/themes/business/src/components/PreviousOrders/index.tsx +74 -66
- package/themes/business/src/components/PreviousOrders/styles.tsx +2 -1
- package/themes/business/src/components/PrinterEdition/MessageAlert.tsx +33 -0
- package/themes/business/src/components/PrinterEdition/index.tsx +143 -75
- package/themes/business/src/components/PrinterEdition/printerList.tsx +23 -0
- package/themes/business/src/components/PrinterSettings/index.tsx +1 -1
- package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
- package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
- package/themes/business/src/components/StoresList/index.tsx +2 -2
- package/themes/business/src/components/UserProfileForm/index.tsx +48 -10
- package/themes/business/src/components/UserProfileForm/styles.tsx +7 -0
- package/themes/business/src/components/WebsocketStatus/index.tsx +2 -2
- package/themes/business/src/config/currency.tsx +1010 -0
- package/themes/business/src/hooks/useLocation.tsx +16 -12
- package/themes/business/src/layouts/SafeAreaContainer.tsx +35 -19
- package/themes/business/src/types/index.tsx +33 -7
- package/themes/business/src/utils/index.tsx +28 -3
- package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
- package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
- package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
- package/themes/kiosk/src/components/Checkout/index.tsx +9 -5
- package/themes/kiosk/src/components/CustomerName/index.tsx +1 -1
- package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
- package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
- package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
- package/themes/kiosk/src/components/PaymentOptions/index.tsx +121 -57
- package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
- package/themes/original/index.tsx +223 -219
- package/themes/original/src/components/AddressForm/index.tsx +922 -888
- package/themes/original/src/components/AppleLogin/index.tsx +3 -4
- package/themes/original/src/components/BusinessBasicInformation/index.tsx +1 -1
- package/themes/original/src/components/BusinessController/index.tsx +4 -2
- package/themes/original/src/components/BusinessItemAccordion/index.tsx +10 -4
- package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +103 -92
- package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +7 -3
- package/themes/original/src/components/BusinessListingSearch/index.tsx +8 -13
- package/themes/original/src/components/BusinessPreorder/index.tsx +30 -17
- package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +73 -70
- package/themes/original/src/components/BusinessProductsList/index.tsx +6 -7
- package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
- package/themes/original/src/components/BusinessProductsListing/index.tsx +5 -4
- package/themes/original/src/components/BusinessTypeFilter/index.tsx +9 -8
- package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
- package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
- package/themes/original/src/components/Cart/index.tsx +44 -12
- package/themes/original/src/components/CartContent/index.tsx +0 -2
- package/themes/original/src/components/Checkout/index.tsx +125 -97
- package/themes/original/src/components/ForgotPasswordForm/index.tsx +1 -2
- package/themes/original/src/components/GPSButton/index.tsx +2 -1
- package/themes/original/src/components/GoogleMap/index.tsx +5 -4
- package/themes/original/src/components/Help/functions.tsx +76 -0
- package/themes/original/src/components/Help/index.tsx +74 -29
- package/themes/original/src/components/Help/styles.tsx +4 -1
- package/themes/original/src/components/HelpOptions/index.tsx +53 -0
- package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
- package/themes/original/src/components/Home/index.tsx +36 -11
- package/themes/original/src/components/LastOrder/index.tsx +1 -1
- package/themes/original/src/components/LoginForm/index.tsx +11 -5
- package/themes/original/src/components/MessageListing/index.tsx +1 -1
- package/themes/original/src/components/Messages/index.tsx +562 -555
- package/themes/original/src/components/MomentOption/TimeListItem.tsx +56 -0
- package/themes/original/src/components/MomentOption/index.tsx +67 -49
- package/themes/original/src/components/MomentSelector/index.tsx +5 -2
- package/themes/original/src/components/MultiCheckout/index.tsx +78 -36
- package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +2 -2
- package/themes/original/src/components/MultiOrdersDetails/index.tsx +2 -2
- package/themes/original/src/components/NavBar/index.tsx +6 -2
- package/themes/original/src/components/NotFoundSource/index.tsx +40 -39
- package/themes/original/src/components/NotFoundSource/styles.tsx +18 -9
- package/themes/original/src/components/OrderDetails/OrderEta.tsx +4 -3
- package/themes/original/src/components/OrderDetails/OrderHistory.tsx +11 -4
- package/themes/original/src/components/OrderDetails/index.tsx +45 -21
- package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
- package/themes/original/src/components/OrderProgress/index.tsx +5 -4
- package/themes/original/src/components/OrderSummary/index.tsx +32 -11
- package/themes/original/src/components/OrderTypeSelector/index.tsx +120 -120
- package/themes/original/src/components/OrdersOption/index.tsx +325 -325
- package/themes/original/src/components/PaymentOptionWallet/index.tsx +1 -0
- package/themes/original/src/components/PaymentOptions/index.tsx +471 -459
- package/themes/original/src/components/PhoneInputNumber/index.tsx +92 -7
- package/themes/original/src/components/ProductForm/ActionButton.tsx +6 -10
- package/themes/original/src/components/ProductItemAccordion/index.tsx +28 -37
- package/themes/original/src/components/ProductOptionSubOption/index.tsx +15 -14
- package/themes/original/src/components/ServiceForm/index.tsx +2 -2
- package/themes/original/src/components/SignupForm/index.tsx +40 -24
- package/themes/original/src/components/SingleOrderCard/index.tsx +8 -5
- package/themes/original/src/components/SingleProductCard/index.tsx +3 -4
- package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
- package/themes/original/src/components/StripeCardsList/index.tsx +9 -4
- package/themes/original/src/components/StripeElementsForm/index.tsx +2 -2
- package/themes/original/src/components/TaxInformation/index.tsx +3 -2
- package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +7 -2
- package/themes/original/src/components/UserDetails/index.tsx +17 -16
- package/themes/original/src/components/UserFormDetails/index.tsx +109 -67
- package/themes/original/src/components/UserVerification/index.tsx +18 -5
- package/themes/original/src/components/VerifyPhone/index.tsx +1 -1
- package/themes/original/src/components/shared/OButton.tsx +2 -2
- package/themes/original/src/components/shared/OInput.tsx +97 -97
- package/themes/original/src/components/shared/OModal.tsx +7 -2
- package/themes/original/src/providers/AlertProvider.tsx +1 -1
- package/themes/original/src/types/index.tsx +700 -693
- package/themes/original/src/utils/index.tsx +50 -34
- package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
- package/themes/original/src/components/HelpAccountAndPayment/index.tsx +0 -62
- package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +0 -12
- package/themes/original/src/components/HelpGuide/index.tsx +0 -68
- package/themes/original/src/components/HelpGuide/styles.tsx +0 -12
- package/themes/original/src/components/HelpOrder/index.tsx +0 -71
- package/themes/original/src/components/HelpOrder/styles.tsx +0 -13
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { Pressable } from 'react-native'
|
|
3
|
+
import {
|
|
4
|
+
TimeItem,
|
|
5
|
+
} from './styles'
|
|
6
|
+
import { OIcon, OText } from '../shared'
|
|
7
|
+
import { useTheme } from 'styled-components/native'
|
|
8
|
+
|
|
9
|
+
const timeListItemPropsAreEqual = (prevProps: any, nextProps: any) => {
|
|
10
|
+
return JSON.stringify(prevProps.time) === JSON.stringify(nextProps.time) &&
|
|
11
|
+
JSON.stringify(prevProps.selectedTime) === JSON.stringify(nextProps.selectedTime) &&
|
|
12
|
+
JSON.stringify(prevProps.cateringPreorder) === JSON.stringify(nextProps.cateringPreorder)
|
|
13
|
+
}
|
|
14
|
+
export const TimeListItem = React.memo((props : any) => {
|
|
15
|
+
const {
|
|
16
|
+
time,
|
|
17
|
+
selectedTime,
|
|
18
|
+
handleChangeTimeSelected,
|
|
19
|
+
cateringPreorder
|
|
20
|
+
} = props
|
|
21
|
+
const theme = useTheme()
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<Pressable onPress={() => handleChangeTimeSelected(time.value)}>
|
|
25
|
+
<TimeItem
|
|
26
|
+
active={selectedTime === time.value}
|
|
27
|
+
cateringPreorder={cateringPreorder}
|
|
28
|
+
>
|
|
29
|
+
{cateringPreorder && (
|
|
30
|
+
<>
|
|
31
|
+
{selectedTime === time.value ? (
|
|
32
|
+
<OIcon
|
|
33
|
+
src={theme.images.general.option_checked}
|
|
34
|
+
width={18}
|
|
35
|
+
style={{ marginEnd: 24, bottom: 2 }}
|
|
36
|
+
/>
|
|
37
|
+
) : (
|
|
38
|
+
<OIcon
|
|
39
|
+
src={theme.images.general.option_normal}
|
|
40
|
+
width={18}
|
|
41
|
+
style={{ marginEnd: 24, bottom: 2 }}
|
|
42
|
+
/>
|
|
43
|
+
)}
|
|
44
|
+
</>
|
|
45
|
+
)}
|
|
46
|
+
<OText
|
|
47
|
+
size={cateringPreorder ? 18 : 16}
|
|
48
|
+
color={selectedTime === time.value ? theme.colors.primary : theme.colors.textNormal}
|
|
49
|
+
style={{
|
|
50
|
+
lineHeight: 24
|
|
51
|
+
}}
|
|
52
|
+
>{time.text} {cateringPreorder && `- ${time.endText}`}</OText>
|
|
53
|
+
</TimeItem>
|
|
54
|
+
</Pressable>
|
|
55
|
+
)
|
|
56
|
+
}, timeListItemPropsAreEqual)
|
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
} from './styles';
|
|
31
31
|
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
32
32
|
import { monthsEnum, setLocalMoment } from '../../utils';
|
|
33
|
+
import { TimeListItem } from './TimeListItem';
|
|
33
34
|
|
|
34
35
|
const MomentOptionUI = (props: MomentOptionParams) => {
|
|
35
36
|
const {
|
|
@@ -161,6 +162,8 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
161
162
|
const [datesWhitelist, setDateWhitelist] = useState<any>([{ start: null, end: null }])
|
|
162
163
|
const [selectDate, setSelectedDate] = useState<any>(dateSelected)
|
|
163
164
|
const [timeList, setTimeList] = useState<any>(hoursList)
|
|
165
|
+
const [nextTime, setNextTime] = useState(null)
|
|
166
|
+
|
|
164
167
|
const goToBack = () => navigation?.canGoBack() && navigation.goBack();
|
|
165
168
|
|
|
166
169
|
const _handleAsap = () => {
|
|
@@ -256,7 +259,7 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
256
259
|
setDateWhitelist([{ start: _minDate, end: _maxDate }])
|
|
257
260
|
}
|
|
258
261
|
}
|
|
259
|
-
}, [JSON.stringify(datesList), preorderMinimumDays, preorderMaximumDays
|
|
262
|
+
}, [JSON.stringify(datesList), preorderMinimumDays, preorderMaximumDays])
|
|
260
263
|
|
|
261
264
|
useEffect(() => {
|
|
262
265
|
if (dateSelected) {
|
|
@@ -278,13 +281,21 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
278
281
|
let _timeLists = []
|
|
279
282
|
const schedule = business && getActualSchedule()
|
|
280
283
|
if (!schedule && business) {
|
|
284
|
+
setTimeList([])
|
|
281
285
|
return
|
|
282
286
|
}
|
|
283
287
|
_timeLists = hoursList
|
|
284
|
-
.filter(hour =>
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
+
.filter(hour => {
|
|
289
|
+
return (Object.keys(business || {})?.length === 0 || schedule?.lapses?.some((lapse: any) => {
|
|
290
|
+
const openHour = lapse.open.hour < 10 ? `0${lapse.open.hour}` : lapse.open.hour
|
|
291
|
+
const openMinute = lapse.open.minute < 10 ? `0${lapse.open.minute}` : lapse.open.minute
|
|
292
|
+
const closeHour = lapse.close.hour < 10 ? `0${lapse.close.hour}` : lapse.close.hour
|
|
293
|
+
const closeMinute = lapse.close.minute < 10 ? `0${lapse.close.minute}` : lapse.close.minute
|
|
294
|
+
return moment(dateSelected + ` ${hour.startTime}`) >= moment(dateSelected + ` ${openHour}:${openMinute}`).add(preorderLeadTime, 'minutes') && moment(dateSelected + ` ${hour.endTime}`) <= moment(dateSelected + ` ${closeHour}:${closeMinute}`)
|
|
295
|
+
})) &&
|
|
296
|
+
(moment(dateSelected + ` ${hour.startTime}`) < moment(dateSelected + ` ${hour.endTime}`)) &&
|
|
297
|
+
(moment().add(preorderLeadTime, 'minutes') < moment(dateSelected + ` ${hour.startTime}`) || !cateringPreorder)
|
|
298
|
+
})
|
|
288
299
|
.map(hour => {
|
|
289
300
|
return {
|
|
290
301
|
value: hour.startTime,
|
|
@@ -321,12 +332,29 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
321
332
|
}
|
|
322
333
|
}))
|
|
323
334
|
}
|
|
324
|
-
}, [dateSelected,
|
|
335
|
+
}, [dateSelected, hoursList?.length, JSON.stringify(datesWhitelist), JSON.stringify(business)])
|
|
325
336
|
|
|
326
337
|
useEffect(() => {
|
|
327
338
|
setLocalMoment(moment, t)
|
|
328
339
|
}, [])
|
|
329
340
|
|
|
341
|
+
useEffect(() => {
|
|
342
|
+
if (preorderMinimumDays === 0 && preorderLeadTime === 0) return
|
|
343
|
+
const isToday = dateSelected === moment().format('YYYY-MM-DD')
|
|
344
|
+
if (isCart && isToday && !orderState?.loading && timeList?.length > 0) {
|
|
345
|
+
setNextTime(timeList?.[0] ?? null)
|
|
346
|
+
}
|
|
347
|
+
}, [timeList?.length])
|
|
348
|
+
|
|
349
|
+
useEffect(() => {
|
|
350
|
+
if (nextTime?.value && timeList?.length > 0 && isCart && !orderState?.loading && !(preorderMinimumDays === 0 && preorderLeadTime === 0)) {
|
|
351
|
+
const notime = timeList?.filter((_: any, i: number) => i !== 0)?.find?.((time: any) => time?.value === timeSelected)
|
|
352
|
+
if (!notime) {
|
|
353
|
+
handleChangeTime(nextTime?.value)
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}, [nextTime?.value])
|
|
357
|
+
|
|
330
358
|
return (
|
|
331
359
|
<>
|
|
332
360
|
<Container
|
|
@@ -349,7 +377,7 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
349
377
|
titleWrapStyle={{ paddingHorizontal: 0 }}
|
|
350
378
|
/>
|
|
351
379
|
)}
|
|
352
|
-
{(preorderMinimumDays === 0 && preorderLeadTime === 0) || !cateringPreorder && (
|
|
380
|
+
{((preorderMinimumDays === 0 && preorderLeadTime === 0) || !cateringPreorder) && (
|
|
353
381
|
<WrapSelectOption
|
|
354
382
|
onPress={() => _handleAsap()}
|
|
355
383
|
disabled={orderState.loading} style={{ alignItems: 'flex-start' }}>
|
|
@@ -402,23 +430,23 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
402
430
|
style={styles.calendar}
|
|
403
431
|
calendarHeaderContainerStyle={styles.calendarHeaderContainer}
|
|
404
432
|
calendarHeaderStyle={styles.calendarHeader}
|
|
405
|
-
dateNumberStyle={styles.dateNumber}
|
|
406
|
-
dateNameStyle={styles.dateName}
|
|
407
433
|
iconContainer={{ flex: 0.1 }}
|
|
408
|
-
highlightDateNameStyle={styles.highlightDateName}
|
|
409
|
-
highlightDateNumberStyle={styles.highlightDateNumber}
|
|
410
434
|
dayContainerStyle={{ height: '100%' }}
|
|
411
435
|
highlightDateContainerStyle={{ height: '100%' }}
|
|
412
436
|
calendarHeaderFormat='MMMM, YYYY'
|
|
413
437
|
iconStyle={{ borderWidth: 1 }}
|
|
414
438
|
selectedDate={dateSelected}
|
|
415
439
|
datesWhitelist={datesWhitelist}
|
|
440
|
+
highlightDateNumberStyle={styles.highlightDateNumber}
|
|
441
|
+
highlightDateNameStyle={styles.highlightDateName}
|
|
416
442
|
minDate={moment()}
|
|
417
443
|
maxDate={cateringPreorder ? moment().add(preorderMaximumDays, 'days') : undefined}
|
|
418
444
|
disabledDateNameStyle={styles.disabledDateName}
|
|
419
445
|
disabledDateNumberStyle={styles.disabledDateNumber}
|
|
420
446
|
disabledDateOpacity={0.6}
|
|
421
|
-
|
|
447
|
+
dateNumberStyle={styles.dateNumber}
|
|
448
|
+
dateNameStyle={styles.dateName}
|
|
449
|
+
onDateSelected={(date: any) => onSelectDate(date)}
|
|
422
450
|
leftSelector={<LeftSelector />}
|
|
423
451
|
rightSelector={<RightSelector />}
|
|
424
452
|
/>
|
|
@@ -426,44 +454,34 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
426
454
|
</View>
|
|
427
455
|
)}
|
|
428
456
|
<TimeListWrapper nestedScrollEnabled={true} cateringPreorder={cateringPreorder}>
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
<
|
|
433
|
-
|
|
457
|
+
{timeList?.length > 0 ? (
|
|
458
|
+
<TimeContentWrapper>
|
|
459
|
+
{timeList.map((time: any, i: number) => (
|
|
460
|
+
<TimeListItem
|
|
461
|
+
key={i}
|
|
462
|
+
time={time}
|
|
463
|
+
selectedTime={selectedTime}
|
|
464
|
+
handleChangeTimeSelected={handleChangeTimeSelected}
|
|
434
465
|
cateringPreorder={cateringPreorder}
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
size={cateringPreorder ? 18 : 16}
|
|
455
|
-
color={selectedTime === time.value ? theme.colors.primary : theme.colors.textNormal}
|
|
456
|
-
style={{
|
|
457
|
-
lineHeight: 24
|
|
458
|
-
}}
|
|
459
|
-
>{time.text} {cateringPreorder && `- ${time.endText}`}</OText>
|
|
460
|
-
</TimeItem>
|
|
461
|
-
</Pressable>
|
|
462
|
-
))}
|
|
463
|
-
{timeList.length % 3 === 2 && (
|
|
464
|
-
<TimeItem style={{ backgroundColor: 'transparent' }} />
|
|
465
|
-
)}
|
|
466
|
-
</TimeContentWrapper>
|
|
466
|
+
/>
|
|
467
|
+
))}
|
|
468
|
+
{timeList.length % 3 === 2 && (
|
|
469
|
+
<TimeItem style={{ backgroundColor: 'transparent' }} />
|
|
470
|
+
)}
|
|
471
|
+
</TimeContentWrapper>
|
|
472
|
+
) : (
|
|
473
|
+
<OText
|
|
474
|
+
size={16}
|
|
475
|
+
style={{
|
|
476
|
+
fontWeight: '600',
|
|
477
|
+
lineHeight: 24,
|
|
478
|
+
marginBottom: 12,
|
|
479
|
+
textAlign: 'center'
|
|
480
|
+
}}
|
|
481
|
+
>
|
|
482
|
+
{t('ERROR_ADD_PRODUCT_BUSINESS_CLOSED', 'The business is closed at the moment')}
|
|
483
|
+
</OText>
|
|
484
|
+
)}
|
|
467
485
|
</TimeListWrapper>
|
|
468
486
|
</OrderTimeWrapper>
|
|
469
487
|
)}
|
|
@@ -5,7 +5,8 @@ import { useTheme } from 'styled-components/native'
|
|
|
5
5
|
import {
|
|
6
6
|
MomentOption as MomentOptionController,
|
|
7
7
|
useConfig,
|
|
8
|
-
useUtils
|
|
8
|
+
useUtils,
|
|
9
|
+
useLanguage
|
|
9
10
|
} from 'ordering-components/native'
|
|
10
11
|
import { useSafeAreaInsets } from 'react-native-safe-area-context'
|
|
11
12
|
import IconAntDesign from 'react-native-vector-icons/AntDesign'
|
|
@@ -26,6 +27,7 @@ const MomentSelectorUI = (props: any) => {
|
|
|
26
27
|
const { top } = useSafeAreaInsets()
|
|
27
28
|
const [{ configs }] = useConfig()
|
|
28
29
|
const [{ parseTime }] = useUtils()
|
|
30
|
+
const [, t] = useLanguage()
|
|
29
31
|
|
|
30
32
|
const [customizedDateList, setCustomizedDateList] = useState([])
|
|
31
33
|
const [customizedTimeList, setCustomizedTimeList] = useState([])
|
|
@@ -130,6 +132,7 @@ const MomentSelectorUI = (props: any) => {
|
|
|
130
132
|
<View style={styles.selectWrapper}>
|
|
131
133
|
<SelectDropdown
|
|
132
134
|
defaultValue={customizedTimeList?.find((item: any) => item.key === timeSelected)}
|
|
135
|
+
defaultButtonText={t('SELECT_A_TIME_OPTION', 'Select an option')}
|
|
133
136
|
data={customizedTimeList}
|
|
134
137
|
onSelect={(selectedItem, index) => {
|
|
135
138
|
handleChangeTime(selectedItem.key)
|
|
@@ -194,4 +197,4 @@ export const MomentSelector = (props: any) => {
|
|
|
194
197
|
maxDate: currentDate
|
|
195
198
|
}
|
|
196
199
|
return <MomentOptionController {...businessPreorderProps} />
|
|
197
|
-
}
|
|
200
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useState, useEffect, useCallback } from 'react'
|
|
1
|
+
import React, { useState, useEffect, useCallback, useMemo } from 'react'
|
|
2
2
|
import {
|
|
3
3
|
useLanguage,
|
|
4
4
|
useConfig,
|
|
@@ -70,7 +70,8 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
70
70
|
walletState,
|
|
71
71
|
onNavigationRedirectReplace,
|
|
72
72
|
merchantId,
|
|
73
|
-
cartsInvalid
|
|
73
|
+
cartsInvalid,
|
|
74
|
+
checkoutFieldsState
|
|
74
75
|
} = props
|
|
75
76
|
|
|
76
77
|
const theme = useTheme();
|
|
@@ -96,11 +97,14 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
96
97
|
const [{ parsePrice, parseDate }] = useUtils();
|
|
97
98
|
const [{ options, carts, loading }, { confirmCart }] = useOrder();
|
|
98
99
|
const [validationFields] = useValidationFields();
|
|
99
|
-
const [{ user }, { login }] = useSession()
|
|
100
|
+
const [{ user, loading: userLoading }, { login }] = useSession()
|
|
100
101
|
|
|
102
|
+
const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes', 'comments']
|
|
101
103
|
const configTypes = configs?.order_types_allowed?.value.split('|').map((value: any) => Number(value)) || []
|
|
102
104
|
const isPreOrder = configs?.preorder_status_enabled?.value === '1'
|
|
103
105
|
const isMultiDriverTips = configs?.checkout_multi_business_enabled?.value === '1'
|
|
106
|
+
const allowDriverTipPickup = configs?.driver_tip_allowed_at_pickup?.value === '1' && options?.type === 2
|
|
107
|
+
const isGuestCheckoutEnabled = configs?.guest_checkout_enabled?.value === '1'
|
|
104
108
|
const walletCarts = (Object.values(carts)?.filter((cart: any) => cart?.products && cart?.products?.length && cart?.status !== 2 && cart?.valid_schedule && cart?.valid_products && cart?.valid_address && cart?.valid_maximum && cart?.valid_minimum && cart?.wallets) || null) || []
|
|
105
109
|
const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
|
|
106
110
|
const cartsToShow = openCarts?.length > 0 ? openCarts : cartsInvalid
|
|
@@ -121,6 +125,7 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
121
125
|
|
|
122
126
|
const creditPointGeneralPlan = loyaltyPlansState?.result?.find((loyal: any) => loyal.type === 'credit_point')
|
|
123
127
|
const loyalBusinessAvailable = creditPointGeneralPlan?.businesses?.filter((b: any) => b.accumulates) ?? []
|
|
128
|
+
const checkoutFields = useMemo(() => checkoutFieldsState?.fields?.filter((field: any) => field.order_type_id === options?.type), [checkoutFieldsState, options])
|
|
124
129
|
|
|
125
130
|
const accumulationRateBusiness = (businessId: number) => {
|
|
126
131
|
const value = loyalBusinessAvailable?.find((loyal: any) => loyal.business_id === businessId)?.accumulation_rate ?? 0
|
|
@@ -159,7 +164,8 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
159
164
|
const isDisablePlaceOrderButton = cartGroup?.loading || placing || (!(paymethodSelected?.paymethod_id || paymethodSelected?.wallet_id) && cartGroup?.result?.balance > 0) ||
|
|
160
165
|
(paymethodSelected?.paymethod?.gateway === 'stripe' && !paymethodSelected?.paymethod_data) ||
|
|
161
166
|
walletCarts.length > 0
|
|
162
|
-
|| (methodsPay.includes(paymethodSelected?.gateway) && (!methodPaySupported.enabled || methodPaySupported.loading)) || openCarts?.length === 0
|
|
167
|
+
|| (methodsPay.includes(paymethodSelected?.gateway) && (!methodPaySupported.enabled || methodPaySupported.loading)) || openCarts?.length === 0 ||
|
|
168
|
+
(!isGuestCheckoutEnabled && !!user?.guest_id)
|
|
163
169
|
|
|
164
170
|
const handleMomentClick = () => {
|
|
165
171
|
if (isPreOrder) {
|
|
@@ -169,35 +175,55 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
169
175
|
|
|
170
176
|
const checkValidationFields = () => {
|
|
171
177
|
setUserErrors([])
|
|
172
|
-
const errors = []
|
|
173
|
-
const
|
|
174
|
-
const _requiredFields:
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
178
|
+
const errors: Array<string> = []
|
|
179
|
+
const userSelected = user
|
|
180
|
+
const _requiredFields: Array<string> = []
|
|
181
|
+
Object.values(checkoutFieldsState?.fields).map((field: any) => {
|
|
182
|
+
if (options?.type === field?.order_type_id &&
|
|
183
|
+
field?.enabled &&
|
|
184
|
+
field?.required &&
|
|
185
|
+
!notFields.includes(field?.validation_field?.code)
|
|
186
|
+
) {
|
|
187
|
+
if (userSelected && !userSelected[field?.validation_field?.code]) {
|
|
188
|
+
_requiredFields.push(field?.validation_field?.code)
|
|
180
189
|
}
|
|
181
190
|
}
|
|
182
191
|
})
|
|
183
|
-
|
|
192
|
+
const mobilePhoneField: any = Object.values(checkoutFieldsState?.fields)?.find((field: any) => field?.order_type_id === options?.type && field?.validation_field?.code === 'mobile_phone')
|
|
184
193
|
if (
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
194
|
+
userSelected &&
|
|
195
|
+
!userSelected?.cellphone &&
|
|
196
|
+
((mobilePhoneField?.enabled &&
|
|
197
|
+
mobilePhoneField?.required) ||
|
|
188
198
|
configs?.verification_phone_required?.value === '1')
|
|
189
199
|
) {
|
|
190
200
|
_requiredFields.push('cellphone')
|
|
191
201
|
}
|
|
192
202
|
setRequiredFields(_requiredFields)
|
|
193
203
|
|
|
194
|
-
if (phoneUpdate) {
|
|
195
|
-
errors.push(t('NECESSARY_UPDATE_COUNTRY_PHONE_CODE', 'It is necessary to update your phone number'))
|
|
196
|
-
}
|
|
197
|
-
|
|
198
204
|
setUserErrors(errors)
|
|
199
205
|
}
|
|
200
206
|
|
|
207
|
+
const checkGuestValidationFields = () => {
|
|
208
|
+
const userSelected = user
|
|
209
|
+
const _requiredFields = checkoutFieldsState?.fields
|
|
210
|
+
.filter((field) => (field?.order_type_id === options?.type) && field?.enabled && field?.required_with_guest &&
|
|
211
|
+
!notFields.includes(field?.validation_field?.code) &&
|
|
212
|
+
userSelected && !userSelected[field?.validation_field?.code])
|
|
213
|
+
const requiredFieldsCode = _requiredFields.map((item) => item?.validation_field?.code)
|
|
214
|
+
const guestCheckoutCellPhone = checkoutFieldsState?.fields?.find((field) => field.order_type_id === options?.type && field?.validation_field?.code === 'mobile_phone')
|
|
215
|
+
if (
|
|
216
|
+
userSelected &&
|
|
217
|
+
!userSelected?.cellphone &&
|
|
218
|
+
((guestCheckoutCellPhone?.enabled &&
|
|
219
|
+
guestCheckoutCellPhone?.required_with_guest) ||
|
|
220
|
+
configs?.verification_phone_required?.value === '1')
|
|
221
|
+
) {
|
|
222
|
+
requiredFieldsCode.push('cellphone')
|
|
223
|
+
}
|
|
224
|
+
setRequiredFields(requiredFieldsCode)
|
|
225
|
+
}
|
|
226
|
+
|
|
201
227
|
const togglePhoneUpdate = (val: boolean) => {
|
|
202
228
|
setPhoneUpdate(val)
|
|
203
229
|
}
|
|
@@ -208,7 +234,7 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
208
234
|
return
|
|
209
235
|
}
|
|
210
236
|
|
|
211
|
-
if (!userErrors.length &&
|
|
237
|
+
if (!userErrors.length && !requiredFields?.length) {
|
|
212
238
|
handleGroupPlaceOrder && handleGroupPlaceOrder(confirmPayment)
|
|
213
239
|
return
|
|
214
240
|
}
|
|
@@ -255,10 +281,13 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
255
281
|
}
|
|
256
282
|
|
|
257
283
|
useEffect(() => {
|
|
258
|
-
if (
|
|
284
|
+
if (checkoutFieldsState?.loading || userLoading) return
|
|
285
|
+
if (user?.guest_id) {
|
|
286
|
+
checkGuestValidationFields()
|
|
287
|
+
} else {
|
|
259
288
|
checkValidationFields()
|
|
260
289
|
}
|
|
261
|
-
}, [
|
|
290
|
+
}, [checkoutFieldsState, user, options?.type])
|
|
262
291
|
|
|
263
292
|
useEffect(() => {
|
|
264
293
|
if (cartsToShow?.length === 1) {
|
|
@@ -399,20 +428,19 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
399
428
|
/>
|
|
400
429
|
<OButton
|
|
401
430
|
text={t('LOGIN', 'Login')}
|
|
402
|
-
textStyle={{ color: theme.colors.primary }}
|
|
403
|
-
bgColor={theme.colors.white}
|
|
404
|
-
borderColor={theme.colors.primary}
|
|
405
431
|
style={{ borderRadius: 7.6, marginTop: 20 }}
|
|
406
432
|
onClick={() => setOpenModal({ ...openModal, login: true })}
|
|
407
433
|
/>
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
434
|
+
{isGuestCheckoutEnabled && (
|
|
435
|
+
<OButton
|
|
436
|
+
text={t('CONTINUE_AS_GUEST', 'Continue as guest')}
|
|
437
|
+
textStyle={{ color: theme.colors.black }}
|
|
438
|
+
bgColor={theme.colors.white}
|
|
439
|
+
borderColor={theme.colors.black}
|
|
440
|
+
style={{ borderRadius: 7.6, marginTop: 20 }}
|
|
441
|
+
onClick={() => setAllowedGuest(true)}
|
|
442
|
+
/>
|
|
443
|
+
)}
|
|
416
444
|
</View>
|
|
417
445
|
) : (
|
|
418
446
|
<UserDetails
|
|
@@ -423,6 +451,9 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
423
451
|
isCheckout
|
|
424
452
|
phoneUpdate={phoneUpdate}
|
|
425
453
|
togglePhoneUpdate={togglePhoneUpdate}
|
|
454
|
+
isOrderTypeValidationField
|
|
455
|
+
requiredFields={requiredFields}
|
|
456
|
+
checkoutFields={checkoutFields}
|
|
426
457
|
/>
|
|
427
458
|
)}
|
|
428
459
|
</ChUserDetails>
|
|
@@ -464,7 +495,7 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
464
495
|
)}
|
|
465
496
|
{
|
|
466
497
|
isMultiDriverTips &&
|
|
467
|
-
options?.type === 1 &&
|
|
498
|
+
(options?.type === 1 || allowDriverTipPickup) &&
|
|
468
499
|
validationFields?.fields?.checkout?.driver_tip?.enabled &&
|
|
469
500
|
openCarts.every((cart: any) => cart.business_id && cart.status !== 2) &&
|
|
470
501
|
driverTipsOptions && driverTipsOptions?.length > 0 &&
|
|
@@ -617,6 +648,14 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
617
648
|
{t('WARNING_INVALID_PRODUCTS_CHECKOUT', 'To continue with your checkout, please remove from your cart the products that are not available.')}
|
|
618
649
|
</OText>
|
|
619
650
|
)}
|
|
651
|
+
{(!isGuestCheckoutEnabled && !!user?.guest_id) && (
|
|
652
|
+
<OText
|
|
653
|
+
color={theme.colors.error}
|
|
654
|
+
size={12}
|
|
655
|
+
>
|
|
656
|
+
{t('LOGIN_SIGN_UP_COMPLETE_ORDER', 'Login/Sign up to complete your order.')}
|
|
657
|
+
</OText>
|
|
658
|
+
)}
|
|
620
659
|
</ChContainer>
|
|
621
660
|
<OModal
|
|
622
661
|
open={openModal.signup}
|
|
@@ -659,9 +698,12 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
659
698
|
isEdit
|
|
660
699
|
phoneUpdate={phoneUpdate}
|
|
661
700
|
togglePhoneUpdate={togglePhoneUpdate}
|
|
662
|
-
requiredFields={requiredFields}
|
|
663
701
|
hideUpdateButton
|
|
664
702
|
handlePlaceOrderAsGuest={handlePlaceOrderAsGuest}
|
|
703
|
+
isCheckoutPlace
|
|
704
|
+
isOrderTypeValidationField
|
|
705
|
+
requiredFields={requiredFields}
|
|
706
|
+
checkoutFields={checkoutFields}
|
|
665
707
|
onClose={() => {
|
|
666
708
|
setIsOpen(false)
|
|
667
709
|
handlePlaceOrder()
|
|
@@ -143,7 +143,7 @@ const SingleOrderCardUI = (props: any) => {
|
|
|
143
143
|
<LinearGradient
|
|
144
144
|
start={{ x: 0.0, y: 0.0 }}
|
|
145
145
|
end={{
|
|
146
|
-
x: getOrderStatus(order?.status)?.percentage || 0,
|
|
146
|
+
x: getOrderStatus(order?.status, t)?.percentage || 0,
|
|
147
147
|
y: 0,
|
|
148
148
|
}}
|
|
149
149
|
locations={[0.9999, 0.9999]}
|
|
@@ -152,7 +152,7 @@ const SingleOrderCardUI = (props: any) => {
|
|
|
152
152
|
/>
|
|
153
153
|
</StaturBar>
|
|
154
154
|
<OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>
|
|
155
|
-
{getOrderStatus(order?.status)?.value}
|
|
155
|
+
{getOrderStatus(order?.status, t)?.value}
|
|
156
156
|
</OText>
|
|
157
157
|
</>
|
|
158
158
|
)}
|
|
@@ -208,7 +208,7 @@ export const MultiOrdersDetailsUI = (props: any) => {
|
|
|
208
208
|
<LinearGradient
|
|
209
209
|
start={{ x: 0.0, y: 0.0 }}
|
|
210
210
|
end={{
|
|
211
|
-
x: getOrderStatus(orders[0]?.status)?.percentage || 0,
|
|
211
|
+
x: getOrderStatus(orders[0]?.status, t)?.percentage || 0,
|
|
212
212
|
y: 0,
|
|
213
213
|
}}
|
|
214
214
|
locations={[0.9999, 0.9999]}
|
|
@@ -218,7 +218,7 @@ export const MultiOrdersDetailsUI = (props: any) => {
|
|
|
218
218
|
</StaturBar>
|
|
219
219
|
)}
|
|
220
220
|
<OText size={14} lineHeight={18} weight={'400'} color={theme.colors.textNormal} mBottom={10}>
|
|
221
|
-
{getOrderStatus(orders[0]?.status)?.value}
|
|
221
|
+
{getOrderStatus(orders[0]?.status, t)?.value}
|
|
222
222
|
</OText>
|
|
223
223
|
{orders.map((order: any) => (
|
|
224
224
|
<Row key={order.id}>
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
1
4
|
import * as React from 'react'
|
|
2
5
|
import styled, { useTheme } from 'styled-components/native'
|
|
3
6
|
import { OButton, OIcon, OText } from '../shared'
|
|
@@ -130,8 +133,9 @@ NavBar.defaultProps = {
|
|
|
130
133
|
textAlign: 'center'
|
|
131
134
|
};
|
|
132
135
|
|
|
133
|
-
const areEqual = (prevProps: { route?: any
|
|
134
|
-
return prevProps.route === nextProps.route
|
|
136
|
+
const areEqual = (prevProps: { route?: any, title?: string }, nextProps: { route?: any, title?: string }) => {
|
|
137
|
+
return prevProps.route === nextProps.route &&
|
|
138
|
+
JSON.stringify(prevProps.title) === JSON.stringify(nextProps.title)
|
|
135
139
|
return true
|
|
136
140
|
}
|
|
137
141
|
|
|
@@ -5,48 +5,49 @@ import { NotFoundSourceParams } from '../../types'
|
|
|
5
5
|
import { useTheme } from 'styled-components/native';
|
|
6
6
|
import Foundation from 'react-native-vector-icons/Foundation'
|
|
7
7
|
import {
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
NotFound,
|
|
9
|
+
NotFoundImage
|
|
10
10
|
} from './styles'
|
|
11
11
|
|
|
12
12
|
export const NotFoundSource = (props: NotFoundSourceParams) => {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
const {
|
|
14
|
+
hideImage,
|
|
15
|
+
content,
|
|
16
|
+
btnTitle,
|
|
17
|
+
btnStyle,
|
|
18
|
+
conditioned,
|
|
19
|
+
onClickButton,
|
|
20
|
+
simple
|
|
21
|
+
} = props
|
|
21
22
|
|
|
22
|
-
|
|
23
|
+
const theme = useTheme();
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
25
|
+
return (
|
|
26
|
+
<NotFound simple={simple}>
|
|
27
|
+
{!hideImage && !simple && (
|
|
28
|
+
<NotFoundImage>
|
|
29
|
+
<Foundation
|
|
30
|
+
name='page-search'
|
|
31
|
+
color={theme.colors.primary}
|
|
32
|
+
size={60}
|
|
33
|
+
style={{ marginBottom: 10 }}
|
|
34
|
+
/>
|
|
35
|
+
</NotFoundImage>
|
|
36
|
+
)}
|
|
37
|
+
{content && conditioned && <OText color={theme.colors.disabled} size={16} style={{ textAlign: 'center' }}>{content}</OText>}
|
|
38
|
+
{content && !conditioned && <OText color={theme.colors.disabled} size={16} style={{ textAlign: 'center' }}>{content}</OText>}
|
|
39
|
+
{!onClickButton && props.children && (
|
|
40
|
+
props.children
|
|
41
|
+
)}
|
|
42
|
+
{onClickButton && (
|
|
43
|
+
<View style={{ marginTop: 10, width: '100%' }}>
|
|
44
|
+
<OButton
|
|
45
|
+
style={{ width: '100%', height: 50, ...btnStyle }}
|
|
46
|
+
onClick={() => onClickButton()}
|
|
47
|
+
text={btnTitle}
|
|
48
|
+
/>
|
|
49
|
+
</View>
|
|
50
|
+
)}
|
|
51
|
+
</NotFound>
|
|
52
|
+
)
|
|
52
53
|
}
|