diff --git a/web-ui/src/components/precedents/precedent-edit-sheet.tsx b/web-ui/src/components/precedents/precedent-edit-sheet.tsx index 146c13f..cbf967d 100644 --- a/web-ui/src/components/precedents/precedent-edit-sheet.tsx +++ b/web-ui/src/components/precedents/precedent-edit-sheet.tsx @@ -1,6 +1,6 @@ "use client"; -import { useEffect, useState } from "react"; +import { useState } from "react"; import { Save, Sparkles } from "lucide-react"; import { toast } from "sonner"; import { @@ -65,10 +65,12 @@ export function PrecedentEditSheet({ caseLawId, onOpenChange }: Props) { const [form, setForm] = useState(EMPTY); - // Hydrate form when the record loads. - useEffect(() => { - if (!record) return; - // eslint-disable-next-line react-hooks/set-state-in-effect + // React-approved derived-state pattern: sync form whenever a different + // record arrives (including after save+refetch). Using setState during + // render avoids the one-frame flash that useEffect would produce. + const [syncedRecordId, setSyncedRecordId] = useState(null); + if (record && record.id !== syncedRecordId) { + setSyncedRecordId(record.id as string); setForm({ citation: record.case_number || "", case_name: record.case_name || "", @@ -84,7 +86,7 @@ export function PrecedentEditSheet({ caseLawId, onOpenChange }: Props) { headnote: record.headnote || "", key_quote: (record as { key_quote?: string }).key_quote || "", }); - }, [record]); + } const onSubmit = async (e: React.FormEvent) => { e.preventDefault();