ordering-ui-react-native 0.22.56-test → 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.
Files changed (142) hide show
  1. package/package.json +5 -7
  2. package/src/DeliveryApp.tsx +1 -1
  3. package/src/components/BusinessesListing/index.tsx +1 -1
  4. package/src/components/Checkout/index.tsx +40 -39
  5. package/src/components/VerifyPhone/styles.tsx +1 -2
  6. package/src/context/OfflineActions/index.tsx +236 -0
  7. package/src/providers/AlertProvider.tsx +3 -1
  8. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +9 -6
  9. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +1 -0
  10. package/themes/business/src/components/BusinessController/index.tsx +8 -3
  11. package/themes/business/src/components/BusinessProductList/index.tsx +3 -2
  12. package/themes/business/src/components/Chat/index.tsx +15 -3
  13. package/themes/business/src/components/DriverMap/index.tsx +44 -33
  14. package/themes/business/src/components/FloatingButton/index.tsx +3 -2
  15. package/themes/business/src/components/LanguageSelector/index.tsx +1 -1
  16. package/themes/business/src/components/LoginForm/index.tsx +123 -98
  17. package/themes/business/src/components/LogoutButton/index.tsx +13 -4
  18. package/themes/business/src/components/MapView/RenderMarker.tsx +146 -0
  19. package/themes/business/src/components/MapView/index.tsx +68 -142
  20. package/themes/business/src/components/NewOrderNotification/index.tsx +25 -14
  21. package/themes/business/src/components/OrderDetails/Business.tsx +56 -20
  22. package/themes/business/src/components/OrderDetails/Delivery.tsx +134 -53
  23. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +155 -45
  24. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +51 -28
  25. package/themes/business/src/components/OrderDetails/styles.tsx +39 -3
  26. package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +17 -16
  27. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +3 -2
  28. package/themes/business/src/components/OrderSummary/index.tsx +271 -176
  29. package/themes/business/src/components/OrdersListManager/index.tsx +13 -1
  30. package/themes/business/src/components/OrdersOption/index.tsx +345 -231
  31. package/themes/business/src/components/OrdersOption/styles.tsx +14 -0
  32. package/themes/business/src/components/PreviousMessages/index.tsx +26 -3
  33. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +30 -18
  34. package/themes/business/src/components/PreviousOrders/index.tsx +74 -66
  35. package/themes/business/src/components/PreviousOrders/styles.tsx +2 -1
  36. package/themes/business/src/components/PrinterEdition/MessageAlert.tsx +33 -0
  37. package/themes/business/src/components/PrinterEdition/index.tsx +143 -75
  38. package/themes/business/src/components/PrinterEdition/printerList.tsx +23 -0
  39. package/themes/business/src/components/PrinterSettings/index.tsx +1 -1
  40. package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
  41. package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
  42. package/themes/business/src/components/StoresList/index.tsx +2 -2
  43. package/themes/business/src/components/UserProfileForm/index.tsx +48 -10
  44. package/themes/business/src/components/UserProfileForm/styles.tsx +7 -0
  45. package/themes/business/src/components/WebsocketStatus/index.tsx +2 -2
  46. package/themes/business/src/config/currency.tsx +1010 -0
  47. package/themes/business/src/hooks/useLocation.tsx +16 -12
  48. package/themes/business/src/layouts/SafeAreaContainer.tsx +35 -19
  49. package/themes/business/src/types/index.tsx +34 -7
  50. package/themes/business/src/utils/index.tsx +28 -3
  51. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  52. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  53. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  54. package/themes/kiosk/src/components/Checkout/index.tsx +9 -5
  55. package/themes/kiosk/src/components/CustomerName/index.tsx +1 -1
  56. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  57. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  58. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  59. package/themes/kiosk/src/components/PaymentOptions/index.tsx +121 -57
  60. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  61. package/themes/original/index.tsx +223 -219
  62. package/themes/original/src/components/AddressForm/index.tsx +14 -8
  63. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  64. package/themes/original/src/components/BusinessBasicInformation/index.tsx +1 -1
  65. package/themes/original/src/components/BusinessController/index.tsx +4 -2
  66. package/themes/original/src/components/BusinessItemAccordion/index.tsx +10 -4
  67. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +103 -92
  68. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +7 -3
  69. package/themes/original/src/components/BusinessListingSearch/index.tsx +8 -13
  70. package/themes/original/src/components/BusinessPreorder/index.tsx +34 -15
  71. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +73 -70
  72. package/themes/original/src/components/BusinessProductsList/index.tsx +6 -7
  73. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  74. package/themes/original/src/components/BusinessProductsListing/index.tsx +10 -6
  75. package/themes/original/src/components/BusinessTypeFilter/index.tsx +9 -8
  76. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
  77. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  78. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  79. package/themes/original/src/components/Cart/index.tsx +48 -13
  80. package/themes/original/src/components/CartContent/index.tsx +2 -3
  81. package/themes/original/src/components/Checkout/index.tsx +130 -89
  82. package/themes/original/src/components/Favorite/index.tsx +1 -5
  83. package/themes/original/src/components/ForgotPasswordForm/index.tsx +1 -2
  84. package/themes/original/src/components/GoogleMap/index.tsx +6 -5
  85. package/themes/original/src/components/Help/functions.tsx +76 -0
  86. package/themes/original/src/components/Help/index.tsx +74 -29
  87. package/themes/original/src/components/Help/styles.tsx +4 -1
  88. package/themes/original/src/components/HelpOptions/index.tsx +44 -0
  89. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  90. package/themes/original/src/components/Home/index.tsx +35 -16
  91. package/themes/original/src/components/LoginForm/index.tsx +12 -5
  92. package/themes/original/src/components/MessageListing/index.tsx +1 -1
  93. package/themes/original/src/components/Messages/index.tsx +20 -13
  94. package/themes/original/src/components/MomentOption/TimeListItem.tsx +56 -0
  95. package/themes/original/src/components/MomentOption/index.tsx +68 -50
  96. package/themes/original/src/components/MomentSelector/index.tsx +5 -2
  97. package/themes/original/src/components/MultiCheckout/index.tsx +76 -35
  98. package/themes/original/src/components/MyOrders/index.tsx +2 -2
  99. package/themes/original/src/components/NavBar/index.tsx +6 -2
  100. package/themes/original/src/components/NotFoundSource/index.tsx +40 -39
  101. package/themes/original/src/components/NotFoundSource/styles.tsx +18 -9
  102. package/themes/original/src/components/OrderDetails/OrderEta.tsx +4 -3
  103. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +11 -4
  104. package/themes/original/src/components/OrderDetails/index.tsx +44 -19
  105. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  106. package/themes/original/src/components/OrderProgress/index.tsx +4 -3
  107. package/themes/original/src/components/OrderSummary/index.tsx +32 -11
  108. package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -3
  109. package/themes/original/src/components/OrdersOption/index.tsx +3 -6
  110. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  111. package/themes/original/src/components/PaymentOptions/index.tsx +471 -459
  112. package/themes/original/src/components/PhoneInputNumber/index.tsx +92 -7
  113. package/themes/original/src/components/ProductForm/ActionButton.tsx +6 -10
  114. package/themes/original/src/components/ProductItemAccordion/index.tsx +28 -37
  115. package/themes/original/src/components/ProductOptionSubOption/index.tsx +15 -14
  116. package/themes/original/src/components/ServiceForm/index.tsx +1 -1
  117. package/themes/original/src/components/SignupForm/index.tsx +41 -24
  118. package/themes/original/src/components/SingleOrderCard/index.tsx +7 -4
  119. package/themes/original/src/components/SingleProductCard/index.tsx +3 -4
  120. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  121. package/themes/original/src/components/StripeCardsList/index.tsx +9 -4
  122. package/themes/original/src/components/StripeElementsForm/index.tsx +2 -2
  123. package/themes/original/src/components/StripeElementsForm/naked.tsx +1 -1
  124. package/themes/original/src/components/TaxInformation/index.tsx +3 -2
  125. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +7 -2
  126. package/themes/original/src/components/UserDetails/index.tsx +17 -16
  127. package/themes/original/src/components/UserFormDetails/index.tsx +109 -67
  128. package/themes/original/src/components/UserProfile/index.tsx +9 -1
  129. package/themes/original/src/components/UserVerification/index.tsx +18 -5
  130. package/themes/original/src/components/shared/OAlert.tsx +2 -1
  131. package/themes/original/src/components/shared/OButton.tsx +2 -2
  132. package/themes/original/src/components/shared/OInput.tsx +4 -8
  133. package/themes/original/src/components/shared/OModal.tsx +7 -2
  134. package/themes/original/src/types/index.tsx +699 -691
  135. package/themes/original/src/utils/index.tsx +29 -0
  136. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  137. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +0 -62
  138. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +0 -12
  139. package/themes/original/src/components/HelpGuide/index.tsx +0 -68
  140. package/themes/original/src/components/HelpGuide/styles.tsx +0 -12
  141. package/themes/original/src/components/HelpOrder/index.tsx +0 -71
  142. 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 { locale, monthsEnum, setLocalMoment } from '../../utils';
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, cateringPreorder])
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 => (!business || schedule?.lapses?.some((lapse: any) =>
285
- moment(dateSelected + ` ${hour.startTime}`) >= moment(dateSelected + ` ${lapse.open.hour}:${lapse.open.minute}`).add(preorderLeadTime, 'minutes') && moment(dateSelected + ` ${hour.endTime}`) <= moment(dateSelected + ` ${lapse.close.hour}:${lapse.close.minute}`))) &&
286
- moment(dateSelected + ` ${hour.startTime}`) < moment(dateSelected + ` ${hour.endTime}`) &&
287
- (moment().add(preorderLeadTime, 'minutes') < moment(dateSelected + ` ${hour.startTime}`) || !cateringPreorder))
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, JSON.stringify(hoursList), JSON.stringify(datesWhitelist), cateringPreorder, JSON.stringify(business)])
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
- onDateSelected={(date) => onSelectDate(date)}
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
- <TimeContentWrapper>
430
- {timeList.map((time: any, i: number) => (
431
- <Pressable key={i} onPress={() => handleChangeTimeSelected(time.value)}>
432
- <TimeItem
433
- active={selectedTime === time.value}
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
- {cateringPreorder && (
437
- <>
438
- {selectedTime === time.value ? (
439
- <OIcon
440
- src={theme.images.general.option_checked}
441
- width={18}
442
- style={{ marginEnd: 24, bottom: 2 }}
443
- />
444
- ) : (
445
- <OIcon
446
- src={theme.images.general.option_normal}
447
- width={18}
448
- style={{ marginEnd: 24, bottom: 2 }}
449
- />
450
- )}
451
- </>
452
- )}
453
- <OText
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,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 notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes']
174
- const _requiredFields: any = []
175
-
176
- Object.values(validationFields?.fields?.checkout).map((field: any) => {
177
- if (field?.required && !notFields.includes(field.code)) {
178
- if (!user[field?.code]) {
179
- _requiredFields.push(field?.code)
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
- !user?.cellphone &&
186
- ((validationFields?.fields?.checkout?.cellphone?.enabled &&
187
- validationFields?.fields?.checkout?.cellphone?.required) ||
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 && (!requiredFields?.length || allowedGuest)) {
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 (validationFields && validationFields?.fields?.checkout) {
283
+ if (checkoutFieldsState?.loading || userLoading) return
284
+ if (user?.guest_id) {
285
+ checkGuestValidationFields()
286
+ } else {
259
287
  checkValidationFields()
260
288
  }
261
- }, [validationFields, user])
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
- <OButton
409
- text={t('CONTINUE_AS_GUEST', 'Continue as guest')}
410
- textStyle={{ color: theme.colors.black }}
411
- bgColor={theme.colors.white}
412
- borderColor={theme.colors.black}
413
- style={{ borderRadius: 7.6, marginTop: 20 }}
414
- onClick={() => setAllowedGuest(true)}
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; }, nextProps: { 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
- NotFound,
9
- NotFoundImage
8
+ NotFound,
9
+ NotFoundImage
10
10
  } from './styles'
11
11
 
12
12
  export const NotFoundSource = (props: NotFoundSourceParams) => {
13
- const {
14
- hideImage,
15
- content,
16
- btnTitle,
17
- btnStyle,
18
- conditioned,
19
- onClickButton
20
- } = props
13
+ const {
14
+ hideImage,
15
+ content,
16
+ btnTitle,
17
+ btnStyle,
18
+ conditioned,
19
+ onClickButton,
20
+ simple
21
+ } = props
21
22
 
22
- const theme = useTheme();
23
+ const theme = useTheme();
23
24
 
24
- return (
25
- <NotFound>
26
- {!hideImage && (
27
- <NotFoundImage>
28
- <Foundation
29
- name='page-search'
30
- color={theme.colors.primary}
31
- size={60}
32
- style={{ marginBottom: 10 }}
33
- />
34
- </NotFoundImage>
35
- )}
36
- {content && conditioned && <OText color={theme.colors.disabled} size={16} style={{ textAlign: 'center' }}>{content}</OText>}
37
- {content && !conditioned && <OText color={theme.colors.disabled} size={16} style={{ textAlign: 'center' }}>{content}</OText>}
38
- {!onClickButton && props.children && (
39
- props.children
40
- )}
41
- {onClickButton && (
42
- <View style={{ marginTop: 10, width: '100%' }}>
43
- <OButton
44
- style={{ width: '100%', height: 50, ...btnStyle }}
45
- onClick={() => onClickButton()}
46
- text={btnTitle}
47
- />
48
- </View>
49
- )}
50
- </NotFound>
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
- display: flex;
5
- flex-direction: column;
6
- justify-content: center;
7
- align-items: center;
8
- width: 100%;
9
- height: auto;
10
- margin: 10px auto;
11
- padding: 10px;
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 === 1 && order?.eta_drive_time) {
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(() => {