diff --git a/src/app/odkrywaj/page.tsx b/src/app/odkrywaj/page.tsx index d7b61c9..7362a7a 100644 --- a/src/app/odkrywaj/page.tsx +++ b/src/app/odkrywaj/page.tsx @@ -7,6 +7,7 @@ import { import { Hero } from "@/components/organisms/Hero"; import { FaCalendar, FaChartLine, FaFire, FaPlay } from "react-icons/fa"; import { MovieList } from "@/components/molecules/MovieList"; +import { GenreList } from "@/components/molecules/GenreList"; // 12 hours export const revalidate = 43200; @@ -88,6 +89,8 @@ export default async function Home() { /> + +

Ostatnia aktualizacja: {lastModified}

diff --git a/src/app/page.tsx b/src/app/page.tsx index 76e6738..0c66bf4 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,3 +1,4 @@ +import { GenreList } from "@/components/molecules/GenreList"; import { MovieList } from "@/components/molecules/MovieList"; import { TrackedMovies } from "@/components/molecules/TrackedMovies"; @@ -6,6 +7,7 @@ export default async function Home() { <> + ); } diff --git a/src/components/atoms/GenreLabel/index.tsx b/src/components/atoms/GenreLabel/index.tsx index 29c2630..d28bcbf 100644 --- a/src/components/atoms/GenreLabel/index.tsx +++ b/src/components/atoms/GenreLabel/index.tsx @@ -1,13 +1,15 @@ +import Link from "next/link"; import { FC } from "react"; type Props = { genre: string; + id: number; }; -export const GenreLabel: FC = ({ genre }) => { +export const GenreLabel: FC = ({ genre, id }) => { return ( - {genre} + {genre} ); }; diff --git a/src/components/molecules/GenreList/index.tsx b/src/components/molecules/GenreList/index.tsx new file mode 100644 index 0000000..1f6f13a --- /dev/null +++ b/src/components/molecules/GenreList/index.tsx @@ -0,0 +1,62 @@ +import Link from "next/link"; +import { getMovieGenres } from "@/lib/tmdb/server"; +import { Genre } from "@/lib/tmdb/types"; +import { FC } from "react"; + +type Props = { + heading?: string; +}; + +// Genre color mappings for visual variety. +const getGenreStyle = (genreId: number) => { + const styles = [ + "from-purple-600/30 to-pink-600/30 border-purple-400/30 hover:from-purple-500/40 hover:to-pink-500/40 hover:border-purple-300/40 hover:shadow-purple-500/20", + "from-cyan-600/30 to-blue-600/30 border-cyan-400/30 hover:from-cyan-500/40 hover:to-blue-500/40 hover:border-cyan-300/40 hover:shadow-cyan-500/20", + "from-emerald-600/30 to-teal-600/30 border-emerald-400/30 hover:from-emerald-500/40 hover:to-teal-500/40 hover:border-emerald-300/40 hover:shadow-emerald-500/20", + "from-rose-600/30 to-red-600/30 border-rose-400/30 hover:from-rose-500/40 hover:to-red-500/40 hover:border-rose-300/40 hover:shadow-rose-500/20", + "from-amber-600/30 to-orange-600/30 border-amber-400/30 hover:from-amber-500/40 hover:to-orange-500/40 hover:border-amber-300/40 hover:shadow-amber-500/20", + "from-indigo-600/30 to-purple-600/30 border-indigo-400/30 hover:from-indigo-500/40 hover:to-purple-500/40 hover:border-indigo-300/40 hover:shadow-indigo-500/20", + ]; + return styles[genreId % styles.length]; +}; + +export const GenreList: FC = async ({ heading = "Gatunki filmowe" }) => { + const { genres } = await getMovieGenres(); + + return ( +
+
+

+ {heading} +

+
+ {genres.map((genre: Genre) => ( + + {/* Subtle aurora glow effect */} +
+ + {/* Content */} +
+ + {genre.name} + +
+ + ))} +
+ + {/* Optional decorative element */} +
+
+
+
+
+ ); +}; diff --git a/src/components/molecules/HeroMovie/index.tsx b/src/components/molecules/HeroMovie/index.tsx index 6f3da80..7a2a163 100644 --- a/src/components/molecules/HeroMovie/index.tsx +++ b/src/components/molecules/HeroMovie/index.tsx @@ -174,7 +174,11 @@ export const HeroMovie: FC = ({ movieDetails }) => {
{movieDetails.genres.map((genre) => ( - + ))}
diff --git a/src/lib/tmdb/server.ts b/src/lib/tmdb/server.ts index cbbd23d..7f18eca 100644 --- a/src/lib/tmdb/server.ts +++ b/src/lib/tmdb/server.ts @@ -2,13 +2,10 @@ import { SearchResult, - MovieDetails, MovieCredits, MovieDetailsRich, - PersonDetails, - PersonMovieCredits, - PersonImages, PersonDetailsRich, + Genre, } from "./types"; const url = "https://api.themoviedb.org/3"; @@ -88,3 +85,7 @@ export async function getPersonDetails( `/person/${personId}?language=pl&append_to_response=movie_credits,images,external_ids` ); } + +export async function getMovieGenres(): Promise<{ genres: Genre[] }> { + return await fetchTmbd("/genre/movie/list?language=pl"); +}