import { Check, Download, Pencil, Trash2, X } from "lucide-react"; import { useNavigate, useSearchParams } from "react-router-dom"; import { Button, Input } from "antd"; import { useCanvasStore, type CanvasProject } from "@/stores/canvas/use-canvas-store"; import { useCanvasUiStore } from "@/stores/canvas/use-canvas-ui-store"; import { exportCanvasProjects } from "@/lib/canvas/canvas-export"; export function CanvasProjectCard({ project }: { project: CanvasProject }) { const navigate = useNavigate(); const [searchParams] = useSearchParams(); 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 open = () => navigate(`/canvas/${project.id}${searchParams.toString() ? `?${searchParams.toString()}` : ""}`); const saveTitle = () => { renameProject(project.id, editingTitle); stopEditing(); }; return (
!editing && open()}>
event.stopPropagation()} onChange={(event) => toggleSelected(project.id, event.target.checked)} className="mt-1 size-4 accent-stone-950 dark:accent-stone-100" aria-label={`选择 ${project.title}`} /> {editing ? ( event.stopPropagation()} onChange={(event) => setEditingTitle(event.target.value)} onKeyDown={(event) => event.key === "Enter" && saveTitle()} autoFocus /> ) : ( )}

更新于 {new Date(project.updatedAt).toLocaleString("zh-CN", { month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit" })}

event.stopPropagation()}> {editing ? ( <>
); }