feat: store options in cookies
TS Lint / Oxlint (push) Successful in 44s
TS Lint / TypeScript (push) Successful in 49s
TS Lint / ESLint (push) Successful in 52s

This commit is contained in:
2026-07-12 17:46:21 +02:00
parent d21a829f6b
commit d969b9e21b
4 changed files with 74 additions and 20 deletions
+7 -5
View File
@@ -6,15 +6,17 @@ import { CirclePlus } from "@lucide/vue";
import TaskItem from "@/components/TaskItem.vue";
import { taskCompleted, sortTasks } from "@/lib/tasks";
import { SortType } from "@/enums";
import { booleanCookieRef, enumCookieRef } from "@/lib/cookies";
const taskInput = ref<string>("");
const tasks = ref<Task[]>([]);
const list = ref<string>("test");
const sortType = ref<SortType>(SortType.RESET_DATE);
const sortReverse = ref<boolean>(false);
const showLastChecked = ref<boolean>(false);
const showNextReset = ref<boolean>(false);
const separateCompleted = ref<boolean>(false);
const sortType = enumCookieRef<SortType>("toutDouxSortType", SortType.CREATED_AT);
const sortReverse = booleanCookieRef("toutDouxSortReverse", false);
const showLastChecked = booleanCookieRef("toutDouxShowLastChecked", false);
const showNextReset = booleanCookieRef("toutDouxShowNextReset", false);
const separateCompleted = booleanCookieRef("toutDouxSeparateCompleted", false);
const hasCompleted = computed<boolean>(() => tasks.value.some(taskCompleted));
+11 -11
View File
@@ -1,16 +1,16 @@
export enum CronType {
ONE_TIME = 1,
EVERY_DAY = 2,
EVERY_WEEK = 3,
EVERY_MONTH = 4,
EVERY_YEAR = 5,
SPECIFIC = 6,
ONE_TIME,
EVERY_DAY,
EVERY_WEEK,
EVERY_MONTH,
EVERY_YEAR,
SPECIFIC,
}
export enum SortType {
CREATED_AT = 1,
UPDATED_AT = 2,
CHECK_DATE = 3,
RESET_DATE = 4,
NAME = 5,
CREATED_AT,
UPDATED_AT,
CHECK_DATE,
RESET_DATE,
NAME,
}
+52
View File
@@ -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));
}