fix(data): 增加全局保存失败保护
This commit is contained in:
@@ -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;
|
||||
},
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user