feat(assets&canvas): 实现素材回收站机制、自动定时清理策略与过期时间提示,增加画布创建与变更历史时间线

This commit is contained in:
Danborad committed 2026-09-01 14:51:07 +08:00
1 parent dca252434b
commit 867a18a948
17 files changed
+1411 -321

No files matched your search

@@ -0,0 +1,55 @@
import { create } from "zustand";
import { persist } from "zustand/middleware";
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 useCanvasHistoryStore = create<CanvasHistoryStore>()(
persist(
(set, get) => ({
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,
coverUrl: p.nodes?.find((n) => n.type === "image" && n.metadata?.content)?.metadata?.content as string | undefined,
}));
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: "infinite-canvas:deleted_history_store",
},
),
);
+1
View File
@@ -22,6 +22,7 @@ export type RuntimeLimits = {
activeTaskLimit: number;
resourceUploadMB: number;
sessionUploadMB: number;
recycleBinRetentionDays?: number;
};
export type FeatureAvailability = {