"use client"; import { useMemo } from "react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { PARTY_LABELS_HE, PRIORITY_LABELS_HE, PRIORITY_ORDER, useAggregateArguments, useLegalArguments, type LegalArgument, type LegalArgumentParty, type LegalArgumentPriority, } from "@/lib/api/legal-arguments"; import { toast } from "sonner"; import { Loader2, RefreshCw, Sparkles } from "lucide-react"; const PRIORITY_BADGE_TONE: Record = { threshold: "bg-danger-bg/60 text-danger-strong border-danger/40", substantive: "bg-gold-soft/50 text-navy border-gold/40", procedural: "bg-rule-soft text-ink border-rule", relief: "bg-emerald-50 text-emerald-900 border-emerald-200", }; function groupByPriority( args: LegalArgument[], ): Record { const out: Record = { threshold: [], substantive: [], procedural: [], relief: [], }; for (const a of args) { (out[a.priority] ?? out.substantive).push(a); } for (const key of PRIORITY_ORDER) { out[key].sort((x, y) => x.argument_index - y.argument_index); } return out; } type PartySectionProps = { party: LegalArgumentParty; args: LegalArgument[]; }; function PartySection({ party, args }: PartySectionProps) { const grouped = useMemo(() => groupByPriority(args), [args]); return (

{PARTY_LABELS_HE[party] ?? party}

{args.length} טיעונים
{PRIORITY_ORDER.map((priority) => { const list = grouped[priority]; if (!list?.length) return null; return (
{PRIORITY_LABELS_HE[priority]} {list.length} טיעונים
{list.map((arg) => (
{arg.argument_index}. {arg.argument_title} {arg.legal_topic && ( {arg.legal_topic} )}

{arg.argument_body}

{arg.supporting_claims.length > 0 && (

מסתמך על {arg.supporting_claims.length} פרופוזיציות גולמיות.

)}
))}
); })}
); } type LegalArgumentsPanelProps = { caseNumber: string; }; export function LegalArgumentsPanel({ caseNumber }: LegalArgumentsPanelProps) { const { data, isPending, isError, error } = useLegalArguments(caseNumber); const aggregate = useAggregateArguments(caseNumber); const parties = useMemo(() => { if (!data?.by_party) return []; const order: LegalArgumentParty[] = [ "appellant", "respondent", "committee", "permit_applicant", "unknown", ]; return order.filter((p) => (data.by_party[p]?.length ?? 0) > 0); }, [data]); const handleAggregate = (force: boolean) => { aggregate.mutate(force, { onSuccess: () => { toast.success( force ? "הופעלה חזרה חישוב טיעונים (force). יסתיים תוך דקה." : "הופעל חישוב טיעונים. רענן בעוד דקה.", ); }, onError: (e) => toast.error(`שגיאה: ${(e as Error).message}`), }); }; return (

טיעונים משפטיים

טיעונים מאוגדים מתוך הפרופוזיציות הגולמיות, מקובצים לפי צד וקדימות.

{isPending ? (
) : isError ? (

שגיאה בטעינת טיעונים: {(error as Error).message}

) : !data?.total ? (

אין טיעונים מאוגדים עדיין. לחץ “חשב טיעונים” כדי להריץ את ה-aggregator.

) : (
{parties.map((party) => ( ))}
)}
); }