helpers.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import { useClassVersionStore } from "./stores/ClassVersion";
  2. import { useClassesStore } from "./stores/classes";
  3. import {
  4. HistoricClassEntry,
  5. Module,
  6. SemesterVersion,
  7. TaughtClass,
  8. } from "./types";
  9. export function toTime(t: number): string {
  10. const hours = Math.floor(t / 3600);
  11. const minutes = (t - 3600 * hours) / 60;
  12. return `${String(hours).padStart(2, "0")}:${String(minutes).padStart(
  13. 2,
  14. "0"
  15. )}`;
  16. }
  17. export function fromTime(t: string): number {
  18. const spl = t.split(":");
  19. const hours = Number.parseInt(spl[0]);
  20. const minutes = Number.parseInt(spl[1]);
  21. return hours * 3600 + minutes * 60;
  22. }
  23. export function copyToClipboard(text: string) {
  24. if (!navigator.clipboard) {
  25. return null;
  26. }
  27. return navigator.clipboard.writeText(text);
  28. }
  29. export const dayMap: Record<number, string> = {
  30. 0: "Mo",
  31. 1: "Di",
  32. 2: "Mi",
  33. 3: "Do",
  34. 4: "Fr",
  35. 5: "Sa",
  36. };
  37. export const waitTimeAfterUpgradeRequestModal = 3600000; // 1 Hour
  38. export const waitTimeAfterOldPlanReminder = 7 * 24 * 3600000; // 1 Week
  39. export function openURLInNewWindow(url: string) {
  40. window.open(
  41. url,
  42. "_blank",
  43. "resizable=yes, scrollbars=yes, titlebar=yes, width=800, height=600"
  44. );
  45. }
  46. export const bbClassRe = /bb\d?$/;
  47. export const firstPhaseClassRe = /(?:bb\d?$|^\dK)/;
  48. export const englishClassRe = /(?:eng|KE[a-z])$/;
  49. export const contextClassRe = /^\dK/;
  50. export function classesPDFLink(
  51. cls: TaughtClass | HistoricClassEntry,
  52. semester: string | null = null,
  53. version: string | null = null
  54. ): string {
  55. let semesterFolder;
  56. let semVerFolder;
  57. if (semester == null || version == null) {
  58. const versionStore = useClassVersionStore();
  59. semesterFolder = versionStore.semesterFolder;
  60. semVerFolder = versionStore.semVerFolder;
  61. } else {
  62. semesterFolder = getSemesterFolder(semester);
  63. semVerFolder = getSemVerFolder(semester, version);
  64. }
  65. if (cls.weekday === null) {
  66. const cs = useClassesStore();
  67. const file = cs.currentData?.config.blockclass_file ?? "block.pdf";
  68. return `${semesterFolder}/${file}#page=${cls.pages[0]}`;
  69. }
  70. return `${semVerFolder}/klassen.pdf#page=${cls.pages[0]}`;
  71. }
  72. export function getSemesterFolder(semester: string): string {
  73. return `./data/${semester}`;
  74. }
  75. export function getSemVerFolder(semester: string, version: string): string {
  76. return `${getSemesterFolder(semester)}/${version}`;
  77. }
  78. export function addRemoveClassTitle(
  79. module: Module | null,
  80. isChosen: boolean
  81. ): string {
  82. if (module?.hasCompleted) return "Modul bereits bestanden";
  83. if (module?.maxAttemptsReached)
  84. return `Du hast dieses Modul bereits ${module.attemptCount} Mal versucht!`;
  85. if (isChosen) return "Von der Planung entfernen";
  86. return "Zur Planung hinzufügen";
  87. }
  88. export function rowStyling(mod: Module | null, defaultColour = ""): string {
  89. if (mod == null) return defaultColour;
  90. if (mod.hasCompleted) return "dark:bg-emerald-900 bg-emerald-100";
  91. if (mod.isActive) return "dark:bg-blue-900 bg-blue-100";
  92. if (mod.hasFailed) return "dark:bg-orange-900 bg-orange-100";
  93. return defaultColour;
  94. }
  95. // eslint-disable-next-line
  96. export function matchesOneOf(list1: any[], list2: any[]): boolean {
  97. if (list1.length == 0 || list2.length == 0) return false;
  98. return !list1.every((e1) => {
  99. return !list2.includes(e1);
  100. });
  101. }
  102. export const MAX_ATTEMPT_COUNT = 2;
  103. export const MinFullNameSearchLength = 4;
  104. /**
  105. * Parses version strings into [Semester, Version] from two formats:
  106. * - "einschreiben / FS_23_einschr_2"
  107. * - "23HS|einschr_2"
  108. *
  109. * @param versionStr The version string that should be parsed
  110. * @returns {Semester, Version}
  111. */
  112. export function parsePDFVersion(versionStr: string | null): {
  113. semester: string | null;
  114. version: string | null;
  115. } {
  116. if (versionStr == null) return { semester: null, version: null };
  117. const extractReInternal = /(.*)\|(.*)/;
  118. const extractRePdf = /\/ (HS|FS)_(\d{2})_(.*)/;
  119. const resInt = versionStr.match(extractReInternal);
  120. if (resInt != null) {
  121. const semester = resInt[1];
  122. const version = resInt[2];
  123. return { semester, version };
  124. }
  125. const res = versionStr.match(extractRePdf);
  126. if (res == null) return { semester: null, version: null };
  127. const semester = res[2] + res[1];
  128. const version = res[3];
  129. return { semester, version };
  130. }
  131. export function samePDFVersion(
  132. vers1: string | null,
  133. vers2: string | null
  134. ): boolean {
  135. const parsed1 = parsePDFVersion(vers1);
  136. const parsed2 = parsePDFVersion(vers2);
  137. return (
  138. parsed1.semester == parsed2.semester && parsed1.version == parsed2.version
  139. );
  140. }
  141. export function semesterVersionString(
  142. semester: string,
  143. version: string
  144. ): string {
  145. return `${semester}|${version}`;
  146. }
  147. export function semesterVersionStringC(
  148. semVer: SemesterVersion | null,
  149. versionIdx = 0
  150. ): string | null {
  151. if (semVer == null) return null;
  152. return `${semVer.semester}|${semVer.versions[versionIdx]}`;
  153. }