From 6d12cebc05b5e38dcb15ef63b9141f3456e8bc71 Mon Sep 17 00:00:00 2001 From: Jaime Idolpx Date: Sun, 14 Jun 2026 01:21:49 -0400 Subject: [PATCH] feat(SearchOverlay): persist search state across overlay open/close cycles --- src/app/components/SearchOverlay.tsx | 44 ++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/src/app/components/SearchOverlay.tsx b/src/app/components/SearchOverlay.tsx index cd21fe3..36a3976 100644 --- a/src/app/components/SearchOverlay.tsx +++ b/src/app/components/SearchOverlay.tsx @@ -127,6 +127,19 @@ function scanPhaseLabel(phase: ScanPhase, value: number): string { type SortField = 'name' | 'size'; type SortDir = 'asc' | 'desc'; +// Persisted across overlay open/close cycles (survives unmount). +const _store = { + query: '', + results: [] as SearchResult[], + hasSearched: false, + showFilter: false, + filterSystem: null as string | null, + filterVideo: null as string | null, + filterLanguage: null as string | null, + sortField: 'name' as SortField, + sortDir: 'asc' as SortDir, +}; + function FilterChips({ label, values, selected, onSelect, }: { @@ -153,29 +166,42 @@ function FilterChips({ } export default function SearchOverlay({ config, setConfig, onClose, onOpenFolder }: SearchOverlayProps) { - const [query, setQuery] = useState(''); + const [query, setQuery] = useState(() => _store.query); const [isSearching, setIsSearching] = useState(false); const [isScanning, setIsScanning] = useState(false); const [scanPhase, setScanPhase] = useState(null); const [scanValue, setScanValue] = useState(0); - const [results, setResults] = useState([]); - const [hasSearched, setHasSearched] = useState(false); + const [results, setResults] = useState(() => _store.results); + const [hasSearched, setHasSearched] = useState(() => _store.hasSearched); const [mountEntry, setMountEntry] = useState(null); const [actionEntry, setActionEntry] = useState(null); const [searchError, setSearchError] = useState(null); const [dbBytes, setDbBytes] = useState(null); const [dbPhase, setDbPhase] = useState<'idle' | 'downloading' | 'ready'>('idle'); - const [showFilter, setShowFilter] = useState(false); - const [filterSystem, setFilterSystem] = useState(null); - const [filterVideo, setFilterVideo] = useState(null); - const [filterLanguage, setFilterLanguage] = useState(null); - const [sortField, setSortField] = useState('name'); - const [sortDir, setSortDir] = useState('asc'); + const [showFilter, setShowFilter] = useState(() => _store.showFilter); + const [filterSystem, setFilterSystem] = useState(() => _store.filterSystem); + const [filterVideo, setFilterVideo] = useState(() => _store.filterVideo); + const [filterLanguage, setFilterLanguage] = useState(() => _store.filterLanguage); + const [sortField, setSortField] = useState(() => _store.sortField); + const [sortDir, setSortDir] = useState(() => _store.sortDir); useEffect(() => { if (isLocateDbLoaded()) setDbPhase('ready'); }, []); + // Persist search state so it survives overlay close/reopen. + useEffect(() => { + _store.query = query; + _store.results = results; + _store.hasSearched = hasSearched; + _store.showFilter = showFilter; + _store.filterSystem = filterSystem; + _store.filterVideo = filterVideo; + _store.filterLanguage = filterLanguage; + _store.sortField = sortField; + _store.sortDir = sortDir; + }, [query, results, hasSearched, showFilter, filterSystem, filterVideo, filterLanguage, sortField, sortDir]); + const handleSearch = async () => { if (!query.trim()) { toast.error('Please enter a search term'); return; } setIsSearching(true);