@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
@@ -1,10 +1,12 @@
1
1
  import React, { useEffect, useState } from 'react';
2
2
  import {
3
+ Badge,
3
4
  Button,
4
5
  Dialog,
5
6
  DialogActions,
6
7
  DialogContent,
7
8
  DialogTitle,
9
+ IconButton,
8
10
  Stack,
9
11
  Typography,
10
12
  } from '@mui/material';
@@ -15,16 +17,16 @@ import { ITicketFormTicket } from '@utils/types/ticket.type';
15
17
  import { IEventProductForm } from '@utils/types/product.type';
16
18
  import { fCurrency } from '@utils/formatNumber';
17
19
  import useGlobal from '@hooks/useGlobal.ts';
20
+ import { Iconify } from '@components';
18
21
 
19
22
  interface Props {
20
23
  eventProduct: IEventProduct;
21
24
  eventId: number;
22
25
  openDialog: boolean;
23
- callback: (variants: IEventProductForm[]) => void;
26
+ callback: (variant: IEventProductForm) => void;
24
27
  onClose?: () => void;
25
28
  selectedQuantityByVariant?: Record<number, number>;
26
29
  isOnlyMerchandise?: boolean;
27
- canAddOnlyOneAtATime?: boolean;
28
30
  }
29
31
 
30
32
  const ProductVariantsDialog: React.FC<Props> = ({
@@ -35,11 +37,13 @@ const ProductVariantsDialog: React.FC<Props> = ({
35
37
  selectedQuantityByVariant,
36
38
  isOnlyMerchandise,
37
39
  eventId,
38
- canAddOnlyOneAtATime,
39
40
  }) => {
40
41
  const { t, lang, options } = useGlobal();
41
42
  const { showSnackbar } = useGlobal();
42
- 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);
43
47
  const tickets: ITicketFormTicket[] = useWatch({ name: `tickets.${eventId}`, defaultValue: [] });
44
48
  const products: IEventProductForm[] = useWatch({ name: `products.${eventId}`, defaultValue: [] });
45
49
 
@@ -52,41 +56,43 @@ const ProductVariantsDialog: React.FC<Props> = ({
52
56
  }, [openDialog]);
53
57
 
54
58
  useEffect(() => {
55
- if (openDialog) {
56
- 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);
57
68
  }
58
- }, [openDialog, selectedQuantityByVariant, canAddOnlyOneAtATime]);
69
+ }, [selectedVariant, isVariantClicked]);
59
70
 
60
- const handleOnAdd = () => {
61
- const selectedVariants = eventProduct.eventProductVariants
62
- .map((variant) => {
63
- const quantity = draftQuantities[variant.id] ?? 0;
64
- const selectedQty = selectedQuantityByVariant?.[variant.id] ?? 0;
65
- if (quantity <= 0 && selectedQty <= 0) return null;
66
- return {
67
- eventProductVariantId: variant.id,
68
- productVariantId: variant.productVariant.id,
69
- quantity,
70
- price: variant.priceWithVat,
71
- excludedShippingMethodIds: eventProduct.excludedShippingMethods.map(
72
- (method) => method.id
73
- ),
74
- } as IEventProductForm;
75
- })
76
- .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
+ };
77
82
 
78
- if (selectedVariants.length === 0) {
83
+ const handleOnAdd = () => {
84
+ if (!selectedVariant) {
79
85
  showSnackbar(t('components.product_variant_dialog.select_variant'), { variant: 'error' });
80
86
  return;
81
87
  }
82
-
83
- callback(selectedVariants);
84
- setDraftQuantities({});
88
+ callback(selectedVariant);
89
+ setSelectedVariant(null);
85
90
  onClose?.();
86
91
  };
87
92
 
88
- const getUsedCount = (variant: IEventProductVariant) => {
93
+ const isVariantDisabled = (variant: IEventProductVariant) => {
89
94
  let countUsed = 0;
95
+ let selectedVariantQuantity = 0;
90
96
 
91
97
  for (const product of products) {
92
98
  if (product.productVariantId === variant.productVariant.id) {
@@ -99,82 +105,70 @@ const ProductVariantsDialog: React.FC<Props> = ({
99
105
  for (const product of ticket.products) {
100
106
  if (product.productVariantId === variant.productVariant.id) {
101
107
  countUsed += product.quantity;
108
+ selectedVariantQuantity = product.quantity;
102
109
  }
103
110
  }
104
111
  }
105
112
  }
106
- return countUsed;
107
- };
108
113
 
109
- const getMaxAvailable = (variant: IEventProductVariant) => {
110
- if (!variant.productVariant.quantity) return Number.POSITIVE_INFINITY;
111
- 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
+ );
112
119
  };
113
120
 
114
- const isVariantDisabled = (variant: IEventProductVariant) => {
115
- if (!variant.productVariant.quantity) return false;
116
- return getMaxAvailable(variant) <= 0;
117
- };
121
+ const isVariantSoldOut = () => {
122
+ const variant = eventProduct.eventProductVariants.find(
123
+ (product) => product.id === selectedVariant?.eventProductVariantId
124
+ );
125
+ let countUsed = variantQuantity;
118
126
 
119
- const handleAddQuantity = (variant: IEventProductVariant) => {
120
- setDraftQuantities((prev) => {
121
- const current = prev[variant.id] ?? 0;
122
- const next = current + 1;
123
- const maxAvailable = getMaxAvailable(variant);
124
- if (next > 10 || next > maxAvailable) return prev;
125
- if (canAddOnlyOneAtATime) {
126
- // Only allow one variant to be selected
127
- 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
+ }
128
134
  }
129
- return { ...prev, [variant.id]: next };
130
- });
131
- };
135
+ }
132
136
 
133
- const handleRemoveQuantity = (variant: IEventProductVariant) => {
134
- setDraftQuantities((prev) => {
135
- const current = prev[variant.id] ?? 0;
136
- const next = current - 1;
137
- if (next <= 0) {
138
- const { [variant.id]: _removed, ...rest } = prev;
139
- return rest;
137
+ if (variant && variant.productVariant.quantity) {
138
+ if (
139
+ variant.productVariant.sold + countUsed >= variant.productVariant.quantity ||
140
+ variantQuantity >= 10
141
+ ) {
142
+ return true;
140
143
  }
141
- if (canAddOnlyOneAtATime) {
142
- // Remove the only variant
143
- return {};
144
- }
145
- return { ...prev, [variant.id]: next };
146
- });
144
+ }
145
+ return false;
147
146
  };
148
147
 
149
- const handleRemoveProduct = () => {
150
- const variantsToRemove = eventProduct.eventProductVariants
151
- .filter((variant) => (selectedQuantityByVariant?.[variant.id] ?? 0) > 0)
152
- .map(
153
- (variant) =>
154
- ({
155
- eventProductVariantId: variant.id,
156
- productVariantId: variant.productVariant.id,
157
- quantity: 0,
158
- price: variant.priceWithVat,
159
- excludedShippingMethodIds: eventProduct.excludedShippingMethods.map(
160
- (method) => method.id
161
- ),
162
- }) as IEventProductForm
163
- );
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
+ };
164
158
 
165
- if (variantsToRemove.length === 0) {
166
- return;
159
+ const handleRemoveQuantity = () => {
160
+ if (variantQuantity > 0) {
161
+ setVariantQuantity(variantQuantity - 1);
167
162
  }
168
-
169
- callback(variantsToRemove);
170
- setDraftQuantities({});
171
- onClose?.();
163
+ setSelectedVariant((prevState) => {
164
+ if (!prevState) return null;
165
+ return {
166
+ ...prevState,
167
+ quantity: variantQuantity - 1,
168
+ };
169
+ });
172
170
  };
173
171
 
174
- const hasSelectedVariants = eventProduct.eventProductVariants.some(
175
- (variant) => (selectedQuantityByVariant?.[variant.id] ?? 0) > 0
176
- );
177
-
178
172
  return (
179
173
  <Dialog
180
174
  open={openDialog}
@@ -193,17 +187,16 @@ const ProductVariantsDialog: React.FC<Props> = ({
193
187
  },
194
188
  }}
195
189
  >
196
- <DialogTitle sx={{ textAlign: 'center', fontWeight: 700 }}>
197
- {eventProduct.product.name}
198
- </DialogTitle>
190
+ <DialogTitle />
199
191
  <DialogContent>
200
192
  <Stack spacing={1}>
201
193
  <Image
202
194
  src={eventProduct.product.previewImage.url}
203
195
  alt={eventProduct.product.name}
204
- ratio="16/9"
196
+ ratio="1/1"
205
197
  sx={{ borderRadius: 2 }}
206
198
  />
199
+ <Typography variant="h5">{eventProduct.product.name}</Typography>
207
200
  <Typography variant="body2" color="primary">
208
201
  {t('form.labels.category')}: {eventProduct.product.category.value.text}
209
202
  </Typography>
@@ -215,113 +208,62 @@ const ProductVariantsDialog: React.FC<Props> = ({
215
208
  </DialogContent>
216
209
  <DialogActions sx={{ justifyContent: 'flex-start' }}>
217
210
  <Stack spacing={2} width="100%">
218
- <Stack spacing={1.5}>
219
- {eventProduct.eventProductVariants.map((variant) => {
220
- const draftQty = draftQuantities[variant.id] ?? 0;
221
- const selectedQty = selectedQuantityByVariant?.[variant.id] ?? 0;
222
- const maxAvailable = getMaxAvailable(variant);
223
- const isAddDisabled = isVariantDisabled(variant) || maxAvailable <= 0;
224
- const isAnotherSelected =
225
- canAddOnlyOneAtATime &&
226
- Object.keys(draftQuantities).length > 0 &&
227
- !draftQuantities[variant.id];
228
- return (
229
- <Stack
230
- key={variant.id}
231
- direction="row"
232
- spacing={1}
233
- alignItems="center"
234
- 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' }}
235
228
  >
236
- <Button
237
- onClick={() => handleAddQuantity(variant)}
238
- variant={draftQty > 0 ? 'contained' : 'outlined'}
239
- size="large"
240
- disabled={isOnlyMerchandise ? false : isAddDisabled || isAnotherSelected}
241
- sx={{
242
- minWidth: 64,
243
- height: 40,
244
- borderRadius: 1,
245
- fontWeight: 700,
246
- }}
247
- >
248
- {variant.productVariant.value}
249
- </Button>
250
- {draftQty > 0 ? (
251
- <Stack direction="row" spacing={1} alignItems="center" sx={{ flex: 1 }}>
252
- <Button
253
- variant="outlined"
254
- onClick={() => handleRemoveQuantity(variant)}
255
- disabled={draftQty < 1}
256
- sx={{ minWidth: 40, height: 40, borderRadius: 1, fontWeight: 700 }}
257
- >
258
- -
259
- </Button>
260
- <Typography
261
- sx={{
262
- minWidth: 40,
263
- textAlign: 'center',
264
- fontWeight: 700,
265
- color: 'text.secondary',
266
- }}
267
- >
268
- {draftQty}
269
- </Typography>
270
- {!canAddOnlyOneAtATime && (
271
- <Button
272
- variant="contained"
273
- onClick={() => handleAddQuantity(variant)}
274
- disabled={draftQty >= 10 || draftQty >= maxAvailable}
275
- sx={{ minWidth: 40, height: 40, borderRadius: 1, fontWeight: 700 }}
276
- >
277
- +
278
- </Button>
279
- )}
280
- </Stack>
281
- ) : (
282
- <Button
283
- variant="contained"
284
- onClick={() => handleAddQuantity(variant)}
285
- disabled={isOnlyMerchandise ? false : isAddDisabled || isAnotherSelected}
286
- sx={{
287
- flex: 1,
288
- height: 40,
289
- borderRadius: 1,
290
- fontWeight: 700,
291
- textTransform: 'none',
292
- }}
293
- >
294
- {t('add')}
295
- </Button>
296
- )}
297
- <Stack direction="row" spacing={1} alignItems="center">
298
- {selectedQty > 0 && (
299
- <Typography variant="caption" color="text.secondary">
300
- {selectedQty}x
301
- </Typography>
302
- )}
303
- <Typography variant="body1" fontWeight={600}>
304
- {variant.priceWithVat > 0
305
- ? fCurrency(variant.priceWithVat, lang, eventProduct.product.currency)
306
- : t('free')}
307
- </Typography>
308
- </Stack>
309
- </Stack>
310
- );
311
- })}
312
- </Stack>
313
- <Stack direction="row" spacing={1} justifyContent="flex-end" width="100%">
314
- {hasSelectedVariants && !canAddOnlyOneAtATime && (
315
- <Button variant="outlined" color="error" onClick={handleRemoveProduct}>
316
- {t('remove')}
229
+ {variant.productVariant.value}
230
+ </Badge>
317
231
  </Button>
232
+ ))}
233
+ </Stack>
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>
318
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')}
262
+ </Typography>
263
+ </Stack>
264
+ <Stack direction="row" spacing={1} justifyContent="flex-end" width="100%">
319
265
  {onClose && <Button onClick={onClose}>{t('cancel')}</Button>}
320
- <Button
321
- variant="contained"
322
- onClick={handleOnAdd}
323
- disabled={!Object.values(draftQuantities).some((qty) => qty > 0)}
324
- >
266
+ <Button variant="contained" onClick={handleOnAdd} disabled={!selectedVariant}>
325
267
  {t('add')}
326
268
  </Button>
327
269
  </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,10 +105,6 @@ 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
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>.',
@@ -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,10 +105,6 @@ 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
110
  'By submitting the order, I agree to the <0>Terms and Conditions</0> of {{termsAndConditionsCompanies}} and acknowledge the <1>Privacy Policy</1>.',
@@ -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,10 +105,6 @@ 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
110
  'Al enviar el pedido, acepto los <0>Términos y Condiciones</0> de {{termsAndConditionsCompanies}} y reconozco la <1>Política de Privacidad</1>.',
@@ -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:
@@ -7,8 +7,6 @@ const pl = {
7
7
  add: 'Dodaj',
8
8
  confirm: 'Potwierdź',
9
9
  cancel: 'Anuluj',
10
- close: 'Zamknij',
11
- remove: 'Usuń',
12
10
  pay: 'Zapłać',
13
11
  change: 'Zmień',
14
12
  free: 'Darmowe',
@@ -55,8 +53,6 @@ const pl = {
55
53
  category: 'Kategoria',
56
54
  sms_notification: 'Powiadomienie SMS',
57
55
  open_map: 'Otwórz mapę',
58
- payment_overview_open: 'Otwórz podsumowanie płatności',
59
- payment_overview_close: 'Zamknij podsumowanie płatności',
60
56
  },
61
57
  validation: {
62
58
  required: 'To pole jest wymagane.',
@@ -109,10 +105,6 @@ const pl = {
109
105
  7: {
110
106
  title: 'Powiązane wydarzenia',
111
107
  },
112
- 8: {
113
- title: 'EventLook usługi',
114
- additional_info: 'Więcej informacji o usługach',
115
- },
116
108
  },
117
109
  terms_and_conditions:
118
110
  'Składając zamówienie, akceptuję <0>Regulamin</0> {{termsAndConditionsCompanies}} oraz potwierdzam <1>Politykę prywatności</1>.',
@@ -136,13 +128,6 @@ const pl = {
136
128
  price: 'Cena przypomnienia SMS o wydarzeniu',
137
129
  },
138
130
  },
139
- merchandise: {
140
- show_sizes: 'Pokaż rozmiary',
141
- show_added: 'Pokaż dodane',
142
- },
143
- services: {
144
- add_tickets_first: 'Najpierw dodaj bilety',
145
- },
146
131
  order_success: {
147
132
  title: 'Bilety zostały pomyślnie zarezerwowane. Teraz wystarczy zapłacić.',
148
133
  description:
@@ -7,8 +7,6 @@ const sk = {
7
7
  add: 'Pridať',
8
8
  confirm: 'Potvrdiť',
9
9
  cancel: 'Zrušiť',
10
- close: 'Zavrieť',
11
- remove: 'Odstrániť',
12
10
  pay: 'Zaplaťte',
13
11
  change: 'Zmeniť',
14
12
  free: 'Zadarmo',
@@ -55,8 +53,6 @@ const sk = {
55
53
  category: 'Kategória',
56
54
  sms_notification: 'SMS notifikácia',
57
55
  open_map: 'Otvoriť mapu',
58
- payment_overview_open: 'Otvoriť prehľad platby',
59
- payment_overview_close: 'Zavrieť prehľad platby',
60
56
  },
61
57
  validation: {
62
58
  required: 'Toto pole je povinné.',
@@ -109,10 +105,6 @@ const sk = {
109
105
  7: {
110
106
  title: 'Pridružené eventy',
111
107
  },
112
- 8: {
113
- title: 'EventLook služby',
114
- additional_info: 'Viac informácií o službách',
115
- },
116
108
  },
117
109
  terms_and_conditions:
118
110
  'Odoslaním objednávky súhlasím s <0>Obchodnými podmienkami</0> {{termsAndConditionsCompanies}} a beriem na vedomie <1>Zásady ochrany osobných údajov</1>.',
@@ -136,13 +128,6 @@ const sk = {
136
128
  price: 'Cena SMS pripomenutia termínu akcie',
137
129
  },
138
130
  },
139
- merchandise: {
140
- show_sizes: 'Zobraziť veľkosti',
141
- show_added: 'Zobraziť pridané',
142
- },
143
- services: {
144
- add_tickets_first: 'Najskôr prosím pridajte lístky',
145
- },
146
131
  order_success: {
147
132
  title: 'Vstupenky boli úspešne rezervované. Teraz už len zaplatiť.',
148
133
  description: