State isolation — local draft form
The edit form maintains strictly local state. The parent data grid never sees uncommitted changes, preventing accidental state leakage.
function EditTaskForm({ task, onCancel, onSaveSuccess }) {
// Local draft state — completely detached from the global task list
const [draft, setDraft] = useState<Task>(task);
const [isSaving, setIsSaving] = useState(false);
const [error, setError] = useState<string | null>(null);
// Sync draft if the parent task changes while form is open
useEffect(() => {
setDraft(task);
setError(null);
}, [task]);
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setIsSaving(true);
setError(null);
try {
const updatedTask = await updateTaskInDatabase(draft, forceError);
// Synchronize back to global state ONLY after API success
onSaveSuccess(updatedTask);
} catch (err) {
setError(err.message);
} finally {
setIsSaving(false);
}
};
return <form onSubmit={handleSubmit}>...</form>;
}