75 lines
2.3 KiB
TypeScript
75 lines
2.3 KiB
TypeScript
"use client"
|
|
|
|
import { useMemo } from "react"
|
|
import type { DriveFileInfo } from "@/lib/api/types"
|
|
import { useDriveFilterCorpus } from "@/lib/api/hooks/use-drive-queries"
|
|
import {
|
|
applyDriveFilters,
|
|
buildDriveFolderPathsWithMatches,
|
|
} from "@/lib/drive/drive-filters"
|
|
import { sortDriveItems } from "@/lib/drive/drive-sort"
|
|
import type { DriveFolderPlacement, DriveSortField } from "@/lib/stores/drive-settings-store"
|
|
import {
|
|
driveFiltersActive,
|
|
type DriveFiltersSnapshot,
|
|
} from "@/lib/stores/drive-filters-store"
|
|
import { filterHiddenDriveSidecars } from "@/lib/drive/drive-hidden-files"
|
|
|
|
export function useDriveFilteredItems(
|
|
items: DriveFileInfo[],
|
|
filters: DriveFiltersSnapshot,
|
|
sort: {
|
|
sortField: DriveSortField
|
|
sortDir: "asc" | "desc"
|
|
folderPlacement: DriveFolderPlacement
|
|
},
|
|
options?: {
|
|
/** When true, fetch recursive file index under scopePath for folder pruning. */
|
|
recursiveCorpus?: boolean
|
|
scopePath?: string
|
|
}
|
|
) {
|
|
const scopePath = options?.scopePath ?? "/"
|
|
const filtersActive = driveFiltersActive(filters)
|
|
const needsRecursiveCorpus = Boolean(options?.recursiveCorpus && filtersActive)
|
|
const corpusQuery = useDriveFilterCorpus(scopePath, needsRecursiveCorpus)
|
|
|
|
const visibleItems = useMemo(() => filterHiddenDriveSidecars(items), [items])
|
|
|
|
const filteredItems = useMemo(() => {
|
|
if (!filtersActive) {
|
|
return sortDriveItems(visibleItems, sort)
|
|
}
|
|
|
|
const filterOptions = needsRecursiveCorpus
|
|
? corpusQuery.data?.files
|
|
? {
|
|
folderKeepPaths: buildDriveFolderPathsWithMatches(
|
|
filterHiddenDriveSidecars(corpusQuery.data.files),
|
|
filters,
|
|
scopePath
|
|
),
|
|
}
|
|
: corpusQuery.isError
|
|
? { matchCorpus: visibleItems, scopePath }
|
|
: undefined
|
|
: { matchCorpus: visibleItems, scopePath }
|
|
|
|
const filtered = applyDriveFilters(visibleItems, filters, filterOptions)
|
|
return sortDriveItems(filtered, sort)
|
|
}, [
|
|
visibleItems,
|
|
filters,
|
|
sort,
|
|
filtersActive,
|
|
needsRecursiveCorpus,
|
|
corpusQuery.data?.files,
|
|
corpusQuery.isError,
|
|
scopePath,
|
|
])
|
|
|
|
const corpusLoading = needsRecursiveCorpus && corpusQuery.isLoading && !corpusQuery.data
|
|
|
|
return { filteredItems, corpusLoading, filtersActive }
|
|
}
|