@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
@@ -1,11 +1,12 @@
1
- import React, { useEffect, useMemo, useState } from 'react';
1
+ import React, { useEffect, useState } from 'react';
2
2
  import {
3
- Box,
3
+ Badge,
4
4
  Button,
5
5
  Dialog,
6
6
  DialogActions,
7
7
  DialogContent,
8
8
  DialogTitle,
9
+ IconButton,
9
10
  Stack,
10
11
  Typography,
11
12
  } from '@mui/material';
@@ -16,16 +17,16 @@ import { ITicketFormTicket } from '@utils/types/ticket.type';
16
17
  import { IEventProductForm } from '@utils/types/product.type';
17
18
  import { fCurrency } from '@utils/formatNumber';
18
19
  import useGlobal from '@hooks/useGlobal.ts';
20
+ import { Iconify } from '@components';
19
21
 
20
22
  interface Props {
21
23
  eventProduct: IEventProduct;
22
24
  eventId: number;
23
25
  openDialog: boolean;
24
- callback: (variants: IEventProductForm[]) => void;
26
+ callback: (variant: IEventProductForm) => void;
25
27
  onClose?: () => void;
26
28
  selectedQuantityByVariant?: Record<number, number>;
27
29
  isOnlyMerchandise?: boolean;
28
- canAddOnlyOneAtATime?: boolean;
29
30
  }
30
31
 
31
32
  const ProductVariantsDialog: React.FC<Props> = ({
@@ -36,11 +37,13 @@ const ProductVariantsDialog: React.FC<Props> = ({
36
37
  selectedQuantityByVariant,
37
38
  isOnlyMerchandise,
38
39
  eventId,
39
- canAddOnlyOneAtATime,
40
40
  }) => {
41
41
  const { t, lang, options } = useGlobal();
42
42
  const { showSnackbar } = useGlobal();
43
- const [draftQuantities, setDraftQuantities] = useState<Record<number, number>>({});
43
+ const [selectedVariant, setSelectedVariant] = useState<IEventProductForm | null>(null);
44
+ const [variantPrice, setVariantPrice] = useState<number | null>(null);
45
+ const [variantQuantity, setVariantQuantity] = useState<number>(1);
46
+ const [isVariantClicked, setIsVariantClicked] = useState(false);
44
47
  const tickets: ITicketFormTicket[] = useWatch({ name: `tickets.${eventId}`, defaultValue: [] });
45
48
  const products: IEventProductForm[] = useWatch({ name: `products.${eventId}`, defaultValue: [] });
46
49
 
@@ -53,41 +56,43 @@ const ProductVariantsDialog: React.FC<Props> = ({
53
56
  }, [openDialog]);
54
57
 
55
58
  useEffect(() => {
56
- if (openDialog) {
57
- setDraftQuantities(canAddOnlyOneAtATime ? {} : (selectedQuantityByVariant ?? {}));
59
+ if (isVariantClicked) {
60
+ setVariantQuantity(
61
+ selectedQuantityByVariant &&
62
+ selectedVariant &&
63
+ selectedQuantityByVariant[selectedVariant.eventProductVariantId] !== undefined
64
+ ? selectedQuantityByVariant[selectedVariant.eventProductVariantId]
65
+ : 1
66
+ );
67
+ setIsVariantClicked(false);
58
68
  }
59
- }, [openDialog, selectedQuantityByVariant, canAddOnlyOneAtATime]);
69
+ }, [selectedVariant, isVariantClicked]);
60
70
 
61
- const handleOnAdd = () => {
62
- const selectedVariants = eventProduct.eventProductVariants
63
- .map((variant) => {
64
- const quantity = draftQuantities[variant.id] ?? 0;
65
- const selectedQty = selectedQuantityByVariant?.[variant.id] ?? 0;
66
- if (quantity <= 0 && selectedQty <= 0) return null;
67
- return {
68
- eventProductVariantId: variant.id,
69
- productVariantId: variant.productVariant.id,
70
- quantity,
71
- price: variant.priceWithVat,
72
- excludedShippingMethodIds: eventProduct.excludedShippingMethods.map(
73
- (method) => method.id
74
- ),
75
- } as IEventProductForm;
76
- })
77
- .filter((variant): variant is IEventProductForm => Boolean(variant));
71
+ const handleOnClick = (variant: IEventProductVariant) => {
72
+ setVariantPrice(variant.priceWithVat);
73
+ setSelectedVariant({
74
+ eventProductVariantId: variant.id,
75
+ productVariantId: variant.productVariant.id,
76
+ quantity: 1,
77
+ price: variant.priceWithVat,
78
+ excludedShippingMethodIds: eventProduct.excludedShippingMethods.map((method) => method.id),
79
+ });
80
+ setIsVariantClicked(true);
81
+ };
78
82
 
79
- if (selectedVariants.length === 0) {
83
+ const handleOnAdd = () => {
84
+ if (!selectedVariant) {
80
85
  showSnackbar(t('components.product_variant_dialog.select_variant'), { variant: 'error' });
81
86
  return;
82
87
  }
83
-
84
- callback(selectedVariants);
85
- setDraftQuantities({});
88
+ callback(selectedVariant);
89
+ setSelectedVariant(null);
86
90
  onClose?.();
87
91
  };
88
92
 
89
- const getUsedCount = (variant: IEventProductVariant) => {
93
+ const isVariantDisabled = (variant: IEventProductVariant) => {
90
94
  let countUsed = 0;
95
+ let selectedVariantQuantity = 0;
91
96
 
92
97
  for (const product of products) {
93
98
  if (product.productVariantId === variant.productVariant.id) {
@@ -100,104 +105,70 @@ const ProductVariantsDialog: React.FC<Props> = ({
100
105
  for (const product of ticket.products) {
101
106
  if (product.productVariantId === variant.productVariant.id) {
102
107
  countUsed += product.quantity;
108
+ selectedVariantQuantity = product.quantity;
103
109
  }
104
110
  }
105
111
  }
106
112
  }
107
- return countUsed;
108
- };
109
113
 
110
- const getMaxAvailable = (variant: IEventProductVariant) => {
111
- if (!variant.productVariant.quantity) return Number.POSITIVE_INFINITY;
112
- return variant.productVariant.quantity - variant.productVariant.sold - getUsedCount(variant);
114
+ return (
115
+ (variant.productVariant.quantity &&
116
+ countUsed + variant.productVariant.sold >= variant.productVariant.quantity) ||
117
+ selectedVariantQuantity >= 10
118
+ );
113
119
  };
114
120
 
115
- const isVariantDisabled = (variant: IEventProductVariant) => {
116
- if (!variant.productVariant.quantity) return false;
117
- return getMaxAvailable(variant) <= 0;
118
- };
121
+ const isVariantSoldOut = () => {
122
+ const variant = eventProduct.eventProductVariants.find(
123
+ (product) => product.id === selectedVariant?.eventProductVariantId
124
+ );
125
+ let countUsed = variantQuantity;
119
126
 
120
- const handleAddQuantity = (variant: IEventProductVariant) => {
121
- setDraftQuantities((prev) => {
122
- const current = prev[variant.id] ?? 0;
123
- const next = current + 1;
124
- const maxAvailable = getMaxAvailable(variant);
125
- if (next > 10 || next > maxAvailable) return prev;
126
- if (canAddOnlyOneAtATime) {
127
- // Only allow one variant to be selected
128
- return { [variant.id]: 1 };
127
+ for (const ticket of tickets) {
128
+ if (ticket.products) {
129
+ for (const product of ticket.products) {
130
+ if (product.productVariantId === variant?.productVariant.id) {
131
+ countUsed += product.quantity;
132
+ }
133
+ }
129
134
  }
130
- return { ...prev, [variant.id]: next };
131
- });
132
- };
135
+ }
133
136
 
134
- const handleRemoveQuantity = (variant: IEventProductVariant) => {
135
- setDraftQuantities((prev) => {
136
- const current = prev[variant.id] ?? 0;
137
- const next = current - 1;
138
- if (next <= 0) {
139
- const rest = { ...prev };
140
- delete rest[variant.id];
141
- return rest;
142
- }
143
- if (canAddOnlyOneAtATime) {
144
- // Remove the only variant
145
- return {};
137
+ if (variant && variant.productVariant.quantity) {
138
+ if (
139
+ variant.productVariant.sold + countUsed >= variant.productVariant.quantity ||
140
+ variantQuantity >= 10
141
+ ) {
142
+ return true;
146
143
  }
147
- return { ...prev, [variant.id]: next };
148
- });
144
+ }
145
+ return false;
149
146
  };
150
147
 
151
- const handleRemoveProduct = () => {
152
- const variantsToRemove = eventProduct.eventProductVariants
153
- .filter((variant) => (selectedQuantityByVariant?.[variant.id] ?? 0) > 0)
154
- .map(
155
- (variant) =>
156
- ({
157
- eventProductVariantId: variant.id,
158
- productVariantId: variant.productVariant.id,
159
- quantity: 0,
160
- price: variant.priceWithVat,
161
- excludedShippingMethodIds: eventProduct.excludedShippingMethods.map(
162
- (method) => method.id
163
- ),
164
- }) as IEventProductForm
165
- );
148
+ const handleAddQuantity = () => {
149
+ setVariantQuantity(variantQuantity + 1);
150
+ setSelectedVariant((prevState) => {
151
+ if (!prevState) return null;
152
+ return {
153
+ ...prevState,
154
+ quantity: variantQuantity + 1,
155
+ };
156
+ });
157
+ };
166
158
 
167
- if (variantsToRemove.length === 0) {
168
- return;
159
+ const handleRemoveQuantity = () => {
160
+ if (variantQuantity > 0) {
161
+ setVariantQuantity(variantQuantity - 1);
169
162
  }
170
-
171
- callback(variantsToRemove);
172
- setDraftQuantities({});
173
- onClose?.();
163
+ setSelectedVariant((prevState) => {
164
+ if (!prevState) return null;
165
+ return {
166
+ ...prevState,
167
+ quantity: variantQuantity - 1,
168
+ };
169
+ });
174
170
  };
175
171
 
176
- const hasSelectedVariants = eventProduct.eventProductVariants.some(
177
- (variant) => (selectedQuantityByVariant?.[variant.id] ?? 0) > 0
178
- );
179
-
180
- const variantsById = useMemo(
181
- () => new Map(eventProduct.eventProductVariants.map((variant) => [variant.id, variant])),
182
- [eventProduct.eventProductVariants]
183
- );
184
-
185
- const totalDraftPrice = useMemo(
186
- () =>
187
- Object.entries(draftQuantities).reduce((total, [variantId, qty]) => {
188
- const variant = variantsById.get(Number(variantId));
189
- if (!variant) return total;
190
- return total + variant.priceWithVat * qty;
191
- }, 0),
192
- [draftQuantities, variantsById]
193
- );
194
-
195
- const hasDraftSelection = useMemo(
196
- () =>
197
- eventProduct.eventProductVariants.some((variant) => (draftQuantities[variant.id] ?? 0) > 0),
198
- [eventProduct.eventProductVariants, draftQuantities]
199
- );
200
-
201
172
  return (
202
173
  <Dialog
203
174
  open={openDialog}
@@ -216,19 +187,16 @@ const ProductVariantsDialog: React.FC<Props> = ({
216
187
  },
217
188
  }}
218
189
  >
219
- <DialogTitle
220
- sx={{ textAlign: 'center', fontWeight: 700, fontSize: { xs: '1.5rem', sm: '1.5rem' } }}
221
- >
222
- {eventProduct.product.name}
223
- </DialogTitle>
224
- <DialogContent sx={{ pb: 0 }}>
190
+ <DialogTitle />
191
+ <DialogContent>
225
192
  <Stack spacing={1}>
226
193
  <Image
227
194
  src={eventProduct.product.previewImage.url}
228
195
  alt={eventProduct.product.name}
229
- ratio="16/9"
230
- sx={{ borderRadius: 1 }}
196
+ ratio="1/1"
197
+ sx={{ borderRadius: 2 }}
231
198
  />
199
+ <Typography variant="h5">{eventProduct.product.name}</Typography>
232
200
  <Typography variant="body2" color="primary">
233
201
  {t('form.labels.category')}: {eventProduct.product.category.value.text}
234
202
  </Typography>
@@ -239,145 +207,64 @@ const ProductVariantsDialog: React.FC<Props> = ({
239
207
  </Stack>
240
208
  </DialogContent>
241
209
  <DialogActions sx={{ justifyContent: 'flex-start' }}>
242
- <Stack spacing={1} width="100%">
243
- <Stack spacing={1}>
244
- {eventProduct.eventProductVariants.map((variant) => {
245
- const draftQty = draftQuantities[variant.id] ?? 0;
246
- const maxAvailable = getMaxAvailable(variant);
247
- const isAddDisabled = isVariantDisabled(variant) || maxAvailable <= 0;
248
- const isAnotherSelected =
249
- canAddOnlyOneAtATime &&
250
- Object.keys(draftQuantities).length > 0 &&
251
- !draftQuantities[variant.id];
252
- return (
253
- <Stack
254
- key={variant.id}
255
- direction="row"
256
- spacing={1}
257
- alignItems="center"
258
- width="100%"
210
+ <Stack spacing={2} width="100%">
211
+ <Stack direction="row" spacing={1} flexWrap="wrap" useFlexGap textAlign="left">
212
+ {eventProduct.eventProductVariants.map((variant) => (
213
+ <Button
214
+ key={variant.id}
215
+ onClick={() => handleOnClick(variant)}
216
+ variant={
217
+ variant.id === selectedVariant?.eventProductVariantId ? 'contained' : 'outlined'
218
+ }
219
+ size="large"
220
+ disabled={isOnlyMerchandise ? false : isVariantDisabled(variant)}
221
+ >
222
+ <Badge
223
+ color="primary"
224
+ badgeContent={
225
+ selectedQuantityByVariant ? selectedQuantityByVariant[variant.id] : 0
226
+ }
227
+ sx={{ position: 'unset' }}
259
228
  >
260
- <Box
261
- sx={{
262
- minWidth: 64,
263
- maxWidth: 64,
264
- height: 36,
265
- borderRadius: 1,
266
- fontWeight: 700,
267
- border: 1,
268
- borderColor: 'divider',
269
- bgcolor: 'background.paper',
270
- color: 'text.primary',
271
- display: 'flex',
272
- alignItems: 'center',
273
- justifyContent: 'center',
274
- }}
275
- >
276
- {variant.productVariant.value}
277
- </Box>
278
- {draftQty > 0 ? (
279
- <Box
280
- sx={{
281
- flex: 1,
282
- display: 'grid',
283
- gridTemplateColumns: canAddOnlyOneAtATime
284
- ? 'repeat(2, minmax(0, 1fr))'
285
- : 'repeat(3, minmax(0, 1fr))',
286
- gap: 1,
287
- alignItems: 'center',
288
- }}
289
- >
290
- <Button
291
- variant="outlined"
292
- onClick={() => handleRemoveQuantity(variant)}
293
- disabled={draftQty < 1}
294
- sx={{
295
- minWidth: 0,
296
- height: 36,
297
- borderRadius: 1,
298
- fontWeight: 700,
299
- borderColor: 'grey.300',
300
- color: 'text.primary',
301
- }}
302
- >
303
- -
304
- </Button>
305
- <Typography
306
- sx={{
307
- minWidth: 0,
308
- height: 36,
309
- borderRadius: 1,
310
- border: 1,
311
- borderColor: 'divider',
312
- boxSizing: 'border-box',
313
- display: 'flex',
314
- alignItems: 'center',
315
- justifyContent: 'center',
316
- textAlign: 'center',
317
- fontWeight: 700,
318
- color: 'text.primary',
319
- }}
320
- >
321
- {draftQty}
322
- </Typography>
323
- {!canAddOnlyOneAtATime && (
324
- <Button
325
- variant="contained"
326
- onClick={() => handleAddQuantity(variant)}
327
- disabled={draftQty >= 10 || draftQty >= maxAvailable}
328
- sx={{ minWidth: 0, height: 36, borderRadius: 1, fontWeight: 700 }}
329
- >
330
- +
331
- </Button>
332
- )}
333
- </Box>
334
- ) : (
335
- <Button
336
- variant="contained"
337
- onClick={() => handleAddQuantity(variant)}
338
- disabled={isOnlyMerchandise ? false : isAddDisabled || isAnotherSelected}
339
- sx={{
340
- flex: 1,
341
- height: 36,
342
- borderRadius: 1,
343
- fontWeight: 700,
344
- textTransform: 'none',
345
- }}
346
- >
347
- {t('add')}
348
- </Button>
349
- )}
350
-
351
- <Typography variant="body1">
352
- {variant.priceWithVat > 0
353
- ? fCurrency(variant.priceWithVat, lang, eventProduct.product.currency)
354
- : t('free')}
355
- </Typography>
356
- </Stack>
357
- );
358
- })}
229
+ {variant.productVariant.value}
230
+ </Badge>
231
+ </Button>
232
+ ))}
359
233
  </Stack>
360
- <Stack
361
- direction="row"
362
- spacing={1}
363
- justifyContent="space-between"
364
- alignItems="center"
365
- width="100%"
366
- >
367
- <Typography variant="body1">{t('form.labels.total')}</Typography>
368
- <Typography variant="body1" fontWeight={600}>
369
- {fCurrency(totalDraftPrice, lang, eventProduct.product.currency)}
234
+ <Stack direction="row" justifyContent="space-between" alignItems="center" pt={1}>
235
+ {selectedVariant && isOnlyMerchandise && (
236
+ <Stack direction="row" alignItems="center" spacing={1}>
237
+ <IconButton
238
+ size="small"
239
+ color="primary"
240
+ onClick={handleRemoveQuantity}
241
+ disabled={variantQuantity < 1}
242
+ >
243
+ <Iconify icon="eva:minus-fill" />
244
+ </IconButton>
245
+ <Typography color="grey.500">{variantQuantity}</Typography>
246
+ <IconButton
247
+ size="small"
248
+ color="primary"
249
+ onClick={handleAddQuantity}
250
+ disabled={isVariantSoldOut()}
251
+ >
252
+ <Iconify icon="eva:plus-fill" />
253
+ </IconButton>
254
+ </Stack>
255
+ )}
256
+ <Typography variant="h4" textAlign="right" mt={0}>
257
+ {variantPrice !== null
258
+ ? variantPrice > 0
259
+ ? fCurrency(variantPrice, lang, eventProduct.product.currency)
260
+ : t('free')
261
+ : t('unselected')}
370
262
  </Typography>
371
263
  </Stack>
372
264
  <Stack direction="row" spacing={1} justifyContent="flex-end" width="100%">
373
- {hasSelectedVariants && !canAddOnlyOneAtATime && (
374
- <Button variant="outlined" color="error" onClick={handleRemoveProduct}>
375
- {t('remove')}
376
- </Button>
377
- )}
378
265
  {onClose && <Button onClick={onClose}>{t('cancel')}</Button>}
379
- <Button variant="contained" onClick={handleOnAdd} disabled={!hasDraftSelection}>
380
- {t('confirm')}
266
+ <Button variant="contained" onClick={handleOnAdd} disabled={!selectedVariant}>
267
+ {t('add')}
381
268
  </Button>
382
269
  </Stack>
383
270
  </Stack>
@@ -7,8 +7,6 @@ const cs = {
7
7
  add: 'Přidat',
8
8
  confirm: 'Potvrdit',
9
9
  cancel: 'Zrušit',
10
- close: 'Zavřít',
11
- remove: 'Odstranit',
12
10
  pay: 'Zaplatit',
13
11
  change: 'Změnit',
14
12
  free: 'Zdarma',
@@ -41,7 +39,7 @@ const cs = {
41
39
  promo_code: 'Slevový kód',
42
40
  start_date: 'Datum konání',
43
41
  organizer: 'Pořadatel',
44
- total: 'Celkem',
42
+ total: 'Celkem ',
45
43
  with_fee: 'vč. servisního poplatku',
46
44
  service_fee: 'Servisní poplatek',
47
45
  shipping_fee: 'Doprava',
@@ -55,8 +53,6 @@ const cs = {
55
53
  category: 'Kategorie',
56
54
  sms_notification: 'SMS notifikace',
57
55
  open_map: 'Otevřít mapu',
58
- payment_overview_open: 'Otevřít přehled platby',
59
- payment_overview_close: 'Zavřít přehled platby',
60
56
  },
61
57
  validation: {
62
58
  required: 'Toto pole je povinné.',
@@ -109,13 +105,9 @@ const cs = {
109
105
  7: {
110
106
  title: 'Přidružené eventy',
111
107
  },
112
- 8: {
113
- title: 'EventLook služby',
114
- additional_info: 'Více informací ke službám',
115
- },
116
108
  },
117
109
  terms_and_conditions:
118
- 'Souhlasím s <0>Obchodními podmínkami</0> {{termsAndConditionsCompanies}} a <1>Zásady soukromí</1>.',
110
+ 'Odesláním objednávky souhlasím s <0>Obchodními podmínkami</0> {{termsAndConditionsCompanies}} a beru na vědomí <1>Zásady soukromí</1>.',
119
111
  insurance: {
120
112
  label: 'Pojištění vstupenek',
121
113
  per_ticket: 'ks',
@@ -135,13 +127,6 @@ const cs = {
135
127
  price: 'Cena SMS připomenutí termínu akce',
136
128
  },
137
129
  },
138
- merchandise: {
139
- show_sizes: 'Zobrazit velikosti',
140
- show_added: 'Zobrazit přidané',
141
- },
142
- services: {
143
- add_tickets_first: 'Nejdříve prosím přidejte vstupenky',
144
- },
145
130
  order_success: {
146
131
  title: 'Vstupenky byly úspěšně zarezervovány. Teď už zbývá jenom zaplatit.',
147
132
  description:
@@ -7,8 +7,6 @@ const en = {
7
7
  add: 'Add',
8
8
  confirm: 'Confirm',
9
9
  cancel: 'Cancel',
10
- close: 'Close',
11
- remove: 'Remove',
12
10
  pay: 'Pay',
13
11
  change: 'Change',
14
12
  free: 'Free',
@@ -55,8 +53,6 @@ const en = {
55
53
  category: 'Category',
56
54
  sms_notification: 'SMS notification',
57
55
  open_map: 'Open map',
58
- payment_overview_open: 'Open payment overview',
59
- payment_overview_close: 'Close payment overview',
60
56
  },
61
57
  validation: {
62
58
  required: 'This field is required.',
@@ -109,13 +105,9 @@ const en = {
109
105
  7: {
110
106
  title: 'Associated events',
111
107
  },
112
- 8: {
113
- title: 'EventLook services',
114
- additional_info: 'More information about services',
115
- },
116
108
  },
117
109
  terms_and_conditions:
118
- 'I agree with the <0>Terms and Conditions</0> {{termsAndConditionsCompanies}} and the <1>Privacy Policy</1>.',
110
+ 'By submitting the order, I agree to the <0>Terms and Conditions</0> of {{termsAndConditionsCompanies}} and acknowledge the <1>Privacy Policy</1>.',
119
111
  insurance: {
120
112
  label: 'Ticket insurance',
121
113
  per_ticket: 'pc',
@@ -132,17 +124,10 @@ const en = {
132
124
  label: 'SMS event reminder',
133
125
  modal: {
134
126
  description:
135
- "Event reminder the day before: SMS will notify you about the upcoming event so you don't forget and have time to prepare.",
127
+ 'Event reminder the day before: SMS will notify you about the upcoming event so you don\'t forget and have time to prepare.',
136
128
  price: 'SMS event reminder price',
137
129
  },
138
130
  },
139
- merchandise: {
140
- show_sizes: 'Show sizes',
141
- show_added: 'Show added',
142
- },
143
- services: {
144
- add_tickets_first: 'Please add tickets first',
145
- },
146
131
  order_success: {
147
132
  title: 'Tickets have been successfully reserved. Now you just need to pay.',
148
133
  description:
@@ -7,8 +7,6 @@ const es = {
7
7
  add: 'Añadir',
8
8
  confirm: 'Confirmar',
9
9
  cancel: 'Cancelar',
10
- close: 'Cerrar',
11
- remove: 'Eliminar',
12
10
  pay: 'Pagar',
13
11
  change: 'Cambiar',
14
12
  free: 'Gratis',
@@ -55,8 +53,6 @@ const es = {
55
53
  category: 'Categoría',
56
54
  sms_notification: 'Notificación SMS',
57
55
  open_map: 'Abrir mapa',
58
- payment_overview_open: 'Abrir resumen de pago',
59
- payment_overview_close: 'Cerrar resumen de pago',
60
56
  },
61
57
  validation: {
62
58
  required: 'Este campo es obligatorio.',
@@ -109,13 +105,9 @@ const es = {
109
105
  7: {
110
106
  title: 'Eventos asociados',
111
107
  },
112
- 8: {
113
- title: 'EventLook servicios',
114
- additional_info: 'Más información sobre los servicios',
115
- },
116
108
  },
117
109
  terms_and_conditions:
118
- 'Estoy de acuerdo con los <0>Términos y Condiciones</0> de {{termsAndConditionsCompanies}} y la <1>Política de Privacidad</1>.',
110
+ 'Al enviar el pedido, acepto los <0>Términos y Condiciones</0> de {{termsAndConditionsCompanies}} y reconozco la <1>Política de Privacidad</1>.',
119
111
  insurance: {
120
112
  label: 'Seguro de entrada',
121
113
  per_ticket: 'pc',
@@ -136,13 +128,6 @@ const es = {
136
128
  price: 'Precio del recordatorio por SMS del evento',
137
129
  },
138
130
  },
139
- merchandise: {
140
- show_sizes: 'Mostrar tallas',
141
- show_added: 'Mostrar añadidos',
142
- },
143
- services: {
144
- add_tickets_first: 'Por favor, agregue entradas primero',
145
- },
146
131
  order_success: {
147
132
  title: 'Las entradas han sido reservadas con éxito. Ahora solo tienes que pagar.',
148
133
  description: