"use client"; import { useCallback, useEffect, useRef, useState } from "react"; import type { AutosaveData } from "../editor/types"; const AUTOSAVE_INTERVAL = 30_000; // 30 seconds const MAX_AUTOSAVE_AGE = 24 * 60 * 60 * 1000; // 24 hours function getAutosaveKey(path: string) { return `editor-autosave:${path}`; } export function useAutosave( path: string, content: string, isDirty: boolean, initialContent: string, ) { const [showRecoveryPrompt, setShowRecoveryPrompt] = useState(false); const [recoveredData, setRecoveredData] = useState(null); // Use ref for content to avoid recreating interval on every content change const contentRef = useRef(content); useEffect(() => { contentRef.current = content; }, [content]); // Check for autosave on mount useEffect(() => { if (!path || typeof window === "undefined") return; const key = getAutosaveKey(path); const saved = localStorage.getItem(key); if (saved) { try { const data: AutosaveData = JSON.parse(saved); const age = Date.now() - data.timestamp; // If autosave is newer than 24h and different from initial content if (age < MAX_AUTOSAVE_AGE && data.content !== initialContent) { setRecoveredData(data); setShowRecoveryPrompt(true); } else { // Clear old autosave localStorage.removeItem(key); } } catch { // Clear invalid autosave localStorage.removeItem(key); } } }, [path, initialContent]); // Autosave when dirty - uses ref to avoid interval recreation on content changes useEffect(() => { if (!isDirty || !path || typeof window === "undefined") return; const timer = setInterval(() => { const data: AutosaveData = { content: contentRef.current, timestamp: Date.now(), }; localStorage.setItem(getAutosaveKey(path), JSON.stringify(data)); }, AUTOSAVE_INTERVAL); return () => clearInterval(timer); }, [isDirty, path]); // Clear autosave on successful save const clearAutosave = useCallback(() => { if (path) { localStorage.removeItem(getAutosaveKey(path)); } }, [path]); // Handle recovery const handleRestore = useCallback(() => { setShowRecoveryPrompt(false); return recoveredData?.content; }, [recoveredData]); const handleDiscardRecovery = useCallback(() => { setShowRecoveryPrompt(false); setRecoveredData(null); if (path) { localStorage.removeItem(getAutosaveKey(path)); } }, [path]); return { showRecoveryPrompt, recoveredData, clearAutosave, handleRestore, handleDiscardRecovery, }; }