tf-checkout-react 1.7.31 → 2.0.0-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 (454) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +141 -1033
  3. package/dist/checkout.css +17 -0
  4. package/dist/index.d.mts +3946 -0
  5. package/dist/index.d.ts +3946 -30
  6. package/dist/index.esm.js +9176 -0
  7. package/dist/index.esm.js.map +1 -0
  8. package/dist/index.js +9330 -6
  9. package/dist/index.js.map +1 -0
  10. package/dist/styles/addons.css +75 -0
  11. package/dist/styles/auth.css +294 -0
  12. package/dist/styles/billing.css +98 -0
  13. package/dist/styles/confirmation.css +51 -0
  14. package/dist/styles/foundation.css +146 -0
  15. package/dist/styles/payment.css +179 -0
  16. package/dist/styles/primitives.css +356 -0
  17. package/dist/styles/seat-map.css +46 -0
  18. package/dist/styles/tickets.css +285 -0
  19. package/dist/styles/verification-confirmation.css +258 -0
  20. package/package.json +93 -78
  21. package/src/.d.ts +1 -1
  22. package/src/CardInput.tsx +374 -0
  23. package/src/EmbeddedCheckout.tsx +400 -0
  24. package/src/ResumedCheckout.tsx +132 -0
  25. package/src/auth/AuthModal.tsx +238 -0
  26. package/src/auth/ForgotPasswordForm.tsx +93 -0
  27. package/src/auth/LoginForm.tsx +104 -0
  28. package/src/auth/PasswordInput.tsx +33 -0
  29. package/src/auth/RegisterForm.tsx +333 -0
  30. package/src/auth/ResetPasswordForm.tsx +112 -0
  31. package/src/auth/index.ts +5 -0
  32. package/src/checkout.css +17 -0
  33. package/src/configure.ts +29 -0
  34. package/src/confirmer.ts +439 -0
  35. package/src/index.ts +41 -30
  36. package/src/instance.ts +21 -0
  37. package/src/sections/AddOns.tsx +241 -0
  38. package/src/sections/BillingInfo.tsx +790 -0
  39. package/src/sections/Confirmation.tsx +146 -0
  40. package/src/sections/IDVerification.tsx +76 -0
  41. package/src/sections/OrderConfirmation.tsx +277 -0
  42. package/src/sections/OrderIDVerification.tsx +117 -0
  43. package/src/sections/OrderSummary.tsx +84 -0
  44. package/src/sections/Payment.tsx +557 -0
  45. package/src/sections/SeatMap.tsx +512 -0
  46. package/src/sections/Tickets.tsx +573 -0
  47. package/src/sections/billing/BillingAddressFields.tsx +138 -0
  48. package/src/sections/billing/BuyerField.tsx +75 -0
  49. package/src/sections/billing/TicketHoldersCard.tsx +124 -0
  50. package/src/sections/billing/fieldRules.ts +43 -0
  51. package/src/sections/billing/types.ts +10 -0
  52. package/src/sections/index.ts +15 -0
  53. package/src/sections/seatMap.utils.ts +105 -0
  54. package/src/styles/addons.css +75 -0
  55. package/src/styles/auth.css +294 -0
  56. package/src/styles/billing.css +98 -0
  57. package/src/styles/confirmation.css +51 -0
  58. package/src/styles/foundation.css +146 -0
  59. package/src/styles/payment.css +179 -0
  60. package/src/styles/primitives.css +356 -0
  61. package/src/styles/seat-map.css +46 -0
  62. package/src/styles/tickets.css +285 -0
  63. package/src/styles/verification-confirmation.css +258 -0
  64. package/src/typings.d.ts +2 -2
  65. package/src/ui/Button.tsx +38 -0
  66. package/src/ui/Card.tsx +54 -0
  67. package/src/ui/CheckoutProvider.tsx +172 -0
  68. package/src/ui/CustomFields.tsx +195 -0
  69. package/src/ui/Field.tsx +114 -0
  70. package/src/ui/I18nProvider.tsx +36 -0
  71. package/src/ui/InstallmentPicker.tsx +69 -0
  72. package/src/ui/Loader.tsx +12 -0
  73. package/src/ui/PaymentMethods.tsx +133 -0
  74. package/src/ui/PriceLine.tsx +24 -0
  75. package/src/ui/QuantitySelect.tsx +50 -0
  76. package/src/ui/Stepper.tsx +36 -0
  77. package/src/ui/Timer.tsx +34 -0
  78. package/src/ui/TimerBanner.tsx +55 -0
  79. package/src/ui/cx.ts +3 -0
  80. package/src/ui/index.ts +54 -0
  81. package/src/ui/theme.ts +83 -0
  82. package/src/useCheckout.ts +35 -0
  83. package/src/xendit.ts +438 -0
  84. package/dist/adapters/customFields.d.ts +0 -12
  85. package/dist/adapters/index.d.ts +0 -1
  86. package/dist/api/auth.d.ts +0 -27
  87. package/dist/api/cart.d.ts +0 -2
  88. package/dist/api/checkout.d.ts +0 -3
  89. package/dist/api/common.d.ts +0 -11
  90. package/dist/api/guestTicketDelegation.d.ts +0 -47
  91. package/dist/api/index.d.ts +0 -82
  92. package/dist/api/interceptors.d.ts +0 -1
  93. package/dist/api/orders.d.ts +0 -2
  94. package/dist/api/payment.d.ts +0 -5
  95. package/dist/api/preRegistrationComplete.d.ts +0 -3
  96. package/dist/api/publicRequest.d.ts +0 -9
  97. package/dist/api/resale.d.ts +0 -5
  98. package/dist/components/account-settings/index.d.ts +0 -3
  99. package/dist/components/addonsContainer/AddonComponent.d.ts +0 -18
  100. package/dist/components/addonsContainer/SimpleAddonsContainer.d.ts +0 -20
  101. package/dist/components/addonsContainer/adapters/index.d.ts +0 -12
  102. package/dist/components/addonsContainer/index.d.ts +0 -22
  103. package/dist/components/addonsContainer/normalizers/index.d.ts +0 -1
  104. package/dist/components/addonsContainer/useAddons.d.ts +0 -23
  105. package/dist/components/addonsContainer/utils/index.d.ts +0 -16
  106. package/dist/components/billing-info-container/hooks/index.d.ts +0 -3
  107. package/dist/components/billing-info-container/hooks/usePaymentContext.d.ts +0 -5
  108. package/dist/components/billing-info-container/hooks/usePaymentRedirect.d.ts +0 -14
  109. package/dist/components/billing-info-container/hooks/useStripePayment.d.ts +0 -18
  110. package/dist/components/billing-info-container/index.d.ts +0 -69
  111. package/dist/components/billing-info-container/utils.d.ts +0 -59
  112. package/dist/components/common/Checkbox.d.ts +0 -11
  113. package/dist/components/common/CheckboxField/index.d.ts +0 -9
  114. package/dist/components/common/CopyField.d.ts +0 -12
  115. package/dist/components/common/CopyMessageModal.d.ts +0 -7
  116. package/dist/components/common/CustomField.d.ts +0 -26
  117. package/dist/components/common/DatePickerField.d.ts +0 -20
  118. package/dist/components/common/FieldSection/index.d.ts +0 -19
  119. package/dist/components/common/FieldSection/utils/index.d.ts +0 -8
  120. package/dist/components/common/FormikPhoneNumberField.d.ts +0 -11
  121. package/dist/components/common/Loader.d.ts +0 -2
  122. package/dist/components/common/ModalComponent/index.d.ts +0 -16
  123. package/dist/components/common/NativeSelectFeild/index.d.ts +0 -21
  124. package/dist/components/common/PhoneNumberField.d.ts +0 -14
  125. package/dist/components/common/PoweredBy.d.ts +0 -2
  126. package/dist/components/common/RadioField.d.ts +0 -11
  127. package/dist/components/common/RadioGroupField/index.d.ts +0 -17
  128. package/dist/components/common/RedirectModal.d.ts +0 -7
  129. package/dist/components/common/SelectField/index.d.ts +0 -19
  130. package/dist/components/common/SnackbarAlert.d.ts +0 -13
  131. package/dist/components/common/index.d.ts +0 -11
  132. package/dist/components/common/socials.d.ts +0 -10
  133. package/dist/components/confirmModal/index.d.ts +0 -10
  134. package/dist/components/confirmationContainer/config.d.ts +0 -1
  135. package/dist/components/confirmationContainer/index.d.ts +0 -46
  136. package/dist/components/confirmationContainer/social-buttons.d.ts +0 -16
  137. package/dist/components/countdown/index.d.ts +0 -14
  138. package/dist/components/delegationsContainer/IssueComponent.d.ts +0 -10
  139. package/dist/components/delegationsContainer/IssueTicketForm.d.ts +0 -9
  140. package/dist/components/delegationsContainer/TicketsAssignedTable.d.ts +0 -11
  141. package/dist/components/delegationsContainer/TicketsAvailableTable.d.ts +0 -11
  142. package/dist/components/delegationsContainer/index.d.ts +0 -10
  143. package/dist/components/forgotPasswordModal/index.d.ts +0 -12
  144. package/dist/components/idVerificationContainer/VerificationPendingModal.d.ts +0 -10
  145. package/dist/components/idVerificationContainer/constants.d.ts +0 -21
  146. package/dist/components/idVerificationContainer/index.d.ts +0 -16
  147. package/dist/components/index.d.ts +0 -12
  148. package/dist/components/loginForm/index.d.ts +0 -31
  149. package/dist/components/loginModal/SignUpForm.d.ts +0 -10
  150. package/dist/components/loginModal/constants.d.ts +0 -39
  151. package/dist/components/loginModal/index.d.ts +0 -22
  152. package/dist/components/myTicketsContainer/index.d.ts +0 -16
  153. package/dist/components/myTicketsContainer/row.d.ts +0 -3
  154. package/dist/components/myTicketsContainer/tableConfig.d.ts +0 -5
  155. package/dist/components/orderDetailsContainer/CustomFieldsForm.d.ts +0 -12
  156. package/dist/components/orderDetailsContainer/TicketHolderCustomFields.d.ts +0 -10
  157. package/dist/components/orderDetailsContainer/index.d.ts +0 -66
  158. package/dist/components/orderDetailsContainer/ticketsTable.d.ts +0 -46
  159. package/dist/components/orderDetailsContainer/utils/index.d.ts +0 -6
  160. package/dist/components/paymentContainer/OrderDetails.d.ts +0 -9
  161. package/dist/components/paymentContainer/PaymentPlanSection.d.ts +0 -10
  162. package/dist/components/paymentContainer/handlePayment.d.ts +0 -15
  163. package/dist/components/paymentContainer/index.d.ts +0 -39
  164. package/dist/components/preRegistration/FieldsSection.d.ts +0 -19
  165. package/dist/components/preRegistration/Influancers.d.ts +0 -2
  166. package/dist/components/preRegistration/PreRegistrationComplete.d.ts +0 -13
  167. package/dist/components/preRegistration/PreRegistrationInformations.d.ts +0 -2
  168. package/dist/components/preRegistration/Prewards.d.ts +0 -2
  169. package/dist/components/preRegistration/ShareOptions.d.ts +0 -2
  170. package/dist/components/preRegistration/constants.d.ts +0 -2
  171. package/dist/components/preRegistration/index.d.ts +0 -23
  172. package/dist/components/preRegistration/utils.d.ts +0 -12
  173. package/dist/components/registerForm/adapters/index.d.ts +0 -4
  174. package/dist/components/registerForm/constants.d.ts +0 -1
  175. package/dist/components/registerForm/index.d.ts +0 -16
  176. package/dist/components/registerModal/index.d.ts +0 -12
  177. package/dist/components/resetPasswordContainer/index.d.ts +0 -10
  178. package/dist/components/rsvpContainer/index.d.ts +0 -7
  179. package/dist/components/seatMapContainer/SeatMapComponent.d.ts +0 -8
  180. package/dist/components/seatMapContainer/TicketsSection.d.ts +0 -9
  181. package/dist/components/seatMapContainer/addToCart.d.ts +0 -14
  182. package/dist/components/seatMapContainer/index.d.ts +0 -2
  183. package/dist/components/seatMapContainer/utils.d.ts +0 -6
  184. package/dist/components/signupModal/index.d.ts +0 -12
  185. package/dist/components/ticketResale/index.d.ts +0 -12
  186. package/dist/components/ticketResaleModal/index.d.ts +0 -19
  187. package/dist/components/ticketsContainer/AccessCodeSection.d.ts +0 -7
  188. package/dist/components/ticketsContainer/InfoIcon.d.ts +0 -5
  189. package/dist/components/ticketsContainer/PromoCodeSection.d.ts +0 -15
  190. package/dist/components/ticketsContainer/ReferralLogic.d.ts +0 -5
  191. package/dist/components/ticketsContainer/TicketRow.d.ts +0 -13
  192. package/dist/components/ticketsContainer/TicketsSection.d.ts +0 -20
  193. package/dist/components/ticketsContainer/TimeSlotTicketRow.d.ts +0 -19
  194. package/dist/components/ticketsContainer/TimeSlotsSection.d.ts +0 -25
  195. package/dist/components/ticketsContainer/index.d.ts +0 -93
  196. package/dist/components/ticketsContainer/utils.d.ts +0 -13
  197. package/dist/components/timerWidget/index.d.ts +0 -16
  198. package/dist/components/waitingList/index.d.ts +0 -9
  199. package/dist/constants/index.d.ts +0 -7
  200. package/dist/env.d.ts +0 -16
  201. package/dist/hoc/CustomFields/index.d.ts +0 -3
  202. package/dist/hoc/index.d.ts +0 -1
  203. package/dist/hooks/index.d.ts +0 -1
  204. package/dist/hooks/useCookieListener.d.ts +0 -1
  205. package/dist/hooks/useEventListener.d.ts +0 -1
  206. package/dist/hooks/useLocalStorageListener.d.ts +0 -1
  207. package/dist/hooks/useOnline.d.ts +0 -1
  208. package/dist/hooks/usePixel.d.ts +0 -6
  209. package/dist/images/Polygon.png +0 -0
  210. package/dist/images/cross.svg +0 -44
  211. package/dist/images/done.svg +0 -3
  212. package/dist/images/edit.svg +0 -10
  213. package/dist/images/email.svg +0 -1
  214. package/dist/images/instagram.svg +0 -5
  215. package/dist/images/logo-ttf.png +0 -0
  216. package/dist/images/spotify.svg +0 -6
  217. package/dist/images/user.svg +0 -1
  218. package/dist/images/xmark.svg +0 -92
  219. package/dist/normalizers/index.d.ts +0 -4
  220. package/dist/tf-checkout-react.cjs.development.js +0 -16149
  221. package/dist/tf-checkout-react.cjs.development.js.map +0 -1
  222. package/dist/tf-checkout-react.cjs.production.min.js +0 -2
  223. package/dist/tf-checkout-react.cjs.production.min.js.map +0 -1
  224. package/dist/tf-checkout-react.esm.js +0 -16116
  225. package/dist/tf-checkout-react.esm.js.map +0 -1
  226. package/dist/tf-checkout-styles.css +0 -1
  227. package/dist/types/add_on.d.ts +0 -8
  228. package/dist/types/billing-info-data.d.ts +0 -27
  229. package/dist/types/checkoutPageConfigs.d.ts +0 -13
  230. package/dist/types/index.d.ts +0 -6
  231. package/dist/types/order-data.d.ts +0 -15
  232. package/dist/types/payment-field.d.ts +0 -6
  233. package/dist/types/payment-plan-configuration.d.ts +0 -18
  234. package/dist/types/referral-promotion.d.ts +0 -6
  235. package/dist/types/verification.d.ts +0 -12
  236. package/dist/utils/adaptStripeErrors.d.ts +0 -8
  237. package/dist/utils/auth.d.ts +0 -21
  238. package/dist/utils/cookies.d.ts +0 -3
  239. package/dist/utils/createCheckoutDataBodyWithDefaultHolder.d.ts +0 -23
  240. package/dist/utils/createMarkup.d.ts +0 -3
  241. package/dist/utils/customFields.d.ts +0 -35
  242. package/dist/utils/downloadPDF.d.ts +0 -1
  243. package/dist/utils/form.d.ts +0 -3
  244. package/dist/utils/formikErrorFocus.d.ts +0 -2
  245. package/dist/utils/getDomain.d.ts +0 -1
  246. package/dist/utils/getImage.d.ts +0 -1
  247. package/dist/utils/getQueryVariable.d.ts +0 -1
  248. package/dist/utils/htmlNodeFromString.d.ts +0 -1
  249. package/dist/utils/index.d.ts +0 -15
  250. package/dist/utils/isBrowser.d.ts +0 -1
  251. package/dist/utils/isValidNumber.d.ts +0 -1
  252. package/dist/utils/jsonUtils.d.ts +0 -1
  253. package/dist/utils/replaceVarInString.d.ts +0 -1
  254. package/dist/utils/setConfigs.d.ts +0 -11
  255. package/dist/utils/showZero.d.ts +0 -1
  256. package/dist/validators/index.d.ts +0 -8
  257. package/src/adapters/customFields.ts +0 -85
  258. package/src/adapters/index.ts +0 -1
  259. package/src/api/auth.ts +0 -88
  260. package/src/api/cart.ts +0 -28
  261. package/src/api/checkout.ts +0 -28
  262. package/src/api/common.ts +0 -190
  263. package/src/api/guestTicketDelegation.ts +0 -79
  264. package/src/api/index.ts +0 -346
  265. package/src/api/interceptors.ts +0 -77
  266. package/src/api/orders.ts +0 -30
  267. package/src/api/payment.ts +0 -77
  268. package/src/api/preRegistrationComplete.ts +0 -37
  269. package/src/api/publicRequest.ts +0 -47
  270. package/src/api/resale.ts +0 -28
  271. package/src/assets/images/Polygon.png +0 -0
  272. package/src/assets/images/cross.svg +0 -44
  273. package/src/assets/images/done.svg +0 -3
  274. package/src/assets/images/edit.svg +0 -10
  275. package/src/assets/images/email.svg +0 -1
  276. package/src/assets/images/instagram.svg +0 -5
  277. package/src/assets/images/logo-ttf.png +0 -0
  278. package/src/assets/images/spotify.svg +0 -6
  279. package/src/assets/images/user.svg +0 -1
  280. package/src/assets/images/xmark.svg +0 -92
  281. package/src/components/account-settings/index.tsx +0 -161
  282. package/src/components/account-settings/style.css +0 -200
  283. package/src/components/addonsContainer/AddonComponent.tsx +0 -204
  284. package/src/components/addonsContainer/SimpleAddonsContainer.tsx +0 -459
  285. package/src/components/addonsContainer/adapters/index.tsx +0 -62
  286. package/src/components/addonsContainer/index.tsx +0 -353
  287. package/src/components/addonsContainer/normalizers/index.ts +0 -5
  288. package/src/components/addonsContainer/useAddons.ts +0 -248
  289. package/src/components/addonsContainer/utils/index.tsx +0 -231
  290. package/src/components/billing-info-container/hooks/index.ts +0 -3
  291. package/src/components/billing-info-container/hooks/usePaymentContext.ts +0 -22
  292. package/src/components/billing-info-container/hooks/usePaymentRedirect.ts +0 -145
  293. package/src/components/billing-info-container/hooks/useStripePayment.ts +0 -119
  294. package/src/components/billing-info-container/index.tsx +0 -1695
  295. package/src/components/billing-info-container/style.css +0 -150
  296. package/src/components/billing-info-container/utils.tsx +0 -413
  297. package/src/components/common/Checkbox.tsx +0 -51
  298. package/src/components/common/CheckboxField/index.tsx +0 -41
  299. package/src/components/common/CopyField.tsx +0 -53
  300. package/src/components/common/CopyMessageModal.tsx +0 -34
  301. package/src/components/common/CustomField.tsx +0 -168
  302. package/src/components/common/DatePickerField.tsx +0 -126
  303. package/src/components/common/FieldSection/index.tsx +0 -141
  304. package/src/components/common/FieldSection/utils/index.tsx +0 -92
  305. package/src/components/common/FormikPhoneNumberField.tsx +0 -51
  306. package/src/components/common/Loader.tsx +0 -8
  307. package/src/components/common/ModalComponent/index.tsx +0 -68
  308. package/src/components/common/NativeSelectFeild/index.tsx +0 -86
  309. package/src/components/common/PhoneNumberField.tsx +0 -117
  310. package/src/components/common/PoweredBy.tsx +0 -15
  311. package/src/components/common/RadioField.tsx +0 -36
  312. package/src/components/common/RadioGroupField/index.tsx +0 -76
  313. package/src/components/common/RedirectModal.tsx +0 -43
  314. package/src/components/common/SelectField/index.tsx +0 -104
  315. package/src/components/common/SnackbarAlert.tsx +0 -52
  316. package/src/components/common/index.tsx +0 -11
  317. package/src/components/common/socials.tsx +0 -33
  318. package/src/components/confirmModal/index.tsx +0 -60
  319. package/src/components/confirmationContainer/config.ts +0 -79
  320. package/src/components/confirmationContainer/index.tsx +0 -349
  321. package/src/components/confirmationContainer/social-buttons.tsx +0 -149
  322. package/src/components/confirmationContainer/style.css +0 -206
  323. package/src/components/countdown/index.tsx +0 -100
  324. package/src/components/countdown/style.css +0 -10
  325. package/src/components/delegationsContainer/IssueComponent.tsx +0 -156
  326. package/src/components/delegationsContainer/IssueTicketForm.tsx +0 -109
  327. package/src/components/delegationsContainer/TicketsAssignedTable.tsx +0 -55
  328. package/src/components/delegationsContainer/TicketsAvailableTable.tsx +0 -54
  329. package/src/components/delegationsContainer/index.tsx +0 -83
  330. package/src/components/forgotPasswordModal/index.tsx +0 -138
  331. package/src/components/forgotPasswordModal/style.css +0 -47
  332. package/src/components/idVerificationContainer/VerificationPendingModal.tsx +0 -47
  333. package/src/components/idVerificationContainer/constants.ts +0 -27
  334. package/src/components/idVerificationContainer/index.tsx +0 -323
  335. package/src/components/index.ts +0 -12
  336. package/src/components/loginForm/index.tsx +0 -202
  337. package/src/components/loginModal/SignUpForm.tsx +0 -329
  338. package/src/components/loginModal/constants.ts +0 -46
  339. package/src/components/loginModal/index.tsx +0 -263
  340. package/src/components/loginModal/style.css +0 -116
  341. package/src/components/myTicketsContainer/index.tsx +0 -228
  342. package/src/components/myTicketsContainer/row.tsx +0 -46
  343. package/src/components/myTicketsContainer/style.css +0 -40
  344. package/src/components/myTicketsContainer/tableConfig.tsx +0 -80
  345. package/src/components/myTicketsContainer/types.d.ts +0 -41
  346. package/src/components/orderDetailsContainer/CustomFieldsForm.tsx +0 -75
  347. package/src/components/orderDetailsContainer/TicketHolderCustomFields.tsx +0 -100
  348. package/src/components/orderDetailsContainer/index.tsx +0 -586
  349. package/src/components/orderDetailsContainer/style.css +0 -77
  350. package/src/components/orderDetailsContainer/ticketsTable.tsx +0 -246
  351. package/src/components/orderDetailsContainer/utils/index.tsx +0 -55
  352. package/src/components/paymentContainer/OrderDetails.tsx +0 -277
  353. package/src/components/paymentContainer/PaymentPlanSection.tsx +0 -169
  354. package/src/components/paymentContainer/handlePayment.ts +0 -86
  355. package/src/components/paymentContainer/index.tsx +0 -643
  356. package/src/components/paymentContainer/style.css +0 -196
  357. package/src/components/preRegistration/FieldsSection.tsx +0 -150
  358. package/src/components/preRegistration/Influancers.tsx +0 -34
  359. package/src/components/preRegistration/PreRegistrationComplete.tsx +0 -186
  360. package/src/components/preRegistration/PreRegistrationInformations.tsx +0 -60
  361. package/src/components/preRegistration/Prewards.tsx +0 -41
  362. package/src/components/preRegistration/ShareOptions.tsx +0 -77
  363. package/src/components/preRegistration/constants.tsx +0 -169
  364. package/src/components/preRegistration/index.tsx +0 -330
  365. package/src/components/preRegistration/style.css +0 -3
  366. package/src/components/preRegistration/utils.ts +0 -163
  367. package/src/components/registerForm/adapters/index.tsx +0 -10
  368. package/src/components/registerForm/constants.tsx +0 -98
  369. package/src/components/registerForm/index.tsx +0 -188
  370. package/src/components/registerModal/index.tsx +0 -154
  371. package/src/components/registerModal/style.css +0 -18
  372. package/src/components/resetPasswordContainer/index.tsx +0 -102
  373. package/src/components/resetPasswordContainer/style.css +0 -36
  374. package/src/components/rsvpContainer/index.tsx +0 -126
  375. package/src/components/seatMapContainer/SeatMapComponent.tsx +0 -77
  376. package/src/components/seatMapContainer/TicketsSection.tsx +0 -286
  377. package/src/components/seatMapContainer/addToCart.ts +0 -66
  378. package/src/components/seatMapContainer/index.tsx +0 -443
  379. package/src/components/seatMapContainer/utils.ts +0 -133
  380. package/src/components/signupModal/index.tsx +0 -178
  381. package/src/components/signupModal/style.css +0 -58
  382. package/src/components/ticketResale/index.tsx +0 -86
  383. package/src/components/ticketResaleModal/index.tsx +0 -224
  384. package/src/components/ticketResaleModal/style.css +0 -28
  385. package/src/components/ticketsContainer/AccessCodeSection.tsx +0 -50
  386. package/src/components/ticketsContainer/InfoIcon.tsx +0 -35
  387. package/src/components/ticketsContainer/PromoCodeSection.tsx +0 -116
  388. package/src/components/ticketsContainer/ReferralLogic.tsx +0 -33
  389. package/src/components/ticketsContainer/TicketRow.tsx +0 -107
  390. package/src/components/ticketsContainer/TicketsSection.tsx +0 -350
  391. package/src/components/ticketsContainer/TimeSlotTicketRow.tsx +0 -243
  392. package/src/components/ticketsContainer/TimeSlotsSection.tsx +0 -194
  393. package/src/components/ticketsContainer/index.tsx +0 -986
  394. package/src/components/ticketsContainer/style.css +0 -178
  395. package/src/components/ticketsContainer/utils.ts +0 -35
  396. package/src/components/timerWidget/index.tsx +0 -97
  397. package/src/components/timerWidget/style.css +0 -35
  398. package/src/components/waitingList/index.tsx +0 -190
  399. package/src/components/waitingList/style.css +0 -27
  400. package/src/constants/index.ts +0 -3
  401. package/src/env.ts +0 -29
  402. package/src/hoc/CustomFields/index.tsx +0 -85
  403. package/src/hoc/index.ts +0 -1
  404. package/src/hooks/index.ts +0 -1
  405. package/src/hooks/useCookieListener.ts +0 -32
  406. package/src/hooks/useEventListener.ts +0 -32
  407. package/src/hooks/useLocalStorageListener.ts +0 -32
  408. package/src/hooks/useOnline.ts +0 -21
  409. package/src/hooks/usePixel.ts +0 -88
  410. package/src/normalizers/index.ts +0 -49
  411. package/src/types/add_on.ts +0 -8
  412. package/src/types/api/auth.d.ts +0 -63
  413. package/src/types/api/axiosResponse.d.ts +0 -6
  414. package/src/types/api/cart.d.ts +0 -73
  415. package/src/types/api/checkout.d.ts +0 -92
  416. package/src/types/api/common.d.ts +0 -153
  417. package/src/types/api/guestTicketDelegation.d.ts +0 -18
  418. package/src/types/api/orders.d.ts +0 -116
  419. package/src/types/api/payment.d.ts +0 -180
  420. package/src/types/api/preRegistration.d.ts +0 -11
  421. package/src/types/api/preRegistrationComplete.d.ts +0 -95
  422. package/src/types/api/ticketResale.d.ts +0 -13
  423. package/src/types/billing-info-data.ts +0 -37
  424. package/src/types/checkoutPageConfigs.ts +0 -13
  425. package/src/types/formFields.d.ts +0 -29
  426. package/src/types/index.ts +0 -6
  427. package/src/types/order-data.ts +0 -16
  428. package/src/types/payment-field.ts +0 -7
  429. package/src/types/payment-plan-configuration.ts +0 -19
  430. package/src/types/pre-registration-complete.d.ts +0 -47
  431. package/src/types/referral-promotion.ts +0 -7
  432. package/src/types/seatMap.d.ts +0 -159
  433. package/src/types/verification.ts +0 -12
  434. package/src/utils/adaptStripeErrors.ts +0 -26
  435. package/src/utils/auth.ts +0 -45
  436. package/src/utils/cookies.ts +0 -73
  437. package/src/utils/createCheckoutDataBodyWithDefaultHolder.ts +0 -81
  438. package/src/utils/createMarkup.ts +0 -1
  439. package/src/utils/customFields.ts +0 -80
  440. package/src/utils/downloadPDF.tsx +0 -42
  441. package/src/utils/form.ts +0 -34
  442. package/src/utils/formikErrorFocus.ts +0 -24
  443. package/src/utils/getDomain.ts +0 -21
  444. package/src/utils/getImage.ts +0 -14
  445. package/src/utils/getQueryVariable.ts +0 -13
  446. package/src/utils/htmlNodeFromString.ts +0 -6
  447. package/src/utils/index.ts +0 -15
  448. package/src/utils/isBrowser.ts +0 -2
  449. package/src/utils/isValidNumber.ts +0 -8
  450. package/src/utils/jsonUtils.ts +0 -8
  451. package/src/utils/replaceVarInString.ts +0 -9
  452. package/src/utils/setConfigs.ts +0 -24
  453. package/src/utils/showZero.tsx +0 -10
  454. package/src/validators/index.ts +0 -61
@@ -0,0 +1,512 @@
1
+ /**
2
+ * `<SeatMap/>` — the venue seat picker for seated events, rebuilt to match the
3
+ * legacy `seatMapContainer` exactly (the REAL seat wire, not the earlier
4
+ * inferred mapping):
5
+ *
6
+ * 1. Fetch the chart (`seat-map-data`) → `seatData`, `ticketTypeTierRelations`,
7
+ * `eventSeats`, `seatReservationTime`, `seatMapType`, `tierPrices`,
8
+ * `predefinedSeats`. Poll `seats/status` every 3s and derive the seats this
9
+ * buyer owns (status `'OR'`).
10
+ * 2. Clicking a seat reserves it (`ttf.seatmap.reserve`, one seat per call);
11
+ * clicking a held seat releases it (`ttf.seatmap.removeReserved`). Blocked /
12
+ * reserved-by-others seats and the 10-seat cap are enforced like legacy.
13
+ * 3. Each held seat gets a ticket-type dropdown (auto-selected when its tier
14
+ * offers only one) and, for table/group types, a guest-count dropdown.
15
+ * 4. "Get tickets" turns the held seats into `SeatLine`s and calls
16
+ * `checkout.setSeats(eventId, lines)` → the seat-aware add-to-cart + price.
17
+ *
18
+ * Boundaries (documented, not hidden):
19
+ * - `tf-seat-map-view` is an OPTIONAL peer dependency. Install it and import its
20
+ * CSS (`import 'tf-seat-map-view/dist/index.css'`) to use this section; it is
21
+ * lazy-loaded + externalized, so it never weighs on the base SDK.
22
+ * - Guest-count → cart shape follows the spec's model: a `SeatLine` carries
23
+ * `guests` ONLY for guest-capable (table) types, so plain seated events post
24
+ * aggregated per-type quantities and table events post one indexed line per
25
+ * seat with `quantity = guests`. Validate against a real table-map event.
26
+ */
27
+ import React, {
28
+ useCallback,
29
+ useEffect,
30
+ useRef,
31
+ useState,
32
+ type ComponentType,
33
+ type FC,
34
+ type ReactNode,
35
+ } from 'react'
36
+
37
+ import { errorMessage, ttf, type SeatLine } from 'tf-checkout-shared'
38
+
39
+ import { Button } from '../ui/Button'
40
+ import { Card, SectionHeader } from '../ui/Card'
41
+ import { useCheckoutContext } from '../ui/CheckoutProvider'
42
+ import { Field, Select } from '../ui/Field'
43
+ import { Loader } from '../ui/Loader'
44
+ import { Timer } from '../ui/Timer'
45
+ import {
46
+ getOwnReservationsBasedOnStatuses,
47
+ getTierIdBasedOnSeatId,
48
+ getTierRelationsArray,
49
+ isGuestCapable,
50
+ MAX_SEATS,
51
+ ticketTypesForTier,
52
+ UNSELECTABLE_STATUSES,
53
+ type EventSeatLike,
54
+ type ReservedSeat,
55
+ type SeatRelation,
56
+ type SeatStatuses,
57
+ type TierRelations,
58
+ } from './seatMap.utils'
59
+
60
+ // tf-seat-map-view ships no types (see src/.d.ts ambient module) — treat the
61
+ // default export as an opaque component rendered with the legacy prop contract.
62
+ type SeatMapWidget = ComponentType<Record<string, unknown>>
63
+
64
+ /** The seat click payload the widget emits: `{ seat: { tierId, seatId, status } }`. */
65
+ interface SeatClick {
66
+ seat: { tierId: string; seatId: string; status: string }
67
+ }
68
+
69
+ interface Chart {
70
+ seatData: unknown
71
+ ticketTypeTierRelations: TierRelations
72
+ eventSeats: EventSeatLike[]
73
+ seatReservationTime: number
74
+ seatMapType: string | null
75
+ tierPrices: unknown
76
+ predefinedSeats: unknown
77
+ }
78
+
79
+ type Load<T> =
80
+ | { state: 'loading' }
81
+ | { state: 'ready'; data: T }
82
+ | { state: 'empty' }
83
+ | { state: 'error' }
84
+
85
+ export interface SeatMapProps {
86
+ eventId: string
87
+ /** Fired once seats are added to the cart + priced — e.g. reveal billing. */
88
+ onContinue?: () => void
89
+ /** Badge content. Defaults to a seat glyph. */
90
+ step?: ReactNode
91
+ className?: string
92
+ }
93
+
94
+ export const SeatMap: FC<SeatMapProps> = ({
95
+ eventId,
96
+ onContinue,
97
+ step = '💺',
98
+ className,
99
+ }) => {
100
+ const checkout = useCheckoutContext()
101
+ const [chart, setChart] = useState<Load<Chart>>({ state: 'loading' })
102
+ const [Widget, setWidget] = useState<SeatMapWidget | null>(null)
103
+ const [widgetMissing, setWidgetMissing] = useState(false)
104
+
105
+ const [statuses, setStatuses] = useState<SeatStatuses>({})
106
+ const [reserved, setReserved] = useState<ReservedSeat[]>([])
107
+ const [selectedTypes, setSelectedTypes] = useState<Record<string, string>>({})
108
+ const [guestCounts, setGuestCounts] = useState<Record<string, number>>({})
109
+ const [reserving, setReserving] = useState(false)
110
+ const [adding, setAdding] = useState(false)
111
+ const [error, setError] = useState('')
112
+ const [deadline, setDeadline] = useState<number | null>(null)
113
+ const [nowTick, setNowTick] = useState(0)
114
+
115
+ // The poll's setInterval closure reads these without re-subscribing.
116
+ const eventSeatsRef = useRef<EventSeatLike[]>([])
117
+ const relationsRef = useRef<TierRelations>({})
118
+ const reservationTimeRef = useRef(0)
119
+ const canvasRef = useRef<HTMLDivElement | null>(null)
120
+
121
+ // Lazy-load the optional widget; a consumer who never installed it just gets
122
+ // the "unavailable" note instead of a hard module-resolution crash.
123
+ useEffect(() => {
124
+ let active = true
125
+ import('tf-seat-map-view')
126
+ .then((m) => active && setWidget(() => (m.default ?? m) as SeatMapWidget))
127
+ .catch(() => active && setWidgetMissing(true))
128
+ return () => {
129
+ active = false
130
+ }
131
+ }, [])
132
+
133
+ // Fetch the chart. `get()` returns the JSON:API envelope, so read
134
+ // `.data.attributes`; `seatData` is a JSON string the widget wants parsed.
135
+ useEffect(() => {
136
+ let active = true
137
+ setChart({ state: 'loading' })
138
+ console.log('[SeatMap] Fetching chart for eventId:', eventId)
139
+ ttf.seatmap
140
+ .data(eventId)
141
+ .then((resp) => {
142
+ if (!active) return
143
+ console.log('[SeatMap] Raw response from ttf.seatmap.data:', resp)
144
+ console.log('[SeatMap] typeof resp:', typeof resp)
145
+ console.log('[SeatMap] resp?.data:', (resp as any)?.data)
146
+ console.log('[SeatMap] resp?.data?.attributes:', (resp as any)?.data?.attributes)
147
+ const attrs = (resp as { data?: { attributes?: Record<string, unknown> } })?.data
148
+ ?.attributes
149
+ console.log('[SeatMap] Parsed attrs:', attrs)
150
+ console.log('[SeatMap] attrs?.seatData:', attrs?.seatData)
151
+ console.log('[SeatMap] attrs?.seatData == null:', attrs?.seatData == null)
152
+ if (!attrs || attrs.seatData == null) {
153
+ console.warn(
154
+ '[SeatMap] Setting chart to EMPTY because:',
155
+ !attrs ? 'attrs is falsy' : 'seatData is null/undefined'
156
+ )
157
+ setChart({ state: 'empty' })
158
+ return
159
+ }
160
+ const rawSeatData = attrs.seatData
161
+ let seatData: unknown = rawSeatData
162
+ if (typeof rawSeatData === 'string') {
163
+ try {
164
+ seatData = JSON.parse(rawSeatData)
165
+ } catch {
166
+ seatData = rawSeatData
167
+ }
168
+ }
169
+ const relations = (attrs.ticketTypeTierRelations ?? {}) as TierRelations
170
+ const eventSeats = (attrs.eventSeats ?? []) as EventSeatLike[]
171
+ eventSeatsRef.current = eventSeats
172
+ relationsRef.current = relations
173
+ reservationTimeRef.current = Number(attrs.seatReservationTime) || 0
174
+ // The widget reads tier prices off a global (legacy "temp solution").
175
+ if (typeof window !== 'undefined') {
176
+ ;(window as unknown as { tierPrices?: unknown }).tierPrices = attrs.tierPrices
177
+ }
178
+ console.log('[SeatMap] Setting chart to READY', {
179
+ seatMapType: attrs.seatMapType,
180
+ seatReservationTime: reservationTimeRef.current,
181
+ eventSeatsCount: eventSeats.length,
182
+ relationsKeys: Object.keys(relations),
183
+ seatDataType: typeof seatData,
184
+ })
185
+ setChart({
186
+ state: 'ready',
187
+ data: {
188
+ seatData,
189
+ ticketTypeTierRelations: relations,
190
+ eventSeats,
191
+ seatReservationTime: reservationTimeRef.current,
192
+ seatMapType: (attrs.seatMapType ?? null) as string | null,
193
+ tierPrices: attrs.tierPrices,
194
+ predefinedSeats: attrs.predefinedSeats,
195
+ },
196
+ })
197
+ })
198
+ .catch((err) => {
199
+ console.error('[SeatMap] Fetch FAILED — setting chart to ERROR', err)
200
+ if (active) setChart({ state: 'error' })
201
+ })
202
+ return () => {
203
+ active = false
204
+ }
205
+ }, [eventId])
206
+
207
+ // Poll live statuses every 3s (like legacy) once the chart is ready: derive the
208
+ // seats this buyer owns, auto-select single-type tiers, prune released seats.
209
+ const refreshStatuses = useCallback(async () => {
210
+ try {
211
+ const resp = await ttf.seatmap.statuses(eventId)
212
+ const attrs = ((resp as { data?: { attributes?: SeatStatuses } })?.data
213
+ ?.attributes ?? {}) as SeatStatuses
214
+ const own = getOwnReservationsBasedOnStatuses(attrs) // mutates 'H' → 'BLOCKED'
215
+ const nextReserved: ReservedSeat[] = own.map((seatId) => ({
216
+ seatId,
217
+ tierId: getTierIdBasedOnSeatId(seatId, eventSeatsRef.current),
218
+ }))
219
+ setStatuses(attrs)
220
+ setReserved(nextReserved)
221
+ const ownSet = new Set(own)
222
+ setSelectedTypes((prev) => {
223
+ const next: Record<string, string> = {}
224
+ for (const r of nextReserved) {
225
+ if (prev[r.seatId] != null) {
226
+ next[r.seatId] = prev[r.seatId]
227
+ } else {
228
+ const types = ticketTypesForTier(relationsRef.current, r.tierId)
229
+ next[r.seatId] = types.length === 1 ? types[0].ticket_type_id : ''
230
+ }
231
+ }
232
+ return next
233
+ })
234
+ setGuestCounts((prev) => {
235
+ const next: Record<string, number> = {}
236
+ for (const seatId of Object.keys(prev))
237
+ if (ownSet.has(seatId)) next[seatId] = prev[seatId]
238
+ return next
239
+ })
240
+ } catch {
241
+ // A transient status poll failure is non-fatal — keep the last snapshot.
242
+ }
243
+ }, [eventId])
244
+
245
+ useEffect(() => {
246
+ if (chart.state !== 'ready') return
247
+ refreshStatuses()
248
+ const id = setInterval(refreshStatuses, 3000)
249
+ return () => clearInterval(id)
250
+ }, [chart.state, refreshStatuses])
251
+
252
+ // Reservation countdown: arm it when the first seat is held; clear when none
253
+ // remain. The server is the source of truth — expiry drops seats via the poll.
254
+ useEffect(() => {
255
+ if (reserved.length && deadline == null && reservationTimeRef.current) {
256
+ setDeadline(Date.now() + reservationTimeRef.current * 60000)
257
+ } else if (!reserved.length && deadline != null) {
258
+ setDeadline(null)
259
+ }
260
+ }, [reserved.length, deadline])
261
+ useEffect(() => {
262
+ if (deadline == null) return
263
+ const id = setInterval(() => setNowTick((n) => n + 1), 1000)
264
+ return () => clearInterval(id)
265
+ }, [deadline])
266
+ const secondsLeft =
267
+ deadline != null ? Math.max(0, Math.round((deadline - Date.now()) / 1000)) : undefined
268
+ // referenced so the 1s tick re-renders the timer
269
+ void nowTick
270
+
271
+ const reserve = async (tierId: string, seatId: string) => {
272
+ setError('')
273
+ setReserving(true)
274
+ try {
275
+ await ttf.seatmap.reserve(eventId, { tierId, seatId, ttl: 10 })
276
+ await refreshStatuses()
277
+ // Auto-select the tier's type if it's the only one (legacy behaviour).
278
+ const types = ticketTypesForTier(relationsRef.current, tierId)
279
+ if (types.length === 1) {
280
+ setSelectedTypes((s) => ({ ...s, [seatId]: types[0].ticket_type_id }))
281
+ }
282
+ } catch (e) {
283
+ setError(errorMessage(e))
284
+ } finally {
285
+ setReserving(false)
286
+ }
287
+ }
288
+
289
+ const cancel = async (tierId: string, seatId: string) => {
290
+ setError('')
291
+ setReserving(true)
292
+ try {
293
+ await ttf.seatmap.removeReserved(eventId, tierId, [seatId])
294
+ await refreshStatuses()
295
+ } catch (e) {
296
+ setError(errorMessage(e))
297
+ } finally {
298
+ setReserving(false)
299
+ }
300
+ }
301
+
302
+ const onSeatClick = (info: SeatClick) => {
303
+ const { tierId, seatId, status } = info.seat
304
+ if (UNSELECTABLE_STATUSES.has(status)) return
305
+ if (reserved.some((r) => r.seatId === seatId)) {
306
+ cancel(tierId, seatId)
307
+ } else if (reserved.length >= MAX_SEATS) {
308
+ setError(`You can hold at most ${MAX_SEATS} seats.`)
309
+ } else {
310
+ reserve(tierId, seatId)
311
+ }
312
+ }
313
+
314
+ const relationFor = (seatId: string): SeatRelation | undefined => {
315
+ const seat = reserved.find((r) => r.seatId === seatId)
316
+ const typeId = selectedTypes[seatId]
317
+ if (!seat || !typeId) return undefined
318
+ return ticketTypesForTier(relationsRef.current, seat.tierId).find(
319
+ (t) => t.ticket_type_id === typeId
320
+ )
321
+ }
322
+
323
+ // "Get tickets" is enabled only once every held seat has a type chosen.
324
+ const allChosen =
325
+ reserved.length > 0 && reserved.every((r) => Boolean(selectedTypes[r.seatId]))
326
+
327
+ const getTickets = () => {
328
+ setError('')
329
+ const lines: SeatLine[] = []
330
+ for (const r of reserved) {
331
+ const rel = relationFor(r.seatId)
332
+ if (!rel) continue
333
+ const guestCapable = isGuestCapable(rel)
334
+ const min = Number(rel.ticket_type_min_number_of_guests) || 0
335
+ lines.push({
336
+ seatId: r.seatId,
337
+ tierId: r.tierId,
338
+ ticketTypeId: rel.ticket_type_id,
339
+ optionName: rel.ticket_type_option,
340
+ price: Number(rel.ticket_type_price),
341
+ ...(guestCapable ? { guests: guestCounts[r.seatId] ?? min } : {}),
342
+ })
343
+ }
344
+ if (!lines.length) {
345
+ setError('Please choose a ticket type for each seat.')
346
+ return
347
+ }
348
+ setAdding(true)
349
+ checkout
350
+ .setSeats(eventId, lines)
351
+ .then(() => onContinue?.())
352
+ .catch((e) => setError(errorMessage(e)))
353
+ .finally(() => setAdding(false))
354
+ }
355
+
356
+ const symbol = checkout.breakdown?.currencySymbol ?? ''
357
+
358
+ return (
359
+ <Card className={className}>
360
+ <SectionHeader
361
+ step={step}
362
+ title="Select your seats"
363
+ pills={secondsLeft != null ? <Timer seconds={secondsLeft} /> : undefined}
364
+ />
365
+
366
+ {chart.state === 'loading' && (
367
+ <div className="tf-checkout-seatmap__loading">
368
+ <Loader />
369
+ </div>
370
+ )}
371
+
372
+ {chart.state === 'empty' && (
373
+ <p className="tf-checkout-note">
374
+ This event has no seating chart — choose tickets above instead.
375
+ </p>
376
+ )}
377
+
378
+ {chart.state === 'error' && (
379
+ <p className="tf-checkout-note">
380
+ This seat map is currently unavailable in the checkout widget. If this event
381
+ uses Seats.io, please return to the main event page to pick your seats.
382
+ </p>
383
+ )}
384
+
385
+ {chart.state === 'ready' && widgetMissing && (
386
+ <p className="tf-checkout-note">
387
+ Seat map unavailable — install <code>tf-seat-map-view</code> and import its CSS
388
+ to enable the picker.
389
+ </p>
390
+ )}
391
+
392
+ {chart.state === 'ready' && !widgetMissing && (
393
+ <>
394
+ <div className="tf-checkout-seatmap__canvas" ref={canvasRef}>
395
+ {Widget ? (
396
+ <Widget
397
+ seatData={chart.data.seatData}
398
+ statuses={statuses}
399
+ isSelectionOn={false}
400
+ disabled={reserving}
401
+ loading={reserving}
402
+ events={{ onSeatClick }}
403
+ ticketTypeTireRelationsArray={getTierRelationsArray(
404
+ chart.data.ticketTypeTierRelations
405
+ )}
406
+ width={Math.min(canvasRef.current?.clientWidth || 800, 800)}
407
+ height={Math.min(canvasRef.current?.clientWidth || 800, 800)}
408
+ isBlockMap={chart.data.seatMapType === 'block'}
409
+ isTableMap={chart.data.seatMapType === 'table'}
410
+ predefinedSeats={chart.data.predefinedSeats}
411
+ />
412
+ ) : (
413
+ <Loader />
414
+ )}
415
+ </div>
416
+
417
+ {reserved.length > 0 && (
418
+ <div className="tf-checkout-seatmap__seats">
419
+ {reserved.map((r) => {
420
+ const types = ticketTypesForTier(relationsRef.current, r.tierId)
421
+ const rel = relationFor(r.seatId)
422
+ const guestCapable = isGuestCapable(rel)
423
+ const min = Number(rel?.ticket_type_min_number_of_guests) || 0
424
+ const max = Number(rel?.ticket_type_max_number_of_guests) || 0
425
+ const guests = guestCounts[r.seatId] ?? min
426
+ const unitPrice = Number(rel?.ticket_type_price ?? 0)
427
+ const guestPrice = guestCapable
428
+ ? (guests - min) * Number(rel?.guest_price ?? 0)
429
+ : 0
430
+ const total = (unitPrice + guestPrice).toFixed(2)
431
+ return (
432
+ <div key={r.seatId} className="tf-checkout-seatmap__seat">
433
+ <Field label={`Seat ${r.seatId}`}>
434
+ <Select
435
+ value={selectedTypes[r.seatId] || ''}
436
+ onChange={(e) =>
437
+ setSelectedTypes((s) => ({ ...s, [r.seatId]: e.target.value }))
438
+ }
439
+ >
440
+ <option value="">Please select a ticket type</option>
441
+ {types.map((t) => (
442
+ <option key={t.ticket_type_id} value={t.ticket_type_id}>
443
+ {t.ticket_type_name}
444
+ </option>
445
+ ))}
446
+ </Select>
447
+ </Field>
448
+
449
+ {guestCapable && (
450
+ <Field label="Guests">
451
+ <Select
452
+ value={guests}
453
+ onChange={(e) =>
454
+ setGuestCounts((g) => ({
455
+ ...g,
456
+ [r.seatId]: Number(e.target.value),
457
+ }))
458
+ }
459
+ >
460
+ {Array.from(
461
+ { length: Math.max(0, max - min + 1) },
462
+ (_, i) => min + i
463
+ ).map((n) => (
464
+ <option key={n} value={n}>
465
+ {n}
466
+ </option>
467
+ ))}
468
+ </Select>
469
+ </Field>
470
+ )}
471
+
472
+ <div className="tf-checkout-seatmap__seat-foot">
473
+ {rel && (
474
+ <span className="tf-checkout-seatmap__seat-price">
475
+ {symbol}
476
+ {total}
477
+ <span className="tf-checkout-note">
478
+ {rel.fee_included ? ' incl. fees' : ' excl. fees'}
479
+ </span>
480
+ </span>
481
+ )}
482
+ <button
483
+ type="button"
484
+ className="tf-checkout-seatmap__seat-remove"
485
+ onClick={() => cancel(r.tierId, r.seatId)}
486
+ disabled={reserving}
487
+ >
488
+ Remove
489
+ </button>
490
+ </div>
491
+ </div>
492
+ )
493
+ })}
494
+
495
+ <Button
496
+ block
497
+ onClick={getTickets}
498
+ loading={adding}
499
+ disabled={adding || reserving || !allChosen}
500
+ >
501
+ {adding
502
+ ? 'Reserving…'
503
+ : `Get ${reserved.length} seat${reserved.length > 1 ? 's' : ''}`}
504
+ </Button>
505
+ </div>
506
+ )}
507
+ {error && <p className="tf-checkout-error-text">{error}</p>}
508
+ </>
509
+ )}
510
+ </Card>
511
+ )
512
+ }