refactor: remove Cache-Control header from movie API response; update MovieCard and HeroMovie components to manage 'seen' and 'favorite' states more effectively

This commit is contained in:
Norbert Maciaszek 2025-08-18 13:50:49 +02:00
parent 3c286e705c
commit f6ff7749ae
3 changed files with 68 additions and 52 deletions

View File

@ -5,10 +5,5 @@ export const GET = async () => {
const movies = await getMovies(); const movies = await getMovies();
const res = NextResponse.json(movies); const res = NextResponse.json(movies);
res.headers.set(
"Cache-Control",
"public, max-age=3, stale-while-revalidate=30"
);
return res; return res;
}; };

View File

@ -45,11 +45,17 @@ export const MovieCard: FC<Props> = ({
}; };
const handleSeen = () => { const handleSeen = () => {
updateMovieInStore(id, { seen: !movie.seen }); updateMovieInStore(id, {
seen: !movie.seen,
favorite: false,
});
}; };
const handleFavorite = () => { const handleFavorite = () => {
updateMovieInStore(id, { favorite: !movie.favorite }); updateMovieInStore(id, {
favorite: !movie.favorite,
seen: movie.seen || !movie.favorite,
});
}; };
const releaseDate = new Date(movie.release_date); const releaseDate = new Date(movie.release_date);

View File

@ -27,6 +27,7 @@ export const HeroMovie: FC<Props> = ({ movieDetails }) => {
const isInStore = !!movieInStore; const isInStore = !!movieInStore;
const isFavorite = movieInStore?.favorite || false; const isFavorite = movieInStore?.favorite || false;
const isSeen = movieInStore?.seen || false; const isSeen = movieInStore?.seen || false;
const loading = movies.length === 0;
const formatRuntime = (minutes: number) => { const formatRuntime = (minutes: number) => {
const hours = Math.floor(minutes / 60); const hours = Math.floor(minutes / 60);
@ -50,10 +51,13 @@ export const HeroMovie: FC<Props> = ({ movieDetails }) => {
const handleToggleFavorite = () => { const handleToggleFavorite = () => {
if (!isInStore) { if (!isInStore) {
if (convertedMovie) { if (convertedMovie) {
addMovie({ ...convertedMovie, favorite: true }); addMovie({ ...convertedMovie, favorite: true, seen: true });
} }
} else { } else {
updateMovie(movieDetails.id, { favorite: !isFavorite }); updateMovie(movieDetails.id, {
favorite: !isFavorite,
seen: isSeen || !isFavorite,
});
} }
}; };
@ -63,7 +67,10 @@ export const HeroMovie: FC<Props> = ({ movieDetails }) => {
addMovie({ ...convertedMovie, seen: true }); addMovie({ ...convertedMovie, seen: true });
} }
} else { } else {
updateMovie(movieDetails.id, { seen: !isSeen }); updateMovie(movieDetails.id, {
seen: !isSeen,
favorite: false,
});
} }
}; };
@ -189,6 +196,7 @@ export const HeroMovie: FC<Props> = ({ movieDetails }) => {
)} )}
{/* Action buttons */} {/* Action buttons */}
{!loading && (
<div className="flex gap-4 flex-wrap"> <div className="flex gap-4 flex-wrap">
<Button <Button
gradient={ gradient={
@ -211,12 +219,18 @@ export const HeroMovie: FC<Props> = ({ movieDetails }) => {
<Button <Button
theme={isFavorite ? "rose" : "glass"} theme={isFavorite ? "rose" : "glass"}
className={`flex items-center gap-3 ${ className={`flex items-center gap-3 ${
isFavorite ? "bg-gradient-to-r border-rose-400/30" : "" isFavorite
? "bg-gradient-to-r border-rose-400/30"
: ""
}`} }`}
onClick={handleToggleFavorite} onClick={handleToggleFavorite}
> >
<FaHeart className={isFavorite ? "text-rose-200" : ""} /> <FaHeart
{isFavorite ? "Usuń z ulubionych" : "Dodaj do ulubionych"} className={isFavorite ? "text-rose-200" : ""}
/>
{isFavorite
? "Usuń z ulubionych"
: "Dodaj do ulubionych"}
</Button> </Button>
<Button <Button
theme={isSeen ? "emerald" : "glass"} theme={isSeen ? "emerald" : "glass"}
@ -231,6 +245,7 @@ export const HeroMovie: FC<Props> = ({ movieDetails }) => {
: "Oznacz jako obejrzany"} : "Oznacz jako obejrzany"}
</Button> </Button>
</div> </div>
)}
</div> </div>
</div> </div>
</div> </div>