@eventlook/sdk 1.4.48 → 1.4.49-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 (233) hide show
  1. package/.env.example +1 -0
  2. package/dist/cjs/_virtual/_commonjsHelpers.js +8 -0
  3. package/dist/cjs/_virtual/_commonjsHelpers.js.map +1 -0
  4. package/dist/cjs/_virtual/index.js +6 -0
  5. package/dist/cjs/_virtual/index.js.map +1 -0
  6. package/dist/cjs/_virtual/index2.js +6 -0
  7. package/dist/cjs/_virtual/index2.js.map +1 -0
  8. package/dist/cjs/_virtual/index3.js +6 -0
  9. package/dist/cjs/_virtual/index3.js.map +1 -0
  10. package/dist/cjs/_virtual/react-is.development.js +6 -0
  11. package/dist/cjs/_virtual/react-is.development.js.map +1 -0
  12. package/dist/cjs/_virtual/react-is.development2.js +6 -0
  13. package/dist/cjs/_virtual/react-is.development2.js.map +1 -0
  14. package/dist/cjs/_virtual/react-is.production.js +6 -0
  15. package/dist/cjs/_virtual/react-is.production.js.map +1 -0
  16. package/dist/cjs/_virtual/react-is.production.min.js +6 -0
  17. package/dist/cjs/_virtual/react-is.production.min.js.map +1 -0
  18. package/dist/cjs/components/hook-form/FormProvider.js +2 -2
  19. package/dist/cjs/components/hook-form/FormProvider.js.map +1 -1
  20. package/dist/cjs/form/ChildEventDialog.js +3 -3
  21. package/dist/cjs/form/ChildEventDialog.js.map +1 -1
  22. package/dist/cjs/form/ContactPerson.js +1 -1
  23. package/dist/cjs/form/ContactPerson.js.map +1 -1
  24. package/dist/cjs/form/PaymentOverviewBox.js +47 -61
  25. package/dist/cjs/form/PaymentOverviewBox.js.map +1 -1
  26. package/dist/cjs/form/PaymentOverviewDrawer.js +157 -0
  27. package/dist/cjs/form/PaymentOverviewDrawer.js.map +1 -0
  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 +21 -18
  31. package/dist/cjs/form/Shipping.js.map +1 -1
  32. package/dist/cjs/form/TicketForm.js +94 -33
  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 +5 -6
  37. package/dist/cjs/form/TicketSelection.js.map +1 -1
  38. package/dist/cjs/form/TicketSelectionMobile.js +98 -0
  39. package/dist/cjs/form/TicketSelectionMobile.js.map +1 -0
  40. package/dist/cjs/form/TicketWithMerchandiseSelection.js +3 -5
  41. package/dist/cjs/form/TicketWithMerchandiseSelection.js.map +1 -1
  42. package/dist/cjs/form/index.js +1 -1
  43. package/dist/cjs/form/index.js.map +1 -1
  44. package/dist/cjs/form/merchandise/MerchandiseSelection.js +14 -0
  45. package/dist/cjs/form/merchandise/MerchandiseSelection.js.map +1 -0
  46. package/dist/cjs/form/merchandise/MerchandiseSlider.js +40 -0
  47. package/dist/cjs/form/merchandise/MerchandiseSlider.js.map +1 -0
  48. package/dist/cjs/form/merchendise/MerchandiseSelection.js +19 -0
  49. package/dist/cjs/form/merchendise/MerchandiseSelection.js.map +1 -0
  50. package/dist/cjs/form/merchendise/MerchandiseSlider.js +75 -0
  51. package/dist/cjs/form/merchendise/MerchandiseSlider.js.map +1 -0
  52. package/dist/cjs/form/payment/FeeBox.js +4 -16
  53. package/dist/cjs/form/payment/FeeBox.js.map +1 -1
  54. package/dist/cjs/form/payment/PaymentOverviewCheckbox.js +33 -28
  55. package/dist/cjs/form/payment/PaymentOverviewCheckbox.js.map +1 -1
  56. package/dist/cjs/form/product/ProductCard.js +139 -36
  57. package/dist/cjs/form/product/ProductCard.js.map +1 -1
  58. package/dist/cjs/form/product/ProductVariantsDialog.js +157 -96
  59. package/dist/cjs/form/product/ProductVariantsDialog.js.map +1 -1
  60. package/dist/cjs/form/services/index.js +133 -0
  61. package/dist/cjs/form/services/index.js.map +1 -0
  62. package/dist/cjs/form/style.js +7 -3
  63. package/dist/cjs/form/style.js.map +1 -1
  64. package/dist/cjs/form/tickets/ReleaseDescription.js +23 -0
  65. package/dist/cjs/form/tickets/ReleaseDescription.js.map +1 -0
  66. package/dist/cjs/form/tickets/ReleaseWithMerchandise.js +141 -0
  67. package/dist/cjs/form/tickets/ReleaseWithMerchandise.js.map +1 -0
  68. package/dist/cjs/form/tickets/TicketQuantityControl.js +52 -0
  69. package/dist/cjs/form/tickets/TicketQuantityControl.js.map +1 -0
  70. package/dist/cjs/form/tickets/TicketSelection.js +139 -0
  71. package/dist/cjs/form/tickets/TicketSelection.js.map +1 -0
  72. package/dist/cjs/form/tickets/TicketSelectionMap.js +73 -0
  73. package/dist/cjs/form/tickets/TicketSelectionMap.js.map +1 -0
  74. package/dist/cjs/form/tickets/TicketSelectionMobile.js +90 -0
  75. package/dist/cjs/form/tickets/TicketSelectionMobile.js.map +1 -0
  76. package/dist/cjs/form/tickets/TicketWithMerchandiseSelection.js +117 -0
  77. package/dist/cjs/form/tickets/TicketWithMerchandiseSelection.js.map +1 -0
  78. package/dist/cjs/hooks/useConsentScrollOnDrawerOpen.js +59 -0
  79. package/dist/cjs/hooks/useConsentScrollOnDrawerOpen.js.map +1 -0
  80. package/dist/cjs/hooks/useScrollToFirstError.js +64 -0
  81. package/dist/cjs/hooks/useScrollToFirstError.js.map +1 -0
  82. package/dist/cjs/locales/cs.js +18 -3
  83. package/dist/cjs/locales/cs.js.map +1 -1
  84. package/dist/cjs/locales/en.js +17 -2
  85. package/dist/cjs/locales/en.js.map +1 -1
  86. package/dist/cjs/locales/es.js +16 -1
  87. package/dist/cjs/locales/es.js.map +1 -1
  88. package/dist/cjs/locales/pl.js +16 -1
  89. package/dist/cjs/locales/pl.js.map +1 -1
  90. package/dist/cjs/locales/sk.js +17 -2
  91. package/dist/cjs/locales/sk.js.map +1 -1
  92. package/dist/cjs/locales/uk.js +16 -1
  93. package/dist/cjs/locales/uk.js.map +1 -1
  94. package/dist/cjs/utils/data/global.js +2 -0
  95. package/dist/cjs/utils/data/global.js.map +1 -1
  96. package/dist/esm/_virtual/_commonjsHelpers.js +6 -0
  97. package/dist/esm/_virtual/_commonjsHelpers.js.map +1 -0
  98. package/dist/esm/_virtual/index.js +4 -0
  99. package/dist/esm/_virtual/index.js.map +1 -0
  100. package/dist/esm/_virtual/index2.js +4 -0
  101. package/dist/esm/_virtual/index2.js.map +1 -0
  102. package/dist/esm/_virtual/index3.js +4 -0
  103. package/dist/esm/_virtual/index3.js.map +1 -0
  104. package/dist/esm/_virtual/react-is.development.js +4 -0
  105. package/dist/esm/_virtual/react-is.development.js.map +1 -0
  106. package/dist/esm/_virtual/react-is.development2.js +4 -0
  107. package/dist/esm/_virtual/react-is.development2.js.map +1 -0
  108. package/dist/esm/_virtual/react-is.production.js +4 -0
  109. package/dist/esm/_virtual/react-is.production.js.map +1 -0
  110. package/dist/esm/_virtual/react-is.production.min.js +4 -0
  111. package/dist/esm/_virtual/react-is.production.min.js.map +1 -0
  112. package/dist/esm/components/hook-form/FormProvider.js +2 -2
  113. package/dist/esm/components/hook-form/FormProvider.js.map +1 -1
  114. package/dist/esm/form/ChildEventDialog.js +3 -3
  115. package/dist/esm/form/ChildEventDialog.js.map +1 -1
  116. package/dist/esm/form/ContactPerson.js +1 -1
  117. package/dist/esm/form/ContactPerson.js.map +1 -1
  118. package/dist/esm/form/PaymentOverviewBox.js +48 -62
  119. package/dist/esm/form/PaymentOverviewBox.js.map +1 -1
  120. package/dist/esm/form/PaymentOverviewDrawer.js +153 -0
  121. package/dist/esm/form/PaymentOverviewDrawer.js.map +1 -0
  122. package/dist/esm/form/ReleaseWithMerchandise.js +58 -49
  123. package/dist/esm/form/ReleaseWithMerchandise.js.map +1 -1
  124. package/dist/esm/form/Shipping.js +21 -18
  125. package/dist/esm/form/Shipping.js.map +1 -1
  126. package/dist/esm/form/TicketForm.js +96 -35
  127. package/dist/esm/form/TicketForm.js.map +1 -1
  128. package/dist/esm/form/TicketQuantityControl.js +47 -0
  129. package/dist/esm/form/TicketQuantityControl.js.map +1 -0
  130. package/dist/esm/form/TicketSelection.js +5 -6
  131. package/dist/esm/form/TicketSelection.js.map +1 -1
  132. package/dist/esm/form/TicketSelectionMobile.js +94 -0
  133. package/dist/esm/form/TicketSelectionMobile.js.map +1 -0
  134. package/dist/esm/form/TicketWithMerchandiseSelection.js +4 -6
  135. package/dist/esm/form/TicketWithMerchandiseSelection.js.map +1 -1
  136. package/dist/esm/form/index.js +1 -1
  137. package/dist/esm/form/index.js.map +1 -1
  138. package/dist/esm/form/merchandise/MerchandiseSelection.js +10 -0
  139. package/dist/esm/form/merchandise/MerchandiseSelection.js.map +1 -0
  140. package/dist/esm/form/merchandise/MerchandiseSlider.js +36 -0
  141. package/dist/esm/form/merchandise/MerchandiseSlider.js.map +1 -0
  142. package/dist/esm/form/merchendise/MerchandiseSelection.js +15 -0
  143. package/dist/esm/form/merchendise/MerchandiseSelection.js.map +1 -0
  144. package/dist/esm/form/merchendise/MerchandiseSlider.js +71 -0
  145. package/dist/esm/form/merchendise/MerchandiseSlider.js.map +1 -0
  146. package/dist/esm/form/payment/FeeBox.js +5 -17
  147. package/dist/esm/form/payment/FeeBox.js.map +1 -1
  148. package/dist/esm/form/payment/PaymentOverviewCheckbox.js +35 -30
  149. package/dist/esm/form/payment/PaymentOverviewCheckbox.js.map +1 -1
  150. package/dist/esm/form/product/ProductCard.js +140 -37
  151. package/dist/esm/form/product/ProductCard.js.map +1 -1
  152. package/dist/esm/form/product/ProductVariantsDialog.js +159 -98
  153. package/dist/esm/form/product/ProductVariantsDialog.js.map +1 -1
  154. package/dist/esm/form/services/index.js +129 -0
  155. package/dist/esm/form/services/index.js.map +1 -0
  156. package/dist/esm/form/style.js +7 -3
  157. package/dist/esm/form/style.js.map +1 -1
  158. package/dist/esm/form/tickets/ReleaseDescription.js +19 -0
  159. package/dist/esm/form/tickets/ReleaseDescription.js.map +1 -0
  160. package/dist/esm/form/tickets/ReleaseWithMerchandise.js +137 -0
  161. package/dist/esm/form/tickets/ReleaseWithMerchandise.js.map +1 -0
  162. package/dist/esm/form/tickets/TicketQuantityControl.js +48 -0
  163. package/dist/esm/form/tickets/TicketQuantityControl.js.map +1 -0
  164. package/dist/esm/form/tickets/TicketSelection.js +135 -0
  165. package/dist/esm/form/tickets/TicketSelection.js.map +1 -0
  166. package/dist/esm/form/tickets/TicketSelectionMap.js +69 -0
  167. package/dist/esm/form/tickets/TicketSelectionMap.js.map +1 -0
  168. package/dist/esm/form/tickets/TicketSelectionMobile.js +86 -0
  169. package/dist/esm/form/tickets/TicketSelectionMobile.js.map +1 -0
  170. package/dist/esm/form/tickets/TicketWithMerchandiseSelection.js +113 -0
  171. package/dist/esm/form/tickets/TicketWithMerchandiseSelection.js.map +1 -0
  172. package/dist/esm/hooks/useConsentScrollOnDrawerOpen.js +55 -0
  173. package/dist/esm/hooks/useConsentScrollOnDrawerOpen.js.map +1 -0
  174. package/dist/esm/hooks/useScrollToFirstError.js +60 -0
  175. package/dist/esm/hooks/useScrollToFirstError.js.map +1 -0
  176. package/dist/esm/locales/cs.js +18 -3
  177. package/dist/esm/locales/cs.js.map +1 -1
  178. package/dist/esm/locales/en.js +17 -2
  179. package/dist/esm/locales/en.js.map +1 -1
  180. package/dist/esm/locales/es.js +16 -1
  181. package/dist/esm/locales/es.js.map +1 -1
  182. package/dist/esm/locales/pl.js +16 -1
  183. package/dist/esm/locales/pl.js.map +1 -1
  184. package/dist/esm/locales/sk.js +17 -2
  185. package/dist/esm/locales/sk.js.map +1 -1
  186. package/dist/esm/locales/uk.js +16 -1
  187. package/dist/esm/locales/uk.js.map +1 -1
  188. package/dist/esm/utils/data/global.js +2 -1
  189. package/dist/esm/utils/data/global.js.map +1 -1
  190. package/dist/types/components/Image.d.ts +4 -4
  191. package/dist/types/form/PaymentOverviewDrawer.d.ts +8 -0
  192. package/dist/types/form/merchendise/MerchandiseSelection.d.ts +9 -0
  193. package/dist/types/form/merchendise/MerchandiseSlider.d.ts +10 -0
  194. package/dist/types/form/merchendise/MerchendiseSlider.d.ts +0 -0
  195. package/dist/types/form/style.d.ts +1 -1
  196. package/package.json +5 -1
  197. package/rollup.config.mjs +2 -0
  198. package/src/components/hook-form/FormProvider.tsx +5 -2
  199. package/src/form/ChildEventDialog.tsx +3 -3
  200. package/src/form/ContactPerson.tsx +1 -1
  201. package/src/form/PaymentOverviewBox.tsx +89 -122
  202. package/src/form/PaymentOverviewDrawer.tsx +238 -0
  203. package/src/form/Shipping.tsx +29 -17
  204. package/src/form/TicketForm.tsx +140 -39
  205. package/src/form/index.tsx +3 -1
  206. package/src/form/merchandise/MerchandiseSelection.tsx +24 -0
  207. package/src/form/merchandise/MerchandiseSlider.tsx +62 -0
  208. package/src/form/payment/FeeBox.tsx +4 -31
  209. package/src/form/payment/PaymentOverviewCheckbox.tsx +57 -56
  210. package/src/form/product/ProductCard.tsx +250 -59
  211. package/src/form/product/ProductVariantsDialog.tsx +253 -140
  212. package/src/form/services/index.tsx +263 -0
  213. package/src/form/style.ts +9 -3
  214. package/src/form/tickets/ReleaseDescription.tsx +46 -0
  215. package/src/form/tickets/ReleaseWithMerchandise.tsx +239 -0
  216. package/src/form/tickets/TicketQuantityControl.tsx +94 -0
  217. package/src/form/{TicketSelection.tsx → tickets/TicketSelection.tsx} +24 -128
  218. package/src/form/{TicketSelectionMap.tsx → tickets/TicketSelectionMap.tsx} +9 -1
  219. package/src/form/tickets/TicketSelectionMobile.tsx +177 -0
  220. package/src/form/{TicketWithMerchandiseSelection.tsx → tickets/TicketWithMerchandiseSelection.tsx} +3 -7
  221. package/src/hooks/useConsentScrollOnDrawerOpen.ts +73 -0
  222. package/src/hooks/useScrollToFirstError.ts +94 -0
  223. package/src/locales/cs.tsx +18 -3
  224. package/src/locales/en.tsx +17 -2
  225. package/src/locales/es.tsx +16 -1
  226. package/src/locales/pl.tsx +16 -1
  227. package/src/locales/sk.tsx +17 -2
  228. package/src/locales/uk.tsx +16 -1
  229. package/src/utils/data/global.ts +1 -0
  230. package/tsconfig.json +2 -1
  231. package/.claude/settings.local.json +0 -9
  232. package/src/form/MerchandiseSelection.tsx +0 -29
  233. package/src/form/ReleaseWithMerchandise.tsx +0 -230
@@ -1,6 +1,6 @@
1
1
  import React, { useCallback, useEffect, useMemo, useState } from 'react';
2
2
  import { Iconify, Image, TextIconLabel } from '@components';
3
- import { Box, Divider, Grid, IconButton, Stack, Typography } from '@mui/material';
3
+ import { Box, Divider, Grid, Stack, Typography } from '@mui/material';
4
4
  import PaymentOverviewCheckbox from '@form/payment/PaymentOverviewCheckbox.tsx';
5
5
  import locationIcon from '@iconify/icons-carbon/location';
6
6
  import { getPlaceAsString } from '@utils/place';
@@ -26,6 +26,7 @@ import { ICalculateShoppingCartDto, IShoppingCartDto } from '@utils/types/shoppi
26
26
  import { PromoCodeTypes } from '@utils/data/promo-code.ts';
27
27
  import useActiveEventProducts from '@hooks/data/useActiveEventProducts';
28
28
  import useDebounce from '@hooks/useDebounce';
29
+ import { EVENTLOOK_ORDER_FORM_ID } from '@utils/data/global.ts';
29
30
 
30
31
  interface Props {
31
32
  event: IEvent;
@@ -54,9 +55,9 @@ const PaymentOverviewBox: React.FC<Props> = ({ event }) => {
54
55
  totalFee,
55
56
  isPaymentVerify,
56
57
  ticketInsurance,
57
- ticketInsurancePricePerUnit,
58
58
  smsNotification,
59
59
  smsNotificationPrice,
60
+ ticketInsurancePricePerUnit,
60
61
  } = values;
61
62
  const tickets: Record<string, ITicketFormTicket[]> = useWatch({
62
63
  name: 'tickets',
@@ -385,29 +386,29 @@ const PaymentOverviewBox: React.FC<Props> = ({ event }) => {
385
386
  }
386
387
  }, []);
387
388
 
388
- const removeProduct = (variant: ISelectedProductVariant) => {
389
- const { eventId, variantId } = variant;
390
- const list = Array.isArray(products[eventId]) ? [...products[eventId]] : [];
389
+ // const removeProduct = (variant: ISelectedProductVariant) => {
390
+ // const { eventId, variantId } = variant;
391
+ // const list = Array.isArray(products[eventId]) ? [...products[eventId]] : [];
391
392
 
392
- const idx = list.findIndex((p) => Number(p.eventProductVariantId) === Number(variantId));
393
- if (idx === -1) return;
394
- const item = list[idx];
393
+ // const idx = list.findIndex((p) => Number(p.eventProductVariantId) === Number(variantId));
394
+ // if (idx === -1) return;
395
+ // const item = list[idx];
395
396
 
396
- if ((item.quantity ?? 0) <= 1) {
397
- list.splice(idx, 1);
398
- } else {
399
- list[idx] = { ...item, quantity: (item.quantity ?? 1) - 1 };
400
- }
397
+ // if ((item.quantity ?? 0) <= 1) {
398
+ // list.splice(idx, 1);
399
+ // } else {
400
+ // list[idx] = { ...item, quantity: (item.quantity ?? 1) - 1 };
401
+ // }
401
402
 
402
- const next = { ...products, [eventId]: list };
403
+ // const next = { ...products, [eventId]: list };
403
404
 
404
- if (list.length === 0) {
405
- const { [eventId]: _removed, ...rest } = next;
406
- setValue('products', rest);
407
- } else {
408
- setValue('products', next);
409
- }
410
- };
405
+ // if (list.length === 0) {
406
+ // const { [eventId]: _removed, ...rest } = next;
407
+ // setValue('products', rest);
408
+ // } else {
409
+ // setValue('products', next);
410
+ // }
411
+ // };
411
412
 
412
413
  return (
413
414
  <OverviewCard id="overview-card" stickyHeaderTop={options?.stickyHeaderTop || 0}>
@@ -446,7 +447,8 @@ const PaymentOverviewBox: React.FC<Props> = ({ event }) => {
446
447
  />
447
448
  }
448
449
  sx={{
449
- backgroundColor: (theme) => theme.palette.grey.A100,
450
+ backgroundColor: (theme) =>
451
+ theme.palette.mode === 'light' ? theme.palette.grey[100] : theme.palette.grey[900],
450
452
  borderRadius: 1,
451
453
  }}
452
454
  >
@@ -473,15 +475,49 @@ const PaymentOverviewBox: React.FC<Props> = ({ event }) => {
473
475
  </Stack>
474
476
  </Stack>
475
477
  )}
476
- <Stack className="overview-card__order-info" p={2} spacing={1}>
478
+ <Stack
479
+ className="overview-card__order-info"
480
+ p={2}
481
+ pt={{ xs: 0, sm: 2 }}
482
+ spacing={0.75}
483
+ useFlexGap
484
+ >
477
485
  {!!selectedTickets.length && !isMobile && <Divider sx={{ borderStyle: 'dashed' }} />}
486
+
487
+ {!!selectedTickets.length && (
488
+ <Stack spacing={0.5}>
489
+ {/* TODO: Uncomment this when Colonnade response - must update terms and conditions and email info */}
490
+ <PaymentOverviewCheckbox
491
+ checkboxName="ticketInsurance"
492
+ label={t('event.tickets.insurance.label')}
493
+ value={
494
+ <>
495
+ {ticketInsurance && totalItemCount.totalTickets > 0 ? '' : '+ '}
496
+ {fCurrency(ticketInsurancePricePerUnit, lang, event.currency)} /{' '}
497
+ {t('event.tickets.insurance.per_ticket')}
498
+ </>
499
+ }
500
+ />
501
+ <PaymentOverviewCheckbox
502
+ checkboxName="smsNotification"
503
+ label={t('event.tickets.sms_notification.label')}
504
+ value={
505
+ <>
506
+ {smsNotification && totalItemCount.totalTickets > 0 ? '' : '+ '}
507
+ {fCurrency(smsNotificationPrice, lang, event.currency)}
508
+ </>
509
+ }
510
+ />
511
+ <Divider sx={{ borderStyle: 'dashed' }} />
512
+ </Stack>
513
+ )}
478
514
  {selectedTickets.map((ticket, index) => (
479
515
  <Box key={index}>
480
516
  <Stack direction="row" justifyContent="space-between" alignItems="center" spacing={2}>
481
- <Typography variant="caption">
517
+ <Typography variant="body2">
482
518
  {ticket.quantity}x {ticket.itemName}
483
519
  </Typography>
484
- <Typography variant="caption">
520
+ <Typography variant="body2">
485
521
  {fCurrency(
486
522
  calculatePriceWithDiscount(
487
523
  ticket.price,
@@ -501,10 +537,10 @@ const PaymentOverviewBox: React.FC<Props> = ({ event }) => {
501
537
  alignItems="center"
502
538
  spacing={2}
503
539
  >
504
- <Typography variant="caption">
540
+ <Typography variant="body2">
505
541
  - {product.quantity}x {product.name}
506
542
  </Typography>
507
- <Typography variant="caption">
543
+ <Typography variant="body2">
508
544
  {product.price > 0
509
545
  ? fCurrency(
510
546
  calculatePriceWithDiscount(
@@ -526,118 +562,49 @@ const PaymentOverviewBox: React.FC<Props> = ({ event }) => {
526
562
  {selectedVariants.map((variant, index) => (
527
563
  <Box key={index}>
528
564
  <Stack direction="row" justifyContent="space-between" alignItems="center" spacing={2}>
529
- <Typography variant="caption">
565
+ <Typography variant="body2">
530
566
  {variant.quantity}x {variant.name}
531
567
  </Typography>
532
- <Stack direction="row" spacing={1} alignItems="center">
533
- <Typography variant="caption">
534
- {fCurrency(
535
- calculatePriceWithDiscount(
536
- variant.price,
537
- promoCodesValues.productDiscountPercent,
538
- promoCodesValues.fixedDevidedProducts
539
- ? promoCodesValues.fixedDevidedProducts * variant.quantity
540
- : 0
541
- ),
542
- lang,
543
- event.currency
544
- )}
545
- </Typography>
546
- <IconButton onClick={() => removeProduct(variant)} color="primary" size="small">
547
- <Iconify icon="carbon:trash-can" />
548
- </IconButton>
549
- </Stack>
568
+ <Typography variant="body2">
569
+ {fCurrency(
570
+ calculatePriceWithDiscount(
571
+ variant.price,
572
+ promoCodesValues.productDiscountPercent,
573
+ promoCodesValues.fixedDevidedProducts
574
+ ? promoCodesValues.fixedDevidedProducts * variant.quantity
575
+ : 0
576
+ ),
577
+ lang,
578
+ event.currency
579
+ )}
580
+ </Typography>
550
581
  </Stack>
551
582
  </Box>
552
583
  ))}
553
584
  {!!shippingFee && (
554
585
  <Stack direction="row" justifyContent="space-between" alignItems="center" spacing={2}>
555
- <Typography variant="caption">{t('form.labels.shipping_fee')}</Typography>
556
- <Typography variant="caption">
557
- {fCurrency(shippingFee, lang, event.currency)}
558
- </Typography>
559
- </Stack>
560
- )}
561
- {ticketInsurance && totalItemCount.totalTickets > 0 && (
562
- <Stack direction="row" justifyContent="space-between" alignItems="center" spacing={2}>
563
- <Typography variant="caption">{t('form.labels.ticket_insurance')}</Typography>
564
- <Typography variant="caption">
565
- {fCurrency(values.ticketInsurancePrice, lang, event.currency)}
566
- </Typography>
567
- </Stack>
568
- )}
569
- {smsNotification && totalItemCount.totalTickets > 0 && (
570
- <Stack direction="row" justifyContent="space-between" alignItems="center" spacing={2}>
571
- <Typography variant="caption">{t('form.labels.sms_notification')}</Typography>
572
- <Typography variant="caption">
573
- {fCurrency(values.smsNotificationPrice, lang, event.currency)}
574
- </Typography>
586
+ <Typography variant="body2">{t('form.labels.shipping_fee')}</Typography>
587
+ <Typography variant="body2">{fCurrency(shippingFee, lang, event.currency)}</Typography>
575
588
  </Stack>
576
589
  )}
577
590
  {!!total && !!totalFee && (
578
591
  <Stack direction="row" justifyContent="space-between" alignItems="center" spacing={2}>
579
- <Typography variant="caption">{t('form.labels.service_fee')}</Typography>
580
- <Typography variant="caption">{getFee}</Typography>
592
+ <Typography variant="body2">{t('form.labels.service_fee')}</Typography>
593
+ <Typography variant="body2">{getFee}</Typography>
581
594
  </Stack>
582
595
  )}
583
596
  {((!!selectedTickets.length && isMobile) || !isMobile) && (
584
597
  <Divider sx={{ borderStyle: 'dashed' }} />
585
598
  )}
586
- {!!selectedTickets.length && (
587
- <>
588
- {/* TODO: Uncomment this when Colonnade response - must update terms and conditions and email info */}
589
- {/*<PaymentOverviewCheckbox*/}
590
- {/* checkboxName="ticketInsurance"*/}
591
- {/* label={t('event.tickets.insurance.label')}*/}
592
- {/* value={*/}
593
- {/* <>*/}
594
- {/* + {fCurrency(ticketInsurancePricePerUnit, lang, event.currency)} /{' '}*/}
595
- {/* {t('event.tickets.insurance.per_ticket')}*/}
596
- {/* </>*/}
597
- {/* }*/}
598
- {/* modal={{*/}
599
- {/* title: t('event.tickets.insurance.label'),*/}
600
- {/* description: (*/}
601
- {/* <>*/}
602
- {/* <Typography variant="body2" paragraph>*/}
603
- {/* {t('event.tickets.insurance.modal.description')}*/}
604
- {/* </Typography>*/}
605
- {/* <Typography variant="body2" paragraph>*/}
606
- {/* {t('event.tickets.insurance.modal.coverage')}*/}
607
- {/* </Typography>*/}
608
- {/* <Typography variant="body2" sx={{ fontWeight: 600 }}>*/}
609
- {/* {t('event.tickets.insurance.modal.price')}:{' '}*/}
610
- {/* {fCurrency(ticketInsurancePricePerUnit, lang, event.currency)} /{' '}*/}
611
- {/* {t('event.tickets.insurance.per_ticket')}*/}
612
- {/* </Typography>*/}
613
- {/* </>*/}
614
- {/* ),*/}
615
- {/* }}*/}
616
- {/*/>*/}
617
- <PaymentOverviewCheckbox
618
- checkboxName="smsNotification"
619
- label={t('event.tickets.sms_notification.label')}
620
- value={<>+ {fCurrency(smsNotificationPrice, lang, event.currency)}</>}
621
- modal={{
622
- title: t('event.tickets.sms_notification.label'),
623
- description: (
624
- <>
625
- <Typography variant="body2" paragraph>
626
- {t('event.tickets.sms_notification.modal.description')}
627
- </Typography>
628
- <Typography variant="body2" sx={{ fontWeight: 600 }}>
629
- {t('event.tickets.sms_notification.modal.price')}:{' '}
630
- {fCurrency(smsNotificationPrice, lang, event.currency)}
631
- </Typography>
632
- </>
633
- ),
634
- }}
635
- />
636
- <Divider sx={{ borderStyle: 'dashed' }} />
637
- </>
638
- )}
639
599
  <FeeBox event={event} />
640
- <LoadingButton type="submit" variant="contained" size="large" fullWidth>
600
+ <LoadingButton
601
+ type="submit"
602
+ form={EVENTLOOK_ORDER_FORM_ID}
603
+ variant="contained"
604
+ size="large"
605
+ fullWidth
606
+ sx={{ height: { xs: 36, md: 40 } }}
607
+ >
641
608
  {t(isPaymentVerify ? 'verify' : 'buy')}
642
609
  </LoadingButton>
643
610
  </Stack>
@@ -0,0 +1,238 @@
1
+ import { Box, Button, SwipeableDrawer, Typography } from '@mui/material';
2
+ import React, { useEffect } from 'react';
3
+ import { useRef, useState } from 'react';
4
+ import PaymentOverviewBox from './PaymentOverviewBox';
5
+ import { IEvent } from '@utils/types/event.type';
6
+ import useGlobal from '@hooks/useGlobal';
7
+ import { fCurrency } from '@utils/formatNumber';
8
+ import { EVENTLOOK_ORDER_FORM_ID } from '@utils/data/global.ts';
9
+
10
+ interface Props {
11
+ event: IEvent;
12
+ totalPrice: number;
13
+ onOpenChange?: (open: boolean) => void;
14
+ }
15
+
16
+ const swipeAreaWidth = 56;
17
+
18
+ const PaymentOverviewDrawer: React.FC<Props> = ({ event, totalPrice, onOpenChange }) => {
19
+ const { t, lang } = useGlobal();
20
+ const [openDrawer, setOpenDrawer] = useState(false);
21
+ const touchStartYRef = useRef<number | null>(null);
22
+
23
+ const sentinelRef = useRef<HTMLDivElement>(null);
24
+ const prevYRef = useRef<number>(Number.POSITIVE_INFINITY);
25
+
26
+ // Opens drawer when scrolling down
27
+ useEffect(() => {
28
+ const sentinel = sentinelRef.current;
29
+ if (!sentinel) return;
30
+
31
+ const observer = new IntersectionObserver(
32
+ (entries) => {
33
+ entries.forEach((entry) => {
34
+ if (totalPrice <= 0) return;
35
+ const currentY = entry.boundingClientRect.y;
36
+ const isScrollingDown = currentY < prevYRef.current;
37
+
38
+ if (entry.isIntersecting && isScrollingDown) {
39
+ openDrawerHandler();
40
+ }
41
+
42
+ prevYRef.current = currentY;
43
+ });
44
+ },
45
+ {
46
+ threshold: 0,
47
+ rootMargin: '0px 0px 0px 0px',
48
+ }
49
+ );
50
+
51
+ observer.observe(sentinel);
52
+
53
+ return () => {
54
+ observer.unobserve(sentinel);
55
+ };
56
+ }, [totalPrice]);
57
+
58
+ const toggleDrawer = () => {
59
+ setOpenDrawer((prev) => {
60
+ const next = !prev;
61
+ onOpenChange?.(next);
62
+ return next;
63
+ });
64
+ };
65
+
66
+ const openDrawerHandler = () => {
67
+ setOpenDrawer(true);
68
+ onOpenChange?.(true);
69
+ };
70
+
71
+ const closeDrawerHandler = () => {
72
+ setOpenDrawer(false);
73
+ onOpenChange?.(false);
74
+ };
75
+
76
+ const handleClosedTabTouchStart = (event: React.TouchEvent<HTMLDivElement>) => {
77
+ touchStartYRef.current = event.touches[0]?.clientY ?? null;
78
+ };
79
+
80
+ const handleClosedTabTouchEnd = (event: React.TouchEvent<HTMLDivElement>) => {
81
+ const startY = touchStartYRef.current;
82
+ const endY = event.changedTouches[0]?.clientY;
83
+
84
+ if (startY === null || typeof endY !== 'number') {
85
+ touchStartYRef.current = null;
86
+ return;
87
+ }
88
+
89
+ const swipeDistance = startY - endY;
90
+ if (swipeDistance > 24) {
91
+ openDrawerHandler();
92
+ }
93
+
94
+ touchStartYRef.current = null;
95
+ };
96
+
97
+ return (
98
+ <Box sx={{ display: { md: 'none' } }}>
99
+ {/* Sentinel element for intersection observer */}
100
+ <Box ref={sentinelRef} sx={{ height: 1, visibility: 'hidden' }} />
101
+
102
+ {/* Drawer Tab */}
103
+ {!openDrawer && (
104
+ <Box
105
+ onTouchStart={handleClosedTabTouchStart}
106
+ onTouchEnd={handleClosedTabTouchEnd}
107
+ sx={{
108
+ position: 'fixed',
109
+ bottom: 0,
110
+ left: 0,
111
+ right: 0,
112
+ backgroundColor: (theme) => theme.palette.background.paper,
113
+ borderTopLeftRadius: 16,
114
+ borderTopRightRadius: 16,
115
+ boxShadow: '0 -8px 10px 2px rgba(0,0,0,0.2)',
116
+ zIndex: 1300,
117
+ }}
118
+ >
119
+ <Box
120
+ role="button"
121
+ aria-label={t('form.labels.payment_overview_open')}
122
+ onClick={toggleDrawer}
123
+ sx={{
124
+ display: 'flex',
125
+ justifyContent: 'center',
126
+ alignItems: 'center',
127
+ cursor: 'pointer',
128
+ width: '100%',
129
+ py: 1,
130
+ }}
131
+ >
132
+ <Box
133
+ sx={{
134
+ width: 30,
135
+ height: 6,
136
+ backgroundColor: (theme) => theme.palette.grey[300],
137
+ borderRadius: 3,
138
+ }}
139
+ />
140
+ </Box>
141
+ <Box
142
+ sx={{
143
+ width: '100%',
144
+ px: 2,
145
+ pb: 2,
146
+ }}
147
+ >
148
+ <Typography
149
+ sx={{
150
+ fontWeight: 'bold',
151
+ display: 'flex',
152
+ justifyContent: 'space-between',
153
+ alignItems: 'center',
154
+ }}
155
+ >
156
+ <span>{t('form.labels.total')}:</span>
157
+ <span>{fCurrency(totalPrice, lang, event.currency)}</span>
158
+ </Typography>
159
+
160
+ <Button
161
+ type="submit"
162
+ form={EVENTLOOK_ORDER_FORM_ID}
163
+ variant="contained"
164
+ size="large"
165
+ fullWidth
166
+ sx={{ mt: 1, height: { xs: 36, md: 40 } }}
167
+ >
168
+ {t('buy')}
169
+ </Button>
170
+ </Box>
171
+ </Box>
172
+ )}
173
+
174
+ {/* Drawer Content */}
175
+ <SwipeableDrawer
176
+ anchor="bottom"
177
+ open={openDrawer}
178
+ onClose={closeDrawerHandler}
179
+ onOpen={openDrawerHandler}
180
+ swipeAreaWidth={swipeAreaWidth}
181
+ disableSwipeToOpen={false}
182
+ keepMounted
183
+ sx={{ display: { md: 'none' } }}
184
+ ModalProps={{
185
+ disableScrollLock: true,
186
+ keepMounted: false,
187
+ BackdropProps: {
188
+ sx: { background: 'rgba(0,0,0,0)' },
189
+ onClick: (event: React.MouseEvent<HTMLDivElement>) => {
190
+ event.stopPropagation();
191
+ },
192
+ },
193
+ }}
194
+ PaperProps={{
195
+ sx: {
196
+ borderTopLeftRadius: 16,
197
+ borderTopRightRadius: 16,
198
+ boxShadow: '0 -8px 10px 2px rgba(0,0,0,0.2)',
199
+ overflow: 'hidden',
200
+ },
201
+ }}
202
+ >
203
+ <Box
204
+ role="button"
205
+ aria-label={t('form.labels.payment_overview_close')}
206
+ onClick={toggleDrawer}
207
+ sx={{
208
+ display: 'flex',
209
+ justifyContent: 'center',
210
+ alignItems: 'center',
211
+ backgroundColor: (theme) => theme.palette.background.paper,
212
+ cursor: 'pointer',
213
+ py: 1,
214
+ }}
215
+ >
216
+ <Box
217
+ sx={{
218
+ width: 30,
219
+ height: 6,
220
+ backgroundColor: (theme) => theme.palette.grey[300],
221
+ borderRadius: 3,
222
+ }}
223
+ />
224
+ </Box>
225
+ <Box
226
+ sx={{
227
+ height: '100%',
228
+ overflow: 'auto',
229
+ }}
230
+ >
231
+ <PaymentOverviewBox event={event} />
232
+ </Box>
233
+ </SwipeableDrawer>
234
+ </Box>
235
+ );
236
+ };
237
+
238
+ export default PaymentOverviewDrawer;
@@ -46,7 +46,6 @@ const Shipping: React.FC<Props> = ({ event }) => {
46
46
  [products]
47
47
  );
48
48
  const shippingMethodId = watch('shipping.shippingMethodId');
49
- const branchId = watch('shipping.branchId');
50
49
  const [displayBranchName, setDisplayBranchName] = useState<string | null>(null);
51
50
  const [firstRender, setFirstRender] = useState<boolean>(true);
52
51
  const filteredShippingMethods = useMemo(
@@ -83,9 +82,21 @@ const Shipping: React.FC<Props> = ({ event }) => {
83
82
  }
84
83
  };
85
84
 
85
+ const openPacketaWidget = () => {
86
+ const interval = setInterval(() => {
87
+ if (window.Packeta && window.Packeta.Widget) {
88
+ clearInterval(interval);
89
+ window.Packeta.Widget.pick(options?.packetaApiKey, onSelectBranch, {
90
+ language: lang,
91
+ });
92
+ }
93
+ }, 100);
94
+ };
95
+
86
96
  const handleChangeBranch = () => {
87
97
  setValue('shipping.branchId', null);
88
98
  setDisplayBranchName(null);
99
+ openPacketaWidget();
89
100
  };
90
101
 
91
102
  useEffect(() => {
@@ -103,25 +114,14 @@ const Shipping: React.FC<Props> = ({ event }) => {
103
114
  if (selectedShippingMethod) {
104
115
  setValue('shipping.price', selectedShippingMethod.price);
105
116
 
106
- if (selectedShippingMethod.type === ShippingTypes.PACKETA) {
107
- if (!branchId) {
108
- const interval = setInterval(() => {
109
- if (window.Packeta && window.Packeta.Widget) {
110
- clearInterval(interval);
111
- window.Packeta.Widget.pick(options?.packetaApiKey, onSelectBranch, {
112
- language: lang,
113
- });
114
- }
115
- }, 100);
116
- }
117
- } else {
117
+ if (selectedShippingMethod.type !== ShippingTypes.PACKETA) {
118
118
  setValue('shipping.branchId', null);
119
119
  setDisplayBranchName(null);
120
120
  }
121
121
  } else {
122
122
  setValue('shipping.price', 0);
123
123
  }
124
- }, [shippingMethodId, shippingMethods, branchId]);
124
+ }, [shippingMethodId, shippingMethods]);
125
125
 
126
126
  return (
127
127
  <>
@@ -142,11 +142,24 @@ const Shipping: React.FC<Props> = ({ event }) => {
142
142
  control={control}
143
143
  render={({ field, fieldState: { error } }) => (
144
144
  <FormControl component="fieldset" sx={{ width: '100%' }}>
145
- <RadioGroup {...field}>
145
+ <RadioGroup
146
+ {...field}
147
+ onChange={(event, value) => {
148
+ field.onChange(event);
149
+ const selectedShippingMethod = filteredShippingMethods.find(
150
+ (method) => method.id === Number(value)
151
+ );
152
+
153
+ if (selectedShippingMethod?.type === ShippingTypes.PACKETA) {
154
+ openPacketaWidget();
155
+ }
156
+ }}
157
+ >
146
158
  {filteredShippingMethods.map((shippingMethod) => (
147
159
  <ShippingMethodItem
148
160
  key={shippingMethod.id}
149
161
  active={Number(shippingMethodId) === shippingMethod.id}
162
+ hasError={!!error}
150
163
  >
151
164
  <FormControlLabel
152
165
  value={shippingMethod.id}
@@ -178,8 +191,7 @@ const Shipping: React.FC<Props> = ({ event }) => {
178
191
  {paymentImages[shippingMethod.type]}
179
192
  </Stack>
180
193
  {shippingMethod.type === ShippingTypes.PACKETA &&
181
- shippingMethod.id === Number(shippingMethodId) &&
182
- branchId && (
194
+ shippingMethod.id === Number(shippingMethodId) && (
183
195
  <Box>
184
196
  <Button
185
197
  onClick={handleChangeBranch}