import { Dropdown, Input } from "antd"; import { Download, MoreHorizontal, Pencil, Trash2 } from "lucide-react"; import type { KeyboardEvent } from "react"; import { ProjectPreview } from "@/components/canvas/canvas-project-card"; import { exportCanvasProjects } from "@/lib/canvas/canvas-export"; import { useCanvasStore, type CanvasProject } from "@/stores/canvas/use-canvas-store"; import { useCanvasUiStore } from "@/stores/canvas/use-canvas-ui-store"; import { cn } from "@/lib/utils"; type CanvasFolderCardProps = { project: CanvasProject; projectName?: string; onClick: () => void; }; /** 画布库中的文件夹封面:单一卡片表面承载预览和信息,避免相邻卡片互相侵入。 */ export function CanvasFolderCard({ project, projectName, onClick }: CanvasFolderCardProps) { const renameProject = useCanvasStore((state) => state.renameProject); const selectedIds = useCanvasUiStore((state) => state.selectedProjectIds); const editingId = useCanvasUiStore((state) => state.editingProjectId); const editingTitle = useCanvasUiStore((state) => state.editingProjectTitle); const startEditing = useCanvasUiStore((state) => state.startEditingProject); const setEditingTitle = useCanvasUiStore((state) => state.setEditingProjectTitle); const stopEditing = useCanvasUiStore((state) => state.stopEditingProject); const toggleSelected = useCanvasUiStore((state) => state.toggleSelectedProjectId); const setDeleteIds = useCanvasUiStore((state) => state.setDeleteProjectIds); const editing = editingId === project.id; const selected = selectedIds.includes(project.id); const saveTitle = () => { renameProject(project.id, editingTitle); stopEditing(); }; const handleOpenKeyDown = (event: KeyboardEvent) => { if (event.target !== event.currentTarget) return; if (event.key === "Enter" || event.key === " ") { event.preventDefault(); if (!editing) onClick(); } }; return (
!editing && onClick()} onKeyDown={handleOpenKeyDown}>
{editing ? ( setEditingTitle(event.target.value)} onClick={(event) => event.stopPropagation()} onBlur={saveTitle} onKeyDown={(event) => { if (event.key === "Enter") saveTitle(); if (event.key === "Escape") stopEditing(); }} autoFocus /> ) : ( {project.title} )}
{projectName ? `所属项目:${projectName}` : "自由画布"} {project.nodes.length} 节点
创建时间 最后更新
event.stopPropagation()}> toggleSelected(project.id, event.target.checked)} aria-label={`选择 ${project.title}`} />
event.stopPropagation()}> {!editing ? ( ) : null} domEvent.stopPropagation(), items: [ { key: "export", icon: , label: "导出画布", onClick: () => void exportCanvasProjects([project], project.title || "影策画布") }, { type: "divider" }, { key: "delete", danger: true, icon: , label: "删除", onClick: () => setDeleteIds([project.id]) }, ], }} >
); } function formatCanvasDate(value: string) { const timestamp = Date.parse(value); return Number.isFinite(timestamp) ? new Date(timestamp).toLocaleString("zh-CN", { year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", }) : "时间不可用"; }