Refactor homepage layout and add new "Odkrywaj" page: remove "O mnie" page, update Navbar links, and implement new page for displaying trending movies with a Hero component for enhanced user experience.

This commit is contained in:
Norbert Maciaszek 2025-08-15 16:19:05 +02:00
parent a230a4cf45
commit 0ee6fedcf3
7 changed files with 83 additions and 32 deletions

View File

@ -13,9 +13,7 @@ export default async function WithGlobalDataLayout({
return ( return (
<GlobalStoreProvider initialMovies={movies}> <GlobalStoreProvider initialMovies={movies}>
<Navbar /> <Navbar />
<main className="py-10 [&>:first-child]:mt-0 [&>:last-child]:mb-0"> <main className="[&>:last-child]:mb-0">{children}</main>
{children}
</main>
</GlobalStoreProvider> </GlobalStoreProvider>
); );
} }

View File

@ -1,21 +0,0 @@
import { MovieList } from "@/components/molecules/MovieList";
export default async function Home() {
return (
<>
<MovieList
heading="Nadchodzące"
filterUpcoming={1}
sortDirection="desc"
/>
<MovieList
heading="Do obejrzenia"
filterReleased={1}
filterSeen={0}
filterFavorites={0}
/>
<MovieList heading="Obejrzane" filterSeen={1} />
<MovieList heading="Ulubione" filterFavorites={1} />
</>
);
}

View File

@ -0,0 +1,31 @@
import { getNowPlayingMovies } from "@/lib/tmdb/server";
import { Hero } from "@/components/organisms/Hero";
// 12 hours
export const revalidate = 43200;
export default async function Home() {
// Get trending movies and popular movies for hero carousel.
const data = await getNowPlayingMovies();
// Combine first 3 trending and first 2 popular movies for variety.
const dataRaw = data.results.slice(0, 5);
// Convert TMDB movie format to our Movie type.
const heroMovies = dataRaw.map((movie) => ({
...movie,
genre_ids: JSON.stringify(movie.genre_ids),
seen: false,
favorite: false,
}));
return (
<>
<Hero movies={heroMovies} autoRotate />
<div className="container py-16">
<h2 className="text-3xl font-bold text-white mb-8">Popularne filmy</h2>
{/* Add other homepage content here */}
</div>
</>
);
}

View File

@ -1,7 +1,21 @@
import { MovieList } from "@/components/molecules/MovieList";
export default async function Home() { export default async function Home() {
return ( return (
<> <>
<h1>Strona główna</h1> <MovieList
heading="Nadchodzące"
filterUpcoming={1}
sortDirection="desc"
/>
<MovieList
heading="Do obejrzenia"
filterReleased={1}
filterSeen={0}
filterFavorites={0}
/>
<MovieList heading="Obejrzane" filterSeen={1} />
<MovieList heading="Ulubione" filterFavorites={1} />
</> </>
); );
} }

View File

@ -29,7 +29,15 @@ export const MovieCard: FC<Props> = ({
deleteMovie: deleteMovieFromStore, deleteMovie: deleteMovieFromStore,
updateMovie: updateMovieInStore, updateMovie: updateMovieInStore,
} = useGlobalStore(); } = useGlobalStore();
const { id, title, overview, popularity, release_date, poster_path } = movie; const {
id,
title,
overview,
popularity,
release_date,
poster_path,
vote_average,
} = movie;
const alreadyInStore = movies.find((m) => m.id === id); const alreadyInStore = movies.find((m) => m.id === id);
const isReleased = new Date(release_date) < new Date(); const isReleased = new Date(release_date) < new Date();
@ -147,6 +155,13 @@ export const MovieCard: FC<Props> = ({
<div className="p-4"> <div className="p-4">
<div className="flex justify-between"> <div className="flex justify-between">
<h2 className="text-xl leading-[1.1] font-bold">{title}</h2> <h2 className="text-xl leading-[1.1] font-bold">{title}</h2>
{!!vote_average && (
<p className="flex items-center gap-1 text-sm">
<span className="text-yellow-400"></span>
<span>{vote_average.toFixed(1)}/10</span>
</p>
)}
</div> </div>
<p <p
className={`text-sm mt-2 flex items-center gap-1 leading-[1.1] ${ className={`text-sm mt-2 flex items-center gap-1 leading-[1.1] ${

View File

@ -3,12 +3,8 @@ import { Search } from "./components/Search";
const links = [ const links = [
{ {
label: "O mnie", label: "Odkrywaj",
href: "/o-mnie", href: "/odkrywaj",
},
{
label: "Odkryj",
href: "/discover",
}, },
]; ];

View File

@ -36,3 +36,21 @@ export async function search(options: SearchOptions): Promise<SearchResult> {
return await fetchTmbd(`/search/movie?${params.toString()}`); return await fetchTmbd(`/search/movie?${params.toString()}`);
} }
export async function getPopularMovies(
page: number = 1
): Promise<SearchResult> {
return await fetchTmbd(`/movie/popular?language=pl-PL&page=${page}`);
}
export async function getTrendingMovies(): Promise<SearchResult> {
return await fetchTmbd("/trending/movie/day?language=pl-PL");
}
export async function getUpcomingMovies(): Promise<SearchResult> {
return await fetchTmbd("/movie/upcoming?language=pl-PL");
}
export async function getNowPlayingMovies(): Promise<SearchResult> {
return await fetchTmbd("/movie/now_playing?language=pl-PL&region=PL");
}