src/lib/store/tasksStore.ts (view raw)
1import { get, writable } from "svelte/store";
2import { debounce } from "../utils";
3import { taskToThing } from "../models/task";
4import { saveSolidDatasetAt, setThing } from "@inrupt/solid-client";
5import { fetch } from "@inrupt/solid-client-authn-browser";
6import podInfo from "./podInfoStore";
7import { addToast } from "./toastStore";
8
9const DEBOUNCE_TIME_SYNC = 2000;
10
11const { set, update, subscribe } = writable<Task[]>([]);
12
13const addTask = (task: Task) => {
14 const podUrl = get(podInfo).podUrl;
15 update(tasks => [
16 ...tasks,
17 { ...task, id: `${podUrl}/tasks/default#${Date.now()}` },
18 ]);
19};
20
21const updateTask = (taskId: string, taskUpdate: Partial<Task>) => {
22 update(tasks =>
23 tasks.map(task => {
24 if (task.id === taskId) return { ...task, ...taskUpdate };
25 return task;
26 })
27 );
28};
29
30const deleteTask = (taskId: string) => {
31 update(tasks => tasks.filter(task => task.id !== taskId));
32};
33
34let init = false;
35subscribe(
36 debounce(async (tasks: Task[]) => {
37 if (!init) return (init = true);
38
39 let taskDataset = get(podInfo).tasksDataset;
40 if (!taskDataset) throw new Error("No tasks dataset. Can't write to pod.");
41
42 for (const task of tasks) {
43 const thing = taskToThing(task);
44 taskDataset = setThing(taskDataset, thing);
45 }
46
47 const podUrl = get(podInfo).podUrl;
48 const savedSolidDataset = await saveSolidDatasetAt(
49 `${podUrl}/tasks/default`,
50 taskDataset,
51 { fetch: fetch }
52 );
53 podInfo.update(store => ({ ...store, tasksDataset: savedSolidDataset }));
54 addToast("Tâches enregistrées vers le pod.");
55 }, DEBOUNCE_TIME_SYNC)
56);
57
58export default { set, update, subscribe, addTask, updateTask, deleteTask };