tf-checkout-react 2.0.0-beta.2 → 2.0.0-beta.3

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.
package/dist/index.js CHANGED
@@ -1649,7 +1649,7 @@ var buildXenditCheckoutHtml = (options) => {
1649
1649
 
1650
1650
  // ../tf-checkout-shared/src/engine/errors.ts
1651
1651
  var errorMessage = (error) => toTtfError(error).message;
1652
- var EXPIRED_WORDS = /expir|caduc|scadut|abgelaufen|verlopen|udløbet|löpt ut|utløpt|vypršel|wygasł|истек|expirou|kedaluwarsa|hết hạn|期限切れ|已过期|已過期|만료/i;
1652
+ var EXPIRED_WORDS = /expir|caduc|scadut|abgelaufen|verlopen|udløbet|löpt ut|utløpt|vypršel|wygasł|истек|expirou|kedaluwarsa|vanhentu|hết hạn|期限切れ|已过期|已過期|만료/i;
1653
1653
  var isCartExpiredError = (error) => {
1654
1654
  const e = toTtfError(error);
1655
1655
  if (e.status !== 422) return false;
@@ -2051,8 +2051,12 @@ var removeReservedSeats = async (eventId, tierId, seatIds) => (
2051
2051
  var refreshReservation = async (eventId, orderId) => patch(ENDPOINTS.seatmap.refreshReservation(eventId), { order_id: orderId });
2052
2052
 
2053
2053
  // ../tf-checkout-shared/src/api/events.ts
2054
+ var badgeOf = (raw) => {
2055
+ const text = typeof raw === "string" ? raw.trim() : "";
2056
+ return text || null;
2057
+ };
2054
2058
  var mapTicket = (t) => {
2055
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
2059
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
2056
2060
  return {
2057
2061
  id: String(t.id),
2058
2062
  name: (_a = t.displayName) != null ? _a : "",
@@ -2080,7 +2084,8 @@ var mapTicket = (t) => {
2080
2084
  allowDirectPurchase: Boolean(t.allowDirectPurchase),
2081
2085
  waitingListEnabled: Boolean(t.waitingListEnabled),
2082
2086
  waitingListMaxQuantity: t.waitingListMaxQuantity != null ? Number(t.waitingListMaxQuantity) : void 0,
2083
- descriptionRich: (_m = t.descriptionRich) != null ? _m : null
2087
+ descriptionRich: (_m = t.descriptionRich) != null ? _m : null,
2088
+ badgeText: badgeOf((_n = t.badgeText) != null ? _n : t.badge_text)
2084
2089
  };
2085
2090
  };
2086
2091
  var getEventTickets = async (eventId) => {
@@ -2134,7 +2139,7 @@ var getEventConditions = async (eventId) => {
2134
2139
  }).filter((c) => c.content || c.name);
2135
2140
  };
2136
2141
  var getEventTimeSlotTickets = async (eventId, date, options) => {
2137
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t;
2142
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
2138
2143
  const body = await get(ENDPOINTS.events.timeSlotByDate(eventId), {
2139
2144
  params: {
2140
2145
  date,
@@ -2171,6 +2176,7 @@ var getEventTimeSlotTickets = async (eventId, date, options) => {
2171
2176
  isTable: Boolean(s.is_table),
2172
2177
  allowDirectPurchase: true,
2173
2178
  descriptionRich: (_t = s.description) != null ? _t : null,
2179
+ badgeText: badgeOf((_u = s.badge_text) != null ? _u : s.badgeText),
2174
2180
  timeSlot: { date: slotDate, time: timeKey }
2175
2181
  });
2176
2182
  }
@@ -4369,7 +4375,53 @@ var en = {
4369
4375
  "auth.passwordsMustMatch": "Passwords must match.",
4370
4376
  "auth.passwordChanged": "Your password has been changed. You can now log in.",
4371
4377
  "auth.selectState": "Select state / region",
4372
- "auth.notRequired": "Not required"
4378
+ "auth.notRequired": "Not required",
4379
+ // --- Previously hardcoded in components ---------------------------------
4380
+ "tickets.waitingListJoined": "You\u2019re on the waiting list \u2014 we\u2019ll email you if a spot opens.",
4381
+ "tickets.firstName": "First name",
4382
+ "tickets.lastName": "Last name",
4383
+ "tickets.email": "Email",
4384
+ "tickets.joinWaitingList": "Join the waiting list",
4385
+ "tickets.free": "FREE",
4386
+ "tickets.withFees": "({{price}} with fees)",
4387
+ "tickets.deposit": "{{percent}}% DEPOSIT",
4388
+ "tickets.gotPromoCode": "Got a promo code? Click here",
4389
+ "payment.conditionRequired": "You must accept this condition to continue.",
4390
+ "payment.payInFull": "Pay in full instead",
4391
+ "payment.installmentTotal": "{{amount}} total",
4392
+ "confirmation.viewVoucher": "View payment voucher",
4393
+ "confirmation.viewTickets": "View my tickets",
4394
+ "confirmation.orderConfirmed": "Your order has been confirmed!",
4395
+ "confirmation.emailed": "Your tickets have been emailed to you",
4396
+ "confirmation.inMyTickets": "Your tickets are available in My Tickets.",
4397
+ "confirmation.bringThem": "Please bring them with you to the event",
4398
+ "confirmation.viewOrder": "View Order",
4399
+ "confirmation.missingReference": "The order reference is missing.",
4400
+ "referral.titleStart": "Your ticket can become",
4401
+ "referral.titleCheaper": "cheaper",
4402
+ "referral.titleOr": "or even",
4403
+ "referral.titleFree": "FREE!",
4404
+ "referral.inviteMiddle": "and we'll refund up to",
4405
+ "referral.inviteEnd": "of your ticket money, if they buy tickets as well!",
4406
+ "referral.copy": "Copy",
4407
+ "referral.currentPrice": "Your ticket is currently",
4408
+ "referral.ifFriendsBuy": "If your friends buy {{count}} tickets",
4409
+ "referral.becomes": "Your ticket becomes",
4410
+ "referral.goesDownTo": "Your ticket goes down to",
4411
+ "verification.title": "Account Verification",
4412
+ "verification.checking": "Checking your verification status\u2026",
4413
+ "verification.idle": "To complete the purchase, please verify your identity.",
4414
+ "verification.starting": "Opening the verification page\u2026",
4415
+ "verification.polling": "Waiting for verification to complete in the other tab\u2026",
4416
+ "verification.verified": "Identity verified \u2014 your tickets are on their way.",
4417
+ "verification.timeoutCheckAgain": "Still not confirmed. Finish in the other tab, then check again.",
4418
+ "verification.timeoutSafe": "Verification is taking longer than usual. Your payment is safe.",
4419
+ "verification.error": "We couldn\u2019t reach the verification service. Try again.",
4420
+ "verification.verify": "Verify",
4421
+ "verification.verifying": "Verifying\u2026",
4422
+ "verification.checkAgain": "Check again",
4423
+ "verification.tryAgain": "Try again",
4424
+ "auth.existingAccount": "This email already has an account. Log in to autofill your checkout details."
4373
4425
  };
4374
4426
 
4375
4427
  // ../tf-checkout-shared/src/i18n/resolve.ts
@@ -4585,7 +4637,53 @@ var esMX = {
4585
4637
  "auth.passwordsMustMatch": "Las contrase\xF1as deben coincidir.",
4586
4638
  "auth.passwordChanged": "Tu contrase\xF1a se cambi\xF3. Ya puedes iniciar sesi\xF3n.",
4587
4639
  "auth.selectState": "Selecciona estado / regi\xF3n",
4588
- "auth.notRequired": "No requerido"
4640
+ "auth.notRequired": "No requerido",
4641
+ // --- Previously hardcoded in components ---------------------------------
4642
+ "tickets.waitingListJoined": "Ya est\xE1s en la lista de espera \u2014 te escribiremos si se libera un lugar.",
4643
+ "tickets.firstName": "Nombre",
4644
+ "tickets.lastName": "Apellido",
4645
+ "tickets.email": "Correo electr\xF3nico",
4646
+ "tickets.joinWaitingList": "Unirme a la lista de espera",
4647
+ "tickets.free": "GRATIS",
4648
+ "tickets.withFees": "({{price}} con cargos)",
4649
+ "tickets.deposit": "{{percent}}% DE ANTICIPO",
4650
+ "tickets.gotPromoCode": "\xBFTienes un c\xF3digo promocional? Haz clic aqu\xED",
4651
+ "payment.conditionRequired": "Debes aceptar esta condici\xF3n para continuar.",
4652
+ "payment.payInFull": "Mejor pagar en una sola exhibici\xF3n",
4653
+ "payment.installmentTotal": "{{amount}} en total",
4654
+ "confirmation.viewVoucher": "Ver ficha de pago",
4655
+ "confirmation.viewTickets": "Ver mis boletos",
4656
+ "confirmation.orderConfirmed": "\xA1Tu pedido est\xE1 confirmado!",
4657
+ "confirmation.emailed": "Te enviamos tus boletos por correo",
4658
+ "confirmation.inMyTickets": "Tus boletos est\xE1n disponibles en Mis boletos.",
4659
+ "confirmation.bringThem": "Ll\xE9valos contigo al evento",
4660
+ "confirmation.viewOrder": "Ver pedido",
4661
+ "confirmation.missingReference": "Falta la referencia del pedido.",
4662
+ "referral.titleStart": "Tu boleto puede salirte",
4663
+ "referral.titleCheaper": "m\xE1s barato",
4664
+ "referral.titleOr": "o incluso",
4665
+ "referral.titleFree": "\xA1GRATIS!",
4666
+ "referral.inviteMiddle": "y te reembolsamos hasta el",
4667
+ "referral.inviteEnd": "de lo que pagaste por tu boleto si ellos tambi\xE9n compran.",
4668
+ "referral.copy": "Copiar",
4669
+ "referral.currentPrice": "Tu boleto cuesta ahora",
4670
+ "referral.ifFriendsBuy": "Si tus amigos compran {{count}} boletos",
4671
+ "referral.becomes": "Tu boleto queda",
4672
+ "referral.goesDownTo": "Tu boleto baja a",
4673
+ "verification.title": "Verificaci\xF3n de cuenta",
4674
+ "verification.checking": "Revisando el estado de tu verificaci\xF3n\u2026",
4675
+ "verification.idle": "Para completar la compra, verifica tu identidad.",
4676
+ "verification.starting": "Abriendo la p\xE1gina de verificaci\xF3n\u2026",
4677
+ "verification.polling": "Esperando a que termines la verificaci\xF3n en la otra pesta\xF1a\u2026",
4678
+ "verification.verified": "Identidad verificada \u2014 tus boletos van en camino.",
4679
+ "verification.timeoutCheckAgain": "A\xFAn no se confirma. Termina en la otra pesta\xF1a y vuelve a revisar.",
4680
+ "verification.timeoutSafe": "La verificaci\xF3n est\xE1 tardando m\xE1s de lo normal. Tu pago est\xE1 seguro.",
4681
+ "verification.error": "No pudimos conectar con el servicio de verificaci\xF3n. Int\xE9ntalo de nuevo.",
4682
+ "verification.verify": "Verificar",
4683
+ "verification.verifying": "Verificando\u2026",
4684
+ "verification.checkAgain": "Revisar de nuevo",
4685
+ "verification.tryAgain": "Intentar de nuevo",
4686
+ "auth.existingAccount": "Este correo ya tiene una cuenta. Inicia sesi\xF3n para autocompletar tus datos de compra."
4589
4687
  };
4590
4688
 
4591
4689
  // ../tf-checkout-shared/src/i18n/locales/index.ts
@@ -5442,14 +5540,17 @@ var import_react7 = __toESM(require("react"));
5442
5540
 
5443
5541
  // src/ui/Loader.tsx
5444
5542
  var import_react6 = __toESM(require("react"));
5445
- var Loader = ({ className }) => /* @__PURE__ */ import_react6.default.createElement(
5446
- "span",
5447
- {
5448
- className: cx("tf-checkout-loader", className),
5449
- role: "status",
5450
- "aria-label": "Loading"
5451
- }
5452
- );
5543
+ var Loader = ({ className }) => {
5544
+ const t = useT();
5545
+ return /* @__PURE__ */ import_react6.default.createElement(
5546
+ "span",
5547
+ {
5548
+ className: cx("tf-checkout-loader", className),
5549
+ role: "status",
5550
+ "aria-label": t("common.loading")
5551
+ }
5552
+ );
5553
+ };
5453
5554
 
5454
5555
  // src/ui/Button.tsx
5455
5556
  var Button = (0, import_react7.forwardRef)(
@@ -5503,9 +5604,9 @@ var useInstallmentPicker = () => {
5503
5604
  onClick: () => choose(o)
5504
5605
  },
5505
5606
  /* @__PURE__ */ import_react8.default.createElement("span", null, o.count, " \xD7 ", (_a = o.per_installment_formatted) != null ? _a : o.per_installment),
5506
- /* @__PURE__ */ import_react8.default.createElement("span", { className: "tf-checkout-installments__meta" }, o.total_formatted ? `${o.total_formatted} total` : "", o.diff_from_original_formatted ? ` \xB7 ${o.diff_from_original_formatted}` : "")
5607
+ /* @__PURE__ */ import_react8.default.createElement("span", { className: "tf-checkout-installments__meta" }, o.total_formatted ? t("payment.installmentTotal", { amount: o.total_formatted }) : "", o.diff_from_original_formatted ? ` \xB7 ${o.diff_from_original_formatted}` : "")
5507
5608
  );
5508
- })), /* @__PURE__ */ import_react8.default.createElement(Button, { variant: "ghost", block: true, onClick: () => choose(null) }, "Pay in full instead"))
5609
+ })), /* @__PURE__ */ import_react8.default.createElement(Button, { variant: "ghost", block: true, onClick: () => choose(null) }, t("payment.payInFull")))
5509
5610
  ) : null;
5510
5611
  return { onInstallmentOffers, picker };
5511
5612
  };
@@ -5906,27 +6007,30 @@ var PaymentMethods = ({
5906
6007
 
5907
6008
  // src/ui/Stepper.tsx
5908
6009
  var import_react14 = __toESM(require("react"));
5909
- var Stepper = ({ value, onChange, min = 0, max = Infinity, step = 1, disabled, className }) => /* @__PURE__ */ import_react14.default.createElement("div", { className: cx("tf-checkout-stepper", className) }, /* @__PURE__ */ import_react14.default.createElement(
5910
- "button",
5911
- {
5912
- type: "button",
5913
- className: "tf-checkout-stepper__btn",
5914
- "aria-label": "Decrease",
5915
- disabled: disabled || value <= min,
5916
- onClick: () => onChange(Math.max(min, value - step))
5917
- },
5918
- "\u2212"
5919
- ), /* @__PURE__ */ import_react14.default.createElement("span", { className: "tf-checkout-stepper__value" }, value), /* @__PURE__ */ import_react14.default.createElement(
5920
- "button",
5921
- {
5922
- type: "button",
5923
- className: "tf-checkout-stepper__btn",
5924
- "aria-label": "Increase",
5925
- disabled: disabled || value >= max,
5926
- onClick: () => onChange(Math.min(max, value + step))
5927
- },
5928
- "+"
5929
- ));
6010
+ var Stepper = ({ value, onChange, min = 0, max = Infinity, step = 1, disabled, className }) => {
6011
+ const t = useT();
6012
+ return /* @__PURE__ */ import_react14.default.createElement("div", { className: cx("tf-checkout-stepper", className) }, /* @__PURE__ */ import_react14.default.createElement(
6013
+ "button",
6014
+ {
6015
+ type: "button",
6016
+ className: "tf-checkout-stepper__btn",
6017
+ "aria-label": t("common.decrease"),
6018
+ disabled: disabled || value <= min,
6019
+ onClick: () => onChange(Math.max(min, value - step))
6020
+ },
6021
+ "\u2212"
6022
+ ), /* @__PURE__ */ import_react14.default.createElement("span", { className: "tf-checkout-stepper__value" }, value), /* @__PURE__ */ import_react14.default.createElement(
6023
+ "button",
6024
+ {
6025
+ type: "button",
6026
+ className: "tf-checkout-stepper__btn",
6027
+ "aria-label": t("common.increase"),
6028
+ disabled: disabled || value >= max,
6029
+ onClick: () => onChange(Math.min(max, value + step))
6030
+ },
6031
+ "+"
6032
+ ));
6033
+ };
5930
6034
 
5931
6035
  // src/ui/QuantitySelect.tsx
5932
6036
  var import_react15 = __toESM(require("react"));
@@ -6768,30 +6872,31 @@ var ResetPasswordForm = ({
6768
6872
  // src/sections/Tickets.tsx
6769
6873
  var import_react25 = __toESM(require("react"));
6770
6874
  var WaitingListForm = ({ ticket, onJoin }) => {
6875
+ const tr = useT();
6771
6876
  const [form, setForm] = (0, import_react25.useState)({ firstName: "", lastName: "", email: "" });
6772
6877
  const [state, setState] = (0, import_react25.useState)("idle");
6773
6878
  const [error, setError] = (0, import_react25.useState)("");
6774
6879
  const ok = form.firstName.trim() && form.lastName.trim() && form.email.trim();
6775
6880
  if (state === "done")
6776
- return /* @__PURE__ */ import_react25.default.createElement("p", { className: "tf-checkout-note tf-checkout-tickets__wl-done" }, "You\u2019re on the waiting list \u2014 we\u2019ll email you if a spot opens.");
6881
+ return /* @__PURE__ */ import_react25.default.createElement("p", { className: "tf-checkout-note tf-checkout-tickets__wl-done" }, tr("tickets.waitingListJoined"));
6777
6882
  return /* @__PURE__ */ import_react25.default.createElement("div", { className: "tf-checkout-tickets__wl" }, /* @__PURE__ */ import_react25.default.createElement(FieldRow, null, /* @__PURE__ */ import_react25.default.createElement(Field, null, /* @__PURE__ */ import_react25.default.createElement(
6778
6883
  Input,
6779
6884
  {
6780
- placeholder: "First name",
6885
+ placeholder: tr("tickets.firstName"),
6781
6886
  value: form.firstName,
6782
6887
  onChange: (e) => setForm((f) => ({ ...f, firstName: e.target.value }))
6783
6888
  }
6784
6889
  )), /* @__PURE__ */ import_react25.default.createElement(Field, null, /* @__PURE__ */ import_react25.default.createElement(
6785
6890
  Input,
6786
6891
  {
6787
- placeholder: "Last name",
6892
+ placeholder: tr("tickets.lastName"),
6788
6893
  value: form.lastName,
6789
6894
  onChange: (e) => setForm((f) => ({ ...f, lastName: e.target.value }))
6790
6895
  }
6791
6896
  ))), /* @__PURE__ */ import_react25.default.createElement(Field, null, /* @__PURE__ */ import_react25.default.createElement(
6792
6897
  Input,
6793
6898
  {
6794
- placeholder: "Email",
6899
+ placeholder: tr("tickets.email"),
6795
6900
  value: form.email,
6796
6901
  onChange: (e) => setForm((f) => ({ ...f, email: e.target.value }))
6797
6902
  }
@@ -6810,7 +6915,7 @@ var WaitingListForm = ({ ticket, onJoin }) => {
6810
6915
  disabled: !ok || state === "busy",
6811
6916
  variant: "secondary"
6812
6917
  },
6813
- "Join the waiting list"
6918
+ tr("tickets.joinWaitingList")
6814
6919
  ), error && /* @__PURE__ */ import_react25.default.createElement("p", { className: "tf-checkout-error-text" }, error));
6815
6920
  };
6816
6921
  var Tickets = ({
@@ -6958,7 +7063,7 @@ var Tickets = ({
6958
7063
  onClick: () => setVisibleDescription((current2) => current2 === t.id ? null : t.id)
6959
7064
  },
6960
7065
  visibleDescription === t.id ? tr("tickets.hideInfo") : tr("tickets.viewInfo")
6961
- )), /* @__PURE__ */ import_react25.default.createElement("div", { className: "tf-checkout-tickets__price" }, discounted && /* @__PURE__ */ import_react25.default.createElement("span", { className: "tf-checkout-tickets__old" }, money(sym, original)), /* @__PURE__ */ import_react25.default.createElement(
7066
+ )), t.badgeText && !unavailable && /* @__PURE__ */ import_react25.default.createElement("span", { className: "tf-checkout-tickets__badge" }, t.badgeText), /* @__PURE__ */ import_react25.default.createElement("div", { className: "tf-checkout-tickets__price" }, discounted && /* @__PURE__ */ import_react25.default.createElement("span", { className: "tf-checkout-tickets__old" }, money(sym, original)), /* @__PURE__ */ import_react25.default.createElement(
6962
7067
  "span",
6963
7068
  {
6964
7069
  className: cx(
@@ -6966,8 +7071,8 @@ var Tickets = ({
6966
7071
  isFree && "tf-checkout-tickets__amount--free"
6967
7072
  )
6968
7073
  },
6969
- isFree ? "FREE" : money(sym, t.price)
6970
- ), !isFree && !t.soldOut && /* @__PURE__ */ import_react25.default.createElement("span", { className: "tf-checkout-tickets__fees" }, "(", money(sym, t.priceWithFees), " with fees)"), t.depositPercent != null && /* @__PURE__ */ import_react25.default.createElement("span", { className: "tf-checkout-tickets__deposit" }, t.depositPercent.toFixed(2), "% DEPOSIT"))), seatMapRow(t) ? null : unavailable ? /* @__PURE__ */ import_react25.default.createElement("span", { className: "tf-checkout-tickets__soldout" }, t.soldOut ? tr("tickets.soldOut") : notStarted ? tr("tickets.salesNotStarted") : tr("tickets.salesEnded")) : /* @__PURE__ */ import_react25.default.createElement("div", { className: "tf-checkout-tickets__qty" }, t.isTable && /* @__PURE__ */ import_react25.default.createElement("span", { className: "tf-checkout-tickets__guests" }, tr("tickets.guests")), /* @__PURE__ */ import_react25.default.createElement(
7074
+ isFree ? tr("tickets.free") : money(sym, t.price)
7075
+ ), !isFree && !t.soldOut && /* @__PURE__ */ import_react25.default.createElement("span", { className: "tf-checkout-tickets__fees" }, tr("tickets.withFees", { price: money(sym, t.priceWithFees) })), t.depositPercent != null && /* @__PURE__ */ import_react25.default.createElement("span", { className: "tf-checkout-tickets__deposit" }, tr("tickets.deposit", { percent: t.depositPercent.toFixed(2) })))), seatMapRow(t) ? null : unavailable ? /* @__PURE__ */ import_react25.default.createElement("span", { className: "tf-checkout-tickets__soldout" }, t.soldOut ? tr("tickets.soldOut") : notStarted ? tr("tickets.salesNotStarted") : tr("tickets.salesEnded")) : /* @__PURE__ */ import_react25.default.createElement("div", { className: "tf-checkout-tickets__qty" }, t.isTable && /* @__PURE__ */ import_react25.default.createElement("span", { className: "tf-checkout-tickets__guests" }, tr("tickets.guests")), /* @__PURE__ */ import_react25.default.createElement(
6971
7076
  QuantitySelect,
6972
7077
  {
6973
7078
  value: (_a2 = qty[t.id]) != null ? _a2 : 0,
@@ -6996,7 +7101,7 @@ var Tickets = ({
6996
7101
  className: "tf-checkout-tickets__wl-toggle",
6997
7102
  onClick: () => setWlOpen((w) => ({ ...w, [t.id]: true }))
6998
7103
  },
6999
- "Join the waiting list"
7104
+ tr("tickets.joinWaitingList")
7000
7105
  ))));
7001
7106
  };
7002
7107
  const timeGroups = [];
@@ -7040,7 +7145,7 @@ var Tickets = ({
7040
7145
  className: "tf-checkout-tickets__promo-toggle",
7041
7146
  onClick: () => setPromoOpen(true)
7042
7147
  },
7043
- "Got a promo code? Click here"
7148
+ tr("tickets.gotPromoCode")
7044
7149
  ) : /* @__PURE__ */ import_react25.default.createElement(import_react25.default.Fragment, null, /* @__PURE__ */ import_react25.default.createElement(FieldRow, null, /* @__PURE__ */ import_react25.default.createElement(Field, null, /* @__PURE__ */ import_react25.default.createElement(
7045
7150
  Input,
7046
7151
  {
@@ -8743,7 +8848,7 @@ var Payment = ({
8743
8848
  label: /* @__PURE__ */ import_react33.default.createElement(import_react33.default.Fragment, null, /* @__PURE__ */ import_react33.default.createElement("span", { dangerouslySetInnerHTML: { __html: c.content || c.name } }), c.isRequired && " *")
8744
8849
  }
8745
8850
  ),
8746
- invalid && /* @__PURE__ */ import_react33.default.createElement("div", { className: "tf-checkout-consent__error" }, "You must accept this condition to continue.")
8851
+ invalid && /* @__PURE__ */ import_react33.default.createElement("div", { className: "tf-checkout-consent__error" }, t("payment.conditionRequired"))
8747
8852
  );
8748
8853
  })), /* @__PURE__ */ import_react33.default.createElement(OrderSummary, { eventId }), /* @__PURE__ */ import_react33.default.createElement("div", { className: "tf-checkout-payment__cta" }, /* @__PURE__ */ import_react33.default.createElement(
8749
8854
  Button,
@@ -8759,14 +8864,15 @@ var Payment = ({
8759
8864
  // src/sections/IDVerification.tsx
8760
8865
  var import_react34 = __toESM(require("react"));
8761
8866
  var MESSAGE = {
8762
- idle: "To complete the purchase, please verify your identity.",
8763
- starting: "Opening the verification page\u2026",
8764
- polling: "Waiting for verification to complete in the other tab\u2026",
8765
- verified: "Identity verified \u2014 your tickets are on their way.",
8766
- timeout: "Still not confirmed. Finish in the other tab, then check again.",
8767
- error: "We couldn\u2019t reach the verification service. Try again."
8867
+ idle: "verification.idle",
8868
+ starting: "verification.starting",
8869
+ polling: "verification.polling",
8870
+ verified: "verification.verified",
8871
+ timeout: "verification.timeoutCheckAgain",
8872
+ error: "verification.error"
8768
8873
  };
8769
8874
  var IDVerification = ({ className }) => {
8875
+ const t = useT();
8770
8876
  const checkout = useCheckoutContext();
8771
8877
  const order = checkout.order;
8772
8878
  const [phase, setPhase] = (0, import_react34.useState)("idle");
@@ -8787,7 +8893,7 @@ var IDVerification = ({ className }) => {
8787
8893
  setError(errorMessage(e));
8788
8894
  });
8789
8895
  };
8790
- return /* @__PURE__ */ import_react34.default.createElement(Card, { className: cx("tf-checkout-idverify", className) }, /* @__PURE__ */ import_react34.default.createElement(SectionHeader, { title: "Account Verification" }), /* @__PURE__ */ import_react34.default.createElement("p", { className: cx("tf-checkout-note", done && "tf-checkout-idverify__done") }, MESSAGE[phase]), !done && /* @__PURE__ */ import_react34.default.createElement(Button, { block: true, onClick: run, loading: running, disabled: running }, phase === "idle" ? "Verify" : running ? "Verifying\u2026" : "Check again"), error && /* @__PURE__ */ import_react34.default.createElement("p", { className: "tf-checkout-error-text" }, error));
8896
+ return /* @__PURE__ */ import_react34.default.createElement(Card, { className: cx("tf-checkout-idverify", className) }, /* @__PURE__ */ import_react34.default.createElement(SectionHeader, { title: t("verification.title") }), /* @__PURE__ */ import_react34.default.createElement("p", { className: cx("tf-checkout-note", done && "tf-checkout-idverify__done") }, t(MESSAGE[phase])), !done && /* @__PURE__ */ import_react34.default.createElement(Button, { block: true, onClick: run, loading: running, disabled: running }, phase === "idle" ? t("verification.verify") : running ? t("verification.verifying") : t("verification.checkAgain")), error && /* @__PURE__ */ import_react34.default.createElement("p", { className: "tf-checkout-error-text" }, error));
8791
8897
  };
8792
8898
 
8793
8899
  // src/sections/Confirmation.tsx
@@ -8841,14 +8947,14 @@ var Confirmation = ({
8841
8947
  target: "_blank",
8842
8948
  rel: "noopener noreferrer"
8843
8949
  },
8844
- "View payment voucher"
8950
+ t("confirmation.viewVoucher")
8845
8951
  ), viewOrderUrl && /* @__PURE__ */ import_react35.default.createElement(
8846
8952
  "a",
8847
8953
  {
8848
8954
  className: "tf-checkout-button tf-checkout-button--secondary tf-checkout-button--block",
8849
8955
  href: viewOrderUrl
8850
8956
  },
8851
- "View my tickets"
8957
+ t("confirmation.viewTickets")
8852
8958
  ), children, !pending && url && /* @__PURE__ */ import_react35.default.createElement("div", { className: "tf-checkout-confirmation__share" }, /* @__PURE__ */ import_react35.default.createElement("strong", null, t("referral.cheaperOrFree")), /* @__PURE__ */ import_react35.default.createElement("p", { className: "tf-checkout-note" }, "Invite friends with your link. When they buy, you get rewarded."), /* @__PURE__ */ import_react35.default.createElement("div", { className: "tf-checkout-confirmation__share-link" }, /* @__PURE__ */ import_react35.default.createElement("input", { className: "tf-checkout-input", readOnly: true, value: url }), /* @__PURE__ */ import_react35.default.createElement(Button, { variant: "secondary", onClick: copy }, copied ? t("referral.copied") : t("referral.copyLink"))), /* @__PURE__ */ import_react35.default.createElement("div", { className: "tf-checkout-confirmation__socials" }, shares.map((s) => /* @__PURE__ */ import_react35.default.createElement(
8853
8959
  "a",
8854
8960
  {
@@ -8871,9 +8977,10 @@ var attributesOf = (response) => {
8871
8977
  if (data && typeof data === "object") return data;
8872
8978
  return response;
8873
8979
  };
8980
+ var MISSING_REFERENCE = "\0missing-reference";
8874
8981
  var OrderConfirmation = ({
8875
8982
  orderHash,
8876
- title = "Your order has been confirmed!",
8983
+ title,
8877
8984
  message,
8878
8985
  helper,
8879
8986
  eventTitle,
@@ -8887,6 +8994,7 @@ var OrderConfirmation = ({
8887
8994
  className
8888
8995
  }) => {
8889
8996
  var _a, _b, _c, _d;
8997
+ const t = useT();
8890
8998
  const [data, setData] = (0, import_react36.useState)(null);
8891
8999
  const [failure, setFailure] = (0, import_react36.useState)("");
8892
9000
  const [copied, setCopied] = (0, import_react36.useState)(false);
@@ -8898,7 +9006,7 @@ var OrderConfirmation = ({
8898
9006
  }, [onError, onLoaded]);
8899
9007
  (0, import_react36.useEffect)(() => {
8900
9008
  if (!orderHash) {
8901
- setFailure("The order reference is missing.");
9009
+ setFailure(MISSING_REFERENCE);
8902
9010
  return;
8903
9011
  }
8904
9012
  let active = true;
@@ -8923,7 +9031,7 @@ var OrderConfirmation = ({
8923
9031
  };
8924
9032
  }, [orderHash]);
8925
9033
  if (failure) {
8926
- return /* @__PURE__ */ import_react36.default.createElement("div", { className: cx("confirmation-page tf-checkout-confirmation-page", className) }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "tf-checkout-auth__alert", role: "alert" }, failure));
9034
+ return /* @__PURE__ */ import_react36.default.createElement("div", { className: cx("confirmation-page tf-checkout-confirmation-page", className) }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "tf-checkout-auth__alert", role: "alert" }, failure === MISSING_REFERENCE ? t("confirmation.missingReference") : failure));
8927
9035
  }
8928
9036
  if (!data) {
8929
9037
  return /* @__PURE__ */ import_react36.default.createElement("div", { className: "tf-checkout-confirmation-page__loading" }, /* @__PURE__ */ import_react36.default.createElement(Loader, { className: "tf-checkout-loader--page" }));
@@ -8939,14 +9047,14 @@ var OrderConfirmation = ({
8939
9047
  const pricing = [
8940
9048
  ...Number.isFinite(currentPrice) ? [
8941
9049
  {
8942
- label: "Your ticket is currently",
9050
+ label: t("referral.currentPrice"),
8943
9051
  price: `${symbol}${currentPrice.toFixed(2)}`
8944
9052
  }
8945
9053
  ] : [],
8946
9054
  ...sales.map((sale) => ({
8947
- label: `If your friends buy ${sale.sales} tickets`,
8948
- subLabel: Number(sale.price) === 0 ? "Your ticket becomes" : "Your ticket goes down to",
8949
- price: Number(sale.price) === 0 ? "FREE!" : `${symbol}${Number(sale.price).toFixed(2)}`
9055
+ label: t("referral.ifFriendsBuy", { count: sale.sales }),
9056
+ subLabel: Number(sale.price) === 0 ? t("referral.becomes") : t("referral.goesDownTo"),
9057
+ price: Number(sale.price) === 0 ? t("referral.titleFree") : `${symbol}${Number(sale.price).toFixed(2)}`
8950
9058
  }))
8951
9059
  ];
8952
9060
  const copy = () => {
@@ -8956,20 +9064,20 @@ var OrderConfirmation = ({
8956
9064
  window.setTimeout(() => setCopied(false), 1500);
8957
9065
  });
8958
9066
  };
8959
- return /* @__PURE__ */ import_react36.default.createElement("div", { className: cx("confirmation-page tf-checkout-confirmation-page", className) }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "header-container" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "header-product-text" }, /* @__PURE__ */ import_react36.default.createElement("p", { className: "title" }, title), (eventTitle || eventDate || eventLocation) && /* @__PURE__ */ import_react36.default.createElement("div", { className: "event-details" }, eventTitle && /* @__PURE__ */ import_react36.default.createElement("div", { className: "event-title" }, eventTitle), eventDate && /* @__PURE__ */ import_react36.default.createElement("div", { className: "event-date" }, eventDate), eventLocation && /* @__PURE__ */ import_react36.default.createElement("div", { className: "event-location" }, eventLocation)), /* @__PURE__ */ import_react36.default.createElement("div", { className: "share-message-section" }, customReplacement ? /* @__PURE__ */ import_react36.default.createElement("div", { dangerouslySetInnerHTML: { __html: customText } }) : /* @__PURE__ */ import_react36.default.createElement(import_react36.default.Fragment, null, /* @__PURE__ */ import_react36.default.createElement("span", { className: "main" }, attachTickets ? "Your tickets have been emailed to you" : message != null ? message : "Your tickets are available in My Tickets."), /* @__PURE__ */ import_react36.default.createElement("span", { className: "helper" }, attachTickets ? "Please bring them with you to the event" : helper))))), customText && !customReplacement && /* @__PURE__ */ import_react36.default.createElement(
9067
+ return /* @__PURE__ */ import_react36.default.createElement("div", { className: cx("confirmation-page tf-checkout-confirmation-page", className) }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "header-container" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "header-product-text" }, /* @__PURE__ */ import_react36.default.createElement("p", { className: "title" }, title != null ? title : t("confirmation.orderConfirmed")), (eventTitle || eventDate || eventLocation) && /* @__PURE__ */ import_react36.default.createElement("div", { className: "event-details" }, eventTitle && /* @__PURE__ */ import_react36.default.createElement("div", { className: "event-title" }, eventTitle), eventDate && /* @__PURE__ */ import_react36.default.createElement("div", { className: "event-date" }, eventDate), eventLocation && /* @__PURE__ */ import_react36.default.createElement("div", { className: "event-location" }, eventLocation)), /* @__PURE__ */ import_react36.default.createElement("div", { className: "share-message-section" }, customReplacement ? /* @__PURE__ */ import_react36.default.createElement("div", { dangerouslySetInnerHTML: { __html: customText } }) : /* @__PURE__ */ import_react36.default.createElement(import_react36.default.Fragment, null, /* @__PURE__ */ import_react36.default.createElement("span", { className: "main" }, attachTickets ? t("confirmation.emailed") : message != null ? message : t("confirmation.inMyTickets")), /* @__PURE__ */ import_react36.default.createElement("span", { className: "helper" }, attachTickets ? t("confirmation.bringThem") : helper))))), customText && !customReplacement && /* @__PURE__ */ import_react36.default.createElement(
8960
9068
  "div",
8961
9069
  {
8962
9070
  className: "custom-confirmation-page-text tf-checkout-confirmation-page__custom",
8963
9071
  dangerouslySetInnerHTML: { __html: customText }
8964
9072
  }
8965
- ), orderUrl && /* @__PURE__ */ import_react36.default.createElement("div", { className: "order-details-button-container" }, /* @__PURE__ */ import_react36.default.createElement("a", { className: "view-order-button", href: orderUrl }, "View Order")), showReferral && data.disable_referral === false && shareUrl && /* @__PURE__ */ import_react36.default.createElement(import_react36.default.Fragment, null, /* @__PURE__ */ import_react36.default.createElement("div", { className: "referral_text_image_section" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "referral_text_section" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "referral_title_text" }, "Your ticket can become", /* @__PURE__ */ import_react36.default.createElement("span", { className: "strong-text" }, " cheaper "), "or even", /* @__PURE__ */ import_react36.default.createElement("span", { className: "strong-text" }, " FREE!")), /* @__PURE__ */ import_react36.default.createElement("div", { className: "referral_text" }, /* @__PURE__ */ import_react36.default.createElement("span", { className: "strong-text" }, "Invite friends "), "and we'll refund up to", /* @__PURE__ */ import_react36.default.createElement("span", { className: "strong-text" }, " 100% "), "of your ticket money, if they buy tickets as well!"))), /* @__PURE__ */ import_react36.default.createElement("div", { className: "share_wrapper" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "share_section" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "invitation_section" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "invitation_title" }, "How do you invite your friends?"), /* @__PURE__ */ import_react36.default.createElement("div", { className: "share_buttons" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "share-by-link" }, /* @__PURE__ */ import_react36.default.createElement("h5", { className: "share-by-link label" }, "Send them this link:"), /* @__PURE__ */ import_react36.default.createElement("div", { className: "share-btn-inner" }, /* @__PURE__ */ import_react36.default.createElement("input", { className: "share-input", readOnly: true, value: shareUrl }), /* @__PURE__ */ import_react36.default.createElement(
9073
+ ), orderUrl && /* @__PURE__ */ import_react36.default.createElement("div", { className: "order-details-button-container" }, /* @__PURE__ */ import_react36.default.createElement("a", { className: "view-order-button", href: orderUrl }, t("confirmation.viewOrder"))), showReferral && data.disable_referral === false && shareUrl && /* @__PURE__ */ import_react36.default.createElement(import_react36.default.Fragment, null, /* @__PURE__ */ import_react36.default.createElement("div", { className: "referral_text_image_section" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "referral_text_section" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "referral_title_text" }, t("referral.titleStart"), /* @__PURE__ */ import_react36.default.createElement("span", { className: "strong-text" }, " ", t("referral.titleCheaper"), " "), t("referral.titleOr"), /* @__PURE__ */ import_react36.default.createElement("span", { className: "strong-text" }, " ", t("referral.titleFree"))), /* @__PURE__ */ import_react36.default.createElement("div", { className: "referral_text" }, /* @__PURE__ */ import_react36.default.createElement("span", { className: "strong-text" }, t("referral.inviteFriends"), " "), t("referral.inviteMiddle"), /* @__PURE__ */ import_react36.default.createElement("span", { className: "strong-text" }, " 100% "), t("referral.inviteEnd")))), /* @__PURE__ */ import_react36.default.createElement("div", { className: "share_wrapper" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "share_section" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "invitation_section" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "invitation_title" }, t("referral.howToInvite")), /* @__PURE__ */ import_react36.default.createElement("div", { className: "share_buttons" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "share-by-link" }, /* @__PURE__ */ import_react36.default.createElement("h5", { className: "share-by-link label" }, t("referral.sendThisLink")), /* @__PURE__ */ import_react36.default.createElement("div", { className: "share-btn-inner" }, /* @__PURE__ */ import_react36.default.createElement("input", { className: "share-input", readOnly: true, value: shareUrl }), /* @__PURE__ */ import_react36.default.createElement(
8966
9074
  "button",
8967
9075
  {
8968
9076
  className: "share-by-link-copy-icon",
8969
9077
  type: "button",
8970
9078
  onClick: copy
8971
9079
  },
8972
- /* @__PURE__ */ import_react36.default.createElement("span", { className: "copy-icon" }, copied ? "Copied!" : "Copy")
9080
+ /* @__PURE__ */ import_react36.default.createElement("span", { className: "copy-icon" }, copied ? t("referral.copied") : t("referral.copy"))
8973
9081
  ))), showShareButtons && /* @__PURE__ */ import_react36.default.createElement("div", { className: "social-media-btns" }, /* @__PURE__ */ import_react36.default.createElement(
8974
9082
  "a",
8975
9083
  {
@@ -8990,31 +9098,33 @@ var OrderConfirmation = ({
8990
9098
  rel: "noopener noreferrer"
8991
9099
  },
8992
9100
  "WhatsApp"
8993
- ))))), pricing.length > 0 && /* @__PURE__ */ import_react36.default.createElement("div", { className: "pricing-section" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "invitation_title" }, "How much cheaper?"), pricing.map((item, index) => /* @__PURE__ */ import_react36.default.createElement("div", { className: "pricing-section_wrapper", key: `${item.label}-${index}` }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "pricing-section_label" }, item.label, item.subLabel && /* @__PURE__ */ import_react36.default.createElement("div", { className: "pricing-section_sublabel" }, item.subLabel)), /* @__PURE__ */ import_react36.default.createElement("div", { className: "pricing-section_price" }, item.price)))))));
9101
+ ))))), pricing.length > 0 && /* @__PURE__ */ import_react36.default.createElement("div", { className: "pricing-section" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "invitation_title" }, t("referral.howMuchCheaper")), pricing.map((item, index) => /* @__PURE__ */ import_react36.default.createElement("div", { className: "pricing-section_wrapper", key: `${item.label}-${index}` }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "pricing-section_label" }, item.label, item.subLabel && /* @__PURE__ */ import_react36.default.createElement("div", { className: "pricing-section_sublabel" }, item.subLabel)), /* @__PURE__ */ import_react36.default.createElement("div", { className: "pricing-section_price" }, item.price)))))));
8994
9102
  };
8995
9103
 
8996
9104
  // src/sections/OrderIDVerification.tsx
8997
9105
  var import_react37 = __toESM(require("react"));
8998
9106
  var PHASE_MESSAGE = {
8999
- checking: "Checking your verification status\u2026",
9000
- idle: "To complete the purchase, please verify your identity.",
9001
- starting: "Opening the verification page\u2026",
9002
- polling: "Waiting for verification to complete in the other tab\u2026",
9003
- verified: "Identity verified \u2014 your tickets are on their way.",
9004
- timeout: "Verification is taking longer than usual. Your payment is safe.",
9005
- error: "We couldn\u2019t reach the verification service. Try again."
9006
- };
9107
+ checking: "verification.checking",
9108
+ idle: "verification.idle",
9109
+ starting: "verification.starting",
9110
+ polling: "verification.polling",
9111
+ verified: "verification.verified",
9112
+ timeout: "verification.timeoutSafe",
9113
+ error: "verification.error"
9114
+ };
9115
+ var MISSING_REFERENCE2 = "\0missing-reference";
9007
9116
  var OrderIDVerification = ({
9008
9117
  orderHash,
9009
9118
  onVerified,
9010
9119
  className
9011
9120
  }) => {
9121
+ const t = useT();
9012
9122
  const [phase, setPhase] = (0, import_react37.useState)("checking");
9013
9123
  const [failure, setFailure] = (0, import_react37.useState)("");
9014
9124
  (0, import_react37.useEffect)(() => {
9015
9125
  if (!orderHash) {
9016
9126
  setPhase("error");
9017
- setFailure("The order reference is missing.");
9127
+ setFailure(MISSING_REFERENCE2);
9018
9128
  return;
9019
9129
  }
9020
9130
  let active = true;
@@ -9067,7 +9177,7 @@ var OrderIDVerification = ({
9067
9177
  }
9068
9178
  );
9069
9179
  };
9070
- return /* @__PURE__ */ import_react37.default.createElement(Card, { className: cx("tf-checkout-idverify", className) }, /* @__PURE__ */ import_react37.default.createElement(SectionHeader, { title: "Account Verification" }), /* @__PURE__ */ import_react37.default.createElement(
9180
+ return /* @__PURE__ */ import_react37.default.createElement(Card, { className: cx("tf-checkout-idverify", className) }, /* @__PURE__ */ import_react37.default.createElement(SectionHeader, { title: t("verification.title") }), /* @__PURE__ */ import_react37.default.createElement(
9071
9181
  "p",
9072
9182
  {
9073
9183
  className: cx(
@@ -9075,8 +9185,8 @@ var OrderIDVerification = ({
9075
9185
  phase === "verified" && "tf-checkout-idverify__done"
9076
9186
  )
9077
9187
  },
9078
- failure || PHASE_MESSAGE[phase]
9079
- ), phase !== "verified" && orderHash && /* @__PURE__ */ import_react37.default.createElement(Button, { block: true, onClick: run, loading: running, disabled: running || !orderHash }, phase === "idle" ? "Verify" : running ? "Verifying\u2026" : "Try again"));
9188
+ failure === MISSING_REFERENCE2 ? t("confirmation.missingReference") : failure || t(PHASE_MESSAGE[phase])
9189
+ ), phase !== "verified" && orderHash && /* @__PURE__ */ import_react37.default.createElement(Button, { block: true, onClick: run, loading: running, disabled: running || !orderHash }, phase === "idle" ? t("verification.verify") : running ? t("verification.verifying") : t("verification.tryAgain")));
9080
9190
  };
9081
9191
 
9082
9192
  // src/EmbeddedCheckout.tsx
@@ -9104,6 +9214,7 @@ var Flow = ({
9104
9214
  showTestCardHint
9105
9215
  }) => {
9106
9216
  var _a;
9217
+ const t = useT();
9107
9218
  const checkout = useCheckoutContext();
9108
9219
  const [view, setView] = (0, import_react38.useState)(initialView);
9109
9220
  const [selectionView, setSelectionView] = (0, import_react38.useState)(initialView);
@@ -9230,7 +9341,7 @@ var Flow = ({
9230
9341
  key: authRequest.key,
9231
9342
  open: true,
9232
9343
  initialEmail: authRequest.email,
9233
- message: authRequest.email ? "This email already has an account. Log in to autofill your checkout details." : void 0,
9344
+ message: authRequest.email ? t("auth.existingAccount") : void 0,
9234
9345
  allowRegistration: auth == null ? void 0 : auth.allowRegistration,
9235
9346
  allowPasswordReset: auth == null ? void 0 : auth.allowPasswordReset,
9236
9347
  requireRegistrationAddress: auth == null ? void 0 : auth.requireRegistrationAddress,