@session-services/web-elements 0.1.30 → 0.1.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/session-services-elements.cjs.js +1 -1
- package/dist/cjs/session-services-ticketing.cjs.entry.js +1645 -22994
- package/dist/collection/components/session-services-ticketing/bot-detection.js +83 -0
- package/dist/collection/components/session-services-ticketing/bot-detection.test.js +74 -0
- package/dist/collection/components/session-services-ticketing/session-services-ticketing.css +164 -36
- package/dist/collection/components/session-services-ticketing/session-services-ticketing.js +697 -219
- package/dist/collection/components/session-services-ticketing/session-services-ticketing.logic.js +25 -4
- package/dist/collection/components/session-services-ticketing/session-services-ticketing.logic.test.js +19 -2
- package/dist/collection/components/session-services-ticketing/session-services-ticketing.test.js +540 -19
- package/dist/components/session-services-ticketing.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/session-services-elements.js +1 -1
- package/dist/esm/session-services-ticketing.entry.js +1645 -22994
- package/dist/session-services-elements/p-7a1b9685.entry.js +1 -0
- package/dist/session-services-elements/session-services-elements.esm.js +1 -1
- package/dist/types/components/session-services-ticketing/bot-detection.d.ts +13 -0
- package/dist/types/components/session-services-ticketing/bot-detection.test.d.ts +1 -0
- package/dist/types/components/session-services-ticketing/session-services-ticketing.d.ts +52 -5
- package/dist/types/components/session-services-ticketing/session-services-ticketing.logic.d.ts +8 -1
- package/package.json +2 -2
- package/dist/session-services-elements/p-4dd3f723.entry.js +0 -1
package/dist/collection/components/session-services-ticketing/session-services-ticketing.logic.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isNaiveDateTimeFuture, isNaiveDateTimePast, parseNaiveDateTime, } from "@session-services/utils/naive-datetime";
|
|
2
2
|
import { getAdmissionReleaseLabel } from "@session-services/utils/admission-release";
|
|
3
3
|
import { getAdmissionSelectionCapacity, isAdmissionSoldOut, } from "@session-services/utils/ticket-availability";
|
|
4
4
|
import { createQuoteItemMap } from "@session-services/utils/ticket-quote";
|
|
5
5
|
const UNLIMITED_CAP = 10;
|
|
6
6
|
const SCARCITY_THRESHOLD = 20;
|
|
7
|
+
const DEFAULT_LOCALE = "en-US";
|
|
7
8
|
export function selectionKey(admissionId, sectionId) {
|
|
8
9
|
return `${admissionId}::${sectionId || "none"}`;
|
|
9
10
|
}
|
|
@@ -65,15 +66,35 @@ function hasPurchasableAdmissions(event) {
|
|
|
65
66
|
const zone = eventTimeZone(event);
|
|
66
67
|
return event.admissions.some((admission) => isAdmissionPurchasable(admission, event.admissions, zone, sections));
|
|
67
68
|
}
|
|
68
|
-
function admissionSaleLabel(admission, zone) {
|
|
69
|
+
function admissionSaleLabel(admission, zone, locale) {
|
|
69
70
|
if (!isNaiveDateTimeFuture(admission.saleStartsAt, zone)) {
|
|
70
71
|
return null;
|
|
71
72
|
}
|
|
73
|
+
const date = parseNaiveDateTime(admission.saleStartsAt, "UTC");
|
|
74
|
+
const day = dateFormatter(locale, {
|
|
75
|
+
day: "numeric",
|
|
76
|
+
month: "short",
|
|
77
|
+
timeZone: "UTC",
|
|
78
|
+
weekday: "short",
|
|
79
|
+
}).format(date);
|
|
80
|
+
const time = dateFormatter(locale, {
|
|
81
|
+
hour: "numeric",
|
|
82
|
+
minute: "2-digit",
|
|
83
|
+
timeZone: "UTC",
|
|
84
|
+
}).format(date);
|
|
72
85
|
return {
|
|
73
|
-
text: `On sale ${
|
|
86
|
+
text: `On sale ${day} · ${time}`,
|
|
74
87
|
tone: "muted",
|
|
75
88
|
};
|
|
76
89
|
}
|
|
90
|
+
function dateFormatter(locale, options) {
|
|
91
|
+
try {
|
|
92
|
+
return new Intl.DateTimeFormat(locale, options);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return new Intl.DateTimeFormat(DEFAULT_LOCALE, options);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
77
98
|
function admissionStatus(input) {
|
|
78
99
|
if (input.value === "DOOR" && (input.soldOut || input.saleEnded)) {
|
|
79
100
|
return { text: "Available At Door", tone: "success" };
|
|
@@ -287,7 +308,7 @@ export function getAdmissionDisplayState(input) {
|
|
|
287
308
|
disabled: disabled || Boolean(releaseLabel),
|
|
288
309
|
label: releaseLabel
|
|
289
310
|
? { ...releaseLabel, tone: "muted" }
|
|
290
|
-
: admissionSaleLabel(input.admission, zone),
|
|
311
|
+
: admissionSaleLabel(input.admission, zone, input.locale ?? DEFAULT_LOCALE),
|
|
291
312
|
maxQuantity: maxQuantity(input.admission, input.section),
|
|
292
313
|
postSale: saleEnded,
|
|
293
314
|
showScarcity: showScarcity(input.admission, soldOut, disabled),
|
|
@@ -162,7 +162,7 @@ describe("session-services-ticketing logic", () => {
|
|
|
162
162
|
"adm_door",
|
|
163
163
|
]);
|
|
164
164
|
});
|
|
165
|
-
it("
|
|
165
|
+
it("formats future sale labels in the default en-US locale", () => {
|
|
166
166
|
const data = event({
|
|
167
167
|
admissions: [
|
|
168
168
|
admission({
|
|
@@ -176,7 +176,24 @@ describe("session-services-ticketing logic", () => {
|
|
|
176
176
|
event: data,
|
|
177
177
|
});
|
|
178
178
|
expect(state.disabled).toBe(true);
|
|
179
|
-
expect(state.label?.text).
|
|
179
|
+
expect(state.label?.text).toBe("On sale Tue, Jan 1 · 8:00 PM");
|
|
180
|
+
});
|
|
181
|
+
it("formats future sale labels in the requested locale", () => {
|
|
182
|
+
const data = event({
|
|
183
|
+
admissions: [
|
|
184
|
+
admission({
|
|
185
|
+
saleStartsAt: futureStart,
|
|
186
|
+
saleEndsAt: "2030-01-02T20:00:00",
|
|
187
|
+
}),
|
|
188
|
+
],
|
|
189
|
+
});
|
|
190
|
+
const state = getAdmissionDisplayState({
|
|
191
|
+
admission: data.admissions[0],
|
|
192
|
+
event: data,
|
|
193
|
+
locale: "fr-FR",
|
|
194
|
+
});
|
|
195
|
+
expect(state.disabled).toBe(true);
|
|
196
|
+
expect(state.label?.text).toBe("On sale mar. 1 janv. · 20:00");
|
|
180
197
|
});
|
|
181
198
|
it("disables dependent releases until the previous release ends", () => {
|
|
182
199
|
const first = admission({
|