@eventlook/sdk 1.4.44 → 1.4.46-beta.1

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 (589) hide show
  1. package/.env.example +1 -0
  2. package/package.json +3 -1
  3. package/rollup.config.mjs +2 -0
  4. package/src/components/hook-form/FormProvider.tsx +5 -2
  5. package/src/form/ChildEventDialog.tsx +3 -3
  6. package/src/form/ContactPerson.tsx +1 -1
  7. package/src/form/PaymentOverviewBox.tsx +39 -72
  8. package/src/form/PaymentOverviewDrawer.tsx +169 -0
  9. package/src/form/PaymentPending.tsx +1 -1
  10. package/src/form/TicketForm.tsx +53 -17
  11. package/src/form/index.tsx +3 -1
  12. package/src/form/merchandise/MerchandiseSelection.tsx +24 -0
  13. package/src/form/merchandise/MerchandiseSlider.tsx +61 -0
  14. package/src/form/payment/FeeBox.tsx +0 -10
  15. package/src/form/payment/PaymentOverviewCheckbox.tsx +33 -56
  16. package/src/form/product/ProductCard.tsx +60 -55
  17. package/src/form/product/ProductVariantsDialog.tsx +195 -137
  18. package/src/form/services/index.tsx +217 -0
  19. package/src/form/tickets/ReleaseDescription.tsx +57 -0
  20. package/src/form/tickets/ReleaseWithMerchandise.tsx +237 -0
  21. package/src/form/tickets/TicketQuantityControl.tsx +93 -0
  22. package/src/form/{TicketSelection.tsx → tickets/TicketSelection.tsx} +140 -105
  23. package/src/form/tickets/TicketSelectionMobile.tsx +175 -0
  24. package/src/form/{TicketWithMerchandiseSelection.tsx → tickets/TicketWithMerchandiseSelection.tsx} +15 -11
  25. package/src/locales/cs.tsx +7 -1
  26. package/src/locales/en.tsx +7 -1
  27. package/src/locales/es.tsx +6 -0
  28. package/src/locales/pl.tsx +6 -0
  29. package/src/locales/sk.tsx +6 -0
  30. package/src/locales/uk.tsx +6 -0
  31. package/src/utils/data/global.ts +1 -0
  32. package/tsconfig.json +2 -1
  33. package/.claude/settings.local.json +0 -9
  34. package/dist/cjs/components/ClientOnly.js +0 -19
  35. package/dist/cjs/components/ClientOnly.js.map +0 -1
  36. package/dist/cjs/components/CustomSkeleton.js +0 -15
  37. package/dist/cjs/components/CustomSkeleton.js.map +0 -1
  38. package/dist/cjs/components/Image.js +0 -56
  39. package/dist/cjs/components/Image.js.map +0 -1
  40. package/dist/cjs/components/Label.js +0 -65
  41. package/dist/cjs/components/Label.js.map +0 -1
  42. package/dist/cjs/components/TextIconLabel.js +0 -19
  43. package/dist/cjs/components/TextIconLabel.js.map +0 -1
  44. package/dist/cjs/components/TicketFormSkeleton.js +0 -55
  45. package/dist/cjs/components/TicketFormSkeleton.js.map +0 -1
  46. package/dist/cjs/components/Trans.js +0 -87
  47. package/dist/cjs/components/Trans.js.map +0 -1
  48. package/dist/cjs/components/animate/IconButtonAnimate.js +0 -29
  49. package/dist/cjs/components/animate/IconButtonAnimate.js.map +0 -1
  50. package/dist/cjs/components/animate/MotionContainer.js +0 -18
  51. package/dist/cjs/components/animate/MotionContainer.js.map +0 -1
  52. package/dist/cjs/components/animate/variants/bounce.js +0 -98
  53. package/dist/cjs/components/animate/variants/bounce.js.map +0 -1
  54. package/dist/cjs/components/animate/variants/container.js +0 -25
  55. package/dist/cjs/components/animate/variants/container.js.map +0 -1
  56. package/dist/cjs/components/animate/variants/transition.js +0 -17
  57. package/dist/cjs/components/animate/variants/transition.js.map +0 -1
  58. package/dist/cjs/components/confirm-dialog/ConfirmDialog.js +0 -24
  59. package/dist/cjs/components/confirm-dialog/ConfirmDialog.js.map +0 -1
  60. package/dist/cjs/components/hook-form/FormProvider.js +0 -14
  61. package/dist/cjs/components/hook-form/FormProvider.js.map +0 -1
  62. package/dist/cjs/components/hook-form/RHFCheckbox.js +0 -15
  63. package/dist/cjs/components/hook-form/RHFCheckbox.js.map +0 -1
  64. package/dist/cjs/components/hook-form/RHFDatePicker.js +0 -22
  65. package/dist/cjs/components/hook-form/RHFDatePicker.js.map +0 -1
  66. package/dist/cjs/components/hook-form/RHFPhone.js +0 -24
  67. package/dist/cjs/components/hook-form/RHFPhone.js.map +0 -1
  68. package/dist/cjs/components/hook-form/RHFRadioGroup.js +0 -29
  69. package/dist/cjs/components/hook-form/RHFRadioGroup.js.map +0 -1
  70. package/dist/cjs/components/hook-form/RHFSelect.js +0 -34
  71. package/dist/cjs/components/hook-form/RHFSelect.js.map +0 -1
  72. package/dist/cjs/components/hook-form/RHFTextField.js +0 -15
  73. package/dist/cjs/components/hook-form/RHFTextField.js.map +0 -1
  74. package/dist/cjs/components/iconify/Iconify.js +0 -14
  75. package/dist/cjs/components/iconify/Iconify.js.map +0 -1
  76. package/dist/cjs/context/GlobalContext.js +0 -65
  77. package/dist/cjs/context/GlobalContext.js.map +0 -1
  78. package/dist/cjs/form/ChildEventCard.js +0 -60
  79. package/dist/cjs/form/ChildEventCard.js.map +0 -1
  80. package/dist/cjs/form/ChildEventDialog.js +0 -30
  81. package/dist/cjs/form/ChildEventDialog.js.map +0 -1
  82. package/dist/cjs/form/ChildEvents.js +0 -17
  83. package/dist/cjs/form/ChildEvents.js.map +0 -1
  84. package/dist/cjs/form/ContactPerson.js +0 -40
  85. package/dist/cjs/form/ContactPerson.js.map +0 -1
  86. package/dist/cjs/form/EmailConfirmation.js +0 -28
  87. package/dist/cjs/form/EmailConfirmation.js.map +0 -1
  88. package/dist/cjs/form/MerchandiseSelection.js +0 -17
  89. package/dist/cjs/form/MerchandiseSelection.js.map +0 -1
  90. package/dist/cjs/form/OrderSuccess.js +0 -57
  91. package/dist/cjs/form/OrderSuccess.js.map +0 -1
  92. package/dist/cjs/form/Payment.js +0 -214
  93. package/dist/cjs/form/Payment.js.map +0 -1
  94. package/dist/cjs/form/PaymentOverviewBox.js +0 -413
  95. package/dist/cjs/form/PaymentOverviewBox.js.map +0 -1
  96. package/dist/cjs/form/PaymentPending.js +0 -26
  97. package/dist/cjs/form/PaymentPending.js.map +0 -1
  98. package/dist/cjs/form/PaymentSuccess.js +0 -203
  99. package/dist/cjs/form/PaymentSuccess.js.map +0 -1
  100. package/dist/cjs/form/ReleaseCountdown.js +0 -34
  101. package/dist/cjs/form/ReleaseCountdown.js.map +0 -1
  102. package/dist/cjs/form/ReleaseWithMerchandise.js +0 -130
  103. package/dist/cjs/form/ReleaseWithMerchandise.js.map +0 -1
  104. package/dist/cjs/form/ScriptLoader.js +0 -21
  105. package/dist/cjs/form/ScriptLoader.js.map +0 -1
  106. package/dist/cjs/form/Shipping.js +0 -119
  107. package/dist/cjs/form/Shipping.js.map +0 -1
  108. package/dist/cjs/form/TicketForm.js +0 -470
  109. package/dist/cjs/form/TicketForm.js.map +0 -1
  110. package/dist/cjs/form/TicketSelection.js +0 -174
  111. package/dist/cjs/form/TicketSelection.js.map +0 -1
  112. package/dist/cjs/form/TicketSelectionMap.js +0 -67
  113. package/dist/cjs/form/TicketSelectionMap.js.map +0 -1
  114. package/dist/cjs/form/TicketWithMerchandiseSelection.js +0 -117
  115. package/dist/cjs/form/TicketWithMerchandiseSelection.js.map +0 -1
  116. package/dist/cjs/form/TimeslotSelection.js +0 -68
  117. package/dist/cjs/form/TimeslotSelection.js.map +0 -1
  118. package/dist/cjs/form/extra-field/ExtraField.js +0 -20
  119. package/dist/cjs/form/extra-field/ExtraField.js.map +0 -1
  120. package/dist/cjs/form/extra-field/ReleaseExtraFields.js +0 -60
  121. package/dist/cjs/form/extra-field/ReleaseExtraFields.js.map +0 -1
  122. package/dist/cjs/form/index.js +0 -69
  123. package/dist/cjs/form/index.js.map +0 -1
  124. package/dist/cjs/form/payment/FeeBox.js +0 -42
  125. package/dist/cjs/form/payment/FeeBox.js.map +0 -1
  126. package/dist/cjs/form/payment/PaymentOverviewCheckbox.js +0 -48
  127. package/dist/cjs/form/payment/PaymentOverviewCheckbox.js.map +0 -1
  128. package/dist/cjs/form/payment/PaymentSkeleton.js +0 -14
  129. package/dist/cjs/form/payment/PaymentSkeleton.js.map +0 -1
  130. package/dist/cjs/form/product/ProductCard.js +0 -61
  131. package/dist/cjs/form/product/ProductCard.js.map +0 -1
  132. package/dist/cjs/form/product/ProductVariantsDialog.js +0 -173
  133. package/dist/cjs/form/product/ProductVariantsDialog.js.map +0 -1
  134. package/dist/cjs/form/shipping/ShippingSkeleton.js +0 -14
  135. package/dist/cjs/form/shipping/ShippingSkeleton.js.map +0 -1
  136. package/dist/cjs/form/style.js +0 -50
  137. package/dist/cjs/form/style.js.map +0 -1
  138. package/dist/cjs/form/timeslot/TimeslotCalendar.js +0 -57
  139. package/dist/cjs/form/timeslot/TimeslotCalendar.js.map +0 -1
  140. package/dist/cjs/hooks/data/useActiveEventProducts.js +0 -22
  141. package/dist/cjs/hooks/data/useActiveEventProducts.js.map +0 -1
  142. package/dist/cjs/hooks/data/useAllowedPaymentMethods.js +0 -22
  143. package/dist/cjs/hooks/data/useAllowedPaymentMethods.js.map +0 -1
  144. package/dist/cjs/hooks/data/useEvent.js +0 -22
  145. package/dist/cjs/hooks/data/useEvent.js.map +0 -1
  146. package/dist/cjs/hooks/data/useEventActiveReleases.js +0 -26
  147. package/dist/cjs/hooks/data/useEventActiveReleases.js.map +0 -1
  148. package/dist/cjs/hooks/data/useEventShippingMethods.js +0 -22
  149. package/dist/cjs/hooks/data/useEventShippingMethods.js.map +0 -1
  150. package/dist/cjs/hooks/data/useEventTimeslots.js +0 -23
  151. package/dist/cjs/hooks/data/useEventTimeslots.js.map +0 -1
  152. package/dist/cjs/hooks/useCountdown.js +0 -40
  153. package/dist/cjs/hooks/useCountdown.js.map +0 -1
  154. package/dist/cjs/hooks/useDebounce.js +0 -17
  155. package/dist/cjs/hooks/useDebounce.js.map +0 -1
  156. package/dist/cjs/hooks/useErrors.js +0 -28
  157. package/dist/cjs/hooks/useErrors.js.map +0 -1
  158. package/dist/cjs/hooks/useFirstRender.js +0 -14
  159. package/dist/cjs/hooks/useFirstRender.js.map +0 -1
  160. package/dist/cjs/hooks/useGlobal.js +0 -11
  161. package/dist/cjs/hooks/useGlobal.js.map +0 -1
  162. package/dist/cjs/hooks/useResponsive.js +0 -29
  163. package/dist/cjs/hooks/useResponsive.js.map +0 -1
  164. package/dist/cjs/index.js.map +0 -1
  165. package/dist/cjs/locales/cs.js +0 -163
  166. package/dist/cjs/locales/cs.js.map +0 -1
  167. package/dist/cjs/locales/en.js +0 -164
  168. package/dist/cjs/locales/en.js.map +0 -1
  169. package/dist/cjs/locales/es.js +0 -164
  170. package/dist/cjs/locales/es.js.map +0 -1
  171. package/dist/cjs/locales/index.js +0 -18
  172. package/dist/cjs/locales/index.js.map +0 -1
  173. package/dist/cjs/locales/pl.js +0 -164
  174. package/dist/cjs/locales/pl.js.map +0 -1
  175. package/dist/cjs/locales/sk.js +0 -164
  176. package/dist/cjs/locales/sk.js.map +0 -1
  177. package/dist/cjs/locales/uk.js +0 -164
  178. package/dist/cjs/locales/uk.js.map +0 -1
  179. package/dist/cjs/modules/event-timeslot.js +0 -12
  180. package/dist/cjs/modules/event-timeslot.js.map +0 -1
  181. package/dist/cjs/modules/event.js +0 -24
  182. package/dist/cjs/modules/event.js.map +0 -1
  183. package/dist/cjs/modules/order.js +0 -14
  184. package/dist/cjs/modules/order.js.map +0 -1
  185. package/dist/cjs/modules/promo-code.js +0 -13
  186. package/dist/cjs/modules/promo-code.js.map +0 -1
  187. package/dist/cjs/modules/shopping-cart.js +0 -16
  188. package/dist/cjs/modules/shopping-cart.js.map +0 -1
  189. package/dist/cjs/utils/axios.js +0 -20
  190. package/dist/cjs/utils/axios.js.map +0 -1
  191. package/dist/cjs/utils/data/cookie.js +0 -6
  192. package/dist/cjs/utils/data/cookie.js.map +0 -1
  193. package/dist/cjs/utils/data/currency.js +0 -9
  194. package/dist/cjs/utils/data/currency.js.map +0 -1
  195. package/dist/cjs/utils/data/event.js +0 -8
  196. package/dist/cjs/utils/data/event.js.map +0 -1
  197. package/dist/cjs/utils/data/extra-field.js +0 -16
  198. package/dist/cjs/utils/data/extra-field.js.map +0 -1
  199. package/dist/cjs/utils/data/gender.js +0 -9
  200. package/dist/cjs/utils/data/gender.js.map +0 -1
  201. package/dist/cjs/utils/data/global.js +0 -6
  202. package/dist/cjs/utils/data/global.js.map +0 -1
  203. package/dist/cjs/utils/data/gopay.js +0 -14
  204. package/dist/cjs/utils/data/gopay.js.map +0 -1
  205. package/dist/cjs/utils/data/language.js +0 -14
  206. package/dist/cjs/utils/data/language.js.map +0 -1
  207. package/dist/cjs/utils/data/lottie/bank-transfer.json.js +0 -20
  208. package/dist/cjs/utils/data/lottie/bank-transfer.json.js.map +0 -1
  209. package/dist/cjs/utils/data/promo-code.js +0 -8
  210. package/dist/cjs/utils/data/promo-code.js.map +0 -1
  211. package/dist/cjs/utils/data/shipping-method.js +0 -8
  212. package/dist/cjs/utils/data/shipping-method.js.map +0 -1
  213. package/dist/cjs/utils/formatNumber.js +0 -19
  214. package/dist/cjs/utils/formatNumber.js.map +0 -1
  215. package/dist/cjs/utils/global.js +0 -26
  216. package/dist/cjs/utils/global.js.map +0 -1
  217. package/dist/cjs/utils/gtm.js +0 -125
  218. package/dist/cjs/utils/gtm.js.map +0 -1
  219. package/dist/cjs/utils/isBrowser.js +0 -6
  220. package/dist/cjs/utils/isBrowser.js.map +0 -1
  221. package/dist/cjs/utils/place.js +0 -6
  222. package/dist/cjs/utils/place.js.map +0 -1
  223. package/dist/cjs/utils/price.js +0 -15
  224. package/dist/cjs/utils/price.js.map +0 -1
  225. package/dist/cjs/utils/product.js +0 -29
  226. package/dist/cjs/utils/product.js.map +0 -1
  227. package/dist/cjs/utils/translation.js +0 -6
  228. package/dist/cjs/utils/translation.js.map +0 -1
  229. package/dist/cjs/utils/url.js +0 -18
  230. package/dist/cjs/utils/url.js.map +0 -1
  231. package/dist/esm/components/ClientOnly.js +0 -15
  232. package/dist/esm/components/ClientOnly.js.map +0 -1
  233. package/dist/esm/components/CustomSkeleton.js +0 -11
  234. package/dist/esm/components/CustomSkeleton.js.map +0 -1
  235. package/dist/esm/components/Image.js +0 -52
  236. package/dist/esm/components/Image.js.map +0 -1
  237. package/dist/esm/components/Label.js +0 -61
  238. package/dist/esm/components/Label.js.map +0 -1
  239. package/dist/esm/components/TextIconLabel.js +0 -15
  240. package/dist/esm/components/TextIconLabel.js.map +0 -1
  241. package/dist/esm/components/TicketFormSkeleton.js +0 -51
  242. package/dist/esm/components/TicketFormSkeleton.js.map +0 -1
  243. package/dist/esm/components/Trans.js +0 -85
  244. package/dist/esm/components/Trans.js.map +0 -1
  245. package/dist/esm/components/animate/IconButtonAnimate.js +0 -27
  246. package/dist/esm/components/animate/IconButtonAnimate.js.map +0 -1
  247. package/dist/esm/components/animate/MotionContainer.js +0 -14
  248. package/dist/esm/components/animate/MotionContainer.js.map +0 -1
  249. package/dist/esm/components/animate/variants/bounce.js +0 -96
  250. package/dist/esm/components/animate/variants/bounce.js.map +0 -1
  251. package/dist/esm/components/animate/variants/container.js +0 -23
  252. package/dist/esm/components/animate/variants/container.js.map +0 -1
  253. package/dist/esm/components/animate/variants/transition.js +0 -14
  254. package/dist/esm/components/animate/variants/transition.js.map +0 -1
  255. package/dist/esm/components/confirm-dialog/ConfirmDialog.js +0 -20
  256. package/dist/esm/components/confirm-dialog/ConfirmDialog.js.map +0 -1
  257. package/dist/esm/components/hook-form/FormProvider.js +0 -10
  258. package/dist/esm/components/hook-form/FormProvider.js.map +0 -1
  259. package/dist/esm/components/hook-form/RHFCheckbox.js +0 -13
  260. package/dist/esm/components/hook-form/RHFCheckbox.js.map +0 -1
  261. package/dist/esm/components/hook-form/RHFDatePicker.js +0 -18
  262. package/dist/esm/components/hook-form/RHFDatePicker.js.map +0 -1
  263. package/dist/esm/components/hook-form/RHFPhone.js +0 -20
  264. package/dist/esm/components/hook-form/RHFPhone.js.map +0 -1
  265. package/dist/esm/components/hook-form/RHFRadioGroup.js +0 -25
  266. package/dist/esm/components/hook-form/RHFRadioGroup.js.map +0 -1
  267. package/dist/esm/components/hook-form/RHFSelect.js +0 -32
  268. package/dist/esm/components/hook-form/RHFSelect.js.map +0 -1
  269. package/dist/esm/components/hook-form/RHFTextField.js +0 -11
  270. package/dist/esm/components/hook-form/RHFTextField.js.map +0 -1
  271. package/dist/esm/components/iconify/Iconify.js +0 -10
  272. package/dist/esm/components/iconify/Iconify.js.map +0 -1
  273. package/dist/esm/context/GlobalContext.js +0 -62
  274. package/dist/esm/context/GlobalContext.js.map +0 -1
  275. package/dist/esm/form/ChildEventCard.js +0 -56
  276. package/dist/esm/form/ChildEventCard.js.map +0 -1
  277. package/dist/esm/form/ChildEventDialog.js +0 -26
  278. package/dist/esm/form/ChildEventDialog.js.map +0 -1
  279. package/dist/esm/form/ChildEvents.js +0 -13
  280. package/dist/esm/form/ChildEvents.js.map +0 -1
  281. package/dist/esm/form/ContactPerson.js +0 -36
  282. package/dist/esm/form/ContactPerson.js.map +0 -1
  283. package/dist/esm/form/EmailConfirmation.js +0 -24
  284. package/dist/esm/form/EmailConfirmation.js.map +0 -1
  285. package/dist/esm/form/MerchandiseSelection.js +0 -13
  286. package/dist/esm/form/MerchandiseSelection.js.map +0 -1
  287. package/dist/esm/form/OrderSuccess.js +0 -53
  288. package/dist/esm/form/OrderSuccess.js.map +0 -1
  289. package/dist/esm/form/Payment.js +0 -210
  290. package/dist/esm/form/Payment.js.map +0 -1
  291. package/dist/esm/form/PaymentOverviewBox.js +0 -409
  292. package/dist/esm/form/PaymentOverviewBox.js.map +0 -1
  293. package/dist/esm/form/PaymentPending.js +0 -22
  294. package/dist/esm/form/PaymentPending.js.map +0 -1
  295. package/dist/esm/form/PaymentSuccess.js +0 -199
  296. package/dist/esm/form/PaymentSuccess.js.map +0 -1
  297. package/dist/esm/form/ReleaseCountdown.js +0 -30
  298. package/dist/esm/form/ReleaseCountdown.js.map +0 -1
  299. package/dist/esm/form/ReleaseWithMerchandise.js +0 -126
  300. package/dist/esm/form/ReleaseWithMerchandise.js.map +0 -1
  301. package/dist/esm/form/ScriptLoader.js +0 -17
  302. package/dist/esm/form/ScriptLoader.js.map +0 -1
  303. package/dist/esm/form/Shipping.js +0 -115
  304. package/dist/esm/form/Shipping.js.map +0 -1
  305. package/dist/esm/form/TicketForm.js +0 -447
  306. package/dist/esm/form/TicketForm.js.map +0 -1
  307. package/dist/esm/form/TicketSelection.js +0 -170
  308. package/dist/esm/form/TicketSelection.js.map +0 -1
  309. package/dist/esm/form/TicketSelectionMap.js +0 -63
  310. package/dist/esm/form/TicketSelectionMap.js.map +0 -1
  311. package/dist/esm/form/TicketWithMerchandiseSelection.js +0 -113
  312. package/dist/esm/form/TicketWithMerchandiseSelection.js.map +0 -1
  313. package/dist/esm/form/TimeslotSelection.js +0 -64
  314. package/dist/esm/form/TimeslotSelection.js.map +0 -1
  315. package/dist/esm/form/extra-field/ExtraField.js +0 -16
  316. package/dist/esm/form/extra-field/ExtraField.js.map +0 -1
  317. package/dist/esm/form/extra-field/ReleaseExtraFields.js +0 -56
  318. package/dist/esm/form/extra-field/ReleaseExtraFields.js.map +0 -1
  319. package/dist/esm/form/index.js +0 -65
  320. package/dist/esm/form/index.js.map +0 -1
  321. package/dist/esm/form/payment/FeeBox.js +0 -38
  322. package/dist/esm/form/payment/FeeBox.js.map +0 -1
  323. package/dist/esm/form/payment/PaymentOverviewCheckbox.js +0 -44
  324. package/dist/esm/form/payment/PaymentOverviewCheckbox.js.map +0 -1
  325. package/dist/esm/form/payment/PaymentSkeleton.js +0 -10
  326. package/dist/esm/form/payment/PaymentSkeleton.js.map +0 -1
  327. package/dist/esm/form/product/ProductCard.js +0 -57
  328. package/dist/esm/form/product/ProductCard.js.map +0 -1
  329. package/dist/esm/form/product/ProductVariantsDialog.js +0 -169
  330. package/dist/esm/form/product/ProductVariantsDialog.js.map +0 -1
  331. package/dist/esm/form/shipping/ShippingSkeleton.js +0 -10
  332. package/dist/esm/form/shipping/ShippingSkeleton.js.map +0 -1
  333. package/dist/esm/form/style.js +0 -44
  334. package/dist/esm/form/style.js.map +0 -1
  335. package/dist/esm/form/timeslot/TimeslotCalendar.js +0 -53
  336. package/dist/esm/form/timeslot/TimeslotCalendar.js.map +0 -1
  337. package/dist/esm/hooks/data/useActiveEventProducts.js +0 -18
  338. package/dist/esm/hooks/data/useActiveEventProducts.js.map +0 -1
  339. package/dist/esm/hooks/data/useAllowedPaymentMethods.js +0 -18
  340. package/dist/esm/hooks/data/useAllowedPaymentMethods.js.map +0 -1
  341. package/dist/esm/hooks/data/useEvent.js +0 -18
  342. package/dist/esm/hooks/data/useEvent.js.map +0 -1
  343. package/dist/esm/hooks/data/useEventActiveReleases.js +0 -22
  344. package/dist/esm/hooks/data/useEventActiveReleases.js.map +0 -1
  345. package/dist/esm/hooks/data/useEventShippingMethods.js +0 -18
  346. package/dist/esm/hooks/data/useEventShippingMethods.js.map +0 -1
  347. package/dist/esm/hooks/data/useEventTimeslots.js +0 -19
  348. package/dist/esm/hooks/data/useEventTimeslots.js.map +0 -1
  349. package/dist/esm/hooks/useCountdown.js +0 -36
  350. package/dist/esm/hooks/useCountdown.js.map +0 -1
  351. package/dist/esm/hooks/useDebounce.js +0 -13
  352. package/dist/esm/hooks/useDebounce.js.map +0 -1
  353. package/dist/esm/hooks/useErrors.js +0 -24
  354. package/dist/esm/hooks/useErrors.js.map +0 -1
  355. package/dist/esm/hooks/useFirstRender.js +0 -12
  356. package/dist/esm/hooks/useFirstRender.js.map +0 -1
  357. package/dist/esm/hooks/useGlobal.js +0 -7
  358. package/dist/esm/hooks/useGlobal.js.map +0 -1
  359. package/dist/esm/hooks/useResponsive.js +0 -25
  360. package/dist/esm/hooks/useResponsive.js.map +0 -1
  361. package/dist/esm/index.js +0 -6
  362. package/dist/esm/index.js.map +0 -1
  363. package/dist/esm/locales/cs.js +0 -159
  364. package/dist/esm/locales/cs.js.map +0 -1
  365. package/dist/esm/locales/en.js +0 -160
  366. package/dist/esm/locales/en.js.map +0 -1
  367. package/dist/esm/locales/es.js +0 -160
  368. package/dist/esm/locales/es.js.map +0 -1
  369. package/dist/esm/locales/index.js +0 -7
  370. package/dist/esm/locales/index.js.map +0 -1
  371. package/dist/esm/locales/pl.js +0 -160
  372. package/dist/esm/locales/pl.js.map +0 -1
  373. package/dist/esm/locales/sk.js +0 -160
  374. package/dist/esm/locales/sk.js.map +0 -1
  375. package/dist/esm/locales/uk.js +0 -160
  376. package/dist/esm/locales/uk.js.map +0 -1
  377. package/dist/esm/modules/event-timeslot.js +0 -10
  378. package/dist/esm/modules/event-timeslot.js.map +0 -1
  379. package/dist/esm/modules/event.js +0 -19
  380. package/dist/esm/modules/event.js.map +0 -1
  381. package/dist/esm/modules/order.js +0 -10
  382. package/dist/esm/modules/order.js.map +0 -1
  383. package/dist/esm/modules/promo-code.js +0 -11
  384. package/dist/esm/modules/promo-code.js.map +0 -1
  385. package/dist/esm/modules/shopping-cart.js +0 -13
  386. package/dist/esm/modules/shopping-cart.js.map +0 -1
  387. package/dist/esm/utils/axios.js +0 -16
  388. package/dist/esm/utils/axios.js.map +0 -1
  389. package/dist/esm/utils/data/cookie.js +0 -4
  390. package/dist/esm/utils/data/cookie.js.map +0 -1
  391. package/dist/esm/utils/data/currency.js +0 -9
  392. package/dist/esm/utils/data/currency.js.map +0 -1
  393. package/dist/esm/utils/data/event.js +0 -8
  394. package/dist/esm/utils/data/event.js.map +0 -1
  395. package/dist/esm/utils/data/extra-field.js +0 -16
  396. package/dist/esm/utils/data/extra-field.js.map +0 -1
  397. package/dist/esm/utils/data/gender.js +0 -9
  398. package/dist/esm/utils/data/gender.js.map +0 -1
  399. package/dist/esm/utils/data/global.js +0 -4
  400. package/dist/esm/utils/data/global.js.map +0 -1
  401. package/dist/esm/utils/data/gopay.js +0 -14
  402. package/dist/esm/utils/data/gopay.js.map +0 -1
  403. package/dist/esm/utils/data/language.js +0 -14
  404. package/dist/esm/utils/data/language.js.map +0 -1
  405. package/dist/esm/utils/data/lottie/bank-transfer.json.js +0 -4
  406. package/dist/esm/utils/data/lottie/bank-transfer.json.js.map +0 -1
  407. package/dist/esm/utils/data/promo-code.js +0 -8
  408. package/dist/esm/utils/data/promo-code.js.map +0 -1
  409. package/dist/esm/utils/data/shipping-method.js +0 -8
  410. package/dist/esm/utils/data/shipping-method.js.map +0 -1
  411. package/dist/esm/utils/formatNumber.js +0 -17
  412. package/dist/esm/utils/formatNumber.js.map +0 -1
  413. package/dist/esm/utils/global.js +0 -21
  414. package/dist/esm/utils/global.js.map +0 -1
  415. package/dist/esm/utils/gtm.js +0 -112
  416. package/dist/esm/utils/gtm.js.map +0 -1
  417. package/dist/esm/utils/isBrowser.js +0 -4
  418. package/dist/esm/utils/isBrowser.js.map +0 -1
  419. package/dist/esm/utils/place.js +0 -4
  420. package/dist/esm/utils/place.js.map +0 -1
  421. package/dist/esm/utils/price.js +0 -12
  422. package/dist/esm/utils/price.js.map +0 -1
  423. package/dist/esm/utils/product.js +0 -27
  424. package/dist/esm/utils/product.js.map +0 -1
  425. package/dist/esm/utils/translation.js +0 -4
  426. package/dist/esm/utils/translation.js.map +0 -1
  427. package/dist/esm/utils/url.js +0 -16
  428. package/dist/esm/utils/url.js.map +0 -1
  429. package/dist/types/components/ClientOnly.d.ts +0 -5
  430. package/dist/types/components/CustomSkeleton.d.ts +0 -4
  431. package/dist/types/components/Image.d.ts +0 -14
  432. package/dist/types/components/Label.d.ts +0 -11
  433. package/dist/types/components/TextIconLabel.d.ts +0 -11
  434. package/dist/types/components/TicketFormSkeleton.d.ts +0 -3
  435. package/dist/types/components/Trans.d.ts +0 -12
  436. package/dist/types/components/animate/DialogAnimate.d.ts +0 -9
  437. package/dist/types/components/animate/IconButtonAnimate.d.ts +0 -7
  438. package/dist/types/components/animate/MotionContainer.d.ts +0 -10
  439. package/dist/types/components/animate/MotionLazyContainer.d.ts +0 -6
  440. package/dist/types/components/animate/MotionViewport.d.ts +0 -10
  441. package/dist/types/components/animate/TextAnimate.d.ts +0 -9
  442. package/dist/types/components/animate/index.d.ts +0 -7
  443. package/dist/types/components/animate/variants/actions.d.ts +0 -5
  444. package/dist/types/components/animate/variants/background.d.ts +0 -104
  445. package/dist/types/components/animate/variants/bounce.d.ts +0 -131
  446. package/dist/types/components/animate/variants/container.d.ts +0 -19
  447. package/dist/types/components/animate/variants/fade.d.ts +0 -217
  448. package/dist/types/components/animate/variants/flip.d.ts +0 -75
  449. package/dist/types/components/animate/variants/index.d.ts +0 -12
  450. package/dist/types/components/animate/variants/path.d.ts +0 -14
  451. package/dist/types/components/animate/variants/rotate.d.ts +0 -39
  452. package/dist/types/components/animate/variants/scale.d.ts +0 -75
  453. package/dist/types/components/animate/variants/slide.d.ts +0 -155
  454. package/dist/types/components/animate/variants/transition.d.ts +0 -13
  455. package/dist/types/components/animate/variants/zoom.d.ts +0 -199
  456. package/dist/types/components/confirm-dialog/ConfirmDialog.d.ts +0 -3
  457. package/dist/types/components/confirm-dialog/index.d.ts +0 -1
  458. package/dist/types/components/confirm-dialog/types.d.ts +0 -8
  459. package/dist/types/components/hook-form/FormProvider.d.ts +0 -9
  460. package/dist/types/components/hook-form/RHFAutocomplete.d.ts +0 -9
  461. package/dist/types/components/hook-form/RHFCheckbox.d.ts +0 -20
  462. package/dist/types/components/hook-form/RHFCodes.d.ts +0 -8
  463. package/dist/types/components/hook-form/RHFDatePicker.d.ts +0 -9
  464. package/dist/types/components/hook-form/RHFPhone.d.ts +0 -8
  465. package/dist/types/components/hook-form/RHFRadioGroup.d.ts +0 -14
  466. package/dist/types/components/hook-form/RHFSelect.d.ts +0 -23
  467. package/dist/types/components/hook-form/RHFSlider.d.ts +0 -8
  468. package/dist/types/components/hook-form/RHFSwitch.d.ts +0 -8
  469. package/dist/types/components/hook-form/RHFTextField.d.ts +0 -7
  470. package/dist/types/components/hook-form/index.d.ts +0 -9
  471. package/dist/types/components/iconify/Iconify.d.ts +0 -10
  472. package/dist/types/components/iconify/index.d.ts +0 -2
  473. package/dist/types/components/iconify/types.d.ts +0 -2
  474. package/dist/types/components/index.d.ts +0 -4
  475. package/dist/types/context/GlobalContext.d.ts +0 -16
  476. package/dist/types/form/ChildEventCard.d.ts +0 -7
  477. package/dist/types/form/ChildEventDialog.d.ts +0 -9
  478. package/dist/types/form/ChildEvents.d.ts +0 -8
  479. package/dist/types/form/ContactPerson.d.ts +0 -7
  480. package/dist/types/form/EmailConfirmation.d.ts +0 -8
  481. package/dist/types/form/MerchandiseSelection.d.ts +0 -9
  482. package/dist/types/form/OrderSuccess.d.ts +0 -9
  483. package/dist/types/form/Payment.d.ts +0 -7
  484. package/dist/types/form/PaymentOverviewBox.d.ts +0 -7
  485. package/dist/types/form/PaymentPending.d.ts +0 -3
  486. package/dist/types/form/PaymentSuccess.d.ts +0 -9
  487. package/dist/types/form/ReleaseCountdown.d.ts +0 -8
  488. package/dist/types/form/ReleaseWithMerchandise.d.ts +0 -12
  489. package/dist/types/form/ScriptLoader.d.ts +0 -3
  490. package/dist/types/form/Shipping.d.ts +0 -7
  491. package/dist/types/form/TicketForm.d.ts +0 -11
  492. package/dist/types/form/TicketSelection.d.ts +0 -7
  493. package/dist/types/form/TicketSelectionMap.d.ts +0 -7
  494. package/dist/types/form/TicketWithMerchandiseSelection.d.ts +0 -7
  495. package/dist/types/form/TimeslotSelection.d.ts +0 -7
  496. package/dist/types/form/extra-field/ExtraField.d.ts +0 -9
  497. package/dist/types/form/extra-field/ReleaseExtraFields.d.ts +0 -10
  498. package/dist/types/form/index.d.ts +0 -26
  499. package/dist/types/form/payment/FeeBox.d.ts +0 -8
  500. package/dist/types/form/payment/PaymentOverviewCheckbox.d.ts +0 -12
  501. package/dist/types/form/payment/PaymentSkeleton.d.ts +0 -7
  502. package/dist/types/form/product/ProductCard.d.ts +0 -9
  503. package/dist/types/form/product/ProductVariantsDialog.d.ts +0 -14
  504. package/dist/types/form/shipping/ShippingSkeleton.d.ts +0 -7
  505. package/dist/types/form/style.d.ts +0 -11
  506. package/dist/types/form/timeslot/TimeslotCalendar.d.ts +0 -12
  507. package/dist/types/hooks/data/useActiveEventProducts.d.ts +0 -8
  508. package/dist/types/hooks/data/useAllowedPaymentMethods.d.ts +0 -9
  509. package/dist/types/hooks/data/useEvent.d.ts +0 -8
  510. package/dist/types/hooks/data/useEventActiveReleases.d.ts +0 -8
  511. package/dist/types/hooks/data/useEventShippingMethods.d.ts +0 -8
  512. package/dist/types/hooks/data/useEventTimeslots.d.ts +0 -10
  513. package/dist/types/hooks/useCountdown.d.ts +0 -6
  514. package/dist/types/hooks/useDebounce.d.ts +0 -1
  515. package/dist/types/hooks/useErrors.d.ts +0 -4
  516. package/dist/types/hooks/useEventListener.d.ts +0 -5
  517. package/dist/types/hooks/useFirstRender.d.ts +0 -1
  518. package/dist/types/hooks/useGlobal.d.ts +0 -2
  519. package/dist/types/hooks/useResponsive.d.ts +0 -8
  520. package/dist/types/index.d.ts +0 -4
  521. package/dist/types/locales/cs.d.ts +0 -157
  522. package/dist/types/locales/en.d.ts +0 -158
  523. package/dist/types/locales/es.d.ts +0 -158
  524. package/dist/types/locales/index.d.ts +0 -6
  525. package/dist/types/locales/pl.d.ts +0 -158
  526. package/dist/types/locales/sk.d.ts +0 -158
  527. package/dist/types/locales/uk.d.ts +0 -158
  528. package/dist/types/modules/event-timeslot.d.ts +0 -2
  529. package/dist/types/modules/event.d.ts +0 -5
  530. package/dist/types/modules/order.d.ts +0 -7
  531. package/dist/types/modules/promo-code.d.ts +0 -1
  532. package/dist/types/modules/shopping-cart.d.ts +0 -4
  533. package/dist/types/utils/axios.d.ts +0 -2
  534. package/dist/types/utils/data/cookie.d.ts +0 -1
  535. package/dist/types/utils/data/currency.d.ts +0 -5
  536. package/dist/types/utils/data/event.d.ts +0 -4
  537. package/dist/types/utils/data/extra-field.d.ts +0 -11
  538. package/dist/types/utils/data/gender.d.ts +0 -5
  539. package/dist/types/utils/data/global.d.ts +0 -1
  540. package/dist/types/utils/data/gopay.d.ts +0 -10
  541. package/dist/types/utils/data/language.d.ts +0 -10
  542. package/dist/types/utils/data/order.d.ts +0 -4
  543. package/dist/types/utils/data/product.d.ts +0 -3
  544. package/dist/types/utils/data/promo-code.d.ts +0 -4
  545. package/dist/types/utils/data/shipping-method.d.ts +0 -4
  546. package/dist/types/utils/data/shopping-cart.d.ts +0 -5
  547. package/dist/types/utils/formatNumber.d.ts +0 -8
  548. package/dist/types/utils/global.d.ts +0 -4
  549. package/dist/types/utils/gtm.d.ts +0 -28
  550. package/dist/types/utils/isBrowser.d.ts +0 -1
  551. package/dist/types/utils/place.d.ts +0 -2
  552. package/dist/types/utils/price.d.ts +0 -5
  553. package/dist/types/utils/product.d.ts +0 -3
  554. package/dist/types/utils/translation.d.ts +0 -2
  555. package/dist/types/utils/types/animate.d.ts +0 -26
  556. package/dist/types/utils/types/artist.type.d.ts +0 -17
  557. package/dist/types/utils/types/company.type.d.ts +0 -12
  558. package/dist/types/utils/types/country.type.d.ts +0 -39
  559. package/dist/types/utils/types/customer.type.d.ts +0 -10
  560. package/dist/types/utils/types/event-product.type.d.ts +0 -15
  561. package/dist/types/utils/types/event-timeslot.type.d.ts +0 -15
  562. package/dist/types/utils/types/event.type.d.ts +0 -67
  563. package/dist/types/utils/types/extra-field.type.d.ts +0 -18
  564. package/dist/types/utils/types/file.type.d.ts +0 -6
  565. package/dist/types/utils/types/global.type.d.ts +0 -76
  566. package/dist/types/utils/types/gtm.type.d.ts +0 -90
  567. package/dist/types/utils/types/locale.type.d.ts +0 -4
  568. package/dist/types/utils/types/order.type.d.ts +0 -69
  569. package/dist/types/utils/types/palette.type.d.ts +0 -1
  570. package/dist/types/utils/types/payment-method.type.d.ts +0 -23
  571. package/dist/types/utils/types/pixel.type.d.ts +0 -7
  572. package/dist/types/utils/types/place.type.d.ts +0 -19
  573. package/dist/types/utils/types/product-image.type.d.ts +0 -5
  574. package/dist/types/utils/types/product-parameter.type.d.ts +0 -7
  575. package/dist/types/utils/types/product-variant.type.d.ts +0 -9
  576. package/dist/types/utils/types/product.type.d.ts +0 -57
  577. package/dist/types/utils/types/project.type.d.ts +0 -24
  578. package/dist/types/utils/types/promo-code.type.d.ts +0 -15
  579. package/dist/types/utils/types/release-category.type.d.ts +0 -17
  580. package/dist/types/utils/types/release.type.d.ts +0 -28
  581. package/dist/types/utils/types/shipping-method.type.d.ts +0 -11
  582. package/dist/types/utils/types/shopping-cart.type.d.ts +0 -78
  583. package/dist/types/utils/types/ticket.type.d.ts +0 -110
  584. package/dist/types/utils/types/translation.type.d.ts +0 -18
  585. package/dist/types/utils/types/user.type.d.ts +0 -9
  586. package/dist/types/utils/url.d.ts +0 -1
  587. package/src/form/MerchandiseSelection.tsx +0 -29
  588. package/src/form/ReleaseWithMerchandise.tsx +0 -230
  589. /package/src/form/{TicketSelectionMap.tsx → tickets/TicketSelectionMap.tsx} +0 -0
@@ -1,12 +1,10 @@
1
1
  import React, { useEffect, useState } from 'react';
2
2
  import {
3
- Badge,
4
3
  Button,
5
4
  Dialog,
6
5
  DialogActions,
7
6
  DialogContent,
8
7
  DialogTitle,
9
- IconButton,
10
8
  Stack,
11
9
  Typography,
12
10
  } from '@mui/material';
@@ -17,16 +15,16 @@ import { ITicketFormTicket } from '@utils/types/ticket.type';
17
15
  import { IEventProductForm } from '@utils/types/product.type';
18
16
  import { fCurrency } from '@utils/formatNumber';
19
17
  import useGlobal from '@hooks/useGlobal.ts';
20
- import { Iconify } from '@components';
21
18
 
22
19
  interface Props {
23
20
  eventProduct: IEventProduct;
24
21
  eventId: number;
25
22
  openDialog: boolean;
26
- callback: (variant: IEventProductForm) => void;
23
+ callback: (variants: IEventProductForm[]) => void;
27
24
  onClose?: () => void;
28
25
  selectedQuantityByVariant?: Record<number, number>;
29
26
  isOnlyMerchandise?: boolean;
27
+ canAddOnlyOneAtATime?: boolean;
30
28
  }
31
29
 
32
30
  const ProductVariantsDialog: React.FC<Props> = ({
@@ -37,13 +35,11 @@ const ProductVariantsDialog: React.FC<Props> = ({
37
35
  selectedQuantityByVariant,
38
36
  isOnlyMerchandise,
39
37
  eventId,
38
+ canAddOnlyOneAtATime,
40
39
  }) => {
41
40
  const { t, lang, options } = useGlobal();
42
41
  const { showSnackbar } = useGlobal();
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);
42
+ const [draftQuantities, setDraftQuantities] = useState<Record<number, number>>({});
47
43
  const tickets: ITicketFormTicket[] = useWatch({ name: `tickets.${eventId}`, defaultValue: [] });
48
44
  const products: IEventProductForm[] = useWatch({ name: `products.${eventId}`, defaultValue: [] });
49
45
 
@@ -56,43 +52,41 @@ const ProductVariantsDialog: React.FC<Props> = ({
56
52
  }, [openDialog]);
57
53
 
58
54
  useEffect(() => {
59
- if (isVariantClicked) {
60
- setVariantQuantity(
61
- selectedQuantityByVariant &&
62
- selectedVariant &&
63
- selectedQuantityByVariant[selectedVariant.eventProductVariantId] !== undefined
64
- ? selectedQuantityByVariant[selectedVariant.eventProductVariantId]
65
- : 1
66
- );
67
- setIsVariantClicked(false);
55
+ if (openDialog) {
56
+ setDraftQuantities(canAddOnlyOneAtATime ? {} : (selectedQuantityByVariant ?? {}));
68
57
  }
69
- }, [selectedVariant, isVariantClicked]);
70
-
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
- };
58
+ }, [openDialog, selectedQuantityByVariant, canAddOnlyOneAtATime]);
82
59
 
83
60
  const handleOnAdd = () => {
84
- if (!selectedVariant) {
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));
77
+
78
+ if (selectedVariants.length === 0) {
85
79
  showSnackbar(t('components.product_variant_dialog.select_variant'), { variant: 'error' });
86
80
  return;
87
81
  }
88
- callback(selectedVariant);
89
- setSelectedVariant(null);
82
+
83
+ callback(selectedVariants);
84
+ setDraftQuantities({});
90
85
  onClose?.();
91
86
  };
92
87
 
93
- const isVariantDisabled = (variant: IEventProductVariant) => {
88
+ const getUsedCount = (variant: IEventProductVariant) => {
94
89
  let countUsed = 0;
95
- let selectedVariantQuantity = 0;
96
90
 
97
91
  for (const product of products) {
98
92
  if (product.productVariantId === variant.productVariant.id) {
@@ -105,70 +99,82 @@ const ProductVariantsDialog: React.FC<Props> = ({
105
99
  for (const product of ticket.products) {
106
100
  if (product.productVariantId === variant.productVariant.id) {
107
101
  countUsed += product.quantity;
108
- selectedVariantQuantity = product.quantity;
109
102
  }
110
103
  }
111
104
  }
112
105
  }
113
-
114
- return (
115
- (variant.productVariant.quantity &&
116
- countUsed + variant.productVariant.sold >= variant.productVariant.quantity) ||
117
- selectedVariantQuantity >= 10
118
- );
106
+ return countUsed;
119
107
  };
120
108
 
121
- const isVariantSoldOut = () => {
122
- const variant = eventProduct.eventProductVariants.find(
123
- (product) => product.id === selectedVariant?.eventProductVariantId
124
- );
125
- let countUsed = variantQuantity;
109
+ const getMaxAvailable = (variant: IEventProductVariant) => {
110
+ if (!variant.productVariant.quantity) return Number.POSITIVE_INFINITY;
111
+ return variant.productVariant.quantity - variant.productVariant.sold - getUsedCount(variant);
112
+ };
126
113
 
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
- }
134
- }
135
- }
114
+ const isVariantDisabled = (variant: IEventProductVariant) => {
115
+ if (!variant.productVariant.quantity) return false;
116
+ return getMaxAvailable(variant) <= 0;
117
+ };
136
118
 
137
- if (variant && variant.productVariant.quantity) {
138
- if (
139
- variant.productVariant.sold + countUsed >= variant.productVariant.quantity ||
140
- variantQuantity >= 10
141
- ) {
142
- return true;
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 };
143
128
  }
144
- }
145
- return false;
129
+ return { ...prev, [variant.id]: next };
130
+ });
146
131
  };
147
132
 
148
- const handleAddQuantity = () => {
149
- setVariantQuantity(variantQuantity + 1);
150
- setSelectedVariant((prevState) => {
151
- if (!prevState) return null;
152
- return {
153
- ...prevState,
154
- quantity: variantQuantity + 1,
155
- };
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;
140
+ }
141
+ if (canAddOnlyOneAtATime) {
142
+ // Remove the only variant
143
+ return {};
144
+ }
145
+ return { ...prev, [variant.id]: next };
156
146
  });
157
147
  };
158
148
 
159
- const handleRemoveQuantity = () => {
160
- if (variantQuantity > 0) {
161
- setVariantQuantity(variantQuantity - 1);
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
+ );
164
+
165
+ if (variantsToRemove.length === 0) {
166
+ return;
162
167
  }
163
- setSelectedVariant((prevState) => {
164
- if (!prevState) return null;
165
- return {
166
- ...prevState,
167
- quantity: variantQuantity - 1,
168
- };
169
- });
168
+
169
+ callback(variantsToRemove);
170
+ setDraftQuantities({});
171
+ onClose?.();
170
172
  };
171
173
 
174
+ const hasSelectedVariants = eventProduct.eventProductVariants.some(
175
+ (variant) => (selectedQuantityByVariant?.[variant.id] ?? 0) > 0
176
+ );
177
+
172
178
  return (
173
179
  <Dialog
174
180
  open={openDialog}
@@ -187,16 +193,17 @@ const ProductVariantsDialog: React.FC<Props> = ({
187
193
  },
188
194
  }}
189
195
  >
190
- <DialogTitle />
196
+ <DialogTitle sx={{ textAlign: 'center', fontWeight: 700 }}>
197
+ {eventProduct.product.name}
198
+ </DialogTitle>
191
199
  <DialogContent>
192
200
  <Stack spacing={1}>
193
201
  <Image
194
202
  src={eventProduct.product.previewImage.url}
195
203
  alt={eventProduct.product.name}
196
- ratio="1/1"
204
+ ratio="16/9"
197
205
  sx={{ borderRadius: 2 }}
198
206
  />
199
- <Typography variant="h5">{eventProduct.product.name}</Typography>
200
207
  <Typography variant="body2" color="primary">
201
208
  {t('form.labels.category')}: {eventProduct.product.category.value.text}
202
209
  </Typography>
@@ -208,62 +215,113 @@ const ProductVariantsDialog: React.FC<Props> = ({
208
215
  </DialogContent>
209
216
  <DialogActions sx={{ justifyContent: 'flex-start' }}>
210
217
  <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' }}
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%"
228
235
  >
229
- {variant.productVariant.value}
230
- </Badge>
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>
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>
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
+ })}
263
312
  </Stack>
264
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')}
317
+ </Button>
318
+ )}
265
319
  {onClose && <Button onClick={onClose}>{t('cancel')}</Button>}
266
- <Button variant="contained" onClick={handleOnAdd} disabled={!selectedVariant}>
320
+ <Button
321
+ variant="contained"
322
+ onClick={handleOnAdd}
323
+ disabled={!Object.values(draftQuantities).some((qty) => qty > 0)}
324
+ >
267
325
  {t('add')}
268
326
  </Button>
269
327
  </Stack>
@@ -0,0 +1,217 @@
1
+ import React, { useMemo, useState } from 'react';
2
+ import {
3
+ Box,
4
+ Button,
5
+ Dialog,
6
+ DialogContent,
7
+ DialogTitle,
8
+ Divider,
9
+ IconButton,
10
+ Link,
11
+ Stack,
12
+ Typography,
13
+ } from '@mui/material';
14
+ import { useWatch } from 'react-hook-form';
15
+ import { RHFCheckbox } from '@components/hook-form';
16
+ import { fCurrency } from '@utils/formatNumber';
17
+ import useGlobal from '@hooks/useGlobal';
18
+ import { Iconify } from '@components';
19
+ import { ITicketForm, ITicketFormTicket } from '@utils/types/ticket.type';
20
+ import { IEvent } from '@utils/types/event.type';
21
+
22
+ interface Props {
23
+ event: IEvent;
24
+ }
25
+
26
+ interface BorderedCheckboxProps {
27
+ name: string;
28
+ disabled: boolean;
29
+ title: React.ReactNode;
30
+ price: React.ReactNode;
31
+ }
32
+
33
+ const BorderedCheckbox: React.FC<BorderedCheckboxProps> = ({ name, disabled, title, price }) => (
34
+ <RHFCheckbox
35
+ name={name}
36
+ disabled={disabled}
37
+ label={
38
+ <Stack
39
+ direction="row"
40
+ justifyContent="space-between"
41
+ alignItems="center"
42
+ sx={{ width: '100%' }}
43
+ >
44
+ <Typography variant="body2" fontWeight={600}>
45
+ {title}
46
+ </Typography>
47
+ <Typography variant="body2" fontWeight={700} sx={{ whiteSpace: 'nowrap' }}>
48
+ {price}
49
+ </Typography>
50
+ </Stack>
51
+ }
52
+ sx={{
53
+ m: 0,
54
+ px: 1,
55
+ pr: 0.5,
56
+ pl: 0,
57
+ borderRadius: 1,
58
+ width: '100%',
59
+ border: '1px solid',
60
+ borderColor: 'primary.main',
61
+ '& .MuiFormControlLabel-label': {
62
+ width: '100%',
63
+ },
64
+ }}
65
+ />
66
+ );
67
+
68
+ const Services: React.FC<Props> = ({ event }) => {
69
+ const { t, lang } = useGlobal();
70
+ const [open, setOpen] = useState(false);
71
+ const ticketInsurancePricePerUnit = Number(
72
+ useWatch<ITicketForm>({
73
+ name: 'ticketInsurancePricePerUnit',
74
+ defaultValue: 0,
75
+ }) || 0
76
+ );
77
+ const smsNotificationPrice = Number(
78
+ useWatch<ITicketForm>({
79
+ name: 'smsNotificationPrice',
80
+ defaultValue: 0,
81
+ }) || 0
82
+ );
83
+ const tickets = useWatch<ITicketForm, 'tickets'>({
84
+ name: 'tickets',
85
+ defaultValue: {},
86
+ });
87
+
88
+ const totalTickets = useMemo(() => {
89
+ const items: ITicketFormTicket[] = Object.values(tickets || {}).flat();
90
+ return items.reduce((sum, ticket) => sum + (Number(ticket.quantity) || 0), 0);
91
+ }, [tickets]);
92
+
93
+ const handleOpen = (e: React.MouseEvent<HTMLAnchorElement>) => {
94
+ e.preventDefault();
95
+ setOpen(true);
96
+ };
97
+
98
+ const handleClose = () => setOpen(false);
99
+
100
+ return (
101
+ <Stack spacing={1.5}>
102
+ <BorderedCheckbox
103
+ name="ticketInsurance"
104
+ disabled={totalTickets <= 0}
105
+ title={t('event.tickets.insurance.label')}
106
+ price={
107
+ <>
108
+ + {fCurrency(ticketInsurancePricePerUnit, lang, event.currency)} /{' '}
109
+ {t('event.tickets.insurance.per_ticket')}
110
+ </>
111
+ }
112
+ />
113
+
114
+ <BorderedCheckbox
115
+ name="smsNotification"
116
+ disabled={totalTickets <= 0}
117
+ title={t('event.tickets.sms_notification.label')}
118
+ price={<>+ {fCurrency(smsNotificationPrice, lang, event.currency)}</>}
119
+ />
120
+
121
+ <Box sx={{ display: 'flex', justifyContent: 'flex-end' }}>
122
+ <Link variant="body2" underline="always" onClick={handleOpen} color={'text.primary'}>
123
+ {t('event.tickets.stepper.8.additional_info')}
124
+ </Link>
125
+ </Box>
126
+
127
+ <Dialog
128
+ open={open}
129
+ onClose={handleClose}
130
+ maxWidth="sm"
131
+ fullWidth
132
+ PaperProps={{
133
+ sx: {
134
+ borderRadius: 4,
135
+ overflow: 'hidden',
136
+ },
137
+ }}
138
+ >
139
+ <DialogTitle
140
+ sx={{
141
+ position: 'relative',
142
+ textAlign: 'center',
143
+ fontWeight: 700,
144
+ fontSize: { xs: '1.5rem', sm: '1.75rem' },
145
+ pt: { xs: 3.5, sm: 4 },
146
+ pb: { xs: 2, sm: 2.5 },
147
+ px: { xs: 3, sm: 4 },
148
+ }}
149
+ >
150
+ {t('event.tickets.stepper.8.title')}
151
+ <IconButton
152
+ onClick={handleClose}
153
+ size="small"
154
+ sx={{ position: 'absolute', right: 16, top: 16 }}
155
+ >
156
+ <Iconify icon="carbon:close" />
157
+ </IconButton>
158
+ </DialogTitle>
159
+ <DialogContent sx={{ px: { xs: 3, sm: 4 }, pb: { xs: 4, sm: 5 } }}>
160
+ <Stack spacing={3}>
161
+ <Box>
162
+ <Typography variant="subtitle2" fontWeight={700} gutterBottom>
163
+ {t('event.tickets.insurance.label')}
164
+ </Typography>
165
+ <Typography variant="body2" paragraph>
166
+ {t('event.tickets.insurance.modal.description')}
167
+ </Typography>
168
+ <Typography variant="body2" paragraph>
169
+ {t('event.tickets.insurance.modal.coverage')}
170
+ </Typography>
171
+ <BorderedCheckbox
172
+ name="ticketInsurance"
173
+ disabled={totalTickets <= 0}
174
+ title={t('event.tickets.insurance.label')}
175
+ price={
176
+ <>
177
+ + {fCurrency(ticketInsurancePricePerUnit, lang, event.currency)} /{' '}
178
+ {t('event.tickets.insurance.per_ticket')}
179
+ </>
180
+ }
181
+ />
182
+ </Box>
183
+ <Divider />
184
+ <Box>
185
+ <Typography variant="subtitle2" fontWeight={700} gutterBottom>
186
+ {t('event.tickets.sms_notification.label')}
187
+ </Typography>
188
+ <Typography variant="body2" paragraph>
189
+ {t('event.tickets.sms_notification.modal.description')}
190
+ </Typography>
191
+ <BorderedCheckbox
192
+ name="smsNotification"
193
+ disabled={totalTickets <= 0}
194
+ title={t('event.tickets.sms_notification.label')}
195
+ price={<>+ {fCurrency(smsNotificationPrice, lang, event.currency)}</>}
196
+ />
197
+ </Box>
198
+ <Button
199
+ variant="outlined"
200
+ onClick={handleClose}
201
+ sx={{
202
+ mt: 1,
203
+ py: 1.25,
204
+ borderRadius: 2,
205
+ fontWeight: 700,
206
+ }}
207
+ >
208
+ {t('close')}
209
+ </Button>
210
+ </Stack>
211
+ </DialogContent>
212
+ </Dialog>
213
+ </Stack>
214
+ );
215
+ };
216
+
217
+ export default Services;