"use client"; import { useCallback, useEffect, useState } from "react"; import { Plus, Sparkles, Trash2, X } from "lucide-react"; import { toast } from "sonner"; import { Streamdown } from "streamdown"; import type { Conclusion } from "@/lib/types"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Badge } from "@/components/ui/badge"; export function ConclusionsPanel({ projectId, reloadToken = 0, }: { projectId: string; reloadToken?: number; }) { const [items, setItems] = useState([]); const [adding, setAdding] = useState(false); const [title, setTitle] = useState(""); const [body, setBody] = useState(""); const [busy, setBusy] = useState(false); const load = useCallback(async () => { const r = await fetch(`/api/projects/${projectId}/conclusions`, { cache: "no-store" }); if (r.ok) setItems(((await r.json()) as { items: Conclusion[] }).items ?? []); }, [projectId]); useEffect(() => { void load(); }, [load, reloadToken]); async function add() { if (!title.trim() && !body.trim()) return; setBusy(true); try { const r = await fetch(`/api/projects/${projectId}/conclusions`, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ title, body, source: "manual" }), }); if (r.ok) { setTitle(""); setBody(""); setAdding(false); toast.success("Conclusion added"); await load(); } else { toast.error("Could not add conclusion"); } } finally { setBusy(false); } } async function del(cid: string) { await fetch(`/api/projects/${projectId}/conclusions/${cid}`, { method: "DELETE" }); await load(); } return (

Curated takeaways for this project — pin a diagnosis from Results or write your own.

{!adding && ( )}
{adding && ( setTitle(e.target.value)} />