"use client"; import { useState, useEffect } from "react"; import { Card, CardContent } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { useMethodology, useUpdateMethodology, useResetMethodology, type GoldenRatios, } from "@/lib/api/methodology"; import { toast } from "sonner"; import { Save, RotateCcw, Loader2 } from "lucide-react"; const OUTCOME_LABELS: Record = { rejection: "דחייה", full_acceptance: "קבלה מלאה", partial_acceptance: "קבלה חלקית", betterment_levy: "היטל השבחה", }; const SECTION_LABELS: Record = { background: "רקע", claims: "טענות", discussion: "דיון", summary: "סיכום", }; type RatioCard = { key: string; label: string; original: GoldenRatios; draft: GoldenRatios; isOverride: boolean; dirty: boolean; }; export function GoldenRatiosPanel() { const { data, isLoading } = useMethodology("golden_ratios"); const update = useUpdateMethodology("golden_ratios"); const reset = useResetMethodology("golden_ratios"); const [cards, setCards] = useState([]); // Sync from server useEffect(() => { if (!data?.items) return; // eslint-disable-next-line react-hooks/set-state-in-effect -- sync from server setCards( Object.entries(data.items).map(([key, item]) => ({ key, label: OUTCOME_LABELS[key] ?? key, original: item.value, draft: structuredClone(item.value), isOverride: item.is_override, dirty: false, })), ); }, [data]); const setRange = (cardIdx: number, section: string, idx: 0 | 1, val: number) => { setCards((prev) => prev.map((c, i) => { if (i !== cardIdx) return c; const next = { ...c, draft: { ...c.draft, [section]: [...c.draft[section]] as [number, number] } }; next.draft[section][idx] = val; next.dirty = JSON.stringify(next.draft) !== JSON.stringify(next.original); return next; }), ); }; const handleSave = (card: RatioCard) => { update.mutate( { key: card.key, value: card.draft }, { onSuccess: () => toast.success(`${card.label} נשמר`), onError: () => toast.error("שגיאה בשמירה"), }, ); }; const handleReset = (card: RatioCard) => { reset.mutate(card.key, { onSuccess: () => toast.success(`${card.label} אופס לברירת מחדל`), onError: () => toast.error("שגיאה באיפוס"), }); }; if (isLoading) { return (
טוען...
); } return (
{cards.map((card, ci) => ( {/* Header */}

{card.label}

{card.isOverride ? "מותאם" : "ברירת מחדל"}
{/* Table */} {Object.entries(SECTION_LABELS).map(([sec, label]) => ( ))}
Section Min % Max %
{label} setRange(ci, sec, 0, Number(e.target.value))} className="h-7 w-16 text-center text-xs mx-auto" /> setRange(ci, sec, 1, Number(e.target.value))} className="h-7 w-16 text-center text-xs mx-auto" />
{/* Actions */}
{card.isOverride && ( )}
))}
); }