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