diff --git a/src/app/globals.css b/src/app/globals.css index ad1c5c9..7c88f2d 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -43,3 +43,7 @@ width: calc(--value(integer) / 0.12 * 1%); padding: 0 15px; } + +@utility grid-auto-cols-* { + grid-template-columns: repeat(auto-fill, --value(integer)); +} diff --git a/src/app/page.tsx b/src/app/page.tsx index 155308a..057956d 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -5,7 +5,15 @@ export default async function Home() { return (
- + + + +
); } diff --git a/src/components/molecules/MovieList/index.tsx b/src/components/molecules/MovieList/index.tsx index 1b97dd4..ff389e4 100644 --- a/src/components/molecules/MovieList/index.tsx +++ b/src/components/molecules/MovieList/index.tsx @@ -1,21 +1,92 @@ "use client"; +import { FC, useState } from "react"; import { MovieCard } from "@/components/atoms/MovieCard"; import { useGlobalStore } from "@/app/store/globalStore"; -export const MovieList = () => { +type Props = { + heading: string; + onlySeen?: boolean; + onlyFavorites?: boolean; + onlyUpcoming?: boolean; + onlyReleased?: boolean; + + showFilters?: boolean; + sort?: "title" | "releaseDate" | "popularity"; + sortDirection?: "asc" | "desc"; +}; + +export const MovieList: FC = ({ + heading, + onlyFavorites, + onlySeen, + onlyUpcoming, + onlyReleased, + showFilters = false, + sort = "title", + sortDirection = "asc", +}) => { + const [filter, setFilter] = useState<"title" | "releaseDate" | "popularity">( + sort + ); const { movies } = useGlobalStore(); + const filteredMovies = movies.filter((movie) => { + if (onlySeen) return movie.seen === 1; + if (onlyFavorites) return movie.favorite === 1; + if (onlyUpcoming) return new Date(movie.releaseDate) > new Date(); + if (onlyReleased) return new Date(movie.releaseDate) < new Date(); + return true; + }); + + let sortedMovies = filteredMovies.sort((a, b) => { + if (filter === "title") return a.title.localeCompare(b.title); + if (filter === "releaseDate") + return ( + new Date(b.releaseDate).getTime() - new Date(a.releaseDate).getTime() + ); + if (filter === "popularity") return b.popularity - a.popularity; + return 0; + }); + + if (sortDirection === "desc") { + sortedMovies = sortedMovies.reverse(); + } + + const handleSort = (sort: "title" | "releaseDate" | "popularity") => { + setFilter(sort); + }; + return ( -
+
-

My Watchlist

- {movies.length === 0 && ( +
+
+

{heading}

+
+ {showFilters && ( +
+ +
+ )} +
+ {filteredMovies.length === 0 && (

No movies found

)} -
- {movies - .sort((a, b) => a.title.localeCompare(b.title)) - .map((movie) => ( + {filteredMovies.length > 0 && ( +
+ {sortedMovies.map((movie) => ( { favorite={movie.favorite === 1} /> ))} -
+
+ )}
); diff --git a/src/components/molecules/SearchMovies/index.tsx b/src/components/molecules/SearchMovies/index.tsx index 209b653..2fb2289 100644 --- a/src/components/molecules/SearchMovies/index.tsx +++ b/src/components/molecules/SearchMovies/index.tsx @@ -14,7 +14,7 @@ export const SearchMovies = () => { }; return ( -
+