From f66360c7d208e3528389660a7c0b29ea89458206 Mon Sep 17 00:00:00 2001 From: codegrann Date: Thu, 31 Jul 2025 09:52:09 +0300 Subject: [PATCH 1/2] . --- src/hooks/useMovies.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hooks/useMovies.tsx b/src/hooks/useMovies.tsx index 1438c2b..0532836 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); From 05da015d2779a1035814934e64ddd1f2bc39d32e Mon Sep 17 00:00:00 2001 From: codegrann Date: Thu, 31 Jul 2025 10:38:38 +0300 Subject: [PATCH 2/2] replaced infinite scroll with pagination --- src/components/common/Pagination.tsx | 49 ++++++++++++++++++++++++++++ src/components/movies/MovieList.tsx | 38 ++++++++++++--------- src/hooks/useMovies.tsx | 16 +++------ 3 files changed, 76 insertions(+), 27 deletions(-) create mode 100644 src/components/common/Pagination.tsx 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 0532836..718d2d9 100644 --- a/src/hooks/useMovies.tsx +++ b/src/hooks/useMovies.tsx @@ -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, }; };