53 lines
1.6 KiB
TypeScript
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));
|
|
}
|