Skip to content

fix(frontend): replace useState with useRef for auto-save timeout in DocumentEditor#1009

Open
hemish22 wants to merge 2 commits into
SdSarthak:mainfrom
hemish22:fix/document-editor-save-error
Open

fix(frontend): replace useState with useRef for auto-save timeout in DocumentEditor#1009
hemish22 wants to merge 2 commits into
SdSarthak:mainfrom
hemish22:fix/document-editor-save-error

Conversation

@hemish22

Copy link
Copy Markdown
Contributor

Summary

Fixes #325

  • saveTimeout was useState → every setSaveTimeout call triggered useEffect re-run → infinite debounce loop (new timeout created before old one fires)
  • Replaced with useRef — stores timer ID without causing re-renders
  • Removed redundant setIsSaving(true/false) in timeout callback (handleSave already manages this)

Changes

File Change
frontend/src/components/DocumentEditor.tsx useStateuseRef for timeout; remove redundant state calls; saveTimeout removed from effect deps

Before / After

Before — effect deps included saveTimeout:

const [saveTimeout, setSaveTimeout] = useState<...>(null)
// ...
setSaveTimeout(timeout)          // ← triggers effect re-run → infinite loop
// ...
}, [content, handleSave, initialContent, saveTimeout])

After — ref never triggers re-render:

const saveTimeoutRef = useRef<...>(null)
// ...
saveTimeoutRef.current = setTimeout(...)   // ← no re-render
// ...
}, [content, handleSave, initialContent])

Test Plan

  • Edit document → auto-save fires once after 2s (not repeatedly)
  • Disconnect backend → save error banner appears in toolbar
  • Manual Save button → shows "Saving…" then error on failure
  • No console errors on mount or typing

AI Disclosure

Fix implemented with Claude Code (claude-sonnet-4-6).

hemish22 and others added 2 commits May 16, 2026 13:04
Silent catch block only logged to console, giving no feedback when save
failed. Add saveError state and render a red message in the toolbar on
failure so users know their changes were not persisted.

Fixes SdSarthak#325

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
saveTimeout in useState caused useEffect to re-run on every
setSaveTimeout call, creating an infinite debounce loop. useRef
holds the timer ID without triggering re-renders.

Also removed redundant setIsSaving calls in the timeout callback
since handleSave already manages isSaving state.

Fixes SdSarthak#325

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug(frontend): DocumentEditor silent save failure — no UI feedback when save or auto-save fails

1 participant