/** * MovieCard - Individual movie card component * Displays movie poster, title, and rating */ import { memo, useState } from 'react'; import Image from 'next/image'; import Link from 'next/link'; import { Card } from '@/components/ui/Card'; import { Icons } from '@/components/ui/Icon'; interface DoubanMovie { id: string; title: string; cover: string; rate: string; url: string; } interface MovieCardProps { movie: DoubanMovie; onMovieClick: (movie: DoubanMovie) => void; } export const MovieCard = memo(function MovieCard({ movie, onMovieClick }: MovieCardProps) { const [imageError, setImageError] = useState(false); const [fallbackError, setFallbackError] = useState(false); return ( { // Allow default behavior for modifier keys (new tab, etc.) if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return; e.preventDefault(); onMovieClick(movie); }} className="group cursor-pointer hover:translate-y-[-2px] transition-transform duration-200 ease-out" style={{ position: 'relative', zIndex: 1, contentVisibility: 'auto' }} onMouseEnter={(e) => (e.currentTarget.style.zIndex = '100')} onMouseLeave={(e) => (e.currentTarget.style.zIndex = '1')} >
{!imageError ? ( {movie.title} setImageError(true)} /> ) : !fallbackError ? ( {movie.title} setFallbackError(true)} /> ) : (

暂无图片

)} {movie.rate && parseFloat(movie.rate) > 0 && (
{movie.rate}
)}

{movie.title}

); });