"use client"; import { useCallback, useMemo, useState } from "react"; import { AddPrototypeModal } from "@/components/AddPrototypeModal"; import { PrototypeCard } from "@/components/PrototypeCard"; import { ThemeToggle } from "@/components/ThemeToggle"; import { PrototypeSummary } from "@/lib/prototype"; import dayjs from "@/lib/dayjs" interface PrototypeManagerPageProps { initialPrototypes: PrototypeSummary[]; } export function PrototypeManagerPage({ initialPrototypes }: PrototypeManagerPageProps) { const [prototypes, setPrototypes] = useState(initialPrototypes); const [keyword, setKeyword] = useState(""); const onCreated = useCallback((item: PrototypeSummary) => { setPrototypes((prev) => [item, ...prev.filter((current) => current.id !== item.id)]); }, []); const onDelete = useCallback(async (id: string) => { const confirmed = window.confirm("确定删除这个原型吗?删除后不可恢复。"); if (!confirmed) { return; } const response = await fetch(`/api/prototypes/${encodeURIComponent(id)}`, { method: "DELETE", }); if (!response.ok) { const payload = await response.json().catch(() => ({ error: "删除失败" })); throw new Error(payload.error || "删除失败"); } setPrototypes((prev) => prev.filter((item) => item.id !== id)); }, []); const filteredPrototypes = useMemo(() => { const query = keyword.trim().toLowerCase(); if (!query) { return prototypes; } return prototypes.filter((item) => item.name.toLowerCase().includes(query)); }, [keyword, prototypes]); const content = useMemo(() => { if (!prototypes.length) { return (

暂无原型,请点击右上角“添加原型”进行上传。

); } if (!filteredPrototypes.length) { return (

未找到名称包含“{keyword}”的原型。

); } return (
{filteredPrototypes.map((item) => ( { try { await onDelete(id); } catch (deleteError) { const message = deleteError instanceof Error ? deleteError.message : "删除失败,请稍后重试"; window.alert(message); } }} /> ))}
); }, [filteredPrototypes, keyword, onDelete, prototypes]); return (

原型导航

Axure 原型集合 · Prototype Collection

setKeyword(event.target.value)} placeholder="根据名称筛选原型..." className="w-full max-w-md rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm outline-none transition focus:ring-2 focus:ring-sky-200 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-100" /> {keyword ? ( ) : null}
{content}
© {dayjs().format("YYYY")} 原型导航 | Powered by OnixByte
); }