import { ReactElement, useContext, useEffect, useMemo, useRef, useState } from 'react' import FileIcon from 'remixicon-react/File2LineIcon' import FilterIcon from 'remixicon-react/FilterLineIcon' import SearchIcon from 'remixicon-react/SearchLineIcon' import { useSearch } from '../../../../pages/filemanager/SearchContext' import { Context as FMContext } from '../../../../providers/FileManager' import './Header.scss' // Defaults used to determine “active filters” const DEFAULT_FILTERS = { scope: 'selected' as 'selected' | 'all', includeActive: true, includeTrashed: false, } export function Header(): ReactElement { const { query, setQuery, clear, scope, setScope, includeActive, setIncludeActive, includeTrashed, setIncludeTrashed, } = useSearch() const { currentDrive } = useContext(FMContext) const currentDriveName = useMemo(() => { return currentDrive?.name || '' }, [currentDrive]) const [openFilters, setOpenFilters] = useState(false) const menuRef = useRef(null) const btnRef = useRef(null) const filtersActive = useMemo(() => { return ( scope !== DEFAULT_FILTERS.scope || includeActive !== DEFAULT_FILTERS.includeActive || includeTrashed !== DEFAULT_FILTERS.includeTrashed ) }, [scope, includeActive, includeTrashed]) const resetFilters = () => { setScope(DEFAULT_FILTERS.scope) setIncludeActive(DEFAULT_FILTERS.includeActive) setIncludeTrashed(DEFAULT_FILTERS.includeTrashed) } useEffect(() => { if (!openFilters) return const onDocClick = (e: MouseEvent) => { const t = e.target as Node if (menuRef.current?.contains(t) || btnRef.current?.contains(t)) return setOpenFilters(false) } const onEsc = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpenFilters(false) } document.addEventListener('mousedown', onDocClick) document.addEventListener('keydown', onEsc) return () => { document.removeEventListener('mousedown', onDocClick) document.removeEventListener('keydown', onEsc) } }, [openFilters]) return (
File Manager
setQuery(e.target.value)} onKeyDown={e => { if (e.key === 'Escape') clear() }} aria-label="Search files" /> {query && ( )}
{openFilters && (
Scope
Status
)}
) }