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");
+}