ordering-ui-react-native 0.14.37 → 0.14.38-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 (58) hide show
  1. package/package.json +2 -2
  2. package/src/components/BusinessItemAccordion/index.tsx +2 -2
  3. package/src/components/BusinessProductsListing/index.tsx +10 -26
  4. package/src/components/Cart/index.tsx +136 -62
  5. package/src/components/Cart/styles.tsx +7 -0
  6. package/src/components/Checkout/index.tsx +32 -168
  7. package/src/components/OrderDetails/index.tsx +102 -34
  8. package/src/components/OrderDetails/styles.tsx +7 -0
  9. package/src/components/OrderSummary/index.tsx +142 -58
  10. package/src/components/OrderSummary/styles.tsx +10 -2
  11. package/src/components/PaymentOptions/index.tsx +3 -1
  12. package/src/components/PaymentOptionsWebView/index.tsx +150 -0
  13. package/src/components/ProductForm/index.tsx +6 -8
  14. package/src/components/SingleProductCard/index.tsx +1 -1
  15. package/src/components/StripeElementsForm/index.tsx +28 -13
  16. package/src/components/TaxInformation/index.tsx +58 -26
  17. package/src/components/UpsellingProducts/index.tsx +13 -31
  18. package/src/components/VerifyPhone/styles.tsx +1 -2
  19. package/src/components/shared/OIcon.tsx +4 -1
  20. package/src/index.tsx +2 -0
  21. package/src/navigators/HomeNavigator.tsx +6 -0
  22. package/src/pages/ProductDetails.tsx +55 -0
  23. package/src/types/index.tsx +2 -0
  24. package/src/types/react-native-color-matrix-image-filters/index.d.ts +1 -0
  25. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  26. package/themes/kiosk/src/components/Cart/index.tsx +14 -21
  27. package/themes/kiosk/src/components/CartItem/index.tsx +9 -7
  28. package/themes/kiosk/src/components/CustomerName/index.tsx +2 -1
  29. package/themes/kiosk/src/components/Intro/index.tsx +4 -4
  30. package/themes/kiosk/src/components/OptionCard/index.tsx +11 -6
  31. package/themes/kiosk/src/components/PaymentOptions/index.tsx +46 -44
  32. package/themes/original/index.tsx +4 -0
  33. package/themes/original/src/components/BusinessItemAccordion/index.tsx +12 -9
  34. package/themes/original/src/components/BusinessItemAccordion/styles.tsx +3 -2
  35. package/themes/original/src/components/BusinessProductsListing/UpsellingRedirect.tsx +35 -0
  36. package/themes/original/src/components/BusinessProductsListing/index.tsx +22 -49
  37. package/themes/original/src/components/BusinessesListing/index.tsx +100 -75
  38. package/themes/original/src/components/Cart/index.tsx +129 -52
  39. package/themes/original/src/components/Cart/styles.tsx +8 -1
  40. package/themes/original/src/components/Checkout/index.tsx +38 -2
  41. package/themes/original/src/components/Help/index.tsx +1 -1
  42. package/themes/original/src/components/Home/index.tsx +5 -3
  43. package/themes/original/src/components/MessageListing/index.tsx +4 -2
  44. package/themes/original/src/components/OrderDetails/index.tsx +114 -42
  45. package/themes/original/src/components/OrderDetails/styles.tsx +8 -1
  46. package/themes/original/src/components/OrderSummary/index.tsx +141 -51
  47. package/themes/original/src/components/OrderSummary/styles.tsx +7 -0
  48. package/themes/original/src/components/PaymentOptionWallet/index.tsx +6 -2
  49. package/themes/original/src/components/PaymentOptions/index.tsx +8 -2
  50. package/themes/original/src/components/ProductForm/index.tsx +67 -77
  51. package/themes/original/src/components/ProductForm/styles.tsx +9 -2
  52. package/themes/original/src/components/ProductOptionSubOption/index.tsx +3 -2
  53. package/themes/original/src/components/SingleProductCard/index.tsx +21 -11
  54. package/themes/original/src/components/SingleProductCard/styles.tsx +4 -0
  55. package/themes/original/src/components/StripeElementsForm/index.tsx +28 -13
  56. package/themes/original/src/components/TaxInformation/index.tsx +59 -27
  57. package/themes/original/src/components/UpsellingProducts/index.tsx +90 -84
  58. package/themes/original/src/types/index.tsx +6 -0
@@ -35,6 +35,7 @@ import {
35
35
  Icons,
36
36
  OrderDriver,
37
37
  Map,
38
+ Divider,
38
39
  } from './styles';
39
40
  import { OButton, OIcon, OModal, OText } from '../shared';
40
41
  import { ProductItemAccordion } from '../ProductItemAccordion';
@@ -100,7 +101,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
100
101
  business: false,
101
102
  driver: false,
102
103
  });
103
- const [openTaxModal, setOpenTaxModal] = useState<any>({ open: false, data: null })
104
+ const [openTaxModal, setOpenTaxModal] = useState<any>({ open: false, tax: null, type: '' })
104
105
 
105
106
  const { order, businessData } = props.order;
106
107
 
@@ -349,6 +350,10 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
349
350
  }
350
351
  }
351
352
 
353
+ const getIncludedTaxesDiscounts = () => {
354
+ return order?.taxes?.filter((tax: any) => tax?.type === 1)?.reduce((carry: number, tax: any) => carry + (tax?.summary?.tax_after_discount ?? tax?.summary?.tax), 0)
355
+ }
356
+
352
357
  const handleClickOrderReview = (order: any) => {
353
358
  navigation.navigate(
354
359
  'ReviewOrder',
@@ -527,7 +532,8 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
527
532
  onPress={() => order?.business?.cellphone &&
528
533
  Linking.openURL(`tel:${order?.business?.cellphone}`)
529
534
  }
530
- style={{ paddingEnd: 5 }}>
535
+ style={{ paddingEnd: 5 }}
536
+ >
531
537
  <OIcon
532
538
  src={theme.images.general.phone}
533
539
  width={16}
@@ -730,10 +736,10 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
730
736
  <Table>
731
737
  <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>{t('SUBTOTAL', 'Subtotal')}</OText>
732
738
  <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>
733
- {parsePrice(((order?.summary?.subtotal || order?.subtotal) + getIncludedTaxes()))}
739
+ {parsePrice(((order?.summary?.subtotal ?? order?.subtotal) + getIncludedTaxes()))}
734
740
  </OText>
735
741
  </Table>
736
- {(order?.summary?.discount > 0 || order?.discount > 0) && (
742
+ {(order?.summary?.discount > 0 ?? order?.discount > 0) && order?.offers?.length === 0 && (
737
743
  <Table>
738
744
  {order?.offer_type === 1 ? (
739
745
  <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>
@@ -751,24 +757,53 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
751
757
  </OText>
752
758
  </Table>
753
759
  )}
760
+ {
761
+ order?.offers?.length > 0 && order?.offers?.filter((offer: any) => offer?.target === 1)?.map((offer: any) => (
762
+ <Table key={offer.id}>
763
+ <OSRow>
764
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal} numberOfLines={1}>
765
+ {offer.name}
766
+ {offer.rate_type === 1 && (
767
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>{`(${verifyDecimals(offer?.rate, parsePrice)}%)`}</OText>
768
+ )}
769
+ </OText>
770
+ <TouchableOpacity style={{ marginLeft: 5 }} onPress={() => setOpenTaxModal({ open: true, data: offer, type: 'offer_target_1' })}>
771
+ <AntIcon name='exclamationcircleo' size={18} color={theme.colors.primary} />
772
+ </TouchableOpacity>
773
+ </OSRow>
774
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>- {parsePrice(offer?.summary?.discount)}</OText>
775
+ </Table>
776
+ ))
777
+ }
778
+ <Divider />
779
+ {order?.summary?.subtotal_with_discount > 0 && order?.summary?.discount > 0 && order?.summary?.total >= 0 && (
780
+ <Table>
781
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>{t('SUBTOTAL_WITH_DISCOUNT', 'Subtotal with discount')}</OText>
782
+ {order?.tax_type === 1 ? (
783
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>{parsePrice((order?.summary?.subtotal_with_discount + getIncludedTaxesDiscounts() ?? 0))}</OText>
784
+ ) : (
785
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>{parsePrice(order?.summary?.subtotal_with_discount ?? 0)}</OText>
786
+ )}
787
+ </Table>
788
+ )}
754
789
  {
755
790
  order?.taxes?.length === 0 && order?.tax_type === 2 && (
756
791
  <Table>
757
- <OText size={12}>
792
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>
758
793
  {t('TAX', 'Tax')} {`(${verifyDecimals(order?.tax, parseNumber)}%)`}
759
794
  </OText>
760
- <OText size={12}>{parsePrice(order?.summary?.tax || 0)}</OText>
795
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>{parsePrice(order?.summary?.tax || 0)}</OText>
761
796
  </Table>
762
797
  )
763
798
  }
764
799
  {
765
800
  order?.fees?.length === 0 && (
766
801
  <Table>
767
- <OText size={12}>
802
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>
768
803
  {t('SERVICE_FEE', 'Service fee')}
769
804
  {`(${verifyDecimals(order?.service_fee, parseNumber)}%)`}
770
805
  </OText>
771
- <OText size={12}>{parsePrice(order?.summary?.service_fee || 0)}</OText>
806
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>{parsePrice(order?.summary?.service_fee || 0)}</OText>
772
807
  </Table>
773
808
  )
774
809
  }
@@ -776,15 +811,15 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
776
811
  order?.taxes?.length > 0 && order?.taxes?.filter((tax: any) => tax?.type === 2 && tax?.rate !== 0).map((tax: any) => (
777
812
  <Table key={tax.id}>
778
813
  <OSRow>
779
- <OText size={12} numberOfLines={1}>
814
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal} numberOfLines={1}>
780
815
  {tax.name || t('INHERIT_FROM_BUSINESS', 'Inherit from business')}
781
816
  {`(${verifyDecimals(tax?.rate, parseNumber)}%)`}{' '}
782
817
  </OText>
783
- <TouchableOpacity onPress={() => setOpenTaxModal({ open: true, data: tax })}>
818
+ <TouchableOpacity onPress={() => setOpenTaxModal({ open: true, data: tax, type: 'tax' })}>
784
819
  <AntIcon name='exclamationcircleo' size={18} color={theme.colors.primary} />
785
820
  </TouchableOpacity>
786
821
  </OSRow>
787
- <OText size={12}>{parsePrice(tax?.summary?.tax || 0)}</OText>
822
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>{parsePrice(tax?.summary?.tax_after_discount ?? tax?.summary?.tax ?? 0)}</OText>
788
823
  </Table>
789
824
  ))
790
825
  }
@@ -792,53 +827,84 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
792
827
  order?.fees?.length > 0 && order?.fees?.filter((fee: any) => !(fee.fixed === 0 && fee.percentage === 0))?.map((fee: any) => (
793
828
  <Table key={fee.id}>
794
829
  <OSRow>
795
- <OText size={12} numberOfLines={1}>
830
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal} numberOfLines={1}>
796
831
  {fee.name || t('INHERIT_FROM_BUSINESS', 'Inherit from business')}
797
832
  ({parsePrice(fee?.fixed)} + {fee.percentage}%){' '}
798
833
  </OText>
799
- <TouchableOpacity onPress={() => setOpenTaxModal({ open: true, data: fee })}>
834
+ <TouchableOpacity onPress={() => setOpenTaxModal({ open: true, data: fee, type: 'fee' })}>
800
835
  <AntIcon name='exclamationcircleo' size={18} color={theme.colors.primary} />
801
836
  </TouchableOpacity>
802
837
  </OSRow>
803
- <OText size={12}>{parsePrice(fee?.fixed + fee?.summary?.percentage || 0)}</OText>
838
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>{parsePrice(fee?.summary?.fixed + (fee?.summary?.percentage_after_discount ?? fee?.summary?.percentage) ?? 0)}</OText>
804
839
  </Table>
805
840
  ))
806
841
  }
807
- {(order?.summary?.delivery_price > 0 ||
808
- order?.deliveryFee > 0) && (
809
- <Table>
810
- <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>{t('DELIVERY_FEE', 'Delivery Fee')}</OText>
811
- <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>
812
- {parsePrice(
813
- order?.summary?.delivery_price || order?.deliveryFee,
814
- )}
815
- </OText>
842
+ {
843
+ order?.offers?.length > 0 && order?.offers?.filter((offer: any) => offer?.target === 3)?.map((offer: any) => (
844
+ <Table key={offer.id}>
845
+ <OSRow>
846
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal} numberOfLines={1}>
847
+ {offer.name}
848
+ {offer.rate_type === 1 && (
849
+ <OText>{`(${verifyDecimals(offer?.rate, parsePrice)}%)`}</OText>
850
+ )}
851
+ </OText>
852
+ <TouchableOpacity style={{ marginLeft: 5 }} onPress={() => setOpenTaxModal({ open: true, data: offer, type: 'offer_target_3' })}>
853
+ <AntIcon name='exclamationcircleo' size={18} color={theme.colors.primary} />
854
+ </TouchableOpacity>
855
+ </OSRow>
856
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>- {parsePrice(offer?.summary?.discount)}</OText>
816
857
  </Table>
817
- )}
818
- <Table>
819
- <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>
820
- {t('DRIVER_TIP', 'Driver tip')}
821
- {(order?.summary?.driver_tip > 0 || order?.driver_tip > 0) &&
822
- parseInt(configs?.driver_tip_type?.value, 10) === 2 &&
823
- !parseInt(configs?.driver_tip_use_custom?.value, 10) &&
824
- `(${verifyDecimals(order?.driver_tip, parseNumber)}%)`}
825
- </OText>
826
- <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>
827
- {parsePrice(
828
- order?.summary?.driver_tip || order?.totalDriverTip,
829
- )}
830
- </OText>
831
- </Table>
858
+ ))
859
+ }
860
+ {order?.summary?.delivery_price > 0 && (
861
+ <Table>
862
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>{t('DELIVERY_FEE', 'Delivery Fee')}</OText>
863
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>{parsePrice(order?.summary?.delivery_price)}</OText>
864
+ </Table>
865
+ )}
866
+ {
867
+ order?.offers?.length > 0 && order?.offers?.filter((offer: any) => offer?.target === 2)?.map((offer: any) => (
868
+ <Table key={offer.id}>
869
+ <OSRow>
870
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal} numberOfLines={1}>
871
+ {offer.name}
872
+ {offer.rate_type === 1 && (
873
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>{`(${verifyDecimals(offer?.rate, parsePrice)}%)`}</OText>
874
+ )}
875
+ </OText>
876
+ <TouchableOpacity style={{ marginLeft: 5 }} onPress={() => setOpenTaxModal({ open: true, data: offer, type: 'offer_target_2' })}>
877
+ <AntIcon name='exclamationcircleo' size={18} color={theme.colors.primary} />
878
+ </TouchableOpacity>
879
+ </OSRow>
880
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>- {parsePrice(offer?.summary?.discount)}</OText>
881
+ </Table>
882
+ ))
883
+ }
884
+ {order?.summary?.driver_tip > 0 && (
885
+ <Table>
886
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>
887
+ {t('DRIVER_TIP', 'Driver tip')}
888
+ {order?.summary?.driver_tip > 0 &&
889
+ parseInt(configs?.driver_tip_type?.value, 10) === 2 &&
890
+ !parseInt(configs?.driver_tip_use_custom?.value, 10) &&
891
+ (
892
+ `(${verifyDecimals(order?.summary?.driver_tip, parseNumber)}%)`
893
+ )}
894
+ </OText>
895
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>{parsePrice(order?.summary?.driver_tip ?? order?.totalDriverTip)}</OText>
896
+ </Table>
897
+ )}
832
898
  <Total>
833
899
  <Table>
834
900
  <OText size={20} lineHeight={30} weight={'600'} color={theme.colors.textNormal}>{t('TOTAL', 'Total')}</OText>
835
901
  <OText size={20} lineHeight={30} weight={'600'} color={theme.colors.textNormal}>
836
- {parsePrice(order?.summary?.total || order?.total)}
902
+ {parsePrice(order?.summary?.total ?? order?.total)}
837
903
  </OText>
838
904
  </Table>
839
905
  </Total>
840
906
  {order?.payment_events?.length > 0 && (
841
- <View style={{marginTop: 10}}>
907
+ <View style={{ marginTop: 10 }}>
842
908
  <OText size={20} weight='bold' color={theme.colors.textNormal}>{t('PAYMENTS', 'Payments')}</OText>
843
909
  <View
844
910
  style={{
@@ -904,10 +970,16 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
904
970
  </OModal>
905
971
  <OModal
906
972
  open={openTaxModal.open}
907
- onClose={() => setOpenTaxModal({ open: false, data: null })}
973
+ onClose={() => setOpenTaxModal({ open: false, data: null, type: '' })}
908
974
  entireModal
975
+ title={`${openTaxModal.data?.name ||
976
+ t('INHERIT_FROM_BUSINESS', 'Inherit from business')} ${openTaxModal.data?.rate_type !== 2 ? `(${typeof openTaxModal.data?.rate === 'number' ? `${openTaxModal.data?.rate}%` : `${parsePrice(openTaxModal.data?.fixed ?? 0)} + ${openTaxModal.data?.percentage}%`})` : ''} `}
909
977
  >
910
- <TaxInformation data={openTaxModal.data} products={order?.products} />
978
+ <TaxInformation
979
+ type={openTaxModal.type}
980
+ data={openTaxModal.data}
981
+ products={order?.products}
982
+ />
911
983
  </OModal>
912
984
  </OrderDetailsContainer>
913
985
  );
@@ -116,5 +116,12 @@ export const Map = styled.View`
116
116
  width: 100%;
117
117
  height: 250px;
118
118
  margin-top: 20px;
119
- border-radius: 20px
119
+ border-radius: 20px;
120
+ `
121
+
122
+ export const Divider = styled.View`
123
+ border-color: #EAEAEA;
124
+ border-width: 1px;
125
+ margin-top: 5px;
126
+ margin-bottom: 5px;
120
127
  `
@@ -14,17 +14,18 @@ import {
14
14
  OSProductList,
15
15
  OSBill,
16
16
  OSTable,
17
- OSRow
17
+ OSRow,
18
+ Divider
18
19
  } from './styles';
19
20
 
20
21
  import { ProductItemAccordion } from '../ProductItemAccordion';
21
22
  import { CouponControl } from '../CouponControl';
22
23
  import { OInput, OModal, OText } from '../shared';
23
- import { ProductForm } from '../ProductForm';
24
24
  import { verifyDecimals } from '../../utils';
25
25
  import AntIcon from 'react-native-vector-icons/AntDesign'
26
26
  import { TaxInformation } from '../TaxInformation';
27
27
  import { TouchableOpacity } from 'react-native';
28
+ import { OAlert } from '../../../../../src/components/shared'
28
29
 
29
30
  const OrderSummaryUI = (props: any) => {
30
31
  const {
@@ -35,7 +36,9 @@ const OrderSummaryUI = (props: any) => {
35
36
  isCartPending,
36
37
  isFromCheckout,
37
38
  commentState,
38
- handleChangeComment
39
+ handleChangeComment,
40
+ onNavigationRedirect,
41
+ handleRemoveOfferClick
39
42
  } = props;
40
43
 
41
44
  const theme = useTheme()
@@ -44,10 +47,8 @@ const OrderSummaryUI = (props: any) => {
44
47
  const [orderState] = useOrder();
45
48
  const [{ parsePrice, parseNumber }] = useUtils();
46
49
  const [validationFields] = useValidationFields();
47
- const [openProduct, setModalIsOpen] = useState(false)
48
- const [curProduct, setCurProduct] = useState<any>(null)
49
- const [openTaxModal, setOpenTaxModal] = useState<any>({ open: false, data: null })
50
-
50
+ const [openTaxModal, setOpenTaxModal] = useState<any>({ open: false, data: null, type: '' })
51
+ const [confirm, setConfirm] = useState<any>({ open: false, content: null, handleOnAccept: null, id: null, title: null })
51
52
  const isCouponEnabled = validationFields?.fields?.checkout?.coupon?.enabled;
52
53
 
53
54
  const handleDeleteClick = (product: any) => {
@@ -55,14 +56,15 @@ const OrderSummaryUI = (props: any) => {
55
56
  }
56
57
 
57
58
  const handleEditProduct = (product: any) => {
58
- setCurProduct(product)
59
- setModalIsOpen(true)
60
- }
61
-
62
- const handlerProductAction = (product: any) => {
63
- if (Object.keys(product).length) {
64
- setModalIsOpen(false)
65
- }
59
+ onNavigationRedirect('ProductDetails', {
60
+ isCartProduct: true,
61
+ productCart: product,
62
+ businessSlug: cart?.business?.slug,
63
+ businessId: cart?.business_id,
64
+ categoryId: product?.category_id,
65
+ productId: product?.id,
66
+ isFromCheckout: isFromCheckout,
67
+ })
66
68
  }
67
69
 
68
70
  const getIncludedTaxes = () => {
@@ -75,6 +77,22 @@ const OrderSummaryUI = (props: any) => {
75
77
  }
76
78
  }
77
79
 
80
+ const getIncludedTaxesDiscounts = () => {
81
+ return cart?.taxes?.filter((tax: any) => tax?.type === 1)?.reduce((carry: number, tax: any) => carry + (tax?.summary?.tax_after_discount ?? tax?.summary?.tax), 0)
82
+ }
83
+
84
+ const onRemoveOffer = (id: number) => {
85
+ setConfirm({
86
+ open: true,
87
+ content: [t('QUESTION_DELETE_OFFER', 'Are you sure that you want to delete the offer?')],
88
+ title: t('OFFER', 'Offer'),
89
+ handleOnAccept: () => {
90
+ setConfirm({ ...confirm, open: false })
91
+ handleRemoveOfferClick(id)
92
+ }
93
+ })
94
+ }
95
+
78
96
  const cart = orderState?.carts?.[`businessId:${props.cart.business_id}`]
79
97
 
80
98
  const walletName: any = {
@@ -110,9 +128,11 @@ const OrderSummaryUI = (props: any) => {
110
128
  <OSBill>
111
129
  <OSTable>
112
130
  <OText size={12}>{t('SUBTOTAL', 'Subtotal')}</OText>
113
- <OText size={12}>{parsePrice(cart?.subtotal + getIncludedTaxes())}</OText>
131
+ <OText size={12}>
132
+ {parsePrice(cart?.subtotal + getIncludedTaxes())}
133
+ </OText>
114
134
  </OSTable>
115
- {cart?.discount > 0 && cart?.total >= 0 && (
135
+ {cart?.discount > 0 && cart?.total >= 0 && cart?.offers?.length === 0 && (
116
136
  <OSTable>
117
137
  {cart?.discount_type === 1 ? (
118
138
  <OText size={12}>
@@ -126,34 +146,87 @@ const OrderSummaryUI = (props: any) => {
126
146
  </OSTable>
127
147
  )}
128
148
  {
129
- cart?.taxes?.length > 0 && cart?.taxes?.filter((tax: any) => tax?.type === 2 && tax?.rate !== 0).map((tax: any) => (
130
- <OSTable key={tax?.id}>
149
+ cart?.offers?.length > 0 && cart?.offers?.filter((offer: any) => offer?.target === 1)?.map((offer: any) => (
150
+ <OSTable key={offer.id}>
131
151
  <OSRow>
132
- <OText size={12} numberOfLines={1}>
133
- {tax?.name || t('INHERIT_FROM_BUSINESS', 'Inherit from business')}{' '}
152
+ <OText size={12}>{offer.name}</OText>
153
+ {offer.rate_type === 1 && (
154
+ <OText size={12}>{`(${verifyDecimals(offer?.rate, parsePrice)}%)`}</OText>
155
+ )}
156
+ <TouchableOpacity style={{ marginLeft: 3 }} onPress={() => setOpenTaxModal({ open: true, data: offer, type: 'offer_target_1' })}>
157
+ <AntIcon name='exclamationcircleo' size={18} color={theme.colors.primary} />
158
+ </TouchableOpacity>
159
+ <TouchableOpacity style={{ marginLeft: 3 }} onPress={() => onRemoveOffer(offer?.id)}>
160
+ <AntIcon name='closecircle' size={18} color={theme.colors.primary} />
161
+ </TouchableOpacity>
162
+ </OSRow>
163
+ <OText size={12}>
164
+ - {parsePrice(offer?.summary?.discount)}
165
+ </OText>
166
+ </OSTable>
167
+ ))
168
+ }
169
+ <Divider />
170
+ {cart?.subtotal_with_discount > 0 && cart?.discount > 0 && cart?.total >= 0 && (
171
+ <OSTable>
172
+ <OText size={12} numberOfLines={1}>{t('SUBTOTAL_WITH_DISCOUNT', 'Subtotal with discount')}</OText>
173
+ {cart?.business?.tax_type === 1 ? (
174
+ <OText size={12}>{parsePrice(cart?.subtotal_with_discount + getIncludedTaxesDiscounts() ?? 0)}</OText>
175
+ ) : (
176
+ <OText size={12}>{parsePrice(cart?.subtotal_with_discount ?? 0)}</OText>
177
+ )}
178
+ </OSTable>
179
+ )}
180
+ {
181
+ cart.taxes?.length > 0 && cart.taxes.filter((tax: any) => tax.type === 2 && tax?.rate !== 0).map((tax: any) => (
182
+ <OSTable key={tax.id}>
183
+ <OSRow>
184
+ <OText size={12} numberOfLines={1} >
185
+ {tax.name || t('INHERIT_FROM_BUSINESS', 'Inherit from business')}{' '}
134
186
  {`(${verifyDecimals(tax?.rate, parseNumber)}%)`}{' '}
135
187
  </OText>
136
- <TouchableOpacity onPress={() => setOpenTaxModal({ open: true, data: tax })} >
137
- <AntIcon name='exclamationcircleo' size={20} color={theme.colors.primary} />
188
+ <TouchableOpacity onPress={() => setOpenTaxModal({ open: true, data: tax, type: 'tax' })} >
189
+ <AntIcon name='exclamationcircleo' size={18} color={theme.colors.primary} />
138
190
  </TouchableOpacity>
139
191
  </OSRow>
140
- <OText size={12}>{parsePrice(tax?.summary?.tax || 0)}</OText>
192
+ <OText size={12}>{parsePrice(tax?.summary?.tax_after_discount ?? tax?.summary?.tax ?? 0)}</OText>
141
193
  </OSTable>
142
194
  ))
143
195
  }
144
196
  {
145
- cart?.fees?.length > 0 && cart?.fees?.filter((fee: any) => !(fee.fixed === 0 && fee.percentage === 0))?.map((fee: any) => (
146
- <OSTable key={fee.id}>
197
+ cart?.fees?.length > 0 && cart?.fees?.filter((fee: any) => !(fee.fixed === 0 && fee.percentage === 0)).map((fee: any) => (
198
+ <OSTable key={fee?.id}>
147
199
  <OSRow>
148
200
  <OText size={12} numberOfLines={1}>
149
201
  {fee.name || t('INHERIT_FROM_BUSINESS', 'Inherit from business')}{' '}
150
- ({parsePrice(fee?.fixed)} + {fee.percentage}%){' '}
202
+ ({parsePrice(fee?.fixed)} + {fee?.percentage}%){' '}
151
203
  </OText>
152
- <TouchableOpacity onPress={() => setOpenTaxModal({ open: true, data: fee })} >
153
- <AntIcon name='exclamationcircleo' size={20} color={theme.colors.primary} />
204
+ <TouchableOpacity onPress={() => setOpenTaxModal({ open: true, data: fee, type: 'fee' })} >
205
+ <AntIcon name='exclamationcircleo' size={18} color={theme.colors.primary} />
154
206
  </TouchableOpacity>
155
207
  </OSRow>
156
- <OText size={12}>{parsePrice(fee?.summary?.fixed + fee?.summary?.percentage || 0)}</OText>
208
+ <OText size={12}>{parsePrice(fee?.summary?.fixed + (fee?.summary?.percentage_after_discount ?? fee?.summary?.percentage) ?? 0)}</OText>
209
+ </OSTable>
210
+ ))
211
+ }
212
+ {
213
+ cart?.offers?.length > 0 && cart?.offers?.filter((offer: any) => offer?.target === 3)?.map((offer: any) => (
214
+ <OSTable key={offer.id}>
215
+ <OSRow>
216
+ <OText size={12}>{offer.name}</OText>
217
+ {offer.rate_type === 1 && (
218
+ <OText size={12}>{`(${verifyDecimals(offer?.rate, parsePrice)}%)`}</OText>
219
+ )}
220
+ <TouchableOpacity style={{ marginLeft: 3 }} onPress={() => setOpenTaxModal({ open: true, data: offer, type: 'offer_target_3' })}>
221
+ <AntIcon name='exclamationcircleo' size={18} color={theme.colors.primary} />
222
+ </TouchableOpacity>
223
+ <TouchableOpacity style={{ marginLeft: 3 }} onPress={() => onRemoveOffer(offer?.id)}>
224
+ <AntIcon name='closecircle' size={18} color={theme.colors.primary} />
225
+ </TouchableOpacity>
226
+ </OSRow>
227
+ <OText size={12}>
228
+ - {parsePrice(offer?.summary?.discount)}
229
+ </OText>
157
230
  </OSTable>
158
231
  ))
159
232
  }
@@ -163,6 +236,27 @@ const OrderSummaryUI = (props: any) => {
163
236
  <OText size={12}>{parsePrice(cart?.delivery_price)}</OText>
164
237
  </OSTable>
165
238
  )}
239
+ {
240
+ cart?.offers?.length > 0 && cart?.offers?.filter((offer: any) => offer?.target === 2)?.map((offer: any) => (
241
+ <OSTable key={offer.id}>
242
+ <OSRow>
243
+ <OText size={12}>{offer.name}</OText>
244
+ {offer.rate_type === 1 && (
245
+ <OText size={12}>{`(${verifyDecimals(offer?.rate, parsePrice)}%)`}</OText>
246
+ )}
247
+ <TouchableOpacity style={{ marginLeft: 3 }} onPress={() => setOpenTaxModal({ open: true, data: offer, type: 'offer_target_2' })}>
248
+ <AntIcon name='exclamationcircleo' size={18} color={theme.colors.primary} />
249
+ </TouchableOpacity>
250
+ <TouchableOpacity style={{ marginLeft: 3 }} onPress={() => onRemoveOffer(offer?.id)}>
251
+ <AntIcon name='closecircle' size={18} color={theme.colors.primary} />
252
+ </TouchableOpacity>
253
+ </OSRow>
254
+ <OText size={12}>
255
+ - {parsePrice(offer?.summary?.discount)}
256
+ </OText>
257
+ </OSTable>
258
+ ))
259
+ }
166
260
  {cart?.driver_tip > 0 && (
167
261
  <OSTable>
168
262
  <OText size={12}>
@@ -202,7 +296,7 @@ const OrderSummaryUI = (props: any) => {
202
296
  {t('TOTAL', 'Total')}
203
297
  </OText>
204
298
  <OText size={14} style={{ fontWeight: 'bold' }} >
205
- {parsePrice(cart?.balance ?? cart?.total)}
299
+ {parsePrice(cart?.total >= 0 ? cart?.total : 0)}
206
300
  </OText>
207
301
  </OSTable>
208
302
  </View>
@@ -242,31 +336,27 @@ const OrderSummaryUI = (props: any) => {
242
336
  )}
243
337
  </OSBill>
244
338
  )}
245
- <OModal
246
- open={openProduct}
247
- entireModal
248
- customClose
249
- onClose={() => setModalIsOpen(false)}
250
- >
251
- <ProductForm
252
- isCartProduct
253
- productCart={curProduct}
254
- businessSlug={cart?.business?.slug}
255
- businessId={cart?.business_id}
256
- categoryId={curProduct?.category_id}
257
- productId={curProduct?.id}
258
- onSave={handlerProductAction}
259
- onClose={() => setModalIsOpen(false)}
260
- isFromCheckout={isFromCheckout}
261
- />
262
- </OModal>
263
339
  <OModal
264
340
  open={openTaxModal.open}
265
- onClose={() => setOpenTaxModal({ open: false, data: null })}
341
+ onClose={() => setOpenTaxModal({ open: false, data: null, type: '' })}
266
342
  entireModal
343
+ title={`${openTaxModal.data?.name ||
344
+ t('INHERIT_FROM_BUSINESS', 'Inherit from business')} ${openTaxModal.data?.rate_type !== 2 ? `(${typeof openTaxModal.data?.rate === 'number' ? `${openTaxModal.data?.rate}%` : `${parsePrice(openTaxModal.data?.fixed ?? 0)} + ${openTaxModal.data?.percentage}%`})` : ''} `}
267
345
  >
268
- <TaxInformation data={openTaxModal.data} products={cart.products} />
346
+ <TaxInformation
347
+ type={openTaxModal.type}
348
+ data={openTaxModal.data}
349
+ products={cart?.products}
350
+ />
269
351
  </OModal>
352
+ <OAlert
353
+ open={confirm.open}
354
+ title={confirm.title}
355
+ content={confirm.content}
356
+ onAccept={confirm.handleOnAccept}
357
+ onCancel={() => setConfirm({ ...confirm, open: false, title: null })}
358
+ onClose={() => setConfirm({ ...confirm, open: false, title: null })}
359
+ />
270
360
  </>
271
361
  )}
272
362
  </OSContainer>
@@ -39,3 +39,10 @@ export const OSRow = styled.View`
39
39
  overflow: hidden;
40
40
  width: 80%;
41
41
  `
42
+
43
+ export const Divider = styled.View`
44
+ border-color: #EAEAEA;
45
+ border-width: 1px;
46
+ margin-top: 5px;
47
+ margin-bottom: 10px;
48
+ `
@@ -7,6 +7,7 @@ import {
7
7
  PaymentOptionWallet as PaymentOptionWalletController,
8
8
  useLanguage,
9
9
  useUtils,
10
+ useOrder
10
11
  } from 'ordering-components/native'
11
12
 
12
13
  import {
@@ -18,7 +19,7 @@ import { OText } from '../shared'
18
19
 
19
20
  const PaymentOptionWalletUI = (props: any) => {
20
21
  const {
21
- cart,
22
+ businessId,
22
23
  walletsState,
23
24
  selectWallet,
24
25
  deletetWalletSelected
@@ -26,8 +27,11 @@ const PaymentOptionWalletUI = (props: any) => {
26
27
 
27
28
  const theme = useTheme()
28
29
  const [, t] = useLanguage()
30
+ const [{ carts }] = useOrder()
29
31
  const [{ parsePrice }] = useUtils()
30
32
 
33
+ const cart = carts?.[`businessId:${businessId}`] ?? {}
34
+
31
35
  const styles = StyleSheet.create({
32
36
  checkBoxStyle: {
33
37
  width: 25,
@@ -68,7 +72,7 @@ const PaymentOptionWalletUI = (props: any) => {
68
72
  if (!walletsState.loading && walletsState.result?.length) {
69
73
  setCheckedState(
70
74
  walletsState.result?.map((wallet: any) => {
71
- return !!cart?.wallets?.find((w: any) => w.id === wallet.id)
75
+ return !!cart?.payment_events?.find((w: any) => w.wallet_id === wallet.id)
72
76
  })
73
77
  )
74
78
  }
@@ -37,6 +37,8 @@ const stripeOptions: any = ['stripe_direct', 'stripe', 'stripe_connect']
37
37
  // { name: 'iDEAL', value: 'ideal' }
38
38
  // ]
39
39
 
40
+ const webViewPaymentGateway: any = ['paypal', 'square']
41
+
40
42
  const PaymentOptionsUI = (props: any) => {
41
43
  const {
42
44
  cart,
@@ -49,7 +51,8 @@ const PaymentOptionsUI = (props: any) => {
49
51
  onNavigationRedirect,
50
52
  handlePaymethodClick,
51
53
  handlePaymethodDataChange,
52
- isOpenMethod
54
+ isOpenMethod,
55
+ handlePaymentMethodClickCustom
53
56
  } = props
54
57
 
55
58
  const theme = useTheme();
@@ -90,6 +93,9 @@ const PaymentOptionsUI = (props: any) => {
90
93
 
91
94
  const handlePaymentMethodClick = (paymethod: any) => {
92
95
  const isPopupMethod = ['stripe', 'stripe_direct', 'stripe_connect', 'stripe_redirect', 'paypal'].includes(paymethod?.gateway)
96
+ if (webViewPaymentGateway.includes(paymethod?.gateway)) {
97
+ handlePaymentMethodClickCustom(paymethod)
98
+ }
93
99
  handlePaymethodClick(paymethod, isPopupMethod)
94
100
  }
95
101
 
@@ -139,7 +145,7 @@ const PaymentOptionsUI = (props: any) => {
139
145
  )
140
146
  }
141
147
 
142
- const excludeIds: any = [3, 32, 66]; //exclude paypal & connect & redirect
148
+ const excludeIds: any = [32, 66]; //exclude paypal & connect & redirect
143
149
 
144
150
  return (
145
151
  <PMContainer>