"use client"; import { useEffect, useRef, useState } from "react"; type IconName = "home" | "create" | "assets" | "projects" | "canvas" | "tools" | "bell" | "api" | "plus" | "image" | "layers" | "magic" | "resize" | "grid" | "search" | "arrow"; type Project = { id: string; name: string; slides: Array<{ fileName: string }>; canvas: { width: number; height: number }; updatedAt: string }; const paths: Record = { home: , create: <>, assets: <>, projects: <>, canvas: <>, tools: <>, bell: <>, api: <>, plus: , image: <>, layers: <>, magic: <>, resize: <>, grid: <>, search: <>, arrow: , }; function Icon({ name, size = 20 }: { name: IconName; size?: number }) { return ; } function imageUrl(project: Project) { return project.slides[0] ? `/api/image-projects/${project.id}/images/${project.slides[0].fileName}` : ""; } export default function Studio() { const [projects, setProjects] = useState([]); const [filter, setFilter] = useState("项目"); const [query, setQuery] = useState(""); const [uploading, setUploading] = useState(false); const [message, setMessage] = useState(""); const input = useRef(null); useEffect(() => { fetch("/api/image-projects").then(async (response) => { const data = await response.json(); if (!response.ok) throw new Error(data.error || "项目载入失败"); setProjects(data.projects || []); }).catch((error) => setMessage((error as Error).message)); }, []); async function createProject(files: FileList | null) { if (!files?.length) return; setUploading(true); setMessage(`正在创建项目并上传 ${files.length} 张图片…`); try { const form = new FormData(); Array.from(files).forEach((file) => form.append("images", file)); const response = await fetch("/api/image-projects", { method: "POST", body: form }); const data = await response.json(); if (!response.ok) throw new Error(data.error || "上传失败"); window.location.assign(`/projects/${data.project.id}/editor`); } catch (error) { setMessage((error as Error).message); setUploading(false); if (input.current) input.current.value = ""; } } const visibleProjects = projects.filter((project) => project.name.toLowerCase().includes(query.trim().toLowerCase())); return
input.current?.click()} />
{["项目", "最近", "收藏"].map((tab) => )}
{visibleProjects.length ? :

开始第一个图文项目

上传 1–20 张图片,进入专业画布逐页编辑

}
void createProject(event.target.files)} /> {uploading &&
{message}请不要关闭页面
} {!uploading && message &&
{message}
}
; } function SideItem({ icon, label, active }: { icon: IconName; label: string; active?: boolean }) { return ; } function ToolCard({ icon, title, subtitle, onClick }: { icon: IconName; title: string; subtitle: string; onClick?: () => void }) { return ; }