import { useState, useRef, useEffect } from 'react' import type { VaultEntry } from '../types' import { NoteSearchList } from './NoteSearchList' import { useNoteSearch } from '../hooks/useNoteSearch' interface QuickOpenPaletteProps { open: boolean entries: VaultEntry[] onSelect: (entry: VaultEntry) => void onClose: () => void } export function QuickOpenPalette({ open, entries, onSelect, onClose }: QuickOpenPaletteProps) { const [query, setQuery] = useState('') const inputRef = useRef(null) const { results, selectedIndex, setSelectedIndex, handleKeyDown } = useNoteSearch(entries, query) useEffect(() => { if (open) { // eslint-disable-next-line react-hooks/set-state-in-effect -- reset on dialog open setQuery('') setSelectedIndex(0) setTimeout(() => inputRef.current?.focus(), 50) } }, [open, setSelectedIndex]) useEffect(() => { if (!open) return const handler = (e: KeyboardEvent) => { handleKeyDown(e) if (e.key === 'Escape') { e.preventDefault() onClose() } else if (e.key === 'Enter') { e.preventDefault() const selected = results[selectedIndex] if (selected) { onSelect(selected.entry) onClose() } } } window.addEventListener('keydown', handler) return () => window.removeEventListener('keydown', handler) }, [open, results, selectedIndex, onSelect, onClose, handleKeyDown]) if (!open) return null return (
e.stopPropagation()} > setQuery(e.target.value)} /> item.entry.path} onItemClick={(item) => { onSelect(item.entry) onClose() }} onItemHover={(i) => setSelectedIndex(i)} emptyMessage="No matching notes" className="flex-1 overflow-y-auto" />
) }