all repos — kōi @ e252fb0b8f069ac47108b7307af4ab921d5b7ff7

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