import { useCallback, useEffect, useRef, useState } from 'react'; import { STR, formatVersionDate } from '../lib/strings.js'; import IconButton from './IconButton.jsx'; import { DraftsIcon } from './icons/index.js'; export default function DraftsMenu({ currentDraftId, onListDrafts, onSelectDraft, onCreateDraft, onDeleteDraft, }) { const [open, setOpen] = useState(false); const [drafts, setDrafts] = useState([]); const rootRef = useRef(null); const refresh = useCallback(() => { setDrafts(onListDrafts()); }, [onListDrafts]); const toggle = useCallback(() => { setOpen((was) => { if (!was) refresh(); return !was; }); }, [refresh]); useEffect(() => { if (!open) return undefined; const onPointerDown = (event) => { if (rootRef.current && !rootRef.current.contains(event.target)) { setOpen(false); } }; const onKeyDown = (event) => { if (event.key === 'Escape') setOpen(false); }; document.addEventListener('pointerdown', onPointerDown); document.addEventListener('keydown', onKeyDown); return () => { document.removeEventListener('pointerdown', onPointerDown); document.removeEventListener('keydown', onKeyDown); }; }, [open]); const handleSelect = (id) => { setOpen(false); if (id !== currentDraftId) onSelectDraft(id); }; const handleCreate = () => { setOpen(false); onCreateDraft(); }; const handleDelete = (event, draft) => { event.stopPropagation(); const confirmed = window.confirm( STR.DELETE_DRAFT_CONFIRM(draft.title || STR.UNTITLED_DOCUMENT), ); if (!confirmed) return; onDeleteDraft(draft.id); refresh(); }; return (
} label={STR.DRAFTS} aria-expanded={open} aria-haspopup="menu" onClick={toggle} /> {open && (
    {drafts.map((draft) => (
  • {drafts.length > 1 && ( )}
  • ))}
)}
); }