@eventlook/sdk 1.4.46-beta.6 → 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 +23 -15
  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 +18 -36
  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 +4 -1
  27. package/dist/cjs/form/payment/FeeBox.js.map +1 -1
  28. package/dist/cjs/form/payment/PaymentOverviewCheckbox.js +27 -17
  29. package/dist/cjs/form/payment/PaymentOverviewCheckbox.js.map +1 -1
  30. package/dist/cjs/form/product/ProductCard.js +34 -49
  31. package/dist/cjs/form/product/ProductCard.js.map +1 -1
  32. package/dist/cjs/form/product/ProductVariantsDialog.js +94 -118
  33. package/dist/cjs/form/product/ProductVariantsDialog.js.map +1 -1
  34. package/dist/cjs/locales/cs.js +1 -16
  35. package/dist/cjs/locales/cs.js.map +1 -1
  36. package/dist/cjs/locales/en.js +1 -16
  37. package/dist/cjs/locales/en.js.map +1 -1
  38. package/dist/cjs/locales/es.js +0 -15
  39. package/dist/cjs/locales/es.js.map +1 -1
  40. package/dist/cjs/locales/pl.js +0 -15
  41. package/dist/cjs/locales/pl.js.map +1 -1
  42. package/dist/cjs/locales/sk.js +0 -15
  43. package/dist/cjs/locales/sk.js.map +1 -1
  44. package/dist/cjs/locales/uk.js +0 -15
  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 +23 -15
  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 +20 -38
  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 +4 -1
  73. package/dist/esm/form/payment/FeeBox.js.map +1 -1
  74. package/dist/esm/form/payment/PaymentOverviewCheckbox.js +29 -19
  75. package/dist/esm/form/payment/PaymentOverviewCheckbox.js.map +1 -1
  76. package/dist/esm/form/product/ProductCard.js +35 -50
  77. package/dist/esm/form/product/ProductCard.js.map +1 -1
  78. package/dist/esm/form/product/ProductVariantsDialog.js +95 -119
  79. package/dist/esm/form/product/ProductVariantsDialog.js.map +1 -1
  80. package/dist/esm/locales/cs.js +1 -16
  81. package/dist/esm/locales/cs.js.map +1 -1
  82. package/dist/esm/locales/en.js +1 -16
  83. package/dist/esm/locales/en.js.map +1 -1
  84. package/dist/esm/locales/es.js +0 -15
  85. package/dist/esm/locales/es.js.map +1 -1
  86. package/dist/esm/locales/pl.js +0 -15
  87. package/dist/esm/locales/pl.js.map +1 -1
  88. package/dist/esm/locales/sk.js +0 -15
  89. package/dist/esm/locales/sk.js.map +1 -1
  90. package/dist/esm/locales/uk.js +0 -15
  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 +72 -40
  105. package/src/form/PaymentPending.tsx +1 -1
  106. package/src/form/ReleaseWithMerchandise.tsx +230 -0
  107. package/src/form/TicketForm.tsx +18 -56
  108. package/src/form/{tickets/TicketSelection.tsx → TicketSelection.tsx} +109 -17
  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 +10 -0
  113. package/src/form/payment/PaymentOverviewCheckbox.tsx +56 -33
  114. package/src/form/product/ProductCard.tsx +52 -67
  115. package/src/form/product/ProductVariantsDialog.tsx +137 -195
  116. package/src/locales/cs.tsx +1 -16
  117. package/src/locales/en.tsx +1 -16
  118. package/src/locales/es.tsx +0 -15
  119. package/src/locales/pl.tsx +0 -15
  120. package/src/locales/sk.tsx +0 -15
  121. package/src/locales/uk.tsx +0 -15
  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 -114
  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 -39
  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 -131
  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 -139
  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 -134
  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 -88
  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 -110
  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 -35
  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 -127
  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 -135
  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 -130
  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 -84
  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 -180
  222. package/src/form/merchandise/MerchandiseSelection.tsx +0 -24
  223. package/src/form/merchandise/MerchandiseSlider.tsx +0 -61
  224. package/src/form/services/index.tsx +0 -260
  225. package/src/form/tickets/ReleaseDescription.tsx +0 -46
  226. package/src/form/tickets/ReleaseWithMerchandise.tsx +0 -237
  227. package/src/form/tickets/TicketQuantityControl.tsx +0 -94
  228. package/src/form/tickets/TicketSelectionMobile.tsx +0 -175
@@ -2,6 +2,7 @@ import React, { useEffect, useRef, useState } from 'react';
2
2
  import { useFormContext, useWatch } from 'react-hook-form';
3
3
  import {
4
4
  Box,
5
+ Button,
5
6
  Divider,
6
7
  Grid,
7
8
  IconButton,
@@ -17,12 +18,12 @@ import { fCurrency } from '@utils/formatNumber';
17
18
  import { Iconify } from '@components/iconify';
18
19
  import { groupBy } from '@utils/global';
19
20
  import { IReleaseShort } from '@utils/types/release.type';
21
+ import FeeBox from '@form/payment/FeeBox';
20
22
  import { IEvent } from '@utils/types/event.type';
21
23
  import useResponsive from '@hooks/useResponsive';
22
24
  import ReleaseExtraFields from '@form/extra-field/ReleaseExtraFields';
23
25
  import { EventType } from '@utils/data/event';
24
26
  import useGlobal from '@hooks/useGlobal.ts';
25
- import TicketSelectionMobile from './TicketSelectionMobile';
26
27
 
27
28
  interface Props {
28
29
  event: IEvent;
@@ -187,26 +188,117 @@ const TicketSelection: React.FC<Props> = ({ event }) => {
187
188
  };
188
189
 
189
190
  return (
190
- <Stack
191
- spacing={3}
192
- direction="column"
193
- divider={!isMobile ? <Divider sx={{ borderStyle: 'dashed' }} /> : undefined}
194
- >
195
- <TicketSelectionMobile
196
- event={event}
197
- activeReleases={activeReleases}
198
- showLoading={showLoading}
199
- soldOutReleaseCategoryNames={soldOutReleaseCategoryNames}
200
- tickets={tickets}
201
- isQuantityDisabled={isQuantityDisabled}
202
- setValue={setValue as (name: string, value: any) => void}
203
- removeTicket={removeTicket}
204
- getExtraFields={getExtraFields}
205
- />
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
+ ))}
206
297
  <Box>
207
298
  <Typography variant="caption" component="div" fontStyle="italic" mb={2}>
208
299
  *{t('event.tickets.stepper.1.max_ticket_quantity')}
209
300
  </Typography>
301
+ {isMobile && <FeeBox event={event} align="right" />}
210
302
  </Box>
211
303
  </Stack>
212
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>
@@ -1,12 +1,14 @@
1
1
  import React, { useEffect, useRef } from 'react';
2
2
  import { useFormContext, useWatch } from 'react-hook-form';
3
- import { Box, Skeleton, Stack, Typography } from '@mui/material';
3
+ import { Box, Divider, Skeleton, Stack, Typography } from '@mui/material';
4
4
  import { ITicketForm, ITicketFormTicket } from '@utils/types/ticket.type';
5
5
  import useEventActiveReleases from '@hooks/data/useEventActiveReleases';
6
6
  import { groupBy } from '@utils/global';
7
7
  import { IReleaseShort } from '@utils/types/release.type';
8
+ import FeeBox from '@form/payment/FeeBox';
8
9
  import { IEvent } from '@utils/types/event.type';
9
- import ReleaseWithMerchandise from '@form/tickets/ReleaseWithMerchandise';
10
+ import useResponsive from '@hooks/useResponsive';
11
+ import ReleaseWithMerchandise from '@form/ReleaseWithMerchandise';
10
12
  import { EventType } from '@utils/data/event';
11
13
  import useGlobal from '@hooks/useGlobal.ts';
12
14
 
@@ -16,6 +18,7 @@ interface Props {
16
18
 
17
19
  const TicketWithMerchandiseSelection: React.FC<Props> = ({ event }) => {
18
20
  const { t } = useGlobal();
21
+ const isMobile = useResponsive('down', 'md');
19
22
  const { setValue, watch } = useFormContext<ITicketForm>();
20
23
  const tickets: ITicketFormTicket[] = useWatch({ name: `tickets.${event.id}`, defaultValue: [] });
21
24
  const eventTimeslotId = watch('eventTimeslotId');
@@ -135,7 +138,7 @@ const TicketWithMerchandiseSelection: React.FC<Props> = ({ event }) => {
135
138
  };
136
139
 
137
140
  return (
138
- <Stack spacing={1} direction="column">
141
+ <Stack spacing={3} direction="column" divider={<Divider sx={{ borderStyle: 'dashed' }} />}>
139
142
  {!activeReleases && event.type !== EventType.RECURRING ? (
140
143
  <Skeleton
141
144
  variant="rounded"
@@ -166,6 +169,7 @@ const TicketWithMerchandiseSelection: React.FC<Props> = ({ event }) => {
166
169
  <Typography variant="caption" component="div" fontStyle="italic" mb={2}>
167
170
  *{t('event.tickets.stepper.1.max_ticket_quantity')}
168
171
  </Typography>
172
+ {isMobile && <FeeBox event={event} align="right" />}
169
173
  </Box>
170
174
  </Stack>
171
175
  );
@@ -5,7 +5,7 @@ import 'dayjs/locale/es';
5
5
  import 'dayjs/locale/uk';
6
6
  import 'dayjs/locale/sk';
7
7
 
8
- import React, { useEffect, ReactNode } from 'react';
8
+ import React, { useEffect } from 'react';
9
9
  import TicketForm from '@form/TicketForm';
10
10
  import { GlobalProvider } from '@context/GlobalContext';
11
11
  import api from '@utils/axios';
@@ -33,7 +33,6 @@ export interface OrderFormProps {
33
33
  lang?: Languages;
34
34
  slots?: {
35
35
  showSnackbar: IGlobalContext['showSnackbar'];
36
- headerSlot?: ReactNode;
37
36
  };
38
37
  user?: IUser;
39
38
  selectedReleaseId?: number;
@@ -113,7 +112,6 @@ const ClientRender: React.FC<OrderFormProps> = ({
113
112
  hasGopayIdSsr={options?.hasGopayId || false}
114
113
  isIframe={options?.isIframe}
115
114
  selectedReleaseId={selectedReleaseId}
116
- headerSlot={slots?.headerSlot}
117
115
  />
118
116
  )}
119
117
  </GlobalProvider>
@@ -63,6 +63,16 @@ const FeeBox: React.FC<Props> = ({ event, align = 'left' }) => {
63
63
  </Stack>
64
64
  <Typography variant="subtitle1">{fCurrency(values.total, lang, event.currency)}</Typography>
65
65
  </Stack>
66
+ {!!values.totalFee && (
67
+ <Typography
68
+ variant="caption"
69
+ sx={{
70
+ color: (theme) => theme.palette.grey.A700,
71
+ }}
72
+ >
73
+ {t('form.labels.with_fee')}
74
+ </Typography>
75
+ )}
66
76
  </Box>
67
77
  );
68
78
  };
@@ -1,6 +1,14 @@
1
- import React, { JSX } from 'react';
2
- import { Button, Stack, Typography } from '@mui/material';
3
- import { Controller, useFormContext } from 'react-hook-form';
1
+ import React, { JSX, useState } from 'react';
2
+ import {
3
+ Dialog,
4
+ DialogContent,
5
+ DialogTitle,
6
+ IconButton,
7
+ Link,
8
+ Stack,
9
+ Typography,
10
+ } from '@mui/material';
11
+ import { RHFCheckbox } from '@components/hook-form';
4
12
  import useGlobal from '@hooks/useGlobal.ts';
5
13
  import { Iconify } from '@components';
6
14
 
@@ -8,55 +16,70 @@ interface Props {
8
16
  checkboxName: string;
9
17
  label: string;
10
18
  value: string | JSX.Element;
19
+ modal: {
20
+ title: string;
21
+ description: string | JSX.Element;
22
+ };
11
23
  }
12
24
 
13
- const PaymentOverviewCheckbox: React.FC<Props> = ({ checkboxName, label, value }) => {
25
+ const PaymentOverviewCheckbox: React.FC<Props> = ({ checkboxName, label, value, modal }) => {
14
26
  const { t } = useGlobal();
15
- const { control } = useFormContext();
27
+ const [open, setOpen] = useState(false);
28
+
29
+ const handleOpen = (e: React.MouseEvent<HTMLAnchorElement>) => {
30
+ e.preventDefault();
31
+ e.stopPropagation();
32
+ setOpen(true);
33
+ };
34
+ const handleClose = () => setOpen(false);
16
35
 
17
36
  return (
18
37
  <>
19
- <Controller
38
+ <RHFCheckbox
20
39
  name={checkboxName}
21
- control={control}
22
- render={({ field }) => (
40
+ label={
23
41
  <Stack
24
42
  direction="row"
25
43
  justifyContent="space-between"
26
44
  alignItems="center"
27
45
  spacing={1}
28
- sx={{ width: '100%', mb: 0.5 }}
46
+ sx={{ width: '100%' }}
29
47
  >
30
48
  <Typography variant="caption" sx={{ flex: 1 }}>
31
49
  {label}
32
50
  </Typography>
33
- <Stack direction="row" alignItems="center" spacing={1}>
34
- <Typography variant="caption">{value}</Typography>
35
- {!field.value && (
36
- <Button
37
- variant="outlined"
38
- color="primary"
39
- size="small"
40
- startIcon={<Iconify icon="carbon:add" />}
41
- onClick={(event) => {
42
- event.preventDefault();
43
- event.stopPropagation();
44
- field.onChange(true);
45
- }}
46
- sx={{
47
- borderRadius: 1,
48
- textTransform: 'none',
49
- px: 1.5,
50
- minWidth: 96,
51
- }}
52
- >
53
- {t('add')}
54
- </Button>
55
- )}
51
+ <Stack alignItems="flex-end">
52
+ <Typography variant="caption" fontWeight="600">
53
+ {value}
54
+ </Typography>
55
+ <Link variant="caption" onClick={handleOpen}>
56
+ {t('more_info')}
57
+ </Link>
56
58
  </Stack>
57
59
  </Stack>
58
- )}
60
+ }
61
+ sx={{
62
+ width: 'calc(100% + 11px)',
63
+ mb: 0.5,
64
+ '& > .MuiTypography-root': {
65
+ width: '100%',
66
+ },
67
+ }}
59
68
  />
69
+
70
+ <Dialog open={open} onClose={handleClose} maxWidth="sm" fullWidth>
71
+ <DialogTitle
72
+ sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}
73
+ >
74
+ {modal.title}
75
+ <IconButton onClick={handleClose} size="small">
76
+ <Iconify icon="carbon:close" />
77
+ </IconButton>
78
+ </DialogTitle>
79
+ <DialogContent>
80
+ <Typography variant="body2">{modal.description}</Typography>
81
+ </DialogContent>
82
+ </Dialog>
60
83
  </>
61
84
  );
62
85
  };
@@ -1,4 +1,5 @@
1
- import { Box, Button, Card, Stack, Typography } from '@mui/material';
1
+ import { Button, Card, Stack, Typography } from '@mui/material';
2
+ import { Iconify } from '@components/iconify';
2
3
  import Image from '@components/Image';
3
4
  import { IEventProduct } from '@utils/types/event-product.type';
4
5
  import React, { useMemo, useState } from 'react';
@@ -8,7 +9,6 @@ import { useFormContext, useWatch } from 'react-hook-form';
8
9
  import { ITicketForm, ITicketFormTicket } from '@utils/types/ticket.type';
9
10
  import { getSelectedQuantityByVariant } from '@utils/product';
10
11
  import useGlobal from '@hooks/useGlobal.ts';
11
- import { fCurrency } from '@utils/formatNumber';
12
12
 
13
13
  interface Props {
14
14
  eventProduct: IEventProduct;
@@ -17,88 +17,73 @@ interface Props {
17
17
  }
18
18
 
19
19
  const ProductCard: React.FC<Props> = ({ eventProduct, eventId, isOnlyMerchandise }) => {
20
- const { t, lang } = useGlobal();
20
+ const { t } = useGlobal();
21
21
  const [openVariantDialog, setOpenVariantDialog] = useState<boolean>(false);
22
- const { setValue, getValues } = useFormContext<ITicketForm>();
22
+ const { setValue } = useFormContext<ITicketForm>();
23
23
  const tickets: ITicketFormTicket[] = useWatch({ name: `tickets.${eventId}`, defaultValue: [] });
24
24
  const products: IEventProductForm[] = useWatch({ name: `products.${eventId}`, defaultValue: [] });
25
25
 
26
- const onSelectVariant = (selectedVariants: IEventProductForm[] | IEventProductForm) => {
27
- const normalized = Array.isArray(selectedVariants) ? selectedVariants : [selectedVariants];
28
- const currentProducts =
29
- (getValues(`products.${eventId}`) as IEventProductForm[] | undefined) ?? [];
30
- const nextProducts = [...currentProducts];
31
-
32
- normalized.forEach((selectedVariant) => {
33
- const index = nextProducts.findIndex(
34
- (product) => product.eventProductVariantId === selectedVariant.eventProductVariantId
35
- );
26
+ const onSelectVariant = (selectedVariant: IEventProductForm) => {
27
+ const variant = products.find(
28
+ (product) => product.eventProductVariantId === selectedVariant.eventProductVariantId
29
+ );
36
30
 
37
- if (index >= 0) {
38
- if (selectedVariant.quantity <= 0) {
39
- nextProducts.splice(index, 1);
40
- } else {
41
- nextProducts[index] = {
42
- ...nextProducts[index],
43
- quantity: selectedVariant.quantity,
44
- };
45
- }
31
+ if (variant) {
32
+ if (selectedVariant.quantity === 0) {
33
+ setValue(
34
+ `products.${eventId}`,
35
+ products.filter(
36
+ (product) => product.eventProductVariantId !== variant.eventProductVariantId
37
+ )
38
+ );
46
39
  } else {
47
- if (selectedVariant.quantity > 0) {
48
- nextProducts.push(selectedVariant);
49
- }
40
+ setValue(
41
+ `products.${eventId}`,
42
+ products.map((product) => {
43
+ if (product.eventProductVariantId === selectedVariant.eventProductVariantId) {
44
+ return {
45
+ ...product,
46
+ quantity: selectedVariant.quantity,
47
+ };
48
+ }
49
+ return product;
50
+ })
51
+ );
50
52
  }
51
- });
52
-
53
- setValue(`products.${eventId}`, nextProducts, {
54
- shouldDirty: true,
55
- shouldValidate: true,
56
- });
53
+ } else if (selectedVariant.quantity !== 0) {
54
+ setValue(`products.${eventId}`, [...products, selectedVariant]);
55
+ }
57
56
  };
58
57
 
59
- const eventNotEmpty = useMemo(() => {
60
- const variantIds = new Set(eventProduct.eventProductVariants.map((variant) => variant.id));
61
- return products.some(
62
- (product) => product?.quantity && variantIds.has(product.eventProductVariantId)
63
- );
64
- }, [products, eventProduct.eventProductVariants]);
58
+ const eventNotEmpty = useMemo(() => products.some((product) => product?.quantity), [products]);
65
59
 
66
60
  return (
67
61
  <>
68
- <Card
69
- sx={{
70
- p: 0,
71
- borderRadius: 0,
72
- boxShadow: 'none',
73
- background: 'none',
74
- }}
75
- >
76
- <Stack spacing={0}>
77
- <Image
78
- src={eventProduct.product.previewImage.url}
79
- ratio="21/9"
80
- sx={{ borderRadius: 1, maxHeight: 96 }}
81
- />
62
+ <Card sx={{ p: 2 }}>
63
+ <Stack spacing={1}>
64
+ <Image src={eventProduct.product.previewImage.url} ratio="1/1" sx={{ borderRadius: 2 }} />
82
65
  <Typography variant="h5">{eventProduct.product.name}</Typography>
83
- <Box>
84
- <Typography variant="body2" color="text.primary">
85
- {eventProduct.product.priceWithVat > 0
86
- ? fCurrency(eventProduct.product.priceWithVat, lang, eventProduct.product.currency)
87
- : t('free')}
88
- </Typography>
89
- </Box>
66
+ <Typography
67
+ variant="caption"
68
+ dangerouslySetInnerHTML={{ __html: eventProduct.product.description }}
69
+ sx={{
70
+ height: 44,
71
+ textOverflow: 'ellipsis',
72
+ overflow: 'hidden',
73
+ display: '-webkit-box',
74
+ WebkitLineClamp: 2,
75
+ WebkitBoxOrient: 'vertical',
76
+ }}
77
+ />
90
78
  <Button
91
- variant={eventNotEmpty ? 'contained' : 'outlined'}
79
+ variant="contained"
92
80
  onClick={() => setOpenVariantDialog(true)}
93
81
  fullWidth
94
- sx={{
95
- color: eventNotEmpty ? (theme) => theme.palette.common.white : 'inherit',
96
- borderColor: (theme) => theme.palette.grey[300],
97
- }}
82
+ startIcon={
83
+ eventNotEmpty ? <Iconify icon="eva:edit-fill" /> : <Iconify icon="eva:plus-fill" />
84
+ }
98
85
  >
99
- {eventNotEmpty
100
- ? t('event.tickets.merchandise.show_added')
101
- : t('event.tickets.merchandise.show_sizes')}
86
+ {eventNotEmpty ? t('change') : t('add')}
102
87
  </Button>
103
88
  </Stack>
104
89
  </Card>