/**
* 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 ? (
setImageError(true)}
/>
) : !fallbackError ? (
setFallbackError(true)}
/>
) : (
)}
{movie.rate && parseFloat(movie.rate) > 0 && (
{movie.rate}
)}
{movie.title}
);
});