import { type DiscoverItem, tmdbImageUrl } from "@umt/contracts"; import { CalendarPlus, LoaderCircle, PackageSearch, Star } from "lucide-react"; import { useState } from "react"; import { StatusBadge } from "~/components/console/status-badge.tsx"; import { Button } from "~/components/ui/button.tsx"; import { cn } from "~/lib/utils.ts"; import { itemMeta, localBadges } from "./discover-state.ts"; // 发现卡片:海报(懒加载)、评分、本地状态、标题、年份 · 类型 · 风格;点海报 / 标题进作品,下面两个动作。 export type CardAction = "open" | "subscribe" | "search"; export function coverUrl(it: Pick): string | null { return it.posterPath ? tmdbImageUrl(it.posterPath, "w342") : it.cover; } export function DiscoverCard({ item, busy, onAction, className, }: { item: DiscoverItem; /** 正在为这张卡匹配 TMDB */ busy: CardAction | null; onAction: (a: CardAction) => void; className?: string; }) { const [failed, setFailed] = useState(false); const src = failed ? null : coverUrl(item); const badges = localBadges(item); const meta = itemMeta(item); return (

{meta || "—"}

); } export function DiscoverCardSkeleton({ className }: { className?: string }) { return (
); }