feat: store options in cookies
TS Lint / Oxlint (push) Successful in 44s
TS Lint / TypeScript (push) Successful in 49s
TS Lint / ESLint (push) Successful in 52s

This commit is contained in:
2026-07-12 17:46:21 +02:00
parent d21a829f6b
commit d969b9e21b
4 changed files with 74 additions and 20 deletions
+52
View File
@@ -0,0 +1,52 @@
import { customRef } from "vue";
export function setCookie(name: string, value: string, days = 365) {
const date = new Date();
date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
const expires = `expires=${date.toUTCString()}`;
document.cookie = `${name}=${value}; path=/; ${expires}`;
}
export function getCookie(name: string, defaultValue: string): string {
const prefix = `${name}=`;
const decodedCookie = decodeURIComponent(document.cookie);
const cookies = decodedCookie.split(";");
for (const cookie of cookies) {
if (cookie.trim().startsWith(prefix)) {
return cookie.trim().substring(prefix.length, cookie.length);
}
}
return defaultValue;
}
export function cookieRef<T>(
name: string,
defaultValue: T,
deserializer: (value: string) => T,
serializer: (value: T) => string,
) {
let value = deserializer(getCookie(name, serializer(defaultValue)));
setCookie(name, serializer(value));
return customRef((track, trigger) => {
return {
get() {
track();
return value;
},
set(newValue) {
value = newValue;
trigger();
setCookie(name, serializer(value));
},
};
});
}
export function booleanCookieRef(name: string, defaultValue: boolean) {
return cookieRef<boolean>(name, defaultValue, (v) => v === "1", (v) => v ? "1" : "0");
}
export function enumCookieRef<T extends number>(name: string, defaultValue: T) {
return cookieRef<T>(name, defaultValue, (v) => parseInt(v) as T, (v: T) => v.toFixed(0));
}