@eventlook/sdk 1.4.3 → 1.4.5-1.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 (447) hide show
  1. package/.env.example +1 -0
  2. package/dev-frontend.sh +32 -0
  3. package/dist/cjs/_virtual/_commonjsHelpers.js +4 -2
  4. package/dist/cjs/_virtual/_commonjsHelpers.js.map +1 -1
  5. package/dist/cjs/_virtual/index.js +2 -2
  6. package/dist/cjs/_virtual/index2.js +2 -2
  7. package/dist/cjs/_virtual/index3.js +2 -2
  8. package/dist/cjs/components/Image.js +29 -14
  9. package/dist/cjs/components/Image.js.map +1 -1
  10. package/dist/cjs/components/hook-form/FormProvider.js +2 -2
  11. package/dist/cjs/components/hook-form/FormProvider.js.map +1 -1
  12. package/dist/cjs/context/GlobalContext.js +2 -1
  13. package/dist/cjs/context/GlobalContext.js.map +1 -1
  14. package/dist/cjs/form/ChildEventDialog.js +3 -3
  15. package/dist/cjs/form/ChildEventDialog.js.map +1 -1
  16. package/dist/cjs/form/ContactPerson.js +1 -1
  17. package/dist/cjs/form/ContactPerson.js.map +1 -1
  18. package/dist/cjs/form/Payment.js +2 -4
  19. package/dist/cjs/form/Payment.js.map +1 -1
  20. package/dist/cjs/form/PaymentOverviewBox.js +104 -115
  21. package/dist/cjs/form/PaymentOverviewBox.js.map +1 -1
  22. package/dist/cjs/form/PaymentOverviewDrawer.js +317 -0
  23. package/dist/cjs/form/PaymentOverviewDrawer.js.map +1 -0
  24. package/dist/cjs/form/PaymentPending.js +15 -3
  25. package/dist/cjs/form/PaymentPending.js.map +1 -1
  26. package/dist/cjs/form/PaymentSuccess.js +39 -2
  27. package/dist/cjs/form/PaymentSuccess.js.map +1 -1
  28. package/dist/cjs/form/ReleaseWithMerchandise.js +57 -48
  29. package/dist/cjs/form/ReleaseWithMerchandise.js.map +1 -1
  30. package/dist/cjs/form/Shipping.js +33 -27
  31. package/dist/cjs/form/Shipping.js.map +1 -1
  32. package/dist/cjs/form/TicketForm.js +102 -35
  33. package/dist/cjs/form/TicketForm.js.map +1 -1
  34. package/dist/cjs/form/TicketQuantityControl.js +51 -0
  35. package/dist/cjs/form/TicketQuantityControl.js.map +1 -0
  36. package/dist/cjs/form/TicketSelection.js +32 -12
  37. package/dist/cjs/form/TicketSelection.js.map +1 -1
  38. package/dist/cjs/form/TicketSelectionMap.js +67 -0
  39. package/dist/cjs/form/TicketSelectionMap.js.map +1 -0
  40. package/dist/cjs/form/TicketSelectionMobile.js +98 -0
  41. package/dist/cjs/form/TicketSelectionMobile.js.map +1 -0
  42. package/dist/cjs/form/TicketWithMerchandiseSelection.js +46 -10
  43. package/dist/cjs/form/TicketWithMerchandiseSelection.js.map +1 -1
  44. package/dist/cjs/form/extra-field/ExtraField.js.map +1 -1
  45. package/dist/cjs/form/extra-field/ReleaseExtraFields.js +1 -1
  46. package/dist/cjs/form/extra-field/ReleaseExtraFields.js.map +1 -1
  47. package/dist/cjs/form/index.js +2 -2
  48. package/dist/cjs/form/index.js.map +1 -1
  49. package/dist/cjs/form/merchandise/MerchandiseSelection.js +14 -0
  50. package/dist/cjs/form/merchandise/MerchandiseSelection.js.map +1 -0
  51. package/dist/cjs/form/merchandise/MerchandiseSlider.js +40 -0
  52. package/dist/cjs/form/merchandise/MerchandiseSlider.js.map +1 -0
  53. package/dist/cjs/form/merchendise/MerchandiseSelection.js +19 -0
  54. package/dist/cjs/form/merchendise/MerchandiseSelection.js.map +1 -0
  55. package/dist/cjs/form/merchendise/MerchandiseSlider.js +75 -0
  56. package/dist/cjs/form/merchendise/MerchandiseSlider.js.map +1 -0
  57. package/dist/cjs/form/payment/FeeBox.js +5 -17
  58. package/dist/cjs/form/payment/FeeBox.js.map +1 -1
  59. package/dist/cjs/form/payment/PaymentOverviewCheckbox.js +52 -0
  60. package/dist/cjs/form/payment/PaymentOverviewCheckbox.js.map +1 -0
  61. package/dist/cjs/form/product/ProductCard.js +147 -36
  62. package/dist/cjs/form/product/ProductCard.js.map +1 -1
  63. package/dist/cjs/form/product/ProductVariantsDialog.js +182 -97
  64. package/dist/cjs/form/product/ProductVariantsDialog.js.map +1 -1
  65. package/dist/cjs/form/services/index.js +116 -0
  66. package/dist/cjs/form/services/index.js.map +1 -0
  67. package/dist/cjs/form/style.js +13 -4
  68. package/dist/cjs/form/style.js.map +1 -1
  69. package/dist/cjs/form/tickets/ReleaseDescription.js +23 -0
  70. package/dist/cjs/form/tickets/ReleaseDescription.js.map +1 -0
  71. package/dist/cjs/form/tickets/ReleaseWithMerchandise.js +164 -0
  72. package/dist/cjs/form/tickets/ReleaseWithMerchandise.js.map +1 -0
  73. package/dist/cjs/form/tickets/TicketQuantityControl.js +54 -0
  74. package/dist/cjs/form/tickets/TicketQuantityControl.js.map +1 -0
  75. package/dist/cjs/form/tickets/TicketSelection.js +162 -0
  76. package/dist/cjs/form/tickets/TicketSelection.js.map +1 -0
  77. package/dist/cjs/form/tickets/TicketSelectionMap.js +79 -0
  78. package/dist/cjs/form/tickets/TicketSelectionMap.js.map +1 -0
  79. package/dist/cjs/form/tickets/TicketSelectionMobile.js +100 -0
  80. package/dist/cjs/form/tickets/TicketSelectionMobile.js.map +1 -0
  81. package/dist/cjs/form/tickets/TicketWithMerchandiseSelection.js +127 -0
  82. package/dist/cjs/form/tickets/TicketWithMerchandiseSelection.js.map +1 -0
  83. package/dist/cjs/hooks/useConsentScrollOnDrawerOpen.js +59 -0
  84. package/dist/cjs/hooks/useConsentScrollOnDrawerOpen.js.map +1 -0
  85. package/dist/cjs/hooks/useScrollToFirstError.js +73 -0
  86. package/dist/cjs/hooks/useScrollToFirstError.js.map +1 -0
  87. package/dist/cjs/locales/cs.js +48 -2
  88. package/dist/cjs/locales/cs.js.map +1 -1
  89. package/dist/cjs/locales/en.js +48 -1
  90. package/dist/cjs/locales/en.js.map +1 -1
  91. package/dist/cjs/locales/es.js +48 -1
  92. package/dist/cjs/locales/es.js.map +1 -1
  93. package/dist/cjs/locales/pl.js +48 -1
  94. package/dist/cjs/locales/pl.js.map +1 -1
  95. package/dist/cjs/locales/sk.js +48 -1
  96. package/dist/cjs/locales/sk.js.map +1 -1
  97. package/dist/cjs/locales/uk.js +48 -1
  98. package/dist/cjs/locales/uk.js.map +1 -1
  99. package/dist/cjs/modules/shopping-cart.js +10 -9
  100. package/dist/cjs/modules/shopping-cart.js.map +1 -1
  101. package/dist/cjs/utils/data/global.js +2 -0
  102. package/dist/cjs/utils/data/global.js.map +1 -1
  103. package/dist/cjs/utils/data/ticket.js +6 -0
  104. package/dist/cjs/utils/data/ticket.js.map +1 -0
  105. package/dist/cjs/utils/gtm.js +20 -0
  106. package/dist/cjs/utils/gtm.js.map +1 -1
  107. package/dist/esm/_virtual/_commonjsHelpers.js +4 -2
  108. package/dist/esm/_virtual/_commonjsHelpers.js.map +1 -1
  109. package/dist/esm/_virtual/index.js +2 -2
  110. package/dist/esm/_virtual/index2.js +2 -2
  111. package/dist/esm/_virtual/index3.js +2 -2
  112. package/dist/esm/components/Image.js +30 -15
  113. package/dist/esm/components/Image.js.map +1 -1
  114. package/dist/esm/components/hook-form/FormProvider.js +2 -2
  115. package/dist/esm/components/hook-form/FormProvider.js.map +1 -1
  116. package/dist/esm/context/GlobalContext.js +2 -1
  117. package/dist/esm/context/GlobalContext.js.map +1 -1
  118. package/dist/esm/form/ChildEventDialog.js +3 -3
  119. package/dist/esm/form/ChildEventDialog.js.map +1 -1
  120. package/dist/esm/form/ContactPerson.js +1 -1
  121. package/dist/esm/form/ContactPerson.js.map +1 -1
  122. package/dist/esm/form/Payment.js +2 -4
  123. package/dist/esm/form/Payment.js.map +1 -1
  124. package/dist/esm/form/PaymentOverviewBox.js +107 -118
  125. package/dist/esm/form/PaymentOverviewBox.js.map +1 -1
  126. package/dist/esm/form/PaymentOverviewDrawer.js +313 -0
  127. package/dist/esm/form/PaymentOverviewDrawer.js.map +1 -0
  128. package/dist/esm/form/PaymentPending.js +16 -4
  129. package/dist/esm/form/PaymentPending.js.map +1 -1
  130. package/dist/esm/form/PaymentSuccess.js +39 -2
  131. package/dist/esm/form/PaymentSuccess.js.map +1 -1
  132. package/dist/esm/form/ReleaseWithMerchandise.js +58 -49
  133. package/dist/esm/form/ReleaseWithMerchandise.js.map +1 -1
  134. package/dist/esm/form/Shipping.js +33 -27
  135. package/dist/esm/form/Shipping.js.map +1 -1
  136. package/dist/esm/form/TicketForm.js +104 -37
  137. package/dist/esm/form/TicketForm.js.map +1 -1
  138. package/dist/esm/form/TicketQuantityControl.js +47 -0
  139. package/dist/esm/form/TicketQuantityControl.js.map +1 -0
  140. package/dist/esm/form/TicketSelection.js +33 -13
  141. package/dist/esm/form/TicketSelection.js.map +1 -1
  142. package/dist/esm/form/TicketSelectionMap.js +63 -0
  143. package/dist/esm/form/TicketSelectionMap.js.map +1 -0
  144. package/dist/esm/form/TicketSelectionMobile.js +94 -0
  145. package/dist/esm/form/TicketSelectionMobile.js.map +1 -0
  146. package/dist/esm/form/TicketWithMerchandiseSelection.js +48 -12
  147. package/dist/esm/form/TicketWithMerchandiseSelection.js.map +1 -1
  148. package/dist/esm/form/extra-field/ExtraField.js.map +1 -1
  149. package/dist/esm/form/extra-field/ReleaseExtraFields.js +1 -1
  150. package/dist/esm/form/extra-field/ReleaseExtraFields.js.map +1 -1
  151. package/dist/esm/form/index.js +2 -2
  152. package/dist/esm/form/index.js.map +1 -1
  153. package/dist/esm/form/merchandise/MerchandiseSelection.js +10 -0
  154. package/dist/esm/form/merchandise/MerchandiseSelection.js.map +1 -0
  155. package/dist/esm/form/merchandise/MerchandiseSlider.js +36 -0
  156. package/dist/esm/form/merchandise/MerchandiseSlider.js.map +1 -0
  157. package/dist/esm/form/merchendise/MerchandiseSelection.js +15 -0
  158. package/dist/esm/form/merchendise/MerchandiseSelection.js.map +1 -0
  159. package/dist/esm/form/merchendise/MerchandiseSlider.js +71 -0
  160. package/dist/esm/form/merchendise/MerchandiseSlider.js.map +1 -0
  161. package/dist/esm/form/payment/FeeBox.js +6 -18
  162. package/dist/esm/form/payment/FeeBox.js.map +1 -1
  163. package/dist/esm/form/payment/PaymentOverviewCheckbox.js +48 -0
  164. package/dist/esm/form/payment/PaymentOverviewCheckbox.js.map +1 -0
  165. package/dist/esm/form/product/ProductCard.js +148 -37
  166. package/dist/esm/form/product/ProductCard.js.map +1 -1
  167. package/dist/esm/form/product/ProductVariantsDialog.js +184 -99
  168. package/dist/esm/form/product/ProductVariantsDialog.js.map +1 -1
  169. package/dist/esm/form/services/index.js +112 -0
  170. package/dist/esm/form/services/index.js.map +1 -0
  171. package/dist/esm/form/style.js +13 -4
  172. package/dist/esm/form/style.js.map +1 -1
  173. package/dist/esm/form/tickets/ReleaseDescription.js +19 -0
  174. package/dist/esm/form/tickets/ReleaseDescription.js.map +1 -0
  175. package/dist/esm/form/tickets/ReleaseWithMerchandise.js +160 -0
  176. package/dist/esm/form/tickets/ReleaseWithMerchandise.js.map +1 -0
  177. package/dist/esm/form/tickets/TicketQuantityControl.js +50 -0
  178. package/dist/esm/form/tickets/TicketQuantityControl.js.map +1 -0
  179. package/dist/esm/form/tickets/TicketSelection.js +158 -0
  180. package/dist/esm/form/tickets/TicketSelection.js.map +1 -0
  181. package/dist/esm/form/tickets/TicketSelectionMap.js +75 -0
  182. package/dist/esm/form/tickets/TicketSelectionMap.js.map +1 -0
  183. package/dist/esm/form/tickets/TicketSelectionMobile.js +96 -0
  184. package/dist/esm/form/tickets/TicketSelectionMobile.js.map +1 -0
  185. package/dist/esm/form/tickets/TicketWithMerchandiseSelection.js +123 -0
  186. package/dist/esm/form/tickets/TicketWithMerchandiseSelection.js.map +1 -0
  187. package/dist/esm/hooks/useConsentScrollOnDrawerOpen.js +55 -0
  188. package/dist/esm/hooks/useConsentScrollOnDrawerOpen.js.map +1 -0
  189. package/dist/esm/hooks/useScrollToFirstError.js +69 -0
  190. package/dist/esm/hooks/useScrollToFirstError.js.map +1 -0
  191. package/dist/esm/locales/cs.js +48 -2
  192. package/dist/esm/locales/cs.js.map +1 -1
  193. package/dist/esm/locales/en.js +48 -1
  194. package/dist/esm/locales/en.js.map +1 -1
  195. package/dist/esm/locales/es.js +48 -1
  196. package/dist/esm/locales/es.js.map +1 -1
  197. package/dist/esm/locales/pl.js +48 -1
  198. package/dist/esm/locales/pl.js.map +1 -1
  199. package/dist/esm/locales/sk.js +48 -1
  200. package/dist/esm/locales/sk.js.map +1 -1
  201. package/dist/esm/locales/uk.js +48 -1
  202. package/dist/esm/locales/uk.js.map +1 -1
  203. package/dist/esm/modules/shopping-cart.js +9 -8
  204. package/dist/esm/modules/shopping-cart.js.map +1 -1
  205. package/dist/esm/utils/data/global.js +2 -1
  206. package/dist/esm/utils/data/global.js.map +1 -1
  207. package/dist/esm/utils/data/ticket.js +4 -0
  208. package/dist/esm/utils/data/ticket.js.map +1 -0
  209. package/dist/esm/utils/gtm.js +19 -1
  210. package/dist/esm/utils/gtm.js.map +1 -1
  211. package/dist/types/context/GlobalContext.d.ts +2 -1
  212. package/dist/types/form/PaymentOverviewDrawer.d.ts +8 -0
  213. package/dist/types/form/PaymentSuccess.d.ts +2 -0
  214. package/dist/types/form/TicketSelectionMap.d.ts +7 -0
  215. package/dist/types/form/extra-field/ExtraField.d.ts +1 -1
  216. package/dist/types/form/index.d.ts +1 -0
  217. package/dist/types/form/merchendise/MerchandiseSelection.d.ts +9 -0
  218. package/dist/types/form/merchendise/MerchandiseSlider.d.ts +10 -0
  219. package/dist/types/form/merchendise/MerchendiseSlider.d.ts +0 -0
  220. package/dist/types/form/payment/PaymentOverviewCheckbox.d.ts +12 -0
  221. package/dist/types/locales/cs.d.ts +24 -0
  222. package/dist/types/locales/en.d.ts +25 -0
  223. package/dist/types/locales/es.d.ts +25 -0
  224. package/dist/types/locales/pl.d.ts +25 -0
  225. package/dist/types/locales/sk.d.ts +25 -0
  226. package/dist/types/locales/uk.d.ts +25 -0
  227. package/dist/types/modules/shopping-cart.d.ts +3 -5
  228. package/dist/types/utils/data/shopping-cart.d.ts +5 -0
  229. package/dist/types/utils/gtm.d.ts +3 -1
  230. package/dist/types/utils/types/event.type.d.ts +1 -0
  231. package/dist/types/utils/types/global.type.d.ts +2 -0
  232. package/dist/types/utils/types/gtm.type.d.ts +5 -0
  233. package/dist/types/utils/types/order.type.d.ts +1 -0
  234. package/dist/types/utils/types/shopping-cart.type.d.ts +44 -35
  235. package/dist/types/utils/types/ticket.type.d.ts +21 -5
  236. package/package.json +11 -6
  237. package/rollup.config.mjs +16 -1
  238. package/src/components/Image.tsx +49 -27
  239. package/src/components/hook-form/FormProvider.tsx +5 -2
  240. package/src/context/GlobalContext.tsx +3 -0
  241. package/src/form/ChildEventDialog.tsx +3 -3
  242. package/src/form/ContactPerson.tsx +1 -1
  243. package/src/form/Payment.tsx +2 -4
  244. package/src/form/PaymentOverviewBox.tsx +178 -139
  245. package/src/form/PaymentOverviewDrawer.tsx +446 -0
  246. package/src/form/PaymentPending.tsx +19 -3
  247. package/src/form/PaymentSuccess.tsx +46 -3
  248. package/src/form/Shipping.tsx +48 -33
  249. package/src/form/TicketForm.tsx +162 -43
  250. package/src/form/extra-field/ExtraField.tsx +3 -1
  251. package/src/form/extra-field/ReleaseExtraFields.tsx +1 -1
  252. package/src/form/index.tsx +12 -2
  253. package/src/form/merchandise/MerchandiseSelection.tsx +24 -0
  254. package/src/form/merchandise/MerchandiseSlider.tsx +62 -0
  255. package/src/form/payment/FeeBox.tsx +6 -34
  256. package/src/form/payment/PaymentOverviewCheckbox.tsx +88 -0
  257. package/src/form/product/ProductCard.tsx +258 -59
  258. package/src/form/product/ProductVariantsDialog.tsx +292 -139
  259. package/src/form/services/index.tsx +263 -0
  260. package/src/form/style.ts +16 -4
  261. package/src/form/tickets/ReleaseDescription.tsx +46 -0
  262. package/src/form/tickets/ReleaseWithMerchandise.tsx +270 -0
  263. package/src/form/tickets/TicketQuantityControl.tsx +100 -0
  264. package/src/form/tickets/TicketSelection.tsx +236 -0
  265. package/src/form/tickets/TicketSelectionMap.tsx +99 -0
  266. package/src/form/tickets/TicketSelectionMobile.tsx +187 -0
  267. package/src/form/tickets/TicketWithMerchandiseSelection.tsx +192 -0
  268. package/src/hooks/useScrollToFirstError.ts +99 -0
  269. package/src/locales/cs.tsx +51 -2
  270. package/src/locales/en.tsx +51 -1
  271. package/src/locales/es.tsx +51 -1
  272. package/src/locales/pl.tsx +51 -1
  273. package/src/locales/sk.tsx +51 -1
  274. package/src/locales/uk.tsx +51 -1
  275. package/src/modules/shopping-cart.ts +14 -11
  276. package/src/utils/data/global.ts +1 -0
  277. package/src/utils/data/shopping-cart.ts +5 -0
  278. package/src/utils/data/ticket.ts +1 -0
  279. package/src/utils/gtm.ts +29 -0
  280. package/src/utils/types/event.type.ts +1 -0
  281. package/src/utils/types/global.type.ts +2 -0
  282. package/src/utils/types/gtm.type.ts +6 -0
  283. package/src/utils/types/order.type.ts +1 -0
  284. package/src/utils/types/shopping-cart.type.ts +42 -31
  285. package/src/utils/types/ticket.type.ts +23 -3
  286. package/tsconfig.json +2 -1
  287. package/dist/cjs/_virtual/colorManipulator.js +0 -6
  288. package/dist/cjs/_virtual/colorManipulator.js.map +0 -1
  289. package/dist/cjs/_virtual/createStyled.js +0 -6
  290. package/dist/cjs/_virtual/createStyled.js.map +0 -1
  291. package/dist/cjs/_virtual/customParseFormat.js +0 -6
  292. package/dist/cjs/_virtual/customParseFormat.js.map +0 -1
  293. package/dist/cjs/_virtual/dayjs.min.js +0 -6
  294. package/dist/cjs/_virtual/dayjs.min.js.map +0 -1
  295. package/dist/cjs/_virtual/extends.js +0 -6
  296. package/dist/cjs/_virtual/extends.js.map +0 -1
  297. package/dist/cjs/_virtual/index.umd.js +0 -6
  298. package/dist/cjs/_virtual/index.umd.js.map +0 -1
  299. package/dist/cjs/_virtual/index10.js +0 -11
  300. package/dist/cjs/_virtual/index10.js.map +0 -1
  301. package/dist/cjs/_virtual/index11.js +0 -11
  302. package/dist/cjs/_virtual/index11.js.map +0 -1
  303. package/dist/cjs/_virtual/index12.js +0 -6
  304. package/dist/cjs/_virtual/index12.js.map +0 -1
  305. package/dist/cjs/_virtual/index13.js +0 -6
  306. package/dist/cjs/_virtual/index13.js.map +0 -1
  307. package/dist/cjs/_virtual/index14.js +0 -6
  308. package/dist/cjs/_virtual/index14.js.map +0 -1
  309. package/dist/cjs/_virtual/index15.js +0 -6
  310. package/dist/cjs/_virtual/index15.js.map +0 -1
  311. package/dist/cjs/_virtual/index4.js +0 -11
  312. package/dist/cjs/_virtual/index4.js.map +0 -1
  313. package/dist/cjs/_virtual/index5.js +0 -11
  314. package/dist/cjs/_virtual/index5.js.map +0 -1
  315. package/dist/cjs/_virtual/index6.js +0 -11
  316. package/dist/cjs/_virtual/index6.js.map +0 -1
  317. package/dist/cjs/_virtual/index7.js +0 -11
  318. package/dist/cjs/_virtual/index7.js.map +0 -1
  319. package/dist/cjs/_virtual/index8.js +0 -11
  320. package/dist/cjs/_virtual/index8.js.map +0 -1
  321. package/dist/cjs/_virtual/index9.js +0 -11
  322. package/dist/cjs/_virtual/index9.js.map +0 -1
  323. package/dist/cjs/_virtual/interopRequireDefault.js +0 -6
  324. package/dist/cjs/_virtual/interopRequireDefault.js.map +0 -1
  325. package/dist/cjs/_virtual/isBetween.js +0 -6
  326. package/dist/cjs/_virtual/isBetween.js.map +0 -1
  327. package/dist/cjs/_virtual/jsx-runtime.js +0 -6
  328. package/dist/cjs/_virtual/jsx-runtime.js.map +0 -1
  329. package/dist/cjs/_virtual/localizedFormat.js +0 -6
  330. package/dist/cjs/_virtual/localizedFormat.js.map +0 -1
  331. package/dist/cjs/_virtual/lodash.js +0 -6
  332. package/dist/cjs/_virtual/lodash.js.map +0 -1
  333. package/dist/cjs/_virtual/lottie.js +0 -6
  334. package/dist/cjs/_virtual/lottie.js.map +0 -1
  335. package/dist/cjs/_virtual/numeral.js +0 -6
  336. package/dist/cjs/_virtual/numeral.js.map +0 -1
  337. package/dist/cjs/_virtual/objectWithoutPropertiesLoose.js +0 -6
  338. package/dist/cjs/_virtual/objectWithoutPropertiesLoose.js.map +0 -1
  339. package/dist/cjs/_virtual/react-is.development3.js +0 -6
  340. package/dist/cjs/_virtual/react-is.development3.js.map +0 -1
  341. package/dist/cjs/_virtual/react-is.production.min2.js +0 -6
  342. package/dist/cjs/_virtual/react-is.production.min2.js.map +0 -1
  343. package/dist/cjs/_virtual/react-jsx-runtime.development.js +0 -6
  344. package/dist/cjs/_virtual/react-jsx-runtime.development.js.map +0 -1
  345. package/dist/cjs/_virtual/react-jsx-runtime.production.min.js +0 -6
  346. package/dist/cjs/_virtual/react-jsx-runtime.production.min.js.map +0 -1
  347. package/dist/cjs/_virtual/timezone.js +0 -6
  348. package/dist/cjs/_virtual/timezone.js.map +0 -1
  349. package/dist/cjs/_virtual/use-sync-external-store-shim.development.js +0 -6
  350. package/dist/cjs/_virtual/use-sync-external-store-shim.development.js.map +0 -1
  351. package/dist/cjs/_virtual/use-sync-external-store-shim.production.js +0 -6
  352. package/dist/cjs/_virtual/use-sync-external-store-shim.production.js.map +0 -1
  353. package/dist/cjs/_virtual/useThemeWithoutDefault.js +0 -6
  354. package/dist/cjs/_virtual/useThemeWithoutDefault.js.map +0 -1
  355. package/dist/cjs/_virtual/utc.js +0 -6
  356. package/dist/cjs/_virtual/utc.js.map +0 -1
  357. package/dist/cjs/_virtual/weekOfYear.js +0 -6
  358. package/dist/cjs/_virtual/weekOfYear.js.map +0 -1
  359. package/dist/cjs/hooks/useFirstRender.js +0 -14
  360. package/dist/cjs/hooks/useFirstRender.js.map +0 -1
  361. package/dist/cjs/utils/data/order.js +0 -8
  362. package/dist/cjs/utils/data/order.js.map +0 -1
  363. package/dist/esm/_virtual/colorManipulator.js +0 -4
  364. package/dist/esm/_virtual/colorManipulator.js.map +0 -1
  365. package/dist/esm/_virtual/createStyled.js +0 -4
  366. package/dist/esm/_virtual/createStyled.js.map +0 -1
  367. package/dist/esm/_virtual/customParseFormat.js +0 -4
  368. package/dist/esm/_virtual/customParseFormat.js.map +0 -1
  369. package/dist/esm/_virtual/dayjs.min.js +0 -4
  370. package/dist/esm/_virtual/dayjs.min.js.map +0 -1
  371. package/dist/esm/_virtual/extends.js +0 -4
  372. package/dist/esm/_virtual/extends.js.map +0 -1
  373. package/dist/esm/_virtual/index.umd.js +0 -4
  374. package/dist/esm/_virtual/index.umd.js.map +0 -1
  375. package/dist/esm/_virtual/index10.js +0 -7
  376. package/dist/esm/_virtual/index10.js.map +0 -1
  377. package/dist/esm/_virtual/index11.js +0 -7
  378. package/dist/esm/_virtual/index11.js.map +0 -1
  379. package/dist/esm/_virtual/index12.js +0 -4
  380. package/dist/esm/_virtual/index12.js.map +0 -1
  381. package/dist/esm/_virtual/index13.js +0 -4
  382. package/dist/esm/_virtual/index13.js.map +0 -1
  383. package/dist/esm/_virtual/index14.js +0 -4
  384. package/dist/esm/_virtual/index14.js.map +0 -1
  385. package/dist/esm/_virtual/index15.js +0 -4
  386. package/dist/esm/_virtual/index15.js.map +0 -1
  387. package/dist/esm/_virtual/index4.js +0 -7
  388. package/dist/esm/_virtual/index4.js.map +0 -1
  389. package/dist/esm/_virtual/index5.js +0 -7
  390. package/dist/esm/_virtual/index5.js.map +0 -1
  391. package/dist/esm/_virtual/index6.js +0 -7
  392. package/dist/esm/_virtual/index6.js.map +0 -1
  393. package/dist/esm/_virtual/index7.js +0 -7
  394. package/dist/esm/_virtual/index7.js.map +0 -1
  395. package/dist/esm/_virtual/index8.js +0 -7
  396. package/dist/esm/_virtual/index8.js.map +0 -1
  397. package/dist/esm/_virtual/index9.js +0 -7
  398. package/dist/esm/_virtual/index9.js.map +0 -1
  399. package/dist/esm/_virtual/interopRequireDefault.js +0 -4
  400. package/dist/esm/_virtual/interopRequireDefault.js.map +0 -1
  401. package/dist/esm/_virtual/isBetween.js +0 -4
  402. package/dist/esm/_virtual/isBetween.js.map +0 -1
  403. package/dist/esm/_virtual/jsx-runtime.js +0 -4
  404. package/dist/esm/_virtual/jsx-runtime.js.map +0 -1
  405. package/dist/esm/_virtual/localizedFormat.js +0 -4
  406. package/dist/esm/_virtual/localizedFormat.js.map +0 -1
  407. package/dist/esm/_virtual/lodash.js +0 -4
  408. package/dist/esm/_virtual/lodash.js.map +0 -1
  409. package/dist/esm/_virtual/lottie.js +0 -4
  410. package/dist/esm/_virtual/lottie.js.map +0 -1
  411. package/dist/esm/_virtual/numeral.js +0 -4
  412. package/dist/esm/_virtual/numeral.js.map +0 -1
  413. package/dist/esm/_virtual/objectWithoutPropertiesLoose.js +0 -4
  414. package/dist/esm/_virtual/objectWithoutPropertiesLoose.js.map +0 -1
  415. package/dist/esm/_virtual/react-is.development3.js +0 -4
  416. package/dist/esm/_virtual/react-is.development3.js.map +0 -1
  417. package/dist/esm/_virtual/react-is.production.min2.js +0 -4
  418. package/dist/esm/_virtual/react-is.production.min2.js.map +0 -1
  419. package/dist/esm/_virtual/react-jsx-runtime.development.js +0 -4
  420. package/dist/esm/_virtual/react-jsx-runtime.development.js.map +0 -1
  421. package/dist/esm/_virtual/react-jsx-runtime.production.min.js +0 -4
  422. package/dist/esm/_virtual/react-jsx-runtime.production.min.js.map +0 -1
  423. package/dist/esm/_virtual/timezone.js +0 -4
  424. package/dist/esm/_virtual/timezone.js.map +0 -1
  425. package/dist/esm/_virtual/use-sync-external-store-shim.development.js +0 -4
  426. package/dist/esm/_virtual/use-sync-external-store-shim.development.js.map +0 -1
  427. package/dist/esm/_virtual/use-sync-external-store-shim.production.js +0 -4
  428. package/dist/esm/_virtual/use-sync-external-store-shim.production.js.map +0 -1
  429. package/dist/esm/_virtual/useThemeWithoutDefault.js +0 -4
  430. package/dist/esm/_virtual/useThemeWithoutDefault.js.map +0 -1
  431. package/dist/esm/_virtual/utc.js +0 -4
  432. package/dist/esm/_virtual/utc.js.map +0 -1
  433. package/dist/esm/_virtual/weekOfYear.js +0 -4
  434. package/dist/esm/_virtual/weekOfYear.js.map +0 -1
  435. package/dist/esm/hooks/useFirstRender.js +0 -12
  436. package/dist/esm/hooks/useFirstRender.js.map +0 -1
  437. package/dist/esm/utils/data/order.js +0 -8
  438. package/dist/esm/utils/data/order.js.map +0 -1
  439. package/dist/index.cjs.js +0 -90295
  440. package/dist/index.cjs.js.map +0 -1
  441. package/dist/index.esm.js +0 -90275
  442. package/dist/index.esm.js.map +0 -1
  443. package/dist/types/hooks/data/useShoppingCart.d.ts +0 -8
  444. package/src/form/MerchandiseSelection.tsx +0 -29
  445. package/src/form/ReleaseWithMerchandise.tsx +0 -230
  446. package/src/form/TicketSelection.tsx +0 -282
  447. package/src/form/TicketWithMerchandiseSelection.tsx +0 -131
@@ -1,12 +1,11 @@
1
- import React, { useEffect, useState } from 'react';
1
+ import React, { useEffect, useMemo, useState } from 'react';
2
2
  import {
3
- Badge,
3
+ Box,
4
4
  Button,
5
5
  Dialog,
6
6
  DialogActions,
7
7
  DialogContent,
8
8
  DialogTitle,
9
- IconButton,
10
9
  Stack,
11
10
  Typography,
12
11
  } from '@mui/material';
@@ -16,17 +15,19 @@ import { useWatch } from 'react-hook-form';
16
15
  import { ITicketFormTicket } from '@utils/types/ticket.type';
17
16
  import { IEventProductForm } from '@utils/types/product.type';
18
17
  import { fCurrency } from '@utils/formatNumber';
18
+ import { MAX_TICKETS_PER_ORDER } from '@utils/data/ticket';
19
19
  import useGlobal from '@hooks/useGlobal.ts';
20
- import { Iconify } from '@components';
21
20
 
22
21
  interface Props {
23
22
  eventProduct: IEventProduct;
24
23
  eventId: number;
25
24
  openDialog: boolean;
26
- callback: (variant: IEventProductForm) => void;
25
+ callback: (variants: IEventProductForm[]) => void;
27
26
  onClose?: () => void;
28
27
  selectedQuantityByVariant?: Record<number, number>;
29
28
  isOnlyMerchandise?: boolean;
29
+ canAddOnlyOneAtATime?: boolean;
30
+ maxSelectableQuantity?: number;
30
31
  }
31
32
 
32
33
  const ProductVariantsDialog: React.FC<Props> = ({
@@ -37,13 +38,12 @@ const ProductVariantsDialog: React.FC<Props> = ({
37
38
  selectedQuantityByVariant,
38
39
  isOnlyMerchandise,
39
40
  eventId,
41
+ canAddOnlyOneAtATime,
42
+ maxSelectableQuantity,
40
43
  }) => {
41
44
  const { t, lang, options } = useGlobal();
42
45
  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);
46
+ const [draftQuantities, setDraftQuantities] = useState<Record<number, number>>({});
47
47
  const tickets: ITicketFormTicket[] = useWatch({ name: `tickets.${eventId}`, defaultValue: [] });
48
48
  const products: IEventProductForm[] = useWatch({ name: `products.${eventId}`, defaultValue: [] });
49
49
 
@@ -56,43 +56,51 @@ const ProductVariantsDialog: React.FC<Props> = ({
56
56
  }, [openDialog]);
57
57
 
58
58
  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);
59
+ if (openDialog && canAddOnlyOneAtATime) {
60
+ setDraftQuantities({});
68
61
  }
69
- }, [selectedVariant, isVariantClicked]);
62
+ }, [openDialog, canAddOnlyOneAtATime]);
70
63
 
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
- };
64
+ useEffect(() => {
65
+ if (openDialog && !canAddOnlyOneAtATime) {
66
+ setDraftQuantities(selectedQuantityByVariant ?? {});
67
+ }
68
+ }, [openDialog, selectedQuantityByVariant, canAddOnlyOneAtATime]);
82
69
 
83
70
  const handleOnAdd = () => {
84
- if (!selectedVariant) {
71
+ const selectedVariants = eventProduct.eventProductVariants
72
+ .map((variant) => {
73
+ const quantity = draftQuantities[variant.id] ?? 0;
74
+ const selectedQty = selectedQuantityByVariant?.[variant.id] ?? 0;
75
+ if (canAddOnlyOneAtATime) {
76
+ if (quantity <= 0) return null;
77
+ } else if (quantity <= 0 && selectedQty <= 0) {
78
+ return null;
79
+ }
80
+ return {
81
+ eventProductVariantId: variant.id,
82
+ productVariantId: variant.productVariant.id,
83
+ quantity,
84
+ price: variant.priceWithVat,
85
+ excludedShippingMethodIds: eventProduct.excludedShippingMethods.map(
86
+ (method) => method.id
87
+ ),
88
+ } as IEventProductForm;
89
+ })
90
+ .filter((variant): variant is IEventProductForm => Boolean(variant));
91
+
92
+ if (selectedVariants.length === 0) {
85
93
  showSnackbar(t('components.product_variant_dialog.select_variant'), { variant: 'error' });
86
94
  return;
87
95
  }
88
- callback(selectedVariant);
89
- setSelectedVariant(null);
96
+
97
+ callback(selectedVariants);
98
+ setDraftQuantities({});
90
99
  onClose?.();
91
100
  };
92
101
 
93
- const isVariantDisabled = (variant: IEventProductVariant) => {
102
+ const getUsedCount = (variant: IEventProductVariant) => {
94
103
  let countUsed = 0;
95
- let selectedVariantQuantity = 0;
96
104
 
97
105
  for (const product of products) {
98
106
  if (product.productVariantId === variant.productVariant.id) {
@@ -105,70 +113,111 @@ const ProductVariantsDialog: React.FC<Props> = ({
105
113
  for (const product of ticket.products) {
106
114
  if (product.productVariantId === variant.productVariant.id) {
107
115
  countUsed += product.quantity;
108
- selectedVariantQuantity = product.quantity;
109
116
  }
110
117
  }
111
118
  }
112
119
  }
120
+ return countUsed;
121
+ };
113
122
 
114
- return (
115
- (variant.productVariant.quantity &&
116
- countUsed + variant.productVariant.sold >= variant.productVariant.quantity) ||
117
- selectedVariantQuantity >= 10
118
- );
123
+ const getMaxAvailable = (variant: IEventProductVariant) => {
124
+ if (!variant.productVariant.quantity) return Number.POSITIVE_INFINITY;
125
+ return variant.productVariant.quantity - variant.productVariant.sold - getUsedCount(variant);
119
126
  };
120
127
 
121
- const isVariantSoldOut = () => {
122
- const variant = eventProduct.eventProductVariants.find(
123
- (product) => product.id === selectedVariant?.eventProductVariantId
124
- );
125
- let countUsed = variantQuantity;
128
+ const isVariantDisabled = (variant: IEventProductVariant) => {
129
+ if (!variant.productVariant.quantity) return false;
130
+ return getMaxAvailable(variant) <= 0;
131
+ };
126
132
 
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
- }
133
+ const handleAddQuantity = (variant: IEventProductVariant) => {
134
+ setDraftQuantities((prev) => {
135
+ const current = prev[variant.id] ?? 0;
136
+ const next = current + 1;
137
+ const maxAvailable = getMaxAvailable(variant);
136
138
 
137
- if (variant && variant.productVariant.quantity) {
138
- if (
139
- variant.productVariant.sold + countUsed >= variant.productVariant.quantity ||
140
- variantQuantity >= 10
141
- ) {
142
- return true;
139
+ if (canAddOnlyOneAtATime) {
140
+ if (maxAvailable < 1) return prev;
141
+ return { [variant.id]: 1 };
143
142
  }
144
- }
145
- return false;
143
+
144
+ const maxSelectable =
145
+ maxSelectableQuantity === undefined
146
+ ? MAX_TICKETS_PER_ORDER
147
+ : Math.max(0, Math.min(maxSelectableQuantity, MAX_TICKETS_PER_ORDER));
148
+
149
+ if (next > maxSelectable || next > maxAvailable) return prev;
150
+ return { ...prev, [variant.id]: next };
151
+ });
146
152
  };
147
153
 
148
- const handleAddQuantity = () => {
149
- setVariantQuantity(variantQuantity + 1);
150
- setSelectedVariant((prevState) => {
151
- if (!prevState) return null;
152
- return {
153
- ...prevState,
154
- quantity: variantQuantity + 1,
155
- };
154
+ const handleRemoveQuantity = (variant: IEventProductVariant) => {
155
+ setDraftQuantities((prev) => {
156
+ const current = prev[variant.id] ?? 0;
157
+ const next = current - 1;
158
+ if (next <= 0) {
159
+ const rest = { ...prev };
160
+ delete rest[variant.id];
161
+ return rest;
162
+ }
163
+ if (canAddOnlyOneAtATime) {
164
+ // Remove the only variant
165
+ return {};
166
+ }
167
+ return { ...prev, [variant.id]: next };
156
168
  });
157
169
  };
158
170
 
159
- const handleRemoveQuantity = () => {
160
- if (variantQuantity > 0) {
161
- setVariantQuantity(variantQuantity - 1);
171
+ const handleRemoveProduct = () => {
172
+ const variantsToRemove = eventProduct.eventProductVariants
173
+ .filter((variant) => (selectedQuantityByVariant?.[variant.id] ?? 0) > 0)
174
+ .map(
175
+ (variant) =>
176
+ ({
177
+ eventProductVariantId: variant.id,
178
+ productVariantId: variant.productVariant.id,
179
+ quantity: 0,
180
+ price: variant.priceWithVat,
181
+ excludedShippingMethodIds: eventProduct.excludedShippingMethods.map(
182
+ (method) => method.id
183
+ ),
184
+ }) as IEventProductForm
185
+ );
186
+
187
+ if (variantsToRemove.length === 0) {
188
+ return;
162
189
  }
163
- setSelectedVariant((prevState) => {
164
- if (!prevState) return null;
165
- return {
166
- ...prevState,
167
- quantity: variantQuantity - 1,
168
- };
169
- });
190
+
191
+ callback(variantsToRemove);
192
+ setDraftQuantities({});
193
+ onClose?.();
170
194
  };
171
195
 
196
+ const hasSelectedVariants = eventProduct.eventProductVariants.some(
197
+ (variant) => (selectedQuantityByVariant?.[variant.id] ?? 0) > 0
198
+ );
199
+
200
+ const variantsById = useMemo(
201
+ () => new Map(eventProduct.eventProductVariants.map((variant) => [variant.id, variant])),
202
+ [eventProduct.eventProductVariants]
203
+ );
204
+
205
+ const totalDraftPrice = useMemo(
206
+ () =>
207
+ Object.entries(draftQuantities).reduce((total, [variantId, qty]) => {
208
+ const variant = variantsById.get(Number(variantId));
209
+ if (!variant) return total;
210
+ return total + variant.priceWithVat * qty;
211
+ }, 0),
212
+ [draftQuantities, variantsById]
213
+ );
214
+
215
+ const hasDraftSelection = useMemo(
216
+ () =>
217
+ eventProduct.eventProductVariants.some((variant) => (draftQuantities[variant.id] ?? 0) > 0),
218
+ [eventProduct.eventProductVariants, draftQuantities]
219
+ );
220
+
172
221
  return (
173
222
  <Dialog
174
223
  open={openDialog}
@@ -187,16 +236,19 @@ const ProductVariantsDialog: React.FC<Props> = ({
187
236
  },
188
237
  }}
189
238
  >
190
- <DialogTitle />
191
- <DialogContent>
239
+ <DialogTitle
240
+ sx={{ textAlign: 'center', fontWeight: 700, fontSize: { xs: '1.5rem', sm: '1.5rem' } }}
241
+ >
242
+ {eventProduct.product.name}
243
+ </DialogTitle>
244
+ <DialogContent sx={{ pb: 0 }}>
192
245
  <Stack spacing={1}>
193
246
  <Image
194
247
  src={eventProduct.product.previewImage.url}
195
248
  alt={eventProduct.product.name}
196
- ratio="1/1"
197
- sx={{ borderRadius: 2 }}
249
+ ratio="16/9"
250
+ sx={{ borderRadius: 1 }}
198
251
  />
199
- <Typography variant="h5">{eventProduct.product.name}</Typography>
200
252
  <Typography variant="body2" color="primary">
201
253
  {t('form.labels.category')}: {eventProduct.product.category.value.text}
202
254
  </Typography>
@@ -207,64 +259,165 @@ const ProductVariantsDialog: React.FC<Props> = ({
207
259
  </Stack>
208
260
  </DialogContent>
209
261
  <DialogActions sx={{ justifyContent: 'flex-start' }}>
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' }}
262
+ <Stack spacing={1} width="100%">
263
+ <Stack spacing={1}>
264
+ {eventProduct.eventProductVariants.map((variant) => {
265
+ const draftQty = draftQuantities[variant.id] ?? 0;
266
+ const maxAvailable = getMaxAvailable(variant);
267
+ const maxSelectable =
268
+ maxSelectableQuantity === undefined
269
+ ? MAX_TICKETS_PER_ORDER
270
+ : Math.max(0, Math.min(maxSelectableQuantity, MAX_TICKETS_PER_ORDER));
271
+ const isAddDisabled =
272
+ isVariantDisabled(variant) ||
273
+ maxAvailable <= 0 ||
274
+ (!canAddOnlyOneAtATime && maxSelectable <= 0);
275
+ const isAnotherSelected =
276
+ canAddOnlyOneAtATime &&
277
+ Object.keys(draftQuantities).length > 0 &&
278
+ !draftQuantities[variant.id];
279
+ return (
280
+ <Stack
281
+ key={variant.id}
282
+ direction="row"
283
+ spacing={1}
284
+ alignItems="center"
285
+ width="100%"
228
286
  >
229
- {variant.productVariant.value}
230
- </Badge>
231
- </Button>
232
- ))}
287
+ <Box
288
+ sx={{
289
+ minWidth: 64,
290
+ maxWidth: 64,
291
+ height: 36,
292
+ borderRadius: 1,
293
+ border: 1,
294
+ borderColor: 'divider',
295
+ bgcolor: 'background.paper',
296
+ display: 'flex',
297
+ alignItems: 'center',
298
+ justifyContent: 'center',
299
+ }}
300
+ >
301
+ <Typography variant="body2" fontWeight={600}>
302
+ {variant.productVariant.value}
303
+ </Typography>
304
+ </Box>
305
+ {draftQty > 0 ? (
306
+ <Box
307
+ sx={{
308
+ flex: 1,
309
+ display: 'grid',
310
+ gridTemplateColumns: canAddOnlyOneAtATime
311
+ ? 'repeat(2, minmax(0, 1fr))'
312
+ : 'repeat(3, minmax(0, 1fr))',
313
+ gap: 1,
314
+ alignItems: 'center',
315
+ }}
316
+ >
317
+ <Button
318
+ variant="outlined"
319
+ onClick={() => handleRemoveQuantity(variant)}
320
+ aria-label={t('components.product_variant_dialog.decrease_quantity')}
321
+ disabled={draftQty < 1}
322
+ sx={{
323
+ minWidth: 0,
324
+ height: 36,
325
+ borderRadius: 1,
326
+ fontWeight: 700,
327
+ borderColor: 'grey.300',
328
+ color: 'text.primary',
329
+ }}
330
+ >
331
+ -
332
+ </Button>
333
+ <Typography
334
+ sx={{
335
+ minWidth: 0,
336
+ height: 36,
337
+ borderRadius: 1,
338
+ border: 1,
339
+ borderColor: 'divider',
340
+ boxSizing: 'border-box',
341
+ display: 'flex',
342
+ alignItems: 'center',
343
+ justifyContent: 'center',
344
+ textAlign: 'center',
345
+ fontWeight: 700,
346
+ color: 'text.primary',
347
+ }}
348
+ >
349
+ {draftQty}
350
+ </Typography>
351
+ {!canAddOnlyOneAtATime && (
352
+ <Button
353
+ variant="contained"
354
+ onClick={() => handleAddQuantity(variant)}
355
+ aria-label={t('components.product_variant_dialog.increase_quantity')}
356
+ disabled={draftQty >= maxSelectable || draftQty >= maxAvailable}
357
+ sx={{ minWidth: 0, height: 36, borderRadius: 1, fontWeight: 700 }}
358
+ >
359
+ +
360
+ </Button>
361
+ )}
362
+ </Box>
363
+ ) : (
364
+ <Button
365
+ variant="contained"
366
+ onClick={() => handleAddQuantity(variant)}
367
+ disabled={isOnlyMerchandise ? false : isAddDisabled || isAnotherSelected}
368
+ sx={{
369
+ flex: 1,
370
+ height: 36,
371
+ borderRadius: 1,
372
+ fontWeight: 700,
373
+ textTransform: 'none',
374
+ }}
375
+ >
376
+ {t('add')}
377
+ </Button>
378
+ )}
379
+
380
+ <Typography variant="body2">
381
+ {variant.priceWithVat > 0
382
+ ? fCurrency(variant.priceWithVat, lang, eventProduct.product.currency)
383
+ : t('free')}
384
+ </Typography>
385
+ </Stack>
386
+ );
387
+ })}
233
388
  </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')}
389
+ <Stack
390
+ direction="row"
391
+ spacing={1}
392
+ justifyContent="space-between"
393
+ alignItems="center"
394
+ width="100%"
395
+ >
396
+ <Typography variant="body2">{t('form.labels.total')}</Typography>
397
+ <Typography variant="body2" fontWeight={600}>
398
+ {fCurrency(totalDraftPrice, lang, eventProduct.product.currency)}
262
399
  </Typography>
263
400
  </Stack>
264
401
  <Stack direction="row" spacing={1} justifyContent="flex-end" width="100%">
265
- {onClose && <Button onClick={onClose}>{t('cancel')}</Button>}
266
- <Button variant="contained" onClick={handleOnAdd} disabled={!selectedVariant}>
267
- {t('add')}
402
+ {hasSelectedVariants && !canAddOnlyOneAtATime && (
403
+ <Button variant="outlined" color="error" onClick={handleRemoveProduct}>
404
+ {t('remove')}
405
+ </Button>
406
+ )}
407
+ {onClose && (
408
+ <Button
409
+ onClick={onClose}
410
+ sx={{
411
+ border: 1,
412
+ color: 'inherit',
413
+ borderColor: (theme) => theme.palette.grey[300],
414
+ }}
415
+ >
416
+ {t('cancel')}
417
+ </Button>
418
+ )}
419
+ <Button variant="contained" onClick={handleOnAdd} disabled={!hasDraftSelection}>
420
+ {t('confirm')}
268
421
  </Button>
269
422
  </Stack>
270
423
  </Stack>