all repos — kōi @ aabc809544f1c5547b497e8f0e5dda482f6b25e1

Minimalist task manager

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 };