import { useEffect, useRef, useState, type ReactNode } from 'react' import { Link } from 'react-router-dom' import { motion } from 'framer-motion' import { Film, Play, Layers, Star } from 'lucide-react' import { imageURL } from '../api/client' import type { Media } from '../types' export const MediaCard = ({ media, progress, count, rating, linkTo, onClick, actions, }: { media: Media progress?: number count?: number rating?: number linkTo?: string onClick?: () => void actions?: ReactNode }) => { const ref = useRef(null) const href = linkTo ?? `/media/${media.id}` const [posterFit, setPosterFit] = useState<'cover' | 'contain'>('cover') const posterSrc = imageURL(media.poster_url, media.updated_at) const displayRating = rating ?? media.rating const versionCount = media.versions?.length ?? 0 useEffect(() => { setPosterFit('cover') }, [media.poster_url, media.updated_at]) const card = ( {/* Poster Wrapper */}
{media.poster_url ? ( <> {posterFit === 'contain' && ( )} {media.title} { const img = event.currentTarget setPosterFit(img.naturalWidth > img.naturalHeight ? 'contain' : 'cover') }} className={ 'relative block h-full w-full object-center transition-transform duration-700 ease-out group-hover:scale-105 ' + (posterFit === 'contain' ? 'object-contain p-1.5' : 'object-cover') } referrerPolicy="no-referrer" /> ) : (
No Poster
)} {/* Episode count badge */} {count !== undefined && count > 1 && ( {count} 集 )} {count === undefined && versionCount > 1 && ( {versionCount} 版本 )} {/* Rating Badge */} {displayRating > 0 && ( {displayRating.toFixed(1)} )} {/* Premium Hover Overlay */}
立即观影

{media.overview || "暂无简介内容"}

{/* Progress Bar overlay */} {progress !== undefined && progress > 0 && progress < 1 && (
)}
{/* Media Metadata Info */}

{media.title}

{media.year > 0 ? media.year : "未知年份"} {media.video_codec && ( {media.video_codec} )}
) if (onClick) { return (
{actions && (
{actions}
)}
) } if (actions) { return (
{card}
{actions}
) } return ( {card} ) }