fix: broken shortcut rendering logic #345

This commit is contained in:
SethBurkart123
2025-09-11 19:14:45 +10:00
parent 16b9610301
commit cdc8062275
8 changed files with 54 additions and 109 deletions
+12 -6
View File
@@ -23,13 +23,19 @@
}); });
}); });
const switchChange = (shortcut: any) => { const switchChange = (shortcut: any) => {
const value = $settingsState.shortcuts.find(s => s.name === shortcut); const idx = $settingsState.shortcuts.findIndex(s => s.name === shortcut);
if (value) { if (idx !== -1) {
value.enabled = !value.enabled; // Create a new array with the toggled value to ensure reactivity
settingsState.shortcuts = settingsState.shortcuts; const updated = settingsState.shortcuts.map(s =>
s.name === shortcut ? { ...s, enabled: !s.enabled } : s
);
settingsState.shortcuts = updated;
} else { } else {
settingsState.shortcuts = [...settingsState.shortcuts, { name: shortcut, enabled: true }]; settingsState.shortcuts = [
...settingsState.shortcuts,
{ name: shortcut, enabled: true }
];
} }
} }
+4 -1
View File
@@ -26,6 +26,9 @@ export function addShortcuts(shortcuts: any) {
function createNewShortcut(link: any, icon: any, viewBox: any, title: any) { function createNewShortcut(link: any, icon: any, viewBox: any, title: any) {
// Creates the stucture and element information for each seperate shortcut // Creates the stucture and element information for each seperate shortcut
const container = document.getElementById("shortcuts");
if (!container) return;
let shortcut = document.createElement("a"); let shortcut = document.createElement("a");
shortcut.setAttribute("href", link); shortcut.setAttribute("href", link);
shortcut.setAttribute("target", "_blank"); shortcut.setAttribute("target", "_blank");
@@ -42,5 +45,5 @@ function createNewShortcut(link: any, icon: any, viewBox: any, title: any) {
shortcutdiv.append(text); shortcutdiv.append(text);
shortcut.append(shortcutdiv); shortcut.append(shortcutdiv);
document.getElementById("shortcuts")!.appendChild(shortcut); container.appendChild(shortcut);
} }
@@ -2,6 +2,9 @@ import stringToHTML from "../stringToHTML";
export function CreateCustomShortcutDiv(element: any) { export function CreateCustomShortcutDiv(element: any) {
// Creates the stucture and element information for each seperate shortcut // Creates the stucture and element information for each seperate shortcut
const container = document.getElementById("shortcuts");
if (!container) return;
var shortcut = document.createElement("a"); var shortcut = document.createElement("a");
shortcut.setAttribute("href", element.url); shortcut.setAttribute("href", element.url);
shortcut.setAttribute("target", "_blank"); shortcut.setAttribute("target", "_blank");
@@ -45,5 +48,5 @@ export function CreateCustomShortcutDiv(element: any) {
shortcutdiv.append(text); shortcutdiv.append(text);
shortcut.append(shortcutdiv); shortcut.append(shortcutdiv);
document.getElementById("shortcuts")!.append(shortcut); container.append(shortcut);
} }
@@ -1,28 +0,0 @@
import links from "@/seqta/content/links.json";
export function RemoveShortcutDiv(elements: any) {
if (elements.length === 0) return;
elements.forEach((element: any) => {
const shortcuts = document.querySelectorAll(".shortcut");
shortcuts.forEach((shortcut) => {
const anchorElement = shortcut.parentElement; // the <a> element is the parent
const textElement = shortcut.querySelector("p"); // <p> is a direct child of .shortcut
const title = textElement ? textElement.textContent : "";
const elementName = links[element.name as keyof typeof links]?.DisplayName || element.name;
let shouldRemove = title === elementName;
// Check href only if element.url exists
if (element.url) {
shouldRemove =
shouldRemove && anchorElement!.getAttribute("href") === element.url;
}
if (shouldRemove) {
anchorElement!.remove();
}
});
});
}
+2 -17
View File
@@ -4,12 +4,11 @@ import LogoLight from "@/resources/icons/betterseqta-light-icon.png";
import assessmentsicon from "@/seqta/icons/assessmentsIcon"; import assessmentsicon from "@/seqta/icons/assessmentsIcon";
import coursesicon from "@/seqta/icons/coursesIcon"; import coursesicon from "@/seqta/icons/coursesIcon";
import { GetThresholdOfColor } from "@/seqta/ui/colors/getThresholdColour"; import { GetThresholdOfColor } from "@/seqta/ui/colors/getThresholdColour";
import { addShortcuts } from "../Adders/AddShortcuts";
import { convertTo12HourFormat } from "../convertTo12HourFormat"; import { convertTo12HourFormat } from "../convertTo12HourFormat";
import { delay } from "../delay"; import { delay } from "../delay";
import { settingsState } from "../listeners/SettingsState"; import { settingsState } from "../listeners/SettingsState";
import stringToHTML from "../stringToHTML"; import stringToHTML from "../stringToHTML";
import { CreateCustomShortcutDiv } from "@/seqta/utils/CreateEnable/CreateCustomShortcutDiv"; import { renderShortcuts } from "@/seqta/utils/Render/renderShortcuts";
import { CreateElement } from "@/seqta/utils/CreateEnable/CreateElement"; import { CreateElement } from "@/seqta/utils/CreateEnable/CreateElement";
import { FilterUpcomingAssessments } from "@/seqta/utils/FilterUpcomingAssessments"; import { FilterUpcomingAssessments } from "@/seqta/utils/FilterUpcomingAssessments";
import { getMockNotices } from "@/seqta/ui/dev/hideSensitiveContent"; import { getMockNotices } from "@/seqta/ui/dev/hideSensitiveContent";
@@ -100,12 +99,7 @@ export async function loadHomePage() {
const cleanup = setupTimetableListeners(); const cleanup = setupTimetableListeners();
try { renderShortcuts();
addShortcuts(settingsState.shortcuts);
} catch (err: any) {
console.error("[BetterSEQTA+] Error adding shortcuts:", err.message || err);
}
AddCustomShortcutsToPage();
const date = new Date(); const date = new Date();
const TodayFormatted = formatDate(date); const TodayFormatted = formatDate(date);
@@ -367,15 +361,6 @@ function comparedate(obj1: any, obj2: any) {
return 0; return 0;
} }
async function AddCustomShortcutsToPage() {
let customshortcuts: any = settingsState.customshortcuts;
if (customshortcuts.length > 0) {
for (let i = 0; i < customshortcuts.length; i++) {
const element = customshortcuts[i];
CreateCustomShortcutDiv(element);
}
}
}
function processNotices(response: any, labelArray: string[]) { function processNotices(response: any, labelArray: string[]) {
const NoticeContainer = document.getElementById("notice-container"); const NoticeContainer = document.getElementById("notice-container");
+26
View File
@@ -0,0 +1,26 @@
import { settingsState } from "@/seqta/utils/listeners/SettingsState";
import { addShortcuts } from "@/seqta/utils/Adders/AddShortcuts";
import { CreateCustomShortcutDiv } from "@/seqta/utils/CreateEnable/CreateCustomShortcutDiv";
export function renderShortcuts() {
const container = document.getElementById("shortcuts");
if (!container) return;
container.innerHTML = "";
try {
addShortcuts(settingsState.shortcuts || []);
} catch (err: any) {
console.error("[BetterSEQTA+] Error adding built-in shortcuts:", err?.message || err);
}
const custom = settingsState.customshortcuts || [];
for (const element of custom) {
try {
CreateCustomShortcutDiv(element);
} catch (err: any) {
console.error("[BetterSEQTA+] Error adding custom shortcut:", element?.name, err?.message || err);
}
}
}
+2 -10
View File
@@ -29,19 +29,11 @@ class StorageManager {
}, },
set: (target, prop: keyof SettingsState, value) => { set: (target, prop: keyof SettingsState, value) => {
const oldValue = target.data[prop]; const oldValue = target.data[prop];
// Only save if the value actually changed // Only save if the reference actually changed
if (oldValue !== value) { if (oldValue !== value) {
Reflect.set(target.data, prop, value); Reflect.set(target.data, prop, value);
target.saveToStorage(); target.saveToStorage();
// Notify listeners immediately for responsiveness
const listeners = target.listeners.get(prop as string);
if (listeners) {
for (const listener of listeners) {
listener(value, oldValue);
}
}
} }
return true; return true;
}, },
+4 -46
View File
@@ -1,10 +1,9 @@
import { settingsState } from "./SettingsState"; import { settingsState } from "./SettingsState";
import { updateAllColors } from "@/seqta/ui/colors/Manager"; import { updateAllColors } from "@/seqta/ui/colors/Manager";
import { addShortcuts } from "@/seqta/utils/Adders/AddShortcuts"; // Shortcuts rendering
import { CreateCustomShortcutDiv } from "@/seqta/utils/CreateEnable/CreateCustomShortcutDiv"; import { renderShortcuts } from "@/seqta/utils/Render/renderShortcuts";
import { FilterUpcomingAssessments } from "@/seqta/utils/FilterUpcomingAssessments"; import { FilterUpcomingAssessments } from "@/seqta/utils/FilterUpcomingAssessments";
import { RemoveShortcutDiv } from "@/seqta/utils/DisableRemove/RemoveShortcutDiv";
import browser from "webextension-polyfill"; import browser from "webextension-polyfill";
import type { CustomShortcut } from "@/types/storage"; import type { CustomShortcut } from "@/types/storage";
@@ -47,21 +46,7 @@ export class StorageChangeHandler {
oldValue: CustomShortcut[], oldValue: CustomShortcut[],
) { ) {
if (!newValue || !oldValue) return; if (!newValue || !oldValue) return;
renderShortcuts();
if (newValue.length > oldValue.length) {
// New shortcut added - add the last one
CreateCustomShortcutDiv(newValue[oldValue.length]);
} else if (newValue.length < oldValue.length) {
// Shortcut removed - find which one was removed
const newSet = new Set(newValue.map(item => JSON.stringify(item)));
const removedElement = oldValue.find(
(oldItem) => !newSet.has(JSON.stringify(oldItem))
);
if (removedElement) {
RemoveShortcutDiv([removedElement]);
}
}
} }
private handleShortcutsChange( private handleShortcutsChange(
@@ -69,34 +54,7 @@ export class StorageChangeHandler {
oldValue: { enabled: boolean; name: string }[], oldValue: { enabled: boolean; name: string }[],
) { ) {
if (!newValue || !oldValue) return; if (!newValue || !oldValue) return;
renderShortcuts();
// Create map for faster lookup
const oldMap = new Map(oldValue.map(item => [item.name, item.enabled]));
const addedShortcuts: { enabled: boolean; name: string }[] = [];
const removedShortcuts: { enabled: boolean; name: string }[] = [];
// Check for changes in shortcuts
for (const newItem of newValue) {
const oldEnabled = oldMap.get(newItem.name);
// Newly enabled shortcuts
if (newItem.enabled && (oldEnabled === undefined || !oldEnabled)) {
addedShortcuts.push(newItem);
}
// Newly disabled shortcuts
if (!newItem.enabled && oldEnabled === true) {
removedShortcuts.push(newItem);
}
}
if (addedShortcuts.length > 0) {
addShortcuts(addedShortcuts);
}
if (removedShortcuts.length > 0) {
RemoveShortcutDiv(removedShortcuts);
}
} }
private handleTransparencyEffectsChange(newValue: boolean) { private handleTransparencyEffectsChange(newValue: boolean) {