"use client"; import { Check, Download, Pencil, Trash2, X } from "lucide-react"; import { useRouter } from "next/navigation"; import { Button, Input } from "antd"; import { useCanvasStore, type CanvasProject } from "../stores/use-canvas-store"; import { useCanvasUiStore } from "../stores/use-canvas-ui-store"; export function CanvasProjectCard({ project }: { project: CanvasProject }) { const router = useRouter(); 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 = () => router.push(`/canvas/${project.id}`); 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 ? ( <>
); } function exportProject(project: CanvasProject) { const data = { app: "infinite-canvas", version: 1, exportedAt: new Date().toISOString(), project }; const url = URL.createObjectURL(new Blob([JSON.stringify(data, null, 2)], { type: "application/json" })); const link = document.createElement("a"); link.href = url; link.download = `${(project.title || "无限画布").replace(/[\\/:*?"<>|]/g, "_")}.json`; link.click(); URL.revokeObjectURL(url); }