@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.
Files changed (44) hide show
  1. package/.claude/settings.local.json +6 -11
  2. package/dist/cjs/index-CUIxdwQn.js +38572 -0
  3. package/dist/cjs/index-CUIxdwQn.js.map +1 -0
  4. package/dist/cjs/{index-BAfaeq84.js → index-D5rQiSGP.js} +161 -72
  5. package/dist/cjs/index-D5rQiSGP.js.map +1 -0
  6. package/dist/cjs/index.js +1 -1
  7. package/dist/cjs/{index.umd-Bpwd9vUs.js → index.umd-BoFEW91M.js} +2 -2
  8. package/dist/cjs/{index.umd-Bpwd9vUs.js.map → index.umd-BoFEW91M.js.map} +1 -1
  9. package/dist/cjs/index.umd-BzSM62qM.js +13397 -0
  10. package/dist/cjs/index.umd-BzSM62qM.js.map +1 -0
  11. package/dist/esm/{index-CJ_gPli9.js → index-Cm7V8Zl3.js} +161 -72
  12. package/dist/esm/index-Cm7V8Zl3.js.map +1 -0
  13. package/dist/esm/index-fvLIN6eP.js +38569 -0
  14. package/dist/esm/index-fvLIN6eP.js.map +1 -0
  15. package/dist/esm/index.js +1 -1
  16. package/dist/esm/{index.umd-ewNTELOK.js → index.umd-BKBHcCnm.js} +2 -2
  17. package/dist/esm/{index.umd-ewNTELOK.js.map → index.umd-BKBHcCnm.js.map} +1 -1
  18. package/dist/esm/index.umd-bIV_YpEF.js +13395 -0
  19. package/dist/esm/index.umd-bIV_YpEF.js.map +1 -0
  20. package/dist/types/form/product/ProductVariantsDialog.d.ts +1 -0
  21. package/dist/types/form/tickets/TicketSelectionMobile.d.ts +0 -1
  22. package/dist/types/utils/data/ticket.d.ts +1 -0
  23. package/package.json +1 -1
  24. package/src/form/PaymentOverviewDrawer.tsx +1 -2
  25. package/src/form/Shipping.tsx +78 -80
  26. package/src/form/TicketForm.tsx +10 -8
  27. package/src/form/payment/PaymentOverviewCheckbox.tsx +60 -62
  28. package/src/form/product/ProductCard.tsx +5 -2
  29. package/src/form/product/ProductVariantsDialog.tsx +29 -6
  30. package/src/form/services/index.tsx +1 -2
  31. package/src/form/tickets/ReleaseWithMerchandise.tsx +46 -10
  32. package/src/form/tickets/TicketSelection.tsx +50 -17
  33. package/src/form/tickets/TicketSelectionMap.tsx +9 -1
  34. package/src/form/tickets/TicketSelectionMobile.tsx +78 -67
  35. package/src/form/tickets/TicketWithMerchandiseSelection.tsx +49 -31
  36. package/src/locales/cs.tsx +1 -1
  37. package/src/locales/en.tsx +1 -1
  38. package/src/locales/es.tsx +1 -1
  39. package/src/locales/pl.tsx +1 -1
  40. package/src/locales/sk.tsx +1 -1
  41. package/src/locales/uk.tsx +1 -1
  42. package/src/utils/data/ticket.ts +1 -0
  43. package/dist/cjs/index-BAfaeq84.js.map +0 -1
  44. package/dist/esm/index-CJ_gPli9.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useRef, useState } from 'react';
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 > 10 ? 10 : 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
- return !!nextRelease && item.locked && !!selected && index + 1 == tickets.length;
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 > 10
106
- : countSelectedTickets() + value > 10;
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 = activeReleases?.filter((release) =>
127
+ const soldOutReleaseCategories = currentReleases.filter((release) =>
119
128
  tickets.find(
120
129
  (ticket) =>
121
130
  release.id === ticket.releaseId &&
122
- ticket.quantity === release.availableTickets &&
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
- const hasSelectableRelease = activeReleases?.some(
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
- (activeReleases &&
140
- soldOutReleaseCategories?.length &&
141
- activeReleases?.length > tickets.length &&
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: groupedSeat.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, 10);
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?.map((release) => {
104
- const quantity = getReleaseQuantity(release.id);
105
- const ticketIndex = getTicketIndexByRelease(release.id);
106
- const maxAvailable = Math.min(release.availableTickets || 0, 10);
107
- const isLocked =
108
- release.locked && !soldOutReleaseCategoryNames.includes(release.releaseCategoryName);
109
- const isDisabled = isLocked && quantity === 0;
110
- const canAddFirst = maxAvailable > 0 && !isQuantityDisabled(1, release.id);
111
- const canAddMore = quantity < maxAvailable && !isQuantityDisabled(quantity + 1, release.id);
112
-
113
- return (
114
- <Box
115
- key={release.id}
116
- sx={{
117
- pt: 1,
118
- pr: 0.5,
119
- pb: 0.5,
120
- pl: 2,
121
- borderRadius: 1,
122
- bgcolor: (theme) => (isLight ? theme.palette.grey[100] : theme.palette.grey[800]),
123
- }}
124
- >
125
- <Stack spacing={0}>
126
- <Box>
127
- <Typography variant="subtitle2" fontWeight={700}>
128
- {getReleaseTitle(release)}
129
- </Typography>
130
- </Box>
131
-
132
- <Stack direction="row" alignItems="center" justifyContent="space-between">
133
- <Stack>
134
- <Typography variant="body2">
135
- {release.price === 0
136
- ? t('free')
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
- <ReleaseDescription
141
- description={release.description}
142
- isExpanded={Boolean(expandedReleaseIds[release.id])}
143
- onToggle={() => toggleReleaseDescription(release.id)}
144
- moreInfoLabel={t('more_info')}
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
- <TicketQuantityControl
149
- quantity={quantity}
150
- isDisabled={isDisabled}
151
- canAddFirst={canAddFirst}
152
- canAddMore={canAddMore}
153
- addLabel={t('add')}
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
- <ReleaseDescription
161
- description={release.description}
162
- isExpanded={Boolean(expandedReleaseIds[release.id])}
163
- onToggle={() => toggleReleaseDescription(release.id)}
164
- moreInfoLabel={t('more_info')}
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
- return !!nextRelease && item.locked && !!selected && index + 1 == tickets.length;
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 = activeReleases?.filter((release) =>
68
+ const soldOutReleaseCategories = currentReleases.filter((release) =>
59
69
  tickets.find(
60
70
  (ticket) =>
61
71
  release.id === ticket.releaseId &&
62
- ticket.quantity === release.availableTickets &&
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 (soldOutReleaseCategories?.length && activeReleases) {
77
+ if (currentReleases.length) {
69
78
  let hasChanges = false;
70
- const updatedReleases = activeReleases.map((release) => {
71
- // For each sold-out release, find and unlock the next one
72
- const soldOutRelease = soldOutReleaseCategories.find(
73
- (soldOut) =>
74
- soldOut.releaseCategoryName === release.releaseCategoryName &&
75
- soldOut.order === release.order - 1 &&
76
- release.locked
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
- if (soldOutRelease) {
79
- hasChanges = true;
80
- return { ...release, locked: false };
81
- }
82
- return release;
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 = activeReleases?.some(
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
- (activeReleases &&
100
- soldOutReleaseCategories?.length &&
101
- activeReleases?.length > tickets.length &&
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?.map((release, index) => (
149
- <ReleaseWithMerchandise
150
- key={release.id}
151
- eventId={event.id}
152
- release={release}
153
- activeReleases={activeReleases}
154
- currency={event.currency}
155
- index={index}
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>
@@ -112,7 +112,7 @@ const cs = {
112
112
  title: 'Přidružené eventy',
113
113
  },
114
114
  8: {
115
- title: 'EventLook služby',
115
+ title: 'Dodatečné služby',
116
116
  additional_info: 'Více informací ke službám',
117
117
  },
118
118
  },
@@ -112,7 +112,7 @@ const en = {
112
112
  title: 'Associated events',
113
113
  },
114
114
  8: {
115
- title: 'EventLook services',
115
+ title: 'Additional services',
116
116
  additional_info: 'More information about services',
117
117
  },
118
118
  },
@@ -112,7 +112,7 @@ const es = {
112
112
  title: 'Eventos asociados',
113
113
  },
114
114
  8: {
115
- title: 'EventLook servicios',
115
+ title: 'Servicios adicionales',
116
116
  additional_info: 'Más información sobre los servicios',
117
117
  },
118
118
  },
@@ -112,7 +112,7 @@ const pl = {
112
112
  title: 'Powiązane wydarzenia',
113
113
  },
114
114
  8: {
115
- title: 'EventLook usługi',
115
+ title: 'Usługi dodatkowe',
116
116
  additional_info: 'Więcej informacji o usługach',
117
117
  },
118
118
  },
@@ -112,7 +112,7 @@ const sk = {
112
112
  title: 'Pridružené eventy',
113
113
  },
114
114
  8: {
115
- title: 'EventLook služby',
115
+ title: 'Dodatočné služby',
116
116
  additional_info: 'Viac informácií o službách',
117
117
  },
118
118
  },
@@ -112,7 +112,7 @@ const uk = {
112
112
  title: 'Пов’язані події',
113
113
  },
114
114
  8: {
115
- title: 'EventLook послуги',
115
+ title: 'Додаткові послуги',
116
116
  additional_info: 'Додаткова інформація про послуги',
117
117
  },
118
118
  },
@@ -0,0 +1 @@
1
+ export const MAX_TICKETS_PER_ORDER = 10;