gedaechtnas/gdn-app/src/stores/notes.ts
2025-02-10 15:42:21 +01:00

50 lines
1.2 KiB
TypeScript

import { defineStore } from "pinia";
import { computed, ref } from "vue";
export interface Note {
readonly id: string;
text: string;
children: string[];
}
export const useNotesStore = defineStore("notes", () => {
const notes = ref<Map<string, Note>>(new Map());
const parents = computed(() => {
const result = new Map<string, Set<string>>();
for (const note of notes.value.values()) {
for (const childId of note.children) {
const parents = result.get(childId) ?? new Set();
result.set(childId, parents);
parents.add(note.id);
}
}
return result;
});
function getNote(id: string): Note | undefined {
return notes.value.get(id);
}
function getParents(id: string): ReadonlySet<string> {
return parents.value.get(id) ?? new Set();
}
function createNote(text: string): Note {
const id = crypto.randomUUID();
notes.value.set(id, { id, text, children: [] });
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
return notes.value.get(id)!; // Re-getting so returned Note is reactive
}
function clearNotes() {
notes.value.clear();
}
return {
getNote,
getParents,
createNote,
clearNotes,
};
});