@eventlook/sdk 1.5.0-beta.7 → 1.5.0-beta.8
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/.claude/settings.local.json +6 -11
- package/dist/cjs/index-CUIxdwQn.js +38572 -0
- package/dist/cjs/index-CUIxdwQn.js.map +1 -0
- package/dist/cjs/{index-BAfaeq84.js → index-D5rQiSGP.js} +161 -72
- package/dist/cjs/index-D5rQiSGP.js.map +1 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/{index.umd-Bpwd9vUs.js → index.umd-BoFEW91M.js} +2 -2
- package/dist/cjs/{index.umd-Bpwd9vUs.js.map → index.umd-BoFEW91M.js.map} +1 -1
- package/dist/cjs/index.umd-BzSM62qM.js +13397 -0
- package/dist/cjs/index.umd-BzSM62qM.js.map +1 -0
- package/dist/esm/{index-CJ_gPli9.js → index-Cm7V8Zl3.js} +161 -72
- package/dist/esm/index-Cm7V8Zl3.js.map +1 -0
- package/dist/esm/index-fvLIN6eP.js +38569 -0
- package/dist/esm/index-fvLIN6eP.js.map +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/{index.umd-ewNTELOK.js → index.umd-BKBHcCnm.js} +2 -2
- package/dist/esm/{index.umd-ewNTELOK.js.map → index.umd-BKBHcCnm.js.map} +1 -1
- package/dist/esm/index.umd-bIV_YpEF.js +13395 -0
- package/dist/esm/index.umd-bIV_YpEF.js.map +1 -0
- package/dist/types/form/product/ProductVariantsDialog.d.ts +1 -0
- package/dist/types/form/tickets/TicketSelectionMobile.d.ts +0 -1
- package/dist/types/utils/data/ticket.d.ts +1 -0
- package/package.json +1 -1
- package/src/form/PaymentOverviewDrawer.tsx +1 -2
- package/src/form/Shipping.tsx +78 -80
- package/src/form/TicketForm.tsx +10 -8
- package/src/form/payment/PaymentOverviewCheckbox.tsx +60 -62
- package/src/form/product/ProductCard.tsx +5 -2
- package/src/form/product/ProductVariantsDialog.tsx +29 -6
- package/src/form/services/index.tsx +1 -2
- package/src/form/tickets/ReleaseWithMerchandise.tsx +46 -10
- package/src/form/tickets/TicketSelection.tsx +50 -17
- package/src/form/tickets/TicketSelectionMap.tsx +9 -1
- package/src/form/tickets/TicketSelectionMobile.tsx +78 -67
- package/src/form/tickets/TicketWithMerchandiseSelection.tsx +49 -31
- package/src/locales/cs.tsx +1 -1
- package/src/locales/en.tsx +1 -1
- package/src/locales/es.tsx +1 -1
- package/src/locales/pl.tsx +1 -1
- package/src/locales/sk.tsx +1 -1
- package/src/locales/uk.tsx +1 -1
- package/src/utils/data/ticket.ts +1 -0
- package/dist/cjs/index-BAfaeq84.js.map +0 -1
- package/dist/esm/index-CJ_gPli9.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useEffect, useRef
|
|
1
|
+
import React, { useEffect, useRef } from 'react';
|
|
2
2
|
import { useFormContext, useWatch } from 'react-hook-form';
|
|
3
3
|
import { Box, Divider, Stack, Typography } from '@mui/material';
|
|
4
4
|
import { ITicketForm, ITicketFormTicket } from '@utils/types/ticket.type';
|
|
@@ -9,6 +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
13
|
import useGlobal from '@hooks/useGlobal';
|
|
13
14
|
import TicketSelectionMobile from './TicketSelectionMobile';
|
|
14
15
|
|
|
@@ -25,7 +26,6 @@ const TicketSelection: React.FC<Props> = ({ event }) => {
|
|
|
25
26
|
defaultValue: [],
|
|
26
27
|
}) as ITicketFormTicket[];
|
|
27
28
|
const eventTimeslotId = watch('eventTimeslotId');
|
|
28
|
-
const [soldOutReleaseCategoryNames, setSoldOutReleaseCategoryNames] = useState<string[]>([]);
|
|
29
29
|
const isProcessingRef = useRef(false);
|
|
30
30
|
const { data: activeReleases, mutate } = useEventActiveReleases(
|
|
31
31
|
event.id,
|
|
@@ -68,7 +68,7 @@ const TicketSelection: React.FC<Props> = ({ event }) => {
|
|
|
68
68
|
// const getAvailableTicketsForRelease = (release: ITicketFormTicket): number => {
|
|
69
69
|
// const selectedRelease = activeReleases?.find((item) => item.id === release.releaseId);
|
|
70
70
|
// const availableQuantity = selectedRelease ? selectedRelease.availableTickets : 0;
|
|
71
|
-
// return availableQuantity >
|
|
71
|
+
// return availableQuantity > MAX_TICKETS_PER_ORDER ? MAX_TICKETS_PER_ORDER : availableQuantity;
|
|
72
72
|
// };
|
|
73
73
|
|
|
74
74
|
const countReleaseCategories = (): number => {
|
|
@@ -83,7 +83,15 @@ const TicketSelection: React.FC<Props> = ({ event }) => {
|
|
|
83
83
|
item2.releaseCategoryName === item.releaseCategoryName && item2.order === item.order + 1
|
|
84
84
|
);
|
|
85
85
|
const selected = tickets.find((ticket) => ticket.releaseId === item.id);
|
|
86
|
-
|
|
86
|
+
const maxSelectable = Math.min(item.availableTickets || 0, MAX_TICKETS_PER_ORDER);
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
!!nextRelease &&
|
|
90
|
+
item.locked &&
|
|
91
|
+
!!selected &&
|
|
92
|
+
Number(selected.quantity) >= maxSelectable &&
|
|
93
|
+
index + 1 == tickets.length
|
|
94
|
+
);
|
|
87
95
|
});
|
|
88
96
|
return lockedSelectedReleases && lockedSelectedReleases.includes(true);
|
|
89
97
|
};
|
|
@@ -102,8 +110,8 @@ const TicketSelection: React.FC<Props> = ({ event }) => {
|
|
|
102
110
|
const isQuantityDisabled = (value: number, releaseId: number | '') => {
|
|
103
111
|
const releaseSelected = tickets.find((item) => item.releaseId === releaseId);
|
|
104
112
|
return releaseSelected && releaseSelected.quantity
|
|
105
|
-
? countSelectedTickets() + value - releaseSelected.quantity >
|
|
106
|
-
: countSelectedTickets() + value >
|
|
113
|
+
? countSelectedTickets() + value - releaseSelected.quantity > MAX_TICKETS_PER_ORDER
|
|
114
|
+
: countSelectedTickets() + value > MAX_TICKETS_PER_ORDER;
|
|
107
115
|
};
|
|
108
116
|
|
|
109
117
|
const removeTicket = (indexToRemove: number) => {
|
|
@@ -113,21 +121,47 @@ const TicketSelection: React.FC<Props> = ({ event }) => {
|
|
|
113
121
|
|
|
114
122
|
const selectedTickets = async () => {
|
|
115
123
|
const releases = await mutate();
|
|
124
|
+
const currentReleases = releases || activeReleases || [];
|
|
116
125
|
const allFilled = tickets.filter((item) => !item.releaseId || !item.quantity);
|
|
117
126
|
|
|
118
|
-
const soldOutReleaseCategories =
|
|
127
|
+
const soldOutReleaseCategories = currentReleases.filter((release) =>
|
|
119
128
|
tickets.find(
|
|
120
129
|
(ticket) =>
|
|
121
130
|
release.id === ticket.releaseId &&
|
|
122
|
-
ticket.quantity
|
|
123
|
-
release.availableTickets !== 10
|
|
131
|
+
Number(ticket.quantity) >= Math.min(release.availableTickets || 0, MAX_TICKETS_PER_ORDER)
|
|
124
132
|
)
|
|
125
133
|
);
|
|
126
|
-
setSoldOutReleaseCategoryNames(
|
|
127
|
-
soldOutReleaseCategories?.map((item) => item.releaseCategoryName) || []
|
|
128
|
-
);
|
|
129
134
|
|
|
130
|
-
|
|
135
|
+
if (currentReleases.length) {
|
|
136
|
+
let hasChanges = false;
|
|
137
|
+
const updatedReleases = currentReleases.map((release) => {
|
|
138
|
+
const previousRelease = currentReleases.find(
|
|
139
|
+
(item) =>
|
|
140
|
+
item.releaseCategoryName === release.releaseCategoryName &&
|
|
141
|
+
item.order === release.order - 1
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
if (!release.locked || !previousRelease) return release;
|
|
145
|
+
|
|
146
|
+
const previousTicket = tickets.find((ticket) => ticket.releaseId === previousRelease.id);
|
|
147
|
+
const previousMaxSelectable = Math.min(
|
|
148
|
+
previousRelease.availableTickets || 0,
|
|
149
|
+
MAX_TICKETS_PER_ORDER
|
|
150
|
+
);
|
|
151
|
+
const shouldUnlock = Number(previousTicket?.quantity || 0) >= previousMaxSelectable;
|
|
152
|
+
|
|
153
|
+
if (!shouldUnlock) return release;
|
|
154
|
+
|
|
155
|
+
hasChanges = true;
|
|
156
|
+
return { ...release, locked: false };
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
if (hasChanges) {
|
|
160
|
+
await mutate(updatedReleases, false);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const hasSelectableRelease = currentReleases.some(
|
|
131
165
|
(release) => !isReleaseSelected(release.id) && !release.locked
|
|
132
166
|
);
|
|
133
167
|
|
|
@@ -136,9 +170,9 @@ const TicketSelection: React.FC<Props> = ({ event }) => {
|
|
|
136
170
|
selectedReleaseIsSoldOut(releases) &&
|
|
137
171
|
tickets.length < soldOutReleaseCategories.length + countUnlockedReleases() &&
|
|
138
172
|
!allFilled.length) ||
|
|
139
|
-
(
|
|
140
|
-
soldOutReleaseCategories
|
|
141
|
-
|
|
173
|
+
(currentReleases.length &&
|
|
174
|
+
soldOutReleaseCategories.length &&
|
|
175
|
+
currentReleases.length > tickets.length &&
|
|
142
176
|
tickets.length < soldOutReleaseCategories.length + countUnlockedReleases() &&
|
|
143
177
|
!allFilled.length) ||
|
|
144
178
|
(tickets.length < countReleaseCategories() && !allFilled.length);
|
|
@@ -184,7 +218,6 @@ const TicketSelection: React.FC<Props> = ({ event }) => {
|
|
|
184
218
|
event={event}
|
|
185
219
|
activeReleases={activeReleases}
|
|
186
220
|
showLoading={showLoading}
|
|
187
|
-
soldOutReleaseCategoryNames={soldOutReleaseCategoryNames}
|
|
188
221
|
tickets={tickets}
|
|
189
222
|
isQuantityDisabled={isQuantityDisabled}
|
|
190
223
|
setValue={setValue as (name: string, value: any) => void}
|
|
@@ -5,6 +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
9
|
import Iconify from '@components/iconify/Iconify';
|
|
9
10
|
|
|
10
11
|
interface Props {
|
|
@@ -43,11 +44,18 @@ const TicketSelectionMap: React.FC<Props> = ({ event }) => {
|
|
|
43
44
|
[] as { quantity: number; seat: ITicketLocation; ticket: any }[]
|
|
44
45
|
);
|
|
45
46
|
|
|
47
|
+
let remainingTicketCapacity = MAX_TICKETS_PER_ORDER;
|
|
48
|
+
|
|
46
49
|
for (const groupedSeat of groupedSeatsByZone) {
|
|
50
|
+
if (remainingTicketCapacity <= 0) break;
|
|
51
|
+
|
|
52
|
+
const quantity = Math.min(groupedSeat.quantity, remainingTicketCapacity);
|
|
53
|
+
remainingTicketCapacity -= quantity;
|
|
54
|
+
|
|
47
55
|
tickets.push({
|
|
48
56
|
releaseId: groupedSeat.ticket.id,
|
|
49
57
|
price: groupedSeat.ticket.price,
|
|
50
|
-
quantity
|
|
58
|
+
quantity,
|
|
51
59
|
itemName: `${groupedSeat.ticket.releaseCategoryName} - ${groupedSeat.ticket.name}`,
|
|
52
60
|
products: [],
|
|
53
61
|
extraFields: [],
|
|
@@ -4,6 +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
8
|
import useGlobal from '@hooks/useGlobal';
|
|
8
9
|
import ReleaseDescription from './ReleaseDescription';
|
|
9
10
|
import TicketQuantityControl from './TicketQuantityControl';
|
|
@@ -12,7 +13,6 @@ interface Props {
|
|
|
12
13
|
event: IEvent;
|
|
13
14
|
activeReleases?: IReleaseShort[];
|
|
14
15
|
showLoading: boolean;
|
|
15
|
-
soldOutReleaseCategoryNames: string[];
|
|
16
16
|
tickets: ITicketFormTicket[];
|
|
17
17
|
isQuantityDisabled: (value: number, releaseId: number | '') => boolean;
|
|
18
18
|
setValue: (name: string, value: any) => void;
|
|
@@ -24,7 +24,6 @@ const TicketSelectionMobile: React.FC<Props> = ({
|
|
|
24
24
|
event,
|
|
25
25
|
activeReleases,
|
|
26
26
|
showLoading,
|
|
27
|
-
soldOutReleaseCategoryNames,
|
|
28
27
|
tickets,
|
|
29
28
|
isQuantityDisabled,
|
|
30
29
|
setValue,
|
|
@@ -47,8 +46,11 @@ const TicketSelectionMobile: React.FC<Props> = ({
|
|
|
47
46
|
return Number(ticket?.quantity || 0);
|
|
48
47
|
};
|
|
49
48
|
|
|
49
|
+
const isReleaseVisible = (release: IReleaseShort) =>
|
|
50
|
+
!release.locked || getReleaseQuantity(release.id) > 0;
|
|
51
|
+
|
|
50
52
|
const updateReleaseQuantity = (release: IReleaseShort, nextQuantity: number) => {
|
|
51
|
-
const maxAvailable = Math.min(release.availableTickets || 0,
|
|
53
|
+
const maxAvailable = Math.min(release.availableTickets || 0, MAX_TICKETS_PER_ORDER);
|
|
52
54
|
const clampedQuantity = Math.max(0, Math.min(nextQuantity, maxAvailable));
|
|
53
55
|
const ticketIndex = getTicketIndexByRelease(release.id);
|
|
54
56
|
|
|
@@ -100,76 +102,85 @@ const TicketSelectionMobile: React.FC<Props> = ({
|
|
|
100
102
|
|
|
101
103
|
return (
|
|
102
104
|
<Stack spacing={2}>
|
|
103
|
-
{activeReleases
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
: fCurrency(release.price, lang, event.currency)}
|
|
105
|
+
{activeReleases
|
|
106
|
+
?.filter((release) => isReleaseVisible(release))
|
|
107
|
+
.map((release) => {
|
|
108
|
+
const quantity = getReleaseQuantity(release.id);
|
|
109
|
+
const ticketIndex = getTicketIndexByRelease(release.id);
|
|
110
|
+
const maxAvailable = Math.min(release.availableTickets || 0, MAX_TICKETS_PER_ORDER);
|
|
111
|
+
const isLocked = release.locked;
|
|
112
|
+
const nextRelease = activeReleases?.find(
|
|
113
|
+
(item) =>
|
|
114
|
+
item.releaseCategoryName === release.releaseCategoryName &&
|
|
115
|
+
item.order === release.order + 1
|
|
116
|
+
);
|
|
117
|
+
const hasSelectedNextRelease = !!nextRelease && getReleaseQuantity(nextRelease.id) > 0;
|
|
118
|
+
const isDisabled = hasSelectedNextRelease || (isLocked && quantity === 0);
|
|
119
|
+
const canAddFirst = maxAvailable > 0 && !isQuantityDisabled(1, release.id);
|
|
120
|
+
const canAddMore =
|
|
121
|
+
quantity < maxAvailable && !isQuantityDisabled(quantity + 1, release.id);
|
|
122
|
+
|
|
123
|
+
return (
|
|
124
|
+
<Box
|
|
125
|
+
key={release.id}
|
|
126
|
+
sx={{
|
|
127
|
+
pt: 1,
|
|
128
|
+
pr: 0.5,
|
|
129
|
+
pb: 0.5,
|
|
130
|
+
pl: 2,
|
|
131
|
+
borderRadius: 1,
|
|
132
|
+
bgcolor: (theme) => (isLight ? theme.palette.grey[100] : theme.palette.grey[800]),
|
|
133
|
+
}}
|
|
134
|
+
>
|
|
135
|
+
<Stack spacing={0}>
|
|
136
|
+
<Box>
|
|
137
|
+
<Typography variant="subtitle2" fontWeight={700}>
|
|
138
|
+
{getReleaseTitle(release)}
|
|
138
139
|
</Typography>
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
140
|
+
</Box>
|
|
141
|
+
|
|
142
|
+
<Stack direction="row" alignItems="center" justifyContent="space-between">
|
|
143
|
+
<Stack>
|
|
144
|
+
<Typography variant="body2">
|
|
145
|
+
{release.price === 0
|
|
146
|
+
? t('free')
|
|
147
|
+
: fCurrency(release.price, lang, event.currency)}{' '}
|
|
148
|
+
- {release.name}
|
|
149
|
+
</Typography>
|
|
150
|
+
|
|
151
|
+
<ReleaseDescription
|
|
152
|
+
description={release.description}
|
|
153
|
+
isExpanded={Boolean(expandedReleaseIds[release.id])}
|
|
154
|
+
onToggle={() => toggleReleaseDescription(release.id)}
|
|
155
|
+
moreInfoLabel={t('more_info')}
|
|
156
|
+
/>
|
|
157
|
+
</Stack>
|
|
158
|
+
|
|
159
|
+
<TicketQuantityControl
|
|
160
|
+
quantity={quantity}
|
|
161
|
+
isDisabled={isDisabled}
|
|
162
|
+
canAddFirst={canAddFirst}
|
|
163
|
+
canAddMore={canAddMore}
|
|
164
|
+
addLabel={t('add')}
|
|
165
|
+
onDecrement={() => updateReleaseQuantity(release, quantity - 1)}
|
|
166
|
+
onIncrement={() => updateReleaseQuantity(release, quantity + 1)}
|
|
167
|
+
onAddFirst={() => updateReleaseQuantity(release, 1)}
|
|
145
168
|
/>
|
|
146
169
|
</Stack>
|
|
147
170
|
|
|
148
|
-
<
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
onDecrement={() => updateReleaseQuantity(release, quantity - 1)}
|
|
155
|
-
onIncrement={() => updateReleaseQuantity(release, quantity + 1)}
|
|
156
|
-
onAddFirst={() => updateReleaseQuantity(release, 1)}
|
|
171
|
+
<ReleaseDescription
|
|
172
|
+
description={release.description}
|
|
173
|
+
isExpanded={Boolean(expandedReleaseIds[release.id])}
|
|
174
|
+
onToggle={() => toggleReleaseDescription(release.id)}
|
|
175
|
+
moreInfoLabel={t('more_info')}
|
|
176
|
+
showCollapse
|
|
157
177
|
/>
|
|
158
|
-
</Stack>
|
|
159
178
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
showCollapse
|
|
166
|
-
/>
|
|
167
|
-
|
|
168
|
-
{ticketIndex >= 0 && getExtraFields(release.id, ticketIndex)}
|
|
169
|
-
</Stack>
|
|
170
|
-
</Box>
|
|
171
|
-
);
|
|
172
|
-
})}
|
|
179
|
+
{ticketIndex >= 0 && getExtraFields(release.id, ticketIndex)}
|
|
180
|
+
</Stack>
|
|
181
|
+
</Box>
|
|
182
|
+
);
|
|
183
|
+
})}
|
|
173
184
|
</Stack>
|
|
174
185
|
);
|
|
175
186
|
};
|
|
@@ -8,6 +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
12
|
import useGlobal from '@hooks/useGlobal';
|
|
12
13
|
|
|
13
14
|
interface Props {
|
|
@@ -42,7 +43,15 @@ const TicketWithMerchandiseSelection: React.FC<Props> = ({ event }) => {
|
|
|
42
43
|
item2.releaseCategoryName === item.releaseCategoryName && item2.order === item.order + 1
|
|
43
44
|
);
|
|
44
45
|
const selected = tickets.find((ticket) => ticket.releaseId === item.id);
|
|
45
|
-
|
|
46
|
+
const maxSelectable = Math.min(item.availableTickets || 0, MAX_TICKETS_PER_ORDER);
|
|
47
|
+
|
|
48
|
+
return (
|
|
49
|
+
!!nextRelease &&
|
|
50
|
+
item.locked &&
|
|
51
|
+
!!selected &&
|
|
52
|
+
Number(selected.quantity) >= maxSelectable &&
|
|
53
|
+
index + 1 == tickets.length
|
|
54
|
+
);
|
|
46
55
|
});
|
|
47
56
|
return lockedSelectedReleases && lockedSelectedReleases.includes(true);
|
|
48
57
|
};
|
|
@@ -53,33 +62,40 @@ const TicketWithMerchandiseSelection: React.FC<Props> = ({ event }) => {
|
|
|
53
62
|
|
|
54
63
|
const selectedTickets = async () => {
|
|
55
64
|
const releases = await mutate();
|
|
65
|
+
const currentReleases = releases || activeReleases || [];
|
|
56
66
|
const allFilled = tickets.filter((item) => !item.releaseId || !item.quantity);
|
|
57
67
|
|
|
58
|
-
const soldOutReleaseCategories =
|
|
68
|
+
const soldOutReleaseCategories = currentReleases.filter((release) =>
|
|
59
69
|
tickets.find(
|
|
60
70
|
(ticket) =>
|
|
61
71
|
release.id === ticket.releaseId &&
|
|
62
|
-
ticket.quantity
|
|
63
|
-
release.availableTickets !== 10
|
|
72
|
+
Number(ticket.quantity) >= Math.min(release.availableTickets || 0, MAX_TICKETS_PER_ORDER)
|
|
64
73
|
)
|
|
65
74
|
);
|
|
66
75
|
|
|
67
76
|
// Unlock next releases when current release is sold out
|
|
68
|
-
if (
|
|
77
|
+
if (currentReleases.length) {
|
|
69
78
|
let hasChanges = false;
|
|
70
|
-
const updatedReleases =
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
79
|
+
const updatedReleases = currentReleases.map((release) => {
|
|
80
|
+
const previousRelease = currentReleases.find(
|
|
81
|
+
(item) =>
|
|
82
|
+
item.releaseCategoryName === release.releaseCategoryName &&
|
|
83
|
+
item.order === release.order - 1
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
if (!release.locked || !previousRelease) return release;
|
|
87
|
+
|
|
88
|
+
const previousTicket = tickets.find((ticket) => ticket.releaseId === previousRelease.id);
|
|
89
|
+
const previousMaxSelectable = Math.min(
|
|
90
|
+
previousRelease.availableTickets || 0,
|
|
91
|
+
MAX_TICKETS_PER_ORDER
|
|
77
92
|
);
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
93
|
+
const shouldUnlock = Number(previousTicket?.quantity || 0) >= previousMaxSelectable;
|
|
94
|
+
|
|
95
|
+
if (!shouldUnlock) return release;
|
|
96
|
+
|
|
97
|
+
hasChanges = true;
|
|
98
|
+
return { ...release, locked: false };
|
|
83
99
|
});
|
|
84
100
|
|
|
85
101
|
if (hasChanges) {
|
|
@@ -87,7 +103,7 @@ const TicketWithMerchandiseSelection: React.FC<Props> = ({ event }) => {
|
|
|
87
103
|
}
|
|
88
104
|
}
|
|
89
105
|
|
|
90
|
-
const hasSelectableRelease =
|
|
106
|
+
const hasSelectableRelease = currentReleases.some(
|
|
91
107
|
(release) => !isReleaseSelected(release.id) && !release.locked
|
|
92
108
|
);
|
|
93
109
|
|
|
@@ -96,9 +112,9 @@ const TicketWithMerchandiseSelection: React.FC<Props> = ({ event }) => {
|
|
|
96
112
|
selectedReleaseIsSoldOut(releases) &&
|
|
97
113
|
tickets.length < soldOutReleaseCategories.length + countUnlockedReleases() &&
|
|
98
114
|
!allFilled.length) ||
|
|
99
|
-
(
|
|
100
|
-
soldOutReleaseCategories
|
|
101
|
-
|
|
115
|
+
(currentReleases.length &&
|
|
116
|
+
soldOutReleaseCategories.length &&
|
|
117
|
+
currentReleases.length > tickets.length &&
|
|
102
118
|
tickets.length < soldOutReleaseCategories.length + countUnlockedReleases() &&
|
|
103
119
|
!allFilled.length) ||
|
|
104
120
|
(tickets.length < countReleaseCategories() && !allFilled.length);
|
|
@@ -145,16 +161,18 @@ const TicketWithMerchandiseSelection: React.FC<Props> = ({ event }) => {
|
|
|
145
161
|
}}
|
|
146
162
|
/>
|
|
147
163
|
) : (
|
|
148
|
-
activeReleases
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
164
|
+
activeReleases
|
|
165
|
+
?.filter((release) => !release.locked || isReleaseSelected(release.id))
|
|
166
|
+
.map((release, index) => (
|
|
167
|
+
<ReleaseWithMerchandise
|
|
168
|
+
key={release.id}
|
|
169
|
+
eventId={event.id}
|
|
170
|
+
release={release}
|
|
171
|
+
activeReleases={activeReleases}
|
|
172
|
+
currency={event.currency}
|
|
173
|
+
index={index}
|
|
174
|
+
/>
|
|
175
|
+
))
|
|
158
176
|
)}
|
|
159
177
|
{!activeReleases && event.type === EventType.RECURRING && (
|
|
160
178
|
<Typography variant="h5">{t('event.tickets.stepper.1.select_timeslot')}</Typography>
|
package/src/locales/cs.tsx
CHANGED
package/src/locales/en.tsx
CHANGED
package/src/locales/es.tsx
CHANGED
package/src/locales/pl.tsx
CHANGED
package/src/locales/sk.tsx
CHANGED
package/src/locales/uk.tsx
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const MAX_TICKETS_PER_ORDER = 10;
|