This commit is contained in:
Tomas Dvorak
2025-11-21 08:44:44 +01:00
parent c941313fd5
commit f5b6f83974
108 changed files with 8642 additions and 5871 deletions
+36 -11
View File
@@ -60,8 +60,11 @@ export function useAutoSave<T extends Record<string, any>>({
const [draftAge, setDraftAge] = useState<number | null>(null);
const saveTimerRef = useRef<NodeJS.Timeout>();
const lastDataRef = useRef<string>('');
const lastLocalDataRef = useRef<string>('');
const lastBackendDataRef = useRef<string>('');
const isSavingRef = useRef(false);
const lastDataObjRef = useRef<T | null>(null);
const localSaveTimerRef = useRef<NodeJS.Timeout>();
// Check for existing draft on mount
useEffect(() => {
@@ -153,18 +156,26 @@ export function useAutoSave<T extends Record<string, any>>({
// Main auto-save effect
useEffect(() => {
if (!enabled) return;
const dataString = JSON.stringify(data);
// Skip if data hasn't changed
if (dataString === lastDataRef.current) {
if (lastDataObjRef.current === data) {
return;
}
lastDataRef.current = dataString;
// Save to localStorage immediately
saveToLocalStorage(data);
lastDataObjRef.current = data;
if (localSaveTimerRef.current) {
clearTimeout(localSaveTimerRef.current);
}
localSaveTimerRef.current = setTimeout(() => {
try {
const dataString = JSON.stringify(data);
if (dataString !== lastLocalDataRef.current) {
lastLocalDataRef.current = dataString;
saveToLocalStorage(data);
}
} catch (err) {
console.error('Local draft serialize error:', err);
}
}, 300);
// Debounce backend save
if (saveTimerRef.current) {
@@ -172,13 +183,24 @@ export function useAutoSave<T extends Record<string, any>>({
}
saveTimerRef.current = setTimeout(() => {
saveToBackend(data);
try {
const dataString = JSON.stringify(data);
if (dataString !== lastBackendDataRef.current) {
lastBackendDataRef.current = dataString;
saveToBackend(data);
}
} catch (err) {
console.error('Backend draft serialize error:', err);
}
}, debounceMs);
return () => {
if (saveTimerRef.current) {
clearTimeout(saveTimerRef.current);
}
if (localSaveTimerRef.current) {
clearTimeout(localSaveTimerRef.current);
}
};
}, [data, enabled, debounceMs, saveToLocalStorage, saveToBackend]);
@@ -211,6 +233,9 @@ export function useAutoSave<T extends Record<string, any>>({
if (saveTimerRef.current) {
clearTimeout(saveTimerRef.current);
}
if (localSaveTimerRef.current) {
clearTimeout(localSaveTimerRef.current);
}
};
}, []);