"use client"; import { useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { useRouter } from "next/navigation"; import { toast } from "sonner"; import { Brain } from "lucide-react"; import { api } from "@/lib/api"; import type { Case, ExtractedDeadline, ExtractionResponse, PaginatedResponse, } from "@/lib/types"; import { ExtractionForm } from "@/components/ai/ExtractionForm"; import { ExtractionResults } from "@/components/ai/ExtractionResults"; export default function AIExtractPage() { const router = useRouter(); const [selectedCaseId, setSelectedCaseId] = useState(""); const [isExtracting, setIsExtracting] = useState(false); const [isAdopting, setIsAdopting] = useState(false); const [results, setResults] = useState(null); const { data: casesData } = useQuery({ queryKey: ["cases"], queryFn: () => api.get>("/cases"), }); const cases = Array.isArray(casesData?.data) ? casesData.data : []; async function handleExtract(file: File | null, text: string) { setIsExtracting(true); setResults(null); try { let response: ExtractionResponse; if (file) { const formData = new FormData(); formData.append("file", file); response = await api.postFormData( "/ai/extract-deadlines", formData, ); } else { response = await api.post( "/ai/extract-deadlines", { text }, ); } setResults(response.deadlines); if (response.count === 0) { toast.info("Keine Fristen im Dokument gefunden."); } else { toast.success(`${response.count} Frist(en) erkannt.`); } } catch (err: unknown) { const message = err && typeof err === "object" && "error" in err ? (err as { error: string }).error : "Analyse fehlgeschlagen"; toast.error(message); } finally { setIsExtracting(false); } } async function handleAdopt(deadlines: ExtractedDeadline[]) { if (!selectedCaseId) return; setIsAdopting(true); try { const promises = deadlines.map((d) => api.post(`/cases/${selectedCaseId}/deadlines`, { title: d.title, due_date: d.due_date ?? "", source: "ai_extraction", notes: [ d.rule_reference ? `Rechtsgrundlage: ${d.rule_reference}` : "", d.source_quote ? `Quelle: "${d.source_quote}"` : "", `Konfidenz: ${Math.round(d.confidence * 100)}%`, ] .filter(Boolean) .join("\n"), }), ); await Promise.all(promises); toast.success( `${deadlines.length} Frist(en) erfolgreich übernommen.`, ); router.push(`/cases/${selectedCaseId}`); } catch (err: unknown) { const message = err && typeof err === "object" && "error" in err ? (err as { error: string }).error : "Übernahme fehlgeschlagen"; toast.error(message); } finally { setIsAdopting(false); } } return (

AI Fristenanalyse

Fristen automatisch aus Dokumenten extrahieren

{results !== null && (
)}
); }