@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.
- package/dist/cjs/{index-DmK9RPSa.js → index-CXsZ9BsP.js} +50 -37
- package/dist/cjs/index-CXsZ9BsP.js.map +1 -0
- package/dist/cjs/index-DgOx9uHQ.js +41917 -0
- package/dist/cjs/index-DgOx9uHQ.js.map +1 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/{index.umd-DUMMTVwU.js → index.umd-DR37hmpO.js} +2 -2
- package/dist/cjs/{index.umd-DUMMTVwU.js.map → index.umd-DR37hmpO.js.map} +1 -1
- package/dist/cjs/index.umd-TbjzhsUx.js +13397 -0
- package/dist/cjs/index.umd-TbjzhsUx.js.map +1 -0
- package/dist/esm/index-Ds-63DcA.js +41896 -0
- package/dist/esm/index-Ds-63DcA.js.map +1 -0
- package/dist/esm/{index-C0HcmMMr.js → index-z31XSEKz.js} +50 -37
- package/dist/esm/index-z31XSEKz.js.map +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/{index.umd-BqJOlKvJ.js → index.umd-5znOX_Ww.js} +2 -2
- package/dist/esm/{index.umd-BqJOlKvJ.js.map → index.umd-5znOX_Ww.js.map} +1 -1
- package/dist/esm/index.umd-ddggyAGa.js +13395 -0
- package/dist/esm/index.umd-ddggyAGa.js.map +1 -0
- package/dist/types/form/Payment.d.ts +1 -0
- package/dist/types/form/payment/StripeCheckoutProvider.d.ts +36 -0
- package/dist/types/hooks/data/useStripeConfig.d.ts +3 -0
- package/dist/types/locales/cs.d.ts +3 -0
- package/dist/types/locales/en.d.ts +3 -0
- package/dist/types/locales/es.d.ts +3 -0
- package/dist/types/locales/pl.d.ts +3 -0
- package/dist/types/locales/sk.d.ts +3 -0
- package/dist/types/locales/uk.d.ts +3 -0
- package/dist/types/modules/order.d.ts +3 -0
- package/dist/types/utils/data/ticket.d.ts +1 -0
- package/dist/types/utils/types/order.type.d.ts +2 -0
- package/dist/types/utils/types/payment-method.type.d.ts +1 -0
- package/package.json +4 -2
- package/src/form/ChildEventCard.tsx +70 -64
- package/src/form/Payment.tsx +42 -3
- package/src/form/PaymentOverviewBox.tsx +20 -7
- package/src/form/TicketForm.tsx +262 -167
- package/src/form/payment/StripeCheckoutProvider.tsx +154 -0
- package/src/form/tickets/ReleaseWithMerchandise.tsx +7 -6
- package/src/form/tickets/TicketSelection.tsx +7 -6
- package/src/form/tickets/TicketSelectionMap.tsx +2 -2
- package/src/form/tickets/TicketSelectionMobile.tsx +4 -3
- package/src/form/tickets/TicketWithMerchandiseSelection.tsx +5 -4
- package/src/hooks/data/useStripeConfig.ts +14 -0
- package/src/locales/cs.tsx +3 -0
- package/src/locales/en.tsx +3 -0
- package/src/locales/es.tsx +3 -0
- package/src/locales/pl.tsx +3 -0
- package/src/locales/sk.tsx +3 -0
- package/src/locales/uk.tsx +3 -0
- package/src/modules/order.ts +3 -0
- package/src/utils/data/ticket.ts +10 -0
- package/src/utils/types/order.type.ts +5 -0
- package/src/utils/types/payment-method.type.ts +1 -0
- package/dist/cjs/index-DmK9RPSa.js.map +0 -1
- 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 {
|
|
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 >
|
|
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,
|
|
83
|
-
const remainingOrderCapacity = Math.max(0,
|
|
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,
|
|
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,
|
|
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 {
|
|
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,
|
|
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 >
|
|
114
|
-
: countSelectedTickets() + value >
|
|
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,
|
|
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
|
-
|
|
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 {
|
|
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 =
|
|
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 {
|
|
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,
|
|
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,
|
|
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 {
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
+
}
|
package/src/locales/cs.tsx
CHANGED
|
@@ -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}}.',
|
package/src/locales/en.tsx
CHANGED
|
@@ -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}}.',
|
package/src/locales/es.tsx
CHANGED
|
@@ -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}}.',
|
package/src/locales/pl.tsx
CHANGED
|
@@ -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}}.',
|
package/src/locales/sk.tsx
CHANGED
|
@@ -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}}.',
|
package/src/locales/uk.tsx
CHANGED
|
@@ -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}}.',
|
package/src/modules/order.ts
CHANGED
|
@@ -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);
|
package/src/utils/data/ticket.ts
CHANGED
|
@@ -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;
|