ordering-ui-react-native 0.22.21 → 0.22.22-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 (164) hide show
  1. package/package.json +6 -7
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessesListing/index.tsx +1 -1
  4. package/src/components/Checkout/index.tsx +40 -39
  5. package/src/components/StripeMethodForm/index.tsx +4 -2
  6. package/src/components/VerifyPhone/styles.tsx +1 -2
  7. package/src/context/OfflineActions/index.tsx +236 -0
  8. package/src/types/index.tsx +2 -1
  9. package/themes/business/index.tsx +2 -0
  10. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +9 -6
  11. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +1 -0
  12. package/themes/business/src/components/BusinessController/index.tsx +8 -3
  13. package/themes/business/src/components/BusinessProductList/index.tsx +3 -2
  14. package/themes/business/src/components/Chat/index.tsx +15 -3
  15. package/themes/business/src/components/DriverMap/index.tsx +49 -26
  16. package/themes/business/src/components/FloatingButton/index.tsx +3 -2
  17. package/themes/business/src/components/GoogleMap/index.tsx +15 -8
  18. package/themes/business/src/components/LanguageSelector/index.tsx +2 -3
  19. package/themes/business/src/components/LanguageSelector/lang_country.json +515 -70
  20. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  21. package/themes/business/src/components/MapView/index.tsx +36 -17
  22. package/themes/business/src/components/NewOrderNotification/index.tsx +38 -19
  23. package/themes/business/src/components/OrderDetails/Business.tsx +47 -27
  24. package/themes/business/src/components/OrderDetails/Delivery.tsx +134 -53
  25. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +128 -41
  26. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +45 -18
  27. package/themes/business/src/components/OrderDetails/styles.tsx +39 -3
  28. package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +17 -16
  29. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +3 -2
  30. package/themes/business/src/components/OrderSummary/index.tsx +6 -4
  31. package/themes/business/src/components/OrdersListManager/index.tsx +13 -1
  32. package/themes/business/src/components/OrdersOption/index.tsx +217 -156
  33. package/themes/business/src/components/PhoneInputNumber/index.tsx +8 -5
  34. package/themes/business/src/components/PreviousMessages/index.tsx +26 -3
  35. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +39 -16
  36. package/themes/business/src/components/PreviousOrders/index.tsx +74 -66
  37. package/themes/business/src/components/PrinterEdition/MessageAlert.tsx +33 -0
  38. package/themes/business/src/components/PrinterEdition/index.tsx +431 -0
  39. package/themes/business/src/components/PrinterEdition/printerList.tsx +23 -0
  40. package/themes/business/src/components/PrinterEdition/styles.tsx +61 -0
  41. package/themes/business/src/components/PrinterSettings/index.tsx +162 -174
  42. package/themes/business/src/components/PrinterSettings/styles.tsx +14 -1
  43. package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
  44. package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
  45. package/themes/business/src/components/StoresList/index.tsx +2 -2
  46. package/themes/business/src/components/UserProfileForm/index.tsx +55 -22
  47. package/themes/business/src/components/UserProfileForm/styles.tsx +7 -0
  48. package/themes/business/src/components/WebsocketStatus/index.tsx +2 -2
  49. package/themes/business/src/components/shared/OTextarea.tsx +8 -9
  50. package/themes/business/src/config/currency.tsx +1010 -0
  51. package/themes/business/src/hooks/useLocation.tsx +16 -12
  52. package/themes/business/src/layouts/SafeAreaContainer.tsx +35 -19
  53. package/themes/business/src/types/index.tsx +16 -4
  54. package/themes/business/src/utils/index.tsx +33 -3
  55. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  56. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  57. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  58. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  59. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  60. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  61. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  62. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  63. package/themes/original/index.tsx +11 -0
  64. package/themes/original/src/components/AddressForm/index.tsx +32 -17
  65. package/themes/original/src/components/AddressList/index.tsx +8 -7
  66. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  67. package/themes/original/src/components/BusinessBasicInformation/index.tsx +5 -8
  68. package/themes/original/src/components/BusinessItemAccordion/index.tsx +13 -5
  69. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +103 -92
  70. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +8 -6
  71. package/themes/original/src/components/BusinessListingSearch/index.tsx +1 -2
  72. package/themes/original/src/components/BusinessPreorder/index.tsx +46 -28
  73. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +73 -70
  74. package/themes/original/src/components/BusinessProductsList/index.tsx +6 -7
  75. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  76. package/themes/original/src/components/BusinessProductsListing/index.tsx +10 -6
  77. package/themes/original/src/components/BusinessTypeFilter/index.tsx +9 -8
  78. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
  79. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  80. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  81. package/themes/original/src/components/Cart/index.tsx +46 -14
  82. package/themes/original/src/components/CartContent/index.tsx +2 -4
  83. package/themes/original/src/components/Checkout/index.tsx +127 -77
  84. package/themes/original/src/components/CitiesControl/index.tsx +0 -3
  85. package/themes/original/src/components/CouponControl/index.tsx +1 -3
  86. package/themes/original/src/components/DriverTips/index.tsx +1 -3
  87. package/themes/original/src/components/Favorite/index.tsx +1 -5
  88. package/themes/original/src/components/FavoriteList/index.tsx +0 -1
  89. package/themes/original/src/components/ForgotPasswordForm/index.tsx +5 -7
  90. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +15 -17
  91. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +3 -7
  92. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +24 -32
  93. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +7 -9
  94. package/themes/original/src/components/GiftCard/VerticalGiftCardOrdersLayout/index.tsx +11 -12
  95. package/themes/original/src/components/GoogleMap/index.tsx +39 -18
  96. package/themes/original/src/components/Help/index.tsx +2 -0
  97. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  98. package/themes/original/src/components/Home/index.tsx +3 -11
  99. package/themes/original/src/components/LoginForm/Otp/index.tsx +0 -3
  100. package/themes/original/src/components/LoginForm/index.tsx +12 -9
  101. package/themes/original/src/components/MessageListing/index.tsx +2 -1
  102. package/themes/original/src/components/Messages/index.tsx +27 -19
  103. package/themes/original/src/components/MomentOption/TimeListItem.tsx +56 -0
  104. package/themes/original/src/components/MomentOption/index.tsx +80 -51
  105. package/themes/original/src/components/MomentSelector/index.tsx +5 -2
  106. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +7 -3
  107. package/themes/original/src/components/MultiCheckout/index.tsx +55 -27
  108. package/themes/original/src/components/MultiOrdersDetails/index.tsx +1 -0
  109. package/themes/original/src/components/MyOrders/index.tsx +2 -2
  110. package/themes/original/src/components/NavBar/index.tsx +7 -4
  111. package/themes/original/src/components/NetworkError/index.tsx +0 -5
  112. package/themes/original/src/components/NotFoundSource/index.tsx +0 -3
  113. package/themes/original/src/components/OrderDetails/OrderEta.tsx +4 -3
  114. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +16 -11
  115. package/themes/original/src/components/OrderDetails/index.tsx +44 -21
  116. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  117. package/themes/original/src/components/OrderProgress/index.tsx +4 -3
  118. package/themes/original/src/components/OrderSummary/index.tsx +29 -10
  119. package/themes/original/src/components/OrderTypeSelector/index.tsx +7 -6
  120. package/themes/original/src/components/OrdersOption/index.tsx +3 -6
  121. package/themes/original/src/components/PaymentOptionStripe/index.tsx +0 -5
  122. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  123. package/themes/original/src/components/PaymentOptions/index.tsx +4 -3
  124. package/themes/original/src/components/PhoneInputNumber/index.tsx +92 -7
  125. package/themes/original/src/components/PlaceSpot/index.tsx +1 -3
  126. package/themes/original/src/components/PreviousOrders/index.tsx +1 -2
  127. package/themes/original/src/components/ProductForm/ActionButton.tsx +17 -20
  128. package/themes/original/src/components/ProductForm/index.tsx +107 -102
  129. package/themes/original/src/components/ProductItemAccordion/index.tsx +50 -43
  130. package/themes/original/src/components/ProductItemAccordion/styles.tsx +0 -3
  131. package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
  132. package/themes/original/src/components/ProfessionalProfile/index.tsx +4 -5
  133. package/themes/original/src/components/Promotions/index.tsx +6 -9
  134. package/themes/original/src/components/ReviewDriver/index.tsx +1 -1
  135. package/themes/original/src/components/ReviewOrder/index.tsx +2 -2
  136. package/themes/original/src/components/ReviewProducts/index.tsx +1 -1
  137. package/themes/original/src/components/ReviewTrigger/index.tsx +2 -2
  138. package/themes/original/src/components/ServiceForm/index.tsx +52 -54
  139. package/themes/original/src/components/Sessions/index.tsx +3 -3
  140. package/themes/original/src/components/SignupForm/index.tsx +102 -88
  141. package/themes/original/src/components/SingleOrderCard/index.tsx +6 -4
  142. package/themes/original/src/components/SingleProductCard/index.tsx +5 -5
  143. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  144. package/themes/original/src/components/StripeCardForm/index.tsx +0 -3
  145. package/themes/original/src/components/StripeCardsList/index.tsx +16 -3
  146. package/themes/original/src/components/StripeElementsForm/index.tsx +76 -62
  147. package/themes/original/src/components/StripeElementsForm/naked.tsx +48 -1
  148. package/themes/original/src/components/StripeRedirectForm/index.tsx +0 -3
  149. package/themes/original/src/components/TaxInformation/index.tsx +3 -2
  150. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +10 -7
  151. package/themes/original/src/components/UpsellingProducts/UpsellingLayout.tsx +8 -3
  152. package/themes/original/src/components/UserDetails/index.tsx +17 -16
  153. package/themes/original/src/components/UserFormDetails/index.tsx +164 -135
  154. package/themes/original/src/components/UserProfile/index.tsx +9 -1
  155. package/themes/original/src/components/UserVerification/index.tsx +15 -4
  156. package/themes/original/src/components/Wallets/index.tsx +6 -3
  157. package/themes/original/src/components/WebsocketStatus/index.tsx +1 -4
  158. package/themes/original/src/components/shared/OAlert.tsx +2 -1
  159. package/themes/original/src/components/shared/OButton.tsx +5 -4
  160. package/themes/original/src/components/shared/OInput.tsx +4 -8
  161. package/themes/original/src/components/shared/OModal.tsx +7 -2
  162. package/themes/original/src/types/index.tsx +10 -3
  163. package/themes/original/src/utils/index.tsx +30 -1
  164. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -230,7 +230,7 @@ export const BusinessListingSearchUI = (props: BusinessSearchParams) => {
230
230
  </BusinessInfoItem>
231
231
  <OButton
232
232
  onClick={() => onBusinessClick(business)}
233
- textStyle={{ color: theme.colors.primary, fontSize: 10 }}
233
+ textStyle={{ fontSize: 10 }}
234
234
  text={t('GO_TO_STORE', 'Go to store')}
235
235
  style={{
236
236
  borderRadius: 23,
@@ -238,7 +238,6 @@ export const BusinessListingSearchUI = (props: BusinessSearchParams) => {
238
238
  paddingRight: 10,
239
239
  height: 23,
240
240
  shadowOpacity: 0,
241
- backgroundColor: theme.colors.primaryContrast,
242
241
  borderWidth: 0
243
242
  }}
244
243
  />
@@ -11,6 +11,8 @@ import { BusinessMenuList } from '../BusinessMenuList'
11
11
  import Spinner from 'react-native-loading-spinner-overlay'
12
12
  import { BusinessPreorderParams } from '../../types'
13
13
  import moment from 'moment'
14
+ import { setLocalMoment } from '../../utils';
15
+
14
16
  import SelectDropdown from 'react-native-select-dropdown'
15
17
  import {
16
18
  PreOrderContainer,
@@ -41,7 +43,8 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
41
43
  getActualSchedule,
42
44
  isAsap,
43
45
  cateringPreorder,
44
- preorderLeadTime
46
+ preorderLeadTime,
47
+ preorderMaximumDays
45
48
  } = props
46
49
 
47
50
  const theme = useTheme()
@@ -261,14 +264,23 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
261
264
  if (cateringPreorder) {
262
265
  let _timeLists = []
263
266
  const schedule = business && getActualSchedule()
264
- if (!schedule && cateringPreorder && Object.keys(business)?.length > 0) {
267
+ if (!schedule && business) {
268
+ setTimeList([])
265
269
  return
266
270
  }
271
+
267
272
  _timeLists = hoursList
268
- .filter(hour => ((Object.keys(business || {})?.length === 0) || schedule?.lapses?.some((lapse: any) =>
269
- 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}`))) &&
270
- moment(dateSelected + ` ${hour.startTime}`) < moment(dateSelected + ` ${hour.endTime}`) &&
271
- (moment().add(preorderLeadTime, 'minutes') < moment(dateSelected + ` ${hour.startTime}`) || !cateringPreorder))
273
+ .filter(hour => {
274
+ return (Object.keys(business || {})?.length === 0 || schedule?.lapses?.some((lapse: any) => {
275
+ const openHour = lapse.open.hour < 10 ? `0${lapse.open.hour}` : lapse.open.hour
276
+ const openMinute = lapse.open.minute < 10 ? `0${lapse.open.minute}` : lapse.open.minute
277
+ const closeHour = lapse.close.hour < 10 ? `0${lapse.close.hour}` : lapse.close.hour
278
+ const closeMinute = lapse.close.minute < 10 ? `0${lapse.close.minute}` : lapse.close.minute
279
+ return moment(dateSelected + ` ${hour.startTime}`) >= moment(dateSelected + ` ${openHour}:${openMinute}`).add(preorderLeadTime, 'minutes') && moment(dateSelected + ` ${hour.endTime}`) <= moment(dateSelected + ` ${closeHour}:${closeMinute}`)
280
+ })) &&
281
+ (moment(dateSelected + ` ${hour.startTime}`) < moment(dateSelected + ` ${hour.endTime}`)) &&
282
+ (moment().add(preorderLeadTime, 'minutes') < moment(dateSelected + ` ${hour.startTime}`) || !cateringPreorder)
283
+ })
272
284
  .map(hour => {
273
285
  return {
274
286
  value: hour.startTime,
@@ -296,7 +308,7 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
296
308
  const _times = getTimes(selectDate, selectedMenu)
297
309
  setTimeList(_times)
298
310
  }
299
- }, [selectDate, menu, business, cateringPreorder, hoursList, dateSelected])
311
+ }, [selectDate, menu, JSON.stringify(datesWhitelist), JSON.stringify(business), cateringPreorder, JSON.stringify(hoursList), dateSelected])
300
312
 
301
313
  useEffect(() => {
302
314
  if (selectedPreorderType === 0 && Object.keys(menu).length > 0) setMenu({})
@@ -311,6 +323,10 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
311
323
  }
312
324
  }, [dateSelected])
313
325
 
326
+ useEffect(() => {
327
+ setLocalMoment(moment, t)
328
+ }, [])
329
+
314
330
  useFocusEffect(
315
331
  React.useCallback(() => {
316
332
  handleAsap && handleAsap()
@@ -438,21 +454,23 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
438
454
  style={styles.calendar}
439
455
  calendarHeaderContainerStyle={styles.calendarHeaderContainer}
440
456
  calendarHeaderStyle={styles.calendarHeader}
441
- dateNumberStyle={styles.dateNumber}
442
- dateNameStyle={styles.dateName}
443
457
  iconContainer={{ flex: 0.1 }}
444
- highlightDateNameStyle={styles.highlightDateName}
445
- highlightDateNumberStyle={styles.highlightDateNumber}
446
458
  dayContainerStyle={{ height: '100%' }}
447
459
  highlightDateContainerStyle={{ height: '100%' }}
448
460
  calendarHeaderFormat='MMMM, YYYY'
449
461
  iconStyle={{ borderWidth: 1 }}
450
462
  selectedDate={selectDate}
451
463
  datesWhitelist={datesWhitelist}
464
+ highlightDateNameStyle={styles.highlightDateName}
465
+ highlightDateNumberStyle={styles.highlightDateNumber}
466
+ minDate={moment()}
467
+ maxDate={cateringPreorder ? moment().add(preorderMaximumDays, 'days') : undefined}
452
468
  disabledDateNameStyle={styles.disabledDateName}
453
469
  disabledDateNumberStyle={styles.disabledDateNumber}
470
+ dateNumberStyle={styles.dateNumber}
471
+ dateNameStyle={styles.dateName}
454
472
  disabledDateOpacity={0.6}
455
- onDateSelected={(date) => onSelectDate(date)}
473
+ onDateSelected={(date: any) => onSelectDate(date)}
456
474
  leftSelector={<LeftSelector />}
457
475
  rightSelector={<RightSelector />}
458
476
  />
@@ -527,7 +545,6 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
527
545
  )}
528
546
  <OButton
529
547
  text={t('GO_TO_MENU', 'Go to menu')}
530
- textStyle={{ color: 'white' }}
531
548
  style={{ borderRadius: 7.6, marginBottom: 20, marginTop: 30 }}
532
549
  onClick={() => handleClickBusiness()}
533
550
  isDisabled={isAsap || !(dateSelected && timeSelected)}
@@ -553,21 +570,22 @@ export const BusinessPreorder = (props: any) => {
553
570
  currentDate.setMinutes(59)
554
571
 
555
572
  const cateringTypeString = orderState?.options?.type === 7
556
- ? 'catering_delivery'
557
- : orderState?.options?.type === 8
558
- ? 'catering_pickup'
559
- : null
573
+ ? 'catering_delivery'
574
+ : orderState?.options?.type === 8
575
+ ? 'catering_pickup'
576
+ : null
560
577
 
561
- const splitCateringValue = (configName : string) =>
562
- Object.values(props?.business?.configs || {})
563
- ?.find(config => config?.key === configName)
564
- ?.value?.split('|')
565
- ?.find(val => val.includes(cateringTypeString || ''))?.split(',')[1]
566
- const preorderSlotInterval = parseInt(splitCateringValue('preorder_slot_interval'))
567
- const preorderLeadTime = parseInt(splitCateringValue('preorder_lead_time'))
568
- const preorderTimeRange = parseInt(splitCateringValue('preorder_time_range'))
569
- const preorderMaximumDays = parseInt(splitCateringValue('preorder_maximum_days'))
570
- const preorderMinimumDays = parseInt(splitCateringValue('preorder_minimum_days'))
578
+ const splitCateringValue = (configName: string) =>
579
+ Object.values(props?.business?.configs || {})
580
+ ?.find((config : any) => config?.key === configName)
581
+ ?.value?.split('|')
582
+ ?.find((val : any) => val.includes(cateringTypeString || ''))?.split(',')[1]
583
+
584
+ const preorderSlotInterval = parseInt(splitCateringValue('preorder_slot_interval'))
585
+ const preorderLeadTime = parseInt(splitCateringValue('preorder_lead_time'))
586
+ const preorderTimeRange = parseInt(splitCateringValue('preorder_time_range'))
587
+ const preorderMaximumDays = parseInt(splitCateringValue('preorder_maximum_days'))
588
+ const preorderMinimumDays = parseInt(splitCateringValue('preorder_minimum_days'))
571
589
 
572
590
  const businessPreorderProps = {
573
591
  ...props,
@@ -581,4 +599,4 @@ const preorderMinimumDays = parseInt(splitCateringValue('preorder_minimum_days')
581
599
  cateringPreorder: !!cateringTypeString
582
600
  }
583
601
  return <MomentOption {...businessPreorderProps} />
584
- }
602
+ }
@@ -1,87 +1,90 @@
1
1
  import React from 'react'
2
- import { useTheme } from 'styled-components/native'
3
2
  import { StyleSheet } from 'react-native'
4
- import { SubCategoriesContainer, ContainerButton } from './styles'
5
- import { OButton } from '../../shared'
6
3
  import { useLanguage } from 'ordering-components/native'
4
+ import FIcon from 'react-native-vector-icons/Feather'
5
+ import { SubCategoriesContainer, ContainerButton } from './styles'
6
+ import { OButton, OText } from '../../shared'
7
7
 
8
8
  function SubcategoriesComponentPropsAreEqual(prev: any, next: any) {
9
- return prev.subcategoriesSelected === next.subcategoriesSelected &&
10
- prev.category === next.category
9
+ return prev.subcategoriesSelected === next.subcategoriesSelected &&
10
+ prev.category === next.category
11
11
  }
12
12
 
13
13
  interface SubcategoriesComponentParams {
14
- subcategoriesSelected?: any,
15
- category?: any,
16
- onClickSubcategory: any
14
+ subcategoriesSelected?: any,
15
+ category?: any,
16
+ onClickSubcategory: any
17
17
  }
18
18
 
19
- const SubcategoriesComponent = (props : SubcategoriesComponentParams) => {
20
- const {
21
- subcategoriesSelected,
22
- category,
23
- onClickSubcategory
24
- } = props
19
+ const SubcategoriesComponent = (props: SubcategoriesComponentParams) => {
20
+ const {
21
+ subcategoriesSelected,
22
+ category,
23
+ onClickSubcategory
24
+ } = props
25
25
 
26
- const theme = useTheme()
27
- const [, t] = useLanguage()
28
- const allsubcategorySelected = !subcategoriesSelected?.some((subcategory: any) => category?.id === subcategory?.parent_category_id)
26
+ const [, t] = useLanguage()
27
+ const allsubcategorySelected = !subcategoriesSelected?.some((subcategory: any) => category?.id === subcategory?.parent_category_id)
29
28
 
30
- const bpStyles = StyleSheet.create({
31
- catWrap: { flexDirection: 'row', alignItems: 'center', marginBottom: 19 },
32
- catIcon: {
33
- borderRadius: 7.6,
34
- shadowColor: '#000000',
35
- shadowOpacity: 0.1,
36
- shadowOffset: { width: 0, height: 0 },
37
- shadowRadius: 1,
38
- marginEnd: 13,
39
- },
40
- categoryButtonStyle: {
41
- borderWidth: 0,
42
- marginLeft: 5,
43
- marginRight: 5,
44
- marginBottom: 10,
45
- height: 35,
46
- paddingLeft: 3,
47
- paddingRight: 3,
48
- }
49
- });
29
+ const bpStyles = StyleSheet.create({
30
+ categoryButtonStyle: {
31
+ borderWidth: 0,
32
+ marginRight: 5,
33
+ borderRadius: 8,
34
+ marginBottom: 5,
35
+ height: 35,
36
+ padding: 0,
37
+ paddingLeft: 3,
38
+ paddingRight: 3,
39
+ }
40
+ });
50
41
 
51
42
 
52
- return (
53
- <SubCategoriesContainer>
54
- <ContainerButton
55
- isSelected={allsubcategorySelected}
56
- >
57
- <OButton
58
- onClick={() => onClickSubcategory(null, category)}
59
- bgColor={allsubcategorySelected ? theme.colors.primary : theme.colors.backgroundGray}
60
- text={`${t('ALL', 'All')} ${allsubcategorySelected ? 'X' : ''}`}
61
- style={bpStyles.categoryButtonStyle}
62
- textStyle={{ color: allsubcategorySelected ? theme.colors.white : theme.colors.textNormal, fontSize: 12 }}
63
- />
64
- </ContainerButton>
65
- {category?.subcategories?.map((subcategory: any) => {
66
- const isSubcategorySelected = subcategoriesSelected?.find((_subcategory: any) => _subcategory?.id === subcategory?.id)
67
- return (
68
- <ContainerButton
69
- key={subcategory?.id}
70
- isSelected={isSubcategorySelected}
71
- >
72
- <OButton
73
- onClick={() => onClickSubcategory(subcategory, category)}
74
- bgColor={isSubcategorySelected ? theme.colors.primary : theme.colors.backgroundGray}
75
- text={`${subcategory?.name} ${isSubcategorySelected ? 'X' : ''}`}
76
- style={bpStyles.categoryButtonStyle}
77
- textStyle={{ color: isSubcategorySelected ? theme.colors.white : theme.colors.textNormal, fontSize: 12 }}
78
- />
79
- </ContainerButton>
80
- )
81
- }
82
- )}
83
- </SubCategoriesContainer>
84
- )
43
+ return (
44
+ <SubCategoriesContainer>
45
+ <ContainerButton
46
+ isSelected={allsubcategorySelected}
47
+ >
48
+ <OButton
49
+ onClick={() => onClickSubcategory(null, category)}
50
+ text={
51
+ allsubcategorySelected
52
+ ? <OText color='#FFF'>
53
+ {t('ALL', 'All')}{' '}
54
+ <FIcon name='x-circle' size={16} />
55
+ </OText>
56
+ : t('ALL', 'All')
57
+ }
58
+ style={bpStyles.categoryButtonStyle}
59
+ textStyle={{ fontSize: 12 }}
60
+ />
61
+ </ContainerButton>
62
+ {category?.subcategories?.map((subcategory: any) => {
63
+ const isSubcategorySelected = subcategoriesSelected?.find((_subcategory: any) => _subcategory?.id === subcategory?.id)
64
+ return (
65
+ <ContainerButton
66
+ key={subcategory?.id}
67
+ isSelected={isSubcategorySelected}
68
+ >
69
+ <OButton
70
+ onClick={() => onClickSubcategory(subcategory, category)}
71
+ text={
72
+ isSubcategorySelected
73
+ ? <OText color='#FFF'>
74
+ {subcategory?.name}{' '}
75
+ <FIcon name='x-circle' size={16} />
76
+ </OText>
77
+ : subcategory?.name
78
+ }
79
+ style={bpStyles.categoryButtonStyle}
80
+ textStyle={{ fontSize: 12 }}
81
+ />
82
+ </ContainerButton>
83
+ )
84
+ }
85
+ )}
86
+ </SubCategoriesContainer>
87
+ )
85
88
  }
86
89
 
87
90
  export const SubcategoriesComponentMemoized = React.memo(SubcategoriesComponent, SubcategoriesComponentPropsAreEqual)
@@ -65,11 +65,10 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
65
65
  return
66
66
  }
67
67
  const categoryFounded = subcategoriesSelected.find((_subcategory: any) => subCategory?.id === _subcategory?.id)
68
- if (categoryFounded) {
69
- setSubcategoriesSelected?.(subcategoriesSelected.filter((_subcategory: any) => subCategory?.id !== _subcategory?.id))
70
- } else {
71
- setSubcategoriesSelected?.([...subcategoriesSelected, subCategory])
72
- }
68
+ setSubcategoriesSelected?.(categoryFounded
69
+ ? subcategoriesSelected.filter((_subcategory: any) => subCategory?.id !== _subcategory?.id)
70
+ : [...subcategoriesSelected, subCategory]
71
+ )
73
72
  }
74
73
 
75
74
  return (
@@ -214,11 +213,11 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
214
213
  text={t('VIEW_MORE', 'View more')}
215
214
  parentStyle={{ padding: 0 }}
216
215
  onClick={() => setOpenDescription(category)}
217
- bgColor='transparent'
216
+ bgColor={theme.colors.white}
217
+ borderColor={theme.colors.primary}
218
218
  textStyle={{
219
219
  fontSize: 12,
220
220
  borderBottomWidth: 1,
221
- borderBottomColor: theme.colors.primary,
222
221
  color: theme.colors.primary
223
222
  }}
224
223
  />
@@ -18,15 +18,12 @@ export const RibbonBox = styled.View`
18
18
  background-color: ${(props: any) => props.theme.colors.primary};
19
19
  padding: 2px 8px;
20
20
  max-width: 180px;
21
-
22
21
  ${(props: any) => props.bgColor && css`
23
22
  background-color: ${props.bgColor};
24
23
  `}
25
-
26
24
  ${(props: any) => props.isRoundRect && css`
27
25
  border-radius: 7.6px;
28
26
  `}
29
-
30
27
  ${(props: any) => props.isCapsule && css`
31
28
  border-radius: 50px;
32
29
  `}
@@ -1,5 +1,5 @@
1
1
  import React, { useCallback, useEffect, useRef, useState } from 'react'
2
- import { View, TouchableOpacity, StyleSheet, SafeAreaView, Dimensions, Platform, KeyboardAvoidingViewBase, KeyboardAvoidingView, Keyboard, KeyboardEvent, BackHandler, ScrollView } from 'react-native'
2
+ import { View, TouchableOpacity, StyleSheet, SafeAreaView, Dimensions, Platform, KeyboardAvoidingViewBase, KeyboardAvoidingView, Keyboard, KeyboardEvent, BackHandler, ScrollView, Vibration } from 'react-native'
3
3
  import { IOScrollView } from 'react-native-intersection-observer'
4
4
  import { useSafeAreaInsets } from 'react-native-safe-area-context'
5
5
  import { useTheme } from 'styled-components/native';
@@ -225,8 +225,9 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
225
225
  cartUuid: cart?.uuid,
226
226
  businessLogo: cart?.business?.logo,
227
227
  businessName: cart?.business?.name,
228
- cartTotal: cart?.total
229
- }, true)
228
+ cartTotal: cart?.total,
229
+ fromProductsList: true
230
+ })
230
231
  } else {
231
232
  const groupKeys: any = {}
232
233
  cartsAvailable.forEach((_cart: any) => {
@@ -242,12 +243,12 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
242
243
  props.onNavigationRedirect('CheckoutNavigator', {
243
244
  screen: 'MultiCheckout',
244
245
  checkCarts: true
245
- }, true)
246
+ })
246
247
  } else {
247
248
  props.onNavigationRedirect('CheckoutNavigator', {
248
249
  screen: 'MultiCheckout',
249
250
  cartUuid: cartsAvailable[0]?.group?.uuid
250
- }, true)
251
+ })
251
252
  }
252
253
  }
253
254
  }
@@ -687,7 +688,10 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
687
688
  btnLeftValue={currentCart?.products.reduce((prev: number, product: any) => prev + product.quantity, 0)}
688
689
  btnRightValue={parsePrice(currentCart?.total)}
689
690
  disabled={subtotalWithTaxes < currentCart?.minimum || openUpselling}
690
- handleClick={() => setOpenUpselling(true)}
691
+ handleClick={() => {
692
+ Vibration.vibrate(100)
693
+ setOpenUpselling(true)
694
+ }}
691
695
  />
692
696
  </View>
693
697
  )}
@@ -26,9 +26,9 @@ import { BusinessTypeFilterParams } from '../../types';
26
26
  const windowWidth = Dimensions.get('window').width;
27
27
 
28
28
  export const BusinessTypeFilterUI = (props: BusinessTypeFilterParams) => {
29
- const {
30
- typesState,
31
- currentTypeSelected,
29
+ const {
30
+ typesState,
31
+ currentTypeSelected,
32
32
  handleChangeBusinessType,
33
33
  setBusinessTypes,
34
34
  isAppoint
@@ -38,13 +38,13 @@ export const BusinessTypeFilterUI = (props: BusinessTypeFilterParams) => {
38
38
 
39
39
  const theme = useTheme();
40
40
  const [isOpenAllCategories, setIsOpenAllCategories] = useState(false)
41
- const defaultImage = (name : string) => theme.images?.categories?.[name.toLowerCase().replace(' ', '')]
41
+ const defaultImage = (name: string) => theme.images?.categories?.[name.toLowerCase().replace(' ', '')]
42
42
 
43
43
  useEffect(() => {
44
- if(typesState?.types?.length > 0){
45
- setBusinessTypes && setBusinessTypes(typesState?.types)
44
+ if (typesState?.types?.length > 0) {
45
+ setBusinessTypes && setBusinessTypes(typesState?.types)
46
46
  }
47
- }, [typesState])
47
+ }, [typesState])
48
48
 
49
49
  const handleChangeServiceType = (serviceId: any) => {
50
50
  if (serviceId === currentTypeSelected) {
@@ -119,10 +119,11 @@ export const BusinessTypeFilterUI = (props: BusinessTypeFilterParams) => {
119
119
  <OButton
120
120
  key={i}
121
121
  bgColor={(currentTypeSelected === businessType?.id) ? theme.colors.primary : theme.colors.backgroundGray200}
122
+ borderColor={(currentTypeSelected === businessType?.id) ? theme.colors.primary : theme.colors.backgroundGray200}
122
123
  onClick={() => handleChangeServiceType(businessType?.id)}
123
124
  text={`${businessType?.name} ${(currentTypeSelected === businessType?.id) ? ' X' : ''}`}
124
125
  style={styles.businessType}
125
- textStyle={{ fontSize: 10, color: (currentTypeSelected === businessType?.id) ? theme.colors.backgroundLight : theme.colors.textNormal }}
126
+ textStyle={{ fontSize: 10, color: (currentTypeSelected === businessType?.id) ? theme.colors.white : theme.colors.textNormal }}
126
127
  />
127
128
  ))}
128
129
  </ServiceWrapper>
@@ -392,10 +392,11 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
392
392
  <OButton
393
393
  key={i}
394
394
  bgColor={(priceLevelSelected === price?.level) ? theme.colors.primary : theme.colors.backgroundGray200}
395
+ borderColor={(priceLevelSelected === price?.level) ? theme.colors.primary : theme.colors.backgroundGray200}
395
396
  onClick={() => handleChangePriceLevel(price?.level)}
396
397
  text={`${price.content} ${(priceLevelSelected === price?.level) ? ' X' : ''}`}
397
398
  style={styles.priceLevel}
398
- textStyle={{ fontSize: 10, color: (priceLevelSelected === price?.level) ? theme.colors.backgroundLight : theme.colors.textNormal }}
399
+ textStyle={{ fontSize: 10, color: (priceLevelSelected === price?.level) ? theme.colors.backgroundLight : theme.colors.black }}
399
400
  />
400
401
  ))}
401
402
  </ScrollView>
@@ -60,7 +60,7 @@ export const WrapMomentOption = styled.TouchableOpacity`
60
60
 
61
61
  export const HeaderWrapper = styled.ImageBackground`
62
62
  width: 100%;
63
- height: ${({ bgHeaderHeight } : any) => bgHeaderHeight || '270px'};
63
+ height: 270px;
64
64
  padding: 20px;
65
65
  background-color: transparent;
66
66
  `;
@@ -1,4 +1,3 @@
1
-
2
1
  import React, { useState, useEffect } from 'react'
3
2
  import { useOrder, useSession, useLanguage, useConfig } from 'ordering-components/native';
4
3
 
@@ -19,7 +19,7 @@ import { CouponControl } from '../CouponControl';
19
19
  import { OButton, OInput, OModal, OText } from '../shared';
20
20
  import { UpsellingProducts } from '../UpsellingProducts';
21
21
  import { verifyDecimals } from '../../utils';
22
- import { ActivityIndicator, TouchableOpacity, View } from 'react-native';
22
+ import { ActivityIndicator, TouchableOpacity, View, Vibration } from 'react-native';
23
23
  import AntIcon from 'react-native-vector-icons/AntDesign'
24
24
  import { TaxInformation } from '../TaxInformation';
25
25
  import { CartStoresListing } from '../CartStoresListing';
@@ -114,6 +114,7 @@ const CartUI = (props: any) => {
114
114
  }
115
115
 
116
116
  const handleUpsellingPage = (individualCart: any) => {
117
+ Vibration.vibrate(100)
117
118
  const isProductCartParam = !!individualCart?.products?.length
118
119
  setOpenUpselling(false)
119
120
  setCanOpenUpselling(false)
@@ -128,8 +129,9 @@ const CartUI = (props: any) => {
128
129
  cartUuid: cart?.uuid,
129
130
  businessLogo: cart?.business?.logo,
130
131
  businessName: cart?.business?.name,
131
- cartTotal: cart?.total
132
- }, true)
132
+ cartTotal: cart?.total,
133
+ fromProductsList: isFromUpselling
134
+ })
133
135
  } else {
134
136
  const groupKeys: any = {}
135
137
  cartsAvailable.forEach((_cart: any) => {
@@ -145,28 +147,30 @@ const CartUI = (props: any) => {
145
147
  onNavigationRedirect('CheckoutNavigator', {
146
148
  screen: 'MultiCheckout',
147
149
  checkCarts: true
148
- }, true)
150
+ })
149
151
  } else {
150
152
  onNavigationRedirect('CheckoutNavigator', {
151
153
  screen: 'MultiCheckout',
152
154
  cartUuid: cartsAvailable[0]?.group?.uuid
153
- }, true)
155
+ })
154
156
  }
155
157
  }
156
158
  }
157
159
 
158
- const getIncludedTaxes = () => {
160
+ const getIncludedTaxes = (isDeliveryFee?: boolean) => {
159
161
  if (cart?.taxes === null || !cart?.taxes) {
160
- return cart.business.tax_type === 1 ? cart?.tax : 0
162
+ return cart?.business.tax_type === 1 ? cart?.tax : 0
161
163
  } else {
162
164
  return cart?.taxes.reduce((taxIncluded: number, tax: any) => {
163
- return taxIncluded + (tax.type === 1 ? tax.summary?.tax : 0)
165
+ return taxIncluded +
166
+ (((!isDeliveryFee && tax.type === 1 && tax.target === 'product') ||
167
+ (isDeliveryFee && tax.type === 1 && tax.target === 'delivery_fee')) ? tax.summary?.tax : 0)
164
168
  }, 0)
165
169
  }
166
170
  }
167
171
 
168
172
  const getIncludedTaxesDiscounts = () => {
169
- return cart?.taxes?.filter((tax: any) => tax?.type === 1)?.reduce((carry: number, tax: any) => carry + (tax?.summary?.tax_after_discount ?? tax?.summary?.tax), 0)
173
+ return cart?.taxes?.filter((tax: any) => (tax?.type === 1 && tax?.target === 'product'))?.reduce((carry: number, tax: any) => carry + (tax?.summary?.tax_after_discount ?? tax?.summary?.tax), 0)
170
174
  }
171
175
 
172
176
  const OfferAlert = ({ offerId }: any) => {
@@ -197,6 +201,7 @@ const CartUI = (props: any) => {
197
201
  }, cart?.subtotal)
198
202
 
199
203
  const handleClickCheckout = () => {
204
+ Vibration.vibrate(100)
200
205
  if (cart?.business_id) {
201
206
  setOpenUpselling(true)
202
207
  } else {
@@ -243,7 +248,10 @@ const CartUI = (props: any) => {
243
248
  handleClearProducts={handleClearProducts}
244
249
  handleCartOpen={handleCartOpen}
245
250
  onNavigationRedirect={props.onNavigationRedirect}
246
- handleChangeStore={() => setOpenChangeStore(true)}
251
+ handleChangeStore={() => {
252
+ Vibration.vibrate(100)
253
+ setOpenChangeStore(true)
254
+ }}
247
255
  handleClickCheckout={() => handleClickCheckout()}
248
256
  checkoutButtonDisabled={(openUpselling && !canOpenUpselling) || subtotalWithTaxes < cart?.minimum || !cart?.valid_address}
249
257
  isMultiCheckout={isMultiCheckout}
@@ -324,7 +332,7 @@ const CartUI = (props: any) => {
324
332
  </OSTable>
325
333
  )}
326
334
  {
327
- cart.taxes?.length > 0 && cart.taxes.filter((tax: any) => tax.type === 2 && tax?.rate !== 0).map((tax: any, i: number) => (
335
+ cart.taxes?.length > 0 && cart.taxes.filter((tax: any) => tax.type === 2 && tax?.rate !== 0 && tax?.target === 'product').map((tax: any, i: number) => (
328
336
  <OSTable key={`${tax.id}_${i}`}>
329
337
  <OSRow>
330
338
  <OText size={12} lineHeight={18} numberOfLines={1} >
@@ -379,9 +387,25 @@ const CartUI = (props: any) => {
379
387
  {orderState?.options?.type === 1 && cart?.delivery_price_with_discount > 0 && !hideDeliveryFee && (
380
388
  <OSTable>
381
389
  <OText size={12} lineHeight={18}>{t('DELIVERY_FEE', 'Delivery Fee')}</OText>
382
- <OText size={12} lineHeight={18}>{parsePrice(cart?.delivery_price_with_discount)}</OText>
390
+ <OText size={12} lineHeight={18}>{parsePrice(cart?.delivery_price_with_discount + getIncludedTaxes(true))}</OText>
383
391
  </OSTable>
384
392
  )}
393
+ {
394
+ cart?.taxes?.length > 0 && cart?.taxes?.filter((tax: any) => tax?.type === 2 && tax?.rate !== 0 && tax?.target === 'delivery_fee').map((tax: any, i: number) => (
395
+ <OSTable key={`${tax.description}_${i}`}>
396
+ <OSRow>
397
+ <OText size={12} lineHeight={18} numberOfLines={1}>
398
+ {tax.name || t('INHERIT_FROM_BUSINESS', 'Inherit from business')}
399
+ {`(${verifyDecimals(tax?.rate, parseNumber)}%)`}
400
+ </OText>
401
+ <TouchableOpacity onPress={() => setOpenTaxModal({ open: true, data: tax, type: 'tax' })}>
402
+ <AntIcon name='infocirlceo' size={16} color={theme.colors.primary} />
403
+ </TouchableOpacity>
404
+ </OSRow>
405
+ <OText size={12} lineHeight={18}>{parsePrice(tax?.summary?.tax_after_discount ?? tax?.summary?.tax ?? 0)}</OText>
406
+ </OSTable>
407
+ ))
408
+ }
385
409
  {
386
410
  cart?.offers?.length > 0 && cart?.offers?.filter((offer: any) => offer?.target === 2)?.map((offer: any, i: number) => (
387
411
  <OSTable key={`${offer.id}_${i}`}>
@@ -544,6 +568,14 @@ const CartUI = (props: any) => {
544
568
  />
545
569
  </View>
546
570
  )}
571
+ {!cart?.valid_address && cart?.status !== 2 && (
572
+ <OText
573
+ color={theme.colors.error}
574
+ size={12}
575
+ >
576
+ {t('INVALID_CART_ADDRESS', 'Selected address is invalid, please select a closer address.')}
577
+ </OText>
578
+ )}
547
579
  {(!isMultiCheckout || !cart?.business_id) && (
548
580
  <>
549
581
  {cart?.valid_products ? (
@@ -557,10 +589,10 @@ const CartUI = (props: any) => {
557
589
  `${t('MINIMUN_SUBTOTAL_ORDER', 'Minimum subtotal order:')} ${parsePrice(cart?.minimum)}`
558
590
  )}
559
591
  bgColor={(subtotalWithTaxes < cart?.minimum || !cart?.valid_address) ? theme.colors.secundary : theme.colors.primary}
592
+ borderColor={(subtotalWithTaxes < cart?.minimum || !cart?.valid_address) ? theme.colors.secundary : theme.colors.primary}
560
593
  isDisabled={(openUpselling && !canOpenUpselling) || subtotalWithTaxes < cart?.minimum || !cart?.valid_address}
561
- borderColor={theme.colors.primary}
562
594
  imgRightSrc={null}
563
- textStyle={{ color: '#fff', textAlign: 'center', flex: 1 }}
595
+ textStyle={{ textAlign: 'center', flex: 1 }}
564
596
  onClick={() => handleClickCheckout()}
565
597
  style={{ width: '100%', flexDirection: 'row', justifyContent: 'center', borderRadius: 7.6, shadowOpacity: 0 }}
566
598
  />