ordering-ui-react-native 0.22.64 → 0.22.65-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 (143) 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 +5 -3
  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 +38 -53
  21. package/themes/business/src/components/OrderDetails/Business.tsx +56 -20
  22. package/themes/business/src/components/OrderDetails/Delivery.tsx +123 -54
  23. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +146 -36
  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 +33 -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 +922 -888
  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 +30 -17
  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 +50 -14
  80. package/themes/original/src/components/CartContent/index.tsx +2 -3
  81. package/themes/original/src/components/Checkout/index.tsx +125 -97
  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/GPSButton/index.tsx +2 -1
  85. package/themes/original/src/components/GoogleMap/index.tsx +5 -4
  86. package/themes/original/src/components/Help/functions.tsx +76 -0
  87. package/themes/original/src/components/Help/index.tsx +74 -29
  88. package/themes/original/src/components/Help/styles.tsx +4 -1
  89. package/themes/original/src/components/HelpOptions/index.tsx +53 -0
  90. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  91. package/themes/original/src/components/Home/index.tsx +37 -12
  92. package/themes/original/src/components/LoginForm/index.tsx +11 -5
  93. package/themes/original/src/components/MessageListing/index.tsx +1 -1
  94. package/themes/original/src/components/Messages/index.tsx +20 -13
  95. package/themes/original/src/components/MomentOption/TimeListItem.tsx +56 -0
  96. package/themes/original/src/components/MomentOption/index.tsx +67 -49
  97. package/themes/original/src/components/MomentSelector/index.tsx +5 -2
  98. package/themes/original/src/components/MultiCheckout/index.tsx +78 -36
  99. package/themes/original/src/components/MyOrders/index.tsx +2 -2
  100. package/themes/original/src/components/NavBar/index.tsx +6 -2
  101. package/themes/original/src/components/NotFoundSource/index.tsx +40 -39
  102. package/themes/original/src/components/NotFoundSource/styles.tsx +18 -9
  103. package/themes/original/src/components/OrderDetails/OrderEta.tsx +4 -3
  104. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +11 -4
  105. package/themes/original/src/components/OrderDetails/index.tsx +43 -19
  106. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  107. package/themes/original/src/components/OrderProgress/index.tsx +4 -3
  108. package/themes/original/src/components/OrderSummary/index.tsx +32 -11
  109. package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -3
  110. package/themes/original/src/components/OrdersOption/index.tsx +3 -6
  111. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  112. package/themes/original/src/components/PaymentOptions/index.tsx +471 -459
  113. package/themes/original/src/components/PhoneInputNumber/index.tsx +92 -7
  114. package/themes/original/src/components/ProductForm/ActionButton.tsx +6 -10
  115. package/themes/original/src/components/ProductItemAccordion/index.tsx +28 -37
  116. package/themes/original/src/components/ProductOptionSubOption/index.tsx +15 -14
  117. package/themes/original/src/components/ServiceForm/index.tsx +1 -1
  118. package/themes/original/src/components/SignupForm/index.tsx +40 -24
  119. package/themes/original/src/components/SingleOrderCard/index.tsx +7 -4
  120. package/themes/original/src/components/SingleProductCard/index.tsx +3 -4
  121. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  122. package/themes/original/src/components/StripeCardsList/index.tsx +9 -4
  123. package/themes/original/src/components/StripeElementsForm/index.tsx +2 -2
  124. package/themes/original/src/components/StripeElementsForm/naked.tsx +1 -1
  125. package/themes/original/src/components/TaxInformation/index.tsx +3 -2
  126. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +7 -2
  127. package/themes/original/src/components/UserDetails/index.tsx +17 -16
  128. package/themes/original/src/components/UserFormDetails/index.tsx +109 -67
  129. package/themes/original/src/components/UserProfile/index.tsx +9 -1
  130. package/themes/original/src/components/UserVerification/index.tsx +18 -5
  131. package/themes/original/src/components/shared/OAlert.tsx +2 -1
  132. package/themes/original/src/components/shared/OButton.tsx +2 -2
  133. package/themes/original/src/components/shared/OInput.tsx +4 -8
  134. package/themes/original/src/components/shared/OModal.tsx +7 -2
  135. package/themes/original/src/types/index.tsx +700 -692
  136. package/themes/original/src/utils/index.tsx +29 -0
  137. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  138. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +0 -62
  139. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +0 -12
  140. package/themes/original/src/components/HelpGuide/index.tsx +0 -68
  141. package/themes/original/src/components/HelpGuide/styles.tsx +0 -12
  142. package/themes/original/src/components/HelpOrder/index.tsx +0 -71
  143. package/themes/original/src/components/HelpOrder/styles.tsx +0 -13
@@ -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, 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,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 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)
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
- !user?.cellphone &&
186
- ((validationFields?.fields?.checkout?.cellphone?.enabled &&
187
- validationFields?.fields?.checkout?.cellphone?.required) ||
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 && (!requiredFields?.length || allowedGuest)) {
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 (validationFields && validationFields?.fields?.checkout) {
284
+ if (checkoutFieldsState?.loading || userLoading) return
285
+ if (user?.guest_id) {
286
+ checkGuestValidationFields()
287
+ } else {
259
288
  checkValidationFields()
260
289
  }
261
- }, [validationFields, user])
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
- <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
- />
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()
@@ -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(() => {