diff --git a/src/components/Files/FileFilters.tsx b/src/components/Files/FileFilters.tsx index 28e30e3..412fb94 100644 --- a/src/components/Files/FileFilters.tsx +++ b/src/components/Files/FileFilters.tsx @@ -6,27 +6,19 @@ import { Check } from "lucide-react"; type Props = { files: CodexDataContent[]; onFilterToggle: (filter: string) => void; + selected: string[]; }; -const archiveMimetypes = [ - "application/zip", - "application/x-rar-compressed", - "application/x-tar", - "application/gzip", - "application/x-7z-compressed", - "application/gzip", // for .tar.gz - "application/x-bzip2", - "application/x-xz", -]; - -export function FilterFilters({ files, onFilterToggle }: Props) { +export function FilterFilters({ selected, files, onFilterToggle }: Props) { const filters = Array.from( new Set( - files.map((file) => - archiveMimetypes.includes(file.manifest.mimetype) - ? "archive" - : Files.type(file.manifest.mimetype) - ) + files + .filter((f) => f.manifest.mimetype !== "") + .map((file) => + Files.isArchive(file.manifest.mimetype) + ? "archive" + : Files.type(file.manifest.mimetype) + ) ) ); @@ -35,7 +27,7 @@ export function FilterFilters({ files, onFilterToggle }: Props) { key={type} className={classnames( ["files-filter"], - ["files-filter--active", filters.includes(type)] + ["files-filter--active", !!filters.find((f) => selected.includes(f))] )} onClick={() => onFilterToggle(type)}> {type} diff --git a/src/components/Files/Files.css b/src/components/Files/Files.css index 8506c30..0817d20 100644 --- a/src/components/Files/Files.css +++ b/src/components/Files/Files.css @@ -13,6 +13,12 @@ } .files-fileMeta { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.files-fileMeta-cid { word-break: break-all; } diff --git a/src/components/Files/Files.tsx b/src/components/Files/Files.tsx index 104cd98..18c2d01 100644 --- a/src/components/Files/Files.tsx +++ b/src/components/Files/Files.tsx @@ -33,7 +33,7 @@ export function Files() { const [error, setError] = useState(""); const [details, setDetails] = useState(null); const [sortFn, setSortFn] = useState(null); - const [filters, setFilters] = useState([]); + const [selectedFilters, setSelectedFilters] = useState([]); useEffect(() => { WebStorage.folders.list().then((items) => setFolders(items)); @@ -191,9 +191,9 @@ export function Files() { }; const onToggleFilter = (filter: string) => - filters.includes(filter) - ? setFilters(filters.filter((f) => f !== filter)) - : setFilters([...filters, filter]); + selectedFilters.includes(filter) + ? setSelectedFilters(selectedFilters.filter((f) => f !== filter)) + : setSelectedFilters([...selectedFilters, filter]); tabs.unshift({ label: "All files", @@ -214,7 +214,10 @@ export function Files() { const filtered = items.filter( (item) => - filters.length === 0 || filters.includes(F.type(item.manifest.mimetype)) + selectedFilters.length === 0 || + selectedFilters.includes(F.type(item.manifest.mimetype)) || + (selectedFilters.includes("archive") && + F.isArchive(item.manifest.mimetype)) ); const sorted = sortFn ? [...filtered].sort(sortFn) : filtered; @@ -264,11 +267,15 @@ export function Files() {
- +
- +
diff --git a/src/utils/files.ts b/src/utils/files.ts index 44dd6ec..d2bf24c 100644 --- a/src/utils/files.ts +++ b/src/utils/files.ts @@ -1,3 +1,14 @@ +const archiveMimetypes = [ + "application/zip", + "application/x-rar-compressed", + "application/x-tar", + "application/gzip", + "application/x-7z-compressed", + "application/gzip", // for .tar.gz + "application/x-bzip2", + "application/x-xz", +]; + export const Files = { isImage(type: string) { return type.startsWith("image"); @@ -5,6 +16,9 @@ export const Files = { type(mimetype: string) { const [type] = mimetype.split("/") return type + }, + isArchive(mimetype: string) { + return archiveMimetypes.includes(mimetype) } };