@ticketlayer/live 0.2.0
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/LICENSE +21 -0
- package/README.md +198 -0
- package/dist/auto.d.ts +31 -0
- package/dist/auto.d.ts.map +1 -0
- package/dist/auto.js +78 -0
- package/dist/auto.js.map +1 -0
- package/dist/client.d.ts +538 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +495 -0
- package/dist/client.js.map +1 -0
- package/dist/clientHeader.d.ts +4 -0
- package/dist/clientHeader.d.ts.map +1 -0
- package/dist/clientHeader.js +25 -0
- package/dist/clientHeader.js.map +1 -0
- package/dist/core/liveClient.d.ts +176 -0
- package/dist/core/liveClient.d.ts.map +1 -0
- package/dist/core/liveClient.js +372 -0
- package/dist/core/liveClient.js.map +1 -0
- package/dist/createLiveClient.d.ts +49 -0
- package/dist/createLiveClient.d.ts.map +1 -0
- package/dist/createLiveClient.js +91 -0
- package/dist/createLiveClient.js.map +1 -0
- package/dist/elements.d.ts +88 -0
- package/dist/elements.d.ts.map +1 -0
- package/dist/elements.js +165 -0
- package/dist/elements.js.map +1 -0
- package/dist/generated/types.d.ts +6110 -0
- package/dist/generated/types.d.ts.map +1 -0
- package/dist/generated/types.js +6 -0
- package/dist/generated/types.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/native/asyncStorageStorage.d.ts +24 -0
- package/dist/native/asyncStorageStorage.d.ts.map +1 -0
- package/dist/native/asyncStorageStorage.js +24 -0
- package/dist/native/asyncStorageStorage.js.map +1 -0
- package/dist/native/checkoutUrl.d.ts +85 -0
- package/dist/native/checkoutUrl.d.ts.map +1 -0
- package/dist/native/checkoutUrl.js +147 -0
- package/dist/native/checkoutUrl.js.map +1 -0
- package/dist/native/index.d.ts +119 -0
- package/dist/native/index.d.ts.map +1 -0
- package/dist/native/index.js +145 -0
- package/dist/native/index.js.map +1 -0
- package/dist/native/secureStoreStorage.d.ts +33 -0
- package/dist/native/secureStoreStorage.d.ts.map +1 -0
- package/dist/native/secureStoreStorage.js +39 -0
- package/dist/native/secureStoreStorage.js.map +1 -0
- package/dist/native/storage.d.ts +29 -0
- package/dist/native/storage.d.ts.map +1 -0
- package/dist/native/storage.js +24 -0
- package/dist/native/storage.js.map +1 -0
- package/dist/server.d.ts +95 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +188 -0
- package/dist/server.js.map +1 -0
- package/dist/state/buyModal.d.ts +24 -0
- package/dist/state/buyModal.d.ts.map +1 -0
- package/dist/state/buyModal.js +56 -0
- package/dist/state/buyModal.js.map +1 -0
- package/dist/state/checkoutModal.d.ts +26 -0
- package/dist/state/checkoutModal.d.ts.map +1 -0
- package/dist/state/checkoutModal.js +126 -0
- package/dist/state/checkoutModal.js.map +1 -0
- package/dist/state/emitter.d.ts +21 -0
- package/dist/state/emitter.d.ts.map +1 -0
- package/dist/state/emitter.js +26 -0
- package/dist/state/emitter.js.map +1 -0
- package/dist/state/loadElements.d.ts +8 -0
- package/dist/state/loadElements.d.ts.map +1 -0
- package/dist/state/loadElements.js +39 -0
- package/dist/state/loadElements.js.map +1 -0
- package/dist/state/registry.d.ts +39 -0
- package/dist/state/registry.d.ts.map +1 -0
- package/dist/state/registry.js +65 -0
- package/dist/state/registry.js.map +1 -0
- package/dist/state/theme.d.ts +20 -0
- package/dist/state/theme.d.ts.map +1 -0
- package/dist/state/theme.js +47 -0
- package/dist/state/theme.js.map +1 -0
- package/dist/ticketlayer.js +5 -0
- package/dist/ticketlayer.js.map +7 -0
- package/dist/version.d.ts +7 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +7 -0
- package/dist/version.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { LiveClient } from './client.js';
|
|
2
|
+
import { publishClient } from './state/registry.js';
|
|
3
|
+
import { loadElements } from './state/loadElements.js';
|
|
4
|
+
import { installCheckoutModal } from './state/checkoutModal.js';
|
|
5
|
+
import { installBuyModal } from './state/buyModal.js';
|
|
6
|
+
import { createElementsConnector } from './elements.js';
|
|
7
|
+
import { API_DATED_VERSION } from './client.js';
|
|
8
|
+
import { TicketlayerLive } from './core/liveClient.js';
|
|
9
|
+
/**
|
|
10
|
+
* Browser adapter over the runtime-neutral core in ./core/liveClient.ts:
|
|
11
|
+
* resolves the channel from the page host, picks the session transport
|
|
12
|
+
* (cookie for a hosted storefront, token for embeds), publishes the client on
|
|
13
|
+
* `window.Ticketlayer`, applies the theme and mounts the modals. The class
|
|
14
|
+
* itself is re-exported here so existing imports keep working.
|
|
15
|
+
*/
|
|
16
|
+
export { TicketlayerLive };
|
|
17
|
+
/** Resolve a hosted storefront's publishable key by domain (GET /channel). */
|
|
18
|
+
async function resolveChannelKey(baseUrl, domain) {
|
|
19
|
+
try {
|
|
20
|
+
const res = await fetch(`${baseUrl.replace(/\/$/, '')}/channel?domain=${encodeURIComponent(domain)}`, { headers: { accept: 'application/json' } });
|
|
21
|
+
if (!res.ok)
|
|
22
|
+
return undefined;
|
|
23
|
+
const json = (await res.json());
|
|
24
|
+
return json?.data?.publishableKey;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export async function createLiveClient(options) {
|
|
31
|
+
const domain = options.domain ?? (typeof window !== 'undefined' ? window.location.host : undefined);
|
|
32
|
+
// Resolve the channel's publishable key - the READ credential. Embeds pass it
|
|
33
|
+
// directly; a hosted storefront resolves it ONCE by domain and then uses it
|
|
34
|
+
// for all reads (no per-read domain lookup, no session). Browsing never
|
|
35
|
+
// creates a session - that happens lazily on the first mutation/login.
|
|
36
|
+
let publishableKey = options.publishableKey;
|
|
37
|
+
if (!publishableKey && !options.sessionToken && domain) {
|
|
38
|
+
publishableKey = await resolveChannelKey(options.baseUrl, domain);
|
|
39
|
+
}
|
|
40
|
+
// Transport: embed/handoff use the header (token); a hosted storefront uses
|
|
41
|
+
// the cookie for its (lazily-created) session.
|
|
42
|
+
const isEmbed = !!options.publishableKey || !!options.sessionToken;
|
|
43
|
+
const sessionMode = options.sessionMode ?? (isEmbed ? 'token' : 'cookie');
|
|
44
|
+
const client = new LiveClient({
|
|
45
|
+
...options,
|
|
46
|
+
sessionMode,
|
|
47
|
+
...(publishableKey ? { publishableKey } : {}),
|
|
48
|
+
});
|
|
49
|
+
const tl = new TicketlayerLive(client, {
|
|
50
|
+
sessionMode,
|
|
51
|
+
baseUrl: options.baseUrl,
|
|
52
|
+
...(publishableKey ? { publishableKey } : {}),
|
|
53
|
+
...(domain ? { domain } : {}),
|
|
54
|
+
});
|
|
55
|
+
// Publish the singleton + Elements connector so Elements bind immediately.
|
|
56
|
+
if (options.publish !== false && typeof window !== 'undefined') {
|
|
57
|
+
publishClient(tl, createElementsConnector(tl), API_DATED_VERSION);
|
|
58
|
+
}
|
|
59
|
+
// Third-party embeds: auto-open the hosted checkout iframe on checkout intents.
|
|
60
|
+
if (options.checkout?.mode === 'modal' && typeof window !== 'undefined') {
|
|
61
|
+
installCheckoutModal(tl, options.checkout);
|
|
62
|
+
}
|
|
63
|
+
// In-page buy-tickets modal (occurrence → ticket selection). Native Elements
|
|
64
|
+
// overlay mounted on `ui:event-modal-requested`; works on HBO and embeds. Tied
|
|
65
|
+
// to the published client (the one driving on-page UI), opt out via buyModal.
|
|
66
|
+
if (options.buyModal !== false && options.publish !== false && typeof window !== 'undefined') {
|
|
67
|
+
installBuyModal(tl);
|
|
68
|
+
}
|
|
69
|
+
const elementsLoad = loadElements(options).catch((err) => {
|
|
70
|
+
console.error('[live] Elements auto-load failed', err);
|
|
71
|
+
});
|
|
72
|
+
if (options.autoStart !== false) {
|
|
73
|
+
// Embed iframe resumes a handed-off session; everyone else stays
|
|
74
|
+
// session-less until the first mutation. Theme applies via the pk.
|
|
75
|
+
if (options.sessionToken) {
|
|
76
|
+
await tl.resume(options.sessionToken);
|
|
77
|
+
}
|
|
78
|
+
else if (sessionMode === 'cookie' && typeof window !== 'undefined') {
|
|
79
|
+
// Hosted browser: if a session cookie already exists (a returning visitor
|
|
80
|
+
// mid-purchase, or a refresh/deep-link), rehydrate its cart without
|
|
81
|
+
// creating a session. A brand-new visitor 401s here and stays lazy.
|
|
82
|
+
await tl.resumeIfExists().catch(() => undefined);
|
|
83
|
+
}
|
|
84
|
+
if (options.applyTheme !== false && typeof window !== 'undefined') {
|
|
85
|
+
await tl.theme.apply().catch(() => undefined);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
await elementsLoad;
|
|
89
|
+
return tl;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=createLiveClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createLiveClient.js","sourceRoot":"","sources":["../src/createLiveClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Elements connector - adapts the stateful {@link TicketlayerLive} facade to the
|
|
3
|
+
* structural interface `@ticketlayer/elements` components consume.
|
|
4
|
+
*
|
|
5
|
+
* Elements never import @ticketlayer/live directly: they bind to a generic
|
|
6
|
+
* shape published on a window global (`setSDK(...)`), so the SDK and the
|
|
7
|
+
* components can ship as separate bundles (e.g. the Elements CDN build). This
|
|
8
|
+
* adapter is the bridge a host (HBO, a promoter site) installs:
|
|
9
|
+
*
|
|
10
|
+
* import { createLiveClient, createElementsConnector } from '@ticketlayer/live';
|
|
11
|
+
* import { setSDK } from '@ticketlayer/elements';
|
|
12
|
+
* const tl = await createLiveClient({ ... });
|
|
13
|
+
* setSDK(createElementsConnector(tl));
|
|
14
|
+
*
|
|
15
|
+
* Two responsibilities the components expect that the facade doesn't expose 1:1:
|
|
16
|
+
* - cart line items need a `categoryId` the components never pass; we resolve
|
|
17
|
+
* it from the ticketTypeId captured when `getTicketTypes()` was called (the
|
|
18
|
+
* ticket selector always loads types before adding - so the cache is warm).
|
|
19
|
+
* - modal verbs (`event(id).openModal()`, `checkout.openModal()`, `closeModal()`)
|
|
20
|
+
* are UI INTENTS: the SDK renders no UI, it relays them onto the shared bus
|
|
21
|
+
* (ui:event-modal-requested / ui:checkout-requested / ui:modal-close-requested)
|
|
22
|
+
* and the host opens the modal. Caller callbacks ride along in the payload.
|
|
23
|
+
*/
|
|
24
|
+
import type { TicketlayerLive, PresaleRedemption } from './createLiveClient.js';
|
|
25
|
+
export interface ModalOptions {
|
|
26
|
+
occurrenceId?: string;
|
|
27
|
+
onComplete?: (order: unknown) => void;
|
|
28
|
+
onError?: (error: Error) => void;
|
|
29
|
+
onClose?: () => void;
|
|
30
|
+
}
|
|
31
|
+
export interface ElementsConnector {
|
|
32
|
+
getEventsManager(): {
|
|
33
|
+
list(options?: {
|
|
34
|
+
limit?: number;
|
|
35
|
+
category?: string;
|
|
36
|
+
}): Promise<{
|
|
37
|
+
items: unknown[];
|
|
38
|
+
}>;
|
|
39
|
+
get(eventId: string): Promise<unknown>;
|
|
40
|
+
getTicketTypes(eventId: string, occurrenceId: string): Promise<unknown[]>;
|
|
41
|
+
};
|
|
42
|
+
getCartManager(): {
|
|
43
|
+
get(): Promise<unknown>;
|
|
44
|
+
on(event: string, cb: (data: unknown) => void): () => void;
|
|
45
|
+
off(event: string, cb: (data: unknown) => void): void;
|
|
46
|
+
addItem(ticketTypeId: string, quantity: number, occurrenceId: string): Promise<unknown>;
|
|
47
|
+
addItems(items: Array<{
|
|
48
|
+
ticketTypeId: string;
|
|
49
|
+
quantity: number;
|
|
50
|
+
occurrenceId: string;
|
|
51
|
+
}>): Promise<unknown>;
|
|
52
|
+
removeItem(itemId: string): Promise<unknown>;
|
|
53
|
+
addSeat(seatId: string, ticketTypeId: string, occurrenceId: string): Promise<unknown>;
|
|
54
|
+
removeSeat(seatId: string, occurrenceId: string): Promise<unknown>;
|
|
55
|
+
};
|
|
56
|
+
getOrdersManager(): {
|
|
57
|
+
mine(): Promise<unknown>;
|
|
58
|
+
get(orderId: string): Promise<unknown>;
|
|
59
|
+
ticketPdf(orderId: string, passId: string): Promise<Blob>;
|
|
60
|
+
};
|
|
61
|
+
/** Magic-link sign-in (tl-login, tl-my-orders). Never sees a password. */
|
|
62
|
+
getAuthManager(): {
|
|
63
|
+
readonly customer: unknown | null;
|
|
64
|
+
readonly authenticated: boolean;
|
|
65
|
+
requestMagicLink(contact: {
|
|
66
|
+
email?: string;
|
|
67
|
+
phone?: string;
|
|
68
|
+
}): Promise<unknown>;
|
|
69
|
+
exchange(code: string): Promise<unknown>;
|
|
70
|
+
logout(): Promise<void>;
|
|
71
|
+
};
|
|
72
|
+
/** Presale / promo codes (tl-promo-code). */
|
|
73
|
+
getPresaleManager(): {
|
|
74
|
+
redeem(code: string): Promise<PresaleRedemption>;
|
|
75
|
+
};
|
|
76
|
+
on(event: string, cb: (data: unknown) => void): () => void;
|
|
77
|
+
off(event: string, cb: (data: unknown) => void): void;
|
|
78
|
+
event(eventId: string): {
|
|
79
|
+
openModal(options?: ModalOptions): void;
|
|
80
|
+
};
|
|
81
|
+
checkout: {
|
|
82
|
+
openModal(options?: ModalOptions): void;
|
|
83
|
+
closeModal(): void;
|
|
84
|
+
};
|
|
85
|
+
closeModal(): void;
|
|
86
|
+
}
|
|
87
|
+
export declare function createElementsConnector(tl: TicketlayerLive): ElementsConnector;
|
|
88
|
+
//# sourceMappingURL=elements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elements.d.ts","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"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"}
|
package/dist/elements.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapt the sales-surface cart view to the shape Elements consume. The sales
|
|
3
|
+
* view exposes `itemsSubtotal` + per-item `subtotal`; the components (tl-cart,
|
|
4
|
+
* badges) were written against `subtotal`/`total`/`fees` + per-item
|
|
5
|
+
* `totalPrice`. Add those aliases (and itemCount) without dropping the
|
|
6
|
+
* originals - otherwise tl-cart formats undefined → £NaN. No fees concept on
|
|
7
|
+
* the sales surface yet, so fees=0 and total=subtotal. Money stays minor units.
|
|
8
|
+
*/
|
|
9
|
+
const withCount = (cart) => {
|
|
10
|
+
if (!cart || typeof cart !== 'object')
|
|
11
|
+
return cart;
|
|
12
|
+
const c = cart;
|
|
13
|
+
const items = (c.items ?? []).map((i) => {
|
|
14
|
+
const it = i;
|
|
15
|
+
const qty = it.quantity ?? 0;
|
|
16
|
+
const line = it.subtotal ?? it.unitPrice * qty;
|
|
17
|
+
return { ...it, totalPrice: it.totalPrice ?? line };
|
|
18
|
+
});
|
|
19
|
+
const itemCount = items.reduce((sum, i) => sum + (i.quantity ?? 0), 0);
|
|
20
|
+
const subtotal = c.itemsSubtotal ?? c.subtotal ?? 0;
|
|
21
|
+
return {
|
|
22
|
+
...c,
|
|
23
|
+
items,
|
|
24
|
+
itemCount,
|
|
25
|
+
subtotal,
|
|
26
|
+
fees: c.fees ?? 0,
|
|
27
|
+
total: c.total ?? subtotal,
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
export function createElementsConnector(tl) {
|
|
31
|
+
// ticketTypeId → { categoryId, occurrenceId }, captured on getTicketTypes so
|
|
32
|
+
// addItem/addSeat can supply the categoryId the cart API requires.
|
|
33
|
+
const ttMeta = new Map();
|
|
34
|
+
const resolve = (ticketTypeId, occurrenceId) => {
|
|
35
|
+
const meta = ttMeta.get(ticketTypeId);
|
|
36
|
+
if (!meta?.categoryId) {
|
|
37
|
+
throw new Error(`[live] No category known for ticket type ${ticketTypeId}. ` +
|
|
38
|
+
`Load the occurrence's ticket types (getTicketTypes) before adding it to the cart.`);
|
|
39
|
+
}
|
|
40
|
+
return { categoryId: meta.categoryId, occurrenceId: occurrenceId || meta.occurrenceId };
|
|
41
|
+
};
|
|
42
|
+
const eventsManager = {
|
|
43
|
+
async list(options) {
|
|
44
|
+
const res = (await tl.events.list());
|
|
45
|
+
// Adapt the sales-surface LISTING shape to the structural shape
|
|
46
|
+
// tl-event-card consumes. Two shape gaps the card otherwise renders blank:
|
|
47
|
+
// - venue/date are flat (venueName/venueCity/nextOccurrenceAt) on the
|
|
48
|
+
// listing but nested (venue.{name,city} / nextOccurrence.startsAt) on
|
|
49
|
+
// the card.
|
|
50
|
+
// - the card reads `imageUrl`; the listing already carries it (surface
|
|
51
|
+
// explicitly rather than relying on a passthrough spread).
|
|
52
|
+
// A listing's own id is the channel-listing id (lst_/schl_), but cards
|
|
53
|
+
// navigate by EVENT id, so we surface eventId as `id`.
|
|
54
|
+
let items = (res?.listings ?? []).map((l) => ({
|
|
55
|
+
id: l.eventId ?? l.id,
|
|
56
|
+
name: l.name ?? '',
|
|
57
|
+
...(l.shortDescription ? { shortDescription: l.shortDescription } : {}),
|
|
58
|
+
...(l.imageUrl ? { imageUrl: l.imageUrl } : {}),
|
|
59
|
+
...(l.venueName
|
|
60
|
+
? { venue: { id: '', name: l.venueName, city: l.venueCity ?? '' } }
|
|
61
|
+
: {}),
|
|
62
|
+
...(l.nextOccurrenceAt ? { nextOccurrence: { startsAt: l.nextOccurrenceAt } } : {}),
|
|
63
|
+
availabilityStatus: 'available',
|
|
64
|
+
}));
|
|
65
|
+
if (options?.limit)
|
|
66
|
+
items = items.slice(0, options.limit);
|
|
67
|
+
return { items };
|
|
68
|
+
},
|
|
69
|
+
get: (eventId) => tl.events.get(eventId),
|
|
70
|
+
async getTicketTypes(eventId, occurrenceId) {
|
|
71
|
+
const ev = (await tl.events.get(eventId));
|
|
72
|
+
const occ = ev?.occurrences?.find((o) => o.id === occurrenceId) ?? ev?.occurrences?.[0];
|
|
73
|
+
const tts = occ?.ticketTypes ?? [];
|
|
74
|
+
return tts.map((tt) => {
|
|
75
|
+
if (occ)
|
|
76
|
+
ttMeta.set(tt.ticketTypeId, { categoryId: tt.categoryId, occurrenceId: occ.id });
|
|
77
|
+
return {
|
|
78
|
+
id: tt.ticketTypeId,
|
|
79
|
+
name: tt.ticketTypeName,
|
|
80
|
+
description: tt.description,
|
|
81
|
+
price: tt.unitPrice, // minor units; components divide by 100 to display
|
|
82
|
+
currency: tt.currency,
|
|
83
|
+
categoryId: tt.categoryId,
|
|
84
|
+
categoryName: tt.categoryName,
|
|
85
|
+
// The sales surface view doesn't expose per-order limits/remaining yet;
|
|
86
|
+
// sensible defaults until the catalogue view carries them.
|
|
87
|
+
maxPerOrder: 10,
|
|
88
|
+
available: 999,
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
const cartManager = {
|
|
94
|
+
// Cache-first. The SDK keeps `_cart` authoritative - mutations update it and
|
|
95
|
+
// every `cart:updated` carries the full cart - so Elements reading the cart
|
|
96
|
+
// must NOT each trigger a GET. We return the cached cart and only fetch when
|
|
97
|
+
// nothing is cached yet. This stops the fetch storm when several cart-aware
|
|
98
|
+
// Elements mount, and breaks any cart:updated → get() → refresh →
|
|
99
|
+
// cart:updated feedback loop (which was tripping the rate limiter).
|
|
100
|
+
get: async () => withCount(tl.cart.current ?? (await tl.cart.refresh())),
|
|
101
|
+
on: (event, cb) => tl.on(event, (p) => cb(event === 'cart:updated' ? withCount(p) : p)),
|
|
102
|
+
off: (event, cb) => tl.off(event, cb),
|
|
103
|
+
addItem: async (ticketTypeId, quantity, occurrenceId) => {
|
|
104
|
+
const { categoryId, occurrenceId: occ } = resolve(ticketTypeId, occurrenceId);
|
|
105
|
+
return withCount(await tl.cart.add({ eventOccurrenceId: occ, categoryId, ticketTypeId, quantity }));
|
|
106
|
+
},
|
|
107
|
+
addItems: async (items) => {
|
|
108
|
+
let last = tl.cart.current;
|
|
109
|
+
for (const it of items)
|
|
110
|
+
last = await cartManager.addItem(it.ticketTypeId, it.quantity, it.occurrenceId);
|
|
111
|
+
return last;
|
|
112
|
+
},
|
|
113
|
+
removeItem: async (itemId) => withCount(await tl.cart.remove(itemId)),
|
|
114
|
+
addSeat: async (seatId, ticketTypeId, occurrenceId) => {
|
|
115
|
+
const { categoryId, occurrenceId: occ } = resolve(ticketTypeId, occurrenceId);
|
|
116
|
+
return withCount(await tl.cart.add({ eventOccurrenceId: occ, categoryId, ticketTypeId, eventLayoutSeatIds: [seatId] }));
|
|
117
|
+
},
|
|
118
|
+
removeSeat: async (_seatId, _occurrenceId) => {
|
|
119
|
+
// The cart line-item view doesn't expose seat ids, so seat→lineItem can't
|
|
120
|
+
// be mapped here yet. Seat removal flows through removeItem(itemId) until
|
|
121
|
+
// the view carries seat references.
|
|
122
|
+
console.warn('[live] removeSeat is a no-op until cart items expose seat ids; use removeItem(itemId).');
|
|
123
|
+
return withCount((await tl.cart.refresh()) ?? tl.cart.current);
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
const ordersManager = {
|
|
127
|
+
mine: () => tl.orders.mine(),
|
|
128
|
+
get: (orderId) => tl.orders.get(orderId),
|
|
129
|
+
ticketPdf: (orderId, passId) => tl.orders.ticketPdf(orderId, passId),
|
|
130
|
+
};
|
|
131
|
+
// Getters read the facade's session state live, so a component that asks
|
|
132
|
+
// after auth:changed sees the new customer without holding its own copy.
|
|
133
|
+
const authManager = {
|
|
134
|
+
get customer() {
|
|
135
|
+
return tl.auth.customer;
|
|
136
|
+
},
|
|
137
|
+
get authenticated() {
|
|
138
|
+
return tl.auth.authenticated;
|
|
139
|
+
},
|
|
140
|
+
requestMagicLink: (contact) => tl.auth.requestMagicLink(contact),
|
|
141
|
+
exchange: (code) => tl.auth.exchange(code),
|
|
142
|
+
logout: () => tl.auth.logout(),
|
|
143
|
+
};
|
|
144
|
+
const presaleManager = {
|
|
145
|
+
redeem: (code) => tl.presale.redeem(code),
|
|
146
|
+
};
|
|
147
|
+
return {
|
|
148
|
+
getEventsManager: () => eventsManager,
|
|
149
|
+
getCartManager: () => cartManager,
|
|
150
|
+
getOrdersManager: () => ordersManager,
|
|
151
|
+
getAuthManager: () => authManager,
|
|
152
|
+
getPresaleManager: () => presaleManager,
|
|
153
|
+
on: (event, cb) => tl.on(event, cb),
|
|
154
|
+
off: (event, cb) => tl.off(event, cb),
|
|
155
|
+
event: (eventId) => ({
|
|
156
|
+
openModal: (options = {}) => tl.emit('ui:event-modal-requested', { eventId, ...options }),
|
|
157
|
+
}),
|
|
158
|
+
checkout: {
|
|
159
|
+
openModal: (options = {}) => tl.emit('ui:checkout-requested', options),
|
|
160
|
+
closeModal: () => tl.emit('ui:modal-close-requested'),
|
|
161
|
+
},
|
|
162
|
+
closeModal: () => tl.emit('ui:modal-close-requested'),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=elements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elements.js","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"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"}
|