UNPKG

kinoklub-api

Version:

Support library for KinoKlub

98 lines (97 loc) 4.27 kB
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