fix(data): 增加全局保存失败保护

This commit is contained in:
Script Generator
2026-07-03 19:36:18 +08:00
parent 516a5f1b63
commit b4a3c990b4
17 changed files with 727 additions and 132 deletions

View File

@@ -2,12 +2,9 @@
import { create } from 'zustand';
import type { TaskCategory, CategoryGroup } from '@/lib/task-category';
import { PRESET_CATEGORIES, normalizeTaskCategories, resolveAiTaskCategoryByName } from '@/lib/task-category';
import { scheduleSaveWithOptimisticRollback } from '@/lib/optimistic-persistence';
import { loadServerData, saveServerData, SERVER_DATA_CACHE_MS } from '@/lib/server-data';
function saveStored(items: TaskCategory[]) {
saveServerData('task-categories', items).catch(() => {});
}
let lastCategoriesFetchAt = 0;
async function loadStored(): Promise<TaskCategory[] | null> {
@@ -52,30 +49,53 @@ export const useTaskCategoryStore = create<TaskCategoryState>((set, get) => ({
};
const updated = [...list, item];
set({ categories: updated, loaded: true });
saveStored(updated);
scheduleSaveWithOptimisticRollback({
save: () => saveServerData('task-categories', updated),
expected: updated,
getCurrent: () => get().categories,
rollback: () => set({ categories: list, loaded: true }),
});
},
ensureCategory: (name, group, options) => {
const previous = get().categories;
const result = resolveAiTaskCategoryByName(get().categories, name, group, options);
if (result.created) {
set({ categories: result.categories, loaded: true });
saveStored(result.categories);
scheduleSaveWithOptimisticRollback({
save: () => saveServerData('task-categories', result.categories),
expected: result.categories,
getCurrent: () => get().categories,
rollback: () => set({ categories: previous, loaded: true }),
});
}
return result.category;
},
updateCategory: (id, data) => {
const updated = get().categories.map((c) => (c.id === id ? { ...c, ...data } : c));
const previous = get().categories;
const updated = previous.map((c) => (c.id === id ? { ...c, ...data } : c));
set({ categories: updated, loaded: true });
saveStored(updated);
scheduleSaveWithOptimisticRollback({
save: () => saveServerData('task-categories', updated),
expected: updated,
getCurrent: () => get().categories,
rollback: () => set({ categories: previous, loaded: true }),
});
},
deleteCategory: (id) => {
const target = get().categories.find((c) => c.id === id);
if (!target || target.isSystem) return false;
const updated = get().categories.filter((c) => c.id !== id);
const previous = get().categories;
const updated = previous.filter((c) => c.id !== id);
set({ categories: updated, loaded: true });
saveStored(updated);
scheduleSaveWithOptimisticRollback({
save: () => saveServerData('task-categories', updated),
expected: updated,
getCurrent: () => get().categories,
rollback: () => set({ categories: previous, loaded: true }),
});
return true;
},
}));