mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-04 10:42:57 +00:00
dev day #99
This commit is contained in:
@@ -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);
|
||||
}
|
||||
};
|
||||
}, []);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user