"use client"; import { use, useState } from "react"; import Link from "next/link"; import { AppShell } from "@/components/app-shell"; import { Card, CardContent } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; import { Button } from "@/components/ui/button"; import { Skeleton } from "@/components/ui/skeleton"; import { CaseHeader } from "@/components/cases/case-header"; import { CaseEditDialog } from "@/components/cases/case-edit-dialog"; import { DocumentsPanel } from "@/components/cases/documents-panel"; import { DraftsPanel } from "@/components/cases/drafts-panel"; import { CaseFilesBrowser } from "@/components/cases/case-files-browser"; import { DecisionBlocksPanel } from "@/components/cases/decision-blocks-panel"; import { LegalArgumentsPanel } from "@/components/cases/legal-arguments-panel"; import { PositionsPanel } from "@/components/cases/positions-panel"; import { HearingChangesPanel } from "@/components/cases/hearing-changes-panel"; import { CitationVerificationPanel } from "@/components/compose/citation-verification-panel"; import { AgentActivityFeed } from "@/components/cases/agent-activity-feed"; import { AgentActivityPreview } from "@/components/cases/agent-activity-preview"; import { UploadSheet } from "@/components/documents/upload-sheet"; import { useCase, useStartWorkflow } from "@/lib/api/cases"; import { toast } from "sonner"; import { Play, Loader2, LayoutGrid, Scale, BadgeCheck, FileText, MessageSquare, Users, type LucideIcon, } from "lucide-react"; /* * Next 16 breaking change: route params are now a Promise. * The `use()` hook unwraps them inside a client component. */ export default function CaseDetailPage({ params, }: { params: Promise<{ caseNumber: string }>; }) { const { caseNumber } = use(params); const [tab, setTab] = useState("overview"); const { data, isPending, error, refetch } = useCase(caseNumber); const startWorkflow = useStartWorkflow(caseNumber); const canStartWorkflow = data?.status === "new" || data?.status === "documents_ready"; // Only take over the whole page when there is NO data to show. A transient // 5xx on the 5s background refetch must not blow away an already-loaded page. if (error && !data) { return (

שגיאה בטעינת התיק

{error.message}

); } // Workflow order (X17): intake → arguments+positions → verify citations → // write decision → drafts/final → agents (monitoring). const tabDefs: [string, string, LucideIcon][] = [ ["overview", "סקירה", LayoutGrid], ["arguments", "טיעונים ועמדות", Scale], ["verify", "אימות פסיקה", BadgeCheck], ["decision", "ההחלטה", FileText], ["drafts", "טיוטות והערות", MessageSquare], ["agents", "סוכנים", Users], ]; // V2 "segmented" tab strip (X17): each tab a pill, active = raised white card. // Spread full-width via justify-between (chair request) — wide gaps with few // tabs, tightening as more are added; gap-2 is the no-overlap floor. const tabsList = ( {tabDefs.map(([value, label, Icon]) => ( {label} ))} ); const bandActions = ( <> {data && } {canStartWorkflow && ( )} ); return ( {/* parchment band — header (title/chips/parties/actions) + tab strip */} {isPending ? (
) : ( )} {/* full-width tab content — status now lives in the always-visible band StatusRail (banner A, X17), so every tab keeps the status context. */}
{/* documents (wider) + agent-activity preview (mockup 18j) */}
{/* טיעונים ועמדות — chair positions (editing) over the analyst's issues, with the aggregated by-party arguments collapsible below (merged from the deleted /compose editor, mockup 18f). */} {/* עמדות וטענות — collapsed by default (chair preference #226), mirroring the two accordions below. */} עמדות וטענות סוגיות-המחלוקת ועמדות הצדדים · עורך עמדת-היו״ר מזין את בלוק י׳ טיעונים מאוגדים לפי צד תצוגה מסונתזת של הטענות הגולמיות, מקובצת לפי צד וקדימות {/* מה קרה בדיון — comparative analysis of the hearing protocol vs. the written pleadings (#226). Sits below the aggregated arguments because it speaks to those same arguments in their oral gloss. Collapsed by default, mirroring the "by-party" accordion above. */} מה קרה בדיון השוואת הטענות בכתב מול הדיון בעל-פה — מה התחזק ומה נטען לראשונה {/* אימות פסיקה — per-argument supporting-precedent verify gate (#154), relocated from the deleted /compose editor to a top-level tab. */}
); }