@kotao/storefront 0.2.7 → 0.2.9

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.
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
  import { O as OfferTokenLocation, a as OfferTokenHistory } from './offer-token-C-nk_nj8.js';
4
- import { E as EventsClient, a as EventCheckoutSession, b as EventApprovalOfferResolution, P as PublicEvent, c as EventRegistrationSubmission } from './client-CwOPPpFF.js';
4
+ import { E as EventsClient, a as EventCheckoutSession, b as EventApprovalOfferResolution, P as PublicEvent, c as EventRegistrationSubmission } from './client-D-M3Y1ul.js';
5
5
  import './types-CSNXbGFW.js';
6
6
  import './http-types-CGh8WGHB.js';
7
7
 
@@ -122,8 +122,11 @@ var REGISTRATION_COPY = {
122
122
  function registrationCopy(locale) {
123
123
  return locale.toLowerCase().startsWith("de") ? REGISTRATION_COPY.de : REGISTRATION_COPY.en;
124
124
  }
125
- function selectable(ticket) {
126
- return ticket.salesState === "on_sale" && ticket.maxPerOrder >= ticket.minPerOrder && (ticket.available === null || ticket.available >= ticket.minPerOrder);
125
+ function selectable(ticket, registrationMode) {
126
+ return ticket.salesState === "on_sale" && ticket.maxPerOrder >= ticket.minPerOrder && (registrationMode === "approval_then_payment" || ticket.available === null || ticket.available >= ticket.minPerOrder);
127
+ }
128
+ function maximumQuantity(ticket, registrationMode) {
129
+ return registrationMode === "approval_then_payment" ? ticket.maxPerOrder : Math.min(ticket.maxPerOrder, ticket.available ?? ticket.maxPerOrder);
127
130
  }
128
131
  function EventRegistrationForm({
129
132
  event,
@@ -136,7 +139,7 @@ function EventRegistrationForm({
136
139
  className
137
140
  }) {
138
141
  const tickets = event.occurrences.flatMap((occurrence) => occurrence.ticketTypes);
139
- const firstTicket = tickets.find(selectable);
142
+ const firstTicket = tickets.find((candidate) => selectable(candidate, event.registrationMode));
140
143
  const [ticketTypeId, setTicketTypeId] = useState(firstTicket?.id ?? "");
141
144
  const ticket = tickets.find((candidate) => candidate.id === ticketTypeId);
142
145
  const initialQuantity = ticket?.minPerOrder ?? 1;
@@ -166,7 +169,7 @@ function EventRegistrationForm({
166
169
  const eventIdentity = `${event.id}:${event.handle}:${event.registrationMode}:${locale}`;
167
170
  if (previousEvent.current !== eventIdentity) {
168
171
  previousEvent.current = eventIdentity;
169
- const nextTicket = tickets.find(selectable);
172
+ const nextTicket = tickets.find((candidate) => selectable(candidate, event.registrationMode));
170
173
  setTicketTypeId(nextTicket?.id ?? "");
171
174
  setQuantity(nextTicket?.minPerOrder ?? 1);
172
175
  setEmail("");
@@ -200,7 +203,7 @@ function EventRegistrationForm({
200
203
  ]);
201
204
  function selectTicket(nextId) {
202
205
  const next = tickets.find((candidate) => candidate.id === nextId);
203
- if (!next || !selectable(next)) return;
206
+ if (!next || !selectable(next, event.registrationMode)) return;
204
207
  setTicketTypeId(nextId);
205
208
  setQuantity(next.minPerOrder);
206
209
  setBuyerAnswers({});
@@ -210,7 +213,7 @@ function EventRegistrationForm({
210
213
  }
211
214
  function updateQuantity(next) {
212
215
  if (!ticket) return;
213
- const maximum2 = Math.min(ticket.maxPerOrder, ticket.available ?? ticket.maxPerOrder);
216
+ const maximum2 = maximumQuantity(ticket, event.registrationMode);
214
217
  const normalized = Number.isFinite(next) ? Math.trunc(next) : ticket.minPerOrder;
215
218
  const bounded = Math.max(ticket.minPerOrder, Math.min(maximum2, normalized));
216
219
  setQuantity(bounded);
@@ -222,7 +225,7 @@ function EventRegistrationForm({
222
225
  }
223
226
  async function handleSubmit(submitEvent) {
224
227
  submitEvent.preventDefault();
225
- if (!ticket || !selectable(ticket)) {
228
+ if (!ticket || !selectable(ticket, event.registrationMode)) {
226
229
  setPreflightError(true);
227
230
  return;
228
231
  }
@@ -274,7 +277,7 @@ function EventRegistrationForm({
274
277
  }
275
278
  await registration.submit(submission);
276
279
  }
277
- const maximum = ticket ? Math.min(ticket.maxPerOrder, ticket.available ?? ticket.maxPerOrder) : void 0;
280
+ const maximum = ticket ? maximumQuantity(ticket, event.registrationMode) : void 0;
278
281
  const renderedState = preflightError ? "request_error" : registration.state;
279
282
  const status = renderedState === "idle" ? "" : copy[renderedState];
280
283
  return /* @__PURE__ */ jsxs("form", { className, "data-kotao-event-registration": true, onSubmit: handleSubmit, children: [
@@ -286,7 +289,15 @@ function EventRegistrationForm({
286
289
  "data-kotao-event-ticket": true,
287
290
  value: ticketTypeId,
288
291
  onChange: (changeEvent) => selectTicket(changeEvent.currentTarget.value),
289
- children: tickets.map((candidate) => /* @__PURE__ */ jsx("option", { value: candidate.id, disabled: !selectable(candidate), children: candidate.title }, candidate.id))
292
+ children: tickets.map((candidate) => /* @__PURE__ */ jsx(
293
+ "option",
294
+ {
295
+ value: candidate.id,
296
+ disabled: !selectable(candidate, event.registrationMode),
297
+ children: candidate.title
298
+ },
299
+ candidate.id
300
+ ))
290
301
  }
291
302
  )
292
303
  ] }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/events/react.tsx"],"names":["maximum"],"mappings":"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","file":"events-react.js","sourcesContent":["import {\n type FormEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { StorefrontFormFields } from '../react/form'\nimport type { FormAnswers, PublicForm } from '../forms'\nimport {\n consumeOfferTokenFragment,\n offerTokenHrefMarker,\n type OfferTokenHistory,\n type OfferTokenLocation,\n} from './offer-token'\nimport { StorefrontEventsRequestError, type EventsClient } from './client'\nimport type {\n EventApprovalOfferResolution,\n EventCheckoutSession,\n EventRegistrationSubmission,\n PublicEvent,\n PublicEventForm,\n PublicEventTicketType,\n} from './types'\n\nexport type EventRegistrationState =\n | 'idle'\n | 'submitting'\n | 'awaiting_approval'\n | 'waitlisted'\n | 'checkout_ready'\n | 'request_error'\n\nexport function useEventRegistration(input: {\n readonly client: EventsClient\n readonly onCheckoutSession?: (session: EventCheckoutSession) => void\n}): {\n readonly state: EventRegistrationState\n readonly submit: (submission: EventRegistrationSubmission) => Promise<void>\n readonly reset: () => void\n} {\n const [state, setState] = useState<EventRegistrationState>('idle')\n const generation = useRef(0)\n const logicalPayload = useRef<string | null>(null)\n const idempotencyKey = useRef<string | null>(null)\n const activeClient = useRef(input.client)\n const activeCallback = useRef(input.onCheckoutSession)\n\n useEffect(() => {\n if (\n activeClient.current !== input.client ||\n activeCallback.current !== input.onCheckoutSession\n ) {\n activeClient.current = input.client\n activeCallback.current = input.onCheckoutSession\n generation.current += 1\n setState('idle')\n }\n }, [input.client, input.onCheckoutSession])\n\n useEffect(\n () => () => {\n generation.current += 1\n },\n [],\n )\n\n const reset = useCallback(() => {\n generation.current += 1\n setState('idle')\n }, [])\n\n async function submit(submission: EventRegistrationSubmission): Promise<void> {\n const attempt = ++generation.current\n const prepared = registrationSubmission(submission, logicalPayload, idempotencyKey)\n setState('submitting')\n try {\n const result = await input.client.submitRegistration(prepared)\n if (attempt !== generation.current) return\n if (result.kind === 'checkout') {\n input.onCheckoutSession?.(result.checkoutSession)\n setState('checkout_ready')\n } else if (result.kind === 'approval') {\n setState('awaiting_approval')\n } else {\n setState('waitlisted')\n }\n } catch {\n if (attempt !== generation.current) return\n setState('request_error')\n }\n }\n\n return { state, submit, reset }\n}\n\nfunction registrationKey(mode: PublicEvent['registrationMode']): string {\n const kind = mode === 'approval_then_payment' ? 'application' : 'checkout'\n return `events-${kind}-${Date.now()}-${Math.random().toString(36).slice(2)}`\n}\n\nfunction stablePayload(value: unknown): string {\n return JSON.stringify(value, (_key, item: unknown) => {\n if (item === null || typeof item !== 'object' || Array.isArray(item)) return item\n return Object.fromEntries(\n Object.entries(item as Record<string, unknown>).sort(([left], [right]) =>\n left.localeCompare(right),\n ),\n )\n })\n}\n\nfunction registrationSubmission(\n submission: EventRegistrationSubmission,\n previousPayload: { current: string | null },\n previousKey: { current: string | null },\n): EventRegistrationSubmission {\n if (submission.registrationMode === 'waitlist_only') return submission\n if (submission.idempotencyKey.trim() !== '') return submission\n const payload = {\n registrationMode: submission.registrationMode,\n handle: submission.handle,\n input: submission.input,\n }\n const identity = stablePayload(payload)\n if (identity !== previousPayload.current || previousKey.current === null) {\n previousPayload.current = identity\n previousKey.current = registrationKey(submission.registrationMode)\n }\n return { ...submission, idempotencyKey: previousKey.current }\n}\n\n/** Adapts an event-owned form without claiming that it is a published standalone Forms version. */\nfunction eventFormForRenderer(form: PublicEventForm): PublicForm {\n return {\n definition: {\n id: form.definitionId,\n handle: form.definitionId,\n title: form.title,\n },\n version: {\n id: form.versionId,\n definitionId: form.definitionId,\n schema: form.schema,\n },\n } as PublicForm\n}\n\nconst REGISTRATION_COPY = {\n en: {\n submit: 'Register',\n submitting: 'Submitting…',\n awaiting_approval: 'Application received. Awaiting approval.',\n waitlisted: 'You joined the waitlist.',\n checkout_ready: 'Registration ready for checkout.',\n request_error: 'Something went wrong. Please try again.',\n email: 'Email',\n quantity: 'Quantity',\n ticket: 'Ticket',\n },\n de: {\n submit: 'Anmelden',\n submitting: 'Wird gesendet…',\n awaiting_approval: 'Anmeldung erhalten. Sie wartet auf Freigabe.',\n waitlisted: 'Du stehst auf der Warteliste.',\n checkout_ready: 'Die Anmeldung kann bezahlt werden.',\n request_error: 'Etwas ist schiefgelaufen. Bitte versuche es erneut.',\n email: 'E-Mail',\n quantity: 'Anzahl',\n ticket: 'Ticket',\n },\n} as const\n\nexport interface EventRegistrationLabels {\n readonly submit: string\n readonly submitting: string\n readonly awaiting_approval: string\n readonly waitlisted: string\n readonly checkout_ready: string\n readonly request_error: string\n readonly email: string\n readonly quantity: string\n readonly ticket: string\n}\n\nfunction registrationCopy(locale: string): EventRegistrationLabels {\n return locale.toLowerCase().startsWith('de') ? REGISTRATION_COPY.de : REGISTRATION_COPY.en\n}\n\nfunction selectable(ticket: PublicEventTicketType): boolean {\n return (\n ticket.salesState === 'on_sale' &&\n ticket.maxPerOrder >= ticket.minPerOrder &&\n (ticket.available === null || ticket.available >= ticket.minPerOrder)\n )\n}\n\nexport interface EventRegistrationFormProps {\n readonly event: PublicEvent\n readonly locale: string\n readonly client: EventsClient\n readonly cartToken?: string\n readonly fallbackLocale?: string\n readonly onCheckoutSession?: (session: EventCheckoutSession) => void\n readonly labels?: Partial<EventRegistrationLabels>\n readonly className?: string\n}\n\nexport function EventRegistrationForm({\n event,\n locale,\n client,\n cartToken,\n fallbackLocale,\n onCheckoutSession,\n labels,\n className,\n}: EventRegistrationFormProps) {\n const tickets = event.occurrences.flatMap((occurrence) => occurrence.ticketTypes)\n const firstTicket = tickets.find(selectable)\n const [ticketTypeId, setTicketTypeId] = useState(firstTicket?.id ?? '')\n const ticket = tickets.find((candidate) => candidate.id === ticketTypeId)\n const initialQuantity = ticket?.minPerOrder ?? 1\n const [quantity, setQuantity] = useState(initialQuantity)\n const [email, setEmail] = useState('')\n const [preflightError, setPreflightError] = useState(false)\n const [buyerAnswers, setBuyerAnswers] = useState<FormAnswers>({})\n const [participantAnswers, setParticipantAnswers] = useState<FormAnswers[]>(() =>\n Array.from({ length: initialQuantity }, () => ({})),\n )\n const generatedId = useId()\n const instanceId = `event-registration-${generatedId.replaceAll(':', '')}`\n const selectedProjectionIdentity = stablePayload({\n buyerForm: ticket?.buyerForm ?? null,\n participantForm: ticket?.participantForm ?? null,\n })\n const previousProjection = useRef(selectedProjectionIdentity)\n const [projectionGeneration, setProjectionGeneration] = useState(0)\n const registration = useEventRegistration({\n client,\n ...(onCheckoutSession ? { onCheckoutSession } : {}),\n })\n const copy = { ...registrationCopy(locale), ...labels }\n const previousEvent = useRef(`${event.id}:${event.handle}:${event.registrationMode}:${locale}`)\n const previousCartToken = useRef(cartToken)\n\n useEffect(() => {\n const eventIdentity = `${event.id}:${event.handle}:${event.registrationMode}:${locale}`\n if (previousEvent.current !== eventIdentity) {\n previousEvent.current = eventIdentity\n const nextTicket = tickets.find(selectable)\n setTicketTypeId(nextTicket?.id ?? '')\n setQuantity(nextTicket?.minPerOrder ?? 1)\n setEmail('')\n setBuyerAnswers({})\n setParticipantAnswers(Array.from({ length: nextTicket?.minPerOrder ?? 1 }, () => ({})))\n previousProjection.current = selectedProjectionIdentity\n setProjectionGeneration((current) => current + 1)\n setPreflightError(false)\n registration.reset()\n } else if (previousProjection.current !== selectedProjectionIdentity) {\n previousProjection.current = selectedProjectionIdentity\n setBuyerAnswers({})\n setParticipantAnswers(Array.from({ length: quantity }, () => ({})))\n setProjectionGeneration((current) => current + 1)\n setPreflightError(false)\n registration.reset()\n }\n if (previousCartToken.current !== cartToken) {\n previousCartToken.current = cartToken\n setPreflightError(false)\n registration.reset()\n }\n }, [\n cartToken,\n event.handle,\n event.id,\n event.registrationMode,\n locale,\n quantity,\n selectedProjectionIdentity,\n ])\n\n function selectTicket(nextId: string): void {\n const next = tickets.find((candidate) => candidate.id === nextId)\n if (!next || !selectable(next)) return\n setTicketTypeId(nextId)\n setQuantity(next.minPerOrder)\n setBuyerAnswers({})\n setParticipantAnswers(Array.from({ length: next.minPerOrder }, () => ({})))\n registration.reset()\n setPreflightError(false)\n }\n\n function updateQuantity(next: number): void {\n if (!ticket) return\n const maximum = Math.min(ticket.maxPerOrder, ticket.available ?? ticket.maxPerOrder)\n const normalized = Number.isFinite(next) ? Math.trunc(next) : ticket.minPerOrder\n const bounded = Math.max(ticket.minPerOrder, Math.min(maximum, normalized))\n setQuantity(bounded)\n setParticipantAnswers((current) =>\n Array.from({ length: bounded }, (_, index) => current[index] ?? {}),\n )\n registration.reset()\n setPreflightError(false)\n }\n\n async function handleSubmit(submitEvent: FormEvent<HTMLFormElement>): Promise<void> {\n submitEvent.preventDefault()\n if (!ticket || !selectable(ticket)) {\n setPreflightError(true)\n return\n }\n setPreflightError(false)\n const buyer = ticket.buyerForm\n ? { versionId: ticket.buyerForm.versionId, answers: buyerAnswers }\n : undefined\n const participants = ticket.participantForm\n ? participantAnswers.map((answers) => ({\n versionId: ticket.participantForm!.versionId,\n answers,\n }))\n : undefined\n\n let submission: EventRegistrationSubmission\n if (event.registrationMode === 'instant') {\n if (!cartToken) {\n setPreflightError(true)\n return\n }\n submission = {\n registrationMode: 'instant',\n handle: event.handle,\n idempotencyKey: '',\n input: {\n ticketTypeId: ticket.id,\n quantity,\n cartToken,\n locale,\n ...(buyer ? { buyer } : {}),\n ...(participants ? { participants } : {}),\n },\n }\n } else if (event.registrationMode === 'approval_then_payment') {\n submission = {\n registrationMode: 'approval_then_payment',\n handle: event.handle,\n idempotencyKey: '',\n input: {\n ticketTypeId: ticket.id,\n quantity,\n contactEmail: email,\n locale,\n ...(buyer ? { buyer } : {}),\n ...(participants ? { participants } : {}),\n },\n }\n } else {\n submission = {\n registrationMode: 'waitlist_only',\n handle: event.handle,\n input: { ticketTypeId: ticket.id, quantity, email },\n }\n }\n await registration.submit(submission)\n }\n\n const maximum = ticket\n ? Math.min(ticket.maxPerOrder, ticket.available ?? ticket.maxPerOrder)\n : undefined\n const renderedState = preflightError ? 'request_error' : registration.state\n const status = renderedState === 'idle' ? '' : copy[renderedState]\n\n return (\n <form className={className} data-kotao-event-registration onSubmit={handleSubmit}>\n <label>\n <span>{copy.ticket}</span>\n <select\n data-kotao-event-ticket\n value={ticketTypeId}\n onChange={(changeEvent) => selectTicket(changeEvent.currentTarget.value)}\n >\n {tickets.map((candidate) => (\n <option key={candidate.id} value={candidate.id} disabled={!selectable(candidate)}>\n {candidate.title}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>{copy.quantity}</span>\n <input\n name=\"quantity\"\n type=\"number\"\n value={quantity}\n min={ticket?.minPerOrder}\n max={maximum}\n required\n step={1}\n onChange={(changeEvent) => updateQuantity(changeEvent.currentTarget.valueAsNumber)}\n />\n </label>\n {event.registrationMode !== 'instant' ? (\n <label>\n <span>{copy.email}</span>\n <input\n type=\"email\"\n required\n value={email}\n onChange={(changeEvent) => {\n setEmail(changeEvent.currentTarget.value)\n setPreflightError(false)\n registration.reset()\n }}\n />\n </label>\n ) : null}\n {ticket?.buyerForm ? (\n <div data-kotao-event-buyer-form>\n <StorefrontFormFields\n key={`${projectionGeneration}:${ticket.id}:${ticket.buyerForm.versionId}`}\n form={eventFormForRenderer(ticket.buyerForm)}\n locale={locale}\n {...(fallbackLocale === undefined ? {} : { fallbackLocale })}\n answers={buyerAnswers}\n idPrefix={`${instanceId}-event-${event.id}-ticket-${ticket.id}-buyer`}\n onAnswersChange={(next) => {\n setBuyerAnswers(next)\n setPreflightError(false)\n registration.reset()\n }}\n />\n </div>\n ) : null}\n {ticket?.participantForm\n ? participantAnswers.map((answers, index) => (\n <div\n key={`${projectionGeneration}:${ticket.id}:${ticket.participantForm!.versionId}:${index}`}\n data-kotao-event-participant-form\n >\n <StorefrontFormFields\n form={eventFormForRenderer(ticket.participantForm!)}\n locale={locale}\n {...(fallbackLocale === undefined ? {} : { fallbackLocale })}\n answers={answers}\n idPrefix={`${instanceId}-event-${event.id}-ticket-${ticket.id}-participant-${index}`}\n onAnswersChange={(next) => {\n setParticipantAnswers((current) =>\n current.map((value, participantIndex) =>\n participantIndex === index ? next : value,\n ),\n )\n setPreflightError(false)\n registration.reset()\n }}\n />\n </div>\n ))\n : null}\n <button type=\"submit\" disabled={registration.state === 'submitting'}>\n {copy.submit}\n </button>\n <p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" data-kotao-event-state={renderedState}>\n {status}\n </p>\n </form>\n )\n}\n\nexport type EventOfferState =\n | 'resolving'\n | 'active'\n | 'claiming'\n | 'claimed'\n | 'expired'\n | 'unavailable'\n | 'request_error'\n\nexport interface EventApprovalOfferLabels {\n readonly resolving: ReactNode\n readonly claim: ReactNode\n readonly resume: ReactNode\n readonly claiming: ReactNode\n readonly claimed: ReactNode\n readonly expired: ReactNode\n readonly unavailable: ReactNode\n readonly requestError: ReactNode\n readonly retry?: ReactNode\n readonly expires: ReactNode\n}\n\nconst OFFER_LABELS: EventApprovalOfferLabels = {\n resolving: 'Loading offer…',\n claim: 'Claim offer',\n resume: 'Continue to checkout',\n claiming: 'Starting checkout…',\n claimed: 'Offer claimed. Continue to checkout.',\n expired: 'This offer has expired.',\n unavailable: 'This offer is not available.',\n requestError: 'Something went wrong. Please try again.',\n retry: 'Try again',\n expires: 'Offer expires at',\n}\n\nexport interface EventApprovalOfferProps {\n readonly client: EventsClient\n readonly offerId: string\n readonly cartToken: string\n readonly locale: string\n readonly idempotencyKey?: string\n readonly location?: OfferTokenLocation\n readonly history?: OfferTokenHistory\n readonly labels?: Partial<EventApprovalOfferLabels>\n /** Formats visible dates without changing the timestamps used to resolve or claim the offer. */\n readonly formatDateTime?: (value: string) => ReactNode\n readonly onCheckoutSession?: (session: EventCheckoutSession) => void\n readonly initialResolution?: EventApprovalOfferResolution\n readonly initialState?: Exclude<EventOfferState, 'resolving' | 'active' | 'claiming'>\n readonly className?: string\n}\n\nfunction browserLocation(): OfferTokenLocation | undefined {\n return typeof window === 'undefined' ? undefined : window.location\n}\n\nfunction browserHistory(): OfferTokenHistory | undefined {\n return typeof window === 'undefined' ? undefined : window.history\n}\n\nexport function EventApprovalOffer({\n client,\n offerId,\n cartToken,\n locale,\n idempotencyKey,\n location,\n history,\n labels,\n formatDateTime,\n onCheckoutSession,\n initialResolution,\n initialState,\n className,\n}: EventApprovalOfferProps) {\n const copy = { ...OFFER_LABELS, ...labels }\n const token = useRef<string | null>(null)\n const consumedHrefMarkers = useRef(new Set<string>())\n const offerGeneration = useRef(0)\n const resolvedGeneration = useRef<number | null>(initialResolution ? 0 : null)\n const mounted = useRef(false)\n const strictCleanupGeneration = useRef<number | null>(null)\n const activeDependencies = useRef({ client, cartToken, locale, onCheckoutSession })\n const claimIdempotencyKey = useMemo(\n () => idempotencyKey ?? `events-claim-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n [idempotencyKey, offerId],\n )\n const resolveIdempotencyKey = useMemo(\n () => `events-resolve-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n [offerId],\n )\n const [canClaim, setCanClaim] = useState(initialResolution?.state === 'active')\n const [resolution, setResolution] = useState<EventApprovalOfferResolution | null>(\n initialResolution ?? null,\n )\n const [state, setState] = useState<EventOfferState>(\n initialResolution\n ? initialResolution.state === 'claimed'\n ? 'claimed'\n : 'active'\n : (initialState ?? 'resolving'),\n )\n\n async function resolveCapability(generation: number, claimToken: string): Promise<void> {\n try {\n const offer = await client.resolveOffer(offerId, claimToken, resolveIdempotencyKey)\n if (!mounted.current || generation !== offerGeneration.current) return\n resolvedGeneration.current = generation\n setResolution(offer)\n if (offer.state === 'claimed') setState('claimed')\n else if (new Date(offer.expiresAt).getTime() <= Date.now()) setState('expired')\n else setState('active')\n } catch (error) {\n if (!mounted.current || generation !== offerGeneration.current) return\n setState(\n error instanceof StorefrontEventsRequestError && error.status === 409\n ? 'unavailable'\n : 'request_error',\n )\n }\n }\n\n useLayoutEffect(() => {\n if (\n strictCleanupGeneration.current !== null &&\n offerGeneration.current === strictCleanupGeneration.current + 1\n ) {\n // React Strict Mode immediately remounts effects; restore the still-live attempt without\n // issuing a second capability-bearing request.\n offerGeneration.current = strictCleanupGeneration.current\n }\n strictCleanupGeneration.current = null\n mounted.current = true\n return () => {\n mounted.current = false\n strictCleanupGeneration.current = offerGeneration.current\n offerGeneration.current += 1\n }\n }, [])\n\n useLayoutEffect(() => {\n const previous = activeDependencies.current\n if (\n previous.client === client &&\n previous.cartToken === cartToken &&\n previous.locale === locale &&\n previous.onCheckoutSession === onCheckoutSession\n ) {\n return\n }\n activeDependencies.current = { client, cartToken, locale, onCheckoutSession }\n offerGeneration.current += 1\n resolvedGeneration.current = null\n token.current = null\n setCanClaim(false)\n setResolution(null)\n setState('unavailable')\n }, [cartToken, client, locale, onCheckoutSession])\n\n useLayoutEffect(() => {\n if (initialState !== undefined) return\n const currentLocation = location ?? browserLocation()\n const currentHistory = history ?? browserHistory()\n if (currentLocation === undefined || currentHistory === undefined) {\n if (initialResolution === undefined) setState('unavailable')\n return\n }\n const hrefMarker = offerTokenHrefMarker(currentLocation.href)\n if (consumedHrefMarkers.current.has(hrefMarker)) return\n consumedHrefMarkers.current.add(hrefMarker)\n offerGeneration.current += 1\n const generation = offerGeneration.current\n resolvedGeneration.current = null\n token.current = null\n setCanClaim(false)\n setResolution(null)\n setState('resolving')\n const claimToken = consumeOfferTokenFragment(currentLocation, currentHistory)\n consumedHrefMarkers.current.add(offerTokenHrefMarker(currentLocation.href))\n token.current = claimToken\n setCanClaim(claimToken !== null)\n if (claimToken === null) {\n if (initialResolution === undefined) setState('unavailable')\n return\n }\n void resolveCapability(generation, claimToken)\n })\n\n function retryResolve(): void {\n const claimToken = token.current\n if (claimToken === null) {\n setState('unavailable')\n return\n }\n const generation = offerGeneration.current\n setState('resolving')\n void resolveCapability(generation, claimToken)\n }\n\n async function claim(): Promise<void> {\n const claimToken = token.current\n const generation = offerGeneration.current\n if (\n claimToken === null ||\n resolvedGeneration.current !== generation ||\n resolution?.offerId !== offerId\n ) {\n setState('unavailable')\n return\n }\n setState('claiming')\n try {\n const session = await client.claimOffer(\n offerId,\n { claimToken, cartToken, locale },\n claimIdempotencyKey,\n )\n if (!mounted.current || generation !== offerGeneration.current) return\n token.current = null\n setCanClaim(false)\n setState('claimed')\n onCheckoutSession?.(session)\n } catch (error) {\n if (!mounted.current || generation !== offerGeneration.current) return\n setState(\n error instanceof StorefrontEventsRequestError && error.status === 409\n ? 'unavailable'\n : 'request_error',\n )\n }\n }\n\n const status =\n state === 'resolving'\n ? copy.resolving\n : state === 'claiming'\n ? copy.claiming\n : state === 'claimed'\n ? copy.claimed\n : state === 'expired'\n ? copy.expired\n : state === 'unavailable'\n ? copy.unavailable\n : state === 'request_error'\n ? copy.requestError\n : null\n\n return (\n <section className={className} data-kotao-event-approval-offer>\n {resolution ? (\n <header>\n <h1>{resolution.eventTitle}</h1>\n <p>\n {resolution.ticketTypeTitle} · {resolution.quantity}\n </p>\n <time dateTime={resolution.occurrenceStartsAt}>\n {formatDateTime\n ? formatDateTime(resolution.occurrenceStartsAt)\n : resolution.occurrenceStartsAt}\n </time>\n </header>\n ) : null}\n {(state === 'active' ||\n (state === 'claimed' && canClaim) ||\n (state === 'request_error' && canClaim)) &&\n resolution ? (\n <>\n <p>\n {copy.expires}:{' '}\n <time dateTime={resolution.expiresAt}>\n {formatDateTime ? formatDateTime(resolution.expiresAt) : resolution.expiresAt}\n </time>\n </p>\n <button type=\"button\" onClick={claim}>\n {state === 'claimed' ? copy.resume : copy.claim}\n </button>\n </>\n ) : null}\n {state === 'request_error' && canClaim && resolution === null ? (\n <button type=\"button\" onClick={retryResolve}>\n {copy.retry}\n </button>\n ) : null}\n <p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {status}\n </p>\n </section>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/events/react.tsx"],"names":["maximum"],"mappings":"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","file":"events-react.js","sourcesContent":["import {\n type FormEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { StorefrontFormFields } from '../react/form'\nimport type { FormAnswers, PublicForm } from '../forms'\nimport {\n consumeOfferTokenFragment,\n offerTokenHrefMarker,\n type OfferTokenHistory,\n type OfferTokenLocation,\n} from './offer-token'\nimport { StorefrontEventsRequestError, type EventsClient } from './client'\nimport type {\n EventApprovalOfferResolution,\n EventCheckoutSession,\n EventRegistrationSubmission,\n PublicEvent,\n PublicEventForm,\n PublicEventTicketType,\n} from './types'\n\nexport type EventRegistrationState =\n | 'idle'\n | 'submitting'\n | 'awaiting_approval'\n | 'waitlisted'\n | 'checkout_ready'\n | 'request_error'\n\nexport function useEventRegistration(input: {\n readonly client: EventsClient\n readonly onCheckoutSession?: (session: EventCheckoutSession) => void\n}): {\n readonly state: EventRegistrationState\n readonly submit: (submission: EventRegistrationSubmission) => Promise<void>\n readonly reset: () => void\n} {\n const [state, setState] = useState<EventRegistrationState>('idle')\n const generation = useRef(0)\n const logicalPayload = useRef<string | null>(null)\n const idempotencyKey = useRef<string | null>(null)\n const activeClient = useRef(input.client)\n const activeCallback = useRef(input.onCheckoutSession)\n\n useEffect(() => {\n if (\n activeClient.current !== input.client ||\n activeCallback.current !== input.onCheckoutSession\n ) {\n activeClient.current = input.client\n activeCallback.current = input.onCheckoutSession\n generation.current += 1\n setState('idle')\n }\n }, [input.client, input.onCheckoutSession])\n\n useEffect(\n () => () => {\n generation.current += 1\n },\n [],\n )\n\n const reset = useCallback(() => {\n generation.current += 1\n setState('idle')\n }, [])\n\n async function submit(submission: EventRegistrationSubmission): Promise<void> {\n const attempt = ++generation.current\n const prepared = registrationSubmission(submission, logicalPayload, idempotencyKey)\n setState('submitting')\n try {\n const result = await input.client.submitRegistration(prepared)\n if (attempt !== generation.current) return\n if (result.kind === 'checkout') {\n input.onCheckoutSession?.(result.checkoutSession)\n setState('checkout_ready')\n } else if (result.kind === 'approval') {\n setState('awaiting_approval')\n } else {\n setState('waitlisted')\n }\n } catch {\n if (attempt !== generation.current) return\n setState('request_error')\n }\n }\n\n return { state, submit, reset }\n}\n\nfunction registrationKey(mode: PublicEvent['registrationMode']): string {\n const kind = mode === 'approval_then_payment' ? 'application' : 'checkout'\n return `events-${kind}-${Date.now()}-${Math.random().toString(36).slice(2)}`\n}\n\nfunction stablePayload(value: unknown): string {\n return JSON.stringify(value, (_key, item: unknown) => {\n if (item === null || typeof item !== 'object' || Array.isArray(item)) return item\n return Object.fromEntries(\n Object.entries(item as Record<string, unknown>).sort(([left], [right]) =>\n left.localeCompare(right),\n ),\n )\n })\n}\n\nfunction registrationSubmission(\n submission: EventRegistrationSubmission,\n previousPayload: { current: string | null },\n previousKey: { current: string | null },\n): EventRegistrationSubmission {\n if (submission.registrationMode === 'waitlist_only') return submission\n if (submission.idempotencyKey.trim() !== '') return submission\n const payload = {\n registrationMode: submission.registrationMode,\n handle: submission.handle,\n input: submission.input,\n }\n const identity = stablePayload(payload)\n if (identity !== previousPayload.current || previousKey.current === null) {\n previousPayload.current = identity\n previousKey.current = registrationKey(submission.registrationMode)\n }\n return { ...submission, idempotencyKey: previousKey.current }\n}\n\n/** Adapts an event-owned form without claiming that it is a published standalone Forms version. */\nfunction eventFormForRenderer(form: PublicEventForm): PublicForm {\n return {\n definition: {\n id: form.definitionId,\n handle: form.definitionId,\n title: form.title,\n },\n version: {\n id: form.versionId,\n definitionId: form.definitionId,\n schema: form.schema,\n },\n } as PublicForm\n}\n\nconst REGISTRATION_COPY = {\n en: {\n submit: 'Register',\n submitting: 'Submitting…',\n awaiting_approval: 'Application received. Awaiting approval.',\n waitlisted: 'You joined the waitlist.',\n checkout_ready: 'Registration ready for checkout.',\n request_error: 'Something went wrong. Please try again.',\n email: 'Email',\n quantity: 'Quantity',\n ticket: 'Ticket',\n },\n de: {\n submit: 'Anmelden',\n submitting: 'Wird gesendet…',\n awaiting_approval: 'Anmeldung erhalten. Sie wartet auf Freigabe.',\n waitlisted: 'Du stehst auf der Warteliste.',\n checkout_ready: 'Die Anmeldung kann bezahlt werden.',\n request_error: 'Etwas ist schiefgelaufen. Bitte versuche es erneut.',\n email: 'E-Mail',\n quantity: 'Anzahl',\n ticket: 'Ticket',\n },\n} as const\n\nexport interface EventRegistrationLabels {\n readonly submit: string\n readonly submitting: string\n readonly awaiting_approval: string\n readonly waitlisted: string\n readonly checkout_ready: string\n readonly request_error: string\n readonly email: string\n readonly quantity: string\n readonly ticket: string\n}\n\nfunction registrationCopy(locale: string): EventRegistrationLabels {\n return locale.toLowerCase().startsWith('de') ? REGISTRATION_COPY.de : REGISTRATION_COPY.en\n}\n\nfunction selectable(\n ticket: PublicEventTicketType,\n registrationMode: PublicEvent['registrationMode'],\n): boolean {\n return (\n ticket.salesState === 'on_sale' &&\n ticket.maxPerOrder >= ticket.minPerOrder &&\n (registrationMode === 'approval_then_payment' ||\n ticket.available === null ||\n ticket.available >= ticket.minPerOrder)\n )\n}\n\nfunction maximumQuantity(\n ticket: PublicEventTicketType,\n registrationMode: PublicEvent['registrationMode'],\n): number {\n return registrationMode === 'approval_then_payment'\n ? ticket.maxPerOrder\n : Math.min(ticket.maxPerOrder, ticket.available ?? ticket.maxPerOrder)\n}\n\nexport interface EventRegistrationFormProps {\n readonly event: PublicEvent\n readonly locale: string\n readonly client: EventsClient\n readonly cartToken?: string\n readonly fallbackLocale?: string\n readonly onCheckoutSession?: (session: EventCheckoutSession) => void\n readonly labels?: Partial<EventRegistrationLabels>\n readonly className?: string\n}\n\nexport function EventRegistrationForm({\n event,\n locale,\n client,\n cartToken,\n fallbackLocale,\n onCheckoutSession,\n labels,\n className,\n}: EventRegistrationFormProps) {\n const tickets = event.occurrences.flatMap((occurrence) => occurrence.ticketTypes)\n const firstTicket = tickets.find((candidate) => selectable(candidate, event.registrationMode))\n const [ticketTypeId, setTicketTypeId] = useState(firstTicket?.id ?? '')\n const ticket = tickets.find((candidate) => candidate.id === ticketTypeId)\n const initialQuantity = ticket?.minPerOrder ?? 1\n const [quantity, setQuantity] = useState(initialQuantity)\n const [email, setEmail] = useState('')\n const [preflightError, setPreflightError] = useState(false)\n const [buyerAnswers, setBuyerAnswers] = useState<FormAnswers>({})\n const [participantAnswers, setParticipantAnswers] = useState<FormAnswers[]>(() =>\n Array.from({ length: initialQuantity }, () => ({})),\n )\n const generatedId = useId()\n const instanceId = `event-registration-${generatedId.replaceAll(':', '')}`\n const selectedProjectionIdentity = stablePayload({\n buyerForm: ticket?.buyerForm ?? null,\n participantForm: ticket?.participantForm ?? null,\n })\n const previousProjection = useRef(selectedProjectionIdentity)\n const [projectionGeneration, setProjectionGeneration] = useState(0)\n const registration = useEventRegistration({\n client,\n ...(onCheckoutSession ? { onCheckoutSession } : {}),\n })\n const copy = { ...registrationCopy(locale), ...labels }\n const previousEvent = useRef(`${event.id}:${event.handle}:${event.registrationMode}:${locale}`)\n const previousCartToken = useRef(cartToken)\n\n useEffect(() => {\n const eventIdentity = `${event.id}:${event.handle}:${event.registrationMode}:${locale}`\n if (previousEvent.current !== eventIdentity) {\n previousEvent.current = eventIdentity\n const nextTicket = tickets.find((candidate) => selectable(candidate, event.registrationMode))\n setTicketTypeId(nextTicket?.id ?? '')\n setQuantity(nextTicket?.minPerOrder ?? 1)\n setEmail('')\n setBuyerAnswers({})\n setParticipantAnswers(Array.from({ length: nextTicket?.minPerOrder ?? 1 }, () => ({})))\n previousProjection.current = selectedProjectionIdentity\n setProjectionGeneration((current) => current + 1)\n setPreflightError(false)\n registration.reset()\n } else if (previousProjection.current !== selectedProjectionIdentity) {\n previousProjection.current = selectedProjectionIdentity\n setBuyerAnswers({})\n setParticipantAnswers(Array.from({ length: quantity }, () => ({})))\n setProjectionGeneration((current) => current + 1)\n setPreflightError(false)\n registration.reset()\n }\n if (previousCartToken.current !== cartToken) {\n previousCartToken.current = cartToken\n setPreflightError(false)\n registration.reset()\n }\n }, [\n cartToken,\n event.handle,\n event.id,\n event.registrationMode,\n locale,\n quantity,\n selectedProjectionIdentity,\n ])\n\n function selectTicket(nextId: string): void {\n const next = tickets.find((candidate) => candidate.id === nextId)\n if (!next || !selectable(next, event.registrationMode)) return\n setTicketTypeId(nextId)\n setQuantity(next.minPerOrder)\n setBuyerAnswers({})\n setParticipantAnswers(Array.from({ length: next.minPerOrder }, () => ({})))\n registration.reset()\n setPreflightError(false)\n }\n\n function updateQuantity(next: number): void {\n if (!ticket) return\n const maximum = maximumQuantity(ticket, event.registrationMode)\n const normalized = Number.isFinite(next) ? Math.trunc(next) : ticket.minPerOrder\n const bounded = Math.max(ticket.minPerOrder, Math.min(maximum, normalized))\n setQuantity(bounded)\n setParticipantAnswers((current) =>\n Array.from({ length: bounded }, (_, index) => current[index] ?? {}),\n )\n registration.reset()\n setPreflightError(false)\n }\n\n async function handleSubmit(submitEvent: FormEvent<HTMLFormElement>): Promise<void> {\n submitEvent.preventDefault()\n if (!ticket || !selectable(ticket, event.registrationMode)) {\n setPreflightError(true)\n return\n }\n setPreflightError(false)\n const buyer = ticket.buyerForm\n ? { versionId: ticket.buyerForm.versionId, answers: buyerAnswers }\n : undefined\n const participants = ticket.participantForm\n ? participantAnswers.map((answers) => ({\n versionId: ticket.participantForm!.versionId,\n answers,\n }))\n : undefined\n\n let submission: EventRegistrationSubmission\n if (event.registrationMode === 'instant') {\n if (!cartToken) {\n setPreflightError(true)\n return\n }\n submission = {\n registrationMode: 'instant',\n handle: event.handle,\n idempotencyKey: '',\n input: {\n ticketTypeId: ticket.id,\n quantity,\n cartToken,\n locale,\n ...(buyer ? { buyer } : {}),\n ...(participants ? { participants } : {}),\n },\n }\n } else if (event.registrationMode === 'approval_then_payment') {\n submission = {\n registrationMode: 'approval_then_payment',\n handle: event.handle,\n idempotencyKey: '',\n input: {\n ticketTypeId: ticket.id,\n quantity,\n contactEmail: email,\n locale,\n ...(buyer ? { buyer } : {}),\n ...(participants ? { participants } : {}),\n },\n }\n } else {\n submission = {\n registrationMode: 'waitlist_only',\n handle: event.handle,\n input: { ticketTypeId: ticket.id, quantity, email },\n }\n }\n await registration.submit(submission)\n }\n\n const maximum = ticket ? maximumQuantity(ticket, event.registrationMode) : undefined\n const renderedState = preflightError ? 'request_error' : registration.state\n const status = renderedState === 'idle' ? '' : copy[renderedState]\n\n return (\n <form className={className} data-kotao-event-registration onSubmit={handleSubmit}>\n <label>\n <span>{copy.ticket}</span>\n <select\n data-kotao-event-ticket\n value={ticketTypeId}\n onChange={(changeEvent) => selectTicket(changeEvent.currentTarget.value)}\n >\n {tickets.map((candidate) => (\n <option\n key={candidate.id}\n value={candidate.id}\n disabled={!selectable(candidate, event.registrationMode)}\n >\n {candidate.title}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>{copy.quantity}</span>\n <input\n name=\"quantity\"\n type=\"number\"\n value={quantity}\n min={ticket?.minPerOrder}\n max={maximum}\n required\n step={1}\n onChange={(changeEvent) => updateQuantity(changeEvent.currentTarget.valueAsNumber)}\n />\n </label>\n {event.registrationMode !== 'instant' ? (\n <label>\n <span>{copy.email}</span>\n <input\n type=\"email\"\n required\n value={email}\n onChange={(changeEvent) => {\n setEmail(changeEvent.currentTarget.value)\n setPreflightError(false)\n registration.reset()\n }}\n />\n </label>\n ) : null}\n {ticket?.buyerForm ? (\n <div data-kotao-event-buyer-form>\n <StorefrontFormFields\n key={`${projectionGeneration}:${ticket.id}:${ticket.buyerForm.versionId}`}\n form={eventFormForRenderer(ticket.buyerForm)}\n locale={locale}\n {...(fallbackLocale === undefined ? {} : { fallbackLocale })}\n answers={buyerAnswers}\n idPrefix={`${instanceId}-event-${event.id}-ticket-${ticket.id}-buyer`}\n onAnswersChange={(next) => {\n setBuyerAnswers(next)\n setPreflightError(false)\n registration.reset()\n }}\n />\n </div>\n ) : null}\n {ticket?.participantForm\n ? participantAnswers.map((answers, index) => (\n <div\n key={`${projectionGeneration}:${ticket.id}:${ticket.participantForm!.versionId}:${index}`}\n data-kotao-event-participant-form\n >\n <StorefrontFormFields\n form={eventFormForRenderer(ticket.participantForm!)}\n locale={locale}\n {...(fallbackLocale === undefined ? {} : { fallbackLocale })}\n answers={answers}\n idPrefix={`${instanceId}-event-${event.id}-ticket-${ticket.id}-participant-${index}`}\n onAnswersChange={(next) => {\n setParticipantAnswers((current) =>\n current.map((value, participantIndex) =>\n participantIndex === index ? next : value,\n ),\n )\n setPreflightError(false)\n registration.reset()\n }}\n />\n </div>\n ))\n : null}\n <button type=\"submit\" disabled={registration.state === 'submitting'}>\n {copy.submit}\n </button>\n <p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" data-kotao-event-state={renderedState}>\n {status}\n </p>\n </form>\n )\n}\n\nexport type EventOfferState =\n | 'resolving'\n | 'active'\n | 'claiming'\n | 'claimed'\n | 'expired'\n | 'unavailable'\n | 'request_error'\n\nexport interface EventApprovalOfferLabels {\n readonly resolving: ReactNode\n readonly claim: ReactNode\n readonly resume: ReactNode\n readonly claiming: ReactNode\n readonly claimed: ReactNode\n readonly expired: ReactNode\n readonly unavailable: ReactNode\n readonly requestError: ReactNode\n readonly retry?: ReactNode\n readonly expires: ReactNode\n}\n\nconst OFFER_LABELS: EventApprovalOfferLabels = {\n resolving: 'Loading offer…',\n claim: 'Claim offer',\n resume: 'Continue to checkout',\n claiming: 'Starting checkout…',\n claimed: 'Offer claimed. Continue to checkout.',\n expired: 'This offer has expired.',\n unavailable: 'This offer is not available.',\n requestError: 'Something went wrong. Please try again.',\n retry: 'Try again',\n expires: 'Offer expires at',\n}\n\nexport interface EventApprovalOfferProps {\n readonly client: EventsClient\n readonly offerId: string\n readonly cartToken: string\n readonly locale: string\n readonly idempotencyKey?: string\n readonly location?: OfferTokenLocation\n readonly history?: OfferTokenHistory\n readonly labels?: Partial<EventApprovalOfferLabels>\n /** Formats visible dates without changing the timestamps used to resolve or claim the offer. */\n readonly formatDateTime?: (value: string) => ReactNode\n readonly onCheckoutSession?: (session: EventCheckoutSession) => void\n readonly initialResolution?: EventApprovalOfferResolution\n readonly initialState?: Exclude<EventOfferState, 'resolving' | 'active' | 'claiming'>\n readonly className?: string\n}\n\nfunction browserLocation(): OfferTokenLocation | undefined {\n return typeof window === 'undefined' ? undefined : window.location\n}\n\nfunction browserHistory(): OfferTokenHistory | undefined {\n return typeof window === 'undefined' ? undefined : window.history\n}\n\nexport function EventApprovalOffer({\n client,\n offerId,\n cartToken,\n locale,\n idempotencyKey,\n location,\n history,\n labels,\n formatDateTime,\n onCheckoutSession,\n initialResolution,\n initialState,\n className,\n}: EventApprovalOfferProps) {\n const copy = { ...OFFER_LABELS, ...labels }\n const token = useRef<string | null>(null)\n const consumedHrefMarkers = useRef(new Set<string>())\n const offerGeneration = useRef(0)\n const resolvedGeneration = useRef<number | null>(initialResolution ? 0 : null)\n const mounted = useRef(false)\n const strictCleanupGeneration = useRef<number | null>(null)\n const activeDependencies = useRef({ client, cartToken, locale, onCheckoutSession })\n const claimIdempotencyKey = useMemo(\n () => idempotencyKey ?? `events-claim-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n [idempotencyKey, offerId],\n )\n const resolveIdempotencyKey = useMemo(\n () => `events-resolve-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n [offerId],\n )\n const [canClaim, setCanClaim] = useState(initialResolution?.state === 'active')\n const [resolution, setResolution] = useState<EventApprovalOfferResolution | null>(\n initialResolution ?? null,\n )\n const [state, setState] = useState<EventOfferState>(\n initialResolution\n ? initialResolution.state === 'claimed'\n ? 'claimed'\n : 'active'\n : (initialState ?? 'resolving'),\n )\n\n async function resolveCapability(generation: number, claimToken: string): Promise<void> {\n try {\n const offer = await client.resolveOffer(offerId, claimToken, resolveIdempotencyKey)\n if (!mounted.current || generation !== offerGeneration.current) return\n resolvedGeneration.current = generation\n setResolution(offer)\n if (offer.state === 'claimed') setState('claimed')\n else if (new Date(offer.expiresAt).getTime() <= Date.now()) setState('expired')\n else setState('active')\n } catch (error) {\n if (!mounted.current || generation !== offerGeneration.current) return\n setState(\n error instanceof StorefrontEventsRequestError && error.status === 409\n ? 'unavailable'\n : 'request_error',\n )\n }\n }\n\n useLayoutEffect(() => {\n if (\n strictCleanupGeneration.current !== null &&\n offerGeneration.current === strictCleanupGeneration.current + 1\n ) {\n // React Strict Mode immediately remounts effects; restore the still-live attempt without\n // issuing a second capability-bearing request.\n offerGeneration.current = strictCleanupGeneration.current\n }\n strictCleanupGeneration.current = null\n mounted.current = true\n return () => {\n mounted.current = false\n strictCleanupGeneration.current = offerGeneration.current\n offerGeneration.current += 1\n }\n }, [])\n\n useLayoutEffect(() => {\n const previous = activeDependencies.current\n if (\n previous.client === client &&\n previous.cartToken === cartToken &&\n previous.locale === locale &&\n previous.onCheckoutSession === onCheckoutSession\n ) {\n return\n }\n activeDependencies.current = { client, cartToken, locale, onCheckoutSession }\n offerGeneration.current += 1\n resolvedGeneration.current = null\n token.current = null\n setCanClaim(false)\n setResolution(null)\n setState('unavailable')\n }, [cartToken, client, locale, onCheckoutSession])\n\n useLayoutEffect(() => {\n if (initialState !== undefined) return\n const currentLocation = location ?? browserLocation()\n const currentHistory = history ?? browserHistory()\n if (currentLocation === undefined || currentHistory === undefined) {\n if (initialResolution === undefined) setState('unavailable')\n return\n }\n const hrefMarker = offerTokenHrefMarker(currentLocation.href)\n if (consumedHrefMarkers.current.has(hrefMarker)) return\n consumedHrefMarkers.current.add(hrefMarker)\n offerGeneration.current += 1\n const generation = offerGeneration.current\n resolvedGeneration.current = null\n token.current = null\n setCanClaim(false)\n setResolution(null)\n setState('resolving')\n const claimToken = consumeOfferTokenFragment(currentLocation, currentHistory)\n consumedHrefMarkers.current.add(offerTokenHrefMarker(currentLocation.href))\n token.current = claimToken\n setCanClaim(claimToken !== null)\n if (claimToken === null) {\n if (initialResolution === undefined) setState('unavailable')\n return\n }\n void resolveCapability(generation, claimToken)\n })\n\n function retryResolve(): void {\n const claimToken = token.current\n if (claimToken === null) {\n setState('unavailable')\n return\n }\n const generation = offerGeneration.current\n setState('resolving')\n void resolveCapability(generation, claimToken)\n }\n\n async function claim(): Promise<void> {\n const claimToken = token.current\n const generation = offerGeneration.current\n if (\n claimToken === null ||\n resolvedGeneration.current !== generation ||\n resolution?.offerId !== offerId\n ) {\n setState('unavailable')\n return\n }\n setState('claiming')\n try {\n const session = await client.claimOffer(\n offerId,\n { claimToken, cartToken, locale },\n claimIdempotencyKey,\n )\n if (!mounted.current || generation !== offerGeneration.current) return\n token.current = null\n setCanClaim(false)\n setState('claimed')\n onCheckoutSession?.(session)\n } catch (error) {\n if (!mounted.current || generation !== offerGeneration.current) return\n setState(\n error instanceof StorefrontEventsRequestError && error.status === 409\n ? 'unavailable'\n : 'request_error',\n )\n }\n }\n\n const status =\n state === 'resolving'\n ? copy.resolving\n : state === 'claiming'\n ? copy.claiming\n : state === 'claimed'\n ? copy.claimed\n : state === 'expired'\n ? copy.expired\n : state === 'unavailable'\n ? copy.unavailable\n : state === 'request_error'\n ? copy.requestError\n : null\n\n return (\n <section className={className} data-kotao-event-approval-offer>\n {resolution ? (\n <header>\n <h1>{resolution.eventTitle}</h1>\n <p>\n {resolution.ticketTypeTitle} · {resolution.quantity}\n </p>\n <time dateTime={resolution.occurrenceStartsAt}>\n {formatDateTime\n ? formatDateTime(resolution.occurrenceStartsAt)\n : resolution.occurrenceStartsAt}\n </time>\n </header>\n ) : null}\n {(state === 'active' ||\n (state === 'claimed' && canClaim) ||\n (state === 'request_error' && canClaim)) &&\n resolution ? (\n <>\n <p>\n {copy.expires}:{' '}\n <time dateTime={resolution.expiresAt}>\n {formatDateTime ? formatDateTime(resolution.expiresAt) : resolution.expiresAt}\n </time>\n </p>\n <button type=\"button\" onClick={claim}>\n {state === 'claimed' ? copy.resume : copy.claim}\n </button>\n </>\n ) : null}\n {state === 'request_error' && canClaim && resolution === null ? (\n <button type=\"button\" onClick={retryResolve}>\n {copy.retry}\n </button>\n ) : null}\n <p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {status}\n </p>\n </section>\n )\n}\n"]}
package/dist/events.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { C as CartHandler } from './createCartHandler-7DdKB-GF.js';
2
- export { C as ClaimEventApprovalOffer, d as CreateEventApprovalRequest, e as CreateEventCheckoutSession, f as CreateEventWaitlistEntry, b as EventApprovalOfferResolution, g as EventApprovalRequestReceipt, a as EventCheckoutSession, h as EventFormAnswer, i as EventFormSubmissionInput, j as EventRegistrationMode, k as EventRegistrationResult, c as EventRegistrationSubmission, l as EventWaitlistReceipt, E as EventsClient, P as PublicEvent, m as PublicEventForm, n as PublicEventOccurrence, o as PublicEventSummary, p as PublicEventTicketType, q as PublicEventVenue, S as StorefrontEventsRequestError, r as createEventsClient } from './client-CwOPPpFF.js';
1
+ import { C as CartHandler } from './createCartHandler-DJEZW4o2.js';
2
+ export { C as ClaimEventApprovalOffer, d as CreateEventApprovalRequest, e as CreateEventCheckoutSession, f as CreateEventWaitlistEntry, b as EventApprovalOfferResolution, g as EventApprovalRequestReceipt, a as EventCheckoutSession, h as EventFormAnswer, i as EventFormSubmissionInput, j as EventRegistrationMode, k as EventRegistrationResult, c as EventRegistrationSubmission, l as EventWaitlistReceipt, E as EventsClient, P as PublicEvent, m as PublicEventForm, n as PublicEventOccurrence, o as PublicEventSummary, p as PublicEventTicketType, q as PublicEventVenue, S as StorefrontEventsRequestError, r as createEventsClient } from './client-D-M3Y1ul.js';
3
3
  export { a as OfferTokenHistory, O as OfferTokenLocation, c as consumeOfferTokenFragment, o as offerTokenHrefMarker } from './offer-token-C-nk_nj8.js';
4
4
  import './client-D51WdvYR.js';
5
5
  import './http-types-CGh8WGHB.js';
6
- import './types-DZX8ScsJ.js';
6
+ import './types-C4yXcret.js';
7
7
  import './types-CSNXbGFW.js';
8
8
 
9
9
  declare class EventCartPreparationError extends Error {
package/dist/index.d.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  export { c as CacheCustom, d as CacheLong, e as CacheNone, f as CacheShort, C as CacheStrategy, H as HydrogenStorefrontClientOptions, K as KotaoCache, g as StaleIfErrorFallback, h as Storefront, a as StorefrontAuthHeader, i as StorefrontCache, b as StorefrontCacheInput, j as StorefrontCacheQueryOptions, k as StorefrontCacheRequest, S as StorefrontClient, l as StorefrontClientOptions, m as StorefrontClientResult, n as StorefrontDefaultCache, o as StorefrontQueryOptions, p as StorefrontQueryTimeoutError, q as StorefrontUpstreamError, r as createCache, s as createStorefrontClient, t as generateCacheControlHeader } from './client-D51WdvYR.js';
2
- import { C as Cart } from './types-DZX8ScsJ.js';
3
- export { k as CART_FORM_ACTIONS, b as CartAttribute, l as CartBuyerIdentity, c as CartBuyerIdentityInput, h as CartDeliveryAddress, j as CartFormAction, m as CartLine, a as CartLineInput, e as CartLineUpdateInput, f as CartMetafield, g as CartMetafieldIdentifier, d as CartMutationResult, i as CartSelectedDeliveryOption, n as CartUserError, o as HydrogenCart, p as HydrogenCartCreateInput, q as HydrogenCartMutationResult, H as HydrogenSession, r as HydrogenSessionData } from './types-DZX8ScsJ.js';
4
- import { c as ConsentBucket, C as ConsentState, B as BoundNonceProvider, A as AnalyticsContext } from './shop-CnrnSAJw.js';
5
- export { d as ANALYTICS_EVENTS, b as AnalyticsBus, e as AnalyticsBusOptions, f as AnalyticsDeviceClass, a as AnalyticsEmitter, h as AnalyticsEventMap, i as AnalyticsEventName, j as AnalyticsGeo, k as CONSENT_BUCKETS, l as CONSENT_COOKIE, m as CartForm, n as CartFormProps, o as CartViewedPayload, p as CollectionViewedPayload, D as DENIED_CONSENT, E as EventHandler, G as GRANTED_CONSENT, q as GetShopAnalyticsOptions, P as PageViewedPayload, r as PixelEvent, s as PixelSend, t as PixelTransport, v as PixelTransportOptions, w as ProductAddedToCartPayload, x as ProductViewedPayload, y as SearchViewedPayload, S as ShopAnalytics, z as buildConsentCookie, F as createAnalyticsBus, H as createAnalyticsEmitter, I as createPixelTransport, J as getShopAnalytics, K as isGranted, L as mergeConsent, M as parseConsent, N as readConsentCookie, O as serializeConsent } from './shop-CnrnSAJw.js';
6
- import { a as CartDispatchAction } from './createCartHandler-7DdKB-GF.js';
7
- export { b as CartGetId, C as CartHandler, c as CartSetId, d as CreateCartHandlerOptions, H as HydrogenCartHandlerOptions, R as RequestCartHandlerOptions, e as cartGetIdDefault, f as cartSetIdDefault, g as createCartHandler } from './createCartHandler-7DdKB-GF.js';
2
+ import { C as Cart } from './types-C4yXcret.js';
3
+ export { k as CART_FORM_ACTIONS, b as CartAttribute, l as CartBuyerIdentity, c as CartBuyerIdentityInput, h as CartDeliveryAddress, j as CartFormAction, m as CartLine, a as CartLineInput, e as CartLineUpdateInput, f as CartMetafield, g as CartMetafieldIdentifier, d as CartMutationResult, i as CartSelectedDeliveryOption, n as CartUserError, o as HydrogenCart, p as HydrogenCartCreateInput, q as HydrogenCartMutationResult, H as HydrogenSession, r as HydrogenSessionData } from './types-C4yXcret.js';
4
+ import { c as ConsentBucket, C as ConsentState, B as BoundNonceProvider, A as AnalyticsContext } from './shop-keSWbFKV.js';
5
+ export { d as ANALYTICS_EVENTS, b as AnalyticsBus, e as AnalyticsBusOptions, f as AnalyticsDeviceClass, a as AnalyticsEmitter, h as AnalyticsEventMap, i as AnalyticsEventName, j as AnalyticsGeo, k as CONSENT_BUCKETS, l as CONSENT_COOKIE, m as CartForm, n as CartFormProps, o as CartViewedPayload, p as CollectionViewedPayload, D as DENIED_CONSENT, E as EventHandler, G as GRANTED_CONSENT, q as GetShopAnalyticsOptions, P as PageViewedPayload, r as PixelEvent, s as PixelSend, t as PixelTransport, v as PixelTransportOptions, w as ProductAddedToCartPayload, x as ProductViewedPayload, y as SearchViewedPayload, S as ShopAnalytics, z as buildConsentCookie, F as createAnalyticsBus, H as createAnalyticsEmitter, I as createPixelTransport, J as getShopAnalytics, K as isGranted, L as mergeConsent, M as parseConsent, N as readConsentCookie, O as serializeConsent } from './shop-keSWbFKV.js';
6
+ import { a as CartDispatchAction } from './createCartHandler-DJEZW4o2.js';
7
+ export { b as CartGetId, C as CartHandler, c as CartSetId, d as CreateCartHandlerOptions, H as HydrogenCartHandlerOptions, R as RequestCartHandlerOptions, e as cartGetIdDefault, f as cartSetIdDefault, g as createCartHandler } from './createCartHandler-DJEZW4o2.js';
8
8
  import { c as ThemeSettingsSnapshot, R as ResolvedSettings } from './store-ZzoBbWir.js';
9
9
  export { b as ResolvedBlock, a as ResolvedSection, d as ResolvedValuesDocument, T as ThemeSettingsStore, e as createThemeSettingsStore } from './store-ZzoBbWir.js';
10
- import { C as CustomerAccountClient } from './routing-Bz3Cg0BW.js';
11
- export { A as Address, c as AddressConnection, d as CustomerAccount, e as CustomerAccountError, f as CustomerAccountErrorCode, G as GEO_HEADER, g as GEO_SIGNATURE_HEADER, h as Geo, K as KotaoContext, a as KotaoEnv, b as KotaoSession, L as LocalizePathOptions, M as Money, O as Order, i as OrderConnection, j as OrderPageInfo, k as OrdersOptions, R as ROUTING_LOCALE_HEADER, l as ROUTING_ORIGINAL_PATHNAME_HEADER, m as RequestLoginCodeInput, n as RequestLoginCodeResult, S as StorefrontExecutionContext, o as StorefrontMarketContext, p as StrippedLocalePath, V as VerifyLoginCodeInput, W as WithCache, q as createKotaoContext, r as createWithCache, t as isLocalePathSegment, u as localeFromAcceptLanguage, v as localeFromPathname, w as localeFromRequest, x as localizePath, y as marketContextFromHeaders, z as originalPathnameFromRequest, B as signGeo, D as stripLocalePrefixFromPathname, s as stripLocalePrefixFromRequest, E as trustedShopOriginFromHeaders, F as verifyGeo } from './routing-Bz3Cg0BW.js';
10
+ import { C as CustomerAccountClient } from './routing-BYc6JReb.js';
11
+ export { A as Address, c as AddressConnection, d as CustomerAccount, e as CustomerAccountError, f as CustomerAccountErrorCode, G as GEO_HEADER, g as GEO_SIGNATURE_HEADER, h as Geo, K as KotaoContext, a as KotaoEnv, b as KotaoSession, L as LocalizePathOptions, M as Money, O as Order, i as OrderConnection, j as OrderPageInfo, k as OrdersOptions, R as ROUTING_LOCALE_HEADER, l as ROUTING_ORIGINAL_PATHNAME_HEADER, m as RequestLoginCodeInput, n as RequestLoginCodeResult, S as StorefrontExecutionContext, o as StorefrontMarketContext, p as StrippedLocalePath, V as VerifyLoginCodeInput, W as WithCache, q as createKotaoContext, r as createWithCache, t as isLocalePathSegment, u as localeFromAcceptLanguage, v as localeFromPathname, w as localeFromRequest, x as localizePath, y as marketContextFromHeaders, z as originalPathnameFromRequest, B as signGeo, D as stripLocalePrefixFromPathname, s as stripLocalePrefixFromRequest, E as trustedShopOriginFromHeaders, F as verifyGeo } from './routing-BYc6JReb.js';
12
12
  export { AUTO_REDIRECT_LANGUAGE_HEADER, MARKET_ALTERNATE_LOCALES_HEADER, MARKET_CANONICAL_URL_HEADER, MARKET_DEFAULT_LOCALE_HEADER, MARKET_ID_HEADER, MARKET_PATH_PREFIX_HEADER, MARKET_ROOT_URLS_HEADER, MARKET_SETTINGS_ENVIRONMENT_HEADER, MARKET_THEME_ID_HEADER, autoRedirectEnabled } from '@kotao/storefront-contracts';
13
13
  export { ImageAttrs, ImageAttrsOptions, ImageCrop, ImageData, ImageFit, ImageFormat, ImageSrcSetOptions, ImageUrlOptions, buildImageAttrs, imageSrcSet, imageUrl } from './image.js';
14
14
  export { C as Connection, a as ConnectionEdge, F as FlattenableConnection, b as PageInfo, P as PaginationInfo, c as PaginationOptions, d as PaginationVariables, f as flattenConnection, g as getPaginationInfo, e as getPaginationVariables } from './pagination-DCrQk02Q.js';
@@ -20,7 +20,7 @@ export { A as Alternate, J as JsonLd, O as OpenGraph, a as OpenGraphImage, S as
20
20
  export { c as FormAnswer, a as FormAnswers, d as FormBlock, e as FormField, b as FormFieldErrors, f as FormLocalizedText, g as FormRenderState, h as FormSubmission, F as FormVersionSchema, i as FormVisibilityRule, P as PublicForm, j as PublicFormDefinition, k as PublicFormVersion } from './types-CSNXbGFW.js';
21
21
  export { ADDRESS_PROPERTIES, FORM_ANSWER_PREFIX, FormFetchOptions, RenderFormHtmlOptions, ShopifyContactCompatibility, ShopifyContactInput, StorefrontFormRequestError, SubmitFormInput, adaptShopifyContactForm, evaluateFormRule, formAnswerName, formFields, isFormFieldVisible, loadPublishedForm, parseFormAnswers, renderFormHtml, resolveFormText, submitPublishedForm } from './forms.js';
22
22
  export { EventCartPreparationError, eventCartToken, prepareEventCart } from './events.js';
23
- export { C as ClaimEventApprovalOffer, d as CreateEventApprovalRequest, e as CreateEventCheckoutSession, f as CreateEventWaitlistEntry, b as EventApprovalOfferResolution, g as EventApprovalRequestReceipt, a as EventCheckoutSession, h as EventFormAnswer, i as EventFormSubmissionInput, j as EventRegistrationMode, k as EventRegistrationResult, c as EventRegistrationSubmission, l as EventWaitlistReceipt, E as EventsClient, P as PublicEvent, m as PublicEventForm, n as PublicEventOccurrence, o as PublicEventSummary, p as PublicEventTicketType, q as PublicEventVenue, S as StorefrontEventsRequestError, r as createEventsClient } from './client-CwOPPpFF.js';
23
+ export { C as ClaimEventApprovalOffer, d as CreateEventApprovalRequest, e as CreateEventCheckoutSession, f as CreateEventWaitlistEntry, b as EventApprovalOfferResolution, g as EventApprovalRequestReceipt, a as EventCheckoutSession, h as EventFormAnswer, i as EventFormSubmissionInput, j as EventRegistrationMode, k as EventRegistrationResult, c as EventRegistrationSubmission, l as EventWaitlistReceipt, E as EventsClient, P as PublicEvent, m as PublicEventForm, n as PublicEventOccurrence, o as PublicEventSummary, p as PublicEventTicketType, q as PublicEventVenue, S as StorefrontEventsRequestError, r as createEventsClient } from './client-D-M3Y1ul.js';
24
24
  export { a as OfferTokenHistory, O as OfferTokenLocation, c as consumeOfferTokenFragment, o as offerTokenHrefMarker } from './offer-token-C-nk_nj8.js';
25
25
  export { C as CreateStorefrontEditorBridgeArgs, b as CreateStorefrontEditorHostBridgeArgs, c as StorefrontEditorAppExtensionPreview, d as StorefrontEditorBlockSchema, e as StorefrontEditorBridge, f as StorefrontEditorCanvasAction, g as StorefrontEditorCanvasBlockAction, h as StorefrontEditorCanvasPosition, i as StorefrontEditorCanvasSectionAction, j as StorefrontEditorDocument, k as StorefrontEditorHostBridge, l as StorefrontEditorMessageEvent, S as StorefrontEditorMessageSource, a as StorefrontEditorMessageTarget, m as StorefrontEditorNavigationRequest, n as StorefrontEditorReady, o as StorefrontEditorRect, p as StorefrontEditorSectionPreset, q as StorefrontEditorSectionPresetBlock, r as StorefrontEditorSectionSchema, s as StorefrontEditorSelection, t as StorefrontEditorSelectionScope, u as StorefrontEditorSettingInput, v as StorefrontEditorSettingOption, w as StorefrontEditorThemeStyle, y as createStorefrontEditorBridge, z as createStorefrontEditorHostBridge, A as positionStorefrontEditorCanvasToolbar } from './bridge-CfNBWu0H.js';
26
26
  export { S as STOREFRONT_SECTION_CUSTOM_CSS_SETTING, s as scopeStorefrontSectionCss } from './custom-css-Bl7Ur3-H.js';
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  export { getAdjacentAndFirstAvailableVariants, getProductOptions, getSelectedProductOptions, getSelectedVariant, mapSelectedProductOptionToObject, useOptimisticVariant, useSelectedOptionInUrlParam } from './chunk-QOEEUTHQ.js';
2
- import { createNonceProvider } from './chunk-RFM27BKZ.js';
3
- export { CartForm, collectAnalyticsAttribution, createAnalyticsBus, createAnalyticsEmitter, createPixelTransport } from './chunk-RFM27BKZ.js';
2
+ import { createNonceProvider } from './chunk-S4HW5NH7.js';
3
+ export { CartForm, collectAnalyticsAttribution, createAnalyticsBus, createAnalyticsEmitter, createPixelTransport } from './chunk-S4HW5NH7.js';
4
4
  export { flattenConnection, getPaginationInfo, getPaginationVariables } from './chunk-5QOFKGKD.js';
5
- import { CHECKOUT_DESIGN_TOKEN_INPUTS, localizePath, buildLocalizationCookie, extractCheckoutDesignTokens, readLocalizationCookie } from './chunk-DTKLAOKR.js';
6
- export { CART_ID_COOKIE, CHECKOUT_CONSENT_CATEGORIES, CHECKOUT_CONSENT_PARAM_PREFIX, CHECKOUT_DESIGN_TOKEN_INPUTS, CUSTOMER_SESSION_COOKIE, CacheCustom, CacheLong, CacheNone, CacheShort, CustomerAccountError, DEFAULT_HOSTED_SESSION_MAX_AGE, DEFAULT_SESSION_MAX_AGE, GEO_HEADER, GEO_SIGNATURE_HEADER, HOSTED_CUSTOMER_CSRF_COOKIE, HOSTED_CUSTOMER_CSRF_HEADER, HOSTED_CUSTOMER_SESSION_COOKIE, LOCALIZATION_COOKIE, MARKET_ALTERNATE_LOCALES_HEADER, MARKET_CANONICAL_URL_HEADER, MARKET_DEFAULT_LOCALE_HEADER, MARKET_ID_HEADER, MARKET_PATH_PREFIX_HEADER, MARKET_ROOT_URLS_HEADER, MARKET_SETTINGS_ENVIRONMENT_HEADER, MARKET_THEME_ID_HEADER, MAX_HOSTED_SESSION_MAX_AGE, MAX_LEGACY_CUSTOMER_SESSION_TOKEN_LENGTH, ROUTING_LOCALE_HEADER, ROUTING_ORIGINAL_PATHNAME_HEADER, StorefrontDefaultCache, StorefrontQueryTimeoutError, StorefrontUpstreamError, buildCartIdCookie, buildCustomerSessionCookie, buildHostedCustomerSessionCookie, buildLocalizationCookie, cartGetIdDefault, cartSetIdDefault, clearCartIdCookie, clearCustomerSessionCookie, clearHostedCustomerSessionCookie, clearLegacyCustomerSessionCookie, createCache, createCartHandler, createCustomerAccountClient, createKotaoContext, createStorefrontClient, createWithCache, decodeCheckoutConsent, encodeCheckoutConsent, extractCheckoutDesignTokens, generateCacheControlHeader, isLocalePathSegment, localeFromAcceptLanguage, localeFromPathname, localeFromRequest, localizePath, marketContextFromHeaders, originalPathnameFromRequest, readCartIdCookie, readCustomerSessionToken, readHostedCustomerCsrfToken, readHostedCustomerSessionToken, readLegacyCustomerSessionToken, readLocalizationCookie, resolveCheckoutUrl, shopHostname, signGeo, stripLocalePrefixFromPathname, stripLocalePrefixFromRequest, trustedShopOriginFromHeaders, verifyGeo } from './chunk-DTKLAOKR.js';
5
+ import { CHECKOUT_DESIGN_TOKEN_INPUTS, localizePath, buildLocalizationCookie, extractCheckoutDesignTokens, readLocalizationCookie } from './chunk-PHEKJDFW.js';
6
+ export { CART_ID_COOKIE, CHECKOUT_CONSENT_CATEGORIES, CHECKOUT_CONSENT_PARAM_PREFIX, CHECKOUT_DESIGN_TOKEN_INPUTS, CUSTOMER_SESSION_COOKIE, CacheCustom, CacheLong, CacheNone, CacheShort, CustomerAccountError, DEFAULT_HOSTED_SESSION_MAX_AGE, DEFAULT_SESSION_MAX_AGE, GEO_HEADER, GEO_SIGNATURE_HEADER, HOSTED_CUSTOMER_CSRF_COOKIE, HOSTED_CUSTOMER_CSRF_HEADER, HOSTED_CUSTOMER_SESSION_COOKIE, LOCALIZATION_COOKIE, MARKET_ALTERNATE_LOCALES_HEADER, MARKET_CANONICAL_URL_HEADER, MARKET_DEFAULT_LOCALE_HEADER, MARKET_ID_HEADER, MARKET_PATH_PREFIX_HEADER, MARKET_ROOT_URLS_HEADER, MARKET_SETTINGS_ENVIRONMENT_HEADER, MARKET_THEME_ID_HEADER, MAX_HOSTED_SESSION_MAX_AGE, MAX_LEGACY_CUSTOMER_SESSION_TOKEN_LENGTH, ROUTING_LOCALE_HEADER, ROUTING_ORIGINAL_PATHNAME_HEADER, StorefrontDefaultCache, StorefrontQueryTimeoutError, StorefrontUpstreamError, buildCartIdCookie, buildCustomerSessionCookie, buildHostedCustomerSessionCookie, buildLocalizationCookie, cartGetIdDefault, cartSetIdDefault, clearCartIdCookie, clearCustomerSessionCookie, clearHostedCustomerSessionCookie, clearLegacyCustomerSessionCookie, createCache, createCartHandler, createCustomerAccountClient, createKotaoContext, createStorefrontClient, createWithCache, decodeCheckoutConsent, encodeCheckoutConsent, extractCheckoutDesignTokens, generateCacheControlHeader, isLocalePathSegment, localeFromAcceptLanguage, localeFromPathname, localeFromRequest, localizePath, marketContextFromHeaders, originalPathnameFromRequest, readCartIdCookie, readCustomerSessionToken, readHostedCustomerCsrfToken, readHostedCustomerSessionToken, readLegacyCustomerSessionToken, readLocalizationCookie, resolveCheckoutUrl, shopHostname, signGeo, stripLocalePrefixFromPathname, stripLocalePrefixFromRequest, trustedShopOriginFromHeaders, verifyGeo } from './chunk-PHEKJDFW.js';
7
7
  import { CART_FORM_ACTIONS, CONSENT_BUCKETS } from './chunk-OGWYTYYS.js';
8
8
  export { CART_FORM_ACTIONS, CONSENT_BUCKETS, CONSENT_COOKIE, DENIED_CONSENT, GRANTED_CONSENT, buildConsentCookie, isGranted, mergeConsent, parseConsent, readConsentCookie, serializeConsent } from './chunk-OGWYTYYS.js';
9
9
  export { URL_REDIRECT_QUERY, breadcrumbListJsonLd, buildRobotsTxt, buildSitemapIndexXml, buildSitemapXml, localBusinessJsonLd, organizationJsonLd, productJsonLd, resolveRedirect, resolveStorefrontRedirect, restaurantJsonLd, robotsResponse, sitemapIndexResponse, sitemapResponse, storefrontRedirect, websiteJsonLd } from './chunk-W74FGUZH.js';
@@ -1,13 +1,13 @@
1
- import { K as KotaoContext, a as KotaoEnv, S as StorefrontExecutionContext } from './routing-Bz3Cg0BW.js';
2
- export { b as KotaoSession, s as stripLocalePrefixFromRequest } from './routing-Bz3Cg0BW.js';
1
+ import { K as KotaoContext, a as KotaoEnv, S as StorefrontExecutionContext } from './routing-BYc6JReb.js';
2
+ export { b as KotaoSession, s as stripLocalePrefixFromRequest } from './routing-BYc6JReb.js';
3
3
  import * as react_router from 'react-router';
4
4
  import { RouterContextProvider } from 'react-router';
5
- import { H as HydrogenSession } from './types-DZX8ScsJ.js';
5
+ import { H as HydrogenSession } from './types-C4yXcret.js';
6
6
  import { b as StorefrontCacheInput } from './client-D51WdvYR.js';
7
7
  import './fetch-Bq_cc8_G.js';
8
8
  import '@kotao/storefront-contracts/theme';
9
- import './createCartHandler-7DdKB-GF.js';
10
- import './client-CwOPPpFF.js';
9
+ import './createCartHandler-DJEZW4o2.js';
10
+ import './client-D-M3Y1ul.js';
11
11
  import './types-CSNXbGFW.js';
12
12
  import './http-types-CGh8WGHB.js';
13
13
 
@@ -1,5 +1,5 @@
1
- import { createKotaoContext } from './chunk-DTKLAOKR.js';
2
- export { stripLocalePrefixFromRequest } from './chunk-DTKLAOKR.js';
1
+ import { createKotaoContext } from './chunk-PHEKJDFW.js';
2
+ export { stripLocalePrefixFromRequest } from './chunk-PHEKJDFW.js';
3
3
  import './chunk-OGWYTYYS.js';
4
4
  import './chunk-2MRB6SMP.js';
5
5
  import './chunk-CKGI3Y7L.js';
package/dist/react.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import react__default, { ReactNode, ReactElement, ImgHTMLAttributes, VideoHTMLAttributes, ElementType, AnchorHTMLAttributes, CSSProperties, ComponentPropsWithoutRef, ComponentType } from 'react';
2
2
  import { FetcherWithComponents } from 'react-router';
3
- import { j as CartFormAction, a as CartLineInput } from './types-DZX8ScsJ.js';
4
- import { g as getCartFormInput, S as ShopAnalytics, A as AnalyticsContext, C as ConsentState, a as AnalyticsEmitter, b as AnalyticsBus } from './shop-CnrnSAJw.js';
5
- export { u as useNonce } from './shop-CnrnSAJw.js';
3
+ import { j as CartFormAction, a as CartLineInput } from './types-C4yXcret.js';
4
+ import { g as getCartFormInput, S as ShopAnalytics, A as AnalyticsContext, C as ConsentState, a as AnalyticsEmitter, b as AnalyticsBus } from './shop-keSWbFKV.js';
5
+ export { u as useNonce } from './shop-keSWbFKV.js';
6
6
  import { Cart } from './storefront-api-types.js';
7
7
  import { ImageAttrsOptions, ImageData, ImageCrop, ImageFormat } from './image.js';
8
8
  import { C as Connection, P as PaginationInfo } from './pagination-DCrQk02Q.js';
package/dist/react.js CHANGED
@@ -1,5 +1,5 @@
1
- import { getCartFormInput, createAnalyticsBus, collectAnalyticsAttribution, createPixelTransport } from './chunk-RFM27BKZ.js';
2
- export { useNonce } from './chunk-RFM27BKZ.js';
1
+ import { getCartFormInput, createAnalyticsBus, collectAnalyticsAttribution, createPixelTransport } from './chunk-S4HW5NH7.js';
2
+ export { useNonce } from './chunk-S4HW5NH7.js';
3
3
  import { getPaginationInfo } from './chunk-5QOFKGKD.js';
4
4
  import { CART_FORM_ACTIONS, GRANTED_CONSENT, CONSENT_COOKIE, readConsentCookie, mergeConsent, buildConsentCookie } from './chunk-OGWYTYYS.js';
5
5
  import { getSeoMeta, serializeJsonLd } from './chunk-SVMYFYIA.js';
@@ -39,6 +39,93 @@ function useOptimisticData(_id) {
39
39
  return void 0;
40
40
  }
41
41
 
42
+ // src/react/presence-tracker.ts
43
+ function startPresenceTracking(options) {
44
+ let tabId;
45
+ let sequence = 0;
46
+ let lastActivity = Date.now();
47
+ let lastUrl = "";
48
+ let stage = "browsing";
49
+ let interval;
50
+ let stopped = false;
51
+ const activity = (nextStage) => {
52
+ if (document.visibilityState !== "visible") return;
53
+ lastActivity = Date.now();
54
+ if (nextStage) stage = nextStage;
55
+ };
56
+ const onInteraction = () => activity();
57
+ const send = (visible) => {
58
+ if (!options.consent()) return;
59
+ if (!tabId) {
60
+ if (typeof globalThis.crypto?.randomUUID !== "function") return;
61
+ tabId = globalThis.crypto.randomUUID();
62
+ }
63
+ const context = options.context();
64
+ if (context.url !== lastUrl) {
65
+ lastUrl = context.url ?? "";
66
+ const path = new URL(lastUrl, window.location.href).pathname;
67
+ stage = /^\/checkout(?:\/|$)/.test(path) ? "checkout" : /^\/cart(?:\/|$)/.test(path) ? "cart" : /\/products\//.test(path) ? "product" : "browsing";
68
+ lastActivity = Date.now();
69
+ }
70
+ options.send(
71
+ options.endpoint,
72
+ JSON.stringify({
73
+ events: [
74
+ {
75
+ event: "visitor_presence",
76
+ context,
77
+ consent: true,
78
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
79
+ payload: {
80
+ tabId,
81
+ sequence: ++sequence,
82
+ visible,
83
+ stage,
84
+ idleSeconds: Math.min(
85
+ 86400,
86
+ Math.max(0, Math.floor((Date.now() - lastActivity) / 1e3))
87
+ )
88
+ }
89
+ }
90
+ ]
91
+ })
92
+ );
93
+ };
94
+ const visibility = () => {
95
+ if (interval !== void 0) clearInterval(interval);
96
+ interval = void 0;
97
+ const visible = document.visibilityState === "visible";
98
+ send(visible);
99
+ if (visible) interval = setInterval(() => send(true), 2e4);
100
+ };
101
+ const hide = () => {
102
+ if (interval !== void 0) clearInterval(interval);
103
+ interval = void 0;
104
+ send(false);
105
+ };
106
+ const resume = (event) => {
107
+ if (event.persisted) visibility();
108
+ };
109
+ const events = ["pointerdown", "keydown", "scroll"];
110
+ for (const event of events) document.addEventListener(event, onInteraction, { passive: true });
111
+ document.addEventListener("visibilitychange", visibility);
112
+ window.addEventListener("pagehide", hide);
113
+ window.addEventListener("pageshow", resume);
114
+ visibility();
115
+ return {
116
+ activity,
117
+ stop() {
118
+ if (stopped) return;
119
+ stopped = true;
120
+ hide();
121
+ for (const event of events) document.removeEventListener(event, onInteraction);
122
+ document.removeEventListener("visibilitychange", visibility);
123
+ window.removeEventListener("pagehide", hide);
124
+ window.removeEventListener("pageshow", resume);
125
+ }
126
+ };
127
+ }
128
+
42
129
  // src/analytics/anonymous-context.ts
43
130
  function anonymousPageContext(candidateUrl, currentUrl) {
44
131
  if (!candidateUrl || !currentUrl) return {};
@@ -56,7 +143,10 @@ function anonymousPageContext(candidateUrl, currentUrl) {
56
143
  }
57
144
  var beaconSend = (endpoint, body) => {
58
145
  if (typeof navigator !== "undefined" && typeof navigator.sendBeacon === "function") {
59
- if (navigator.sendBeacon(endpoint, new Blob([body], { type: "application/json" }))) return;
146
+ try {
147
+ if (navigator.sendBeacon(endpoint, new Blob([body], { type: "application/json" }))) return;
148
+ } catch {
149
+ }
60
150
  }
61
151
  if (typeof fetch === "function") {
62
152
  void fetch(endpoint, {
@@ -64,6 +154,7 @@ var beaconSend = (endpoint, body) => {
64
154
  body,
65
155
  keepalive: true,
66
156
  headers: { "content-type": "application/json" }
157
+ }).catch(() => {
67
158
  });
68
159
  }
69
160
  };
@@ -142,6 +233,31 @@ function AnalyticsProvider(props) {
142
233
  useEffect(() => {
143
234
  bus.publish("page_viewed", {});
144
235
  }, [bus, props.url]);
236
+ useEffect(() => {
237
+ const tracker = startPresenceTracking({
238
+ endpoint: endpointRef.current ?? "/api/storefront/pixel",
239
+ send: beaconSend,
240
+ consent: () => consentRef.current.analytics,
241
+ context: () => ({
242
+ ...collectAnalyticsAttribution({
243
+ referrer: document.referrer,
244
+ search: window.location.search,
245
+ ...typeof window.matchMedia === "function" ? { matchMedia: (query) => window.matchMedia(query) } : {}
246
+ }),
247
+ ...contextRef.current
248
+ })
249
+ });
250
+ const unsubscribers = [
251
+ bus.emitter.subscribe("product_added_to_cart", () => tracker.activity("cart")),
252
+ bus.emitter.subscribe("cart_viewed", () => tracker.activity("cart")),
253
+ bus.emitter.subscribe("product_viewed", () => tracker.activity("product"))
254
+ ];
255
+ return () => {
256
+ tracker.stop();
257
+ unsubscribers.forEach((unsubscribe) => unsubscribe());
258
+ bus.flush();
259
+ };
260
+ }, [bus]);
145
261
  useEffect(() => {
146
262
  if (typeof document === "undefined") return;
147
263
  const onHide = () => bus.flush();