src/store/index.ts breakup (no drama)

This commit is contained in:
2026-03-25 12:52:47 -05:00
parent 446d599ed2
commit 5fc1318c1d
7 changed files with 3911 additions and 4025 deletions
+176
View File
@@ -0,0 +1,176 @@
import { pb } from "@/lib/pocketbase";
import { toast } from "solid-sonner";
import {
createDefaultFilter,
type Filter,
type FilterTemplate,
readScopedPrefs,
setStore,
store,
writeScopedPrefs
} from "./state";
export const syncPreferences = async () => {
const userId = pb.authStore.model?.id;
if (!userId) return;
try {
const user = await pb.collection("users").getOne(userId, { requestKey: null });
const rawPrefs = user.Taskgrid_pref || {};
const prefs = {
pWeight: store.pWeight,
uWeight: store.uWeight,
matrixScaleDays: store.matrixScaleDays,
tagDefinitions: store.tagDefinitions.filter(def => !def.name.startsWith("@")),
filterTemplates: store.filterTemplates,
quickloadTasks: store.quickloadTasks,
dismissedTaskUpdateIndicators: store.dismissedTaskUpdateIndicators,
collapsedUntilUpdatedTasks: store.collapsedUntilUpdatedTasks,
subscribedBuckets: store.subscribedBuckets,
supervisorUserIds: store.personalContextSupervisorIds,
lastCompletedTaskCleanupDate: store.lastCompletedTaskCleanupDate
};
await pb.collection("users").update(userId, {
Taskgrid_pref: writeScopedPrefs(rawPrefs, {
...readScopedPrefs(rawPrefs),
...prefs
})
}, { requestKey: null });
} catch (e: any) {
if (e.isAbort) return;
console.error("Failed to sync preferences", e);
}
};
export const setFilter = (update: Partial<Filter>) => {
setStore("filter", f => ({ ...f, ...update }));
};
export const loadFilterTemplates = async () => {
if (!pb.authStore.isValid) return;
const userId = pb.authStore.model?.id;
if (!userId) return;
const user = await pb.collection("users").getOne(userId, { requestKey: null });
const prefs = readScopedPrefs(user.Taskgrid_pref || {});
setStore("filterTemplates", prefs.filterTemplates || []);
};
export const saveFilterTemplate = async (name: string) => {
if (!pb.authStore.isValid) return;
try {
const newTemplate: FilterTemplate = {
id: `filter-${Date.now()}`,
name,
filter: store.filter
};
setStore("filterTemplates", prev => [...prev, newTemplate]);
await syncPreferences();
toast.success(`Filter template "${name}" saved`);
} catch (err) {
console.error("Failed to save filter template:", err);
toast.error("Failed to save filter template.");
}
};
export const applyFilterTemplate = (id: string) => {
const template = store.filterTemplates.find(t => t.id === id);
if (template) {
setFilter(template.filter);
toast.success(`Applied filter: ${template.name}`);
}
};
export const removeFilterTemplate = async (id: string) => {
if (!pb.authStore.isValid) return;
try {
setStore("filterTemplates", prev => prev.filter(t => t.id !== id));
await syncPreferences();
toast.success("Filter template deleted");
} catch (err) {
console.error("Failed to delete filter template:", err);
toast.error("Failed to delete filter template.");
}
};
export const clearFilter = () => {
setStore("filter", createDefaultFilter());
};
export const setNoteFilter = (update: Partial<Filter>) => {
setStore("noteFilter", f => ({ ...f, ...update }));
};
export const loadNoteFilterTemplates = async () => {
if (!pb.authStore.isValid) return;
const userId = pb.authStore.model?.id;
if (!userId) return;
const user = await pb.collection("users").getOne(userId, { requestKey: null });
const prefs = readScopedPrefs(user.Taskgrid_pref || {});
setStore("filterTemplates", prefs.noteFilterTemplates || []);
};
export const saveNoteFilterTemplate = async (name: string) => {
if (!pb.authStore.isValid) return;
try {
const newTemplate: FilterTemplate = {
id: `note-filter-${Date.now()}`,
name,
filter: store.noteFilter
};
setStore("filterTemplates", prev => [...prev, newTemplate]);
const userId = pb.authStore.model?.id;
if (userId) {
const user = await pb.collection("users").getOne(userId, { requestKey: null });
const rawPrefs = user.Taskgrid_pref || {};
const prefs = readScopedPrefs(rawPrefs);
await pb.collection("users").update(userId, {
Taskgrid_pref: writeScopedPrefs(rawPrefs, {
...prefs,
noteFilterTemplates: [...(prefs.noteFilterTemplates || []), newTemplate]
})
}, { requestKey: null });
}
toast.success(`Note filter template "${name}" saved`);
} catch (err) {
console.error("Failed to save note filter template:", err);
toast.error("Failed to save note filter template.");
}
};
export const applyNoteFilterTemplate = (id: string) => {
const template = store.filterTemplates.find(t => t.id === id);
if (template) {
setNoteFilter(template.filter);
toast.success(`Applied note filter: ${template.name}`);
}
};
export const removeNoteFilterTemplate = async (id: string) => {
if (!pb.authStore.isValid) return;
try {
setStore("filterTemplates", prev => prev.filter(t => t.id !== id));
const userId = pb.authStore.model?.id;
if (userId) {
const user = await pb.collection("users").getOne(userId, { requestKey: null });
const rawPrefs = user.Taskgrid_pref || {};
const prefs = readScopedPrefs(rawPrefs);
await pb.collection("users").update(userId, {
Taskgrid_pref: writeScopedPrefs(rawPrefs, {
...prefs,
noteFilterTemplates: (prefs.noteFilterTemplates || []).filter((template: FilterTemplate) => template.id !== id)
})
}, { requestKey: null });
}
toast.success("Note filter template deleted");
} catch (err) {
console.error("Failed to delete note filter template:", err);
toast.error("Failed to delete note filter template.");
}
};
export const clearNoteFilter = () => {
setStore("noteFilter", createDefaultFilter());
};