53 lines
1.4 KiB
TypeScript
53 lines
1.4 KiB
TypeScript
import { decodeJwtPayload, getAuthToken } from "./auth";
|
|
|
|
export type ThemeModePref = "system" | "light" | "dark";
|
|
|
|
export function getUserKeyFromToken(): string {
|
|
const token = getAuthToken();
|
|
if (!token) return "anon";
|
|
|
|
const payload = decodeJwtPayload(token) ?? {};
|
|
|
|
const candidates = [
|
|
payload.sub,
|
|
payload.nameid,
|
|
payload["nameid"],
|
|
payload["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"],
|
|
payload["http://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid"],
|
|
];
|
|
|
|
for (const c of candidates) {
|
|
if (typeof c === "string" && c.trim().length > 0) return c.trim();
|
|
}
|
|
|
|
return "anon";
|
|
}
|
|
|
|
function k(base: string) {
|
|
return `${base}:${getUserKeyFromToken()}`;
|
|
}
|
|
|
|
export function getThemeModePref(): ThemeModePref {
|
|
const raw = window.localStorage.getItem(k("themeMode"));
|
|
if (raw === "light" || raw === "dark" || raw === "system") return raw;
|
|
return "system";
|
|
}
|
|
|
|
export function setThemeModePref(v: ThemeModePref) {
|
|
window.localStorage.setItem(k("themeMode"), v);
|
|
}
|
|
|
|
export function getAccentColor(): string {
|
|
const raw = window.localStorage.getItem(k("accentColor"));
|
|
if (raw && /^#[0-9a-fA-F]{6}$/.test(raw)) return raw;
|
|
return "#7c4dff";
|
|
}
|
|
|
|
export function setAccentColor(v: string) {
|
|
if (v && /^#[0-9a-fA-F]{6}$/.test(v)) window.localStorage.setItem(k("accentColor"), v);
|
|
}
|
|
|
|
export function clearAccentColor() {
|
|
window.localStorage.removeItem(k("accentColor"));
|
|
}
|