import { useState } from "react"; import { Check } from "lucide-react"; import ViewTransitionLink from "@/components/ViewTransitionLink"; import type { BrowseItem } from "@/api/types"; import { decodeThumbhash } from "@/lib/thumbhash"; import { timeAgo } from "@/lib/timeAgo"; import MediaItemMenu from "@/components/MediaItemMenu"; import CardOverlays from "@/components/overlays/CardOverlays"; import { overlayDataFromBrowseItem, type CardOverlayPrefs } from "@/lib/overlays"; import { buildEpisodeCardLabels } from "@/lib/episodeCardLabels"; function SortMeta({ item, sortField }: { item: BrowseItem; sortField?: string }) { const episodeLabels = buildEpisodeCardLabels(item); if (episodeLabels) { return <>{episodeLabels.episodeCode}; } const defaultLabel = [item.year || "", item.type === "series" ? "Series" : ""] .filter(Boolean) .join(" · "); switch (sortField) { case "added_at": case "recently_added": { const ago = item.added_at ? timeAgo(item.added_at) : null; return <>{ago ?? defaultLabel}; } case "rating_imdb": return item.rating_imdb != null ? ( <> ★ {item.rating_imdb.toFixed(1)} / 10 ) : ( <>{defaultLabel} ); case "release_date": return item.release_date ? ( <> {new Date(item.release_date).toLocaleDateString(undefined, { year: "numeric", month: "short", day: "numeric", })} ) : ( <>{defaultLabel} ); case "last_air_date": return item.last_air_date ? ( <> {new Date(item.last_air_date).toLocaleDateString(undefined, { year: "numeric", month: "short", day: "numeric", })} ) : ( <>{defaultLabel} ); default: return <>{defaultLabel}; } } export default function ItemCard({ item, libraryId, sortField, overlayPrefs, selectionMode = false, selected = false, onToggleSelect, }: { item: BrowseItem; libraryId?: number; sortField?: string; overlayPrefs?: CardOverlayPrefs | null; selectionMode?: boolean; selected?: boolean; onToggleSelect?: (item: BrowseItem) => void; }) { const [loaded, setLoaded] = useState(false); const thumbhashUrl = item.poster_thumbhash ? decodeThumbhash(item.poster_thumbhash) : ""; const itemHref = `/item/${item.content_id}${libraryId ? `?libraryId=${libraryId}` : ""}`; const episodeLabels = buildEpisodeCardLabels(item); const displayTitle = episodeLabels ? episodeLabels.seriesTitle : item.title; return (
{item.poster_url ? ( {displayTitle} setLoaded(true)} /> ) : (
{displayTitle || "No Poster"}
)}
{item.status === "pending" && ( Scanning )} {item.status === "unmatched" && ( Unmatched )} {item.status === "ambiguous" && ( Ambiguous )} {item.status === "matched" && overlayPrefs && ( )}
{selectionMode && onToggleSelect && ( )}
{displayTitle}
{episodeLabels?.episodeTitle ? (
{episodeLabels.episodeTitle}
) : null}
); }