@eventlook/sdk 1.7.2-beta.0 → 1.7.3-beta.0

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 (55) hide show
  1. package/dist/cjs/{index-DmK9RPSa.js → index-CXsZ9BsP.js} +50 -37
  2. package/dist/cjs/index-CXsZ9BsP.js.map +1 -0
  3. package/dist/cjs/index-DgOx9uHQ.js +41917 -0
  4. package/dist/cjs/index-DgOx9uHQ.js.map +1 -0
  5. package/dist/cjs/index.js +1 -1
  6. package/dist/cjs/{index.umd-DUMMTVwU.js → index.umd-DR37hmpO.js} +2 -2
  7. package/dist/cjs/{index.umd-DUMMTVwU.js.map → index.umd-DR37hmpO.js.map} +1 -1
  8. package/dist/cjs/index.umd-TbjzhsUx.js +13397 -0
  9. package/dist/cjs/index.umd-TbjzhsUx.js.map +1 -0
  10. package/dist/esm/index-Ds-63DcA.js +41896 -0
  11. package/dist/esm/index-Ds-63DcA.js.map +1 -0
  12. package/dist/esm/{index-C0HcmMMr.js → index-z31XSEKz.js} +50 -37
  13. package/dist/esm/index-z31XSEKz.js.map +1 -0
  14. package/dist/esm/index.js +1 -1
  15. package/dist/esm/{index.umd-BqJOlKvJ.js → index.umd-5znOX_Ww.js} +2 -2
  16. package/dist/esm/{index.umd-BqJOlKvJ.js.map → index.umd-5znOX_Ww.js.map} +1 -1
  17. package/dist/esm/index.umd-ddggyAGa.js +13395 -0
  18. package/dist/esm/index.umd-ddggyAGa.js.map +1 -0
  19. package/dist/types/form/Payment.d.ts +1 -0
  20. package/dist/types/form/payment/StripeCheckoutProvider.d.ts +36 -0
  21. package/dist/types/hooks/data/useStripeConfig.d.ts +3 -0
  22. package/dist/types/locales/cs.d.ts +3 -0
  23. package/dist/types/locales/en.d.ts +3 -0
  24. package/dist/types/locales/es.d.ts +3 -0
  25. package/dist/types/locales/pl.d.ts +3 -0
  26. package/dist/types/locales/sk.d.ts +3 -0
  27. package/dist/types/locales/uk.d.ts +3 -0
  28. package/dist/types/modules/order.d.ts +3 -0
  29. package/dist/types/utils/data/ticket.d.ts +1 -0
  30. package/dist/types/utils/types/order.type.d.ts +2 -0
  31. package/dist/types/utils/types/payment-method.type.d.ts +1 -0
  32. package/package.json +4 -2
  33. package/src/form/ChildEventCard.tsx +70 -64
  34. package/src/form/Payment.tsx +42 -3
  35. package/src/form/PaymentOverviewBox.tsx +20 -7
  36. package/src/form/TicketForm.tsx +262 -167
  37. package/src/form/payment/StripeCheckoutProvider.tsx +154 -0
  38. package/src/form/tickets/ReleaseWithMerchandise.tsx +7 -6
  39. package/src/form/tickets/TicketSelection.tsx +7 -6
  40. package/src/form/tickets/TicketSelectionMap.tsx +2 -2
  41. package/src/form/tickets/TicketSelectionMobile.tsx +4 -3
  42. package/src/form/tickets/TicketWithMerchandiseSelection.tsx +5 -4
  43. package/src/hooks/data/useStripeConfig.ts +14 -0
  44. package/src/locales/cs.tsx +3 -0
  45. package/src/locales/en.tsx +3 -0
  46. package/src/locales/es.tsx +3 -0
  47. package/src/locales/pl.tsx +3 -0
  48. package/src/locales/sk.tsx +3 -0
  49. package/src/locales/uk.tsx +3 -0
  50. package/src/modules/order.ts +3 -0
  51. package/src/utils/data/ticket.ts +10 -0
  52. package/src/utils/types/order.type.ts +5 -0
  53. package/src/utils/types/payment-method.type.ts +1 -0
  54. package/dist/cjs/index-DmK9RPSa.js.map +0 -1
  55. package/dist/esm/index-C0HcmMMr.js.map +0 -1
@@ -9,7 +9,7 @@ import { useFormContext, useWatch } from 'react-hook-form';
9
9
  import { IEventProductForm } from '@utils/types/product.type';
10
10
  import { fCurrency } from '@utils/formatNumber';
11
11
  import { Currencies } from '@utils/data/currency';
12
- import { MAX_TICKETS_PER_ORDER } from '@utils/data/ticket';
12
+ import { getMaxTicketsPerOrder } from '@utils/data/ticket';
13
13
  import { getSelectedQuantityByVariant } from '@utils/product';
14
14
  import ReleaseExtraFields from '@form/extra-field/ReleaseExtraFields';
15
15
  import ReleaseDescription from '@form/tickets/ReleaseDescription';
@@ -32,6 +32,7 @@ const ReleaseWithMerchandise: React.FC<Props> = ({
32
32
  index,
33
33
  }) => {
34
34
  const { t, lang } = useGlobal();
35
+ const maxTicketsPerOrder = getMaxTicketsPerOrder(eventId);
35
36
  const [openVariantDialog, setOpenVariantDialog] = useState<'add' | 'increase' | null>(null);
36
37
  const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false);
37
38
  const [primaryDialogMode, setPrimaryDialogMode] = useState<'add' | 'increase' | null>(null);
@@ -60,7 +61,7 @@ const ReleaseWithMerchandise: React.FC<Props> = ({
60
61
  const getAvailableTicketsForRelease = (release: ITicketFormTicket): number => {
61
62
  const selectedRelease = activeReleases?.find((item) => item.id === release.releaseId);
62
63
  const availableQuantity = selectedRelease ? selectedRelease.availableTickets : 0;
63
- return availableQuantity > MAX_TICKETS_PER_ORDER ? MAX_TICKETS_PER_ORDER : availableQuantity;
64
+ return availableQuantity > maxTicketsPerOrder ? maxTicketsPerOrder : availableQuantity;
64
65
  };
65
66
 
66
67
  const isMaxQuantity = (releaseId: number) => {
@@ -79,8 +80,8 @@ const ReleaseWithMerchandise: React.FC<Props> = ({
79
80
  ? [productsToAdd]
80
81
  : [];
81
82
  const requestedQuantity = normalizedProducts.length ? normalizedProducts.length : 1;
82
- const releaseMaxQuantity = Math.min(release.availableTickets || 0, MAX_TICKETS_PER_ORDER);
83
- const remainingOrderCapacity = Math.max(0, MAX_TICKETS_PER_ORDER - countSelectedTickets());
83
+ const releaseMaxQuantity = Math.min(release.availableTickets || 0, maxTicketsPerOrder);
84
+ const remainingOrderCapacity = Math.max(0, maxTicketsPerOrder - countSelectedTickets());
84
85
  const quantity = Math.min(requestedQuantity, releaseMaxQuantity, remainingOrderCapacity);
85
86
 
86
87
  if (quantity <= 0) {
@@ -123,7 +124,7 @@ const ReleaseWithMerchandise: React.FC<Props> = ({
123
124
  if (addedRelease) {
124
125
  const increment = normalizedProducts.length ? normalizedProducts.length : 1;
125
126
  const maxQuantity = getAvailableTicketsForRelease(addedRelease);
126
- const remainingOrderCapacity = Math.max(0, MAX_TICKETS_PER_ORDER - countSelectedTickets());
127
+ const remainingOrderCapacity = Math.max(0, maxTicketsPerOrder - countSelectedTickets());
127
128
  const availableIncrement = Math.max(
128
129
  0,
129
130
  Math.min(increment, maxQuantity - Number(addedRelease.quantity), remainingOrderCapacity)
@@ -194,7 +195,7 @@ const ReleaseWithMerchandise: React.FC<Props> = ({
194
195
  }, [tickets, release.id, setValue]);
195
196
 
196
197
  const ticketIndex = tickets.findIndex((t) => t.releaseId === release.id);
197
- const remainingOrderCapacity = Math.max(0, MAX_TICKETS_PER_ORDER - countSelectedTickets());
198
+ const remainingOrderCapacity = Math.max(0, maxTicketsPerOrder - countSelectedTickets());
198
199
  const nextRelease = activeReleases?.find(
199
200
  (item) =>
200
201
  item.releaseCategoryName === release.releaseCategoryName && item.order === release.order + 1
@@ -9,7 +9,7 @@ import { IEvent } from '@utils/types/event.type';
9
9
  import useResponsive from '@hooks/useResponsive';
10
10
  import ReleaseExtraFields from '@form/extra-field/ReleaseExtraFields';
11
11
  import { EventType } from '@utils/data/event';
12
- import { MAX_TICKETS_PER_ORDER } from '@utils/data/ticket';
12
+ import { getMaxTicketsPerOrder } from '@utils/data/ticket';
13
13
  import useGlobal from '@hooks/useGlobal';
14
14
  import TicketSelectionMobile from './TicketSelectionMobile';
15
15
 
@@ -19,6 +19,7 @@ interface Props {
19
19
 
20
20
  const TicketSelection: React.FC<Props> = ({ event }) => {
21
21
  const { t } = useGlobal();
22
+ const maxTicketsPerOrder = getMaxTicketsPerOrder(event.id);
22
23
  const isMobile = useResponsive('down', 'md');
23
24
  const { setValue, watch } = useFormContext<ITicketForm>();
24
25
  const tickets = useWatch({
@@ -83,7 +84,7 @@ const TicketSelection: React.FC<Props> = ({ event }) => {
83
84
  item2.releaseCategoryName === item.releaseCategoryName && item2.order === item.order + 1
84
85
  );
85
86
  const selected = tickets.find((ticket) => ticket.releaseId === item.id);
86
- const maxSelectable = Math.min(item.availableTickets || 0, MAX_TICKETS_PER_ORDER);
87
+ const maxSelectable = Math.min(item.availableTickets || 0, maxTicketsPerOrder);
87
88
 
88
89
  return (
89
90
  !!nextRelease &&
@@ -110,8 +111,8 @@ const TicketSelection: React.FC<Props> = ({ event }) => {
110
111
  const isQuantityDisabled = (value: number, releaseId: number | '') => {
111
112
  const releaseSelected = tickets.find((item) => item.releaseId === releaseId);
112
113
  return releaseSelected && releaseSelected.quantity
113
- ? countSelectedTickets() + value - releaseSelected.quantity > MAX_TICKETS_PER_ORDER
114
- : countSelectedTickets() + value > MAX_TICKETS_PER_ORDER;
114
+ ? countSelectedTickets() + value - releaseSelected.quantity > maxTicketsPerOrder
115
+ : countSelectedTickets() + value > maxTicketsPerOrder;
115
116
  };
116
117
 
117
118
  const removeTicket = (indexToRemove: number) => {
@@ -128,7 +129,7 @@ const TicketSelection: React.FC<Props> = ({ event }) => {
128
129
  tickets.find(
129
130
  (ticket) =>
130
131
  release.id === ticket.releaseId &&
131
- Number(ticket.quantity) >= Math.min(release.availableTickets || 0, MAX_TICKETS_PER_ORDER)
132
+ Number(ticket.quantity) >= Math.min(release.availableTickets || 0, maxTicketsPerOrder)
132
133
  )
133
134
  );
134
135
 
@@ -146,7 +147,7 @@ const TicketSelection: React.FC<Props> = ({ event }) => {
146
147
  const previousTicket = tickets.find((ticket) => ticket.releaseId === previousRelease.id);
147
148
  const previousMaxSelectable = Math.min(
148
149
  previousRelease.availableTickets || 0,
149
- MAX_TICKETS_PER_ORDER
150
+ maxTicketsPerOrder
150
151
  );
151
152
  const shouldUnlock = Number(previousTicket?.quantity || 0) >= previousMaxSelectable;
152
153
 
@@ -5,7 +5,7 @@ import { Button } from '@mui/material';
5
5
  import { iframe, TicketSelection } from '@seat-picker/seat-picker-sdk';
6
6
  import { useFormContext } from 'react-hook-form';
7
7
  import { ITicketForm, ITicketFormTicket, ITicketLocation } from '@utils/types/ticket.type';
8
- import { MAX_TICKETS_PER_ORDER } from '@utils/data/ticket';
8
+ import { getMaxTicketsPerOrder } from '@utils/data/ticket';
9
9
  import Iconify from '@components/iconify/Iconify';
10
10
 
11
11
  interface Props {
@@ -44,7 +44,7 @@ const TicketSelectionMap: React.FC<Props> = ({ event }) => {
44
44
  [] as { quantity: number; seat: ITicketLocation; ticket: any }[]
45
45
  );
46
46
 
47
- let remainingTicketCapacity = MAX_TICKETS_PER_ORDER;
47
+ let remainingTicketCapacity = getMaxTicketsPerOrder(event.id);
48
48
 
49
49
  for (const groupedSeat of groupedSeatsByZone) {
50
50
  if (remainingTicketCapacity <= 0) break;
@@ -4,7 +4,7 @@ import { fCurrency } from '@utils/formatNumber';
4
4
  import { IEvent } from '@utils/types/event.type';
5
5
  import { IReleaseShort } from '@utils/types/release.type';
6
6
  import { ITicketFormTicket } from '@utils/types/ticket.type';
7
- import { MAX_TICKETS_PER_ORDER } from '@utils/data/ticket';
7
+ import { getMaxTicketsPerOrder } from '@utils/data/ticket';
8
8
  import useGlobal from '@hooks/useGlobal';
9
9
  import { validatePrimaryTicketNumber } from '@modules/ticket';
10
10
  import ReleaseDescription from './ReleaseDescription';
@@ -33,6 +33,7 @@ const TicketSelectionMobile: React.FC<Props> = ({
33
33
  getExtraFields,
34
34
  }) => {
35
35
  const { t, lang } = useGlobal();
36
+ const maxTicketsPerOrder = getMaxTicketsPerOrder(event.id);
36
37
  const [expandedReleaseIds, setExpandedReleaseIds] = useState<Record<number, boolean>>({});
37
38
  const [pendingPrimaryRelease, setPendingPrimaryRelease] = useState<IReleaseShort | null>(null);
38
39
  const theme = useTheme();
@@ -53,7 +54,7 @@ const TicketSelectionMobile: React.FC<Props> = ({
53
54
  !release.locked || getReleaseQuantity(release.id) > 0;
54
55
 
55
56
  const incrementRelease = (release: IReleaseShort, primaryTicketNumber?: string) => {
56
- const maxAvailable = Math.min(release.availableTickets || 0, MAX_TICKETS_PER_ORDER);
57
+ const maxAvailable = Math.min(release.availableTickets || 0, maxTicketsPerOrder);
57
58
  const ticketIndex = getTicketIndexByRelease(release.id);
58
59
  const currentQuantity = ticketIndex >= 0 ? Number(tickets[ticketIndex]?.quantity || 0) : 0;
59
60
  const nextQuantity = Math.min(currentQuantity + 1, maxAvailable);
@@ -155,7 +156,7 @@ const TicketSelectionMobile: React.FC<Props> = ({
155
156
  .map((release) => {
156
157
  const quantity = getReleaseQuantity(release.id);
157
158
  const ticketIndex = getTicketIndexByRelease(release.id);
158
- const maxAvailable = Math.min(release.availableTickets || 0, MAX_TICKETS_PER_ORDER);
159
+ const maxAvailable = Math.min(release.availableTickets || 0, maxTicketsPerOrder);
159
160
  const isLocked = release.locked;
160
161
  const nextRelease = activeReleases?.find(
161
162
  (item) =>
@@ -8,7 +8,7 @@ import { IReleaseShort } from '@utils/types/release.type';
8
8
  import { IEvent } from '@utils/types/event.type';
9
9
  import ReleaseWithMerchandise from '@form/tickets/ReleaseWithMerchandise';
10
10
  import { EventType } from '@utils/data/event';
11
- import { MAX_TICKETS_PER_ORDER } from '@utils/data/ticket';
11
+ import { getMaxTicketsPerOrder } from '@utils/data/ticket';
12
12
  import useGlobal from '@hooks/useGlobal';
13
13
 
14
14
  interface Props {
@@ -17,6 +17,7 @@ interface Props {
17
17
 
18
18
  const TicketWithMerchandiseSelection: React.FC<Props> = ({ event }) => {
19
19
  const { t } = useGlobal();
20
+ const maxTicketsPerOrder = getMaxTicketsPerOrder(event.id);
20
21
  const { setValue, watch } = useFormContext<ITicketForm>();
21
22
  const tickets: ITicketFormTicket[] = useWatch({ name: `tickets.${event.id}`, defaultValue: [] });
22
23
  const eventTimeslotId = watch('eventTimeslotId');
@@ -43,7 +44,7 @@ const TicketWithMerchandiseSelection: React.FC<Props> = ({ event }) => {
43
44
  item2.releaseCategoryName === item.releaseCategoryName && item2.order === item.order + 1
44
45
  );
45
46
  const selected = tickets.find((ticket) => ticket.releaseId === item.id);
46
- const maxSelectable = Math.min(item.availableTickets || 0, MAX_TICKETS_PER_ORDER);
47
+ const maxSelectable = Math.min(item.availableTickets || 0, maxTicketsPerOrder);
47
48
 
48
49
  return (
49
50
  !!nextRelease &&
@@ -69,7 +70,7 @@ const TicketWithMerchandiseSelection: React.FC<Props> = ({ event }) => {
69
70
  tickets.find(
70
71
  (ticket) =>
71
72
  release.id === ticket.releaseId &&
72
- Number(ticket.quantity) >= Math.min(release.availableTickets || 0, MAX_TICKETS_PER_ORDER)
73
+ Number(ticket.quantity) >= Math.min(release.availableTickets || 0, maxTicketsPerOrder)
73
74
  )
74
75
  );
75
76
 
@@ -88,7 +89,7 @@ const TicketWithMerchandiseSelection: React.FC<Props> = ({ event }) => {
88
89
  const previousTicket = tickets.find((ticket) => ticket.releaseId === previousRelease.id);
89
90
  const previousMaxSelectable = Math.min(
90
91
  previousRelease.availableTickets || 0,
91
- MAX_TICKETS_PER_ORDER
92
+ maxTicketsPerOrder
92
93
  );
93
94
  const shouldUnlock = Number(previousTicket?.quantity || 0) >= previousMaxSelectable;
94
95
 
@@ -0,0 +1,14 @@
1
+ import useSWR from 'swr';
2
+ import { getStripeConfig } from '@modules/order';
3
+
4
+ // Fetches the public Stripe publishable key, only when a Stripe method is on
5
+ // offer (pass enabled=false to skip the request entirely). Cached for the
6
+ // session — the key never changes.
7
+ export default function useStripeConfig(enabled: boolean) {
8
+ const { data } = useSWR(enabled ? ['stripe-config'] : null, () => getStripeConfig(), {
9
+ revalidateOnFocus: false,
10
+ revalidateIfStale: false,
11
+ });
12
+
13
+ return { publishableKey: data?.publishableKey ?? null };
14
+ }
@@ -44,6 +44,9 @@ const cs = {
44
44
  total: 'Celkem',
45
45
  with_fee: 'vč. servisního poplatku',
46
46
  service_fee: 'Servisní poplatek',
47
+ payment_processing_fee: 'Poplatek za platbu kartou',
48
+ card_payment_title: 'Platba kartou',
49
+ card_payment_error: 'Platbu se nepodařilo dokončit. Zkuste to prosím znovu.',
47
50
  shipping_fee: 'Doprava',
48
51
  ticket_insurance: 'Pojištění vstupenek',
49
52
  price_including_service_fee: 'Cena zahrnuje servisní poplatek v hodnotě {{fee}}.',
@@ -44,6 +44,9 @@ const en = {
44
44
  total: 'Total',
45
45
  with_fee: 'incl. service fee',
46
46
  service_fee: 'Service fee',
47
+ payment_processing_fee: 'Card processing fee',
48
+ card_payment_title: 'Card payment',
49
+ card_payment_error: 'The payment could not be completed. Please try again.',
47
50
  shipping_fee: 'Shipping',
48
51
  ticket_insurance: 'Ticket insurance',
49
52
  price_including_service_fee: 'The price includes a service fee of {{fee}}.',
@@ -44,6 +44,9 @@ const es = {
44
44
  total: 'Total',
45
45
  with_fee: 'incl. tarifa de servicio',
46
46
  service_fee: 'Tarifa de servicio',
47
+ payment_processing_fee: 'Comisión por pago con tarjeta',
48
+ card_payment_title: 'Pago con tarjeta',
49
+ card_payment_error: 'No se pudo completar el pago. Inténtalo de nuevo.',
47
50
  shipping_fee: 'Envío',
48
51
  ticket_insurance: 'Seguro de entrada',
49
52
  price_including_service_fee: 'El precio incluye una tarifa de servicio de {{fee}}.',
@@ -44,6 +44,9 @@ const pl = {
44
44
  total: 'Razem',
45
45
  with_fee: 'z opłatą serwisową',
46
46
  service_fee: 'Opłata serwisowa',
47
+ payment_processing_fee: 'Opłata za obsługę karty',
48
+ card_payment_title: 'Płatność kartą',
49
+ card_payment_error: 'Nie udało się zrealizować płatności. Spróbuj ponownie.',
47
50
  shipping_fee: 'Wysyłka',
48
51
  ticket_insurance: 'Ubezpieczenie biletu',
49
52
  price_including_service_fee: 'Cena zawiera opłatę serwisową {{fee}}.',
@@ -44,6 +44,9 @@ const sk = {
44
44
  total: 'Spolu',
45
45
  with_fee: 'vrátane servisného poplatku',
46
46
  service_fee: 'Servisný poplatok',
47
+ payment_processing_fee: 'Poplatok za platbu kartou',
48
+ card_payment_title: 'Platba kartou',
49
+ card_payment_error: 'Platbu sa nepodarilo dokončiť. Skúste to znova.',
47
50
  shipping_fee: 'Doručenie',
48
51
  ticket_insurance: 'Poistenie vstupenky',
49
52
  price_including_service_fee: 'Cena zahŕňa servisný poplatok {{fee}}.',
@@ -44,6 +44,9 @@ const uk = {
44
44
  total: 'Всього',
45
45
  with_fee: 'вкл. сервісний збір',
46
46
  service_fee: 'Сервісний збір',
47
+ payment_processing_fee: 'Комісія за оплату карткою',
48
+ card_payment_title: 'Оплата карткою',
49
+ card_payment_error: 'Не вдалося завершити оплату. Спробуйте ще раз.',
47
50
  shipping_fee: 'Доставка',
48
51
  ticket_insurance: 'Страхування квитка',
49
52
  price_including_service_fee: 'Ціна включає сервісний збір {{fee}}.',
@@ -18,3 +18,6 @@ export const getAllowedPaymentMethods = (currency: Currencies, eventId?: number)
18
18
 
19
19
  export const postOrderPaid = (data: IOrderPaidData): Promise<IResponse<IOrderPaid>> =>
20
20
  api.post('/v1/orders/paid', data).then((res) => res.data.data);
21
+
22
+ export const getStripeConfig = (): Promise<{ publishableKey: string | null }> =>
23
+ api.get('/v1/orders/stripe/config').then((res) => res.data.data.data);
@@ -1 +1,11 @@
1
1
  export const MAX_TICKETS_PER_ORDER = 10;
2
+
3
+ // TODO(EVE-NN): temporary per-event overrides until the backend exposes a
4
+ // configurable maxTicketsPerOrder. Mirrors the same map in the backend's
5
+ // OrderService — keep the two in sync and remove BOTH once that column ships.
6
+ const PER_EVENT_TICKET_LIMITS: Record<number, number> = {
7
+ 1837: 2,
8
+ };
9
+
10
+ export const getMaxTicketsPerOrder = (eventId?: number): number =>
11
+ (eventId != null && PER_EVENT_TICKET_LIMITS[eventId]) || MAX_TICKETS_PER_ORDER;
@@ -23,6 +23,11 @@ export interface IOrder extends IBase {
23
23
 
24
24
  export interface IOrderCreate {
25
25
  gwUrl: string;
26
+ // Inline Stripe (Payment Element): set when the selected method confirms
27
+ // in-page instead of redirecting; the publishable key is returned alongside
28
+ // so the SDK can mount Elements without host-app configuration.
29
+ clientSecret: string | null;
30
+ publishableKey: string | null;
26
31
  tickets: ICreateTicket[];
27
32
  orderEntity: IOrder;
28
33
  customer: ICustomer;
@@ -14,6 +14,7 @@ export interface IPaymentMethod extends IBase {
14
14
  image: IFile;
15
15
  feeType: string;
16
16
  feeValue: number;
17
+ feeFixedValue: number;
17
18
  }
18
19
 
19
20
  export interface IPaymentOption extends IBase {