From 452be796f0163357e6e47113deed3e00ce5aba32 Mon Sep 17 00:00:00 2001 From: Norbert Maciaszek Date: Fri, 22 Aug 2025 19:30:17 +0200 Subject: [PATCH] feat: update layout and MovieCard components to enhance styling and functionality; replace layout system with a unified MovieCard design, adjust display types in Odkrywaj and GenrePage, and improve pagination button styles --- src/app/layout.tsx | 2 +- src/app/odkrywaj/gatunek/[id]/page.tsx | 6 +- src/app/odkrywaj/page.tsx | 8 +- src/components/atoms/MovieCard/index.tsx | 209 ++++++++++++++---- .../atoms/MovieCard/layouts/AuroraLayout.tsx | 207 ----------------- .../atoms/MovieCard/layouts/DefaultLayout.tsx | 109 --------- .../atoms/MovieCard/layouts/MinimalLayout.tsx | 141 ------------ .../atoms/MovieCard/layouts/ZeusLayout.tsx | 166 -------------- .../atoms/MovieCard/layouts/index.ts | 4 - src/components/atoms/Pagination/index.tsx | 2 + src/components/molecules/MovieList/index.tsx | 2 +- .../molecules/SearchMovies/index.tsx | 2 + 12 files changed, 184 insertions(+), 674 deletions(-) delete mode 100644 src/components/atoms/MovieCard/layouts/AuroraLayout.tsx delete mode 100644 src/components/atoms/MovieCard/layouts/DefaultLayout.tsx delete mode 100644 src/components/atoms/MovieCard/layouts/MinimalLayout.tsx delete mode 100644 src/components/atoms/MovieCard/layouts/ZeusLayout.tsx delete mode 100644 src/components/atoms/MovieCard/layouts/index.ts diff --git a/src/app/layout.tsx b/src/app/layout.tsx index b65d589..eee44e5 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -26,7 +26,7 @@ export default async function RootLayout({ -
{children}
+
{children}
diff --git a/src/app/odkrywaj/gatunek/[id]/page.tsx b/src/app/odkrywaj/gatunek/[id]/page.tsx index ace327a..91c68e3 100644 --- a/src/app/odkrywaj/gatunek/[id]/page.tsx +++ b/src/app/odkrywaj/gatunek/[id]/page.tsx @@ -96,7 +96,7 @@ export default async function GenrePage({ params }: PageProps) { icon={} colors="green" showFilters={false} - displayType="list" + overrideDisplayType="list" /> @@ -111,7 +111,7 @@ export default async function GenrePage({ params }: PageProps) { colors="blue" showFilters={false} sortDirection="desc" - displayType="list" + overrideDisplayType="list" /> )} @@ -125,7 +125,7 @@ export default async function GenrePage({ params }: PageProps) { icon={} colors="red" showFilters={false} - displayType="list" + overrideDisplayType="list" /> )} diff --git a/src/app/odkrywaj/page.tsx b/src/app/odkrywaj/page.tsx index 7362a7a..4eef714 100644 --- a/src/app/odkrywaj/page.tsx +++ b/src/app/odkrywaj/page.tsx @@ -49,7 +49,7 @@ export default async function Home() { icon={} colors="blue" showFilters={false} - displayType="list" + overrideDisplayType="grid" /> @@ -61,7 +61,7 @@ export default async function Home() { icon={} colors="blue" showFilters={false} - displayType="list" + overrideDisplayType="grid" /> @@ -73,7 +73,7 @@ export default async function Home() { icon={} colors="red" showFilters={false} - displayType="list" + overrideDisplayType="grid" /> @@ -85,7 +85,7 @@ export default async function Home() { icon={} colors="green" showFilters={false} - displayType="list" + overrideDisplayType="grid" /> diff --git a/src/components/atoms/MovieCard/index.tsx b/src/components/atoms/MovieCard/index.tsx index 8455ca5..11279ef 100644 --- a/src/components/atoms/MovieCard/index.tsx +++ b/src/components/atoms/MovieCard/index.tsx @@ -2,21 +2,18 @@ import { FC } from "react"; import { useGlobalStore } from "@/app/store/globalStore"; import { Movie } from "@/types/global"; -import { - AuroraLayout, - MinimalLayout, - ZeusLayout, - DefaultLayout, -} from "./layouts"; +import { FaFire, FaPlusCircle, FaTrash } from "react-icons/fa"; +import Link from "next/link"; +import { RxEyeOpen } from "react-icons/rx"; +import { MdFavorite } from "react-icons/md"; +import { RiCalendarCheckLine, RiCalendarScheduleLine } from "react-icons/ri"; type Props = Movie & { - layout?: "default" | "zeus" | "minimal" | "aurora"; showDayCounter?: boolean; simpleToggle?: boolean; }; export const MovieCard: FC = ({ - layout = "aurora", showDayCounter = true, simpleToggle = false, ...movie @@ -27,14 +24,21 @@ export const MovieCard: FC = ({ deleteMovie: deleteMovieFromStore, updateMovie: updateMovieInStore, } = useGlobalStore(); + const { vote_average, popularity, poster_path, title, overview } = movie; const { id } = movie; const alreadyInStore = movies.find((m) => m.id === id); + const seen = alreadyInStore?.seen || movie.seen; + const favorite = alreadyInStore?.favorite || movie.favorite; + const isReleased = new Date(movie.release_date) < new Date(); - const iconSize = 48; - const buttonClass = - "p-4 text-sm transition-colors cursor-pointer text-center group/toggle"; + const scoreColor = + vote_average >= 8 + ? "from-emerald-400 to-teal-400" + : vote_average >= 6 + ? "from-yellow-400 to-orange-400" + : "from-red-400 to-pink-400"; const handleAdd = () => { addMovieToStore(movie); @@ -65,32 +69,161 @@ export const MovieCard: FC = ({ ) ); - const commonProps = { - ...movie, - alreadyInStore, - isReleased, - handleAdd, - handleRemove, - handleSeen, - handleFavorite, - daysSinceRelease, - releaseDate, - showDayCounter, - simpleToggle, - buttonClass, - iconSize, - favorite: alreadyInStore?.favorite || movie.favorite, - seen: alreadyInStore?.seen || movie.seen, - }; + return ( +
+ {/* Main card container */} +
+ {/* Image section with sophisticated overlay */} +
+ + {title} + - switch (layout) { - case "aurora": - return ; - case "minimal": - return ; - case "zeus": - return ; - default: - return ; - } + {/* Gradient overlays for depth */} +
+ + {/* Floating rating badge */} + {!!vote_average && ( +
+
+
+ + {vote_average.toFixed(1)} +
+
+
+ )} + + {/* Popularity indicator */} +
+
+ + + {Math.round(popularity)} + +
+
+ + {/* Days left to release */} + {(!isReleased || daysSinceRelease < 35) && ( +
+

+ {isReleased && + daysSinceRelease < 35 && + `od ${daysSinceRelease} dni`} + {!isReleased && `za ${daysSinceRelease} dni`} +

+
+ )} + + {/* Status indicators */} +
+ {alreadyInStore && !simpleToggle && ( + <> +
+ +
+
+ +
+ + )} + {!alreadyInStore && ( +
+ +
+ )} + {alreadyInStore && ( +
+ +
+ )} +
+
+ + {/* Content section with glowing effects */} +
+
+ +

+ {title} +

+

+ {overview} +

+ +
+ + {/* Bottom section with enhanced styling */} +
+
+
+ {isReleased ? ( + + ) : ( + + )} + + {releaseDate.toLocaleDateString("pl-PL", { + day: "numeric", + month: "short", + year: "numeric", + })} + +
+
+ +
+ {alreadyInStore && ( +
+ {seen && ( +
+ )} + {favorite && ( +
+ )} +
+ )} +
+
+
+
+
+ ); }; diff --git a/src/components/atoms/MovieCard/layouts/AuroraLayout.tsx b/src/components/atoms/MovieCard/layouts/AuroraLayout.tsx deleted file mode 100644 index 941e112..0000000 --- a/src/components/atoms/MovieCard/layouts/AuroraLayout.tsx +++ /dev/null @@ -1,207 +0,0 @@ -"use client"; -import { FC, useState } from "react"; -import { MdFavorite } from "react-icons/md"; -import { RxEyeOpen } from "react-icons/rx"; -import { FaFire, FaTrash, FaPlusCircle } from "react-icons/fa"; -import { RiCalendarCheckLine, RiCalendarScheduleLine } from "react-icons/ri"; -import { Movie } from "@/types/global"; -import Link from "next/link"; - -interface AuroraLayoutProps extends Movie { - showDayCounter?: boolean; - simpleToggle?: boolean; - alreadyInStore?: Movie | undefined; - isReleased: boolean; - handleAdd: () => void; - handleRemove: () => void; - handleSeen: () => void; - handleFavorite: () => void; - daysSinceRelease: number; - releaseDate: Date; -} - -export const AuroraLayout: FC = ({ - id, - title, - overview, - popularity, - release_date, - poster_path, - vote_average, - seen, - favorite, - alreadyInStore, - isReleased, - handleAdd, - handleRemove, - handleSeen, - handleFavorite, - daysSinceRelease, - releaseDate, - simpleToggle, -}) => { - const scoreColor = - vote_average >= 8 - ? "from-emerald-400 to-teal-400" - : vote_average >= 6 - ? "from-yellow-400 to-orange-400" - : "from-red-400 to-pink-400"; - - return ( -
- {/* Main card container */} -
- {/* Image section with sophisticated overlay */} -
- - {title} - - - {/* Gradient overlays for depth */} -
- - {/* Floating rating badge */} - {!!vote_average && ( -
-
-
- - {vote_average.toFixed(1)} -
-
-
- )} - - {/* Popularity indicator */} -
-
- - - {Math.round(popularity)} - -
-
- - {/* Days left to release */} - {(!isReleased || daysSinceRelease < 35) && ( -
-

- {isReleased && - daysSinceRelease < 35 && - `od ${daysSinceRelease} dni`} - {!isReleased && `za ${daysSinceRelease} dni`} -

-
- )} - - {/* Status indicators */} -
- {alreadyInStore && !simpleToggle && ( - <> -
- -
-
- -
- - )} - {!alreadyInStore && ( -
- -
- )} - {alreadyInStore && ( -
- -
- )} -
-
- - {/* Content section with glowing effects */} -
-
- -

- {title} -

-

- {overview} -

- -
- - {/* Bottom section with enhanced styling */} -
-
-
- {isReleased ? ( - - ) : ( - - )} - - {releaseDate.toLocaleDateString("pl-PL", { - day: "numeric", - month: "short", - year: "numeric", - })} - -
-
- -
- {alreadyInStore && ( -
- {seen && ( -
- )} - {favorite && ( -
- )} -
- )} -
-
-
-
-
- ); -}; diff --git a/src/components/atoms/MovieCard/layouts/DefaultLayout.tsx b/src/components/atoms/MovieCard/layouts/DefaultLayout.tsx deleted file mode 100644 index 0b52771..0000000 --- a/src/components/atoms/MovieCard/layouts/DefaultLayout.tsx +++ /dev/null @@ -1,109 +0,0 @@ -"use client"; -import { FC } from "react"; -import { ReadMore } from "../../ReadMore"; -import { Movie } from "@/types/global"; - -interface DefaultLayoutProps extends Movie { - showDayCounter?: boolean; - simpleToggle?: boolean; - alreadyInStore?: Movie | undefined; - isReleased: boolean; - handleAdd: () => void; - handleRemove: () => void; - handleSeen: () => void; - handleFavorite: () => void; - buttonClass: string; -} - -export const DefaultLayout: FC = ({ - title, - overview, - popularity, - release_date, - poster_path, - alreadyInStore, - isReleased, - handleAdd, - handleRemove, - handleSeen, - handleFavorite, - buttonClass, -}) => { - return ( -
-
-
-
-
-
-
-

- {title} -

-
- -
-
-
-
-
Popularity:
-
{popularity}
-
-
-
Release date:
-
{release_date}
-
-
-
-
-
- {!alreadyInStore && ( - - )} - {alreadyInStore && ( - <> - {isReleased && ( - - )} - - - - - - )} -
-
- -
-
-
- ); -}; diff --git a/src/components/atoms/MovieCard/layouts/MinimalLayout.tsx b/src/components/atoms/MovieCard/layouts/MinimalLayout.tsx deleted file mode 100644 index e2990d5..0000000 --- a/src/components/atoms/MovieCard/layouts/MinimalLayout.tsx +++ /dev/null @@ -1,141 +0,0 @@ -"use client"; -import { FC } from "react"; -import { ReadMore } from "../../ReadMore"; -import { MdFavorite, MdFavoriteBorder } from "react-icons/md"; -import { RxEyeOpen, RxEyeClosed } from "react-icons/rx"; -import { IoMdRemoveCircleOutline } from "react-icons/io"; -import { Movie } from "@/types/global"; - -interface MinimalLayoutProps extends Movie { - showDayCounter?: boolean; - simpleToggle?: boolean; - alreadyInStore?: Movie | undefined; - isReleased: boolean; - handleAdd: () => void; - handleRemove: () => void; - handleSeen: () => void; - handleFavorite: () => void; - releaseDate: Date; -} - -export const MinimalLayout: FC = ({ - title, - overview, - poster_path, - vote_average, - seen, - favorite, - alreadyInStore, - isReleased, - handleAdd, - handleRemove, - handleSeen, - handleFavorite, - releaseDate, -}) => { - return ( -
-
- {title} - - {/* Rating badge */} - {!!vote_average && ( -
- - ★ {vote_average.toFixed(1)} - -
- )} - - {/* Action overlay */} -
- {!alreadyInStore ? ( - - ) : ( -
- {isReleased && ( - - )} - - -
- )} -
-
- - {/* Content section */} -
-
-

- {title} -

-
- -
-
- -
- - {releaseDate.toLocaleDateString("pl-PL", { - day: "numeric", - month: "long", - year: "numeric", - })} - - {alreadyInStore && ( -
- {seen && ( -
- )} - {favorite && ( -
- )} -
- )} -
-
-
- ); -}; diff --git a/src/components/atoms/MovieCard/layouts/ZeusLayout.tsx b/src/components/atoms/MovieCard/layouts/ZeusLayout.tsx deleted file mode 100644 index 880325c..0000000 --- a/src/components/atoms/MovieCard/layouts/ZeusLayout.tsx +++ /dev/null @@ -1,166 +0,0 @@ -"use client"; -import { FC } from "react"; -import { ReadMore } from "../../ReadMore"; -import { MdFavorite, MdFavoriteBorder, MdOutlinePostAdd } from "react-icons/md"; -import { RxEyeOpen, RxEyeClosed } from "react-icons/rx"; -import { IoMdRemoveCircleOutline } from "react-icons/io"; -import { FaFire } from "react-icons/fa"; -import { RiCalendarCheckLine, RiCalendarScheduleLine } from "react-icons/ri"; -import { Movie } from "@/types/global"; - -interface ZeusLayoutProps extends Movie { - showDayCounter?: boolean; - simpleToggle?: boolean; - alreadyInStore?: Movie | undefined; - isReleased: boolean; - handleAdd: () => void; - handleRemove: () => void; - handleSeen: () => void; - handleFavorite: () => void; - daysSinceRelease: number; - releaseDate: Date; - buttonClass: string; - iconSize: number; -} - -export const ZeusLayout: FC = ({ - title, - overview, - popularity, - poster_path, - vote_average, - seen, - favorite, - showDayCounter, - simpleToggle, - alreadyInStore, - isReleased, - handleAdd, - handleRemove, - handleSeen, - handleFavorite, - daysSinceRelease, - releaseDate, - buttonClass, - iconSize, -}) => { - return ( -
-
- - - {!alreadyInStore && ( - - )} - {alreadyInStore && ( -
- <> - {isReleased && !simpleToggle && ( - - )} - - {!simpleToggle && ( - - )} - - - -
- )} -
- -

- - {popularity} -

-
-
-
- {!!vote_average && ( -

- - {vote_average.toFixed(1)}/10 -

- )} - -
-

{title}

-
- -

- {isReleased ? : } - - {releaseDate.toLocaleDateString("pl-PL", { - day: "numeric", - month: "long", - year: "numeric", - })} - -

- {showDayCounter && ( - - {isReleased - ? `${daysSinceRelease} dni od premiery` - : `${daysSinceRelease} dni do premiery`} - - )} -
- -
-
-
- ); -}; diff --git a/src/components/atoms/MovieCard/layouts/index.ts b/src/components/atoms/MovieCard/layouts/index.ts deleted file mode 100644 index fac78a3..0000000 --- a/src/components/atoms/MovieCard/layouts/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { AuroraLayout } from "./AuroraLayout"; -export { MinimalLayout } from "./MinimalLayout"; -export { ZeusLayout } from "./ZeusLayout"; -export { DefaultLayout } from "./DefaultLayout"; diff --git a/src/components/atoms/Pagination/index.tsx b/src/components/atoms/Pagination/index.tsx index e6e901e..ed1e8cc 100644 --- a/src/components/atoms/Pagination/index.tsx +++ b/src/components/atoms/Pagination/index.tsx @@ -18,6 +18,7 @@ export const Pagination: FC = ({