import { useState, useRef, useEffect } from "react"; /** * AutoSaveTextarea is a textarea that auto-saves its value after the user stops typing for a short delay. * Shows a green flash and a "saved" message when the save is successful. */ export function AutoSaveTextarea({ value: initialValue, onSave, delay = 500, className = "", multiline = true, ...props }: { value: string; onSave: (value: string) => Promise; delay?: number; className?: string; multiline?: boolean; [key: string]: any; }) { const [value, setValue] = useState(initialValue || ""); const [saving, setSaving] = useState(false); const [saved, setSaved] = useState(false); const [flash, setFlash] = useState(false); const timeoutRef = useRef(null); const saveTimeoutRef = useRef(null); useEffect(() => { setValue(initialValue || ""); }, [initialValue]); useEffect(() => { return () => { if (timeoutRef.current) window.clearTimeout(timeoutRef.current); if (saveTimeoutRef.current) window.clearTimeout(saveTimeoutRef.current); }; }, []); const handleChange = ( e: React.ChangeEvent, ) => { setValue(e.target.value); setSaved(false); setFlash(false); if (timeoutRef.current) window.clearTimeout(timeoutRef.current); timeoutRef.current = window.setTimeout(async () => { setSaving(true); try { await onSave(e.target.value); setSaved(true); setFlash(true); saveTimeoutRef.current = window.setTimeout(() => setFlash(false), 600); } finally { setSaving(false); } }, delay); }; return (
{multiline ? (