import { Link } from "react-router"; import { Film, Tv } from "lucide-react"; import { useCanRequest } from "@/hooks/useCanRequest"; import { useRequestSearch } from "@/hooks/queries/useRequests"; import type { RequestMediaResult } from "@/api/types"; import { formatRequestReason, tmdbImageURL } from "@/lib/mediaRequests"; import { cn } from "@/lib/utils"; import RequestPosterCard from "./RequestPosterCard"; const DIALOG_LIMIT = 4; const GRID_LIMIT = 20; export type RequestToAddSectionProps = { variant: "dialog" | "grid"; query: string; /** True when the library search returned at least one hit. Drives header copy. */ libraryHadHits: boolean; }; export function RequestToAddSection({ variant, query, libraryHadHits }: RequestToAddSectionProps) { const { discoveryEnabled } = useCanRequest(); const search = useRequestSearch("all", query, 1, { enabled: discoveryEnabled }); if (!discoveryEnabled) return null; if (search.isError) return null; const filtered = (search.data?.results ?? []).filter( (item) => item.availability !== "available", ); if (filtered.length === 0) return null; const limit = variant === "dialog" ? DIALOG_LIMIT : GRID_LIMIT; const visible = filtered.slice(0, limit); if (variant === "dialog") { return ; } return ; } function HeaderCopy({ libraryHadHits, count }: { libraryHadHits: boolean; count: number }) { if (libraryHadHits) { return (
Request to Add {count}
); } return (
Not in your library, but you can request:
); } function DialogVariant({ items, libraryHadHits, }: { items: RequestMediaResult[]; libraryHadHits: boolean; }) { return (
    {items.map((item) => (
  • ))}
); } function DialogRow({ item }: { item: RequestMediaResult }) { const poster = tmdbImageURL(item.poster_path); const Icon = item.media_type === "series" ? Tv : Film; const requestable = item.request.requestable; const reasonLabel = !requestable ? item.request.reason ? formatRequestReason(item.request.reason) : "Blocked" : null; return (
{poster ? ( ) : (
)}
{item.title}
{item.year ? `${item.year} ยท ` : ""} {item.media_type === "series" ? "Series" : "Movie"}
{requestable ? ( Request ) : ( {reasonLabel} )} ); } function GridVariant({ items, libraryHadHits, }: { items: RequestMediaResult[]; libraryHadHits: boolean; }) { return (

{libraryHadHits ? "Request to Add" : "Not in your library, but you can request"}

{items.map((item) => ( ))}
); }