Files
tout-doux/resources/ts/lib/cookies.ts
T
klemek d969b9e21b
TS Lint / Oxlint (push) Successful in 44s
TS Lint / TypeScript (push) Successful in 49s
TS Lint / ESLint (push) Successful in 52s
feat: store options in cookies
2026-07-12 17:46:21 +02:00

53 lines
1.6 KiB
TypeScript

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));
}