diff --git a/src/shared/ui/SaveStatusIndicator.tsx b/src/shared/ui/SaveStatusIndicator.tsx
index efccbde..6430d3a 100644
--- a/src/shared/ui/SaveStatusIndicator.tsx
+++ b/src/shared/ui/SaveStatusIndicator.tsx
@@ -15,6 +15,9 @@ const SAVED_DISPLAY_MS = 3000
* - `saved` – check icon only (fades out after 3 s)
* - `error` – warning icon + "Save failed"
* - `idle` – hidden
+ *
+ * @param props - Component props.
+ * @param props.status - The current save state to render.
*/
export function SaveStatusIndicator({
status,
@@ -29,24 +32,28 @@ export function SaveStatusIndicator({
undefined
)
+ // Synchronise the local display state with the upstream save status.
+ // Any previous auto-hide timer is cleared first to prevent stale callbacks.
useEffect(() => {
clearTimeout(savedTimerRef.current)
+ // "idle" means no save activity – hide the indicator immediately.
if (status === 'idle') {
- if (!savedTimerRef.current) {
- setDisplay(null)
- }
+ setDisplay(null)
return
}
setDisplay(status)
+ // After showing the "saved" check icon, start a timer to fade it out.
if (status === 'saved') {
savedTimerRef.current = setTimeout(() => {
savedTimerRef.current = undefined
setDisplay(null)
}, SAVED_DISPLAY_MS)
}
+
+ return () => clearTimeout(savedTimerRef.current)
}, [status])
if (locked) {
@@ -70,10 +77,10 @@ export function SaveStatusIndicator({
)}
{display === 'saved' && }
{display === 'error' && (
- <>
-
- Save failed
- >
+
+
+ Save failed
+
)}
)