ordering-ui-react-native 0.22.56 → 0.22.57-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/DeliveryApp.tsx +1 -1
- 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 +9 -6
- 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 +25 -14
- package/themes/business/src/components/OrderDetails/Business.tsx +56 -20
- package/themes/business/src/components/OrderDetails/Delivery.tsx +134 -53
- package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +155 -45
- 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 +345 -231
- 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 +30 -18
- 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 +34 -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 +19 -8
- package/themes/original/src/components/AppleLogin/index.tsx +4 -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 +34 -15
- 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 +10 -6
- 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/BusinessesListing/index.tsx +0 -1
- package/themes/original/src/components/Cart/index.tsx +48 -13
- package/themes/original/src/components/CartContent/index.tsx +2 -3
- package/themes/original/src/components/Checkout/index.tsx +130 -89
- package/themes/original/src/components/Favorite/index.tsx +1 -5
- package/themes/original/src/components/ForgotPasswordForm/index.tsx +1 -2
- package/themes/original/src/components/GoogleMap/index.tsx +39 -18
- 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 +44 -0
- package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
- package/themes/original/src/components/Home/index.tsx +35 -16
- package/themes/original/src/components/LoginForm/index.tsx +12 -5
- package/themes/original/src/components/MessageListing/index.tsx +1 -1
- package/themes/original/src/components/Messages/index.tsx +20 -13
- package/themes/original/src/components/MomentOption/TimeListItem.tsx +56 -0
- package/themes/original/src/components/MomentOption/index.tsx +72 -51
- package/themes/original/src/components/MomentSelector/index.tsx +5 -2
- package/themes/original/src/components/MultiCheckout/index.tsx +76 -35
- package/themes/original/src/components/MyOrders/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 +44 -19
- package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
- package/themes/original/src/components/OrderProgress/index.tsx +4 -3
- package/themes/original/src/components/OrderSummary/index.tsx +32 -11
- package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -3
- package/themes/original/src/components/OrdersOption/index.tsx +3 -6
- package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
- 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 +1 -1
- package/themes/original/src/components/SignupForm/index.tsx +41 -24
- package/themes/original/src/components/SingleOrderCard/index.tsx +7 -4
- 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/StripeElementsForm/naked.tsx +1 -1
- 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/UserProfile/index.tsx +9 -1
- package/themes/original/src/components/UserVerification/index.tsx +18 -5
- package/themes/original/src/components/shared/OAlert.tsx +2 -1
- package/themes/original/src/components/shared/OButton.tsx +2 -2
- package/themes/original/src/components/shared/OInput.tsx +4 -8
- package/themes/original/src/components/shared/OModal.tsx +7 -2
- package/themes/original/src/types/index.tsx +699 -689
- package/themes/original/src/utils/index.tsx +29 -0
- 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
|
@@ -29,7 +29,8 @@ import {
|
|
|
29
29
|
TimeItem
|
|
30
30
|
} from './styles';
|
|
31
31
|
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
32
|
-
import {
|
|
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,7 +332,28 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
321
332
|
}
|
|
322
333
|
}))
|
|
323
334
|
}
|
|
324
|
-
}, [dateSelected,
|
|
335
|
+
}, [dateSelected, hoursList?.length, JSON.stringify(datesWhitelist), JSON.stringify(business)])
|
|
336
|
+
|
|
337
|
+
useEffect(() => {
|
|
338
|
+
setLocalMoment(moment, t)
|
|
339
|
+
}, [])
|
|
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])
|
|
325
357
|
|
|
326
358
|
return (
|
|
327
359
|
<>
|
|
@@ -345,7 +377,7 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
345
377
|
titleWrapStyle={{ paddingHorizontal: 0 }}
|
|
346
378
|
/>
|
|
347
379
|
)}
|
|
348
|
-
{(preorderMinimumDays === 0 && preorderLeadTime === 0) || !cateringPreorder && (
|
|
380
|
+
{((preorderMinimumDays === 0 && preorderLeadTime === 0) || !cateringPreorder) && (
|
|
349
381
|
<WrapSelectOption
|
|
350
382
|
onPress={() => _handleAsap()}
|
|
351
383
|
disabled={orderState.loading} style={{ alignItems: 'flex-start' }}>
|
|
@@ -394,28 +426,27 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
394
426
|
<View style={{ flex: 1 }}>
|
|
395
427
|
{selectDate && datesWhitelist[0]?.start !== null && (
|
|
396
428
|
<CalendarStrip
|
|
397
|
-
locale={locale}
|
|
398
429
|
scrollable
|
|
399
430
|
style={styles.calendar}
|
|
400
431
|
calendarHeaderContainerStyle={styles.calendarHeaderContainer}
|
|
401
432
|
calendarHeaderStyle={styles.calendarHeader}
|
|
402
|
-
dateNumberStyle={styles.dateNumber}
|
|
403
|
-
dateNameStyle={styles.dateName}
|
|
404
433
|
iconContainer={{ flex: 0.1 }}
|
|
405
|
-
highlightDateNameStyle={styles.highlightDateName}
|
|
406
|
-
highlightDateNumberStyle={styles.highlightDateNumber}
|
|
407
434
|
dayContainerStyle={{ height: '100%' }}
|
|
408
435
|
highlightDateContainerStyle={{ height: '100%' }}
|
|
409
436
|
calendarHeaderFormat='MMMM, YYYY'
|
|
410
437
|
iconStyle={{ borderWidth: 1 }}
|
|
411
438
|
selectedDate={dateSelected}
|
|
412
439
|
datesWhitelist={datesWhitelist}
|
|
440
|
+
highlightDateNumberStyle={styles.highlightDateNumber}
|
|
441
|
+
highlightDateNameStyle={styles.highlightDateName}
|
|
413
442
|
minDate={moment()}
|
|
414
443
|
maxDate={cateringPreorder ? moment().add(preorderMaximumDays, 'days') : undefined}
|
|
415
444
|
disabledDateNameStyle={styles.disabledDateName}
|
|
416
445
|
disabledDateNumberStyle={styles.disabledDateNumber}
|
|
417
446
|
disabledDateOpacity={0.6}
|
|
418
|
-
|
|
447
|
+
dateNumberStyle={styles.dateNumber}
|
|
448
|
+
dateNameStyle={styles.dateName}
|
|
449
|
+
onDateSelected={(date: any) => onSelectDate(date)}
|
|
419
450
|
leftSelector={<LeftSelector />}
|
|
420
451
|
rightSelector={<RightSelector />}
|
|
421
452
|
/>
|
|
@@ -423,44 +454,34 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
423
454
|
</View>
|
|
424
455
|
)}
|
|
425
456
|
<TimeListWrapper nestedScrollEnabled={true} cateringPreorder={cateringPreorder}>
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
<
|
|
430
|
-
|
|
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}
|
|
431
465
|
cateringPreorder={cateringPreorder}
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
size={cateringPreorder ? 18 : 16}
|
|
452
|
-
color={selectedTime === time.value ? theme.colors.primary : theme.colors.textNormal}
|
|
453
|
-
style={{
|
|
454
|
-
lineHeight: 24
|
|
455
|
-
}}
|
|
456
|
-
>{time.text} {cateringPreorder && `- ${time.endText}`}</OText>
|
|
457
|
-
</TimeItem>
|
|
458
|
-
</Pressable>
|
|
459
|
-
))}
|
|
460
|
-
{timeList.length % 3 === 2 && (
|
|
461
|
-
<TimeItem style={{ backgroundColor: 'transparent' }} />
|
|
462
|
-
)}
|
|
463
|
-
</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
|
+
)}
|
|
464
485
|
</TimeListWrapper>
|
|
465
486
|
</OrderTimeWrapper>
|
|
466
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,13 @@ 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 isGuestCheckoutEnabled = configs?.guest_checkout_enabled?.value === '1'
|
|
104
107
|
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
108
|
const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
|
|
106
109
|
const cartsToShow = openCarts?.length > 0 ? openCarts : cartsInvalid
|
|
@@ -121,6 +124,7 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
121
124
|
|
|
122
125
|
const creditPointGeneralPlan = loyaltyPlansState?.result?.find((loyal: any) => loyal.type === 'credit_point')
|
|
123
126
|
const loyalBusinessAvailable = creditPointGeneralPlan?.businesses?.filter((b: any) => b.accumulates) ?? []
|
|
127
|
+
const checkoutFields = useMemo(() => checkoutFieldsState?.fields?.filter((field: any) => field.order_type_id === options?.type), [checkoutFieldsState, options])
|
|
124
128
|
|
|
125
129
|
const accumulationRateBusiness = (businessId: number) => {
|
|
126
130
|
const value = loyalBusinessAvailable?.find((loyal: any) => loyal.business_id === businessId)?.accumulation_rate ?? 0
|
|
@@ -159,7 +163,8 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
159
163
|
const isDisablePlaceOrderButton = cartGroup?.loading || placing || (!(paymethodSelected?.paymethod_id || paymethodSelected?.wallet_id) && cartGroup?.result?.balance > 0) ||
|
|
160
164
|
(paymethodSelected?.paymethod?.gateway === 'stripe' && !paymethodSelected?.paymethod_data) ||
|
|
161
165
|
walletCarts.length > 0
|
|
162
|
-
|| (methodsPay.includes(paymethodSelected?.gateway) && (!methodPaySupported.enabled || methodPaySupported.loading)) || openCarts?.length === 0
|
|
166
|
+
|| (methodsPay.includes(paymethodSelected?.gateway) && (!methodPaySupported.enabled || methodPaySupported.loading)) || openCarts?.length === 0 ||
|
|
167
|
+
(!isGuestCheckoutEnabled && !!user?.guest_id)
|
|
163
168
|
|
|
164
169
|
const handleMomentClick = () => {
|
|
165
170
|
if (isPreOrder) {
|
|
@@ -169,35 +174,55 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
169
174
|
|
|
170
175
|
const checkValidationFields = () => {
|
|
171
176
|
setUserErrors([])
|
|
172
|
-
const errors = []
|
|
173
|
-
const
|
|
174
|
-
const _requiredFields:
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
177
|
+
const errors: Array<string> = []
|
|
178
|
+
const userSelected = user
|
|
179
|
+
const _requiredFields: Array<string> = []
|
|
180
|
+
Object.values(checkoutFieldsState?.fields).map((field: any) => {
|
|
181
|
+
if (options?.type === field?.order_type_id &&
|
|
182
|
+
field?.enabled &&
|
|
183
|
+
field?.required &&
|
|
184
|
+
!notFields.includes(field?.validation_field?.code)
|
|
185
|
+
) {
|
|
186
|
+
if (userSelected && !userSelected[field?.validation_field?.code]) {
|
|
187
|
+
_requiredFields.push(field?.validation_field?.code)
|
|
180
188
|
}
|
|
181
189
|
}
|
|
182
190
|
})
|
|
183
|
-
|
|
191
|
+
const mobilePhoneField: any = Object.values(checkoutFieldsState?.fields)?.find((field: any) => field?.order_type_id === options?.type && field?.validation_field?.code === 'mobile_phone')
|
|
184
192
|
if (
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
193
|
+
userSelected &&
|
|
194
|
+
!userSelected?.cellphone &&
|
|
195
|
+
((mobilePhoneField?.enabled &&
|
|
196
|
+
mobilePhoneField?.required) ||
|
|
188
197
|
configs?.verification_phone_required?.value === '1')
|
|
189
198
|
) {
|
|
190
199
|
_requiredFields.push('cellphone')
|
|
191
200
|
}
|
|
192
201
|
setRequiredFields(_requiredFields)
|
|
193
202
|
|
|
194
|
-
if (phoneUpdate) {
|
|
195
|
-
errors.push(t('NECESSARY_UPDATE_COUNTRY_PHONE_CODE', 'It is necessary to update your phone number'))
|
|
196
|
-
}
|
|
197
|
-
|
|
198
203
|
setUserErrors(errors)
|
|
199
204
|
}
|
|
200
205
|
|
|
206
|
+
const checkGuestValidationFields = () => {
|
|
207
|
+
const userSelected = user
|
|
208
|
+
const _requiredFields = checkoutFieldsState?.fields
|
|
209
|
+
.filter((field) => (field?.order_type_id === options?.type) && field?.enabled && field?.required_with_guest &&
|
|
210
|
+
!notFields.includes(field?.validation_field?.code) &&
|
|
211
|
+
userSelected && !userSelected[field?.validation_field?.code])
|
|
212
|
+
const requiredFieldsCode = _requiredFields.map((item) => item?.validation_field?.code)
|
|
213
|
+
const guestCheckoutCellPhone = checkoutFieldsState?.fields?.find((field) => field.order_type_id === options?.type && field?.validation_field?.code === 'mobile_phone')
|
|
214
|
+
if (
|
|
215
|
+
userSelected &&
|
|
216
|
+
!userSelected?.cellphone &&
|
|
217
|
+
((guestCheckoutCellPhone?.enabled &&
|
|
218
|
+
guestCheckoutCellPhone?.required_with_guest) ||
|
|
219
|
+
configs?.verification_phone_required?.value === '1')
|
|
220
|
+
) {
|
|
221
|
+
requiredFieldsCode.push('cellphone')
|
|
222
|
+
}
|
|
223
|
+
setRequiredFields(requiredFieldsCode)
|
|
224
|
+
}
|
|
225
|
+
|
|
201
226
|
const togglePhoneUpdate = (val: boolean) => {
|
|
202
227
|
setPhoneUpdate(val)
|
|
203
228
|
}
|
|
@@ -208,7 +233,7 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
208
233
|
return
|
|
209
234
|
}
|
|
210
235
|
|
|
211
|
-
if (!userErrors.length &&
|
|
236
|
+
if (!userErrors.length && !requiredFields?.length) {
|
|
212
237
|
handleGroupPlaceOrder && handleGroupPlaceOrder(confirmPayment)
|
|
213
238
|
return
|
|
214
239
|
}
|
|
@@ -255,10 +280,13 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
255
280
|
}
|
|
256
281
|
|
|
257
282
|
useEffect(() => {
|
|
258
|
-
if (
|
|
283
|
+
if (checkoutFieldsState?.loading || userLoading) return
|
|
284
|
+
if (user?.guest_id) {
|
|
285
|
+
checkGuestValidationFields()
|
|
286
|
+
} else {
|
|
259
287
|
checkValidationFields()
|
|
260
288
|
}
|
|
261
|
-
}, [
|
|
289
|
+
}, [checkoutFieldsState, user, options?.type])
|
|
262
290
|
|
|
263
291
|
useEffect(() => {
|
|
264
292
|
if (cartsToShow?.length === 1) {
|
|
@@ -399,20 +427,19 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
399
427
|
/>
|
|
400
428
|
<OButton
|
|
401
429
|
text={t('LOGIN', 'Login')}
|
|
402
|
-
textStyle={{ color: theme.colors.primary }}
|
|
403
|
-
bgColor={theme.colors.white}
|
|
404
|
-
borderColor={theme.colors.primary}
|
|
405
430
|
style={{ borderRadius: 7.6, marginTop: 20 }}
|
|
406
431
|
onClick={() => setOpenModal({ ...openModal, login: true })}
|
|
407
432
|
/>
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
433
|
+
{isGuestCheckoutEnabled && (
|
|
434
|
+
<OButton
|
|
435
|
+
text={t('CONTINUE_AS_GUEST', 'Continue as guest')}
|
|
436
|
+
textStyle={{ color: theme.colors.black }}
|
|
437
|
+
bgColor={theme.colors.white}
|
|
438
|
+
borderColor={theme.colors.black}
|
|
439
|
+
style={{ borderRadius: 7.6, marginTop: 20 }}
|
|
440
|
+
onClick={() => setAllowedGuest(true)}
|
|
441
|
+
/>
|
|
442
|
+
)}
|
|
416
443
|
</View>
|
|
417
444
|
) : (
|
|
418
445
|
<UserDetails
|
|
@@ -423,6 +450,9 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
423
450
|
isCheckout
|
|
424
451
|
phoneUpdate={phoneUpdate}
|
|
425
452
|
togglePhoneUpdate={togglePhoneUpdate}
|
|
453
|
+
isOrderTypeValidationField
|
|
454
|
+
requiredFields={requiredFields}
|
|
455
|
+
checkoutFields={checkoutFields}
|
|
426
456
|
/>
|
|
427
457
|
)}
|
|
428
458
|
</ChUserDetails>
|
|
@@ -617,6 +647,14 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
617
647
|
{t('WARNING_INVALID_PRODUCTS_CHECKOUT', 'To continue with your checkout, please remove from your cart the products that are not available.')}
|
|
618
648
|
</OText>
|
|
619
649
|
)}
|
|
650
|
+
{(!isGuestCheckoutEnabled && !!user?.guest_id) && (
|
|
651
|
+
<OText
|
|
652
|
+
color={theme.colors.error}
|
|
653
|
+
size={12}
|
|
654
|
+
>
|
|
655
|
+
{t('LOGIN_SIGN_UP_COMPLETE_ORDER', 'Login/Sign up to complete your order.')}
|
|
656
|
+
</OText>
|
|
657
|
+
)}
|
|
620
658
|
</ChContainer>
|
|
621
659
|
<OModal
|
|
622
660
|
open={openModal.signup}
|
|
@@ -659,9 +697,12 @@ const MultiCheckoutUI = (props: any) => {
|
|
|
659
697
|
isEdit
|
|
660
698
|
phoneUpdate={phoneUpdate}
|
|
661
699
|
togglePhoneUpdate={togglePhoneUpdate}
|
|
662
|
-
requiredFields={requiredFields}
|
|
663
700
|
hideUpdateButton
|
|
664
701
|
handlePlaceOrderAsGuest={handlePlaceOrderAsGuest}
|
|
702
|
+
isCheckoutPlace
|
|
703
|
+
isOrderTypeValidationField
|
|
704
|
+
requiredFields={requiredFields}
|
|
705
|
+
checkoutFields={checkoutFields}
|
|
665
706
|
onClose={() => {
|
|
666
707
|
setIsOpen(false)
|
|
667
708
|
handlePlaceOrder()
|
|
@@ -203,9 +203,9 @@ export const MyOrders = (props: any) => {
|
|
|
203
203
|
setOrdersLength={setOrdersLength}
|
|
204
204
|
/>
|
|
205
205
|
)}
|
|
206
|
-
|
|
206
|
+
|
|
207
207
|
{selectedOption === 'giftCards' && (
|
|
208
|
-
<View style={{ paddingHorizontal: 20
|
|
208
|
+
<View style={{ paddingHorizontal: 20 }}>
|
|
209
209
|
<GiftCardOrdersList
|
|
210
210
|
onNavigationRedirect={props?.onNavigationRedirect}
|
|
211
211
|
/>
|
|
@@ -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
|
}
|
|
@@ -1,14 +1,23 @@
|
|
|
1
|
-
import styled from 'styled-components/native'
|
|
1
|
+
import styled, { css } from 'styled-components/native'
|
|
2
2
|
|
|
3
3
|
export const NotFound = styled.View`
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
${(props: any) => props.simple
|
|
5
|
+
? css`
|
|
6
|
+
background-color: ${(props: any) => props.theme.colors?.white};
|
|
7
|
+
border-radius: 10px;
|
|
8
|
+
padding: 15px;
|
|
9
|
+
padding-horizontal: 20px;
|
|
10
|
+
border: 1px ${(props: any) => props.theme.colors?.border};
|
|
11
|
+
` : css`
|
|
12
|
+
display: flex;
|
|
13
|
+
flex-direction: column;
|
|
14
|
+
justify-content: center;
|
|
15
|
+
align-items: center;
|
|
16
|
+
width: 100%;
|
|
17
|
+
height: auto;
|
|
18
|
+
margin: auto auto;
|
|
19
|
+
padding: 10px;
|
|
20
|
+
`}
|
|
12
21
|
`
|
|
13
22
|
|
|
14
23
|
export const NotFoundImage = styled.View`
|
|
@@ -10,13 +10,14 @@ export const OrderEta = (props: any) => {
|
|
|
10
10
|
|
|
11
11
|
const [{ parseDate }] = useUtils()
|
|
12
12
|
const [estimatedDeliveryTime, setEstimatedDeliveryTime] = useState(null)
|
|
13
|
-
|
|
13
|
+
const deliveryTypes = [1, 7]
|
|
14
|
+
|
|
14
15
|
const getEstimatedDeliveryTime = () => {
|
|
15
16
|
let estimatedUtcTime = null
|
|
16
17
|
let totalEta = 0
|
|
17
18
|
if (order?.delivered_in) totalEta += order?.delivered_in
|
|
18
19
|
if (order?.prepared_in) totalEta += order?.prepared_in
|
|
19
|
-
if (order?.delivery_type
|
|
20
|
+
if (deliveryTypes?.includes?.(order?.delivery_type) && order?.eta_drive_time) {
|
|
20
21
|
totalEta += order?.eta_drive_time
|
|
21
22
|
}
|
|
22
23
|
|
|
@@ -57,7 +58,7 @@ export const OrderEta = (props: any) => {
|
|
|
57
58
|
}
|
|
58
59
|
estimatedUtcTime = moment.utc(_delivery).add(totalEta, 'minutes')
|
|
59
60
|
const _estimatedTime = outputFormat ? moment(estimatedUtcTime).local().format(outputFormat) : parseDate(estimatedUtcTime, { utc: false })
|
|
60
|
-
setEstimatedDeliveryTime(_estimatedTime)
|
|
61
|
+
setEstimatedDeliveryTime(order?.status === 13 ? parseDate(_delivery, { utc: !!order?.delivery_datetime_utc, outputFormat: outputFormat }) : _estimatedTime)
|
|
61
62
|
}
|
|
62
63
|
|
|
63
64
|
useEffect(() => {
|