diff --git a/simulator-ui/src/shared.tsx b/simulator-ui/src/shared.tsx index 5fd3a7de..aa902571 100644 --- a/simulator-ui/src/shared.tsx +++ b/simulator-ui/src/shared.tsx @@ -320,15 +320,23 @@ export function FeedbackControls(props: { const [errorMessage, setErrorMessage] = useState(null); const requestSeqRef = useRef(0); + // Keep local draft in sync with persisted feedback, but never while the user + // is actively typing or a save is in flight, otherwise server echoes can + // clobber in-progress text and make the textarea feel flaky. useEffect(() => { - setReason(feedback?.reason ?? ""); - if (typeof feedback?.score === "number" || feedback?.reason !== undefined) { - setStatus("saved"); - } else { - setStatus("idle"); + const isEditing = status === "unsaved" || status === "saving"; + if (!isEditing) { + setReason(feedback?.reason ?? ""); + if ( + typeof feedback?.score === "number" || feedback?.reason !== undefined + ) { + setStatus("saved"); + } else { + setStatus("idle"); + } + setErrorMessage(null); } - setErrorMessage(null); - }, [feedback?.reason, feedback?.score]); + }, [feedback?.reason, feedback?.score, status]); useEffect(() => { if (typeof feedback?.score === "number") {