@eventlook/sdk 1.4.46-beta.7 → 1.4.46

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 (228) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/dist/cjs/components/Image.js +29 -14
  3. package/dist/cjs/components/Image.js.map +1 -1
  4. package/dist/cjs/components/hook-form/FormProvider.js +2 -2
  5. package/dist/cjs/components/hook-form/FormProvider.js.map +1 -1
  6. package/dist/cjs/form/ChildEventDialog.js +3 -3
  7. package/dist/cjs/form/ChildEventDialog.js.map +1 -1
  8. package/dist/cjs/form/ContactPerson.js +1 -1
  9. package/dist/cjs/form/ContactPerson.js.map +1 -1
  10. package/dist/cjs/form/Payment.js +2 -2
  11. package/dist/cjs/form/Payment.js.map +1 -1
  12. package/dist/cjs/form/PaymentOverviewBox.js +61 -47
  13. package/dist/cjs/form/PaymentOverviewBox.js.map +1 -1
  14. package/dist/cjs/form/PaymentPending.js +4 -1
  15. package/dist/cjs/form/PaymentPending.js.map +1 -1
  16. package/dist/cjs/form/ReleaseWithMerchandise.js +48 -57
  17. package/dist/cjs/form/ReleaseWithMerchandise.js.map +1 -1
  18. package/dist/cjs/form/TicketForm.js +25 -43
  19. package/dist/cjs/form/TicketForm.js.map +1 -1
  20. package/dist/cjs/form/TicketSelection.js +6 -5
  21. package/dist/cjs/form/TicketSelection.js.map +1 -1
  22. package/dist/cjs/form/TicketWithMerchandiseSelection.js +5 -3
  23. package/dist/cjs/form/TicketWithMerchandiseSelection.js.map +1 -1
  24. package/dist/cjs/form/index.js +1 -1
  25. package/dist/cjs/form/index.js.map +1 -1
  26. package/dist/cjs/form/payment/FeeBox.js +16 -4
  27. package/dist/cjs/form/payment/FeeBox.js.map +1 -1
  28. package/dist/cjs/form/payment/PaymentOverviewCheckbox.js +28 -34
  29. package/dist/cjs/form/payment/PaymentOverviewCheckbox.js.map +1 -1
  30. package/dist/cjs/form/product/ProductCard.js +36 -117
  31. package/dist/cjs/form/product/ProductCard.js.map +1 -1
  32. package/dist/cjs/form/product/ProductVariantsDialog.js +96 -158
  33. package/dist/cjs/form/product/ProductVariantsDialog.js.map +1 -1
  34. package/dist/cjs/locales/cs.js +2 -17
  35. package/dist/cjs/locales/cs.js.map +1 -1
  36. package/dist/cjs/locales/en.js +2 -17
  37. package/dist/cjs/locales/en.js.map +1 -1
  38. package/dist/cjs/locales/es.js +1 -16
  39. package/dist/cjs/locales/es.js.map +1 -1
  40. package/dist/cjs/locales/pl.js +1 -16
  41. package/dist/cjs/locales/pl.js.map +1 -1
  42. package/dist/cjs/locales/sk.js +1 -16
  43. package/dist/cjs/locales/sk.js.map +1 -1
  44. package/dist/cjs/locales/uk.js +1 -16
  45. package/dist/cjs/locales/uk.js.map +1 -1
  46. package/dist/cjs/utils/data/global.js +0 -2
  47. package/dist/cjs/utils/data/global.js.map +1 -1
  48. package/dist/esm/components/Image.js +30 -15
  49. package/dist/esm/components/Image.js.map +1 -1
  50. package/dist/esm/components/hook-form/FormProvider.js +2 -2
  51. package/dist/esm/components/hook-form/FormProvider.js.map +1 -1
  52. package/dist/esm/form/ChildEventDialog.js +3 -3
  53. package/dist/esm/form/ChildEventDialog.js.map +1 -1
  54. package/dist/esm/form/ContactPerson.js +1 -1
  55. package/dist/esm/form/ContactPerson.js.map +1 -1
  56. package/dist/esm/form/Payment.js +2 -2
  57. package/dist/esm/form/Payment.js.map +1 -1
  58. package/dist/esm/form/PaymentOverviewBox.js +62 -48
  59. package/dist/esm/form/PaymentOverviewBox.js.map +1 -1
  60. package/dist/esm/form/PaymentPending.js +4 -1
  61. package/dist/esm/form/PaymentPending.js.map +1 -1
  62. package/dist/esm/form/ReleaseWithMerchandise.js +49 -58
  63. package/dist/esm/form/ReleaseWithMerchandise.js.map +1 -1
  64. package/dist/esm/form/TicketForm.js +27 -45
  65. package/dist/esm/form/TicketForm.js.map +1 -1
  66. package/dist/esm/form/TicketSelection.js +6 -5
  67. package/dist/esm/form/TicketSelection.js.map +1 -1
  68. package/dist/esm/form/TicketWithMerchandiseSelection.js +6 -4
  69. package/dist/esm/form/TicketWithMerchandiseSelection.js.map +1 -1
  70. package/dist/esm/form/index.js +1 -1
  71. package/dist/esm/form/index.js.map +1 -1
  72. package/dist/esm/form/payment/FeeBox.js +17 -5
  73. package/dist/esm/form/payment/FeeBox.js.map +1 -1
  74. package/dist/esm/form/payment/PaymentOverviewCheckbox.js +30 -36
  75. package/dist/esm/form/payment/PaymentOverviewCheckbox.js.map +1 -1
  76. package/dist/esm/form/product/ProductCard.js +37 -118
  77. package/dist/esm/form/product/ProductCard.js.map +1 -1
  78. package/dist/esm/form/product/ProductVariantsDialog.js +98 -160
  79. package/dist/esm/form/product/ProductVariantsDialog.js.map +1 -1
  80. package/dist/esm/locales/cs.js +2 -17
  81. package/dist/esm/locales/cs.js.map +1 -1
  82. package/dist/esm/locales/en.js +2 -17
  83. package/dist/esm/locales/en.js.map +1 -1
  84. package/dist/esm/locales/es.js +1 -16
  85. package/dist/esm/locales/es.js.map +1 -1
  86. package/dist/esm/locales/pl.js +1 -16
  87. package/dist/esm/locales/pl.js.map +1 -1
  88. package/dist/esm/locales/sk.js +1 -16
  89. package/dist/esm/locales/sk.js.map +1 -1
  90. package/dist/esm/locales/uk.js +1 -16
  91. package/dist/esm/locales/uk.js.map +1 -1
  92. package/dist/esm/utils/data/global.js +1 -2
  93. package/dist/esm/utils/data/global.js.map +1 -1
  94. package/dist/types/components/Image.d.ts +4 -4
  95. package/dist/types/form/style.d.ts +1 -1
  96. package/package.json +2 -8
  97. package/rollup.config.mjs +0 -2
  98. package/src/components/Image.tsx +48 -27
  99. package/src/components/hook-form/FormProvider.tsx +2 -5
  100. package/src/form/ChildEventDialog.tsx +3 -3
  101. package/src/form/ContactPerson.tsx +1 -1
  102. package/src/form/MerchandiseSelection.tsx +29 -0
  103. package/src/form/Payment.tsx +2 -2
  104. package/src/form/PaymentOverviewBox.tsx +122 -89
  105. package/src/form/PaymentPending.tsx +1 -1
  106. package/src/form/ReleaseWithMerchandise.tsx +230 -0
  107. package/src/form/TicketForm.tsx +25 -63
  108. package/src/form/{tickets/TicketSelection.tsx → TicketSelection.tsx} +128 -24
  109. package/src/form/{tickets/TicketSelectionMap.tsx → TicketSelectionMap.tsx} +1 -9
  110. package/src/form/{tickets/TicketWithMerchandiseSelection.tsx → TicketWithMerchandiseSelection.tsx} +7 -3
  111. package/src/form/index.tsx +1 -3
  112. package/src/form/payment/FeeBox.tsx +31 -4
  113. package/src/form/payment/PaymentOverviewCheckbox.tsx +56 -57
  114. package/src/form/product/ProductCard.tsx +59 -179
  115. package/src/form/product/ProductVariantsDialog.tsx +140 -253
  116. package/src/locales/cs.tsx +2 -17
  117. package/src/locales/en.tsx +2 -17
  118. package/src/locales/es.tsx +1 -16
  119. package/src/locales/pl.tsx +1 -16
  120. package/src/locales/sk.tsx +1 -16
  121. package/src/locales/uk.tsx +1 -16
  122. package/src/utils/data/global.ts +0 -1
  123. package/tsconfig.json +1 -2
  124. package/.env.example +0 -1
  125. package/dist/cjs/_virtual/_commonjsHelpers.js +0 -8
  126. package/dist/cjs/_virtual/_commonjsHelpers.js.map +0 -1
  127. package/dist/cjs/_virtual/index.js +0 -6
  128. package/dist/cjs/_virtual/index.js.map +0 -1
  129. package/dist/cjs/_virtual/index2.js +0 -6
  130. package/dist/cjs/_virtual/index2.js.map +0 -1
  131. package/dist/cjs/_virtual/index3.js +0 -6
  132. package/dist/cjs/_virtual/index3.js.map +0 -1
  133. package/dist/cjs/_virtual/react-is.development.js +0 -6
  134. package/dist/cjs/_virtual/react-is.development.js.map +0 -1
  135. package/dist/cjs/_virtual/react-is.development2.js +0 -6
  136. package/dist/cjs/_virtual/react-is.development2.js.map +0 -1
  137. package/dist/cjs/_virtual/react-is.production.js +0 -6
  138. package/dist/cjs/_virtual/react-is.production.js.map +0 -1
  139. package/dist/cjs/_virtual/react-is.production.min.js +0 -6
  140. package/dist/cjs/_virtual/react-is.production.min.js.map +0 -1
  141. package/dist/cjs/form/PaymentOverviewDrawer.js +0 -149
  142. package/dist/cjs/form/PaymentOverviewDrawer.js.map +0 -1
  143. package/dist/cjs/form/TicketQuantityControl.js +0 -51
  144. package/dist/cjs/form/TicketQuantityControl.js.map +0 -1
  145. package/dist/cjs/form/TicketSelectionMobile.js +0 -98
  146. package/dist/cjs/form/TicketSelectionMobile.js.map +0 -1
  147. package/dist/cjs/form/merchandise/MerchandiseSelection.js +0 -14
  148. package/dist/cjs/form/merchandise/MerchandiseSelection.js.map +0 -1
  149. package/dist/cjs/form/merchandise/MerchandiseSlider.js +0 -40
  150. package/dist/cjs/form/merchandise/MerchandiseSlider.js.map +0 -1
  151. package/dist/cjs/form/merchendise/MerchandiseSelection.js +0 -19
  152. package/dist/cjs/form/merchendise/MerchandiseSelection.js.map +0 -1
  153. package/dist/cjs/form/merchendise/MerchandiseSlider.js +0 -75
  154. package/dist/cjs/form/merchendise/MerchandiseSlider.js.map +0 -1
  155. package/dist/cjs/form/services/index.js +0 -134
  156. package/dist/cjs/form/services/index.js.map +0 -1
  157. package/dist/cjs/form/tickets/ReleaseDescription.js +0 -23
  158. package/dist/cjs/form/tickets/ReleaseDescription.js.map +0 -1
  159. package/dist/cjs/form/tickets/ReleaseWithMerchandise.js +0 -141
  160. package/dist/cjs/form/tickets/ReleaseWithMerchandise.js.map +0 -1
  161. package/dist/cjs/form/tickets/TicketQuantityControl.js +0 -52
  162. package/dist/cjs/form/tickets/TicketQuantityControl.js.map +0 -1
  163. package/dist/cjs/form/tickets/TicketSelection.js +0 -139
  164. package/dist/cjs/form/tickets/TicketSelection.js.map +0 -1
  165. package/dist/cjs/form/tickets/TicketSelectionMap.js +0 -73
  166. package/dist/cjs/form/tickets/TicketSelectionMap.js.map +0 -1
  167. package/dist/cjs/form/tickets/TicketSelectionMobile.js +0 -90
  168. package/dist/cjs/form/tickets/TicketSelectionMobile.js.map +0 -1
  169. package/dist/cjs/form/tickets/TicketWithMerchandiseSelection.js +0 -117
  170. package/dist/cjs/form/tickets/TicketWithMerchandiseSelection.js.map +0 -1
  171. package/dist/esm/_virtual/_commonjsHelpers.js +0 -6
  172. package/dist/esm/_virtual/_commonjsHelpers.js.map +0 -1
  173. package/dist/esm/_virtual/index.js +0 -4
  174. package/dist/esm/_virtual/index.js.map +0 -1
  175. package/dist/esm/_virtual/index2.js +0 -4
  176. package/dist/esm/_virtual/index2.js.map +0 -1
  177. package/dist/esm/_virtual/index3.js +0 -4
  178. package/dist/esm/_virtual/index3.js.map +0 -1
  179. package/dist/esm/_virtual/react-is.development.js +0 -4
  180. package/dist/esm/_virtual/react-is.development.js.map +0 -1
  181. package/dist/esm/_virtual/react-is.development2.js +0 -4
  182. package/dist/esm/_virtual/react-is.development2.js.map +0 -1
  183. package/dist/esm/_virtual/react-is.production.js +0 -4
  184. package/dist/esm/_virtual/react-is.production.js.map +0 -1
  185. package/dist/esm/_virtual/react-is.production.min.js +0 -4
  186. package/dist/esm/_virtual/react-is.production.min.js.map +0 -1
  187. package/dist/esm/form/PaymentOverviewDrawer.js +0 -145
  188. package/dist/esm/form/PaymentOverviewDrawer.js.map +0 -1
  189. package/dist/esm/form/TicketQuantityControl.js +0 -47
  190. package/dist/esm/form/TicketQuantityControl.js.map +0 -1
  191. package/dist/esm/form/TicketSelectionMobile.js +0 -94
  192. package/dist/esm/form/TicketSelectionMobile.js.map +0 -1
  193. package/dist/esm/form/merchandise/MerchandiseSelection.js +0 -10
  194. package/dist/esm/form/merchandise/MerchandiseSelection.js.map +0 -1
  195. package/dist/esm/form/merchandise/MerchandiseSlider.js +0 -36
  196. package/dist/esm/form/merchandise/MerchandiseSlider.js.map +0 -1
  197. package/dist/esm/form/merchendise/MerchandiseSelection.js +0 -15
  198. package/dist/esm/form/merchendise/MerchandiseSelection.js.map +0 -1
  199. package/dist/esm/form/merchendise/MerchandiseSlider.js +0 -71
  200. package/dist/esm/form/merchendise/MerchandiseSlider.js.map +0 -1
  201. package/dist/esm/form/services/index.js +0 -130
  202. package/dist/esm/form/services/index.js.map +0 -1
  203. package/dist/esm/form/tickets/ReleaseDescription.js +0 -19
  204. package/dist/esm/form/tickets/ReleaseDescription.js.map +0 -1
  205. package/dist/esm/form/tickets/ReleaseWithMerchandise.js +0 -137
  206. package/dist/esm/form/tickets/ReleaseWithMerchandise.js.map +0 -1
  207. package/dist/esm/form/tickets/TicketQuantityControl.js +0 -48
  208. package/dist/esm/form/tickets/TicketQuantityControl.js.map +0 -1
  209. package/dist/esm/form/tickets/TicketSelection.js +0 -135
  210. package/dist/esm/form/tickets/TicketSelection.js.map +0 -1
  211. package/dist/esm/form/tickets/TicketSelectionMap.js +0 -69
  212. package/dist/esm/form/tickets/TicketSelectionMap.js.map +0 -1
  213. package/dist/esm/form/tickets/TicketSelectionMobile.js +0 -86
  214. package/dist/esm/form/tickets/TicketSelectionMobile.js.map +0 -1
  215. package/dist/esm/form/tickets/TicketWithMerchandiseSelection.js +0 -113
  216. package/dist/esm/form/tickets/TicketWithMerchandiseSelection.js.map +0 -1
  217. package/dist/types/form/PaymentOverviewDrawer.d.ts +0 -8
  218. package/dist/types/form/merchendise/MerchandiseSelection.d.ts +0 -9
  219. package/dist/types/form/merchendise/MerchandiseSlider.d.ts +0 -10
  220. package/dist/types/form/merchendise/MerchendiseSlider.d.ts +0 -0
  221. package/src/form/PaymentOverviewDrawer.tsx +0 -228
  222. package/src/form/merchandise/MerchandiseSelection.tsx +0 -24
  223. package/src/form/merchandise/MerchandiseSlider.tsx +0 -62
  224. package/src/form/services/index.tsx +0 -263
  225. package/src/form/tickets/ReleaseDescription.tsx +0 -46
  226. package/src/form/tickets/ReleaseWithMerchandise.tsx +0 -239
  227. package/src/form/tickets/TicketQuantityControl.tsx +0 -94
  228. package/src/form/tickets/TicketSelectionMobile.tsx +0 -177
@@ -0,0 +1,230 @@
1
+ import React, { useCallback, useState } from 'react';
2
+ import { Box, Button, IconButton, Stack, Typography } from '@mui/material';
3
+ import { Iconify } from '@components/iconify';
4
+ import ProductVariantsDialog from '@form/product/ProductVariantsDialog';
5
+ import { IReleaseShort } from '@utils/types/release.type';
6
+ import { ITicketForm, ITicketFormTicket } from '@utils/types/ticket.type';
7
+ import { useFormContext, useWatch } from 'react-hook-form';
8
+ import { IEventProductForm } from '@utils/types/product.type';
9
+ import { fCurrency } from '@utils/formatNumber';
10
+ import { Currencies } from '@utils/data/currency';
11
+ import { getSelectedQuantityByVariant } from '@utils/product';
12
+ import ReleaseExtraFields from '@form/extra-field/ReleaseExtraFields';
13
+ import useGlobal from '@hooks/useGlobal.ts';
14
+
15
+ interface Props {
16
+ eventId: number;
17
+ release: IReleaseShort;
18
+ activeReleases: IReleaseShort[];
19
+ currency: Currencies;
20
+ index: number;
21
+ }
22
+
23
+ const ReleaseWithMerchandise: React.FC<Props> = ({
24
+ eventId,
25
+ release,
26
+ activeReleases,
27
+ currency,
28
+ index,
29
+ }) => {
30
+ const { t, lang } = useGlobal();
31
+ const [openVariantDialog, setOpenVariantDialog] = useState<'add' | 'increase' | null>(null);
32
+ const { setValue } = useFormContext<ITicketForm>();
33
+ const tickets: ITicketFormTicket[] = useWatch({ name: `tickets.${eventId}`, defaultValue: [] });
34
+ const products: IEventProductForm[] = useWatch({ name: `products.${eventId}`, defaultValue: [] });
35
+ const addedRelease = tickets.find((ticket) => ticket.releaseId === release.id);
36
+ const countTickets = addedRelease?.quantity || 0;
37
+
38
+ const isReleaseSelected = (id: number) => !!tickets.find((ticket) => ticket.releaseId === id);
39
+
40
+ const getSelectedQuantity = (id: number) =>
41
+ tickets.find((ticket) => ticket.releaseId === id)?.quantity || 0;
42
+
43
+ const getAvailableTicketsForRelease = (release: ITicketFormTicket): number => {
44
+ const selectedRelease = activeReleases?.find((item) => item.id === release.releaseId);
45
+ const availableQuantity = selectedRelease ? selectedRelease.availableTickets : 0;
46
+ return availableQuantity > 10 ? 10 : availableQuantity;
47
+ };
48
+
49
+ const isMaxQuantity = (releaseId: number) => {
50
+ const release = tickets.find((ticket) => ticket.releaseId === releaseId);
51
+ if (!release) return false;
52
+ return getSelectedQuantity(releaseId) >= getAvailableTicketsForRelease(release);
53
+ };
54
+
55
+ const addRelease = (product?: IEventProductForm) => {
56
+ setValue(`tickets.${eventId}`, [
57
+ ...tickets,
58
+ {
59
+ releaseId: release.id,
60
+ quantity: 1,
61
+ itemName: '',
62
+ price: 0,
63
+ products: product ? [product] : [],
64
+ extraFields: release.extraFields?.length
65
+ ? [
66
+ release.extraFields.map((field) => ({
67
+ eventExtraFieldId: field.id,
68
+ value: '',
69
+ })),
70
+ ]
71
+ : [],
72
+ },
73
+ ]);
74
+ setOpenVariantDialog(null);
75
+ };
76
+
77
+ const increaseQuantity = (product?: IEventProductForm) => {
78
+ const addedRelease = tickets.find((ticket) => ticket.releaseId === release.id);
79
+ if (addedRelease) {
80
+ const newQuantity = Number(addedRelease.quantity) + 1;
81
+ const maxQuantity = getAvailableTicketsForRelease(addedRelease);
82
+ setValue(
83
+ `tickets.${eventId}`,
84
+ tickets.map((ticket) =>
85
+ ticket.releaseId === release.id
86
+ ? {
87
+ ...ticket,
88
+ quantity: newQuantity > maxQuantity ? maxQuantity : newQuantity,
89
+ products: product ? [...ticket.products, product] : ticket.products,
90
+ extraFields: release.extraFields?.length
91
+ ? [
92
+ ...ticket.extraFields,
93
+ release.extraFields.map((field) => ({
94
+ eventExtraFieldId: field.id,
95
+ value: '',
96
+ })),
97
+ ]
98
+ : [],
99
+ }
100
+ : ticket
101
+ )
102
+ );
103
+ setOpenVariantDialog(null);
104
+ }
105
+ };
106
+
107
+ const decreaseQuantity = useCallback(() => {
108
+ const addedRelease = tickets.find((ticket) => ticket.releaseId === release.id);
109
+ if (addedRelease) {
110
+ const newQuantity = Number(addedRelease.quantity) - 1;
111
+ if (newQuantity < 1) {
112
+ setValue(
113
+ `tickets.${eventId}`,
114
+ tickets.filter((ticket) => ticket.releaseId !== release.id)
115
+ );
116
+ } else {
117
+ setValue(
118
+ `tickets.${eventId}`,
119
+ tickets.map((ticket) => {
120
+ if (ticket.releaseId !== release.id) return ticket;
121
+
122
+ return {
123
+ ...ticket,
124
+ quantity: newQuantity,
125
+ products: ticket?.products?.slice(0, -1), // non-mutating "pop"
126
+ extraFields: ticket?.extraFields?.slice(0, -1),
127
+ };
128
+ })
129
+ );
130
+ }
131
+ }
132
+ }, [tickets, release.id, setValue]);
133
+
134
+ return (
135
+ <Box>
136
+ <Stack direction="row" spacing={1}>
137
+ <Stack
138
+ direction="row"
139
+ spacing={1}
140
+ justifyContent="space-between"
141
+ alignItems="center"
142
+ sx={{ width: '100%', backgroundColor: 'grey.200', p: 1, pl: 1.5, borderRadius: 1 }}
143
+ >
144
+ <Stack direction="row" spacing={2} alignItems="center">
145
+ <Stack direction="row" spacing={0.5} alignItems="center">
146
+ <Iconify
147
+ icon="ion:ticket-outline"
148
+ color="primary.main"
149
+ sx={{ width: 24, height: 24 }}
150
+ />
151
+ {release.product && (
152
+ <>
153
+ <Typography fontSize={20} lineHeight={1}>
154
+ +
155
+ </Typography>
156
+ <Iconify
157
+ icon="lucide-lab:shirt-t"
158
+ color="primary.main"
159
+ sx={{ width: 24, height: 24 }}
160
+ />
161
+ </>
162
+ )}
163
+ </Stack>
164
+ <Typography color="grey.500">
165
+ {release.releaseCategoryName} - {release.name} -{' '}
166
+ {fCurrency(release.price, lang, currency)}
167
+ </Typography>
168
+ </Stack>
169
+ {isReleaseSelected(release.id) ? (
170
+ <Stack direction="row" spacing={1} py={0.5}>
171
+ <IconButton onClick={() => decreaseQuantity()} size="small" color="primary">
172
+ <Iconify icon="eva:minus-fill" />
173
+ </IconButton>
174
+ <Typography color="grey.500">{getSelectedQuantity(release.id)}</Typography>
175
+ <IconButton
176
+ onClick={() =>
177
+ release.product ? setOpenVariantDialog('increase') : increaseQuantity()
178
+ }
179
+ size="small"
180
+ color="primary"
181
+ disabled={isMaxQuantity(release.id)}
182
+ >
183
+ <Iconify icon="eva:plus-fill" />
184
+ </IconButton>
185
+ </Stack>
186
+ ) : (
187
+ <Button
188
+ onClick={() =>
189
+ !release.locked && (release.product ? setOpenVariantDialog('add') : addRelease())
190
+ }
191
+ variant="contained"
192
+ disabled={release.locked}
193
+ >
194
+ {t('add')}
195
+ </Button>
196
+ )}
197
+ </Stack>
198
+ </Stack>
199
+ <Typography
200
+ variant="caption"
201
+ content="div"
202
+ mt={2}
203
+ mb={release.extraFields?.length ? 2 : 0}
204
+ display="block"
205
+ >
206
+ {release.description}
207
+ </Typography>
208
+ {release.extraFields && release.extraFields.length > 0 && (
209
+ <ReleaseExtraFields
210
+ release={release}
211
+ eventId={eventId}
212
+ releaseIndex={index}
213
+ quantity={countTickets}
214
+ />
215
+ )}
216
+ {release.product && (
217
+ <ProductVariantsDialog
218
+ eventProduct={release.product}
219
+ openDialog={!!openVariantDialog}
220
+ callback={openVariantDialog === 'increase' ? increaseQuantity : addRelease}
221
+ onClose={() => setOpenVariantDialog(null)}
222
+ selectedQuantityByVariant={getSelectedQuantityByVariant(products, tickets)}
223
+ eventId={eventId}
224
+ />
225
+ )}
226
+ </Box>
227
+ );
228
+ };
229
+
230
+ export default ReleaseWithMerchandise;
@@ -14,7 +14,7 @@ import {
14
14
  Typography,
15
15
  } from '@mui/material';
16
16
  import dayjs from 'dayjs';
17
- import TicketSelection from '@form/tickets/TicketSelection';
17
+ import TicketSelection from '@form/TicketSelection';
18
18
  import ContactPerson from '@form/ContactPerson';
19
19
  import Payment from '@form/Payment';
20
20
  import EmailConfirmation from '@form/EmailConfirmation';
@@ -44,8 +44,8 @@ import {
44
44
  import ReleaseCountdown from '@form/ReleaseCountdown';
45
45
  import { cloneObject } from '@utils/global';
46
46
  import PaymentPending from '@form/PaymentPending';
47
- import MerchandiseSelection from '@form/merchandise/MerchandiseSelection';
48
- import TicketWithMerchandiseSelection from '@form/tickets/TicketWithMerchandiseSelection';
47
+ import MerchandiseSelection from '@form/MerchandiseSelection';
48
+ import TicketWithMerchandiseSelection from '@form/TicketWithMerchandiseSelection';
49
49
  import useActiveEventProducts from '@hooks/data/useActiveEventProducts';
50
50
  import Shipping from '@form/Shipping';
51
51
  import useErrors from '@hooks/useErrors';
@@ -53,12 +53,9 @@ import { EventType } from '@utils/data/event';
53
53
  import TimeslotSelection from '@form/TimeslotSelection';
54
54
  import useGlobal from '@hooks/useGlobal';
55
55
  import { Trans } from '@components/Trans';
56
- import { EVENTLOOK_ORDER_FORM_ID, EVENTLOOK_ORDER_FORM_CONTAINER_ID } from '@utils/data/global.ts';
56
+ import { EVENTLOOK_ORDER_FORM_ID } from '@utils/data/global.ts';
57
57
  import ChildEventSection from './ChildEvents';
58
- import TicketSelectionMap from '@form/tickets/TicketSelectionMap';
59
- import PaymentOverviewDrawer from './PaymentOverviewDrawer';
60
- import { getPlaceAsString } from '@utils/place';
61
- import Services from '@form/services';
58
+ import TicketSelectionMap from '@form/TicketSelectionMap.tsx';
62
59
 
63
60
  interface Props {
64
61
  event: IEvent;
@@ -66,7 +63,6 @@ interface Props {
66
63
  selectedReleaseId?: number;
67
64
  isIframe?: boolean;
68
65
  isInline?: boolean;
69
- headerSlot?: React.ReactNode;
70
66
  }
71
67
 
72
68
  const TicketForm: React.FC<Props> = ({
@@ -75,7 +71,6 @@ const TicketForm: React.FC<Props> = ({
75
71
  selectedReleaseId,
76
72
  isIframe,
77
73
  isInline,
78
- headerSlot,
79
74
  }) => {
80
75
  const { t, setGlobal, callbacks, links, user, options, showSnackbar, content, seatingIframeUrl } =
81
76
  useGlobal();
@@ -449,7 +444,7 @@ const TicketForm: React.FC<Props> = ({
449
444
  }, [window.location.search]);
450
445
 
451
446
  useEffect(() => {
452
- const subscription = methods.watch((value) => {
447
+ const subscription = methods.watch((value, { name }) => {
453
448
  if (
454
449
  JSON.stringify(defaultValues) !== JSON.stringify(value) &&
455
450
  !hasFiredBeginCheckout.current
@@ -476,7 +471,7 @@ const TicketForm: React.FC<Props> = ({
476
471
  useEffect(() => {
477
472
  if (hasGopayId || isPaying || paymentRedirect) {
478
473
  if (options?.autoscrollAfterViewChange) {
479
- const orderForm = document.getElementById(EVENTLOOK_ORDER_FORM_CONTAINER_ID);
474
+ const orderForm = document.getElementById(EVENTLOOK_ORDER_FORM_ID);
480
475
  if (orderForm) {
481
476
  orderForm.scrollIntoView({ behavior: 'smooth' });
482
477
  }
@@ -488,7 +483,7 @@ const TicketForm: React.FC<Props> = ({
488
483
  return <ReleaseCountdown event={event} setShowReleaseDate={setShowReleaseDate} />;
489
484
 
490
485
  return (
491
- <Box id={EVENTLOOK_ORDER_FORM_CONTAINER_ID}>
486
+ <Box id={EVENTLOOK_ORDER_FORM_ID}>
492
487
  {hasGopayId ? (
493
488
  <PaymentSuccess setIsPaying={setIsPaying} isIframe={isIframe} pixels={pixels} />
494
489
  ) : isPaying ? (
@@ -501,56 +496,32 @@ const TicketForm: React.FC<Props> = ({
501
496
  isInline={isInline}
502
497
  />
503
498
  ) : (
504
- <FormProvider
505
- methods={methods}
506
- // @ts-ignore
507
- onSubmit={methods.handleSubmit(onSubmit)}
508
- formId={EVENTLOOK_ORDER_FORM_ID}
509
- >
510
- <Stack
499
+ // @ts-ignore
500
+ <FormProvider methods={methods} onSubmit={methods.handleSubmit(onSubmit)}>
501
+ <Typography
511
502
  className="overview-card__event-info"
512
503
  display={{ md: 'none' }}
504
+ variant="h4"
513
505
  sx={{
514
506
  mb: 2,
515
507
  }}
516
508
  >
517
- <Typography variant="h3" component="h1">
518
- {event.name}
519
- </Typography>
520
- <Typography variant="h5" component="h2">
521
- {dayjs(event.startDate).format('DD.MM.YYYY HH:mm')}
522
- </Typography>
523
- <Typography variant="body2" mt={1}>
524
- {getPlaceAsString(event.place)}
525
- </Typography>
526
- {headerSlot ? <>{headerSlot}</> : null}
527
- </Stack>
509
+ {event.name} - {dayjs(event.startDate).format('DD.MM.YYYY HH:mm')}
510
+ </Typography>
528
511
  <Grid container spacing={2}>
529
512
  <Grid item xs={12} md={8}>
530
- <Stepper
531
- orientation="vertical"
532
- sx={(theme) => ({
533
- [theme.breakpoints.down('sm')]: {
534
- '& .MuiStepContent-root': {
535
- borderLeftWidth: 0,
536
- paddingLeft: 0,
537
- marginLeft: 0,
538
- },
539
- '& .MuiStepConnector-line': { borderLeftWidth: 0 },
540
- },
541
- })}
542
- >
513
+ <Stepper orientation="vertical">
543
514
  {event.type === EventType.RECURRING && (
544
515
  <Step active>
545
516
  <StepLabel>{t('event.tickets.stepper.6.title')}</StepLabel>
546
- <StepContent sx={{ pr: { xs: 0 } }}>
517
+ <StepContent>
547
518
  <TimeslotSelection event={event} />
548
519
  </StepContent>
549
520
  </Step>
550
521
  )}
551
522
  <Step active>
552
523
  <StepLabel>{t('event.tickets.stepper.1.title')}</StepLabel>
553
- <StepContent sx={{ pr: { xs: 0 } }}>
524
+ <StepContent>
554
525
  {event.mapId && seatingIframeUrl ? (
555
526
  <TicketSelectionMap event={event} />
556
527
  ) : event.hasMerchandise ? (
@@ -563,7 +534,7 @@ const TicketForm: React.FC<Props> = ({
563
534
  {event.hasMerchandise && eventProducts.length && (
564
535
  <Step active>
565
536
  <StepLabel>{t('event.tickets.stepper.4.title')}</StepLabel>
566
- <StepContent sx={{ pr: { xs: 0 } }}>
537
+ <StepContent>
567
538
  <MerchandiseSelection
568
539
  eventProducts={eventProducts}
569
540
  eventId={event.id}
@@ -572,30 +543,24 @@ const TicketForm: React.FC<Props> = ({
572
543
  </StepContent>
573
544
  </Step>
574
545
  )}
575
- <Step active>
576
- <StepLabel>{t('event.tickets.stepper.8.title')}</StepLabel>
577
- <StepContent sx={{ pr: { xs: 0 } }}>
578
- <Services event={event} />
579
- </StepContent>
580
- </Step>
581
546
  {event.children.length && (
582
547
  <Step active>
583
548
  <StepLabel>{t('event.tickets.stepper.7.title')}</StepLabel>
584
- <StepContent sx={{ pr: { xs: 0 } }}>
549
+ <StepContent>
585
550
  <ChildEventSection events={event.children} />
586
551
  </StepContent>
587
552
  </Step>
588
553
  )}
589
554
  <Step active>
590
555
  <StepLabel>{t('event.tickets.stepper.2.title')}</StepLabel>
591
- <StepContent sx={{ pr: { xs: 0 } }}>
556
+ <StepContent>
592
557
  <ContactPerson event={event} />
593
558
  </StepContent>
594
559
  </Step>
595
560
  {event.hasMerchandise && showShippingMethods() && (
596
561
  <Step active>
597
562
  <StepLabel>{t('event.tickets.stepper.5.title')}</StepLabel>
598
- <StepContent sx={{ pr: { xs: 0 } }}>
563
+ <StepContent>
599
564
  <Shipping event={event} />
600
565
  </StepContent>
601
566
  </Step>
@@ -606,12 +571,12 @@ const TicketForm: React.FC<Props> = ({
606
571
  `event.tickets.stepper.3.${values.isPaymentVerify ? 'title_verify' : 'title'}`
607
572
  )}
608
573
  </StepLabel>
609
- <StepContent sx={{ pr: { xs: 0 } }}>
574
+ <StepContent>
610
575
  <Payment event={event} />
611
576
  </StepContent>
612
577
  </Step>
613
578
  </Stepper>
614
- <Stack mt={2} ml={{ xs: 1, md: 4 }}>
579
+ <Stack mt={2} ml={4}>
615
580
  <RHFCheckbox
616
581
  name="termsAndConditions"
617
582
  label={
@@ -631,13 +596,10 @@ const TicketForm: React.FC<Props> = ({
631
596
  />
632
597
  </Stack>
633
598
  </Grid>
634
- <Grid item xs={12} md={4} sx={{ display: { xs: 'none', md: 'block' } }}>
599
+ <Grid item xs={12} md={4}>
635
600
  <PaymentOverviewBox event={event} />
636
601
  </Grid>
637
602
  </Grid>
638
-
639
- <PaymentOverviewDrawer event={event} totalPrice={values.total} />
640
-
641
603
  <EmailConfirmation
642
604
  open={formStep === 2 && !isIframe}
643
605
  onClose={() => setFormStep(1)}
@@ -651,7 +613,7 @@ const TicketForm: React.FC<Props> = ({
651
613
  };
652
614
 
653
615
  const CustomLink: React.FC<PropsWithChildren<LinkProps>> = ({ href = '', children, ...other }) => (
654
- <Link href={href} {...other} sx={{ color: 'inherit', textDecoration: 'underline' }}>
616
+ <Link href={href} {...other}>
655
617
  {children}
656
618
  </Link>
657
619
  );
@@ -1,23 +1,36 @@
1
1
  import React, { useEffect, useRef, useState } from 'react';
2
2
  import { useFormContext, useWatch } from 'react-hook-form';
3
- import { Box, Divider, Stack, Typography } from '@mui/material';
3
+ import {
4
+ Box,
5
+ Button,
6
+ Divider,
7
+ Grid,
8
+ IconButton,
9
+ MenuItem,
10
+ Skeleton,
11
+ Stack,
12
+ Typography,
13
+ } from '@mui/material';
14
+ import { RHFSelect } from '@components/hook-form';
4
15
  import { ITicketForm, ITicketFormTicket } from '@utils/types/ticket.type';
5
16
  import useEventActiveReleases from '@hooks/data/useEventActiveReleases';
17
+ import { fCurrency } from '@utils/formatNumber';
18
+ import { Iconify } from '@components/iconify';
6
19
  import { groupBy } from '@utils/global';
7
20
  import { IReleaseShort } from '@utils/types/release.type';
21
+ import FeeBox from '@form/payment/FeeBox';
8
22
  import { IEvent } from '@utils/types/event.type';
9
23
  import useResponsive from '@hooks/useResponsive';
10
24
  import ReleaseExtraFields from '@form/extra-field/ReleaseExtraFields';
11
25
  import { EventType } from '@utils/data/event';
12
26
  import useGlobal from '@hooks/useGlobal.ts';
13
- import TicketSelectionMobile from './TicketSelectionMobile';
14
27
 
15
28
  interface Props {
16
29
  event: IEvent;
17
30
  }
18
31
 
19
32
  const TicketSelection: React.FC<Props> = ({ event }) => {
20
- const { t } = useGlobal();
33
+ const { t, lang } = useGlobal();
21
34
  const isMobile = useResponsive('down', 'md');
22
35
  const { setValue, watch } = useFormContext<ITicketForm>();
23
36
  const tickets = useWatch({
@@ -65,11 +78,11 @@ const TicketSelection: React.FC<Props> = ({ event }) => {
65
78
  );
66
79
  };
67
80
 
68
- // const getAvailableTicketsForRelease = (release: ITicketFormTicket): number => {
69
- // const selectedRelease = activeReleases?.find((item) => item.id === release.releaseId);
70
- // const availableQuantity = selectedRelease ? selectedRelease.availableTickets : 0;
71
- // return availableQuantity > 10 ? 10 : availableQuantity;
72
- // };
81
+ const getAvailableTicketsForRelease = (release: ITicketFormTicket): number => {
82
+ const selectedRelease = activeReleases?.find((item) => item.id === release.releaseId);
83
+ const availableQuantity = selectedRelease ? selectedRelease.availableTickets : 0;
84
+ return availableQuantity > 10 ? 10 : availableQuantity;
85
+ };
73
86
 
74
87
  const countReleaseCategories = (): number => {
75
88
  const grouped = groupBy(activeReleases || [], 'releaseCategoryName');
@@ -175,26 +188,117 @@ const TicketSelection: React.FC<Props> = ({ event }) => {
175
188
  };
176
189
 
177
190
  return (
178
- <Stack
179
- spacing={3}
180
- direction="column"
181
- divider={!isMobile ? <Divider sx={{ borderStyle: 'dashed' }} /> : undefined}
182
- >
183
- <TicketSelectionMobile
184
- event={event}
185
- activeReleases={activeReleases}
186
- showLoading={showLoading}
187
- soldOutReleaseCategoryNames={soldOutReleaseCategoryNames}
188
- tickets={tickets}
189
- isQuantityDisabled={isQuantityDisabled}
190
- setValue={setValue as (name: string, value: any) => void}
191
- removeTicket={removeTicket}
192
- getExtraFields={getExtraFields}
193
- />
191
+ <Stack spacing={3} direction="column" divider={<Divider sx={{ borderStyle: 'dashed' }} />}>
192
+ {tickets.map((item, index) => (
193
+ <Box key={index}>
194
+ <Grid container spacing={3}>
195
+ <Grid item xs={12} md={6}>
196
+ {showLoading ? (
197
+ <Skeleton
198
+ variant="rounded"
199
+ sx={{
200
+ width: '100%',
201
+ height: (theme) => theme.spacing(7.5),
202
+ }}
203
+ />
204
+ ) : (
205
+ <RHFSelect
206
+ name={`tickets.${event.id}.${index}.releaseId`}
207
+ value={item.releaseId}
208
+ label={
209
+ index > 0
210
+ ? t('form.labels.add_another_release')
211
+ : t('form.labels.release_category_price')
212
+ }
213
+ maxHeight="calc(100vh - 2rem)"
214
+ onChange={(e) => {
215
+ setValue(`tickets.${event.id}.${index}.releaseId`, Number(e.target.value));
216
+ setValue(`tickets.${event.id}.${index}.extraFields`, []);
217
+ }}
218
+ >
219
+ <MenuItem key={0} value="">
220
+ {t('choose')}
221
+ </MenuItem>
222
+ {activeReleases?.map((activeRelease) => (
223
+ <MenuItem
224
+ key={activeRelease.id}
225
+ value={activeRelease.id}
226
+ disabled={
227
+ isReleaseSelected(activeRelease.id) ||
228
+ (activeRelease.locked &&
229
+ !soldOutReleaseCategoryNames.includes(activeRelease.releaseCategoryName))
230
+ }
231
+ >
232
+ {activeRelease.releaseCategoryName} - {activeRelease.name}:{' '}
233
+ {activeRelease.price === 0
234
+ ? t('free')
235
+ : fCurrency(activeRelease.price, lang, event.currency)}
236
+ </MenuItem>
237
+ ))}
238
+ </RHFSelect>
239
+ )}
240
+ </Grid>
241
+ <Grid key={index} item xs={12} md={6}>
242
+ {showLoading ? (
243
+ <Skeleton
244
+ variant="rounded"
245
+ sx={{
246
+ width: '100%',
247
+ height: (theme) => theme.spacing(7.5),
248
+ }}
249
+ />
250
+ ) : (
251
+ <Stack direction="row" alignItems="center" spacing={1}>
252
+ <RHFSelect
253
+ name={`tickets.${event.id}.${index}.quantity`}
254
+ value={item.quantity}
255
+ label={t('form.labels.quantity')}
256
+ >
257
+ {[...Array(getAvailableTicketsForRelease(item))].map((_, index2) => (
258
+ <MenuItem
259
+ key={index2}
260
+ value={index2 + 1}
261
+ disabled={isQuantityDisabled(index2 + 1, item.releaseId)}
262
+ >
263
+ {index2 + 1}
264
+ </MenuItem>
265
+ ))}
266
+ {!item.releaseId && (
267
+ <MenuItem disabled sx={{ textTransform: 'unset!important' }}>
268
+ {t('event.tickets.stepper.1.quantity_select')}
269
+ </MenuItem>
270
+ )}
271
+ </RHFSelect>
272
+ {item.releaseId && item.quantity && (
273
+ <Box>
274
+ <IconButton color="primary" onClick={() => removeTicket(index)}>
275
+ <Iconify icon="carbon:trash-can" />
276
+ </IconButton>
277
+ </Box>
278
+ )}
279
+ </Stack>
280
+ )}
281
+ </Grid>
282
+ </Grid>
283
+ {activeReleases && item.releaseId && (
284
+ <Typography
285
+ variant="caption"
286
+ content="div"
287
+ mt={2}
288
+ mb={getRelease(item.releaseId)?.extraFields?.length ? 2 : 0}
289
+ display="block"
290
+ >
291
+ {getRelease(item.releaseId)?.description ?? ''}
292
+ </Typography>
293
+ )}
294
+ {getExtraFields(item.releaseId, index)}
295
+ </Box>
296
+ ))}
194
297
  <Box>
195
298
  <Typography variant="caption" component="div" fontStyle="italic" mb={2}>
196
299
  *{t('event.tickets.stepper.1.max_ticket_quantity')}
197
300
  </Typography>
301
+ {isMobile && <FeeBox event={event} align="right" />}
198
302
  </Box>
199
303
  </Stack>
200
304
  );
@@ -5,7 +5,6 @@ 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.ts';
8
- import Iconify from '@components/iconify/Iconify';
9
8
 
10
9
  interface Props {
11
10
  event: IEvent;
@@ -66,7 +65,7 @@ const TicketSelectionMap: React.FC<Props> = ({ event }) => {
66
65
 
67
66
  return (
68
67
  <Button
69
- variant="outlined"
68
+ variant="contained"
70
69
  onClick={() =>
71
70
  iframe.openPicker({
72
71
  eventId: String(event.id),
@@ -75,13 +74,6 @@ const TicketSelectionMap: React.FC<Props> = ({ event }) => {
75
74
  clientId: uuid,
76
75
  })
77
76
  }
78
- sx={{
79
- width: { xs: '100%' },
80
- color: 'text.primary',
81
- borderColor: (theme) => theme.palette.grey['300'],
82
- '& .MuiButton-endIcon': { ml: 0, fontSize: '1.5em' },
83
- }}
84
- endIcon={<Iconify icon="eva:chevron-right-outline" />}
85
77
  >
86
78
  {t('form.labels.open_map')}
87
79
  </Button>