feat: store options in cookies
This commit is contained in:
@@ -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));
|
||||
}
|
||||
Reference in New Issue
Block a user