Files
tout-doux/resources/ts/lib/cookies.ts
T
klemek a9b2e31d81
TS Lint / ESLint (push) Has been cancelled
TS Lint / Oxlint (push) Has been cancelled
TS Lint / TypeScript (push) Has been cancelled
refactor: format
2026-07-14 11:47:05 +02:00

63 lines
1.7 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),
);
}