tf-checkout-react-native 2.0.0-beta.19 → 2.0.0-beta.21

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.mjs CHANGED
@@ -2447,7 +2447,14 @@ import { useEffect as useEffect22, useRef as useRef27, useState as useState29 }
2447
2447
  import { useEffect as useEffect23, useRef as useRef28, useState as useState30 } from "react";
2448
2448
  import { useQueryClient as useQueryClient15 } from "@tanstack/react-query";
2449
2449
  import { useQueryClient as useQueryClient16 } from "@tanstack/react-query";
2450
- import { useCallback as useCallback14, useEffect as useEffect24, useMemo as useMemo16, useSyncExternalStore as useSyncExternalStore20 } from "react";
2450
+ import {
2451
+ useCallback as useCallback14,
2452
+ useEffect as useEffect24,
2453
+ useLayoutEffect as useLayoutEffect4,
2454
+ useMemo as useMemo16,
2455
+ useRef as useRef29,
2456
+ useSyncExternalStore as useSyncExternalStore20
2457
+ } from "react";
2451
2458
  var __defProp = Object.defineProperty;
2452
2459
  var __export = (target, all) => {
2453
2460
  for (var name in all)
@@ -5785,7 +5792,7 @@ var tripStatus = (status, locale) => {
5785
5792
  };
5786
5793
  var isEventTrip = (data) => "event" in data;
5787
5794
  var brandingLines = (identities = []) => identities.map(
5788
- (identity) => [...new Set([identity.brand_name, identity.platform_name].filter(Boolean))].join(
5795
+ (identity2) => [...new Set([identity2.brand_name, identity2.platform_name].filter(Boolean))].join(
5789
5796
  " \xB7 "
5790
5797
  )
5791
5798
  ).filter(Boolean);
@@ -6822,16 +6829,20 @@ var mapOption = (o) => {
6822
6829
  requiresSignIn: o.requiresSignIn === true || o.requires_sign_in === true
6823
6830
  };
6824
6831
  };
6832
+ var waitlistId = (value6) => typeof value6 === "string" && /^[1-9]\d*$/.test(value6) ? value6 : typeof value6 === "number" && Number.isSafeInteger(value6) && value6 > 0 ? String(value6) : null;
6825
6833
  var mapWaitlist = (w) => {
6826
- var _a2, _b, _c, _d;
6834
+ const ticketTypeId = waitlistId(w.ticketTypeId);
6835
+ if (!ticketTypeId || typeof w.name !== "string" || !w.name.trim()) return null;
6836
+ if (w.entry === null) return { ticketTypeId, name: w.name, entry: null };
6837
+ if (!w.entry || typeof w.entry !== "object" || Array.isArray(w.entry)) return null;
6838
+ const id2 = waitlistId(w.entry.id);
6839
+ const { status, offerExpiresAt } = w.entry;
6840
+ if (!id2 || !["waiting", "offered"].includes(status) || offerExpiresAt !== void 0 && offerExpiresAt !== null && typeof offerExpiresAt !== "string")
6841
+ return null;
6827
6842
  return {
6828
- ticketTypeId: String((_a2 = w.ticketTypeId) != null ? _a2 : ""),
6829
- name: String((_b = w.name) != null ? _b : ""),
6830
- entry: w.entry && typeof w.entry === "object" ? {
6831
- id: String((_c = w.entry.id) != null ? _c : ""),
6832
- status: String((_d = w.entry.status) != null ? _d : ""),
6833
- offerExpiresAt: text3(w.entry.offerExpiresAt)
6834
- } : null
6843
+ ticketTypeId,
6844
+ name: w.name,
6845
+ entry: { id: id2, status, offerExpiresAt: text3(offerExpiresAt) }
6835
6846
  };
6836
6847
  };
6837
6848
  var list = (value6) => Array.isArray(value6) ? value6.filter((v) => v && typeof v === "object") : [];
@@ -6851,7 +6862,7 @@ var ticketChangeOptionsFromResponse = (body3) => {
6851
6862
  closesAt: text3((_d = a.cutoff) == null ? void 0 : _d.closesAt)
6852
6863
  },
6853
6864
  options,
6854
- waitlistOptions: list(a.waitlistOptions).map(mapWaitlist),
6865
+ waitlistOptions: list(a.waitlistOptions).map(mapWaitlist).filter((option) => option !== null),
6855
6866
  sellInstead: {
6856
6867
  available: Boolean((_e = a.sellInstead) == null ? void 0 : _e.available) && Boolean((_f = a.sellInstead) == null ? void 0 : _f.url),
6857
6868
  url: text3((_g = a.sellInstead) == null ? void 0 : _g.url)
@@ -8523,21 +8534,43 @@ var waitingListEntryFrom = (definition, draft) => {
8523
8534
  quantity
8524
8535
  };
8525
8536
  };
8537
+ var identity = (ticket) => {
8538
+ var _a2;
8539
+ return (_a2 = ticket.selectionKey) != null ? _a2 : ticket.id;
8540
+ };
8541
+ var ticketPriceContext = (scope, ticket) => {
8542
+ var _a2, _b;
8543
+ return JSON.stringify([
8544
+ scope,
8545
+ ticket.currency,
8546
+ (_a2 = ticket.timeSlot) == null ? void 0 : _a2.date,
8547
+ (_b = ticket.timeSlot) == null ? void 0 : _b.time,
8548
+ identity(ticket)
8549
+ ]);
8550
+ };
8526
8551
  var calendarTicketRows = (base, dated) => {
8527
- const ids = new Set(dated.map((ticket) => ticket.id));
8552
+ const ids = new Set(dated.map(identity));
8528
8553
  return [
8529
8554
  ...dated,
8530
- ...base.filter((ticket) => ticket.isRegularTicket === true && !ids.has(ticket.id))
8555
+ ...base.filter(
8556
+ (ticket) => ticket.isRegularTicket === true && !ids.has(identity(ticket))
8557
+ )
8531
8558
  ];
8532
8559
  };
8533
8560
  var catalogDate = (selected, dates) => {
8534
8561
  var _a2;
8535
8562
  return dates.includes(selected) ? selected : (_a2 = dates[0]) != null ? _a2 : "";
8536
8563
  };
8537
- var catalogQuantities = (previous, tickets) => {
8564
+ var catalogQuantities = (previous, tickets, previousTickets = tickets, dateChanged = false) => {
8565
+ var _a2;
8566
+ const retained = /* @__PURE__ */ new Map();
8567
+ for (const ticket of previousTickets) {
8568
+ if (dateChanged && ticket.timeSlot) continue;
8569
+ if (previous[ticket.id] > 0) retained.set(identity(ticket), previous[ticket.id]);
8570
+ }
8538
8571
  const next = {};
8539
8572
  for (const ticket of tickets) {
8540
- const quantity = previous[ticket.id];
8573
+ const quantity = (_a2 = retained.get(identity(ticket))) != null ? _a2 : 0;
8541
8574
  const range = ticketQuantityRange(ticket);
8542
8575
  if (quantity > 0 && !ticket.soldOut && ticket.salesStarted && !ticket.salesEnded && quantity >= range.min && quantity <= range.max && quantity % range.step === 0)
8543
8576
  next[ticket.id] = quantity;
@@ -9977,10 +10010,21 @@ var badgeOf = (raw) => {
9977
10010
  const text6 = typeof raw === "string" ? raw.trim() : "";
9978
10011
  return text6 || null;
9979
10012
  };
9980
- var mapTicket = (t) => {
10013
+ var eventCurrency = (raw) => {
10014
+ if (typeof raw === "string") return { currency: raw };
10015
+ if (!raw || typeof raw !== "object") return {};
10016
+ const value6 = raw;
10017
+ return {
10018
+ ...typeof value6.currency === "string" ? { currency: value6.currency } : {},
10019
+ ...typeof value6.symbol === "string" ? { priceSymbol: value6.symbol } : {}
10020
+ };
10021
+ };
10022
+ var selectionKey = (raw, eventId) => typeof raw === "string" && raw.trim() === raw && /^event:[1-9]\d*:ticket:[1-9]\d*$/.test(raw) && raw.startsWith(`event:${eventId}:ticket:`) ? raw : void 0;
10023
+ var mapTicket = (t, eventId) => {
9981
10024
  var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
9982
10025
  return {
9983
10026
  id: String(t.id),
10027
+ ...selectionKey(t.selectionKey, eventId) ? { selectionKey: selectionKey(t.selectionKey, eventId) } : {},
9984
10028
  isRegularTicket: typeof t.isRegularTicket === "boolean" ? t.isRegularTicket : void 0,
9985
10029
  name: (_a2 = t.displayName) != null ? _a2 : "",
9986
10030
  groupName: (_c = (_b = t.groupName) != null ? _b : t.group_name) != null ? _c : null,
@@ -10040,7 +10084,7 @@ var getEventDetails = async (eventId, language = "en") => {
10040
10084
  endDate: hideDate ? null : text6(a.endDate),
10041
10085
  formattedDate: hideDate ? "Date TBC" : String((_q = a.formattedDate) != null ? _q : ""),
10042
10086
  timezone: text6(a.timezone),
10043
- currency: String((_r = a.currency) != null ? _r : ""),
10087
+ currency: (_r = eventCurrency(a.currency).currency) != null ? _r : "",
10044
10088
  salesStart: text6(a.salesStart),
10045
10089
  salesEnd: text6(a.salesEnd),
10046
10090
  salesStarted: Boolean(a.salesStarted),
@@ -10065,7 +10109,7 @@ var getEventTickets = async (eventId) => {
10065
10109
  tfCatalogContext: true
10066
10110
  });
10067
10111
  const ticketsObj = (_c = (_b = (_a2 = body3 == null ? void 0 : body3.data) == null ? void 0 : _a2.attributes) == null ? void 0 : _b.tickets) != null ? _c : {};
10068
- return Object.values(ticketsObj).map(mapTicket);
10112
+ return Object.values(ticketsObj).map((ticket) => mapTicket(ticket, eventId));
10069
10113
  };
10070
10114
  var getEventInfo = async (eventId, pk) => {
10071
10115
  var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;
@@ -10081,6 +10125,7 @@ var getEventInfo = async (eventId, pk) => {
10081
10125
  const rawCountry = a.country;
10082
10126
  const countryCode = (_j = (_i = (_h = typeof rawCountry === "string" ? rawCountry : rawCountry == null ? void 0 : rawCountry.code) != null ? _h : a.countryCode) != null ? _i : a.country_code) != null ? _j : null;
10083
10127
  return {
10128
+ ...eventCurrency(a.currency),
10084
10129
  isSeatedEvent: isSeatedEvent(attributes6),
10085
10130
  tableMapEnabled: Boolean((_k = a.tableMapEnabled) != null ? _k : a.table_map_enabled),
10086
10131
  isTimeSlotEvent: Boolean(
@@ -10114,7 +10159,7 @@ var getEventConditions = async (eventId) => {
10114
10159
  }).filter((c) => c.content || c.name);
10115
10160
  };
10116
10161
  var getEventTimeSlotTickets = async (eventId, date, options) => {
10117
- var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
10162
+ var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z;
10118
10163
  await sdkSeatSessionHeaders(eventId);
10119
10164
  const body3 = await get(ENDPOINTS.events.timeSlotByDate(eventId), {
10120
10165
  tfCatalogContext: true,
@@ -10135,25 +10180,28 @@ var getEventTimeSlotTickets = async (eventId, date, options) => {
10135
10180
  const stock = Number((_h = (_g = s9.in_stock) != null ? _g : s9.real_stock) != null ? _h : 0);
10136
10181
  out.push({
10137
10182
  id: String(s9.matrix_record_id),
10183
+ ...selectionKey(s9.selectionKey, eventId) ? { selectionKey: selectionKey(s9.selectionKey, eventId) } : {},
10138
10184
  name: s9.display_name || s9.option_value || "Ticket",
10139
10185
  groupName: (_j = (_i = s9.group_name) != null ? _i : s9.groupName) != null ? _j : null,
10140
- optionName: String((_k = s9.option_key) != null ? _k : ""),
10141
- price: Number((_l = s9.base_price) != null ? _l : 0),
10142
- priceWithFees: Number((_n = (_m = s9.price_with_fees) != null ? _m : s9.base_price) != null ? _n : 0),
10143
- priceSymbol: (_p = (_o = s9.price_symbol) != null ? _o : s9.priceSymbol) != null ? _p : "",
10144
- currency: "",
10145
- feeIncluded: false,
10186
+ optionName: String((_l = (_k = s9.product_option_key) != null ? _k : s9.option_key) != null ? _l : ""),
10187
+ price: Number((_n = (_m = s9.display_price) != null ? _m : s9.base_price) != null ? _n : 0),
10188
+ priceWithFees: Number((_p = (_o = s9.price_with_fees) != null ? _o : s9.base_price) != null ? _p : 0),
10189
+ priceSymbol: (_r = (_q = s9.price_symbol) != null ? _q : s9.priceSymbol) != null ? _r : "",
10190
+ currency: (_s = s9.price_currency) != null ? _s : "",
10191
+ feeIncluded: s9.fee_included === true,
10146
10192
  depositPercent: s9.deposit_percent != null ? Number(s9.deposit_percent) : null,
10147
10193
  soldOut: Boolean(s9.sold_out) || stock <= 0,
10148
10194
  salesStarted: s9.sales_started != null ? Boolean(s9.sales_started) : true,
10149
10195
  salesEnded: Boolean(s9.sales_ended),
10150
- minQuantity: Number((_q = s9.min_quantity) != null ? _q : 1) || 1,
10151
- maxQuantity: Number((_r = s9.max_quantity) != null ? _r : 10) || 10,
10152
- multiplier: Number((_s = s9.multiplier) != null ? _s : 1) || 1,
10153
- isTable: Boolean(s9.is_table),
10154
- allowDirectPurchase: true,
10155
- descriptionRich: (_t = s9.description) != null ? _t : null,
10156
- badgeText: badgeOf((_u = s9.badge_text) != null ? _u : s9.badgeText),
10196
+ minQuantity: Number((_t = s9.min_quantity) != null ? _t : 1) || 1,
10197
+ maxQuantity: Number((_u = s9.max_quantity) != null ? _u : 10),
10198
+ multiplier: Number((_v = s9.multiplier) != null ? _v : 1) || 1,
10199
+ isTable: s9.x_is_table !== void 0 && s9.x_is_table !== null ? Number(s9.x_is_table) === 1 : Boolean(s9.is_table),
10200
+ minGuests: s9.min_guests === void 0 || s9.min_guests === null ? void 0 : Number(s9.min_guests),
10201
+ maxGuests: s9.max_guests === void 0 || s9.max_guests === null ? void 0 : Number(s9.max_guests),
10202
+ allowDirectPurchase: Number((_w = s9.allow_direct_purchase_for_seat_map) != null ? _w : 1) === 1,
10203
+ descriptionRich: (_y = (_x = s9.x_description_rich) != null ? _x : s9.description) != null ? _y : null,
10204
+ badgeText: badgeOf((_z = s9.badge_text) != null ? _z : s9.badgeText),
10157
10205
  timeSlot: { date: slotDate, time: timeKey }
10158
10206
  });
10159
10207
  }
@@ -10290,7 +10338,7 @@ var getEventTicketsWithMeta = async (eventId) => {
10290
10338
  const attrs = (_b = (_a2 = body3 == null ? void 0 : body3.data) == null ? void 0 : _a2.attributes) != null ? _b : {};
10291
10339
  const ticketsObj = (_c = attrs.tickets) != null ? _c : {};
10292
10340
  return {
10293
- tickets: Object.values(ticketsObj).map(mapTicket),
10341
+ tickets: Object.values(ticketsObj).map((ticket) => mapTicket(ticket, eventId)),
10294
10342
  promo: {
10295
10343
  isPromotionsEnabled: attrs.isPromotionsEnabled === true,
10296
10344
  isAccessCodeEnabled: attrs.is_access_code === true,
@@ -20074,15 +20122,15 @@ var useCheckoutImageField = ({
20074
20122
  value: value6,
20075
20123
  onChange,
20076
20124
  pick: pick3,
20077
- identity,
20125
+ identity: identity2,
20078
20126
  disabled = false
20079
20127
  }) => {
20080
20128
  const assertOwner = useSessionAction();
20081
20129
  const [busy, setBusy] = useState24(false);
20082
20130
  const [error, setError] = useState24(null);
20083
- const owner = useRef22({ identity, value: value6, disabled });
20084
- if (owner.current.identity !== identity || owner.current.value !== value6 || owner.current.disabled !== disabled)
20085
- owner.current = { identity, value: value6, disabled };
20131
+ const owner = useRef22({ identity: identity2, value: value6, disabled });
20132
+ if (owner.current.identity !== identity2 || owner.current.value !== value6 || owner.current.disabled !== disabled)
20133
+ owner.current = { identity: identity2, value: value6, disabled };
20086
20134
  const renderOwner = owner.current;
20087
20135
  const operation = useRef22(0);
20088
20136
  const inFlight = useRef22(false);
@@ -20100,7 +20148,7 @@ var useCheckoutImageField = ({
20100
20148
  inFlight.current = false;
20101
20149
  setBusy(false);
20102
20150
  setError(null);
20103
- }, [identity, value6, disabled]);
20151
+ }, [identity2, value6, disabled]);
20104
20152
  const select = async (picker = pick3) => {
20105
20153
  if (!mounted.current || owner.current !== renderOwner || !picker || disabled || inFlight.current)
20106
20154
  return;
@@ -21475,7 +21523,7 @@ var useTicketCatalog = (eventId, explicitDates) => {
21475
21523
  }
21476
21524
  };
21477
21525
  };
21478
- const [qty, updateQty] = useScopedState(subject, {});
21526
+ const [selection, updateSelection] = useScopedState(subject, { rows: EMPTY_TICKETS, date: "", quantities: {} });
21479
21527
  const [slotDate, updateDate] = useScopedState(subject, "");
21480
21528
  const [refreshing, setRefreshing] = useScopedState(subject, false);
21481
21529
  const eventQuery = useEvent(eventId);
@@ -21495,25 +21543,76 @@ var useTicketCatalog = (eventId, explicitDates) => {
21495
21543
  const base = (_b2 = (_a3 = ticketsQuery.data) == null ? void 0 : _a3.tickets) != null ? _b2 : EMPTY_TICKETS;
21496
21544
  if (!isTimeSlot)
21497
21545
  return { tickets: base, datedTickets: EMPTY_TICKETS, regularTickets: EMPTY_TICKETS };
21498
- const dated = (_c2 = slotQuery.data) != null ? _c2 : EMPTY_TICKETS;
21546
+ const currencies = [...new Set(base.map((ticket) => ticket.currency).filter(Boolean))];
21547
+ const currency = (eventInfo == null ? void 0 : eventInfo.currency) || (currencies.length === 1 ? currencies[0] : "");
21548
+ const symbols = [
21549
+ ...new Set(
21550
+ base.filter((ticket) => ticket.currency === currency).map((ticket) => ticket.priceSymbol).filter(Boolean)
21551
+ )
21552
+ ];
21553
+ const symbol = (eventInfo == null ? void 0 : eventInfo.priceSymbol) || (symbols.length === 1 ? symbols[0] : "");
21554
+ const dated = (slotQuery.isPlaceholderData ? EMPTY_TICKETS : (_c2 = slotQuery.data) != null ? _c2 : EMPTY_TICKETS).map((ticket) => ({
21555
+ ...ticket,
21556
+ currency: ticket.currency || currency,
21557
+ priceSymbol: ticket.priceSymbol || symbol
21558
+ }));
21499
21559
  const rows2 = calendarTicketRows(base, dated);
21500
21560
  return {
21501
21561
  tickets: rows2,
21502
21562
  datedTickets: dated,
21503
21563
  regularTickets: rows2.slice(dated.length)
21504
21564
  };
21505
- }, [eventInfo, explicitDates, isTimeSlot, (_b = ticketsQuery.data) == null ? void 0 : _b.tickets, slotQuery.data]);
21565
+ }, [
21566
+ eventInfo,
21567
+ explicitDates,
21568
+ isTimeSlot,
21569
+ (_b = ticketsQuery.data) == null ? void 0 : _b.tickets,
21570
+ slotQuery.data,
21571
+ slotQuery.isPlaceholderData
21572
+ ]);
21573
+ const liveCatalog = useRef29({ tickets, date: slotDate });
21574
+ useLayoutEffect4(() => {
21575
+ liveCatalog.current = { tickets, date: slotDate };
21576
+ }, [tickets, slotDate]);
21577
+ const qty = useMemo16(
21578
+ () => catalogQuantities(
21579
+ selection.quantities,
21580
+ tickets,
21581
+ selection.rows,
21582
+ selection.date !== slotDate
21583
+ ),
21584
+ [selection, tickets, slotDate]
21585
+ );
21506
21586
  useEffect24(() => {
21507
21587
  if (!current5()) return;
21508
21588
  const next = isTimeSlot ? catalogDate(slotDate, dates) : "";
21509
21589
  if (next !== slotDate) updateDate(next);
21510
- updateQty((previous) => catalogQuantities(previous, tickets));
21511
- }, [current5, isTimeSlot, slotDate, dates, tickets, updateDate, updateQty]);
21590
+ updateSelection((previous) => {
21591
+ const quantities = catalogQuantities(
21592
+ previous.quantities,
21593
+ tickets,
21594
+ previous.rows,
21595
+ previous.date !== slotDate
21596
+ );
21597
+ return previous.rows === tickets && previous.date === slotDate && quantities === previous.quantities ? previous : { rows: tickets, date: slotDate, quantities };
21598
+ });
21599
+ }, [current5, isTimeSlot, slotDate, dates, tickets, updateDate, updateSelection]);
21512
21600
  const setQty = useCallback14(
21513
21601
  (update) => {
21514
- if (current5()) updateQty(update);
21602
+ if (current5())
21603
+ updateSelection((previous) => {
21604
+ const { tickets: rows2, date } = liveCatalog.current;
21605
+ const quantities = catalogQuantities(
21606
+ previous.quantities,
21607
+ rows2,
21608
+ previous.rows,
21609
+ previous.date !== date
21610
+ );
21611
+ const requested = typeof update === "function" ? update(quantities) : update;
21612
+ return { rows: rows2, date, quantities: catalogQuantities(requested, rows2) };
21613
+ });
21515
21614
  },
21516
- [current5, updateQty]
21615
+ [current5, updateSelection]
21517
21616
  );
21518
21617
  const setSlotDate = useCallback14(
21519
21618
  (date) => {
@@ -23973,7 +24072,7 @@ var translateAccountMessage = (translate2, english, vars) => {
23973
24072
  import { useState as useState35 } from "react";
23974
24073
 
23975
24074
  // src/CardInput.tsx
23976
- import { useEffect as useEffect27, useRef as useRef29, useState as useState34 } from "react";
24075
+ import { useEffect as useEffect27, useRef as useRef30, useState as useState34 } from "react";
23977
24076
  import { Platform, StyleSheet as StyleSheet4 } from "react-native";
23978
24077
  import { CardField } from "@stripe/stripe-react-native";
23979
24078
 
@@ -24593,8 +24692,8 @@ var CardInput = ({
24593
24692
  }) => {
24594
24693
  const theme = useTheme();
24595
24694
  const [attachment, setAttachment] = useState34(0);
24596
- const handleRef = useRef29(null);
24597
- const visibleRef = useRef29(visible);
24695
+ const handleRef = useRef30(null);
24696
+ const visibleRef = useRef30(visible);
24598
24697
  visibleRef.current = visible;
24599
24698
  useEffect27(() => {
24600
24699
  const handle = cardFields.mount(
@@ -25416,7 +25515,7 @@ var useFieldStyles = (theme) => useMemo20(
25416
25515
  );
25417
25516
 
25418
25517
  // src/ui/Select.tsx
25419
- import { useCallback as useCallback16, useEffect as useEffect28, useMemo as useMemo21, useRef as useRef30, useState as useState37 } from "react";
25518
+ import { useCallback as useCallback16, useEffect as useEffect28, useMemo as useMemo21, useRef as useRef31, useState as useState37 } from "react";
25420
25519
  import { FlatList, Modal as Modal3, Pressable as Pressable4, StyleSheet as StyleSheet6, Text as Text5, View as View5 } from "react-native";
25421
25520
  import { Fragment, jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
25422
25521
  function Select({
@@ -25432,7 +25531,7 @@ function Select({
25432
25531
  const theme = useTheme();
25433
25532
  const s9 = useSelectStyles(theme);
25434
25533
  const [open, setOpen] = useState37(false);
25435
- const interaction = useRef30({ disabled, open: false, revision: 0 });
25534
+ const interaction = useRef31({ disabled, open: false, revision: 0 });
25436
25535
  interaction.current.disabled = disabled;
25437
25536
  const revision = interaction.current.revision;
25438
25537
  const close = useCallback16(() => {
@@ -26064,7 +26163,7 @@ import {
26064
26163
  Fragment as Fragment2,
26065
26164
  useEffect as useEffect29,
26066
26165
  useMemo as useMemo27,
26067
- useRef as useRef31,
26166
+ useRef as useRef32,
26068
26167
  useState as useState40
26069
26168
  } from "react";
26070
26169
  import { Pressable as Pressable8, StyleSheet as StyleSheet13, Text as Text11, View as View12 } from "react-native";
@@ -26244,7 +26343,7 @@ var Tickets = ({
26244
26343
  );
26245
26344
  const [promoOpen, setPromoOpen] = hooks_exports.useScopedState(catalog.scope, false);
26246
26345
  const [visibleDescription, setVisibleDescription] = useState40(null);
26247
- const attributionEvent = useRef31(null);
26346
+ const attributionEvent = useRef32(null);
26248
26347
  useEffect29(() => {
26249
26348
  var _a3;
26250
26349
  if (!catalogCurrent() || !catalog.attributionReady || attributionEvent.current === eventId)
@@ -26289,11 +26388,12 @@ var Tickets = ({
26289
26388
  }
26290
26389
  }).catch(() => void 0);
26291
26390
  };
26292
- const originals = useRef31({});
26391
+ const originals = useRef32({});
26293
26392
  useEffect29(() => {
26294
26393
  for (const t of tickets)
26295
- if (originals.current[t.id] == null) originals.current[t.id] = t.price;
26296
- }, [tickets]);
26394
+ if (originals.current[ticketPriceContext(catalog.scope, t)] == null)
26395
+ originals.current[ticketPriceContext(catalog.scope, t)] = t.price;
26396
+ }, [tickets, catalog.scope]);
26297
26397
  const selected = tickets.filter((t) => {
26298
26398
  var _a3;
26299
26399
  return ((_a3 = qty[t.id]) != null ? _a3 : 0) > 0;
@@ -26355,7 +26455,7 @@ var Tickets = ({
26355
26455
  var _a3, _b2;
26356
26456
  const notStarted = !t.salesStarted;
26357
26457
  const unavailable = t.soldOut || t.salesEnded || notStarted;
26358
- const original = originals.current[t.id];
26458
+ const original = originals.current[ticketPriceContext(catalog.scope, t)];
26359
26459
  const discounted = original != null && original > t.price;
26360
26460
  const isFree = Number(t.price) === 0;
26361
26461
  const sym = t.priceSymbol || t.currency;
@@ -26770,7 +26870,7 @@ var SeatsIoMap = ({ eventId, initial, onContinue }) => {
26770
26870
  };
26771
26871
 
26772
26872
  // src/sections/SeatMap.tsx
26773
- import { useEffect as useEffect30, useMemo as useMemo29, useRef as useRef32, useState as useState41 } from "react";
26873
+ import { useEffect as useEffect30, useMemo as useMemo29, useRef as useRef33, useState as useState41 } from "react";
26774
26874
  import { StyleSheet as StyleSheet14, Text as Text12, View as View14 } from "react-native";
26775
26875
  import { WebView as WebView3 } from "react-native-webview";
26776
26876
 
@@ -26786,7 +26886,7 @@ var SeatMap = ({ eventId, onContinue }) => {
26786
26886
  const theme = useTheme();
26787
26887
  const flow = hooks_exports.useSeatSelection(eventId, checkout, onContinue);
26788
26888
  const bundleStarting = hooks_exports.useBundleStarting(checkout.store);
26789
- const webview = useRef32(null);
26889
+ const webview = useRef33(null);
26790
26890
  const [rendererError, setRendererError] = useState41(false);
26791
26891
  const [size, setSize] = useState41(320);
26792
26892
  const properties = flow.chart.state === "ready" ? {
@@ -27623,7 +27723,7 @@ import {
27623
27723
  Fragment as Fragment10,
27624
27724
  useEffect as useEffect31,
27625
27725
  useMemo as useMemo32,
27626
- useRef as useRef33,
27726
+ useRef as useRef34,
27627
27727
  useState as useState44
27628
27728
  } from "react";
27629
27729
  import { Linking as Linking5, Pressable as Pressable10, StyleSheet as StyleSheet19, Text as Text16, View as View22 } from "react-native";
@@ -27801,35 +27901,35 @@ var PhoneIdentity = ({
27801
27901
  ...options
27802
27902
  }) => {
27803
27903
  var _a2;
27804
- const identity = hooks_exports.useCheckoutPhoneIdentity(options);
27904
+ const identity2 = hooks_exports.useCheckoutPhoneIdentity(options);
27805
27905
  const [code, setCode] = useState43("");
27806
27906
  const [emailInstead, setEmailInstead] = useState43(false);
27807
27907
  if (emailInstead) return null;
27808
- if (identity.challenge)
27908
+ if (identity2.challenge)
27809
27909
  return /* @__PURE__ */ jsx23(
27810
27910
  TwoFactorForm,
27811
27911
  {
27812
- loading: identity.busy,
27813
- error: identity.error,
27912
+ loading: identity2.busy,
27913
+ error: identity2.error,
27814
27914
  successMessage: "",
27815
- smsAvailable: identity.challenge.smsAvailable,
27816
- smsRetryAfter: identity.retryAfter,
27817
- onSubmit: identity.verifyTwoFactor,
27818
- onSendSms: identity.sendTwoFactorSms,
27819
- onCancel: identity.cancel
27915
+ smsAvailable: identity2.challenge.smsAvailable,
27916
+ smsRetryAfter: identity2.retryAfter,
27917
+ onSubmit: identity2.verifyTwoFactor,
27918
+ onSendSms: identity2.sendTwoFactorSms,
27919
+ onCancel: identity2.cancel
27820
27920
  }
27821
27921
  );
27822
27922
  return /* @__PURE__ */ jsxs20(View20, { style: { gap: 12, paddingVertical: 12 }, children: [
27823
27923
  /* @__PURE__ */ jsx23(Text15, { children: "Verify your phone to complete your details faster" }),
27824
- identity.error ? /* @__PURE__ */ jsx23(ErrorText, { children: identity.error }) : null,
27825
- identity.verified ? /* @__PURE__ */ jsxs20(Fragment9, { children: [
27924
+ identity2.error ? /* @__PURE__ */ jsx23(ErrorText, { children: identity2.error }) : null,
27925
+ identity2.verified ? /* @__PURE__ */ jsxs20(Fragment9, { children: [
27826
27926
  /* @__PURE__ */ jsx23(MutedText, { children: "Your phone is verified." }),
27827
- ((_a2 = identity.result) == null ? void 0 : _a2.prefill.has_known_email) === true && typeof identity.result.prefill.email_masked === "string" ? /* @__PURE__ */ jsx23(
27927
+ ((_a2 = identity2.result) == null ? void 0 : _a2.prefill.has_known_email) === true && typeof identity2.result.prefill.email_masked === "string" ? /* @__PURE__ */ jsx23(
27828
27928
  Checkbox,
27829
27929
  {
27830
27930
  checked: Boolean(knownEmailSelected),
27831
27931
  onChange: onUseKnownEmail,
27832
- label: `Send my tickets to ${identity.result.prefill.email_masked}`
27932
+ label: `Send my tickets to ${identity2.result.prefill.email_masked}`
27833
27933
  }
27834
27934
  ) : null
27835
27935
  ] }) : /* @__PURE__ */ jsxs20(Fragment9, { children: [
@@ -27837,14 +27937,14 @@ var PhoneIdentity = ({
27837
27937
  Input,
27838
27938
  {
27839
27939
  accessibilityLabel: "Mobile number",
27840
- value: identity.phone,
27841
- onChangeText: identity.setPhone,
27940
+ value: identity2.phone,
27941
+ onChangeText: identity2.setPhone,
27842
27942
  keyboardType: "phone-pad",
27843
27943
  autoComplete: "tel",
27844
- editable: !identity.busy && !identity.sent
27944
+ editable: !identity2.busy && !identity2.sent
27845
27945
  }
27846
27946
  ) }),
27847
- identity.sent ? /* @__PURE__ */ jsxs20(Fragment9, { children: [
27947
+ identity2.sent ? /* @__PURE__ */ jsxs20(Fragment9, { children: [
27848
27948
  /* @__PURE__ */ jsx23(Field, { label: "Verification code", children: /* @__PURE__ */ jsx23(
27849
27949
  Input,
27850
27950
  {
@@ -27855,15 +27955,15 @@ var PhoneIdentity = ({
27855
27955
  autoComplete: "one-time-code",
27856
27956
  maxLength: 6,
27857
27957
  accessibilityLabel: "Verification code",
27858
- editable: !identity.busy
27958
+ editable: !identity2.busy
27859
27959
  }
27860
27960
  ) }),
27861
27961
  /* @__PURE__ */ jsx23(
27862
27962
  Button,
27863
27963
  {
27864
- loading: identity.busy,
27964
+ loading: identity2.busy,
27865
27965
  disabled: !/^\d{6}$/.test(code),
27866
- onPress: () => void identity.verify(code),
27966
+ onPress: () => void identity2.verify(code),
27867
27967
  children: "Verify phone"
27868
27968
  }
27869
27969
  )
@@ -27871,30 +27971,30 @@ var PhoneIdentity = ({
27871
27971
  /* @__PURE__ */ jsx23(
27872
27972
  Button,
27873
27973
  {
27874
- disabled: identity.busy || identity.retryAfter > 0 || !identity.phone.trim(),
27875
- onPress: () => void identity.request("sms"),
27876
- children: identity.retryAfter > 0 ? `Send another code in ${identity.retryAfter}s` : "Send code by SMS"
27974
+ disabled: identity2.busy || identity2.retryAfter > 0 || !identity2.phone.trim(),
27975
+ onPress: () => void identity2.request("sms"),
27976
+ children: identity2.retryAfter > 0 ? `Send another code in ${identity2.retryAfter}s` : "Send code by SMS"
27877
27977
  }
27878
27978
  ),
27879
27979
  options.whatsappAvailable ? /* @__PURE__ */ jsx23(
27880
27980
  Button,
27881
27981
  {
27882
27982
  variant: "ghost",
27883
- disabled: identity.busy || identity.retryAfter > 0 || !identity.phone.trim(),
27884
- onPress: () => void identity.request("whatsapp"),
27983
+ disabled: identity2.busy || identity2.retryAfter > 0 || !identity2.phone.trim(),
27984
+ onPress: () => void identity2.request("whatsapp"),
27885
27985
  children: "Send code by WhatsApp"
27886
27986
  }
27887
27987
  ) : null
27888
27988
  ] }),
27889
- (identity.sent || identity.verified) && /* @__PURE__ */ jsx23(
27989
+ (identity2.sent || identity2.verified) && /* @__PURE__ */ jsx23(
27890
27990
  Button,
27891
27991
  {
27892
27992
  variant: "ghost",
27893
- disabled: identity.busy,
27993
+ disabled: identity2.busy,
27894
27994
  onPress: () => {
27895
27995
  setCode("");
27896
27996
  onReset();
27897
- void identity.cancel();
27997
+ void identity2.cancel();
27898
27998
  },
27899
27999
  children: "Change phone number"
27900
28000
  }
@@ -27903,9 +28003,9 @@ var PhoneIdentity = ({
27903
28003
  Button,
27904
28004
  {
27905
28005
  variant: "ghost",
27906
- disabled: identity.busy,
28006
+ disabled: identity2.busy,
27907
28007
  onPress: () => {
27908
- void identity.cancel().then(() => setEmailInstead(true));
28008
+ void identity2.cancel().then(() => setEmailInstead(true));
27909
28009
  },
27910
28010
  children: "Use email instead"
27911
28011
  }
@@ -28139,14 +28239,14 @@ var BillingInfo = ({
28139
28239
  (prev) => holderDraftsReloaded(prev, checkout.holders, checkout.backfilledHolderIndexes)
28140
28240
  );
28141
28241
  });
28142
- const restoredHolders = useRef33(checkout.holders);
28242
+ const restoredHolders = useRef34(checkout.holders);
28143
28243
  hooks_exports.useOnEventChange(checkout.eventId, () => {
28144
28244
  restoredHolders.current = [];
28145
28245
  setHolders([]);
28146
28246
  setDataCapture({});
28147
28247
  });
28148
- const profileSeeded = useRef33(false);
28149
- const countryDefaultApplied = useRef33(Boolean((_c = checkout.billing) == null ? void 0 : _c.countryId));
28248
+ const profileSeeded = useRef34(false);
28249
+ const countryDefaultApplied = useRef34(Boolean((_c = checkout.billing) == null ? void 0 : _c.countryId));
28150
28250
  const {
28151
28251
  setBilling: commitBilling,
28152
28252
  setHolders: commitHolders,
@@ -29138,11 +29238,11 @@ var Payment = ({
29138
29238
  };
29139
29239
 
29140
29240
  // src/sections/WaiverSigning.tsx
29141
- import { useMemo as useMemo35, useRef as useRef35, useState as useState47 } from "react";
29241
+ import { useMemo as useMemo35, useRef as useRef36, useState as useState47 } from "react";
29142
29242
  import { Pressable as Pressable12, ScrollView, StyleSheet as StyleSheet23, Text as Text19, View as View27 } from "react-native";
29143
29243
 
29144
29244
  // src/ui/SignaturePad.tsx
29145
- import { memo, useEffect as useEffect33, useMemo as useMemo34, useRef as useRef34, useState as useState46 } from "react";
29245
+ import { memo, useEffect as useEffect33, useMemo as useMemo34, useRef as useRef35, useState as useState46 } from "react";
29146
29246
  import { PanResponder, Pressable as Pressable11, StyleSheet as StyleSheet22, Text as Text18, View as View26 } from "react-native";
29147
29247
  import { Fragment as Fragment13, jsx as jsx30, jsxs as jsxs26 } from "react/jsx-runtime";
29148
29248
  var LINE_WIDTH = 2.5;
@@ -29188,13 +29288,13 @@ var SignaturePad = ({
29188
29288
  disabled
29189
29289
  }) => {
29190
29290
  const theme = useTheme();
29191
- const strokesRef = useRef34([]);
29291
+ const strokesRef = useRef35([]);
29192
29292
  const [, setFrame] = useState46(0);
29193
- const frameRequest = useRef34(null);
29194
- const size = useRef34({ width: 0, height: PAD_HEIGHT });
29195
- const report = useRef34(onChange);
29293
+ const frameRequest = useRef35(null);
29294
+ const size = useRef35({ width: 0, height: PAD_HEIGHT });
29295
+ const report = useRef35(onChange);
29196
29296
  report.current = onChange;
29197
- const disabledRef = useRef34(disabled);
29297
+ const disabledRef = useRef35(disabled);
29198
29298
  disabledRef.current = disabled;
29199
29299
  const render = () => {
29200
29300
  if (frameRequest.current !== null) cancelAnimationFrame(frameRequest.current);
@@ -29437,7 +29537,7 @@ var TicketForm = ({ ticket, consentText, t, methods, busy, locked = false, error
29437
29537
  const [problems, setProblems] = useState47([]);
29438
29538
  const [pressed, setPressed] = useState47(false);
29439
29539
  const frozen = busy || locked;
29440
- const draftRef = useRef35(draft);
29540
+ const draftRef = useRef36(draft);
29441
29541
  draftRef.current = draft;
29442
29542
  const patch2 = (next) => {
29443
29543
  if (!frozen) setDraft((d) => ({ ...d, ...next }));
@@ -30452,7 +30552,7 @@ var Trips = ({
30452
30552
  };
30453
30553
 
30454
30554
  // src/sections/EventDiscussionView.tsx
30455
- import { useRef as useRef37, useState as useState53 } from "react";
30555
+ import { useRef as useRef38, useState as useState53 } from "react";
30456
30556
  import {
30457
30557
  ActivityIndicator as ActivityIndicator4,
30458
30558
  Alert as Alert4,
@@ -30806,7 +30906,7 @@ var s = StyleSheet29.create({
30806
30906
  });
30807
30907
 
30808
30908
  // src/sections/discussion/SwipeReply.tsx
30809
- import { useMemo as useMemo39, useRef as useRef36 } from "react";
30909
+ import { useMemo as useMemo39, useRef as useRef37 } from "react";
30810
30910
  import { Animated, PanResponder as PanResponder2, StyleSheet as StyleSheet30, Text as Text23, View as View35 } from "react-native";
30811
30911
  import { jsx as jsx40, jsxs as jsxs36 } from "react/jsx-runtime";
30812
30912
  var SwipeReply = ({
@@ -30817,7 +30917,7 @@ var SwipeReply = ({
30817
30917
  children
30818
30918
  }) => {
30819
30919
  const theme = useTheme();
30820
- const offset = useRef36(new Animated.Value(0)).current;
30920
+ const offset = useRef37(new Animated.Value(0)).current;
30821
30921
  const gesture = useMemo39(() => {
30822
30922
  const reset = () => Animated.spring(offset, { toValue: 0, useNativeDriver: true }).start();
30823
30923
  return PanResponder2.create({
@@ -30898,8 +30998,8 @@ var EventDiscussionBody = ({
30898
30998
  var _a2, _b, _c;
30899
30999
  const theme = useTheme();
30900
31000
  const t = useAccountT(locale);
30901
- const list2 = useRef37(null);
30902
- const firstContent = useRef37(true);
31001
+ const list2 = useRef38(null);
31002
+ const firstContent = useRef38(true);
30903
31003
  const [actions, setActions] = useState53(null);
30904
31004
  const [reporting, setReporting] = useState53(null);
30905
31005
  const [moderating, setModerating] = useState53(null);
@@ -30908,7 +31008,7 @@ var EventDiscussionBody = ({
30908
31008
  const [pickerError, setPickerError] = useState53("");
30909
31009
  const [imageOpen, setImageOpen] = useState53(false);
30910
31010
  const [pickerBusy, setPickerBusy] = useState53(false);
30911
- const picking = useRef37(false);
31011
+ const picking = useRef38(false);
30912
31012
  const text6 = { color: theme.text, fontFamily: theme.fontFamily };
30913
31013
  const muted = { color: theme.muted, fontFamily: theme.fontFamily };
30914
31014
  const closeActions = (work) => {
@@ -31922,7 +32022,7 @@ var styles15 = StyleSheet32.create({
31922
32022
  });
31923
32023
 
31924
32024
  // src/sections/Streaming.tsx
31925
- import { useMemo as useMemo40, useRef as useRef38, useState as useState54 } from "react";
32025
+ import { useMemo as useMemo40, useRef as useRef39, useState as useState54 } from "react";
31926
32026
  import {
31927
32027
  ActivityIndicator as ActivityIndicator5,
31928
32028
  Alert as Alert6,
@@ -31957,7 +32057,7 @@ var StreamingView = ({
31957
32057
  );
31958
32058
  const session = hooks_exports.useAuthSession();
31959
32059
  const assertOwner = hooks_exports.useSessionAction();
31960
- const pendingBrowser = useRef38({ scope: session.sessionScope, locked: false });
32060
+ const pendingBrowser = useRef39({ scope: session.sessionScope, locked: false });
31961
32061
  const [stored, setStored] = useState54({
31962
32062
  scope: session.sessionScope,
31963
32063
  busy: false,
@@ -34060,7 +34160,7 @@ function AccountEmailEnrichment({
34060
34160
  }
34061
34161
 
34062
34162
  // src/auth/AuthModal.tsx
34063
- import { useCallback as useCallback17, useEffect as useEffect41, useRef as useRef39 } from "react";
34163
+ import { useCallback as useCallback17, useEffect as useEffect41, useRef as useRef40 } from "react";
34064
34164
  import { Image as Image8, Modal as Modal7, Pressable as Pressable26, ScrollView as ScrollView4, StyleSheet as StyleSheet42, Text as Text34, View as View55 } from "react-native";
34065
34165
  import { jsx as jsx60, jsxs as jsxs56 } from "react/jsx-runtime";
34066
34166
  var Tab = ({
@@ -34287,7 +34387,7 @@ var PhoneAccountModal = ({
34287
34387
  },
34288
34388
  onCancelled: onClose
34289
34389
  });
34290
- const prepared = useRef39(false);
34390
+ const prepared = useRef40(false);
34291
34391
  useEffect41(() => {
34292
34392
  if (prepared.current) return;
34293
34393
  prepared.current = true;
@@ -34450,7 +34550,7 @@ var styles21 = StyleSheet43.create({
34450
34550
  });
34451
34551
 
34452
34552
  // src/EmbeddedCheckout.tsx
34453
- import { useEffect as useEffect42, useRef as useRef40, useState as useState61 } from "react";
34553
+ import { useEffect as useEffect42, useRef as useRef41, useState as useState61 } from "react";
34454
34554
  import { Pressable as Pressable27, ScrollView as ScrollView5, StyleSheet as StyleSheet44, Text as Text36, View as View57 } from "react-native";
34455
34555
  import { Fragment as Fragment32, jsx as jsx62, jsxs as jsxs58 } from "react/jsx-runtime";
34456
34556
  var Flow = ({
@@ -34480,7 +34580,7 @@ var Flow = ({
34480
34580
  const theme = useTheme();
34481
34581
  const [view, setView] = useState61(initialView);
34482
34582
  const [selectionView, setSelectionView] = useState61(initialView);
34483
- const editedDetailsRef = useRef40(null);
34583
+ const editedDetailsRef = useRef41(null);
34484
34584
  const [authRequest, setAuthRequest] = useState61(
34485
34585
  null
34486
34586
  );
@@ -35180,6 +35280,7 @@ export {
35180
35280
  ticketConfirmerKey,
35181
35281
  ticketFieldsFor,
35182
35282
  ticketPaymentKeys,
35283
+ ticketPriceContext,
35183
35284
  ticketQuantityRange,
35184
35285
  ticketRefundConsequences,
35185
35286
  ticketTypesForTier,