import { useClassVersionStore } from "./stores/ClassVersion"; import { useClassesStore } from "./stores/classes"; import { HistoricClassEntry, Module, SemesterVersion, TaughtClass, } from "./types"; export function toTime(t: number): string { const hours = Math.floor(t / 3600); const minutes = (t - 3600 * hours) / 60; return `${String(hours).padStart(2, "0")}:${String(minutes).padStart( 2, "0" )}`; } export function fromTime(t: string): number { const spl = t.split(":"); const hours = Number.parseInt(spl[0]); const minutes = Number.parseInt(spl[1]); return hours * 3600 + minutes * 60; } export function copyToClipboard(text: string) { if (!navigator.clipboard) { return null; } return navigator.clipboard.writeText(text); } export const dayMap: Record = { 0: "Mo", 1: "Di", 2: "Mi", 3: "Do", 4: "Fr", 5: "Sa", }; export const waitTimeAfterUpgradeRequestModal = 3600000; // 1 Hour export const waitTimeAfterOldPlanReminder = 7 * 24 * 3600000; // 1 Week export function openURLInNewWindow(url: string) { window.open( url, "_blank", "resizable=yes, scrollbars=yes, titlebar=yes, width=800, height=600" ); } export const bbClassRe = /bb\d?$/; export const firstPhaseClassRe = /(?:bb\d?$|^\dK)/; export const englishClassRe = /(?:eng|KE[a-z])$/; export const contextClassRe = /^\dK/; export function classesPDFLink( cls: TaughtClass | HistoricClassEntry, semester: string | null = null, version: string | null = null ): string { let semesterFolder; let semVerFolder; if (semester == null || version == null) { const versionStore = useClassVersionStore(); semesterFolder = versionStore.semesterFolder; semVerFolder = versionStore.semVerFolder; } else { semesterFolder = getSemesterFolder(semester); semVerFolder = getSemVerFolder(semester, version); } if (cls.weekday === null) { const cs = useClassesStore(); const file = cs.currentData?.config.blockclass_file ?? "block.pdf"; return `${semesterFolder}/${file}#page=${cls.pages[0]}`; } return `${semVerFolder}/klassen.pdf#page=${cls.pages[0]}`; } export function getSemesterFolder(semester: string): string { return `./data/${semester}`; } export function getSemVerFolder(semester: string, version: string): string { return `${getSemesterFolder(semester)}/${version}`; } export function addRemoveClassTitle( module: Module | null, isChosen: boolean ): string { if (module?.hasCompleted) return "Modul bereits bestanden"; if (module?.maxAttemptsReached) return `Du hast dieses Modul bereits ${module.attemptCount} Mal versucht!`; if (isChosen) return "Von der Planung entfernen"; return "Zur Planung hinzufügen"; } export function rowStyling(mod: Module | null, defaultColour = ""): string { if (mod == null) return defaultColour; if (mod.hasCompleted) return "dark:bg-emerald-900 bg-emerald-100"; if (mod.isActive) return "dark:bg-blue-900 bg-blue-100"; if (mod.hasFailed) return "dark:bg-orange-900 bg-orange-100"; return defaultColour; } // eslint-disable-next-line export function matchesOneOf(list1: any[], list2: any[]): boolean { if (list1.length == 0 || list2.length == 0) return false; return !list1.every((e1) => { return !list2.includes(e1); }); } export const MAX_ATTEMPT_COUNT = 2; export const MinFullNameSearchLength = 4; /** * Parses version strings into [Semester, Version] from two formats: * - "einschreiben / FS_23_einschr_2" * - "23HS|einschr_2" * * @param versionStr The version string that should be parsed * @returns {Semester, Version} */ export function parsePDFVersion(versionStr: string | null): { semester: string | null; version: string | null; } { if (versionStr == null) return { semester: null, version: null }; const extractReInternal = /(.*)\|(.*)/; const extractRePdf = /\/ (HS|FS)_(\d{2})_(.*)/; const resInt = versionStr.match(extractReInternal); if (resInt != null) { const semester = resInt[1]; const version = resInt[2]; return { semester, version }; } const res = versionStr.match(extractRePdf); if (res == null) return { semester: null, version: null }; const semester = res[2] + res[1]; const version = res[3]; return { semester, version }; } export function samePDFVersion( vers1: string | null, vers2: string | null ): boolean { const parsed1 = parsePDFVersion(vers1); const parsed2 = parsePDFVersion(vers2); return ( parsed1.semester == parsed2.semester && parsed1.version == parsed2.version ); } export function semesterVersionString( semester: string, version: string ): string { return `${semester}|${version}`; } export function semesterVersionStringC( semVer: SemesterVersion | null, versionIdx = 0 ): string | null { if (semVer == null) return null; return `${semVer.semester}|${semVer.versions[versionIdx]}`; }