feat(assets): 素材回收站与画布历史 - 合并 PR #370 并修复删除一致性

This commit is contained in:
ddCat committed 2026-09-01 18:50:30 +08:00
commit 39bdc54762
21 files changed
+1764 -340

No files matched your search

@@ -0,0 +1,67 @@
import { create } from "zustand";
import { persist, type PersistStorage } from "zustand/middleware";
import { localForageStorageForScope } from "@/lib/localforage-storage";
import type { CanvasProject } from "@/stores/canvas/use-canvas-store";
export type DeletedCanvasHistoryItem = {
id: string;
title: string;
createdAt: string;
updatedAt: string;
deletedAt: string;
nodeCount: number;
coverUrl?: string;
};
type CanvasHistoryStore = {
deletedProjects: DeletedCanvasHistoryItem[];
recordDeletedProjects: (projects: CanvasProject[]) => void;
removeDeletedHistoryItem: (id: string) => void;
clearDeletedHistory: () => void;
};
export const CANVAS_HISTORY_STORE_KEY = "infinite-canvas:deleted_history_store";
const historyStorage: PersistStorage<CanvasHistoryStore> = {
getItem: async (name) => {
const value = await localForageStorageForScope().getItem(name);
return value ? JSON.parse(value) : null;
},
setItem: (name, value) => localForageStorageForScope().setItem(name, JSON.stringify(value)),
removeItem: (name) => localForageStorageForScope().removeItem(name),
};
export const useCanvasHistoryStore = create<CanvasHistoryStore>()(
persist(
(set) => ({
deletedProjects: [],
recordDeletedProjects: (projects) => {
const now = new Date().toISOString();
const newItems: DeletedCanvasHistoryItem[] = projects.map((p) => ({
id: p.id,
title: p.title || "未命名画布",
createdAt: p.createdAt || p.updatedAt || now,
updatedAt: p.updatedAt || now,
deletedAt: now,
nodeCount: p.nodes?.length || 0,
}));
set((state) => {
const existingIds = new Set(newItems.map((item) => item.id));
const filtered = state.deletedProjects.filter((item) => !existingIds.has(item.id));
return {
deletedProjects: [...newItems, ...filtered].slice(0, 200),
};
});
},
removeDeletedHistoryItem: (id) =>
set((state) => ({
deletedProjects: state.deletedProjects.filter((item) => item.id !== id),
})),
clearDeletedHistory: () => set({ deletedProjects: [] }),
}),
{
name: CANVAS_HISTORY_STORE_KEY,
storage: historyStorage,
},
),
);