@eventlook/sdk 1.4.4 → 1.4.5-1.beta.2

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 +29 -11
  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 +165 -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 +47 -2
  88. package/dist/cjs/locales/cs.js.map +1 -1
  89. package/dist/cjs/locales/en.js +47 -1
  90. package/dist/cjs/locales/en.js.map +1 -1
  91. package/dist/cjs/locales/es.js +47 -1
  92. package/dist/cjs/locales/es.js.map +1 -1
  93. package/dist/cjs/locales/pl.js +47 -1
  94. package/dist/cjs/locales/pl.js.map +1 -1
  95. package/dist/cjs/locales/sk.js +47 -1
  96. package/dist/cjs/locales/sk.js.map +1 -1
  97. package/dist/cjs/locales/uk.js +47 -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 +30 -12
  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 +161 -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 +47 -2
  192. package/dist/esm/locales/cs.js.map +1 -1
  193. package/dist/esm/locales/en.js +47 -1
  194. package/dist/esm/locales/en.js.map +1 -1
  195. package/dist/esm/locales/es.js +47 -1
  196. package/dist/esm/locales/es.js.map +1 -1
  197. package/dist/esm/locales/pl.js +47 -1
  198. package/dist/esm/locales/pl.js.map +1 -1
  199. package/dist/esm/locales/sk.js +47 -1
  200. package/dist/esm/locales/sk.js.map +1 -1
  201. package/dist/esm/locales/uk.js +47 -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 +23 -0
  222. package/dist/types/locales/en.d.ts +24 -0
  223. package/dist/types/locales/es.d.ts +24 -0
  224. package/dist/types/locales/pl.d.ts +24 -0
  225. package/dist/types/locales/sk.d.ts +24 -0
  226. package/dist/types/locales/uk.d.ts +24 -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 +1 -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 +6 -1
  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 +271 -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 +188 -0
  267. package/src/form/tickets/TicketWithMerchandiseSelection.tsx +192 -0
  268. package/src/hooks/useScrollToFirstError.ts +99 -0
  269. package/src/locales/cs.tsx +50 -2
  270. package/src/locales/en.tsx +50 -1
  271. package/src/locales/es.tsx +50 -1
  272. package/src/locales/pl.tsx +50 -1
  273. package/src/locales/sk.tsx +50 -1
  274. package/src/locales/uk.tsx +50 -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 +1 -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 -284
  447. package/src/form/TicketWithMerchandiseSelection.tsx +0 -131
@@ -0,0 +1,100 @@
1
+ import React from 'react';
2
+ import { Box, Button, IconButton, Stack } from '@mui/material';
3
+ import { Iconify } from '@components/iconify';
4
+ import useGlobal from '@hooks/useGlobal';
5
+
6
+ interface TicketQuantityControlProps {
7
+ quantity: number;
8
+ isDisabled: boolean;
9
+ canAddFirst: boolean;
10
+ canAddMore: boolean;
11
+ addLabel: string;
12
+ onDecrement: () => void;
13
+ onIncrement: () => void;
14
+ onAddFirst: () => void;
15
+ }
16
+
17
+ const TicketQuantityControl: React.FC<TicketQuantityControlProps> = ({
18
+ quantity,
19
+ isDisabled,
20
+ canAddFirst,
21
+ canAddMore,
22
+ addLabel,
23
+ onDecrement,
24
+ onIncrement,
25
+ onAddFirst,
26
+ }) => {
27
+ const { t } = useGlobal();
28
+
29
+ if (quantity > 0) {
30
+ return (
31
+ <Stack direction="row" spacing={{ xs: 0.5, md: 1 }} alignItems="center">
32
+ <IconButton
33
+ onClick={onDecrement}
34
+ aria-label={t('form.labels.ticket_quantity_decrease')}
35
+ disabled={isDisabled || quantity <= 0}
36
+ sx={{
37
+ width: { xs: 36, md: 40 },
38
+ height: { xs: 36, md: 40 },
39
+ borderRadius: 1,
40
+ border: '1px solid',
41
+ borderColor: 'grey.300',
42
+ }}
43
+ >
44
+ <Iconify icon="eva:minus-fill" />
45
+ </IconButton>
46
+ <Box
47
+ sx={{
48
+ width: { xs: 36, md: 40 },
49
+ height: { xs: 36, md: 40 },
50
+ borderRadius: 1,
51
+ border: '1px solid',
52
+ borderColor: 'grey.300',
53
+ display: 'flex',
54
+ alignItems: 'center',
55
+ justifyContent: 'center',
56
+ fontWeight: 600,
57
+ }}
58
+ >
59
+ {quantity}
60
+ </Box>
61
+ <IconButton
62
+ onClick={onIncrement}
63
+ aria-label={t('form.labels.ticket_quantity_increase')}
64
+ disabled={isDisabled || !canAddMore}
65
+ sx={{
66
+ width: { xs: 36, md: 40 },
67
+ height: { xs: 36, md: 40 },
68
+ borderRadius: 1,
69
+ bgcolor: 'primary.main',
70
+ color: 'primary.contrastText',
71
+ '&:hover': { bgcolor: 'primary.dark' },
72
+ }}
73
+ >
74
+ <Iconify icon="eva:plus-fill" />
75
+ </IconButton>
76
+ </Stack>
77
+ );
78
+ }
79
+
80
+ return (
81
+ <Button
82
+ variant="contained"
83
+ onClick={onAddFirst}
84
+ aria-label={addLabel}
85
+ disabled={isDisabled || !canAddFirst}
86
+ sx={{
87
+ height: { xs: 36, md: 40 },
88
+ width: { xs: 116, md: 136 },
89
+ borderRadius: 1,
90
+ px: 3,
91
+ textTransform: 'none',
92
+ fontWeight: 600,
93
+ }}
94
+ >
95
+ {addLabel}
96
+ </Button>
97
+ );
98
+ };
99
+
100
+ export default TicketQuantityControl;
@@ -0,0 +1,236 @@
1
+ import React, { useEffect, useRef } from 'react';
2
+ import { useFormContext, useWatch } from 'react-hook-form';
3
+ import { Box, Divider, Stack, Typography } from '@mui/material';
4
+ import { ITicketForm, ITicketFormTicket } from '@utils/types/ticket.type';
5
+ import useEventActiveReleases from '@hooks/data/useEventActiveReleases';
6
+ import { groupBy } from '@utils/global';
7
+ import { IReleaseShort } from '@utils/types/release.type';
8
+ import { IEvent } from '@utils/types/event.type';
9
+ import useResponsive from '@hooks/useResponsive';
10
+ import ReleaseExtraFields from '@form/extra-field/ReleaseExtraFields';
11
+ import { EventType } from '@utils/data/event';
12
+ import { MAX_TICKETS_PER_ORDER } from '@utils/data/ticket';
13
+ import useGlobal from '@hooks/useGlobal.ts';
14
+ import TicketSelectionMobile from './TicketSelectionMobile';
15
+
16
+ interface Props {
17
+ event: IEvent;
18
+ }
19
+
20
+ const TicketSelection: React.FC<Props> = ({ event }) => {
21
+ const { t } = useGlobal();
22
+ const isMobile = useResponsive('down', 'md');
23
+ const { setValue, watch } = useFormContext<ITicketForm>();
24
+ const tickets = useWatch({
25
+ name: `tickets.${event.id}`,
26
+ defaultValue: [],
27
+ }) as ITicketFormTicket[];
28
+ const eventTimeslotId = watch('eventTimeslotId');
29
+ const isProcessingRef = useRef(false);
30
+ const { data: activeReleases, mutate } = useEventActiveReleases(
31
+ event.id,
32
+ false,
33
+ event.type === EventType.RECURRING ? eventTimeslotId : undefined
34
+ );
35
+
36
+ const showLoading = !activeReleases && event.type !== EventType.RECURRING;
37
+
38
+ useEffect(() => {
39
+ if (!isProcessingRef.current) selectedTickets();
40
+ }, [tickets, activeReleases]);
41
+
42
+ const isReleaseSelected = (id: number) => !!tickets.find((ticket) => ticket.releaseId === id);
43
+
44
+ const getRelease = (releaseId: number) => {
45
+ const release = activeReleases?.find((activeRelease) => activeRelease.id === releaseId);
46
+ return release ? release : null;
47
+ };
48
+
49
+ const getExtraFields = (releaseId: number | '', index: number) => {
50
+ if (!releaseId) return null;
51
+
52
+ const release = getRelease(releaseId);
53
+
54
+ if (!release || !release?.extraFields || release?.extraFields.length <= 0) return null;
55
+
56
+ const addedRelease = tickets.find((ticket) => ticket.releaseId === release.id);
57
+ const countTickets = addedRelease?.quantity || 0;
58
+ return (
59
+ <ReleaseExtraFields
60
+ release={release}
61
+ eventId={event.id}
62
+ releaseIndex={index}
63
+ quantity={countTickets}
64
+ />
65
+ );
66
+ };
67
+
68
+ // const getAvailableTicketsForRelease = (release: ITicketFormTicket): number => {
69
+ // const selectedRelease = activeReleases?.find((item) => item.id === release.releaseId);
70
+ // const availableQuantity = selectedRelease ? selectedRelease.availableTickets : 0;
71
+ // return availableQuantity > MAX_TICKETS_PER_ORDER ? MAX_TICKETS_PER_ORDER : availableQuantity;
72
+ // };
73
+
74
+ const countReleaseCategories = (): number => {
75
+ const grouped = groupBy(activeReleases || [], 'releaseCategoryName');
76
+ return Object.keys(grouped).length;
77
+ };
78
+
79
+ const selectedReleaseIsSoldOut = (releases: IReleaseShort[] | undefined) => {
80
+ const lockedSelectedReleases: boolean[] | undefined = releases?.map((item, index) => {
81
+ const nextRelease = releases?.find(
82
+ (item2) =>
83
+ item2.releaseCategoryName === item.releaseCategoryName && item2.order === item.order + 1
84
+ );
85
+ const selected = tickets.find((ticket) => ticket.releaseId === item.id);
86
+ const maxSelectable = Math.min(item.availableTickets || 0, MAX_TICKETS_PER_ORDER);
87
+
88
+ return (
89
+ !!nextRelease &&
90
+ item.locked &&
91
+ !!selected &&
92
+ Number(selected.quantity) >= maxSelectable &&
93
+ index + 1 == tickets.length
94
+ );
95
+ });
96
+ return lockedSelectedReleases && lockedSelectedReleases.includes(true);
97
+ };
98
+
99
+ const countUnlockedReleases = () => activeReleases?.filter((item) => !item.locked).length || 0;
100
+
101
+ const countSelectedTickets = () => {
102
+ let count = 0;
103
+ for (const ticket of tickets) {
104
+ count += +ticket.quantity;
105
+ }
106
+
107
+ return count;
108
+ };
109
+
110
+ const isQuantityDisabled = (value: number, releaseId: number | '') => {
111
+ const releaseSelected = tickets.find((item) => item.releaseId === releaseId);
112
+ return releaseSelected && releaseSelected.quantity
113
+ ? countSelectedTickets() + value - releaseSelected.quantity > MAX_TICKETS_PER_ORDER
114
+ : countSelectedTickets() + value > MAX_TICKETS_PER_ORDER;
115
+ };
116
+
117
+ const removeTicket = (indexToRemove: number) => {
118
+ const activeReleases = tickets.filter((_ticket, index) => index !== indexToRemove);
119
+ setValue(`tickets.${event.id}`, activeReleases);
120
+ };
121
+
122
+ const selectedTickets = async () => {
123
+ const releases = await mutate();
124
+ const currentReleases = releases || activeReleases || [];
125
+ const allFilled = tickets.filter((item) => !item.releaseId || !item.quantity);
126
+
127
+ const soldOutReleaseCategories = currentReleases.filter((release) =>
128
+ tickets.find(
129
+ (ticket) =>
130
+ release.id === ticket.releaseId &&
131
+ Number(ticket.quantity) >= Math.min(release.availableTickets || 0, MAX_TICKETS_PER_ORDER)
132
+ )
133
+ );
134
+
135
+ if (currentReleases.length) {
136
+ let hasChanges = false;
137
+ const updatedReleases = currentReleases.map((release) => {
138
+ const previousRelease = currentReleases.find(
139
+ (item) =>
140
+ item.releaseCategoryName === release.releaseCategoryName &&
141
+ item.order === release.order - 1
142
+ );
143
+
144
+ if (!release.locked || !previousRelease) return release;
145
+
146
+ const previousTicket = tickets.find((ticket) => ticket.releaseId === previousRelease.id);
147
+ const previousMaxSelectable = Math.min(
148
+ previousRelease.availableTickets || 0,
149
+ MAX_TICKETS_PER_ORDER
150
+ );
151
+ const shouldUnlock = Number(previousTicket?.quantity || 0) >= previousMaxSelectable;
152
+
153
+ if (!shouldUnlock) return release;
154
+
155
+ hasChanges = true;
156
+ return { ...release, locked: false };
157
+ });
158
+
159
+ if (hasChanges) {
160
+ await mutate(updatedReleases, false);
161
+ }
162
+ }
163
+
164
+ const hasSelectableRelease = currentReleases.some(
165
+ (release) => !isReleaseSelected(release.id) && !release.locked
166
+ );
167
+
168
+ const shouldAddRow =
169
+ (soldOutReleaseCategories &&
170
+ selectedReleaseIsSoldOut(releases) &&
171
+ tickets.length < soldOutReleaseCategories.length + countUnlockedReleases() &&
172
+ !allFilled.length) ||
173
+ (currentReleases.length &&
174
+ soldOutReleaseCategories.length &&
175
+ currentReleases.length > tickets.length &&
176
+ tickets.length < soldOutReleaseCategories.length + countUnlockedReleases() &&
177
+ !allFilled.length) ||
178
+ (tickets.length < countReleaseCategories() && !allFilled.length);
179
+
180
+ const shouldRemoveEmptyRows =
181
+ allFilled.length > 0 &&
182
+ tickets.length > 1 &&
183
+ !hasSelectableRelease &&
184
+ (!soldOutReleaseCategories?.length || !selectedReleaseIsSoldOut(releases));
185
+
186
+ if (shouldAddRow) {
187
+ isProcessingRef.current = true;
188
+ setValue(`tickets.${event.id}`, [
189
+ ...tickets,
190
+ {
191
+ releaseId: '',
192
+ quantity: '',
193
+ itemName: '',
194
+ price: 0,
195
+ products: [],
196
+ extraFields: [],
197
+ },
198
+ ]);
199
+ setTimeout(() => (isProcessingRef.current = false), 0);
200
+ } else if (shouldRemoveEmptyRows) {
201
+ // Only remove completely empty rows (no releaseId), keep rows where user started selecting
202
+ const nonEmptyTickets = tickets.filter((item) => item.releaseId);
203
+ if (nonEmptyTickets.length < tickets.length) {
204
+ isProcessingRef.current = true;
205
+ setValue(`tickets.${event.id}`, nonEmptyTickets);
206
+ setTimeout(() => (isProcessingRef.current = false), 0);
207
+ }
208
+ }
209
+ };
210
+
211
+ return (
212
+ <Stack
213
+ spacing={3}
214
+ direction="column"
215
+ divider={!isMobile ? <Divider sx={{ borderStyle: 'dashed' }} /> : undefined}
216
+ >
217
+ <TicketSelectionMobile
218
+ event={event}
219
+ activeReleases={activeReleases}
220
+ showLoading={showLoading}
221
+ tickets={tickets}
222
+ isQuantityDisabled={isQuantityDisabled}
223
+ setValue={setValue as (name: string, value: any) => void}
224
+ removeTicket={removeTicket}
225
+ getExtraFields={getExtraFields}
226
+ />
227
+ <Box>
228
+ <Typography variant="caption" component="div" fontStyle="italic" mb={2}>
229
+ *{t('event.tickets.stepper.1.max_ticket_quantity')}
230
+ </Typography>
231
+ </Box>
232
+ </Stack>
233
+ );
234
+ };
235
+
236
+ export default TicketSelection;
@@ -0,0 +1,99 @@
1
+ import React from 'react';
2
+ import useGlobal from '@hooks/useGlobal.ts';
3
+ import { IEvent } from '@utils/types/event.type.ts';
4
+ import { Button } from '@mui/material';
5
+ import { iframe, TicketSelection } from '@seat-picker/seat-picker-sdk';
6
+ import { useFormContext } from 'react-hook-form';
7
+ import { ITicketForm, ITicketFormTicket, ITicketLocation } from '@utils/types/ticket.type.ts';
8
+ import { MAX_TICKETS_PER_ORDER } from '@utils/data/ticket';
9
+ import Iconify from '@components/iconify/Iconify';
10
+
11
+ interface Props {
12
+ event: IEvent;
13
+ }
14
+
15
+ const TicketSelectionMap: React.FC<Props> = ({ event }) => {
16
+ const { t, seatingIframeUrl } = useGlobal();
17
+ const { setValue, watch } = useFormContext<ITicketForm>();
18
+ const uuid = watch('uuid');
19
+
20
+ if (!uuid) return;
21
+
22
+ const onSelect = (seats: TicketSelection) => {
23
+ const tickets: ITicketFormTicket[] = [];
24
+ const groupedSeatsByZone = seats.reduce(
25
+ (tickets, seat) => {
26
+ const zoneIndex = tickets.findIndex((ticket) => ticket.seat.id === seat.locationId);
27
+ if (zoneIndex !== -1) {
28
+ tickets[zoneIndex].quantity += 1;
29
+ } else {
30
+ tickets.push({
31
+ seat: {
32
+ id: seat.locationId,
33
+ type: seat.locationType,
34
+ locationDescription: seat.locationTypeDescription,
35
+ },
36
+ quantity: 1,
37
+ ticket: seat.ticket,
38
+ });
39
+ }
40
+
41
+ return tickets;
42
+ },
43
+ // TODO: fix types
44
+ [] as { quantity: number; seat: ITicketLocation; ticket: any }[]
45
+ );
46
+
47
+ let remainingTicketCapacity = MAX_TICKETS_PER_ORDER;
48
+
49
+ for (const groupedSeat of groupedSeatsByZone) {
50
+ if (remainingTicketCapacity <= 0) break;
51
+
52
+ const quantity = Math.min(groupedSeat.quantity, remainingTicketCapacity);
53
+ remainingTicketCapacity -= quantity;
54
+
55
+ tickets.push({
56
+ releaseId: groupedSeat.ticket.id,
57
+ price: groupedSeat.ticket.price,
58
+ quantity,
59
+ itemName: `${groupedSeat.ticket.releaseCategoryName} - ${groupedSeat.ticket.name}`,
60
+ products: [],
61
+ extraFields: [],
62
+ location: {
63
+ id: groupedSeat.seat.id,
64
+ type: groupedSeat.seat.type,
65
+ locationDescription: groupedSeat.seat.locationDescription,
66
+ },
67
+ });
68
+ }
69
+
70
+ setValue(`tickets.${event.id}`, tickets);
71
+ };
72
+
73
+ if (!seatingIframeUrl) return null;
74
+
75
+ return (
76
+ <Button
77
+ variant="outlined"
78
+ onClick={() =>
79
+ iframe.openPicker({
80
+ eventId: String(event.id),
81
+ onSelect,
82
+ baseUrl: seatingIframeUrl,
83
+ clientId: uuid,
84
+ })
85
+ }
86
+ sx={{
87
+ width: { xs: '100%' },
88
+ color: 'text.primary',
89
+ borderColor: (theme) => theme.palette.grey['300'],
90
+ '& .MuiButton-endIcon': { ml: 0, fontSize: '1.5em' },
91
+ }}
92
+ endIcon={<Iconify icon="eva:chevron-right-outline" />}
93
+ >
94
+ {t('form.labels.open_map')}
95
+ </Button>
96
+ );
97
+ };
98
+
99
+ export default TicketSelectionMap;
@@ -0,0 +1,188 @@
1
+ import React, { useState } from 'react';
2
+ import { Box, Skeleton, Stack, Typography, useTheme } from '@mui/material';
3
+ import { fCurrency } from '@utils/formatNumber';
4
+ import { IEvent } from '@utils/types/event.type';
5
+ import { IReleaseShort } from '@utils/types/release.type';
6
+ import { ITicketFormTicket } from '@utils/types/ticket.type';
7
+ import { MAX_TICKETS_PER_ORDER } from '@utils/data/ticket';
8
+ import useGlobal from '@hooks/useGlobal';
9
+ import ReleaseDescription from './ReleaseDescription';
10
+ import TicketQuantityControl from './TicketQuantityControl';
11
+
12
+ interface Props {
13
+ event: IEvent;
14
+ activeReleases?: IReleaseShort[];
15
+ showLoading: boolean;
16
+ tickets: ITicketFormTicket[];
17
+ isQuantityDisabled: (value: number, releaseId: number | '') => boolean;
18
+ setValue: (name: string, value: any) => void;
19
+ removeTicket: (indexToRemove: number) => void;
20
+ getExtraFields: (releaseId: number | '', index: number) => React.ReactNode;
21
+ }
22
+
23
+ const TicketSelectionMobile: React.FC<Props> = ({
24
+ event,
25
+ activeReleases,
26
+ showLoading,
27
+ tickets,
28
+ isQuantityDisabled,
29
+ setValue,
30
+ removeTicket,
31
+ getExtraFields,
32
+ }) => {
33
+ const { t, lang } = useGlobal();
34
+ const [expandedReleaseIds, setExpandedReleaseIds] = useState<Record<number, boolean>>({});
35
+ const theme = useTheme();
36
+ const isLight = theme.palette.mode === 'light';
37
+
38
+ const getReleaseTitle = (release: IReleaseShort) =>
39
+ release.releaseCategoryName || release.name || '';
40
+
41
+ const getTicketIndexByRelease = (releaseId: number) =>
42
+ tickets.findIndex((ticket) => ticket.releaseId === releaseId);
43
+
44
+ const getReleaseQuantity = (releaseId: number) => {
45
+ const ticket = tickets.find((t) => t.releaseId === releaseId);
46
+ return Number(ticket?.quantity || 0);
47
+ };
48
+
49
+ const isReleaseVisible = (release: IReleaseShort) =>
50
+ !release.locked || getReleaseQuantity(release.id) > 0;
51
+
52
+ const updateReleaseQuantity = (release: IReleaseShort, nextQuantity: number) => {
53
+ const maxAvailable = Math.min(release.availableTickets || 0, MAX_TICKETS_PER_ORDER);
54
+ const clampedQuantity = Math.max(0, Math.min(nextQuantity, maxAvailable));
55
+ const ticketIndex = getTicketIndexByRelease(release.id);
56
+
57
+ if (clampedQuantity <= 0) {
58
+ if (ticketIndex >= 0) removeTicket(ticketIndex);
59
+ return;
60
+ }
61
+
62
+ if (ticketIndex >= 0) {
63
+ setValue(`tickets.${event.id}.${ticketIndex}.quantity`, clampedQuantity);
64
+ return;
65
+ }
66
+
67
+ setValue(`tickets.${event.id}`, [
68
+ ...tickets,
69
+ {
70
+ releaseId: release.id,
71
+ quantity: clampedQuantity,
72
+ itemName: getReleaseTitle(release),
73
+ price: release.price || 0,
74
+ products: [],
75
+ extraFields: [],
76
+ },
77
+ ]);
78
+ };
79
+
80
+ const toggleReleaseDescription = (releaseId: number) =>
81
+ setExpandedReleaseIds((prev) => ({
82
+ ...prev,
83
+ [releaseId]: !prev[releaseId],
84
+ }));
85
+
86
+ if (showLoading) {
87
+ return (
88
+ <Stack spacing={2}>
89
+ {[...Array(2)].map((_, index) => (
90
+ <Skeleton
91
+ key={index}
92
+ variant="rounded"
93
+ sx={{
94
+ width: '100%',
95
+ height: (theme) => theme.spacing(12),
96
+ }}
97
+ />
98
+ ))}
99
+ </Stack>
100
+ );
101
+ }
102
+
103
+ return (
104
+ <Stack spacing={2}>
105
+ {activeReleases
106
+ ?.filter((release) => isReleaseVisible(release))
107
+ .map((release) => {
108
+ const quantity = getReleaseQuantity(release.id);
109
+ const ticketIndex = getTicketIndexByRelease(release.id);
110
+ const maxAvailable = Math.min(release.availableTickets || 0, MAX_TICKETS_PER_ORDER);
111
+ const isLocked = release.locked;
112
+ const nextRelease = activeReleases?.find(
113
+ (item) =>
114
+ item.releaseCategoryName === release.releaseCategoryName &&
115
+ item.order === release.order + 1
116
+ );
117
+ const hasSelectedNextRelease = !!nextRelease && getReleaseQuantity(nextRelease.id) > 0;
118
+ const isDisabled = hasSelectedNextRelease || (isLocked && quantity === 0);
119
+ const canAddFirst = maxAvailable > 0 && !isQuantityDisabled(1, release.id);
120
+ const canAddMore =
121
+ quantity < maxAvailable && !isQuantityDisabled(quantity + 1, release.id);
122
+
123
+ return (
124
+ <Box
125
+ key={release.id}
126
+ sx={{
127
+ pt: 1,
128
+ pr: 0.5,
129
+ pb: 0.5,
130
+ pl: 2,
131
+ borderRadius: 1,
132
+ bgcolor: (theme) => (isLight ? theme.palette.grey[100] : theme.palette.grey[800]),
133
+ }}
134
+ >
135
+ <Stack spacing={0}>
136
+ <Box>
137
+ <Typography variant="subtitle2" fontWeight={700}>
138
+ {getReleaseTitle(release)}
139
+ </Typography>
140
+ </Box>
141
+
142
+ <Stack direction="row" alignItems="center" justifyContent="space-between">
143
+ <Stack>
144
+ <Typography variant="body2">
145
+ {release.price === 0
146
+ ? t('free')
147
+ : fCurrency(release.price, lang, event.currency)}
148
+ - {release.name}
149
+ </Typography>
150
+
151
+ <ReleaseDescription
152
+ description={release.description}
153
+ isExpanded={Boolean(expandedReleaseIds[release.id])}
154
+ onToggle={() => toggleReleaseDescription(release.id)}
155
+ moreInfoLabel={t('more_info')}
156
+ />
157
+ </Stack>
158
+
159
+ <TicketQuantityControl
160
+ quantity={quantity}
161
+ isDisabled={isDisabled}
162
+ canAddFirst={canAddFirst}
163
+ canAddMore={canAddMore}
164
+ addLabel={t('add')}
165
+ onDecrement={() => updateReleaseQuantity(release, quantity - 1)}
166
+ onIncrement={() => updateReleaseQuantity(release, quantity + 1)}
167
+ onAddFirst={() => updateReleaseQuantity(release, 1)}
168
+ />
169
+ </Stack>
170
+
171
+ <ReleaseDescription
172
+ description={release.description}
173
+ isExpanded={Boolean(expandedReleaseIds[release.id])}
174
+ onToggle={() => toggleReleaseDescription(release.id)}
175
+ moreInfoLabel={t('more_info')}
176
+ showCollapse
177
+ />
178
+
179
+ {ticketIndex >= 0 && getExtraFields(release.id, ticketIndex)}
180
+ </Stack>
181
+ </Box>
182
+ );
183
+ })}
184
+ </Stack>
185
+ );
186
+ };
187
+
188
+ export default TicketSelectionMobile;