"use client"; import { useState } from "react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { getClient } from "@/lib/api/client"; import type { AuthoredClaimDto, ListClaimsResponse, VerifyReportResponse, CoverageReportResponse, } from "@/lib/api/types"; import { ClaimsLoadingSkeleton } from "./claims-loading-skeleton"; import { ClaimsEmptyState } from "./claims-empty-state"; type PanelState = | { status: "idle" } | { status: "loading" } | { status: "success"; data: T } | { status: "error"; error: string }; function getDefaultProjectPath(): string { return process.env.NEXT_PUBLIC_DEFAULT_PROJECT_PATH || "/home/jml/Workspace/stemedb"; } export function ClaimsPanel() { const [projectPath, setProjectPath] = useState(getDefaultProjectPath()); const [claimsState, setClaimsState] = useState>({ status: "idle", }); const [verifyState, setVerifyState] = useState>({ status: "idle", }); const [coverageState, setCoverageState] = useState>({ status: "idle", }); const [selectedClaim, setSelectedClaim] = useState(null); const client = getClient(); const loadClaims = async () => { setClaimsState({ status: "loading" }); try { const data = await client.listClaims({ project_path: projectPath }); setClaimsState({ status: "success", data }); } catch (error) { setClaimsState({ status: "error", error: error instanceof Error ? error.message : "Failed to load claims", }); } }; const runVerification = async () => { setVerifyState({ status: "loading" }); try { const data = await client.verifyClaims({ project_path: projectPath }); setVerifyState({ status: "success", data }); } catch (error) { setVerifyState({ status: "error", error: error instanceof Error ? error.message : "Verification failed", }); } }; const loadCoverage = async () => { setCoverageState({ status: "loading" }); try { const data = await client.getCoverage({ project_path: projectPath }); setCoverageState({ status: "success", data }); } catch (error) { setCoverageState({ status: "error", error: error instanceof Error ? error.message : "Coverage load failed", }); } }; return (
{/* Project Path Input */} Project Configuration Select the project to analyze claims for
setProjectPath(e.target.value)} placeholder="/path/to/project" />
{/* Tabs for Claims / Verify / Coverage */} Claims List Verification Coverage {/* Claims List Tab */} {claimsState.status === "loading" && } {claimsState.status === "error" && (

{claimsState.error}

)} {claimsState.status === "success" && (claimsState.data.claims.length === 0 ? ( ) : ( Authored Claims ({claimsState.data.claims.length})
{claimsState.data.claims.map((claim) => (
setSelectedClaim(claim)} >

{claim.id}

{claim.concept_path}

{claim.category}
))}
))} {claimsState.status === "idle" && (

Enter a project path and click "Load Claims" to begin

)}
{/* Verification Tab */} Claim Verification Verify claims against extracted observations {verifyState.status === "success" && (
{verifyState.data.summary.total_claims}
Total
{verifyState.data.summary.pass}
Pass
{verifyState.data.summary.conflict}
Conflict
{verifyState.data.summary.missing}
Missing
{verifyState.data.summary.unclaimed}
Unclaimed
)} {verifyState.status === "error" && (

{verifyState.error}

)}
{/* Coverage Tab */} Coverage Metrics Per-module claim coverage analysis {coverageState.status === "success" && (
{coverageState.data.summary.total_observations}
Observations
{coverageState.data.summary.total_claims}
Claims
{coverageState.data.summary.claimed_percentage.toFixed(1)}%
Coverage
)} {coverageState.status === "error" && (

{coverageState.error}

)}
); }