@seatlayer/vue 0.71.5 → 0.72.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -2
- package/dist/index.cjs +100 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +102 -3
- package/dist/index.d.ts +102 -3
- package/dist/index.js +105 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -15,8 +15,8 @@ also re-exports the plain JavaScript `SeatPickerWidget` class and the
|
|
|
15
15
|
`attachPickerFrame` helper, so a Vue host depends on one package.
|
|
16
16
|
|
|
17
17
|
[SeatLayer Vue SDK on npm](https://www.npmjs.com/package/@seatlayer/vue) ·
|
|
18
|
-
[Vue seat-map documentation](https://docs.seatlayer.io/buyer-sdk/
|
|
19
|
-
[SeatLayer
|
|
18
|
+
[Vue seat-map documentation](https://docs.seatlayer.io/buyer-sdk/vue/) ·
|
|
19
|
+
[SeatLayer SDK and API overview](https://seatlayer.io/developers/) ·
|
|
20
20
|
[Buyer seat-map demo](https://app.seatlayer.io/demo/play/grand-theatre) ·
|
|
21
21
|
[SeatLayer JavaScript seat map SDK](https://www.npmjs.com/package/@seatlayer/js) ·
|
|
22
22
|
[SeatLayer React seat map SDK](https://www.npmjs.com/package/@seatlayer/react) ·
|
|
@@ -27,6 +27,7 @@ also re-exports the plain JavaScript `SeatPickerWidget` class and the
|
|
|
27
27
|
|
|
28
28
|
- `SeatingChart` — one native Vue component (`SeatLayerSeatingChart`), written
|
|
29
29
|
as a render function so no Vue compiler plugin is needed.
|
|
30
|
+
- `SeasonPicker` — fixed-inclusion Season selection and returning-holder intent.
|
|
30
31
|
- `SeatPickerWidget` — the framework-agnostic one-call buyer modal.
|
|
31
32
|
- `attachPickerFrame` — the host-side iframe helper for embedded pickers.
|
|
32
33
|
- TypeScript declarations for ESM (`dist/index.d.ts`) and CommonJS
|
|
@@ -75,6 +76,23 @@ async function checkout() {
|
|
|
75
76
|
</template>
|
|
76
77
|
```
|
|
77
78
|
|
|
79
|
+
### Fixed renewable Season
|
|
80
|
+
|
|
81
|
+
```vue
|
|
82
|
+
<SeasonPicker
|
|
83
|
+
ref="season"
|
|
84
|
+
season="sea_2027"
|
|
85
|
+
:buyer-access-token="session.token"
|
|
86
|
+
@continue="handoff => continueOnYourServer(handoff.operationId)"
|
|
87
|
+
/>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The Season handoff is opaque and price-free. Its `pricingAuthority: "host"`
|
|
91
|
+
and `authoritativeAmountIncluded: false` flags mean trusted server code must
|
|
92
|
+
apply the package price, tax, and payment decision before booking the
|
|
93
|
+
identity-only allocation. `SeasonPicker` is supported in `@seatlayer/vue`
|
|
94
|
+
`0.72.0` and newer.
|
|
95
|
+
|
|
78
96
|
## Props
|
|
79
97
|
|
|
80
98
|
| Prop | Type | Notes |
|
package/dist/index.cjs
CHANGED
|
@@ -20,9 +20,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
|
-
|
|
23
|
+
SeasonPicker: () => SeasonPicker,
|
|
24
|
+
SeatPickerWidget: () => import_js3.SeatPicker,
|
|
24
25
|
SeatingChart: () => SeatingChart,
|
|
25
|
-
attachPickerFrame: () =>
|
|
26
|
+
attachPickerFrame: () => import_js4.attachPickerFrame
|
|
26
27
|
});
|
|
27
28
|
module.exports = __toCommonJS(index_exports);
|
|
28
29
|
|
|
@@ -219,11 +220,107 @@ var SeatingChart = (0, import_vue.defineComponent)({
|
|
|
219
220
|
}
|
|
220
221
|
});
|
|
221
222
|
|
|
222
|
-
// src/
|
|
223
|
+
// src/SeasonPicker.ts
|
|
224
|
+
var import_vue2 = require("vue");
|
|
223
225
|
var import_js2 = require("@seatlayer/js");
|
|
226
|
+
var SeasonPicker = (0, import_vue2.defineComponent)({
|
|
227
|
+
name: "SeatLayerSeasonPicker",
|
|
228
|
+
props: {
|
|
229
|
+
season: { type: String, required: true },
|
|
230
|
+
apiBase: { type: String, default: void 0 },
|
|
231
|
+
buyerAccessTokenProvider: {
|
|
232
|
+
type: Function,
|
|
233
|
+
default: void 0
|
|
234
|
+
},
|
|
235
|
+
buyerAccessToken: {
|
|
236
|
+
type: [String, Object],
|
|
237
|
+
default: void 0
|
|
238
|
+
},
|
|
239
|
+
initialOperationId: { type: String, default: void 0 },
|
|
240
|
+
recoveryTimeoutMs: { type: Number, default: void 0 },
|
|
241
|
+
fetch: { type: Function, default: void 0 }
|
|
242
|
+
},
|
|
243
|
+
emits: {
|
|
244
|
+
hold: (_handoff) => true,
|
|
245
|
+
"hold-change": (_handoff) => true,
|
|
246
|
+
continue: (_handoff) => true,
|
|
247
|
+
"renewal-intent": (_intent) => true,
|
|
248
|
+
"access-expired": (_event) => true,
|
|
249
|
+
"access-unavailable": (_event) => true,
|
|
250
|
+
"status-change": (_event) => true,
|
|
251
|
+
error: (_error) => true
|
|
252
|
+
},
|
|
253
|
+
setup(props, { emit, expose }) {
|
|
254
|
+
const container = (0, import_vue2.ref)(null);
|
|
255
|
+
const picker = (0, import_vue2.shallowRef)(null);
|
|
256
|
+
const destroy = () => {
|
|
257
|
+
picker.value?.destroy();
|
|
258
|
+
picker.value = null;
|
|
259
|
+
};
|
|
260
|
+
const build = () => {
|
|
261
|
+
const element = container.value;
|
|
262
|
+
if (!element) return;
|
|
263
|
+
destroy();
|
|
264
|
+
const instance = new import_js2.SeasonPicker({
|
|
265
|
+
container: element,
|
|
266
|
+
season: props.season,
|
|
267
|
+
apiBase: props.apiBase,
|
|
268
|
+
buyerAccessTokenProvider: props.buyerAccessTokenProvider,
|
|
269
|
+
buyerAccessToken: props.buyerAccessToken,
|
|
270
|
+
initialOperationId: props.initialOperationId,
|
|
271
|
+
recoveryTimeoutMs: props.recoveryTimeoutMs,
|
|
272
|
+
fetch: props.fetch,
|
|
273
|
+
onHold: (handoff) => emit("hold", handoff),
|
|
274
|
+
onHoldChange: (handoff) => emit("hold-change", handoff),
|
|
275
|
+
onContinue: (handoff) => emit("continue", handoff),
|
|
276
|
+
onRenewalIntent: (intent) => emit("renewal-intent", intent),
|
|
277
|
+
onAccessExpired: (event) => emit("access-expired", event),
|
|
278
|
+
onAccessUnavailable: (event) => emit("access-unavailable", event),
|
|
279
|
+
onStatusChange: (event) => emit("status-change", event),
|
|
280
|
+
onError: (error) => emit("error", error)
|
|
281
|
+
});
|
|
282
|
+
picker.value = instance;
|
|
283
|
+
void instance.render().catch(() => void 0);
|
|
284
|
+
};
|
|
285
|
+
(0, import_vue2.watch)(
|
|
286
|
+
() => [
|
|
287
|
+
container.value,
|
|
288
|
+
props.season,
|
|
289
|
+
props.apiBase,
|
|
290
|
+
props.buyerAccessTokenProvider,
|
|
291
|
+
props.buyerAccessToken,
|
|
292
|
+
props.initialOperationId,
|
|
293
|
+
props.recoveryTimeoutMs,
|
|
294
|
+
props.fetch
|
|
295
|
+
],
|
|
296
|
+
build,
|
|
297
|
+
{ immediate: true, flush: "post" }
|
|
298
|
+
);
|
|
299
|
+
(0, import_vue2.onBeforeUnmount)(destroy);
|
|
300
|
+
const current = () => {
|
|
301
|
+
if (!picker.value) throw new Error("seatlayer: Vue SeasonPicker is not mounted");
|
|
302
|
+
return picker.value;
|
|
303
|
+
};
|
|
304
|
+
const exposed = {
|
|
305
|
+
holdSameSeat: (labels, operationId) => current().holdSameSeat(labels, operationId),
|
|
306
|
+
restoreOperation: (operationId) => current().restoreOperation(operationId),
|
|
307
|
+
release: (releaseActionId) => current().release(releaseActionId),
|
|
308
|
+
createRenewalIntent: (offerId) => current().createRenewalIntent(offerId),
|
|
309
|
+
getDescriptor: () => picker.value?.getDescriptor() ?? null,
|
|
310
|
+
getAvailability: () => picker.value?.getAvailability() ?? null,
|
|
311
|
+
getHandoff: () => picker.value?.getHandoff() ?? null
|
|
312
|
+
};
|
|
313
|
+
expose(exposed);
|
|
314
|
+
return () => (0, import_vue2.h)("div", { ref: container });
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
// src/index.ts
|
|
224
319
|
var import_js3 = require("@seatlayer/js");
|
|
320
|
+
var import_js4 = require("@seatlayer/js");
|
|
225
321
|
// Annotate the CommonJS export names for ESM import in node:
|
|
226
322
|
0 && (module.exports = {
|
|
323
|
+
SeasonPicker,
|
|
227
324
|
SeatPickerWidget,
|
|
228
325
|
SeatingChart,
|
|
229
326
|
attachPickerFrame
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/SeatingChart.ts"],"sourcesContent":["/**\n * @seatlayer/vue — the Vue 3 wrapper for the SeatLayer embed SDK.\n *\n * Components are written as render functions rather than SFCs, so installing\n * this package needs no Vue compiler plugin.\n */\nexport { SeatingChart } from './SeatingChart';\nexport type { SeatingChartExposed } from './SeatingChart';\n\nexport type {\n SelectedSeat,\n HoldResult,\n BestAvailableResult,\n GAAreaAvailability,\n HoldLineItem,\n SeatHoverDetails,\n} from '@seatlayer/js';\n\n// Sales Channels — buyer access sessions for private channel inventory.\nexport type {\n BuyerAccessToken,\n BuyerAccessTokenProvider,\n BuyerAccessRefreshReason,\n BuyerAccessUnavailableReason,\n BuyerAccessExpiredEvent,\n BuyerAccessUnavailableEvent,\n SelectedObjectUnavailableEvent,\n} from '@seatlayer/js';\n\n// The framework-agnostic widget class — for the one-call modal (SeatPickerWidget.open()).\nexport { SeatPicker as SeatPickerWidget } from '@seatlayer/js';\n\n// Host-side embed helper: grows the iframe on `seatlayer:height` and pins it on\n// `seatlayer:fullscreen`. Vue hosts depend on this package alone, so it has to be\n// reachable here rather than only from @seatlayer/js.\nexport { attachPickerFrame } from '@seatlayer/js';\nexport type { AttachPickerFrameOptions } from '@seatlayer/js';\n","import {\n defineComponent,\n h,\n onBeforeUnmount,\n ref,\n shallowRef,\n watch,\n type PropType,\n type Ref,\n} from 'vue';\nimport {\n SeatingChart as CoreSeatingChart,\n SEATING_CHART_IDENTITY_PROPS,\n bindSeatingChartHandle,\n buildSeatingChartOptions,\n type RendererViewMode,\n type SeatingChartHandle,\n type SeatingChartOptions,\n type SelectedSeat,\n type HoldResult,\n type BestAvailableResult,\n type GAAreaAvailability,\n type SeatHoverDetails,\n type PickerSelectionValidity,\n type PickerSelectionValidator,\n type BuyerAccessToken,\n type BuyerAccessTokenProvider,\n type BuyerAccessExpiredEvent,\n type BuyerAccessUnavailableEvent,\n type SelectedObjectUnavailableEvent,\n} from '@seatlayer/js';\n\n/**\n * What `ref=\"chart\"` gives you — call these to drive the picker from your app.\n *\n * Vue exposes these through `defineExpose`, so a template ref is typed as this\n * rather than as the raw component instance. It is the shared\n * `SeatingChartHandle` from `@seatlayer/js`: the same 17 methods React's `ref`\n * and Angular's component expose, from one declaration, so the three wrappers\n * cannot drift apart again.\n */\nexport type SeatingChartExposed = SeatingChartHandle;\n\n/**\n * Vue 3 wrapper around the framework-agnostic `@seatlayer/js` SDK.\n *\n * The canvas is created once and torn down on unmount. Only the props that\n * change the chart's identity (`SEATING_CHART_IDENTITY_PROPS`: `event`,\n * `apiBase`, `maxSelection`, `numberOfPlacesToSelect`, `publicKey`, `locale`, `currency`,\n * `colorblindSafe`, `initialView`, `errorDisplay`) trigger a rebuild;\n * everything else is read live, so a parent re-render never destroys the canvas\n * mid-selection.\n *\n * Written as a render function rather than an SFC so the package builds with\n * plain TypeScript — a consumer needs no Vue compiler plugin to install it.\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { ref } from 'vue';\n * import { SeatingChart, type SeatingChartExposed } from '@seatlayer/vue';\n *\n * const chart = ref<SeatingChartExposed | null>(null);\n * const checkout = async () => {\n * const held = await chart.value?.hold();\n * if (held) await pay(held.holdId);\n * };\n * </script>\n *\n * <template>\n * <SeatingChart ref=\"chart\" event=\"summer-gala\" @selection-change=\"onChange\" />\n * </template>\n * ```\n */\nexport const SeatingChart = defineComponent({\n name: 'SeatLayerSeatingChart',\n\n props: {\n /** Event key to render. Changing it rebuilds the chart. */\n event: { type: String, required: true },\n /** API base URL. Defaults to the public API. */\n apiBase: { type: String, default: undefined },\n /** Cap on how many seats a buyer may select. */\n maxSelection: { type: Number, default: undefined },\n /** Object ids or public labels selected after availability loads. */\n selectedObjects: { type: Array as PropType<string[]>, default: undefined },\n /** Object ids or public labels the buyer may select. */\n selectableObjects: { type: Array as PropType<string[] | null>, default: undefined },\n /** Exact ticket count required for a valid selection. */\n numberOfPlacesToSelect: { type: Number, default: undefined },\n /** Local buyer selection guards. Changing them rebuilds the chart. */\n selectionValidators: { type: Array as PropType<PickerSelectionValidator[]>, default: undefined },\n /** Publishable key, when your integration uses one. */\n publicKey: { type: String, default: undefined },\n /** BCP-47 locale for built-in copy. */\n locale: { type: String, default: undefined },\n /** ISO currency for price formatting. */\n currency: { type: String, default: undefined },\n /** Render with colorblind-safe seat glyphs. */\n colorblindSafe: { type: Boolean, default: undefined },\n /**\n * Initial canvas projection. Read once when the chart is built, so\n * changing it rebuilds.\n * @deprecated `'isometric'` and `'perspective'` are retired in favour of\n * the real 3D venue view; use `'flat'`.\n */\n initialView: {\n type: String as PropType<RendererViewMode>,\n default: undefined,\n },\n /**\n * What the BUYER sees when the chart cannot load: `'message'` (default) is\n * a styleable notice with a Try again button, `'none'` is silent for hosts\n * that render their own failure UI from the `error` event.\n */\n errorDisplay: {\n type: String as PropType<'message' | 'none'>,\n default: undefined,\n },\n /** Copy overrides, read once per mount. */\n messages: {\n type: Object as PropType<SeatingChartOptions['messages']>,\n default: undefined,\n },\n /**\n * Show the built-in seat tooltip. Set false to draw your own popover from\n * the `seat-hover` event.\n */\n seatTooltip: { type: Boolean, default: undefined },\n /**\n * Sales Channels: mint a buyer access session on demand. Called with a\n * `reason`; returns `{ token, expiresAt }` from YOUR backend. The token is\n * held in memory only — never storage, never a URL, never a log.\n */\n buyerAccessTokenProvider: {\n type: Function as PropType<BuyerAccessTokenProvider>,\n default: undefined,\n },\n /** One-shot session for hosts that own the lifecycle. Cannot be renewed. */\n buyerAccessToken: {\n type: [String, Object] as PropType<string | BuyerAccessToken>,\n default: undefined,\n },\n },\n\n emits: {\n /** The buyer's selection changed. */\n 'selection-change': (_seats: SelectedSeat[]) => true,\n /** Exact-count state changed. */\n 'selection-validity-change': (_state: PickerSelectionValidity) => true,\n /** The exact count was reached. */\n 'selection-valid': (_seats: SelectedSeat[]) => true,\n /** The selection is not at the exact count. */\n 'selection-invalid': (_state: PickerSelectionValidity) => true,\n /** The active selection cap was reached. */\n 'selection-limit': (_max: number) => true,\n /** A hold succeeded. */\n hold: (_result: HoldResult) => true,\n /** A previous hold was restored on mount. */\n 'hold-restored': (_result: HoldResult) => true,\n /** The active hold lapsed. */\n 'hold-expired': () => true,\n /** A GA area was clicked. */\n 'ga-click': (_area: GAAreaAvailability) => true,\n /** Something failed — a network error, a rejected hold. */\n error: (_error: unknown) => true,\n /** A floor deck was tapped in the 3D view. */\n 'deck-tap': (_floorId: string) => true,\n /** A transient hint worth showing the buyer, or `null` to clear it. */\n hint: (_message: string | null) => true,\n /** The pointer moved onto a seat, or off one (`null`). */\n 'seat-hover': (_details: SeatHoverDetails | null) => true,\n /** The buyer access session lapsed; `refreshed` says whether it recovered. */\n 'access-expired': (_event: BuyerAccessExpiredEvent) => true,\n /** Private inventory is unavailable and refreshing will not fix it. */\n 'access-unavailable': (_event: BuyerAccessUnavailableEvent) => true,\n /** Selected-but-unheld units stopped being selectable. */\n 'selected-object-unavailable': (_event: SelectedObjectUnavailableEvent) => true,\n },\n\n setup(props, { emit, expose }) {\n const container: Ref<HTMLDivElement | null> = ref(null);\n // shallowRef: the chart owns a canvas and a large scene graph, and making it\n // deeply reactive would have Vue walk all of it on every touch.\n const chart = shallowRef<CoreSeatingChart | null>(null);\n\n const destroy = () => {\n chart.value?.destroy();\n chart.value = null;\n };\n\n const build = () => {\n const element = container.value;\n if (!element) return;\n\n destroy();\n\n // Handlers are bound here rather than inline in the options literal.\n // Inline, TypeScript has to resolve `emit`'s overloads while it is still\n // contextually typing the literal against SeatingChartOptions, and it\n // gives up — collapsing to the last emit signature. Naming them first\n // separates the two inference problems, and reads better besides.\n const onSelectionChange = (seats: SelectedSeat[]) => emit('selection-change', seats);\n const onSelectionValidityChange = (state: PickerSelectionValidity) => emit('selection-validity-change', state);\n const onSelectionValid = (seats: SelectedSeat[]) => emit('selection-valid', seats);\n const onSelectionInvalid = (state: PickerSelectionValidity) => emit('selection-invalid', state);\n const onSelectionLimit = (max: number) => emit('selection-limit', max);\n const onHold = (result: HoldResult) => emit('hold', result);\n const onHoldRestored = (result: HoldResult) => emit('hold-restored', result);\n const onHoldExpired = () => emit('hold-expired');\n const onGAClick = (area: GAAreaAvailability) => emit('ga-click', area);\n const onError = (error: unknown) => emit('error', error);\n const onDeckTap = (floorId: string) => emit('deck-tap', floorId);\n const onHint = (message: string | null) => emit('hint', message);\n const onSeatHover = (details: SeatHoverDetails | null) => emit('seat-hover', details);\n const onAccessExpired = (state: BuyerAccessExpiredEvent) => emit('access-expired', state);\n const onAccessUnavailable = (state: BuyerAccessUnavailableEvent) =>\n emit('access-unavailable', state);\n const onSelectedObjectUnavailable = (state: SelectedObjectUnavailableEvent) =>\n emit('selected-object-unavailable', state);\n\n const instance = new CoreSeatingChart(buildSeatingChartOptions(\n element,\n {\n event: props.event,\n apiBase: props.apiBase,\n maxSelection: props.maxSelection,\n selectedObjects: props.selectedObjects,\n selectableObjects: props.selectableObjects,\n numberOfPlacesToSelect: props.numberOfPlacesToSelect,\n selectionValidators: props.selectionValidators,\n publicKey: props.publicKey,\n locale: props.locale,\n currency: props.currency,\n colorblindSafe: props.colorblindSafe,\n initialView: props.initialView,\n errorDisplay: props.errorDisplay,\n messages: props.messages,\n seatTooltip: props.seatTooltip,\n buyerAccessTokenProvider: props.buyerAccessTokenProvider,\n buyerAccessToken: props.buyerAccessToken,\n },\n {\n onAccessExpired,\n onAccessUnavailable,\n onSelectedObjectUnavailable,\n onSelectionChange,\n onSelectionValidityChange,\n onSelectionValid,\n onSelectionInvalid,\n onSelectionLimit,\n onHold,\n onHoldRestored,\n onHoldExpired,\n onGAClick,\n onError,\n onDeckTap,\n onHint,\n onSeatHover,\n },\n ));\n\n chart.value = instance;\n void instance.render();\n };\n\n // `flush: 'post'` so the container element exists on the first run — a\n // pre-flush watcher would fire before the DOM node is attached.\n watch(\n () => [\n container.value,\n // The shared identity list, not a hand-copied one — this is exactly the\n // place Vue fell two props behind React.\n ...SEATING_CHART_IDENTITY_PROPS.map((prop) => props[prop]),\n ],\n build,\n { immediate: true, flush: 'post' },\n );\n\n onBeforeUnmount(destroy);\n\n // Built once and read live: the handle must survive every rebuild, so it\n // asks for the current instance on each call rather than capturing one.\n const exposed: SeatingChartExposed = bindSeatingChartHandle(() => chart.value);\n expose(exposed);\n\n return () => h('div', { ref: container });\n },\n});\n"],"mappings":"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","names":["CoreSeatingChart","import_js"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/SeatingChart.ts","../src/SeasonPicker.ts"],"sourcesContent":["/**\n * @seatlayer/vue — the Vue 3 wrapper for the SeatLayer embed SDK.\n *\n * Components are written as render functions rather than SFCs, so installing\n * this package needs no Vue compiler plugin.\n */\nexport { SeatingChart } from './SeatingChart';\nexport type { SeatingChartExposed } from './SeatingChart';\nexport { SeasonPicker } from './SeasonPicker';\nexport type { SeasonPickerExposed } from './SeasonPicker';\n\nexport type {\n SelectedSeat,\n HoldResult,\n BestAvailableResult,\n GAAreaAvailability,\n HoldLineItem,\n SeatHoverDetails,\n SeasonAvailability,\n SeasonCheckoutHandoff,\n SeasonDescriptor,\n SeasonOperation,\n SeasonOperationState,\n SeasonPickerOptions,\n SeasonRenewalIntent,\n SeasonStatusEvent,\n} from '@seatlayer/js';\n\n// Sales Channels — buyer access sessions for private channel inventory.\nexport type {\n BuyerAccessToken,\n BuyerAccessTokenProvider,\n BuyerAccessRefreshReason,\n BuyerAccessUnavailableReason,\n BuyerAccessExpiredEvent,\n BuyerAccessUnavailableEvent,\n SelectedObjectUnavailableEvent,\n} from '@seatlayer/js';\n\n// The framework-agnostic widget class — for the one-call modal (SeatPickerWidget.open()).\nexport { SeatPicker as SeatPickerWidget } from '@seatlayer/js';\n\n// Host-side embed helper: grows the iframe on `seatlayer:height` and pins it on\n// `seatlayer:fullscreen`. Vue hosts depend on this package alone, so it has to be\n// reachable here rather than only from @seatlayer/js.\nexport { attachPickerFrame } from '@seatlayer/js';\nexport type { AttachPickerFrameOptions } from '@seatlayer/js';\n","import {\n defineComponent,\n h,\n onBeforeUnmount,\n ref,\n shallowRef,\n watch,\n type PropType,\n type Ref,\n} from 'vue';\nimport {\n SeatingChart as CoreSeatingChart,\n SEATING_CHART_IDENTITY_PROPS,\n bindSeatingChartHandle,\n buildSeatingChartOptions,\n type RendererViewMode,\n type SeatingChartHandle,\n type SeatingChartOptions,\n type SelectedSeat,\n type HoldResult,\n type BestAvailableResult,\n type GAAreaAvailability,\n type SeatHoverDetails,\n type PickerSelectionValidity,\n type PickerSelectionValidator,\n type BuyerAccessToken,\n type BuyerAccessTokenProvider,\n type BuyerAccessExpiredEvent,\n type BuyerAccessUnavailableEvent,\n type SelectedObjectUnavailableEvent,\n} from '@seatlayer/js';\n\n/**\n * What `ref=\"chart\"` gives you — call these to drive the picker from your app.\n *\n * Vue exposes these through `defineExpose`, so a template ref is typed as this\n * rather than as the raw component instance. It is the shared\n * `SeatingChartHandle` from `@seatlayer/js`: the same 17 methods React's `ref`\n * and Angular's component expose, from one declaration, so the three wrappers\n * cannot drift apart again.\n */\nexport type SeatingChartExposed = SeatingChartHandle;\n\n/**\n * Vue 3 wrapper around the framework-agnostic `@seatlayer/js` SDK.\n *\n * The canvas is created once and torn down on unmount. Only the props that\n * change the chart's identity (`SEATING_CHART_IDENTITY_PROPS`: `event`,\n * `apiBase`, `maxSelection`, `numberOfPlacesToSelect`, `publicKey`, `locale`, `currency`,\n * `colorblindSafe`, `initialView`, `errorDisplay`) trigger a rebuild;\n * everything else is read live, so a parent re-render never destroys the canvas\n * mid-selection.\n *\n * Written as a render function rather than an SFC so the package builds with\n * plain TypeScript — a consumer needs no Vue compiler plugin to install it.\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { ref } from 'vue';\n * import { SeatingChart, type SeatingChartExposed } from '@seatlayer/vue';\n *\n * const chart = ref<SeatingChartExposed | null>(null);\n * const checkout = async () => {\n * const held = await chart.value?.hold();\n * if (held) await pay(held.holdId);\n * };\n * </script>\n *\n * <template>\n * <SeatingChart ref=\"chart\" event=\"summer-gala\" @selection-change=\"onChange\" />\n * </template>\n * ```\n */\nexport const SeatingChart = defineComponent({\n name: 'SeatLayerSeatingChart',\n\n props: {\n /** Event key to render. Changing it rebuilds the chart. */\n event: { type: String, required: true },\n /** API base URL. Defaults to the public API. */\n apiBase: { type: String, default: undefined },\n /** Cap on how many seats a buyer may select. */\n maxSelection: { type: Number, default: undefined },\n /** Object ids or public labels selected after availability loads. */\n selectedObjects: { type: Array as PropType<string[]>, default: undefined },\n /** Object ids or public labels the buyer may select. */\n selectableObjects: { type: Array as PropType<string[] | null>, default: undefined },\n /** Exact ticket count required for a valid selection. */\n numberOfPlacesToSelect: { type: Number, default: undefined },\n /** Local buyer selection guards. Changing them rebuilds the chart. */\n selectionValidators: { type: Array as PropType<PickerSelectionValidator[]>, default: undefined },\n /** Publishable key, when your integration uses one. */\n publicKey: { type: String, default: undefined },\n /** BCP-47 locale for built-in copy. */\n locale: { type: String, default: undefined },\n /** ISO currency for price formatting. */\n currency: { type: String, default: undefined },\n /** Render with colorblind-safe seat glyphs. */\n colorblindSafe: { type: Boolean, default: undefined },\n /**\n * Initial canvas projection. Read once when the chart is built, so\n * changing it rebuilds.\n * @deprecated `'isometric'` and `'perspective'` are retired in favour of\n * the real 3D venue view; use `'flat'`.\n */\n initialView: {\n type: String as PropType<RendererViewMode>,\n default: undefined,\n },\n /**\n * What the BUYER sees when the chart cannot load: `'message'` (default) is\n * a styleable notice with a Try again button, `'none'` is silent for hosts\n * that render their own failure UI from the `error` event.\n */\n errorDisplay: {\n type: String as PropType<'message' | 'none'>,\n default: undefined,\n },\n /** Copy overrides, read once per mount. */\n messages: {\n type: Object as PropType<SeatingChartOptions['messages']>,\n default: undefined,\n },\n /**\n * Show the built-in seat tooltip. Set false to draw your own popover from\n * the `seat-hover` event.\n */\n seatTooltip: { type: Boolean, default: undefined },\n /**\n * Sales Channels: mint a buyer access session on demand. Called with a\n * `reason`; returns `{ token, expiresAt }` from YOUR backend. The token is\n * held in memory only — never storage, never a URL, never a log.\n */\n buyerAccessTokenProvider: {\n type: Function as PropType<BuyerAccessTokenProvider>,\n default: undefined,\n },\n /** One-shot session for hosts that own the lifecycle. Cannot be renewed. */\n buyerAccessToken: {\n type: [String, Object] as PropType<string | BuyerAccessToken>,\n default: undefined,\n },\n },\n\n emits: {\n /** The buyer's selection changed. */\n 'selection-change': (_seats: SelectedSeat[]) => true,\n /** Exact-count state changed. */\n 'selection-validity-change': (_state: PickerSelectionValidity) => true,\n /** The exact count was reached. */\n 'selection-valid': (_seats: SelectedSeat[]) => true,\n /** The selection is not at the exact count. */\n 'selection-invalid': (_state: PickerSelectionValidity) => true,\n /** The active selection cap was reached. */\n 'selection-limit': (_max: number) => true,\n /** A hold succeeded. */\n hold: (_result: HoldResult) => true,\n /** A previous hold was restored on mount. */\n 'hold-restored': (_result: HoldResult) => true,\n /** The active hold lapsed. */\n 'hold-expired': () => true,\n /** A GA area was clicked. */\n 'ga-click': (_area: GAAreaAvailability) => true,\n /** Something failed — a network error, a rejected hold. */\n error: (_error: unknown) => true,\n /** A floor deck was tapped in the 3D view. */\n 'deck-tap': (_floorId: string) => true,\n /** A transient hint worth showing the buyer, or `null` to clear it. */\n hint: (_message: string | null) => true,\n /** The pointer moved onto a seat, or off one (`null`). */\n 'seat-hover': (_details: SeatHoverDetails | null) => true,\n /** The buyer access session lapsed; `refreshed` says whether it recovered. */\n 'access-expired': (_event: BuyerAccessExpiredEvent) => true,\n /** Private inventory is unavailable and refreshing will not fix it. */\n 'access-unavailable': (_event: BuyerAccessUnavailableEvent) => true,\n /** Selected-but-unheld units stopped being selectable. */\n 'selected-object-unavailable': (_event: SelectedObjectUnavailableEvent) => true,\n },\n\n setup(props, { emit, expose }) {\n const container: Ref<HTMLDivElement | null> = ref(null);\n // shallowRef: the chart owns a canvas and a large scene graph, and making it\n // deeply reactive would have Vue walk all of it on every touch.\n const chart = shallowRef<CoreSeatingChart | null>(null);\n\n const destroy = () => {\n chart.value?.destroy();\n chart.value = null;\n };\n\n const build = () => {\n const element = container.value;\n if (!element) return;\n\n destroy();\n\n // Handlers are bound here rather than inline in the options literal.\n // Inline, TypeScript has to resolve `emit`'s overloads while it is still\n // contextually typing the literal against SeatingChartOptions, and it\n // gives up — collapsing to the last emit signature. Naming them first\n // separates the two inference problems, and reads better besides.\n const onSelectionChange = (seats: SelectedSeat[]) => emit('selection-change', seats);\n const onSelectionValidityChange = (state: PickerSelectionValidity) => emit('selection-validity-change', state);\n const onSelectionValid = (seats: SelectedSeat[]) => emit('selection-valid', seats);\n const onSelectionInvalid = (state: PickerSelectionValidity) => emit('selection-invalid', state);\n const onSelectionLimit = (max: number) => emit('selection-limit', max);\n const onHold = (result: HoldResult) => emit('hold', result);\n const onHoldRestored = (result: HoldResult) => emit('hold-restored', result);\n const onHoldExpired = () => emit('hold-expired');\n const onGAClick = (area: GAAreaAvailability) => emit('ga-click', area);\n const onError = (error: unknown) => emit('error', error);\n const onDeckTap = (floorId: string) => emit('deck-tap', floorId);\n const onHint = (message: string | null) => emit('hint', message);\n const onSeatHover = (details: SeatHoverDetails | null) => emit('seat-hover', details);\n const onAccessExpired = (state: BuyerAccessExpiredEvent) => emit('access-expired', state);\n const onAccessUnavailable = (state: BuyerAccessUnavailableEvent) =>\n emit('access-unavailable', state);\n const onSelectedObjectUnavailable = (state: SelectedObjectUnavailableEvent) =>\n emit('selected-object-unavailable', state);\n\n const instance = new CoreSeatingChart(buildSeatingChartOptions(\n element,\n {\n event: props.event,\n apiBase: props.apiBase,\n maxSelection: props.maxSelection,\n selectedObjects: props.selectedObjects,\n selectableObjects: props.selectableObjects,\n numberOfPlacesToSelect: props.numberOfPlacesToSelect,\n selectionValidators: props.selectionValidators,\n publicKey: props.publicKey,\n locale: props.locale,\n currency: props.currency,\n colorblindSafe: props.colorblindSafe,\n initialView: props.initialView,\n errorDisplay: props.errorDisplay,\n messages: props.messages,\n seatTooltip: props.seatTooltip,\n buyerAccessTokenProvider: props.buyerAccessTokenProvider,\n buyerAccessToken: props.buyerAccessToken,\n },\n {\n onAccessExpired,\n onAccessUnavailable,\n onSelectedObjectUnavailable,\n onSelectionChange,\n onSelectionValidityChange,\n onSelectionValid,\n onSelectionInvalid,\n onSelectionLimit,\n onHold,\n onHoldRestored,\n onHoldExpired,\n onGAClick,\n onError,\n onDeckTap,\n onHint,\n onSeatHover,\n },\n ));\n\n chart.value = instance;\n void instance.render();\n };\n\n // `flush: 'post'` so the container element exists on the first run — a\n // pre-flush watcher would fire before the DOM node is attached.\n watch(\n () => [\n container.value,\n // The shared identity list, not a hand-copied one — this is exactly the\n // place Vue fell two props behind React.\n ...SEATING_CHART_IDENTITY_PROPS.map((prop) => props[prop]),\n ],\n build,\n { immediate: true, flush: 'post' },\n );\n\n onBeforeUnmount(destroy);\n\n // Built once and read live: the handle must survive every rebuild, so it\n // asks for the current instance on each call rather than capturing one.\n const exposed: SeatingChartExposed = bindSeatingChartHandle(() => chart.value);\n expose(exposed);\n\n return () => h('div', { ref: container });\n },\n});\n","import {\n defineComponent,\n h,\n onBeforeUnmount,\n ref,\n shallowRef,\n watch,\n type PropType,\n type Ref,\n} from 'vue';\nimport {\n SeasonPicker as CoreSeasonPicker,\n type SeasonAvailability,\n type SeasonCheckoutHandoff,\n type SeasonDescriptor,\n type SeasonPickerOptions,\n type SeasonRenewalIntent,\n type SeasonStatusEvent,\n} from '@seatlayer/js';\n\n/** Imperative controls exposed through a Vue template ref. */\nexport interface SeasonPickerExposed {\n holdSameSeat(labels: readonly string[], operationId: string): Promise<SeasonCheckoutHandoff>;\n restoreOperation(operationId: string): Promise<SeasonCheckoutHandoff | null>;\n release(releaseActionId: string): Promise<void>;\n createRenewalIntent(offerId: string): Promise<SeasonRenewalIntent>;\n getDescriptor(): SeasonDescriptor | null;\n getAvailability(): SeasonAvailability | null;\n getHandoff(): SeasonCheckoutHandoff | null;\n}\n\n/** Vue lifecycle adapter for the distinct fixed-inclusion Season buyer flow. */\nexport const SeasonPicker = defineComponent({\n name: 'SeatLayerSeasonPicker',\n props: {\n season: { type: String, required: true },\n apiBase: { type: String, default: undefined },\n buyerAccessTokenProvider: {\n type: Function as PropType<SeasonPickerOptions['buyerAccessTokenProvider']>,\n default: undefined,\n },\n buyerAccessToken: {\n type: [String, Object] as PropType<SeasonPickerOptions['buyerAccessToken']>,\n default: undefined,\n },\n initialOperationId: { type: String, default: undefined },\n recoveryTimeoutMs: { type: Number, default: undefined },\n fetch: { type: Function as PropType<typeof fetch>, default: undefined },\n },\n emits: {\n hold: (_handoff: SeasonCheckoutHandoff) => true,\n 'hold-change': (_handoff: SeasonCheckoutHandoff | null) => true,\n continue: (_handoff: SeasonCheckoutHandoff) => true,\n 'renewal-intent': (_intent: SeasonRenewalIntent) => true,\n 'access-expired': (_event: unknown) => true,\n 'access-unavailable': (_event: unknown) => true,\n 'status-change': (_event: SeasonStatusEvent) => true,\n error: (_error: unknown) => true,\n },\n setup(props, { emit, expose }) {\n const container: Ref<HTMLDivElement | null> = ref(null);\n const picker = shallowRef<CoreSeasonPicker | null>(null);\n\n const destroy = () => {\n picker.value?.destroy();\n picker.value = null;\n };\n const build = () => {\n const element = container.value;\n if (!element) return;\n destroy();\n const instance = new CoreSeasonPicker({\n container: element,\n season: props.season,\n apiBase: props.apiBase,\n buyerAccessTokenProvider: props.buyerAccessTokenProvider,\n buyerAccessToken: props.buyerAccessToken,\n initialOperationId: props.initialOperationId,\n recoveryTimeoutMs: props.recoveryTimeoutMs,\n fetch: props.fetch,\n onHold: (handoff) => emit('hold', handoff),\n onHoldChange: (handoff) => emit('hold-change', handoff),\n onContinue: (handoff) => emit('continue', handoff),\n onRenewalIntent: (intent) => emit('renewal-intent', intent),\n onAccessExpired: (event) => emit('access-expired', event),\n onAccessUnavailable: (event) => emit('access-unavailable', event),\n onStatusChange: (event) => emit('status-change', event),\n onError: (error) => emit('error', error),\n });\n picker.value = instance;\n void instance.render().catch(() => undefined);\n };\n\n watch(\n () => [\n container.value,\n props.season,\n props.apiBase,\n props.buyerAccessTokenProvider,\n props.buyerAccessToken,\n props.initialOperationId,\n props.recoveryTimeoutMs,\n props.fetch,\n ],\n build,\n { immediate: true, flush: 'post' },\n );\n onBeforeUnmount(destroy);\n\n const current = (): CoreSeasonPicker => {\n if (!picker.value) throw new Error('seatlayer: Vue SeasonPicker is not mounted');\n return picker.value;\n };\n const exposed: SeasonPickerExposed = {\n holdSameSeat: (labels, operationId) => current().holdSameSeat(labels, operationId),\n restoreOperation: (operationId) => current().restoreOperation(operationId),\n release: (releaseActionId) => current().release(releaseActionId),\n createRenewalIntent: (offerId) => current().createRenewalIntent(offerId),\n getDescriptor: () => picker.value?.getDescriptor() ?? null,\n getAvailability: () => picker.value?.getAvailability() ?? null,\n getHandoff: () => picker.value?.getHandoff() ?? null,\n };\n expose(exposed);\n return () => h('div', { ref: container });\n },\n});\n"],"mappings":"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","names":["CoreSeatingChart","import_vue","import_js","CoreSeasonPicker","import_js"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as _seatlayer_core from '@seatlayer/core';
|
|
2
2
|
import * as vue from 'vue';
|
|
3
3
|
import { PropType } from 'vue';
|
|
4
|
-
import
|
|
5
|
-
|
|
4
|
+
import * as _seatlayer_js from '@seatlayer/js';
|
|
5
|
+
import { PickerSelectionValidator, RendererViewMode, SeatingChartOptions, BuyerAccessTokenProvider, BuyerAccessToken, SelectedSeat, PickerSelectionValidity, HoldResult, GAAreaAvailability, SeatHoverDetails, BuyerAccessExpiredEvent, BuyerAccessUnavailableEvent, SelectedObjectUnavailableEvent, SeatingChartHandle, SeasonPickerOptions, SeasonCheckoutHandoff, SeasonRenewalIntent, SeasonStatusEvent, SeasonDescriptor, SeasonAvailability } from '@seatlayer/js';
|
|
6
|
+
export { AttachPickerFrameOptions, BestAvailableResult, BuyerAccessExpiredEvent, BuyerAccessRefreshReason, BuyerAccessToken, BuyerAccessTokenProvider, BuyerAccessUnavailableEvent, BuyerAccessUnavailableReason, GAAreaAvailability, HoldLineItem, HoldResult, SeasonAvailability, SeasonCheckoutHandoff, SeasonDescriptor, SeasonOperation, SeasonOperationState, SeasonPickerOptions, SeasonRenewalIntent, SeasonStatusEvent, SeatHoverDetails, SeatPicker as SeatPickerWidget, SelectedObjectUnavailableEvent, SelectedSeat, attachPickerFrame } from '@seatlayer/js';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* What `ref="chart"` gives you — call these to drive the picker from your app.
|
|
@@ -320,4 +321,102 @@ declare const SeatingChart: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
320
321
|
buyerAccessToken: string | BuyerAccessToken;
|
|
321
322
|
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
322
323
|
|
|
323
|
-
|
|
324
|
+
/** Imperative controls exposed through a Vue template ref. */
|
|
325
|
+
interface SeasonPickerExposed {
|
|
326
|
+
holdSameSeat(labels: readonly string[], operationId: string): Promise<SeasonCheckoutHandoff>;
|
|
327
|
+
restoreOperation(operationId: string): Promise<SeasonCheckoutHandoff | null>;
|
|
328
|
+
release(releaseActionId: string): Promise<void>;
|
|
329
|
+
createRenewalIntent(offerId: string): Promise<SeasonRenewalIntent>;
|
|
330
|
+
getDescriptor(): SeasonDescriptor | null;
|
|
331
|
+
getAvailability(): SeasonAvailability | null;
|
|
332
|
+
getHandoff(): SeasonCheckoutHandoff | null;
|
|
333
|
+
}
|
|
334
|
+
/** Vue lifecycle adapter for the distinct fixed-inclusion Season buyer flow. */
|
|
335
|
+
declare const SeasonPicker: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
336
|
+
season: {
|
|
337
|
+
type: StringConstructor;
|
|
338
|
+
required: true;
|
|
339
|
+
};
|
|
340
|
+
apiBase: {
|
|
341
|
+
type: StringConstructor;
|
|
342
|
+
default: undefined;
|
|
343
|
+
};
|
|
344
|
+
buyerAccessTokenProvider: {
|
|
345
|
+
type: PropType<SeasonPickerOptions["buyerAccessTokenProvider"]>;
|
|
346
|
+
default: undefined;
|
|
347
|
+
};
|
|
348
|
+
buyerAccessToken: {
|
|
349
|
+
type: PropType<SeasonPickerOptions["buyerAccessToken"]>;
|
|
350
|
+
default: undefined;
|
|
351
|
+
};
|
|
352
|
+
initialOperationId: {
|
|
353
|
+
type: StringConstructor;
|
|
354
|
+
default: undefined;
|
|
355
|
+
};
|
|
356
|
+
recoveryTimeoutMs: {
|
|
357
|
+
type: NumberConstructor;
|
|
358
|
+
default: undefined;
|
|
359
|
+
};
|
|
360
|
+
fetch: {
|
|
361
|
+
type: PropType<typeof fetch>;
|
|
362
|
+
default: undefined;
|
|
363
|
+
};
|
|
364
|
+
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
365
|
+
[key: string]: any;
|
|
366
|
+
}>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
|
|
367
|
+
hold: (_handoff: SeasonCheckoutHandoff) => true;
|
|
368
|
+
'hold-change': (_handoff: SeasonCheckoutHandoff | null) => true;
|
|
369
|
+
continue: (_handoff: SeasonCheckoutHandoff) => true;
|
|
370
|
+
'renewal-intent': (_intent: SeasonRenewalIntent) => true;
|
|
371
|
+
'access-expired': (_event: unknown) => true;
|
|
372
|
+
'access-unavailable': (_event: unknown) => true;
|
|
373
|
+
'status-change': (_event: SeasonStatusEvent) => true;
|
|
374
|
+
error: (_error: unknown) => true;
|
|
375
|
+
}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
376
|
+
season: {
|
|
377
|
+
type: StringConstructor;
|
|
378
|
+
required: true;
|
|
379
|
+
};
|
|
380
|
+
apiBase: {
|
|
381
|
+
type: StringConstructor;
|
|
382
|
+
default: undefined;
|
|
383
|
+
};
|
|
384
|
+
buyerAccessTokenProvider: {
|
|
385
|
+
type: PropType<SeasonPickerOptions["buyerAccessTokenProvider"]>;
|
|
386
|
+
default: undefined;
|
|
387
|
+
};
|
|
388
|
+
buyerAccessToken: {
|
|
389
|
+
type: PropType<SeasonPickerOptions["buyerAccessToken"]>;
|
|
390
|
+
default: undefined;
|
|
391
|
+
};
|
|
392
|
+
initialOperationId: {
|
|
393
|
+
type: StringConstructor;
|
|
394
|
+
default: undefined;
|
|
395
|
+
};
|
|
396
|
+
recoveryTimeoutMs: {
|
|
397
|
+
type: NumberConstructor;
|
|
398
|
+
default: undefined;
|
|
399
|
+
};
|
|
400
|
+
fetch: {
|
|
401
|
+
type: PropType<typeof fetch>;
|
|
402
|
+
default: undefined;
|
|
403
|
+
};
|
|
404
|
+
}>> & Readonly<{
|
|
405
|
+
onHold?: ((_handoff: SeasonCheckoutHandoff) => any) | undefined;
|
|
406
|
+
onError?: ((_error: unknown) => any) | undefined;
|
|
407
|
+
"onAccess-expired"?: ((_event: unknown) => any) | undefined;
|
|
408
|
+
"onAccess-unavailable"?: ((_event: unknown) => any) | undefined;
|
|
409
|
+
"onHold-change"?: ((_handoff: SeasonCheckoutHandoff | null) => any) | undefined;
|
|
410
|
+
onContinue?: ((_handoff: SeasonCheckoutHandoff) => any) | undefined;
|
|
411
|
+
"onRenewal-intent"?: ((_intent: SeasonRenewalIntent) => any) | undefined;
|
|
412
|
+
"onStatus-change"?: ((_event: SeasonStatusEvent) => any) | undefined;
|
|
413
|
+
}>, {
|
|
414
|
+
apiBase: string;
|
|
415
|
+
buyerAccessTokenProvider: _seatlayer_js.BuyerAccessTokenProvider | undefined;
|
|
416
|
+
buyerAccessToken: string | _seatlayer_js.BuyerAccessToken | undefined;
|
|
417
|
+
initialOperationId: string;
|
|
418
|
+
recoveryTimeoutMs: number;
|
|
419
|
+
fetch: typeof fetch;
|
|
420
|
+
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
421
|
+
|
|
422
|
+
export { SeasonPicker, type SeasonPickerExposed, SeatingChart, type SeatingChartExposed };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as _seatlayer_core from '@seatlayer/core';
|
|
2
2
|
import * as vue from 'vue';
|
|
3
3
|
import { PropType } from 'vue';
|
|
4
|
-
import
|
|
5
|
-
|
|
4
|
+
import * as _seatlayer_js from '@seatlayer/js';
|
|
5
|
+
import { PickerSelectionValidator, RendererViewMode, SeatingChartOptions, BuyerAccessTokenProvider, BuyerAccessToken, SelectedSeat, PickerSelectionValidity, HoldResult, GAAreaAvailability, SeatHoverDetails, BuyerAccessExpiredEvent, BuyerAccessUnavailableEvent, SelectedObjectUnavailableEvent, SeatingChartHandle, SeasonPickerOptions, SeasonCheckoutHandoff, SeasonRenewalIntent, SeasonStatusEvent, SeasonDescriptor, SeasonAvailability } from '@seatlayer/js';
|
|
6
|
+
export { AttachPickerFrameOptions, BestAvailableResult, BuyerAccessExpiredEvent, BuyerAccessRefreshReason, BuyerAccessToken, BuyerAccessTokenProvider, BuyerAccessUnavailableEvent, BuyerAccessUnavailableReason, GAAreaAvailability, HoldLineItem, HoldResult, SeasonAvailability, SeasonCheckoutHandoff, SeasonDescriptor, SeasonOperation, SeasonOperationState, SeasonPickerOptions, SeasonRenewalIntent, SeasonStatusEvent, SeatHoverDetails, SeatPicker as SeatPickerWidget, SelectedObjectUnavailableEvent, SelectedSeat, attachPickerFrame } from '@seatlayer/js';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* What `ref="chart"` gives you — call these to drive the picker from your app.
|
|
@@ -320,4 +321,102 @@ declare const SeatingChart: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
320
321
|
buyerAccessToken: string | BuyerAccessToken;
|
|
321
322
|
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
322
323
|
|
|
323
|
-
|
|
324
|
+
/** Imperative controls exposed through a Vue template ref. */
|
|
325
|
+
interface SeasonPickerExposed {
|
|
326
|
+
holdSameSeat(labels: readonly string[], operationId: string): Promise<SeasonCheckoutHandoff>;
|
|
327
|
+
restoreOperation(operationId: string): Promise<SeasonCheckoutHandoff | null>;
|
|
328
|
+
release(releaseActionId: string): Promise<void>;
|
|
329
|
+
createRenewalIntent(offerId: string): Promise<SeasonRenewalIntent>;
|
|
330
|
+
getDescriptor(): SeasonDescriptor | null;
|
|
331
|
+
getAvailability(): SeasonAvailability | null;
|
|
332
|
+
getHandoff(): SeasonCheckoutHandoff | null;
|
|
333
|
+
}
|
|
334
|
+
/** Vue lifecycle adapter for the distinct fixed-inclusion Season buyer flow. */
|
|
335
|
+
declare const SeasonPicker: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
336
|
+
season: {
|
|
337
|
+
type: StringConstructor;
|
|
338
|
+
required: true;
|
|
339
|
+
};
|
|
340
|
+
apiBase: {
|
|
341
|
+
type: StringConstructor;
|
|
342
|
+
default: undefined;
|
|
343
|
+
};
|
|
344
|
+
buyerAccessTokenProvider: {
|
|
345
|
+
type: PropType<SeasonPickerOptions["buyerAccessTokenProvider"]>;
|
|
346
|
+
default: undefined;
|
|
347
|
+
};
|
|
348
|
+
buyerAccessToken: {
|
|
349
|
+
type: PropType<SeasonPickerOptions["buyerAccessToken"]>;
|
|
350
|
+
default: undefined;
|
|
351
|
+
};
|
|
352
|
+
initialOperationId: {
|
|
353
|
+
type: StringConstructor;
|
|
354
|
+
default: undefined;
|
|
355
|
+
};
|
|
356
|
+
recoveryTimeoutMs: {
|
|
357
|
+
type: NumberConstructor;
|
|
358
|
+
default: undefined;
|
|
359
|
+
};
|
|
360
|
+
fetch: {
|
|
361
|
+
type: PropType<typeof fetch>;
|
|
362
|
+
default: undefined;
|
|
363
|
+
};
|
|
364
|
+
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
365
|
+
[key: string]: any;
|
|
366
|
+
}>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
|
|
367
|
+
hold: (_handoff: SeasonCheckoutHandoff) => true;
|
|
368
|
+
'hold-change': (_handoff: SeasonCheckoutHandoff | null) => true;
|
|
369
|
+
continue: (_handoff: SeasonCheckoutHandoff) => true;
|
|
370
|
+
'renewal-intent': (_intent: SeasonRenewalIntent) => true;
|
|
371
|
+
'access-expired': (_event: unknown) => true;
|
|
372
|
+
'access-unavailable': (_event: unknown) => true;
|
|
373
|
+
'status-change': (_event: SeasonStatusEvent) => true;
|
|
374
|
+
error: (_error: unknown) => true;
|
|
375
|
+
}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
376
|
+
season: {
|
|
377
|
+
type: StringConstructor;
|
|
378
|
+
required: true;
|
|
379
|
+
};
|
|
380
|
+
apiBase: {
|
|
381
|
+
type: StringConstructor;
|
|
382
|
+
default: undefined;
|
|
383
|
+
};
|
|
384
|
+
buyerAccessTokenProvider: {
|
|
385
|
+
type: PropType<SeasonPickerOptions["buyerAccessTokenProvider"]>;
|
|
386
|
+
default: undefined;
|
|
387
|
+
};
|
|
388
|
+
buyerAccessToken: {
|
|
389
|
+
type: PropType<SeasonPickerOptions["buyerAccessToken"]>;
|
|
390
|
+
default: undefined;
|
|
391
|
+
};
|
|
392
|
+
initialOperationId: {
|
|
393
|
+
type: StringConstructor;
|
|
394
|
+
default: undefined;
|
|
395
|
+
};
|
|
396
|
+
recoveryTimeoutMs: {
|
|
397
|
+
type: NumberConstructor;
|
|
398
|
+
default: undefined;
|
|
399
|
+
};
|
|
400
|
+
fetch: {
|
|
401
|
+
type: PropType<typeof fetch>;
|
|
402
|
+
default: undefined;
|
|
403
|
+
};
|
|
404
|
+
}>> & Readonly<{
|
|
405
|
+
onHold?: ((_handoff: SeasonCheckoutHandoff) => any) | undefined;
|
|
406
|
+
onError?: ((_error: unknown) => any) | undefined;
|
|
407
|
+
"onAccess-expired"?: ((_event: unknown) => any) | undefined;
|
|
408
|
+
"onAccess-unavailable"?: ((_event: unknown) => any) | undefined;
|
|
409
|
+
"onHold-change"?: ((_handoff: SeasonCheckoutHandoff | null) => any) | undefined;
|
|
410
|
+
onContinue?: ((_handoff: SeasonCheckoutHandoff) => any) | undefined;
|
|
411
|
+
"onRenewal-intent"?: ((_intent: SeasonRenewalIntent) => any) | undefined;
|
|
412
|
+
"onStatus-change"?: ((_event: SeasonStatusEvent) => any) | undefined;
|
|
413
|
+
}>, {
|
|
414
|
+
apiBase: string;
|
|
415
|
+
buyerAccessTokenProvider: _seatlayer_js.BuyerAccessTokenProvider | undefined;
|
|
416
|
+
buyerAccessToken: string | _seatlayer_js.BuyerAccessToken | undefined;
|
|
417
|
+
initialOperationId: string;
|
|
418
|
+
recoveryTimeoutMs: number;
|
|
419
|
+
fetch: typeof fetch;
|
|
420
|
+
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
421
|
+
|
|
422
|
+
export { SeasonPicker, type SeasonPickerExposed, SeatingChart, type SeatingChartExposed };
|
package/dist/index.js
CHANGED
|
@@ -203,10 +203,115 @@ var SeatingChart = defineComponent({
|
|
|
203
203
|
}
|
|
204
204
|
});
|
|
205
205
|
|
|
206
|
+
// src/SeasonPicker.ts
|
|
207
|
+
import {
|
|
208
|
+
defineComponent as defineComponent2,
|
|
209
|
+
h as h2,
|
|
210
|
+
onBeforeUnmount as onBeforeUnmount2,
|
|
211
|
+
ref as ref2,
|
|
212
|
+
shallowRef as shallowRef2,
|
|
213
|
+
watch as watch2
|
|
214
|
+
} from "vue";
|
|
215
|
+
import {
|
|
216
|
+
SeasonPicker as CoreSeasonPicker
|
|
217
|
+
} from "@seatlayer/js";
|
|
218
|
+
var SeasonPicker = defineComponent2({
|
|
219
|
+
name: "SeatLayerSeasonPicker",
|
|
220
|
+
props: {
|
|
221
|
+
season: { type: String, required: true },
|
|
222
|
+
apiBase: { type: String, default: void 0 },
|
|
223
|
+
buyerAccessTokenProvider: {
|
|
224
|
+
type: Function,
|
|
225
|
+
default: void 0
|
|
226
|
+
},
|
|
227
|
+
buyerAccessToken: {
|
|
228
|
+
type: [String, Object],
|
|
229
|
+
default: void 0
|
|
230
|
+
},
|
|
231
|
+
initialOperationId: { type: String, default: void 0 },
|
|
232
|
+
recoveryTimeoutMs: { type: Number, default: void 0 },
|
|
233
|
+
fetch: { type: Function, default: void 0 }
|
|
234
|
+
},
|
|
235
|
+
emits: {
|
|
236
|
+
hold: (_handoff) => true,
|
|
237
|
+
"hold-change": (_handoff) => true,
|
|
238
|
+
continue: (_handoff) => true,
|
|
239
|
+
"renewal-intent": (_intent) => true,
|
|
240
|
+
"access-expired": (_event) => true,
|
|
241
|
+
"access-unavailable": (_event) => true,
|
|
242
|
+
"status-change": (_event) => true,
|
|
243
|
+
error: (_error) => true
|
|
244
|
+
},
|
|
245
|
+
setup(props, { emit, expose }) {
|
|
246
|
+
const container = ref2(null);
|
|
247
|
+
const picker = shallowRef2(null);
|
|
248
|
+
const destroy = () => {
|
|
249
|
+
picker.value?.destroy();
|
|
250
|
+
picker.value = null;
|
|
251
|
+
};
|
|
252
|
+
const build = () => {
|
|
253
|
+
const element = container.value;
|
|
254
|
+
if (!element) return;
|
|
255
|
+
destroy();
|
|
256
|
+
const instance = new CoreSeasonPicker({
|
|
257
|
+
container: element,
|
|
258
|
+
season: props.season,
|
|
259
|
+
apiBase: props.apiBase,
|
|
260
|
+
buyerAccessTokenProvider: props.buyerAccessTokenProvider,
|
|
261
|
+
buyerAccessToken: props.buyerAccessToken,
|
|
262
|
+
initialOperationId: props.initialOperationId,
|
|
263
|
+
recoveryTimeoutMs: props.recoveryTimeoutMs,
|
|
264
|
+
fetch: props.fetch,
|
|
265
|
+
onHold: (handoff) => emit("hold", handoff),
|
|
266
|
+
onHoldChange: (handoff) => emit("hold-change", handoff),
|
|
267
|
+
onContinue: (handoff) => emit("continue", handoff),
|
|
268
|
+
onRenewalIntent: (intent) => emit("renewal-intent", intent),
|
|
269
|
+
onAccessExpired: (event) => emit("access-expired", event),
|
|
270
|
+
onAccessUnavailable: (event) => emit("access-unavailable", event),
|
|
271
|
+
onStatusChange: (event) => emit("status-change", event),
|
|
272
|
+
onError: (error) => emit("error", error)
|
|
273
|
+
});
|
|
274
|
+
picker.value = instance;
|
|
275
|
+
void instance.render().catch(() => void 0);
|
|
276
|
+
};
|
|
277
|
+
watch2(
|
|
278
|
+
() => [
|
|
279
|
+
container.value,
|
|
280
|
+
props.season,
|
|
281
|
+
props.apiBase,
|
|
282
|
+
props.buyerAccessTokenProvider,
|
|
283
|
+
props.buyerAccessToken,
|
|
284
|
+
props.initialOperationId,
|
|
285
|
+
props.recoveryTimeoutMs,
|
|
286
|
+
props.fetch
|
|
287
|
+
],
|
|
288
|
+
build,
|
|
289
|
+
{ immediate: true, flush: "post" }
|
|
290
|
+
);
|
|
291
|
+
onBeforeUnmount2(destroy);
|
|
292
|
+
const current = () => {
|
|
293
|
+
if (!picker.value) throw new Error("seatlayer: Vue SeasonPicker is not mounted");
|
|
294
|
+
return picker.value;
|
|
295
|
+
};
|
|
296
|
+
const exposed = {
|
|
297
|
+
holdSameSeat: (labels, operationId) => current().holdSameSeat(labels, operationId),
|
|
298
|
+
restoreOperation: (operationId) => current().restoreOperation(operationId),
|
|
299
|
+
release: (releaseActionId) => current().release(releaseActionId),
|
|
300
|
+
createRenewalIntent: (offerId) => current().createRenewalIntent(offerId),
|
|
301
|
+
getDescriptor: () => picker.value?.getDescriptor() ?? null,
|
|
302
|
+
getAvailability: () => picker.value?.getAvailability() ?? null,
|
|
303
|
+
getHandoff: () => picker.value?.getHandoff() ?? null
|
|
304
|
+
};
|
|
305
|
+
expose(exposed);
|
|
306
|
+
return () => h2("div", { ref: container });
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
|
|
206
310
|
// src/index.ts
|
|
207
311
|
import { SeatPicker } from "@seatlayer/js";
|
|
208
312
|
import { attachPickerFrame } from "@seatlayer/js";
|
|
209
313
|
export {
|
|
314
|
+
SeasonPicker,
|
|
210
315
|
SeatPicker as SeatPickerWidget,
|
|
211
316
|
SeatingChart,
|
|
212
317
|
attachPickerFrame
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/SeatingChart.ts","../src/index.ts"],"sourcesContent":["import {\n defineComponent,\n h,\n onBeforeUnmount,\n ref,\n shallowRef,\n watch,\n type PropType,\n type Ref,\n} from 'vue';\nimport {\n SeatingChart as CoreSeatingChart,\n SEATING_CHART_IDENTITY_PROPS,\n bindSeatingChartHandle,\n buildSeatingChartOptions,\n type RendererViewMode,\n type SeatingChartHandle,\n type SeatingChartOptions,\n type SelectedSeat,\n type HoldResult,\n type BestAvailableResult,\n type GAAreaAvailability,\n type SeatHoverDetails,\n type PickerSelectionValidity,\n type PickerSelectionValidator,\n type BuyerAccessToken,\n type BuyerAccessTokenProvider,\n type BuyerAccessExpiredEvent,\n type BuyerAccessUnavailableEvent,\n type SelectedObjectUnavailableEvent,\n} from '@seatlayer/js';\n\n/**\n * What `ref=\"chart\"` gives you — call these to drive the picker from your app.\n *\n * Vue exposes these through `defineExpose`, so a template ref is typed as this\n * rather than as the raw component instance. It is the shared\n * `SeatingChartHandle` from `@seatlayer/js`: the same 17 methods React's `ref`\n * and Angular's component expose, from one declaration, so the three wrappers\n * cannot drift apart again.\n */\nexport type SeatingChartExposed = SeatingChartHandle;\n\n/**\n * Vue 3 wrapper around the framework-agnostic `@seatlayer/js` SDK.\n *\n * The canvas is created once and torn down on unmount. Only the props that\n * change the chart's identity (`SEATING_CHART_IDENTITY_PROPS`: `event`,\n * `apiBase`, `maxSelection`, `numberOfPlacesToSelect`, `publicKey`, `locale`, `currency`,\n * `colorblindSafe`, `initialView`, `errorDisplay`) trigger a rebuild;\n * everything else is read live, so a parent re-render never destroys the canvas\n * mid-selection.\n *\n * Written as a render function rather than an SFC so the package builds with\n * plain TypeScript — a consumer needs no Vue compiler plugin to install it.\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { ref } from 'vue';\n * import { SeatingChart, type SeatingChartExposed } from '@seatlayer/vue';\n *\n * const chart = ref<SeatingChartExposed | null>(null);\n * const checkout = async () => {\n * const held = await chart.value?.hold();\n * if (held) await pay(held.holdId);\n * };\n * </script>\n *\n * <template>\n * <SeatingChart ref=\"chart\" event=\"summer-gala\" @selection-change=\"onChange\" />\n * </template>\n * ```\n */\nexport const SeatingChart = defineComponent({\n name: 'SeatLayerSeatingChart',\n\n props: {\n /** Event key to render. Changing it rebuilds the chart. */\n event: { type: String, required: true },\n /** API base URL. Defaults to the public API. */\n apiBase: { type: String, default: undefined },\n /** Cap on how many seats a buyer may select. */\n maxSelection: { type: Number, default: undefined },\n /** Object ids or public labels selected after availability loads. */\n selectedObjects: { type: Array as PropType<string[]>, default: undefined },\n /** Object ids or public labels the buyer may select. */\n selectableObjects: { type: Array as PropType<string[] | null>, default: undefined },\n /** Exact ticket count required for a valid selection. */\n numberOfPlacesToSelect: { type: Number, default: undefined },\n /** Local buyer selection guards. Changing them rebuilds the chart. */\n selectionValidators: { type: Array as PropType<PickerSelectionValidator[]>, default: undefined },\n /** Publishable key, when your integration uses one. */\n publicKey: { type: String, default: undefined },\n /** BCP-47 locale for built-in copy. */\n locale: { type: String, default: undefined },\n /** ISO currency for price formatting. */\n currency: { type: String, default: undefined },\n /** Render with colorblind-safe seat glyphs. */\n colorblindSafe: { type: Boolean, default: undefined },\n /**\n * Initial canvas projection. Read once when the chart is built, so\n * changing it rebuilds.\n * @deprecated `'isometric'` and `'perspective'` are retired in favour of\n * the real 3D venue view; use `'flat'`.\n */\n initialView: {\n type: String as PropType<RendererViewMode>,\n default: undefined,\n },\n /**\n * What the BUYER sees when the chart cannot load: `'message'` (default) is\n * a styleable notice with a Try again button, `'none'` is silent for hosts\n * that render their own failure UI from the `error` event.\n */\n errorDisplay: {\n type: String as PropType<'message' | 'none'>,\n default: undefined,\n },\n /** Copy overrides, read once per mount. */\n messages: {\n type: Object as PropType<SeatingChartOptions['messages']>,\n default: undefined,\n },\n /**\n * Show the built-in seat tooltip. Set false to draw your own popover from\n * the `seat-hover` event.\n */\n seatTooltip: { type: Boolean, default: undefined },\n /**\n * Sales Channels: mint a buyer access session on demand. Called with a\n * `reason`; returns `{ token, expiresAt }` from YOUR backend. The token is\n * held in memory only — never storage, never a URL, never a log.\n */\n buyerAccessTokenProvider: {\n type: Function as PropType<BuyerAccessTokenProvider>,\n default: undefined,\n },\n /** One-shot session for hosts that own the lifecycle. Cannot be renewed. */\n buyerAccessToken: {\n type: [String, Object] as PropType<string | BuyerAccessToken>,\n default: undefined,\n },\n },\n\n emits: {\n /** The buyer's selection changed. */\n 'selection-change': (_seats: SelectedSeat[]) => true,\n /** Exact-count state changed. */\n 'selection-validity-change': (_state: PickerSelectionValidity) => true,\n /** The exact count was reached. */\n 'selection-valid': (_seats: SelectedSeat[]) => true,\n /** The selection is not at the exact count. */\n 'selection-invalid': (_state: PickerSelectionValidity) => true,\n /** The active selection cap was reached. */\n 'selection-limit': (_max: number) => true,\n /** A hold succeeded. */\n hold: (_result: HoldResult) => true,\n /** A previous hold was restored on mount. */\n 'hold-restored': (_result: HoldResult) => true,\n /** The active hold lapsed. */\n 'hold-expired': () => true,\n /** A GA area was clicked. */\n 'ga-click': (_area: GAAreaAvailability) => true,\n /** Something failed — a network error, a rejected hold. */\n error: (_error: unknown) => true,\n /** A floor deck was tapped in the 3D view. */\n 'deck-tap': (_floorId: string) => true,\n /** A transient hint worth showing the buyer, or `null` to clear it. */\n hint: (_message: string | null) => true,\n /** The pointer moved onto a seat, or off one (`null`). */\n 'seat-hover': (_details: SeatHoverDetails | null) => true,\n /** The buyer access session lapsed; `refreshed` says whether it recovered. */\n 'access-expired': (_event: BuyerAccessExpiredEvent) => true,\n /** Private inventory is unavailable and refreshing will not fix it. */\n 'access-unavailable': (_event: BuyerAccessUnavailableEvent) => true,\n /** Selected-but-unheld units stopped being selectable. */\n 'selected-object-unavailable': (_event: SelectedObjectUnavailableEvent) => true,\n },\n\n setup(props, { emit, expose }) {\n const container: Ref<HTMLDivElement | null> = ref(null);\n // shallowRef: the chart owns a canvas and a large scene graph, and making it\n // deeply reactive would have Vue walk all of it on every touch.\n const chart = shallowRef<CoreSeatingChart | null>(null);\n\n const destroy = () => {\n chart.value?.destroy();\n chart.value = null;\n };\n\n const build = () => {\n const element = container.value;\n if (!element) return;\n\n destroy();\n\n // Handlers are bound here rather than inline in the options literal.\n // Inline, TypeScript has to resolve `emit`'s overloads while it is still\n // contextually typing the literal against SeatingChartOptions, and it\n // gives up — collapsing to the last emit signature. Naming them first\n // separates the two inference problems, and reads better besides.\n const onSelectionChange = (seats: SelectedSeat[]) => emit('selection-change', seats);\n const onSelectionValidityChange = (state: PickerSelectionValidity) => emit('selection-validity-change', state);\n const onSelectionValid = (seats: SelectedSeat[]) => emit('selection-valid', seats);\n const onSelectionInvalid = (state: PickerSelectionValidity) => emit('selection-invalid', state);\n const onSelectionLimit = (max: number) => emit('selection-limit', max);\n const onHold = (result: HoldResult) => emit('hold', result);\n const onHoldRestored = (result: HoldResult) => emit('hold-restored', result);\n const onHoldExpired = () => emit('hold-expired');\n const onGAClick = (area: GAAreaAvailability) => emit('ga-click', area);\n const onError = (error: unknown) => emit('error', error);\n const onDeckTap = (floorId: string) => emit('deck-tap', floorId);\n const onHint = (message: string | null) => emit('hint', message);\n const onSeatHover = (details: SeatHoverDetails | null) => emit('seat-hover', details);\n const onAccessExpired = (state: BuyerAccessExpiredEvent) => emit('access-expired', state);\n const onAccessUnavailable = (state: BuyerAccessUnavailableEvent) =>\n emit('access-unavailable', state);\n const onSelectedObjectUnavailable = (state: SelectedObjectUnavailableEvent) =>\n emit('selected-object-unavailable', state);\n\n const instance = new CoreSeatingChart(buildSeatingChartOptions(\n element,\n {\n event: props.event,\n apiBase: props.apiBase,\n maxSelection: props.maxSelection,\n selectedObjects: props.selectedObjects,\n selectableObjects: props.selectableObjects,\n numberOfPlacesToSelect: props.numberOfPlacesToSelect,\n selectionValidators: props.selectionValidators,\n publicKey: props.publicKey,\n locale: props.locale,\n currency: props.currency,\n colorblindSafe: props.colorblindSafe,\n initialView: props.initialView,\n errorDisplay: props.errorDisplay,\n messages: props.messages,\n seatTooltip: props.seatTooltip,\n buyerAccessTokenProvider: props.buyerAccessTokenProvider,\n buyerAccessToken: props.buyerAccessToken,\n },\n {\n onAccessExpired,\n onAccessUnavailable,\n onSelectedObjectUnavailable,\n onSelectionChange,\n onSelectionValidityChange,\n onSelectionValid,\n onSelectionInvalid,\n onSelectionLimit,\n onHold,\n onHoldRestored,\n onHoldExpired,\n onGAClick,\n onError,\n onDeckTap,\n onHint,\n onSeatHover,\n },\n ));\n\n chart.value = instance;\n void instance.render();\n };\n\n // `flush: 'post'` so the container element exists on the first run — a\n // pre-flush watcher would fire before the DOM node is attached.\n watch(\n () => [\n container.value,\n // The shared identity list, not a hand-copied one — this is exactly the\n // place Vue fell two props behind React.\n ...SEATING_CHART_IDENTITY_PROPS.map((prop) => props[prop]),\n ],\n build,\n { immediate: true, flush: 'post' },\n );\n\n onBeforeUnmount(destroy);\n\n // Built once and read live: the handle must survive every rebuild, so it\n // asks for the current instance on each call rather than capturing one.\n const exposed: SeatingChartExposed = bindSeatingChartHandle(() => chart.value);\n expose(exposed);\n\n return () => h('div', { ref: container });\n },\n});\n","/**\n * @seatlayer/vue — the Vue 3 wrapper for the SeatLayer embed SDK.\n *\n * Components are written as render functions rather than SFCs, so installing\n * this package needs no Vue compiler plugin.\n */\nexport { SeatingChart } from './SeatingChart';\nexport type { SeatingChartExposed } from './SeatingChart';\n\nexport type {\n SelectedSeat,\n HoldResult,\n BestAvailableResult,\n GAAreaAvailability,\n HoldLineItem,\n SeatHoverDetails,\n} from '@seatlayer/js';\n\n// Sales Channels — buyer access sessions for private channel inventory.\nexport type {\n BuyerAccessToken,\n BuyerAccessTokenProvider,\n BuyerAccessRefreshReason,\n BuyerAccessUnavailableReason,\n BuyerAccessExpiredEvent,\n BuyerAccessUnavailableEvent,\n SelectedObjectUnavailableEvent,\n} from '@seatlayer/js';\n\n// The framework-agnostic widget class — for the one-call modal (SeatPickerWidget.open()).\nexport { SeatPicker as SeatPickerWidget } from '@seatlayer/js';\n\n// Host-side embed helper: grows the iframe on `seatlayer:height` and pins it on\n// `seatlayer:fullscreen`. Vue hosts depend on this package alone, so it has to be\n// reachable here rather than only from @seatlayer/js.\nexport { attachPickerFrame } from '@seatlayer/js';\nexport type { AttachPickerFrameOptions } from '@seatlayer/js';\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/SeatingChart.ts","../src/SeasonPicker.ts","../src/index.ts"],"sourcesContent":["import {\n defineComponent,\n h,\n onBeforeUnmount,\n ref,\n shallowRef,\n watch,\n type PropType,\n type Ref,\n} from 'vue';\nimport {\n SeatingChart as CoreSeatingChart,\n SEATING_CHART_IDENTITY_PROPS,\n bindSeatingChartHandle,\n buildSeatingChartOptions,\n type RendererViewMode,\n type SeatingChartHandle,\n type SeatingChartOptions,\n type SelectedSeat,\n type HoldResult,\n type BestAvailableResult,\n type GAAreaAvailability,\n type SeatHoverDetails,\n type PickerSelectionValidity,\n type PickerSelectionValidator,\n type BuyerAccessToken,\n type BuyerAccessTokenProvider,\n type BuyerAccessExpiredEvent,\n type BuyerAccessUnavailableEvent,\n type SelectedObjectUnavailableEvent,\n} from '@seatlayer/js';\n\n/**\n * What `ref=\"chart\"` gives you — call these to drive the picker from your app.\n *\n * Vue exposes these through `defineExpose`, so a template ref is typed as this\n * rather than as the raw component instance. It is the shared\n * `SeatingChartHandle` from `@seatlayer/js`: the same 17 methods React's `ref`\n * and Angular's component expose, from one declaration, so the three wrappers\n * cannot drift apart again.\n */\nexport type SeatingChartExposed = SeatingChartHandle;\n\n/**\n * Vue 3 wrapper around the framework-agnostic `@seatlayer/js` SDK.\n *\n * The canvas is created once and torn down on unmount. Only the props that\n * change the chart's identity (`SEATING_CHART_IDENTITY_PROPS`: `event`,\n * `apiBase`, `maxSelection`, `numberOfPlacesToSelect`, `publicKey`, `locale`, `currency`,\n * `colorblindSafe`, `initialView`, `errorDisplay`) trigger a rebuild;\n * everything else is read live, so a parent re-render never destroys the canvas\n * mid-selection.\n *\n * Written as a render function rather than an SFC so the package builds with\n * plain TypeScript — a consumer needs no Vue compiler plugin to install it.\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { ref } from 'vue';\n * import { SeatingChart, type SeatingChartExposed } from '@seatlayer/vue';\n *\n * const chart = ref<SeatingChartExposed | null>(null);\n * const checkout = async () => {\n * const held = await chart.value?.hold();\n * if (held) await pay(held.holdId);\n * };\n * </script>\n *\n * <template>\n * <SeatingChart ref=\"chart\" event=\"summer-gala\" @selection-change=\"onChange\" />\n * </template>\n * ```\n */\nexport const SeatingChart = defineComponent({\n name: 'SeatLayerSeatingChart',\n\n props: {\n /** Event key to render. Changing it rebuilds the chart. */\n event: { type: String, required: true },\n /** API base URL. Defaults to the public API. */\n apiBase: { type: String, default: undefined },\n /** Cap on how many seats a buyer may select. */\n maxSelection: { type: Number, default: undefined },\n /** Object ids or public labels selected after availability loads. */\n selectedObjects: { type: Array as PropType<string[]>, default: undefined },\n /** Object ids or public labels the buyer may select. */\n selectableObjects: { type: Array as PropType<string[] | null>, default: undefined },\n /** Exact ticket count required for a valid selection. */\n numberOfPlacesToSelect: { type: Number, default: undefined },\n /** Local buyer selection guards. Changing them rebuilds the chart. */\n selectionValidators: { type: Array as PropType<PickerSelectionValidator[]>, default: undefined },\n /** Publishable key, when your integration uses one. */\n publicKey: { type: String, default: undefined },\n /** BCP-47 locale for built-in copy. */\n locale: { type: String, default: undefined },\n /** ISO currency for price formatting. */\n currency: { type: String, default: undefined },\n /** Render with colorblind-safe seat glyphs. */\n colorblindSafe: { type: Boolean, default: undefined },\n /**\n * Initial canvas projection. Read once when the chart is built, so\n * changing it rebuilds.\n * @deprecated `'isometric'` and `'perspective'` are retired in favour of\n * the real 3D venue view; use `'flat'`.\n */\n initialView: {\n type: String as PropType<RendererViewMode>,\n default: undefined,\n },\n /**\n * What the BUYER sees when the chart cannot load: `'message'` (default) is\n * a styleable notice with a Try again button, `'none'` is silent for hosts\n * that render their own failure UI from the `error` event.\n */\n errorDisplay: {\n type: String as PropType<'message' | 'none'>,\n default: undefined,\n },\n /** Copy overrides, read once per mount. */\n messages: {\n type: Object as PropType<SeatingChartOptions['messages']>,\n default: undefined,\n },\n /**\n * Show the built-in seat tooltip. Set false to draw your own popover from\n * the `seat-hover` event.\n */\n seatTooltip: { type: Boolean, default: undefined },\n /**\n * Sales Channels: mint a buyer access session on demand. Called with a\n * `reason`; returns `{ token, expiresAt }` from YOUR backend. The token is\n * held in memory only — never storage, never a URL, never a log.\n */\n buyerAccessTokenProvider: {\n type: Function as PropType<BuyerAccessTokenProvider>,\n default: undefined,\n },\n /** One-shot session for hosts that own the lifecycle. Cannot be renewed. */\n buyerAccessToken: {\n type: [String, Object] as PropType<string | BuyerAccessToken>,\n default: undefined,\n },\n },\n\n emits: {\n /** The buyer's selection changed. */\n 'selection-change': (_seats: SelectedSeat[]) => true,\n /** Exact-count state changed. */\n 'selection-validity-change': (_state: PickerSelectionValidity) => true,\n /** The exact count was reached. */\n 'selection-valid': (_seats: SelectedSeat[]) => true,\n /** The selection is not at the exact count. */\n 'selection-invalid': (_state: PickerSelectionValidity) => true,\n /** The active selection cap was reached. */\n 'selection-limit': (_max: number) => true,\n /** A hold succeeded. */\n hold: (_result: HoldResult) => true,\n /** A previous hold was restored on mount. */\n 'hold-restored': (_result: HoldResult) => true,\n /** The active hold lapsed. */\n 'hold-expired': () => true,\n /** A GA area was clicked. */\n 'ga-click': (_area: GAAreaAvailability) => true,\n /** Something failed — a network error, a rejected hold. */\n error: (_error: unknown) => true,\n /** A floor deck was tapped in the 3D view. */\n 'deck-tap': (_floorId: string) => true,\n /** A transient hint worth showing the buyer, or `null` to clear it. */\n hint: (_message: string | null) => true,\n /** The pointer moved onto a seat, or off one (`null`). */\n 'seat-hover': (_details: SeatHoverDetails | null) => true,\n /** The buyer access session lapsed; `refreshed` says whether it recovered. */\n 'access-expired': (_event: BuyerAccessExpiredEvent) => true,\n /** Private inventory is unavailable and refreshing will not fix it. */\n 'access-unavailable': (_event: BuyerAccessUnavailableEvent) => true,\n /** Selected-but-unheld units stopped being selectable. */\n 'selected-object-unavailable': (_event: SelectedObjectUnavailableEvent) => true,\n },\n\n setup(props, { emit, expose }) {\n const container: Ref<HTMLDivElement | null> = ref(null);\n // shallowRef: the chart owns a canvas and a large scene graph, and making it\n // deeply reactive would have Vue walk all of it on every touch.\n const chart = shallowRef<CoreSeatingChart | null>(null);\n\n const destroy = () => {\n chart.value?.destroy();\n chart.value = null;\n };\n\n const build = () => {\n const element = container.value;\n if (!element) return;\n\n destroy();\n\n // Handlers are bound here rather than inline in the options literal.\n // Inline, TypeScript has to resolve `emit`'s overloads while it is still\n // contextually typing the literal against SeatingChartOptions, and it\n // gives up — collapsing to the last emit signature. Naming them first\n // separates the two inference problems, and reads better besides.\n const onSelectionChange = (seats: SelectedSeat[]) => emit('selection-change', seats);\n const onSelectionValidityChange = (state: PickerSelectionValidity) => emit('selection-validity-change', state);\n const onSelectionValid = (seats: SelectedSeat[]) => emit('selection-valid', seats);\n const onSelectionInvalid = (state: PickerSelectionValidity) => emit('selection-invalid', state);\n const onSelectionLimit = (max: number) => emit('selection-limit', max);\n const onHold = (result: HoldResult) => emit('hold', result);\n const onHoldRestored = (result: HoldResult) => emit('hold-restored', result);\n const onHoldExpired = () => emit('hold-expired');\n const onGAClick = (area: GAAreaAvailability) => emit('ga-click', area);\n const onError = (error: unknown) => emit('error', error);\n const onDeckTap = (floorId: string) => emit('deck-tap', floorId);\n const onHint = (message: string | null) => emit('hint', message);\n const onSeatHover = (details: SeatHoverDetails | null) => emit('seat-hover', details);\n const onAccessExpired = (state: BuyerAccessExpiredEvent) => emit('access-expired', state);\n const onAccessUnavailable = (state: BuyerAccessUnavailableEvent) =>\n emit('access-unavailable', state);\n const onSelectedObjectUnavailable = (state: SelectedObjectUnavailableEvent) =>\n emit('selected-object-unavailable', state);\n\n const instance = new CoreSeatingChart(buildSeatingChartOptions(\n element,\n {\n event: props.event,\n apiBase: props.apiBase,\n maxSelection: props.maxSelection,\n selectedObjects: props.selectedObjects,\n selectableObjects: props.selectableObjects,\n numberOfPlacesToSelect: props.numberOfPlacesToSelect,\n selectionValidators: props.selectionValidators,\n publicKey: props.publicKey,\n locale: props.locale,\n currency: props.currency,\n colorblindSafe: props.colorblindSafe,\n initialView: props.initialView,\n errorDisplay: props.errorDisplay,\n messages: props.messages,\n seatTooltip: props.seatTooltip,\n buyerAccessTokenProvider: props.buyerAccessTokenProvider,\n buyerAccessToken: props.buyerAccessToken,\n },\n {\n onAccessExpired,\n onAccessUnavailable,\n onSelectedObjectUnavailable,\n onSelectionChange,\n onSelectionValidityChange,\n onSelectionValid,\n onSelectionInvalid,\n onSelectionLimit,\n onHold,\n onHoldRestored,\n onHoldExpired,\n onGAClick,\n onError,\n onDeckTap,\n onHint,\n onSeatHover,\n },\n ));\n\n chart.value = instance;\n void instance.render();\n };\n\n // `flush: 'post'` so the container element exists on the first run — a\n // pre-flush watcher would fire before the DOM node is attached.\n watch(\n () => [\n container.value,\n // The shared identity list, not a hand-copied one — this is exactly the\n // place Vue fell two props behind React.\n ...SEATING_CHART_IDENTITY_PROPS.map((prop) => props[prop]),\n ],\n build,\n { immediate: true, flush: 'post' },\n );\n\n onBeforeUnmount(destroy);\n\n // Built once and read live: the handle must survive every rebuild, so it\n // asks for the current instance on each call rather than capturing one.\n const exposed: SeatingChartExposed = bindSeatingChartHandle(() => chart.value);\n expose(exposed);\n\n return () => h('div', { ref: container });\n },\n});\n","import {\n defineComponent,\n h,\n onBeforeUnmount,\n ref,\n shallowRef,\n watch,\n type PropType,\n type Ref,\n} from 'vue';\nimport {\n SeasonPicker as CoreSeasonPicker,\n type SeasonAvailability,\n type SeasonCheckoutHandoff,\n type SeasonDescriptor,\n type SeasonPickerOptions,\n type SeasonRenewalIntent,\n type SeasonStatusEvent,\n} from '@seatlayer/js';\n\n/** Imperative controls exposed through a Vue template ref. */\nexport interface SeasonPickerExposed {\n holdSameSeat(labels: readonly string[], operationId: string): Promise<SeasonCheckoutHandoff>;\n restoreOperation(operationId: string): Promise<SeasonCheckoutHandoff | null>;\n release(releaseActionId: string): Promise<void>;\n createRenewalIntent(offerId: string): Promise<SeasonRenewalIntent>;\n getDescriptor(): SeasonDescriptor | null;\n getAvailability(): SeasonAvailability | null;\n getHandoff(): SeasonCheckoutHandoff | null;\n}\n\n/** Vue lifecycle adapter for the distinct fixed-inclusion Season buyer flow. */\nexport const SeasonPicker = defineComponent({\n name: 'SeatLayerSeasonPicker',\n props: {\n season: { type: String, required: true },\n apiBase: { type: String, default: undefined },\n buyerAccessTokenProvider: {\n type: Function as PropType<SeasonPickerOptions['buyerAccessTokenProvider']>,\n default: undefined,\n },\n buyerAccessToken: {\n type: [String, Object] as PropType<SeasonPickerOptions['buyerAccessToken']>,\n default: undefined,\n },\n initialOperationId: { type: String, default: undefined },\n recoveryTimeoutMs: { type: Number, default: undefined },\n fetch: { type: Function as PropType<typeof fetch>, default: undefined },\n },\n emits: {\n hold: (_handoff: SeasonCheckoutHandoff) => true,\n 'hold-change': (_handoff: SeasonCheckoutHandoff | null) => true,\n continue: (_handoff: SeasonCheckoutHandoff) => true,\n 'renewal-intent': (_intent: SeasonRenewalIntent) => true,\n 'access-expired': (_event: unknown) => true,\n 'access-unavailable': (_event: unknown) => true,\n 'status-change': (_event: SeasonStatusEvent) => true,\n error: (_error: unknown) => true,\n },\n setup(props, { emit, expose }) {\n const container: Ref<HTMLDivElement | null> = ref(null);\n const picker = shallowRef<CoreSeasonPicker | null>(null);\n\n const destroy = () => {\n picker.value?.destroy();\n picker.value = null;\n };\n const build = () => {\n const element = container.value;\n if (!element) return;\n destroy();\n const instance = new CoreSeasonPicker({\n container: element,\n season: props.season,\n apiBase: props.apiBase,\n buyerAccessTokenProvider: props.buyerAccessTokenProvider,\n buyerAccessToken: props.buyerAccessToken,\n initialOperationId: props.initialOperationId,\n recoveryTimeoutMs: props.recoveryTimeoutMs,\n fetch: props.fetch,\n onHold: (handoff) => emit('hold', handoff),\n onHoldChange: (handoff) => emit('hold-change', handoff),\n onContinue: (handoff) => emit('continue', handoff),\n onRenewalIntent: (intent) => emit('renewal-intent', intent),\n onAccessExpired: (event) => emit('access-expired', event),\n onAccessUnavailable: (event) => emit('access-unavailable', event),\n onStatusChange: (event) => emit('status-change', event),\n onError: (error) => emit('error', error),\n });\n picker.value = instance;\n void instance.render().catch(() => undefined);\n };\n\n watch(\n () => [\n container.value,\n props.season,\n props.apiBase,\n props.buyerAccessTokenProvider,\n props.buyerAccessToken,\n props.initialOperationId,\n props.recoveryTimeoutMs,\n props.fetch,\n ],\n build,\n { immediate: true, flush: 'post' },\n );\n onBeforeUnmount(destroy);\n\n const current = (): CoreSeasonPicker => {\n if (!picker.value) throw new Error('seatlayer: Vue SeasonPicker is not mounted');\n return picker.value;\n };\n const exposed: SeasonPickerExposed = {\n holdSameSeat: (labels, operationId) => current().holdSameSeat(labels, operationId),\n restoreOperation: (operationId) => current().restoreOperation(operationId),\n release: (releaseActionId) => current().release(releaseActionId),\n createRenewalIntent: (offerId) => current().createRenewalIntent(offerId),\n getDescriptor: () => picker.value?.getDescriptor() ?? null,\n getAvailability: () => picker.value?.getAvailability() ?? null,\n getHandoff: () => picker.value?.getHandoff() ?? null,\n };\n expose(exposed);\n return () => h('div', { ref: container });\n },\n});\n","/**\n * @seatlayer/vue — the Vue 3 wrapper for the SeatLayer embed SDK.\n *\n * Components are written as render functions rather than SFCs, so installing\n * this package needs no Vue compiler plugin.\n */\nexport { SeatingChart } from './SeatingChart';\nexport type { SeatingChartExposed } from './SeatingChart';\nexport { SeasonPicker } from './SeasonPicker';\nexport type { SeasonPickerExposed } from './SeasonPicker';\n\nexport type {\n SelectedSeat,\n HoldResult,\n BestAvailableResult,\n GAAreaAvailability,\n HoldLineItem,\n SeatHoverDetails,\n SeasonAvailability,\n SeasonCheckoutHandoff,\n SeasonDescriptor,\n SeasonOperation,\n SeasonOperationState,\n SeasonPickerOptions,\n SeasonRenewalIntent,\n SeasonStatusEvent,\n} from '@seatlayer/js';\n\n// Sales Channels — buyer access sessions for private channel inventory.\nexport type {\n BuyerAccessToken,\n BuyerAccessTokenProvider,\n BuyerAccessRefreshReason,\n BuyerAccessUnavailableReason,\n BuyerAccessExpiredEvent,\n BuyerAccessUnavailableEvent,\n SelectedObjectUnavailableEvent,\n} from '@seatlayer/js';\n\n// The framework-agnostic widget class — for the one-call modal (SeatPickerWidget.open()).\nexport { SeatPicker as SeatPickerWidget } from '@seatlayer/js';\n\n// Host-side embed helper: grows the iframe on `seatlayer:height` and pins it on\n// `seatlayer:fullscreen`. Vue hosts depend on this package alone, so it has to be\n// reachable here rather than only from @seatlayer/js.\nexport { attachPickerFrame } from '@seatlayer/js';\nexport type { AttachPickerFrameOptions } from '@seatlayer/js';\n"],"mappings":"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","names":["defineComponent","h","onBeforeUnmount","ref","shallowRef","watch"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seatlayer/vue",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.72.1",
|
|
4
4
|
"description": "SeatLayer's official Vue seating chart and seat map SDK — live availability, seat selection, temporary holds, and a typed TypeScript API for ticketing apps.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -56,8 +56,8 @@
|
|
|
56
56
|
"typescript"
|
|
57
57
|
],
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@seatlayer/core": "0.
|
|
60
|
-
"@seatlayer/js": "0.
|
|
59
|
+
"@seatlayer/core": "0.72.1",
|
|
60
|
+
"@seatlayer/js": "0.72.1"
|
|
61
61
|
},
|
|
62
62
|
"peerDependencies": {
|
|
63
63
|
"vue": ">=3.3.0"
|