import { useQuery } from "@tanstack/react-query"; import { Search } from "lucide-react"; import { useState, type FormEvent } from "react"; import { MediaCard } from "@/components/MediaCard"; import { Button, EmptyState, Spinner, inputClass } from "@/components/ui"; import { api } from "@/lib/api"; import { cn } from "@/lib/cn"; import type { MediaItem, Paginated } from "@/lib/types"; const sortOptions = [ { value: "-created_at", label: "Newest first" }, { value: "created_at", label: "Oldest first" }, { value: "-size", label: "Largest first" }, { value: "size", label: "Smallest first" }, { value: "name", label: "Name A–Z" }, { value: "-name", label: "Name Z–A" }, ]; const perPageOptions = [24, 48, 96]; const ratingFilters = [ { value: "s", label: "Safe", active: "border-ctp-green/40 bg-ctp-green/15 text-ctp-green", }, { value: "q", label: "Questionable", active: "border-ctp-peach/40 bg-ctp-peach/15 text-ctp-peach", }, { value: "e", label: "Explicit", active: "border-ctp-red/40 bg-ctp-red/15 text-ctp-red", }, ]; export default function LibraryPage() { const [searchInput, setSearchInput] = useState(""); const [search, setSearch] = useState(""); const [ratings, setRatings] = useState([]); const [ordering, setOrdering] = useState("-created_at"); const [perPage, setPerPage] = useState(48); const [page, setPage] = useState(1); const query = useQuery({ queryKey: ["files", { search, ratings, ordering, perPage, page }], queryFn: () => { const params = new URLSearchParams({ page: String(page), per_page: String(perPage), ordering, }); if (search) params.set("search", search); if (ratings.length) params.set("rating", ratings.join(",")); return api>(`/api/files/?${params.toString()}`); }, }); const pageCount = query.data ? Math.max(1, Math.ceil(query.data.count / perPage)) : 1; function applySearch(event: FormEvent) { event.preventDefault(); setPage(1); setSearch(searchInput.trim()); } function toggleRating(value: string) { setPage(1); setRatings((current) => current.includes(value) ? current.filter((rating) => rating !== value) : [...current, value], ); } function clearFilters() { setSearchInput(""); setSearch(""); setRatings([]); setPage(1); } return (

{query.data ? `${query.data.count} item${query.data.count === 1 ? "" : "s"}` : "…"}

{pageCount > 1 ? (

Page {page} / {pageCount}

) : null}
{query.isPending ? (
) : query.isError || !query.data ? ( ) : query.data.results.length === 0 ? ( ) : (
{query.data.results.map((item) => ( ))}
)} {pageCount > 1 ? (
{page} / {pageCount}
) : null}
); }