import { useEffect, useRef, useState } from 'react'; import { useDebounce } from './useDebounce'; export type AutoSaveOptions = { data: T; onSave: (data: T) => Promise; debounceMs?: number; enabled?: boolean; isValid?: boolean; }; export const useAutoSave = ({ data, onSave, debounceMs = 3000, enabled = true, isValid = true }: AutoSaveOptions) => { const [isSaving, setIsSaving] = useState(false); const [lastSaved, setLastSaved] = useState(null); const [error, setError] = useState(null); const debouncedData = useDebounce(data, debounceMs); const initialRender = useRef(true); useEffect(() => { // Skip initial render if (initialRender.current) { initialRender.current = false; return; } // Skip if disabled or invalid if (!enabled || !isValid) return; const save = async () => { setIsSaving(true); setError(null); try { await onSave(debouncedData); setLastSaved(new Date()); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to auto-save'); } finally { setIsSaving(false); } }; save(); }, [debouncedData, enabled, isValid, onSave]); return { isSaving, lastSaved, error, resetError: () => setError(null) }; };