"use client"; import { useEffect, useRef, useState } from "react"; import { useSaveChairPosition } from "@/lib/api/research"; /* * Chair-position editor for a single threshold claim or issue. * * Autosaves on blur, with an optimistic in-memory "last saved" value so the * user sees immediate feedback. No debounced per-keystroke save — the user * writes in long paragraphs and the backend writes to a file, so per-blur * is the right granularity (matches the vanilla UI's behavior). */ type SaveState = | { kind: "idle" } | { kind: "saving" } | { kind: "saved"; at: Date } | { kind: "error"; message: string }; export function ChairEditor({ caseNumber, sectionId, initialValue, }: { caseNumber: string; sectionId: string; initialValue: string; }) { const [value, setValue] = useState(initialValue); const [state, setState] = useState({ kind: "idle" }); const lastSaved = useRef(initialValue); const mutate = useSaveChairPosition(caseNumber); /* Reset when the upstream analysis refetches (e.g. after initial load) */ useEffect(() => { // eslint-disable-next-line react-hooks/set-state-in-effect -- sync from server setValue(initialValue); lastSaved.current = initialValue; }, [initialValue]); const save = async () => { const trimmed = value.trim(); if (trimmed === lastSaved.current.trim()) return; setState({ kind: "saving" }); try { await mutate.mutateAsync({ sectionId, position: trimmed }); lastSaved.current = trimmed; setState({ kind: "saved", at: new Date() }); } catch (e) { setState({ kind: "error", message: e instanceof Error ? e.message : "שגיאה בשמירה", }); } }; return (
עמדת ועדת הערר