@getmicdrop/venue-calendar 4.0.92 → 4.0.93

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.
Files changed (102) hide show
  1. package/dist/CartView-R5Z2q4Hy.js +2380 -0
  2. package/dist/CartView-R5Z2q4Hy.js.map +1 -0
  3. package/dist/Checkout-BUwdMMjA.js +1040 -0
  4. package/dist/Checkout-BUwdMMjA.js.map +1 -0
  5. package/dist/{Checkout-BscK0fmI.js → Checkout-avoTg_Zw.js} +612 -587
  6. package/dist/Checkout-avoTg_Zw.js.map +1 -0
  7. package/dist/{CheckoutTimer-CF6emJxC.js → CheckoutTimer-C_ax1Uo2.js} +37 -37
  8. package/dist/CheckoutTimer-C_ax1Uo2.js.map +1 -0
  9. package/dist/ClockIcon-C5muTIYL.js +32 -0
  10. package/dist/ClockIcon-C5muTIYL.js.map +1 -0
  11. package/dist/CollectionView-3MHrh5Zm.js +299 -0
  12. package/dist/CollectionView-3MHrh5Zm.js.map +1 -0
  13. package/dist/{Event-BzBZmp6N.js → Event-vR1aE543.js} +1593 -1509
  14. package/dist/Event-vR1aE543.js.map +1 -0
  15. package/dist/EventPage-Bhg-8-5x.js +566 -0
  16. package/dist/EventPage-Bhg-8-5x.js.map +1 -0
  17. package/dist/{Heading-BswFTsr3.js → Heading-ZcvybCi8.js} +30 -30
  18. package/dist/Heading-ZcvybCi8.js.map +1 -0
  19. package/dist/ScarcityBadge-CjTFAhat.js +167 -0
  20. package/dist/ScarcityBadge-CjTFAhat.js.map +1 -0
  21. package/dist/{SeriesPage-CbmuRofu.js → SeriesPage-DTEY83yR.js} +5 -5
  22. package/dist/{SeriesPage-CbmuRofu.js.map → SeriesPage-DTEY83yR.js.map} +1 -1
  23. package/dist/{Spinner-CAxL7NK0.js → Spinner--YBVljiP.js} +10 -10
  24. package/dist/Spinner--YBVljiP.js.map +1 -0
  25. package/dist/Success-ClCvTxTH.js +848 -0
  26. package/dist/Success-ClCvTxTH.js.map +1 -0
  27. package/dist/Text-SlV9H-GU.js +171 -0
  28. package/dist/Text-SlV9H-GU.js.map +1 -0
  29. package/dist/VenueCalendar-Bth_j-Wp.js +15657 -0
  30. package/dist/VenueCalendar-Bth_j-Wp.js.map +1 -0
  31. package/dist/{ViewTicketsEmbed-C7GPK33F.js → ViewTicketsEmbed-D7g7RYZI.js} +375 -364
  32. package/dist/{ViewTicketsEmbed-C7GPK33F.js.map → ViewTicketsEmbed-D7g7RYZI.js.map} +1 -1
  33. package/dist/api/{events.d.ts → api/events.d.ts} +9 -10
  34. package/dist/api/{index.d.ts → api/index.d.ts} +2 -1
  35. package/dist/api/api/result.d.ts +48 -0
  36. package/dist/api/{transformers → api/transformers}/event.d.ts +19 -10
  37. package/dist/api/api.cjs +1 -1
  38. package/dist/api/api.cjs.map +1 -1
  39. package/dist/api/api.mjs +688 -594
  40. package/dist/api/api.mjs.map +1 -1
  41. package/dist/api/types.d.ts +447 -438
  42. package/dist/{data-toggle-store.svelte-BUOQgWTH.js → data-toggle-store.svelte-CFAVM8I0.js} +2 -2
  43. package/dist/{data-toggle-store.svelte-BUOQgWTH.js.map → data-toggle-store.svelte-CFAVM8I0.js.map} +1 -1
  44. package/dist/labels-CnpAWtkz.js +640 -0
  45. package/dist/labels-CnpAWtkz.js.map +1 -0
  46. package/dist/{modalManager.svelte-C8L8XPBi.js → modalManager.svelte-T2RGHhZH.js} +2 -2
  47. package/dist/{modalManager.svelte-C8L8XPBi.js.map → modalManager.svelte-T2RGHhZH.js.map} +1 -1
  48. package/dist/seo/seo.cjs +1 -1
  49. package/dist/seo/seo.cjs.map +1 -1
  50. package/dist/seo/seo.mjs +78 -74
  51. package/dist/seo/seo.mjs.map +1 -1
  52. package/dist/transform-C3TwZSH6.js +349 -0
  53. package/dist/transform-C3TwZSH6.js.map +1 -0
  54. package/dist/types/index.d.ts +22 -10
  55. package/dist/venue-calendar.css +1 -1
  56. package/dist/venue-calendar.es.js +18 -18
  57. package/dist/venue-calendar.iife.js +46 -32
  58. package/dist/venue-calendar.iife.js.map +1 -1
  59. package/dist/venue-calendar.umd.js +45 -31
  60. package/dist/venue-calendar.umd.js.map +1 -1
  61. package/package.json +7 -5
  62. package/dist/CartView-IiXG4UTa.js +0 -2366
  63. package/dist/CartView-IiXG4UTa.js.map +0 -1
  64. package/dist/Checkout-BscK0fmI.js.map +0 -1
  65. package/dist/Checkout-Dx7QWFn9.js +0 -916
  66. package/dist/Checkout-Dx7QWFn9.js.map +0 -1
  67. package/dist/CheckoutTimer-CF6emJxC.js.map +0 -1
  68. package/dist/CollectionView-BAy5mYKg.js +0 -299
  69. package/dist/CollectionView-BAy5mYKg.js.map +0 -1
  70. package/dist/Event-BzBZmp6N.js.map +0 -1
  71. package/dist/EventPage-TNjZq1ls.js +0 -532
  72. package/dist/EventPage-TNjZq1ls.js.map +0 -1
  73. package/dist/Heading-BswFTsr3.js.map +0 -1
  74. package/dist/ScarcityBadge-DEzS1qXs.js +0 -90
  75. package/dist/ScarcityBadge-DEzS1qXs.js.map +0 -1
  76. package/dist/Spinner-CAxL7NK0.js.map +0 -1
  77. package/dist/Success-DdWMiFHS.js +0 -729
  78. package/dist/Success-DdWMiFHS.js.map +0 -1
  79. package/dist/Text-HvIEXENM.js +0 -167
  80. package/dist/Text-HvIEXENM.js.map +0 -1
  81. package/dist/VenueCalendar-DhxkKfli.js +0 -18400
  82. package/dist/VenueCalendar-DhxkKfli.js.map +0 -1
  83. package/dist/labels-Bwet5rDx.js +0 -965
  84. package/dist/labels-Bwet5rDx.js.map +0 -1
  85. package/dist/transform-5AH-sRWT.js +0 -274
  86. package/dist/transform-5AH-sRWT.js.map +0 -1
  87. /package/dist/api/{client.d.ts → api/client.d.ts} +0 -0
  88. /package/dist/api/{cta.d.ts → api/cta.d.ts} +0 -0
  89. /package/dist/api/{gift-cards.d.ts → api/gift-cards.d.ts} +0 -0
  90. /package/dist/api/{orders.d.ts → api/orders.d.ts} +0 -0
  91. /package/dist/api/{promo.d.ts → api/promo.d.ts} +0 -0
  92. /package/dist/api/{transformers → api/transformers}/address.d.ts +0 -0
  93. /package/dist/api/{transformers → api/transformers}/cart.d.ts +0 -0
  94. /package/dist/api/{transformers → api/transformers}/collection.d.ts +0 -0
  95. /package/dist/api/{transformers → api/transformers}/giftCard.d.ts +0 -0
  96. /package/dist/api/{transformers → api/transformers}/index.d.ts +0 -0
  97. /package/dist/api/{transformers → api/transformers}/order.d.ts +0 -0
  98. /package/dist/api/{transformers → api/transformers}/performer.d.ts +0 -0
  99. /package/dist/api/{transformers → api/transformers}/series.d.ts +0 -0
  100. /package/dist/api/{transformers → api/transformers}/venue.d.ts +0 -0
  101. /package/dist/api/{venues.d.ts → api/venues.d.ts} +0 -0
  102. /package/dist/api/{waitlist.d.ts → api/waitlist.d.ts} +0 -0
@@ -1,438 +1,447 @@
1
- /**
2
- * API Types for MicDrop Public Checkout API
3
- *
4
- * These types define the shape of API requests and responses
5
- * for the public checkout flow (no authentication required).
6
- */
7
-
8
- import type { EventId, SeriesId } from '@getmicdrop/svelte-components';
9
-
10
- // ============================================================================
11
- // Payment & Orders
12
- // ============================================================================
13
-
14
- export interface PaymentIntentRequest {
15
- IP?: string;
16
- productQuantities: Record<string | number, number>;
17
- }
18
-
19
- export interface PaymentIntentResponse {
20
- client_secret: string;
21
- amount: number;
22
- amount_total: number;
23
- tax_amount_exclusive?: number;
24
- service_fee?: number;
25
- discount?: number;
26
- gift_card_amount?: number;
27
- gift_card_code?: string;
28
- stripe_publishable_key?: string;
29
- }
30
-
31
- export interface CompleteReservationResponse {
32
- success: boolean;
33
- message?: string;
34
- error?: string;
35
- }
36
-
37
- export interface CancelReservationResponse {
38
- success: boolean;
39
- message?: string;
40
- error?: string;
41
- }
42
-
43
- export interface CreateOrderRequest {
44
- eventId: string | number;
45
- promoCode?: string;
46
- }
47
-
48
- export interface CreateOrderResponse {
49
- uuid: string;
50
- }
51
-
52
- export interface ValidatePaymentRequest {
53
- id: string;
54
- paymentIntentId: string;
55
- tickets: Record<string | number, number>;
56
- firstName: string;
57
- lastName: string;
58
- email: string;
59
- paymentMethod: string;
60
- mailingList?: boolean;
61
- saleType?: string;
62
- attendees?: AttendeeInfo[];
63
- }
64
-
65
- export interface AttendeeInfo {
66
- ticketId: string | number;
67
- firstName: string;
68
- lastName: string;
69
- email: string;
70
- }
71
-
72
- export interface ValidatePaymentResponse {
73
- success: boolean;
74
- status: string;
75
- orderUUID?: string;
76
- error?: string;
77
- /**
78
- * Fail-closed FLOOR fields. When the event is canceled/postponed between
79
- * cart-creation and finalize, the backend gate refuses to capture the charge
80
- * and sets one of these (alongside `success: false`). Either flag means the
81
- * buyer was NOT charged; the checkout raises the charge-aware
82
- * EventUnavailableModal instead of navigating to success. Optional because
83
- * they are only present on the rejected-finalize path.
84
- */
85
- eventCanceled?: boolean;
86
- eventPostponed?: boolean;
87
- }
88
-
89
- // ============================================================================
90
- // Session Management
91
- // ============================================================================
92
-
93
- export interface ExtendSessionRequest {
94
- orderUuid: string;
95
- }
96
-
97
- export interface ExtendSessionResponse {
98
- success: boolean;
99
- newExpiryTime?: string;
100
- remainingExtensions?: number;
101
- error?: string;
102
- /**
103
- * HTTP status code from the backend on failure. Populated on non-OK
104
- * responses so callers can distinguish "session already expired"
105
- * (typically 410 Gone) from "max extensions reached" or generic 5xx.
106
- * Undefined on network errors and on success.
107
- */
108
- statusCode?: number;
109
- }
110
-
111
- export interface SessionStatus {
112
- expiresAt?: string;
113
- extensionCount?: number;
114
- remainingExtensions?: number;
115
- canExtend?: boolean;
116
- reservationCount?: number;
117
- error?: string;
118
- // 404 from /orders/session/{uuid}: the cart's reservations are
119
- // gone (expired or never existed). Callers polling on an interval
120
- // MUST treat this as terminal and stop — see CartView.svelte.
121
- notFound?: boolean;
122
- // Live event status piggybacked on the session heartbeat so the public
123
- // checkout can flip the buy button the moment an operator cancels/postpones,
124
- // without a dedicated poll or socket. One of the auth-service Event statuses
125
- // (draft|live|started|ended|canceled|postponed). Absent if the lookup failed.
126
- eventStatus?: string;
127
- }
128
-
129
- // ============================================================================
130
- // Promo Codes
131
- // ============================================================================
132
-
133
- export interface PromoValidationResponse {
134
- valid: boolean;
135
- revealHiddenTickets?: boolean;
136
- revealTicketIds?: number[];
137
- provideDiscount?: boolean;
138
- discountType?: 'percentage' | 'fixed';
139
- amount?: number;
140
- code?: string;
141
- error?: string;
142
- }
143
-
144
- export interface HasPromoCodesResponse {
145
- hasPromoCodes: boolean;
146
- }
147
-
148
- // ============================================================================
149
- // Orders
150
- // ============================================================================
151
-
152
- export interface Order {
153
- uuid: string;
154
- id?: number;
155
- customerEmail: string;
156
- customerFirstName?: string;
157
- customerLastName?: string;
158
- status: string;
159
- totalAmount: number;
160
- subtotal?: number;
161
- serviceFeesAmount: number;
162
- taxAmount: number;
163
- discount?: number;
164
- paymentIntentId?: string;
165
- paymentMethod?: string;
166
- purchasedTickets: PurchasedTicket[];
167
- createdAt?: string;
168
- updatedAt?: string;
169
- }
170
-
171
- export interface PurchasedTicket {
172
- uuid: string;
173
- id?: number;
174
- ticketNumber?: string;
175
- orderId?: string | number;
176
- attendeeFirstName?: string;
177
- attendeeLastName?: string;
178
- attendeeEmail?: string;
179
- ticketName: string;
180
- ticketTypeId?: number;
181
- purchasePrice: number;
182
- status?: string;
183
- checkedIn?: boolean;
184
- checkedInAt?: string;
185
- }
186
-
187
- // ============================================================================
188
- // Events
189
- // ============================================================================
190
-
191
- export interface Event {
192
- eventID: number;
193
- id?: number;
194
- name: string;
195
- title?: string;
196
- slug?: string;
197
- description?: string;
198
- date: string;
199
- startDateTime?: string;
200
- endDateTime?: string;
201
- doorsOpenTime?: string;
202
- timezone?: string;
203
- venueId?: number;
204
- venueName?: string;
205
- venueAddress?: string;
206
- location?: string;
207
- imageUrl?: string;
208
- imageURL?: string;
209
- status?: string;
210
- isPublished?: boolean;
211
- isCancelled?: boolean;
212
- availableTickets?: AvailableTicket[];
213
- ticketsAvailable?: number;
214
- ticketsSold?: number;
215
- minPrice?: number;
216
- maxPrice?: number;
217
- ctaText?: string;
218
- ctaState?: 'available' | 'sold_out' | 'coming_soon' | 'ended';
219
- showPerformers?: boolean;
220
- eventSeriesId?: number;
221
- seriesInstanceNumber?: number;
222
- // ── Passthrough seams (events convergence) ─────────────────────────────
223
- // Carried verbatim from the wire by parseEvent so view-shape projections
224
- // (utils/event-transform.js, public-calendar-flow/transform.ts) compose the
225
- // canonical instead of reading wire fields directly. The object-valued
226
- // fields are intentionally raw (see composition note in
227
- // api/transformers/event.ts) their consumers own the wire variance.
228
- timeZone?: string;
229
- eventSummary?: string;
230
- password?: string;
231
- hasPassword?: boolean;
232
- disclaimer?: string;
233
- ticketType?: number;
234
- eventTicketingType?: number;
235
- ageRestriction?: number;
236
- displayAgeRestriction?: boolean;
237
- displayStartTime?: boolean;
238
- displayEndTime?: boolean;
239
- displayDoorsTime?: boolean;
240
- collectionId?: number;
241
- ticketsRemaining?: number;
242
- ticketsTotal?: number;
243
- hasHiddenTickets?: boolean;
244
- stage?: { name?: string } | null;
245
- stageName?: string;
246
- // Widget-filter dimensions on the public month feeds (saved-widget engine):
247
- // stage/category/performer/collection data the embed adapts onto the SC
248
- // FilterableEvent view (lib/widget-filters.js).
249
- stageId?: number;
250
- eventCategoryTypes?: number[] | null;
251
- publicPerformers?: Array<{
252
- id?: number;
253
- displayName?: string;
254
- image?: string;
255
- }> | null;
256
- collectionIds?: number[] | null;
257
- venue?: Record<string, any>;
258
- performers?: Record<string, any>[];
259
- faqs?: Record<string, any>[];
260
- showtimes?: Record<string, any>[];
261
- purchasedTickets?: Record<string, any>[];
262
- }
263
-
264
- export interface AvailableTicket {
265
- id: number;
266
- name: string;
267
- description?: string;
268
- price: number;
269
- quantity: number;
270
- quantitySold?: number;
271
- quantityAvailable?: number;
272
- minPerOrder?: number;
273
- maxPerOrder?: number;
274
- saleStartDate?: string;
275
- saleEndDate?: string;
276
- isHidden?: boolean;
277
- revealWithPromoCode?: boolean;
278
- ticketType?: number; // 0 = GA, 1 = assigned
279
- sectionId?: number;
280
- sortOrder?: number;
281
- }
282
-
283
- export interface EventPerformersResponse {
284
- performers: Performer[];
285
- showPerformers: boolean;
286
- }
287
-
288
- export interface Performer {
289
- id: number;
290
- displayName: string;
291
- avatar?: string;
292
- order?: number;
293
- }
294
-
295
- // ============================================================================
296
- // Venues
297
- // ============================================================================
298
-
299
- export interface Venue {
300
- id: number;
301
- name: string;
302
- slug?: string;
303
- address?: string;
304
- googleLocationNameCache?: string;
305
- city?: string;
306
- state?: string;
307
- zipCode?: string;
308
- country?: string;
309
- timezone?: string;
310
- logoUrl?: string;
311
- serviceFeePercentage?: number;
312
- serviceFeeCents?: number;
313
- taxPercentage?: number;
314
- organizationId?: number;
315
- }
316
-
317
- // ============================================================================
318
- // Series
319
- // ============================================================================
320
-
321
- export interface SeriesOccurrence {
322
- eventId: EventId;
323
- date: string;
324
- startDateTime: string;
325
- endDateTime?: string;
326
- instanceNumber: number;
327
- status: string;
328
- ticketsAvailable?: number;
329
- ctaState?: string;
330
- }
331
-
332
- export interface SeriesOccurrencesResponse {
333
- seriesId: SeriesId;
334
- occurrences: SeriesOccurrence[];
335
- }
336
-
337
- // ============================================================================
338
- // Series Page
339
- // ============================================================================
340
-
341
- export interface SeriesPageData {
342
- id: number;
343
- title: string;
344
- description: string;
345
- eventSummary?: string;
346
- image?: string;
347
- timeZone: string;
348
- venue: {
349
- id: number;
350
- name: string;
351
- location?: string;
352
- googleLocationNameCache?: string;
353
- faq?: Array<{ question: string; answer: string }> | string;
354
- disclaimer?: string;
355
- };
356
- performers: Array<{
357
- displayName: string;
358
- firstName?: string;
359
- lastName?: string;
360
- profileImage?: string;
361
- }>;
362
- occurrences: Array<{
363
- id: number;
364
- slug: string;
365
- startDateTime: string;
366
- endDateTime: string;
367
- ctaState: {
368
- text: string;
369
- disabled: boolean;
370
- reason?: string;
371
- };
372
- }>;
373
- }
374
-
375
- // ============================================================================
376
- // Entity resolution (type-agnostic public id → concrete entity)
377
- // ============================================================================
378
-
379
- /**
380
- * Response shape of `/api/v2/public/resolve/{id}`. The embed deep-link is
381
- * type-agnostic (`#{id}-{slug}`), so the backend resolves which kind of entity
382
- * the id points at; `data` is the corresponding event / series / collection
383
- * payload (same shape the dedicated fetchers return for that type).
384
- */
385
- export interface ResolvedEntity {
386
- type: 'event' | 'series' | 'collection';
387
- id: string | number;
388
- title?: string;
389
- data: any;
390
- }
391
-
392
- // ============================================================================
393
- // Public Collection
394
- // ============================================================================
395
-
396
- export interface PublicCollectionData {
397
- id: number;
398
- collectionTitle: string;
399
- summary?: string;
400
- description?: string;
401
- coverImage?: string;
402
- events: Array<{
403
- id: number;
404
- title: string;
405
- slug?: string;
406
- startDateTime?: string;
407
- endDateTime?: string;
408
- image?: string;
409
- status?: string;
410
- venue?: { name: string };
411
- minPrice?: number;
412
- }>;
413
- }
414
-
415
- // ============================================================================
416
- // API Configuration
417
- // ============================================================================
418
-
419
- export interface ApiConfig {
420
- baseUrl?: string;
421
- timeout?: number;
422
- /** Number of additional attempts after the first try (default: 2 = 3 total tries). */
423
- retries?: number;
424
- /** Base delay before the first retry; doubles each attempt (default: 500ms). */
425
- retryDelay?: number;
426
- onError?: (_error: Error) => void;
427
- }
428
-
429
- // ============================================================================
430
- // Generic API Response
431
- // ============================================================================
432
-
433
- export interface ApiResponse<T> {
434
- success: boolean;
435
- data?: T;
436
- error?: string;
437
- statusCode?: number;
438
- }
1
+ /**
2
+ * API Types for MicDrop Public Checkout API
3
+ *
4
+ * These types define the shape of API requests and responses
5
+ * for the public checkout flow (no authentication required).
6
+ */
7
+
8
+ import type { EventId, SeriesId } from '@getmicdrop/svelte-components';
9
+
10
+ // ============================================================================
11
+ // Payment & Orders
12
+ // ============================================================================
13
+
14
+ export interface PaymentIntentRequest {
15
+ IP?: string;
16
+ productQuantities: Record<string | number, number>;
17
+ }
18
+
19
+ export interface PaymentIntentResponse {
20
+ client_secret: string;
21
+ amount: number;
22
+ amount_total: number;
23
+ subtotal?: number;
24
+ tax_amount_exclusive?: number;
25
+ service_fee?: number;
26
+ discount?: number;
27
+ gift_card_amount?: number;
28
+ gift_card_code?: string;
29
+ stripe_publishable_key?: string;
30
+ // ISO-4217 currency (Stripe returns it lowercase). Feeds the checkout totals.
31
+ currency?: string;
32
+ }
33
+
34
+ export interface CompleteReservationResponse {
35
+ success: boolean;
36
+ message?: string;
37
+ error?: string;
38
+ }
39
+
40
+ export interface CancelReservationResponse {
41
+ success: boolean;
42
+ message?: string;
43
+ error?: string;
44
+ }
45
+
46
+ export interface CreateOrderRequest {
47
+ eventId: string | number;
48
+ promoCode?: string;
49
+ }
50
+
51
+ export interface CreateOrderResponse {
52
+ uuid: string;
53
+ }
54
+
55
+ export interface ValidatePaymentRequest {
56
+ id: string;
57
+ paymentIntentId: string;
58
+ tickets: Record<string | number, number>;
59
+ firstName: string;
60
+ lastName: string;
61
+ email: string;
62
+ paymentMethod: string;
63
+ mailingList?: boolean;
64
+ saleType?: string;
65
+ attendees?: AttendeeInfo[];
66
+ }
67
+
68
+ export interface AttendeeInfo {
69
+ ticketId: string | number;
70
+ firstName: string;
71
+ lastName: string;
72
+ email: string;
73
+ }
74
+
75
+ export interface ValidatePaymentResponse {
76
+ success: boolean;
77
+ status: string;
78
+ orderUUID?: string;
79
+ error?: string;
80
+ /**
81
+ * Fail-closed FLOOR fields. When the event is canceled/postponed between
82
+ * cart-creation and finalize, the backend gate refuses to capture the charge
83
+ * and sets one of these (alongside `success: false`). Either flag means the
84
+ * buyer was NOT charged; the checkout raises the charge-aware
85
+ * EventUnavailableModal instead of navigating to success. Optional because
86
+ * they are only present on the rejected-finalize path.
87
+ */
88
+ eventCanceled?: boolean;
89
+ eventPostponed?: boolean;
90
+ }
91
+
92
+ // ============================================================================
93
+ // Session Management
94
+ // ============================================================================
95
+
96
+ export interface ExtendSessionRequest {
97
+ orderUuid: string;
98
+ }
99
+
100
+ export interface ExtendSessionResponse {
101
+ success: boolean;
102
+ newExpiryTime?: string;
103
+ remainingExtensions?: number;
104
+ error?: string;
105
+ /**
106
+ * HTTP status code from the backend on failure. Populated on non-OK
107
+ * responses so callers can distinguish "session already expired"
108
+ * (typically 410 Gone) from "max extensions reached" or generic 5xx.
109
+ * Undefined on network errors and on success.
110
+ */
111
+ statusCode?: number;
112
+ }
113
+
114
+ export interface SessionStatus {
115
+ expiresAt?: string;
116
+ extensionCount?: number;
117
+ remainingExtensions?: number;
118
+ canExtend?: boolean;
119
+ reservationCount?: number;
120
+ error?: string;
121
+ // 404 from /orders/session/{uuid}: the cart's reservations are
122
+ // gone (expired or never existed). Callers polling on an interval
123
+ // MUST treat this as terminal and stop see CartView.svelte.
124
+ notFound?: boolean;
125
+ // Live event status piggybacked on the session heartbeat so the public
126
+ // checkout can flip the buy button the moment an operator cancels/postpones,
127
+ // without a dedicated poll or socket. One of the auth-service Event statuses
128
+ // (draft|live|started|ended|canceled|postponed). Absent if the lookup failed.
129
+ eventStatus?: string;
130
+ }
131
+
132
+ // ============================================================================
133
+ // Promo Codes
134
+ // ============================================================================
135
+
136
+ export interface PromoValidationResponse {
137
+ valid: boolean;
138
+ revealHiddenTickets?: boolean;
139
+ revealTicketIds?: number[];
140
+ provideDiscount?: boolean;
141
+ discountType?: 'percentage' | 'fixed';
142
+ amount?: number;
143
+ code?: string;
144
+ error?: string;
145
+ }
146
+
147
+ export interface HasPromoCodesResponse {
148
+ hasPromoCodes: boolean;
149
+ }
150
+
151
+ // ============================================================================
152
+ // Orders
153
+ // ============================================================================
154
+
155
+ export interface Order {
156
+ uuid: string;
157
+ id?: number;
158
+ customerEmail: string;
159
+ customerFirstName?: string;
160
+ customerLastName?: string;
161
+ status: string;
162
+ totalAmount: number;
163
+ subtotal?: number;
164
+ serviceFeesAmount: number;
165
+ taxAmount: number;
166
+ discount?: number;
167
+ paymentIntentId?: string;
168
+ paymentMethod?: string;
169
+ purchasedTickets: PurchasedTicket[];
170
+ createdAt?: string;
171
+ updatedAt?: string;
172
+ }
173
+
174
+ export interface PurchasedTicket {
175
+ uuid: string;
176
+ id?: number;
177
+ ticketNumber?: string;
178
+ orderId?: string | number;
179
+ attendeeFirstName?: string;
180
+ attendeeLastName?: string;
181
+ attendeeEmail?: string;
182
+ ticketName: string;
183
+ ticketTypeId?: number;
184
+ purchasePrice: number;
185
+ status?: string;
186
+ checkedIn?: boolean;
187
+ checkedInAt?: string;
188
+ }
189
+
190
+ // ============================================================================
191
+ // Events
192
+ // ============================================================================
193
+
194
+ export interface Event {
195
+ eventID: number;
196
+ id?: number;
197
+ name: string;
198
+ title?: string;
199
+ slug?: string;
200
+ description?: string;
201
+ date: string;
202
+ startDateTime?: string;
203
+ endDateTime?: string;
204
+ doorsOpenTime?: string;
205
+ timezone?: string;
206
+ venueId?: number;
207
+ venueName?: string;
208
+ venueAddress?: string;
209
+ location?: string;
210
+ imageUrl?: string;
211
+ imageURL?: string;
212
+ status?: string;
213
+ isPublished?: boolean;
214
+ isCancelled?: boolean;
215
+ availableTickets?: AvailableTicket[];
216
+ ticketsAvailable?: number;
217
+ ticketsSold?: number;
218
+ minPrice?: number;
219
+ maxPrice?: number;
220
+ ctaText?: string;
221
+ ctaState?: 'available' | 'sold_out' | 'coming_soon' | 'ended';
222
+ showPerformers?: boolean;
223
+ eventSeriesId?: number;
224
+ seriesInstanceNumber?: number;
225
+ // ── Passthrough seams (events convergence) ─────────────────────────────
226
+ // Carried verbatim from the wire by parseEvent so view-shape projections
227
+ // (utils/event-transform.js, public-calendar-flow/transform.ts) compose the
228
+ // canonical instead of reading wire fields directly. The object-valued
229
+ // fields are intentionally raw (see composition note in
230
+ // api/transformers/event.ts) — their consumers own the wire variance.
231
+ timeZone?: string;
232
+ eventSummary?: string;
233
+ password?: string;
234
+ hasPassword?: boolean;
235
+ disclaimer?: string;
236
+ ticketType?: number;
237
+ eventTicketingType?: number;
238
+ ageRestriction?: number;
239
+ displayAgeRestriction?: boolean;
240
+ displayStartTime?: boolean;
241
+ displayEndTime?: boolean;
242
+ displayDoorsTime?: boolean;
243
+ collectionId?: number;
244
+ ticketsRemaining?: number;
245
+ ticketsTotal?: number;
246
+ hasHiddenTickets?: boolean;
247
+ stage?: { name?: string } | null;
248
+ stageName?: string;
249
+ // Widget-filter dimensions on the public month feeds (saved-widget engine):
250
+ // stage/category/performer/collection data the embed adapts onto the SC
251
+ // FilterableEvent view (lib/widget-filters.js).
252
+ stageId?: number;
253
+ eventCategoryTypes?: number[] | null;
254
+ publicPerformers?: Array<{
255
+ id?: number;
256
+ displayName?: string;
257
+ image?: string;
258
+ }> | null;
259
+ collectionIds?: number[] | null;
260
+ venue?: Record<string, any>;
261
+ performers?: Record<string, any>[];
262
+ faqs?: Record<string, any>[];
263
+ showtimes?: Record<string, any>[];
264
+ purchasedTickets?: Record<string, any>[];
265
+ }
266
+
267
+ export interface AvailableTicket {
268
+ id: number;
269
+ name: string;
270
+ description?: string;
271
+ price: number;
272
+ quantity: number;
273
+ quantitySold?: number;
274
+ quantityAvailable?: number;
275
+ minPerOrder?: number;
276
+ maxPerOrder?: number;
277
+ saleStartDate?: string;
278
+ saleEndDate?: string;
279
+ isHidden?: boolean;
280
+ revealWithPromoCode?: boolean;
281
+ ticketType?: number; // 0 = GA, 1 = assigned
282
+ sectionId?: number;
283
+ sortOrder?: number;
284
+ }
285
+
286
+ export interface EventPerformersResponse {
287
+ performers: Performer[];
288
+ showPerformers: boolean;
289
+ }
290
+
291
+ export interface Performer {
292
+ id: number;
293
+ displayName: string;
294
+ avatar?: string;
295
+ order?: number;
296
+ }
297
+
298
+ // ============================================================================
299
+ // Venues
300
+ // ============================================================================
301
+
302
+ export interface Venue {
303
+ id: number;
304
+ name: string;
305
+ slug?: string;
306
+ address?: string;
307
+ googleLocationNameCache?: string;
308
+ city?: string;
309
+ state?: string;
310
+ zipCode?: string;
311
+ country?: string;
312
+ timezone?: string;
313
+ logoUrl?: string;
314
+ serviceFeePercentage?: number;
315
+ serviceFeeCents?: number;
316
+ taxPercentage?: number;
317
+ organizationId?: number;
318
+ }
319
+
320
+ // ============================================================================
321
+ // Series
322
+ // ============================================================================
323
+
324
+ export interface SeriesOccurrence {
325
+ eventId: EventId;
326
+ date: string;
327
+ startDateTime: string;
328
+ endDateTime?: string;
329
+ instanceNumber: number;
330
+ status: string;
331
+ ticketsAvailable?: number;
332
+ ctaState?: string;
333
+ }
334
+
335
+ export interface SeriesOccurrencesResponse {
336
+ seriesId: SeriesId;
337
+ occurrences: SeriesOccurrence[];
338
+ }
339
+
340
+ // ============================================================================
341
+ // Series Page
342
+ // ============================================================================
343
+
344
+ export interface SeriesPageData {
345
+ id: number;
346
+ title: string;
347
+ description: string;
348
+ eventSummary?: string;
349
+ image?: string;
350
+ timeZone: string;
351
+ venue: {
352
+ id: number;
353
+ name: string;
354
+ location?: string;
355
+ googleLocationNameCache?: string;
356
+ faq?: Array<{ question: string; answer: string }> | string;
357
+ disclaimer?: string;
358
+ };
359
+ performers: Array<{
360
+ displayName: string;
361
+ firstName?: string;
362
+ lastName?: string;
363
+ profileImage?: string;
364
+ }>;
365
+ occurrences: Array<{
366
+ id: number;
367
+ slug: string;
368
+ startDateTime: string;
369
+ endDateTime: string;
370
+ ctaState: {
371
+ text: string;
372
+ disabled: boolean;
373
+ reason?: string;
374
+ };
375
+ }>;
376
+ }
377
+
378
+ // ============================================================================
379
+ // Entity resolution (type-agnostic public id → concrete entity)
380
+ // ============================================================================
381
+
382
+ /**
383
+ * Response shape of `/api/v2/public/resolve/{id}`. The embed deep-link is
384
+ * type-agnostic (`#{id}-{slug}`), so the backend resolves which kind of entity
385
+ * the id points at; `data` is the corresponding event / series / collection
386
+ * payload (same shape the dedicated fetchers return for that type).
387
+ */
388
+ export interface ResolvedEntity {
389
+ type: 'event' | 'series' | 'collection';
390
+ id: string | number;
391
+ title?: string;
392
+ data: any;
393
+ }
394
+
395
+ // ============================================================================
396
+ // Public Collection
397
+ // ============================================================================
398
+
399
+ export interface PublicCollectionData {
400
+ id: number;
401
+ collectionTitle: string;
402
+ summary?: string;
403
+ description?: string;
404
+ coverImage?: string;
405
+ events: Array<{
406
+ id: number;
407
+ title: string;
408
+ slug?: string;
409
+ startDateTime?: string;
410
+ endDateTime?: string;
411
+ image?: string;
412
+ status?: string;
413
+ venue?: { name: string };
414
+ minPrice?: number;
415
+ }>;
416
+ // Password-gate variant: a protected collection responds with a gate signal
417
+ // instead of the collection body (either `passwordRequired: true` or an
418
+ // `error.code === 'PASSWORD_REQUIRED'`). Modelled here as optional wire
419
+ // fields so the view can read them without an `as any` escape.
420
+ passwordRequired?: boolean;
421
+ error?: { code?: string };
422
+ }
423
+
424
+ // ============================================================================
425
+ // API Configuration
426
+ // ============================================================================
427
+
428
+ export interface ApiConfig {
429
+ baseUrl?: string;
430
+ timeout?: number;
431
+ /** Number of additional attempts after the first try (default: 2 = 3 total tries). */
432
+ retries?: number;
433
+ /** Base delay before the first retry; doubles each attempt (default: 500ms). */
434
+ retryDelay?: number;
435
+ onError?: (_error: Error) => void;
436
+ }
437
+
438
+ // ============================================================================
439
+ // Generic API Response
440
+ // ============================================================================
441
+
442
+ export interface ApiResponse<T> {
443
+ success: boolean;
444
+ data?: T;
445
+ error?: string;
446
+ statusCode?: number;
447
+ }