"use client"; import { use } 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 { 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 { WorkflowTimeline } from "@/components/cases/workflow-timeline"; import { StatusGuide } from "@/components/cases/status-guide"; import { StatusChanger } from "@/components/cases/status-changer"; import { DocumentsPanel } from "@/components/cases/documents-panel"; import { DraftsPanel } from "@/components/cases/drafts-panel"; import { DecisionBlocksPanel } from "@/components/cases/decision-blocks-panel"; import { LegalArgumentsPanel } from "@/components/cases/legal-arguments-panel"; import { AgentActivityFeed } from "@/components/cases/agent-activity-feed"; import { AgentActivityPreview } from "@/components/cases/agent-activity-preview"; import { AgentStatusWidget } from "@/components/cases/agent-status-widget"; import { UploadSheet } from "@/components/documents/upload-sheet"; import { expectedOutcomes } from "@/lib/schemas/case"; import { useCase, useStartWorkflow } from "@/lib/api/cases"; import { toast } from "sonner"; import { Play, Loader2 } from "lucide-react"; const EXPECTED_OUTCOME_LABELS: Record = Object.fromEntries( expectedOutcomes.map((o) => [o.value, o.label]), ); /* * 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 { data, isPending, error, refetch } = useCase(caseNumber); const startWorkflow = useStartWorkflow(caseNumber); const canStartWorkflow = data?.status === "new" || data?.status === "documents_ready"; const expectedOutcomeLabel = data?.expected_outcome ? EXPECTED_OUTCOME_LABELS[data.expected_outcome] ?? data.expected_outcome : null; // 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}

); } const tabsList = ( {[ ["overview", "סקירה"], ["arguments", "טיעונים"], ["decision", "ההחלטה"], ["drafts", "טיוטות והערות"], ["agents", "סוכנים"], ].map(([value, label]) => ( {label} ))} ); const bandActions = ( <> {data && } {canStartWorkflow && ( )} ); return ( {/* parchment band — header (title/chips/parties/actions) + tab strip */} {isPending ? (
) : ( )} {/* two-column wrap — main tab content (1fr) + rail (340px) */}
{/* decision-editor CTA moved to the band actions (visible on all tabs) */}
{/* rail — status timeline + status controls (mockup .rail) */}
סטטוס התיק
{expectedOutcomeLabel && (
תוצאה צפויה
{expectedOutcomeLabel}
)}
); }