28 lines
3.3 KiB
TypeScript
28 lines
3.3 KiB
TypeScript
"use client";
|
|
|
|
import { useParams } from "react-router-dom";
|
|
import { BookOpen, Clock, ShieldCheck } from "lucide-react";
|
|
import { Badge, Card, CardContent, CardDescription, CardHeader, CardTitle, PageHeader } from "@/components/ui";
|
|
import { getKnowledgeForProject } from "@/shared/lib/projectbrainSelectors";
|
|
import { projectBrainClientMode } from "@/shared/api/projectBrainClient";
|
|
import { ProjectKnowledgeCenter } from "@/features/knowledge/components/ProjectKnowledgeCenter";
|
|
|
|
const decayVariant = (status?: string) => status === "fresh" ? "default" : status === "watch" ? "secondary" : status === "stale" || status === "obsolete" ? "destructive" : "outline";
|
|
const decayLabel = (status?: string) => status === "fresh" ? "Actueel" : status === "watch" ? "Controleren" : status === "stale" ? "Verouderd" : status === "obsolete" ? "Niet meer geldig" : "Onbekend";
|
|
|
|
const KnowledgeVault = () => {
|
|
const { projectId } = useParams();
|
|
if (projectBrainClientMode === "real" && projectId) return <div className="space-y-6"><PageHeader title="Project Knowledge" subtitle="De actuele projectwaarheid eerst; bronnen, geheugen en context blijven ondersteunend bewijs." /><ProjectKnowledgeCenter projectId={projectId} /></div>;
|
|
|
|
const knowledge = projectId ? getKnowledgeForProject(projectId) : [];
|
|
const fresh = knowledge.filter((item) => item.decayStatus === "fresh").length;
|
|
const watch = knowledge.filter((item) => item.decayStatus === "watch" || item.decayStatus === "stale").length;
|
|
return <div className="space-y-6">
|
|
<PageHeader title="Project Knowledge" subtitle="Lokale voorbeeldweergave van projectkennis. Productiewaarheid is pas bewezen in live backendmodus." />
|
|
<div className="grid gap-3 sm:grid-cols-3"><Card><CardContent className="p-4"><p className="text-2xl font-semibold">{knowledge.length}</p><p className="text-xs text-muted-foreground">kennisitems</p></CardContent></Card><Card><CardContent className="p-4"><p className="text-2xl font-semibold">{fresh}</p><p className="text-xs text-muted-foreground">actueel</p></CardContent></Card><Card><CardContent className="p-4"><p className="text-2xl font-semibold">{watch}</p><p className="text-xs text-muted-foreground">controleren</p></CardContent></Card></div>
|
|
<Card><CardHeader><CardTitle className="flex items-center gap-2"><BookOpen size={18} />Voorbeeldkennis</CardTitle><CardDescription>Deze fallback toont geen productieclaim en bevat geen losstaande contextpack-workflow.</CardDescription></CardHeader><CardContent className="grid gap-3 md:grid-cols-2">{knowledge.map((item) => <div key={item.id} className="rounded-lg border p-3"><div className="flex items-start justify-between gap-2"><p className="font-semibold">{item.title}</p><Badge variant={decayVariant(item.decayStatus)}>{decayLabel(item.decayStatus)}</Badge></div><p className="mt-1 text-sm text-muted-foreground">{item.summary}</p><div className="mt-2 flex flex-wrap gap-2 text-xs text-muted-foreground"><span className="inline-flex items-center gap-1"><ShieldCheck size={12} />{item.confidence}% zekerheid</span><span className="inline-flex items-center gap-1"><Clock size={12} />{item.lastUpdated}</span></div></div>)}{!knowledge.length ? <p className="text-sm text-muted-foreground">Geen lokale voorbeeldkennis beschikbaar.</p> : null}</CardContent></Card>
|
|
</div>;
|
|
};
|
|
|
|
export default KnowledgeVault;
|