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( 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( name, defaultValue, (v) => v === "1", (v) => (v ? "1" : "0"), ); } export function enumCookieRef(name: string, defaultValue: T) { return cookieRef( name, defaultValue, (v) => parseInt(v) as T, (v: T) => v.toFixed(0), ); }