schoolbox web extension :)
1import { Plugin } from "@/utils/plugin";
2import type { Toggle } from "@/utils/storage";
3import type { StorageState } from "@/utils/storage/state.svelte";
4import menu from "./Menu.svelte?url";
5
6const ID = "tabTitle";
7let originalTitle: string | null = null;
8
9export type Settings = {
10 showSubjectPrefix: StorageState<Toggle>;
11};
12
13export default new Plugin<Settings>(
14 {
15 id: ID,
16 name: "Better Tab Titles",
17 description: "Improves the tab titles for easier navigation.",
18 },
19 true,
20 {
21 config: {
22 showSubjectPrefix: { toggle: true },
23 },
24 menu,
25 },
26 async (settings) => {
27 // if already injected, abort
28 if (originalTitle) return;
29
30 // backup original title (used for uninjection)
31 originalTitle = document.title;
32
33 const path = window.location.pathname;
34 const titleMap: { [key: string]: string } = {
35 "/": "Homepage",
36 "/calendar": "Calendar",
37 "/news": "News",
38 "/learning/classes": "Classes",
39 "/resources": "Resources",
40 "/groups": "Groups",
41 "/settings/notifications": "Notifications Settings",
42 "/mail/create": "Compose Email",
43 "/feedback": "Support and Feedback",
44 "/policy": "Guidelines of Use and Privacy Policy",
45 };
46
47 if (titleMap[path]) {
48 document.title = titleMap[path];
49 } else if (path.includes("/timetable")) {
50 document.title = "Timetable";
51 } else if (path.includes("/calendar")) {
52 document.title = "Calendar";
53 } else if (path.includes("/grades/")) {
54 document.title = "Grades";
55 } else if (path.includes("/news/")) {
56 document.title = `News (${document.getElementsByTagName("h1")[0].innerText})`;
57 } else if (path.includes("/assessments/")) {
58 document.title = `Assessments - ${document.getElementsByTagName("h1")[0].innerText})`;
59 } else if (path.includes("/mail/create")) {
60 document.title = "Compose Email";
61 } else if (path.includes("/search/user")) {
62 document.title = `Profile - ${document.getElementsByTagName("h1")[0].innerText}`;
63 } else if (path.includes("/learning/due/")) {
64 document.title = "Due Work";
65 } else if (path.includes("/homepage/")) {
66 if (!(await settings.showSubjectPrefix.get()).toggle) {
67 document.title = document.getElementsByTagName("h1")[0].innerText.replace(/^.*- /, "");
68 } else {
69 document.title = document.getElementsByTagName("h1")[0].innerText;
70 }
71 }
72 },
73 () => {
74 // if not injected, abort
75 if (!originalTitle) return;
76
77 document.title = originalTitle;
78 originalTitle = null;
79 },
80 ["h1"],
81);