kinoklub-api
Version:
Support library for KinoKlub
98 lines (97 loc) • 4.27 kB
JavaScript
import { Temporal } from "@js-temporal/polyfill";
//#region src/helpers/global.helper.ts
const PRAGUE_TIME_ZONE = "Europe/Prague";
const addLeadingZero = (num) => {
return num < 10 ? `0${num}` : `${num}`;
};
const parseHour = (hour) => {
const [hourPart, minutePart] = hour.split(":");
const hourValue = Number(hourPart);
const minuteValue = Number(minutePart);
if (!Number.isInteger(hourValue) || !Number.isInteger(minuteValue)) throw new Error(`Invalid hour value: ${hour}`);
return {
hourValue,
minuteValue
};
};
const toDateOnlyString = (date) => {
return `${date.year}-${addLeadingZero(date.month)}-${addLeadingZero(date.day)}`;
};
const toPragueZoned = (localDateTime, disambiguation) => {
return Temporal.ZonedDateTime.from({
timeZone: PRAGUE_TIME_ZONE,
year: localDateTime.year,
month: localDateTime.month,
day: localDateTime.day,
hour: localDateTime.hour,
minute: localDateTime.minute,
second: localDateTime.second,
millisecond: localDateTime.millisecond,
microsecond: localDateTime.microsecond,
nanosecond: localDateTime.nanosecond
}, { disambiguation });
};
const resolvePragueLocalDateTime = (localDate, hour) => {
const [yearPart, monthPart, dayPart] = localDate.split("-").map((value) => Number(value));
const { hourValue, minuteValue } = parseHour(hour);
const requestedLocalDateTime = new Temporal.PlainDateTime(yearPart, monthPart, dayPart, hourValue, minuteValue, 0, 0, 0, 0);
const earlier = toPragueZoned(requestedLocalDateTime, "earlier");
const later = toPragueZoned(requestedLocalDateTime, "later");
const earlierLocal = earlier.toPlainDateTime();
const laterLocal = later.toPlainDateTime();
const isEarlierExact = Temporal.PlainDateTime.compare(earlierLocal, requestedLocalDateTime) === 0;
const isLaterExact = Temporal.PlainDateTime.compare(laterLocal, requestedLocalDateTime) === 0;
const hasTwoInstants = earlier.epochMilliseconds !== later.epochMilliseconds;
if (isEarlierExact && isLaterExact && hasTwoInstants) {
console.warn(`[resolveDate] Ambiguous Prague local time ${localDate}T${hour}:00. Using earlier instant.`);
return new Date(earlier.epochMilliseconds).toISOString();
}
if (!isEarlierExact && !isLaterExact) {
console.warn(`[resolveDate] Non-existent Prague local time ${localDate}T${hour}:00. Using later valid instant ${laterLocal.toString()}.`);
return new Date(later.epochMilliseconds).toISOString();
}
const resolved = toPragueZoned(requestedLocalDateTime, "compatible");
return new Date(resolved.epochMilliseconds).toISOString();
};
const resolveCinema = (text) => {
switch (text) {
case "Bio Oko": return "biooko";
case "Světozor": return "svetozor";
case "Aero": return "aero";
case "Lucerna": return "lucerna";
case "Přítomnost": return "pritomnost";
case "Bio Central": return "biocentral";
case "Scala": return "scala";
default: return text;
}
};
const resolveDate = (date, hour) => {
const [wkDay, dayRest] = date.split(" ");
const weekDay = wkDay;
let dateOnly;
const today = /* @__PURE__ */ new Date();
const pragueToday = Temporal.Now.zonedDateTimeISO(PRAGUE_TIME_ZONE).toPlainDate();
if (weekDay === "Dnes" || weekDay === "Today") dateOnly = toDateOnlyString(pragueToday);
else if (weekDay === "Zítra" || weekDay === "Tomorrow") dateOnly = toDateOnlyString(pragueToday.add({ days: 1 }));
else {
const [day, month] = dayRest.split("/");
dateOnly = `${today.getFullYear()}-${addLeadingZero(+month)}-${addLeadingZero(+day)}`;
}
return resolvePragueLocalDateTime(dateOnly, hour);
};
const getTicketParams = (el) => {
const node = el.querySelector("form");
if (!node) return void 0;
return {
action: node?.attributes.action,
mrsId: node.querySelector("input[name=mrsid]")?.attributes.value,
eventId: node.querySelector("input[name=eventid]")?.attributes.value,
successRedirect: node.querySelector("input[name=successredirect]")?.attributes.value,
failedRedirect: node.querySelector("input[name=failedredirect]")?.attributes.value,
redirectAddTickets: node.querySelector("input[name=redirectaddtickets]")?.attributes.value,
language: node.querySelector("input[name=language]")?.attributes.value
};
};
//#endregion
export { getTicketParams, resolveCinema, resolveDate };
//# sourceMappingURL=global.helper.js.map