"use client"; import { FC, ReactNode, useState } from "react"; import { MovieCard } from "@/components/atoms/MovieCard"; import { Movie } from "@/types/global"; import { useGlobalStore } from "@/app/store/globalStore"; import { Dropdown } from "@/components/atoms/Dropdown"; import { useAutoAnimate } from "@formkit/auto-animate/react"; import { Button } from "@/components/atoms/Button"; import { Label } from "@/components/atoms/Label"; import { FaList } from "react-icons/fa"; import { MovieRow } from "@/components/atoms/MovieRow"; type Props = { heading?: string; icon?: ReactNode; colors?: keyof typeof colorsMap; displayType?: "grid" | "list"; overrideMovies?: Movie[]; showFilters?: boolean; filterSeen?: 0 | 1; filterFavorites?: 0 | 1; filterUpcoming?: 0 | 1; filterReleased?: 0 | 1; fluid?: boolean; showSorting?: boolean; sort?: "title" | "releaseDate" | "popularity"; sortDirection?: "asc" | "desc"; loadMore?: boolean; }; export const MovieList: FC = ({ heading, icon, colors = "white", overrideMovies, showFilters = true, filterSeen: filterSeenInitial, filterFavorites: filterFavoritesInitial, filterUpcoming: filterUpcomingInitial, filterReleased: filterReleasedInitial, fluid = false, showSorting = true, sort: sortType = "releaseDate", sortDirection = "asc", loadMore = false, displayType = "grid", }) => { const { movies: storeMovies } = useGlobalStore(); const movies = overrideMovies || storeMovies; const [display, setDisplay] = useState<"grid" | "list">(displayType); const [filter, setFilter] = useState({ seen: filterSeenInitial, favorites: filterFavoritesInitial, upcoming: filterUpcomingInitial, released: filterReleasedInitial, }); const [sort, setSort] = useState<"title" | "releaseDate" | "popularity">( sortType ); const [loaded, setLoaded] = useState(loadMore ? 8 : movies.length); const [parent] = useAutoAnimate(); const filteredMovies = movies.filter((movie) => { let result = true; const today = new Date(); if (filter.seen !== undefined) { result = movie.seen === !!filter.seen; } if (filter.favorites !== undefined) { result = result && movie.favorite === !!filter.favorites; } if (filter.upcoming !== undefined) { const releaseDate = new Date(movie.release_date); result = result && filter.upcoming ? releaseDate > today : releaseDate < today; } if (filter.released !== undefined) { const releaseDate = new Date(movie.release_date); result = result && filter.released ? releaseDate < today : releaseDate > today; } return result; }); let sortedMovies = filteredMovies.sort((a, b) => { if (sort === "title") return a.title.localeCompare(b.title); if (sort === "releaseDate") return ( new Date(b.release_date).getTime() - new Date(a.release_date).getTime() ); if (sort === "popularity") return b.popularity - a.popularity; return 0; }); sortedMovies = sortedMovies.slice(0, loaded); if (sortDirection === "desc") { sortedMovies = sortedMovies.reverse(); } const handleFilter = (key?: keyof typeof filter) => { setFilter({ seen: filterSeenInitial, favorites: filterFavoritesInitial, upcoming: filterUpcomingInitial, released: filterReleasedInitial, ...(key && { [key]: 1 }), }); }; return (
{heading && (
{icon && (
{icon}
)}

{heading}

)} {showFilters && (
{showSorting && (
setSort(value as "title")} />
)}
)} {filteredMovies.length === 0 && (

Brak filmów

)} {filteredMovies.length > 0 && (
{sortedMovies.map((movie) => display === "grid" ? ( ) : ( ) )}
)} {loadMore && filteredMovies.length > loaded && (
)}
); }; const colorsMap = { white: "bg-gradient-to-r from-white to-gray-300", yellow: "bg-gradient-to-r from-yellow-400 to-orange-400", blue: "bg-gradient-to-r from-blue-400 to-purple-400", green: "bg-gradient-to-r from-green-400 to-teal-400", red: "bg-gradient-to-r from-red-400 to-pink-400", purple: "bg-gradient-to-r from-purple-400 to-pink-400", orange: "bg-gradient-to-r from-orange-400 to-yellow-400", pink: "bg-gradient-to-r from-pink-400 to-purple-400", teal: "bg-gradient-to-r from-teal-400 to-green-400", gray: "bg-gradient-to-r from-gray-400 to-gray-400", };