From 0968ae25176d0ae7680c66848d6900ced14bffd7 Mon Sep 17 00:00:00 2001 From: Paulo Santos Date: Sun, 4 May 2025 12:54:39 +0100 Subject: [PATCH 1/2] MRA-6: Minor code clean up --- src/components/MovieList/MovieList.tsx | 116 ++++++++--------------- src/components/MovieList/YearPopover.tsx | 70 ++++++++++++++ 2 files changed, 111 insertions(+), 75 deletions(-) create mode 100644 src/components/MovieList/YearPopover.tsx diff --git a/src/components/MovieList/MovieList.tsx b/src/components/MovieList/MovieList.tsx index 08a6e5e..655a7c5 100644 --- a/src/components/MovieList/MovieList.tsx +++ b/src/components/MovieList/MovieList.tsx @@ -1,24 +1,25 @@ -import { FC, useEffect, useState, useCallback, useRef } from "react"; +import { FC, useEffect, useState, useCallback, useRef } from 'react'; import { Box, useTheme, Typography, CircularProgress, Popover, -} from "@mui/material"; +} from '@mui/material'; -import MovieListItem from "./MovieListItem"; -import MovieButton from "./MovieButton"; -import { DetailedMovieDTO, MovieDTO } from "../../models"; -import refreshIcon from "../../assets/refresh.svg"; -import MovieModal from "./MovieModal/MovieModal"; +import MovieListItem from './MovieListItem'; +import MovieButton from './MovieButton'; +import { DetailedMovieDTO, MovieDTO } from '../../models'; +import refreshIcon from '../../assets/refresh.svg'; +import MovieModal from './MovieModal/MovieModal'; import { getAllMoviesPaginated, getMovieById, getMoviesByTopRevenue, getTopRevenueByYear, -} from "../../api/moviesApi"; -import MovieListHeader from "./MovieListHeader"; +} from '../../api/moviesApi'; +import MovieListHeader from './MovieListHeader'; +import YearPopover from './YearPopover'; const MovieList: FC = () => { const theme = useTheme(); @@ -38,7 +39,7 @@ const MovieList: FC = () => { }; const handleOpenYearPopover = ( - event: React.MouseEvent, + event: React.MouseEvent ) => { setAnchorEl(event.currentTarget); }; @@ -63,18 +64,18 @@ const MovieList: FC = () => { try { const data = await getAllMoviesPaginated( pageToFetch !== undefined ? pageToFetch : page, - 20, + 20 ); setMovies((prev) => [...prev, ...data.content]); setPage(data.number + 1); setHasMore(!data.last); } catch (error) { - console.error("Failed to fetch movies", error); + console.error('Failed to fetch movies', error); } finally { setLoading(false); } }, - [page, loading, hasMore], + [page, loading, hasMore] ); useEffect(() => { @@ -95,8 +96,8 @@ const MovieList: FC = () => { }, [loading, hasMore, fetchMovies]); useEffect(() => { - window.addEventListener("scroll", handleScroll); - return () => window.removeEventListener("scroll", handleScroll); + window.addEventListener('scroll', handleScroll); + return () => window.removeEventListener('scroll', handleScroll); }, [handleScroll]); const handleShowTopRevenue = async (): Promise => { @@ -112,14 +113,14 @@ const MovieList: FC = () => { setMovies(rankedMovies); } catch (error) { - console.error("Failed to load top revenue movies", error); + console.error('Failed to load top revenue movies', error); } finally { setLoading(false); } }; const handleShowTopRevenueByYear = async ( - yearSelected: number, + yearSelected: number ): Promise => { setLoading(true); setIsInfiniteScroll(false); @@ -133,7 +134,7 @@ const MovieList: FC = () => { setMovies(rankedMovies); } catch (error) { - console.error("Failed to load top revenue by year", error); + console.error('Failed to load top revenue by year', error); } finally { handleCloseYearPopover(); setLoading(false); @@ -150,19 +151,28 @@ const MovieList: FC = () => { return ( <> - + Movie Ranking - + { handleOpenYearPopover(event) } /> - - - - Select a year - - - {[...Array(17)].map((_, index) => { - const year = 2016 - index; - return ( - handleShowTopRevenueByYear(year)} - sx={{ - color: theme.palette.custom.dropdownItems, - cursor: "pointer", - fontSize: "14px", - margin: "4px 0", - }} - > - {year} - - ); - })} - - - + onYearSelect={handleShowTopRevenueByYear} + /> {!isInfiniteScroll && ( -
+
{ @@ -249,7 +215,7 @@ const MovieList: FC = () => { {loading && ( - + )} @@ -276,7 +242,7 @@ const MovieList: FC = () => { )) )} {loading && ( - + )} diff --git a/src/components/MovieList/YearPopover.tsx b/src/components/MovieList/YearPopover.tsx new file mode 100644 index 0000000..4407855 --- /dev/null +++ b/src/components/MovieList/YearPopover.tsx @@ -0,0 +1,70 @@ +import { FC } from 'react'; +import { Box, Popover, Typography, useTheme } from '@mui/material'; + +interface YearPopoverProps { + anchorEl: HTMLElement | null; + onClose: () => void; + onYearSelect: (year: number) => void; +} + +const YearPopover: FC = ({ + anchorEl, + onClose, + onYearSelect, +}) => { + const theme = useTheme(); + + return ( + + + + Select a year + + + {[...Array(17)].map((_, index) => { + const year = 2016 - index; + return ( + onYearSelect(year)} + sx={{ + color: theme.palette.custom.dropdownItems, + cursor: 'pointer', + fontSize: '14px', + margin: '4px 0', + }} + > + {year} + + ); + })} + + + + ); +}; + +export default YearPopover; From eb27b9e4fc6009d5dc73098a85bda2d3cf3745e6 Mon Sep 17 00:00:00 2001 From: Paulo Santos Date: Sun, 4 May 2025 12:55:44 +0100 Subject: [PATCH 2/2] Remove unused dependacy --- src/components/MovieList/MovieList.tsx | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/components/MovieList/MovieList.tsx b/src/components/MovieList/MovieList.tsx index 655a7c5..5a89158 100644 --- a/src/components/MovieList/MovieList.tsx +++ b/src/components/MovieList/MovieList.tsx @@ -1,11 +1,5 @@ import { FC, useEffect, useState, useCallback, useRef } from 'react'; -import { - Box, - useTheme, - Typography, - CircularProgress, - Popover, -} from '@mui/material'; +import { Box, useTheme, Typography, CircularProgress } from '@mui/material'; import MovieListItem from './MovieListItem'; import MovieButton from './MovieButton';