ordering-ui-react-native 0.22.55 → 0.22.56-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 (141) 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/index.tsx +22 -17
  19. package/themes/business/src/components/NewOrderNotification/index.tsx +25 -14
  20. package/themes/business/src/components/OrderDetails/Business.tsx +56 -20
  21. package/themes/business/src/components/OrderDetails/Delivery.tsx +134 -53
  22. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +155 -45
  23. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +51 -28
  24. package/themes/business/src/components/OrderDetails/styles.tsx +39 -3
  25. package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +17 -16
  26. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +3 -2
  27. package/themes/business/src/components/OrderSummary/index.tsx +271 -176
  28. package/themes/business/src/components/OrdersListManager/index.tsx +13 -1
  29. package/themes/business/src/components/OrdersOption/index.tsx +345 -231
  30. package/themes/business/src/components/OrdersOption/styles.tsx +14 -0
  31. package/themes/business/src/components/PreviousMessages/index.tsx +26 -3
  32. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +30 -18
  33. package/themes/business/src/components/PreviousOrders/index.tsx +74 -66
  34. package/themes/business/src/components/PreviousOrders/styles.tsx +2 -1
  35. package/themes/business/src/components/PrinterEdition/MessageAlert.tsx +33 -0
  36. package/themes/business/src/components/PrinterEdition/index.tsx +143 -75
  37. package/themes/business/src/components/PrinterEdition/printerList.tsx +23 -0
  38. package/themes/business/src/components/PrinterSettings/index.tsx +1 -1
  39. package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
  40. package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
  41. package/themes/business/src/components/StoresList/index.tsx +2 -2
  42. package/themes/business/src/components/UserProfileForm/index.tsx +48 -10
  43. package/themes/business/src/components/UserProfileForm/styles.tsx +7 -0
  44. package/themes/business/src/components/WebsocketStatus/index.tsx +2 -2
  45. package/themes/business/src/config/currency.tsx +1010 -0
  46. package/themes/business/src/hooks/useLocation.tsx +16 -12
  47. package/themes/business/src/layouts/SafeAreaContainer.tsx +35 -19
  48. package/themes/business/src/types/index.tsx +22 -7
  49. package/themes/business/src/utils/index.tsx +28 -3
  50. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  51. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  52. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  53. package/themes/kiosk/src/components/Checkout/index.tsx +9 -5
  54. package/themes/kiosk/src/components/CustomerName/index.tsx +1 -1
  55. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  56. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  57. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  58. package/themes/kiosk/src/components/PaymentOptions/index.tsx +121 -57
  59. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  60. package/themes/original/index.tsx +223 -219
  61. package/themes/original/src/components/AddressForm/index.tsx +19 -8
  62. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  63. package/themes/original/src/components/BusinessBasicInformation/index.tsx +1 -1
  64. package/themes/original/src/components/BusinessController/index.tsx +4 -2
  65. package/themes/original/src/components/BusinessItemAccordion/index.tsx +10 -4
  66. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +103 -92
  67. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +7 -3
  68. package/themes/original/src/components/BusinessListingSearch/index.tsx +8 -13
  69. package/themes/original/src/components/BusinessPreorder/index.tsx +34 -15
  70. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +73 -70
  71. package/themes/original/src/components/BusinessProductsList/index.tsx +6 -7
  72. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  73. package/themes/original/src/components/BusinessProductsListing/index.tsx +10 -6
  74. package/themes/original/src/components/BusinessTypeFilter/index.tsx +9 -8
  75. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
  76. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  77. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  78. package/themes/original/src/components/Cart/index.tsx +48 -13
  79. package/themes/original/src/components/CartContent/index.tsx +2 -3
  80. package/themes/original/src/components/Checkout/index.tsx +104 -80
  81. package/themes/original/src/components/Favorite/index.tsx +1 -5
  82. package/themes/original/src/components/ForgotPasswordForm/index.tsx +1 -2
  83. package/themes/original/src/components/GoogleMap/index.tsx +39 -18
  84. package/themes/original/src/components/Help/functions.tsx +76 -0
  85. package/themes/original/src/components/Help/index.tsx +74 -29
  86. package/themes/original/src/components/Help/styles.tsx +4 -1
  87. package/themes/original/src/components/HelpOptions/index.tsx +44 -0
  88. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  89. package/themes/original/src/components/Home/index.tsx +35 -16
  90. package/themes/original/src/components/LoginForm/index.tsx +12 -5
  91. package/themes/original/src/components/MessageListing/index.tsx +1 -1
  92. package/themes/original/src/components/Messages/index.tsx +20 -13
  93. package/themes/original/src/components/MomentOption/TimeListItem.tsx +56 -0
  94. package/themes/original/src/components/MomentOption/index.tsx +72 -51
  95. package/themes/original/src/components/MomentSelector/index.tsx +5 -2
  96. package/themes/original/src/components/MultiCheckout/index.tsx +55 -26
  97. package/themes/original/src/components/MyOrders/index.tsx +2 -2
  98. package/themes/original/src/components/NavBar/index.tsx +6 -2
  99. package/themes/original/src/components/NotFoundSource/index.tsx +40 -39
  100. package/themes/original/src/components/NotFoundSource/styles.tsx +18 -9
  101. package/themes/original/src/components/OrderDetails/OrderEta.tsx +4 -3
  102. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +11 -4
  103. package/themes/original/src/components/OrderDetails/index.tsx +44 -19
  104. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  105. package/themes/original/src/components/OrderProgress/index.tsx +4 -3
  106. package/themes/original/src/components/OrderSummary/index.tsx +32 -11
  107. package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -3
  108. package/themes/original/src/components/OrdersOption/index.tsx +3 -6
  109. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  110. package/themes/original/src/components/PaymentOptions/index.tsx +462 -459
  111. package/themes/original/src/components/PhoneInputNumber/index.tsx +92 -7
  112. package/themes/original/src/components/ProductForm/ActionButton.tsx +6 -10
  113. package/themes/original/src/components/ProductItemAccordion/index.tsx +28 -37
  114. package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
  115. package/themes/original/src/components/ServiceForm/index.tsx +1 -1
  116. package/themes/original/src/components/SignupForm/index.tsx +41 -24
  117. package/themes/original/src/components/SingleOrderCard/index.tsx +7 -4
  118. package/themes/original/src/components/SingleProductCard/index.tsx +3 -4
  119. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  120. package/themes/original/src/components/StripeCardsList/index.tsx +9 -4
  121. package/themes/original/src/components/StripeElementsForm/index.tsx +2 -2
  122. package/themes/original/src/components/StripeElementsForm/naked.tsx +1 -1
  123. package/themes/original/src/components/TaxInformation/index.tsx +3 -2
  124. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +7 -2
  125. package/themes/original/src/components/UserDetails/index.tsx +17 -16
  126. package/themes/original/src/components/UserFormDetails/index.tsx +109 -67
  127. package/themes/original/src/components/UserProfile/index.tsx +9 -1
  128. package/themes/original/src/components/UserVerification/index.tsx +18 -5
  129. package/themes/original/src/components/shared/OAlert.tsx +2 -1
  130. package/themes/original/src/components/shared/OButton.tsx +2 -2
  131. package/themes/original/src/components/shared/OInput.tsx +4 -8
  132. package/themes/original/src/components/shared/OModal.tsx +7 -2
  133. package/themes/original/src/types/index.tsx +699 -689
  134. package/themes/original/src/utils/index.tsx +29 -0
  135. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  136. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +0 -62
  137. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +0 -12
  138. package/themes/original/src/components/HelpGuide/index.tsx +0 -68
  139. package/themes/original/src/components/HelpGuide/styles.tsx +0 -12
  140. package/themes/original/src/components/HelpOrder/index.tsx +0 -71
  141. 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 } 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,7 +332,28 @@ 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)])
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
- onDateSelected={(date) => onSelectDate(date)}
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
- <TimeContentWrapper>
427
- {timeList.map((time: any, i: number) => (
428
- <Pressable key={i} onPress={() => handleChangeTimeSelected(time.value)}>
429
- <TimeItem
430
- 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}
431
465
  cateringPreorder={cateringPreorder}
432
- >
433
- {cateringPreorder && (
434
- <>
435
- {selectedTime === time.value ? (
436
- <OIcon
437
- src={theme.images.general.option_checked}
438
- width={18}
439
- style={{ marginEnd: 24, bottom: 2 }}
440
- />
441
- ) : (
442
- <OIcon
443
- src={theme.images.general.option_normal}
444
- width={18}
445
- style={{ marginEnd: 24, bottom: 2 }}
446
- />
447
- )}
448
- </>
449
- )}
450
- <OText
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,8 +97,9 @@ 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'
@@ -121,6 +123,7 @@ const MultiCheckoutUI = (props: any) => {
121
123
 
122
124
  const creditPointGeneralPlan = loyaltyPlansState?.result?.find((loyal: any) => loyal.type === 'credit_point')
123
125
  const loyalBusinessAvailable = creditPointGeneralPlan?.businesses?.filter((b: any) => b.accumulates) ?? []
126
+ const checkoutFields = useMemo(() => checkoutFieldsState?.fields?.filter((field : any) => field.order_type_id === options?.type), [checkoutFieldsState, options])
124
127
 
125
128
  const accumulationRateBusiness = (businessId: number) => {
126
129
  const value = loyalBusinessAvailable?.find((loyal: any) => loyal.business_id === businessId)?.accumulation_rate ?? 0
@@ -169,35 +172,55 @@ const MultiCheckoutUI = (props: any) => {
169
172
 
170
173
  const checkValidationFields = () => {
171
174
  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)
175
+ const errors: Array<string> = []
176
+ const userSelected = user
177
+ const _requiredFields: Array<string> = []
178
+ Object.values(checkoutFieldsState?.fields).map((field: any) => {
179
+ if (options?.type === field?.order_type_id &&
180
+ field?.enabled &&
181
+ field?.required &&
182
+ !notFields.includes(field?.validation_field?.code)
183
+ ) {
184
+ if (userSelected && !userSelected[field?.validation_field?.code]) {
185
+ _requiredFields.push(field?.validation_field?.code)
180
186
  }
181
187
  }
182
188
  })
183
-
189
+ const mobilePhoneField: any = Object.values(checkoutFieldsState?.fields)?.find((field: any) => field?.order_type_id === options?.type && field?.validation_field?.code === 'mobile_phone')
184
190
  if (
185
- !user?.cellphone &&
186
- ((validationFields?.fields?.checkout?.cellphone?.enabled &&
187
- validationFields?.fields?.checkout?.cellphone?.required) ||
191
+ userSelected &&
192
+ !userSelected?.cellphone &&
193
+ ((mobilePhoneField?.enabled &&
194
+ mobilePhoneField?.required) ||
188
195
  configs?.verification_phone_required?.value === '1')
189
196
  ) {
190
197
  _requiredFields.push('cellphone')
191
198
  }
192
199
  setRequiredFields(_requiredFields)
193
200
 
194
- if (phoneUpdate) {
195
- errors.push(t('NECESSARY_UPDATE_COUNTRY_PHONE_CODE', 'It is necessary to update your phone number'))
196
- }
197
-
198
201
  setUserErrors(errors)
199
202
  }
200
203
 
204
+ const checkGuestValidationFields = () => {
205
+ const userSelected = user
206
+ const _requiredFields = checkoutFieldsState?.fields
207
+ .filter((field) => (field?.order_type_id === options?.type) && field?.enabled && field?.required_with_guest &&
208
+ !notFields.includes(field?.validation_field?.code) &&
209
+ userSelected && !userSelected[field?.validation_field?.code])
210
+ const requiredFieldsCode = _requiredFields.map((item) => item?.validation_field?.code)
211
+ const guestCheckoutCellPhone = checkoutFieldsState?.fields?.find((field) => field.order_type_id === options?.type && field?.validation_field?.code === 'mobile_phone')
212
+ if (
213
+ userSelected &&
214
+ !userSelected?.cellphone &&
215
+ ((guestCheckoutCellPhone?.enabled &&
216
+ guestCheckoutCellPhone?.required_with_guest) ||
217
+ configs?.verification_phone_required?.value === '1')
218
+ ) {
219
+ requiredFieldsCode.push('cellphone')
220
+ }
221
+ setRequiredFields(requiredFieldsCode)
222
+ }
223
+
201
224
  const togglePhoneUpdate = (val: boolean) => {
202
225
  setPhoneUpdate(val)
203
226
  }
@@ -208,7 +231,7 @@ const MultiCheckoutUI = (props: any) => {
208
231
  return
209
232
  }
210
233
 
211
- if (!userErrors.length && (!requiredFields?.length || allowedGuest)) {
234
+ if (!userErrors.length && !requiredFields?.length) {
212
235
  handleGroupPlaceOrder && handleGroupPlaceOrder(confirmPayment)
213
236
  return
214
237
  }
@@ -255,10 +278,13 @@ const MultiCheckoutUI = (props: any) => {
255
278
  }
256
279
 
257
280
  useEffect(() => {
258
- if (validationFields && validationFields?.fields?.checkout) {
281
+ if (checkoutFieldsState?.loading || userLoading) return
282
+ if (user?.guest_id) {
283
+ checkGuestValidationFields()
284
+ } else {
259
285
  checkValidationFields()
260
286
  }
261
- }, [validationFields, user])
287
+ }, [checkoutFieldsState, user, options?.type])
262
288
 
263
289
  useEffect(() => {
264
290
  if (cartsToShow?.length === 1) {
@@ -399,9 +425,6 @@ const MultiCheckoutUI = (props: any) => {
399
425
  />
400
426
  <OButton
401
427
  text={t('LOGIN', 'Login')}
402
- textStyle={{ color: theme.colors.primary }}
403
- bgColor={theme.colors.white}
404
- borderColor={theme.colors.primary}
405
428
  style={{ borderRadius: 7.6, marginTop: 20 }}
406
429
  onClick={() => setOpenModal({ ...openModal, login: true })}
407
430
  />
@@ -423,6 +446,9 @@ const MultiCheckoutUI = (props: any) => {
423
446
  isCheckout
424
447
  phoneUpdate={phoneUpdate}
425
448
  togglePhoneUpdate={togglePhoneUpdate}
449
+ isOrderTypeValidationField
450
+ requiredFields={requiredFields}
451
+ checkoutFields={checkoutFields}
426
452
  />
427
453
  )}
428
454
  </ChUserDetails>
@@ -659,9 +685,12 @@ const MultiCheckoutUI = (props: any) => {
659
685
  isEdit
660
686
  phoneUpdate={phoneUpdate}
661
687
  togglePhoneUpdate={togglePhoneUpdate}
662
- requiredFields={requiredFields}
663
688
  hideUpdateButton
664
689
  handlePlaceOrderAsGuest={handlePlaceOrderAsGuest}
690
+ isCheckoutPlace
691
+ isOrderTypeValidationField
692
+ requiredFields={requiredFields}
693
+ checkoutFields={checkoutFields}
665
694
  onClose={() => {
666
695
  setIsOpen(false)
667
696
  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(() => {
@@ -1,7 +1,7 @@
1
1
  import React from 'react'
2
2
  import { useTheme } from 'styled-components/native'
3
3
  import { ScrollView, StyleSheet, View } from 'react-native'
4
- import { useLanguage, useUtils } from 'ordering-components/native'
4
+ import { useLanguage, useUtils, useConfig } from 'ordering-components/native'
5
5
  import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'
6
6
  import { OText, OButton } from '../shared'
7
7
  import { formatSeconds } from '../../utils'
@@ -17,8 +17,12 @@ export const OrderHistory = (props: any) => {
17
17
 
18
18
  const [, t] = useLanguage()
19
19
  const [{ parseDate }] = useUtils()
20
+ const [{ configs }] = useConfig();
20
21
  const theme = useTheme()
21
22
 
23
+ const excludedMessages = ['manual_driver_assignment_comment', 'driver_group_id', 'manual_driver_assignment_author_id']
24
+ const changeIdToExternalId = configs?.change_order_id?.value === '1'
25
+
22
26
  const styles = StyleSheet.create({
23
27
  historyItem: {
24
28
  display: 'flex',
@@ -62,7 +66,10 @@ export const OrderHistory = (props: any) => {
62
66
  20: 'ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS',
63
67
  21: 'ORDER_CUSTOMER_ARRIVED_BUSINESS',
64
68
  22: 'ORDER_LOOKING_FOR_DRIVER',
65
- 23: 'ORDER_DRIVER_ON_WAY'
69
+ 23: 'ORDER_DRIVER_ON_WAY',
70
+ 24: 'ORDER_DRIVER_WAITING_FOR_ORDER',
71
+ 25: 'ORDER_ACCEPTED_BY_DRIVER_COMPANY',
72
+ 26: 'ORDER_DRIVER_ARRIVED_CUSTOMER'
66
73
  }
67
74
 
68
75
  const getLogisticTagStatus = (status: any) => {
@@ -90,7 +97,7 @@ export const OrderHistory = (props: any) => {
90
97
  return (
91
98
  <ScrollView contentContainerStyle={styles.container}>
92
99
  <OText size={20} style={{ alignSelf: 'center', textAlign: 'center' }} mBottom={10}>
93
- {t('DETAILS_OF_ORDER', 'Details of Order_NUMBER_').replace('_NUMBER_', ` # ${order?.id}`)}
100
+ {t('DETAILS_OF_ORDER', 'Details of Order_NUMBER_').replace('_NUMBER_', (changeIdToExternalId && order?.external_id) || `# ${order?.id}`)}
94
101
  </OText>
95
102
  {!messages?.loading && order && (
96
103
  <View style={styles.historyItem}>
@@ -118,7 +125,7 @@ export const OrderHistory = (props: any) => {
118
125
  </View>
119
126
  </View>
120
127
  )}
121
- {messages && messages?.messages.map((message: any, i: number) => message.type === 1 && (
128
+ {messages && messages?.messages.map((message: any, i: number) => (message.type === 1 && !excludedMessages.includes(message?.change?.attribute)) && (
122
129
  <View
123
130
  style={styles.historyItem}
124
131
  key={i}