diff --git a/src/components/common/Pagination.tsx b/src/components/common/Pagination.tsx new file mode 100644 index 0000000..62a32eb --- /dev/null +++ b/src/components/common/Pagination.tsx @@ -0,0 +1,49 @@ +import React from 'react'; + +interface PaginationProps { + currentPage: number; + totalPages: number; + onPageChange: (page: number) => void; +} + +const Pagination: React.FC = ({ + currentPage, + totalPages, + onPageChange, +}) => { + const handlePrev = () => { + if (currentPage > 1) { + onPageChange(currentPage - 1); + } + }; + + const handleNext = () => { + if (currentPage < totalPages) { + onPageChange(currentPage + 1); + } + }; + + return ( +
+ + + Page {currentPage} of {totalPages} + + +
+ ); +}; + +export default Pagination; diff --git a/src/components/movies/MovieList.tsx b/src/components/movies/MovieList.tsx index a2f37e7..b8ac42c 100644 --- a/src/components/movies/MovieList.tsx +++ b/src/components/movies/MovieList.tsx @@ -1,5 +1,6 @@ import React from 'react'; import MovieCard from './MovieCard'; +import Pagination from '../common/Pagination'; // Import Pagination import { useMovies } from '../../hooks/useMovies'; import { Movie } from '../../types'; @@ -12,10 +13,19 @@ const MovieListContent: React.FC<{ movies: Movie[]; loading: boolean; error: string | null; - hasMore: boolean; - loadMore: () => void; + page: number; + totalPages: number; + handlePageChange: (page: number) => void; onMovieSelect: (id: number) => void; -}> = ({ movies, loading, error, hasMore, loadMore, onMovieSelect }) => { +}> = ({ + movies, + loading, + error, + page, + totalPages, + handlePageChange, + onMovieSelect, +}) => { if (loading && movies.length === 0) { return

Loading movies...

; } @@ -35,16 +45,12 @@ const MovieListContent: React.FC<{ ))} - {hasMore && ( -
- -
+ {totalPages > 1 && ( + )} ); @@ -58,14 +64,14 @@ const MovieList: React.FC = ({ if (moviesProp) { // If movies are passed as a prop, render them directly. - // We can create dummy values for the other props since they won't be used. return ( {}} + page={1} + totalPages={1} + handlePageChange={() => {}} onMovieSelect={onMovieSelect} /> ); diff --git a/src/hooks/useMovies.tsx b/src/hooks/useMovies.tsx index 1438c2b..718d2d9 100644 --- a/src/hooks/useMovies.tsx +++ b/src/hooks/useMovies.tsx @@ -28,8 +28,8 @@ export const useMovies = () => { try { const url = query ? `${API_BASE}/movies/search?query=${encodeURIComponent( - query - )}&page=${pageNum}` + query + )}&page=${pageNum}` : `${API_BASE}/movies/popular?page=${pageNum}`; const res = await API.get(url); @@ -42,12 +42,7 @@ export const useMovies = () => { ); } - setMovies(prevMovies => { - if (pageNum === 1) return newMovies; - const existingIds = new Set(prevMovies.map(m => m.id)); - const uniqueNewMovies = newMovies.filter(m => !existingIds.has(m.id)); - return [...prevMovies, ...uniqueNewMovies]; - }); + setMovies(newMovies); setPage(res.data.page); setTotalPages(res.data.total_pages); } catch (e) { @@ -64,9 +59,9 @@ export const useMovies = () => { fetchMovies(1, searchQuery); }, [fetchMovies, searchQuery, selectedGenre]); - const loadMore = () => { - if (loading || page >= totalPages) return; - fetchMovies(page + 1, searchQuery); + const handlePageChange = (newPage: number) => { + if (loading || newPage < 1 || newPage > totalPages) return; + fetchMovies(newPage, searchQuery); }; return { @@ -75,9 +70,8 @@ export const useMovies = () => { error, searchQuery, setSearchQuery, - loadMore, page, totalPages, - hasMore: page < totalPages, + handlePageChange, }; };