/** * MovieGrid - Grid layout for movie cards with infinite scroll * Handles movie display and loading states */ import { MovieCard } from './MovieCard'; import { Icons } from '@/components/ui/Icon'; interface DoubanMovie { id: string; title: string; cover: string; rate: string; url: string; } interface MovieGridProps { movies: DoubanMovie[]; loading: boolean; hasMore: boolean; onMovieClick: (movie: DoubanMovie) => void; prefetchRef: React.RefObject; loadMoreRef: React.RefObject; } export function MovieGrid({ movies, loading, hasMore, onMovieClick, prefetchRef, loadMoreRef }: MovieGridProps) { if (movies.length === 0 && !loading) { return ; } return ( <>
{movies.map((movie) => ( ))}
{/* Prefetch Trigger - Earlier */} {hasMore && !loading &&
} {/* Loading Indicator */} {loading && } {/* Intersection Observer Target */} {hasMore && !loading &&
} {/* No More Content */} {!hasMore && movies.length > 0 && } ); } function MovieGridLoading() { return (

加载中...

); } function MovieGridNoMore() { return (

没有更多内容了

); } function MovieGridEmpty() { return (

暂无内容

); }