"use client"; import { useState, useEffect, useCallback } from "react"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; import { listProjects, type ProjectRead } from "@/lib/api/client"; import { Copy, Search, FileText } from "lucide-react"; import { toast } from "sonner"; export function HistoricalReferences() { const [projects, setProjects] = useState([]); const [search, setSearch] = useState(""); const [loading, setLoading] = useState(true); const load = useCallback(async () => { setLoading(true); try { const data = await listProjects(); setProjects(data); } catch (e) { toast.error("加载历史项目失败"); setProjects([]); } finally { setLoading(false); } }, []); useEffect(() => { load(); }, [load]); const filtered = search.trim() ? projects.filter( (p) => p.raw_requirement.toLowerCase().includes(search.toLowerCase()) || (p.ai_solution_md || "").toLowerCase().includes(search.toLowerCase()) ) : projects.slice(0, 10); const copySnippet = (text: string, label: string) => { if (!text) return; navigator.clipboard.writeText(text); toast.success(`已复制 ${label}`); }; return (

历史参考

setSearch(e.target.value)} className="h-8 pl-7 text-xs" />
{loading ? (

加载中...

) : filtered.length === 0 ? (

暂无项目

) : ( filtered.map((p) => (

项目 #{p.id}

{p.raw_requirement.slice(0, 80)}…

)) )}
); }