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:
parent
3c286e705c
commit
f6ff7749ae
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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,48 +196,56 @@ export const HeroMovie: FC<Props> = ({ movieDetails }) => {
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{/* Action buttons */}
|
{/* Action buttons */}
|
||||||
<div className="flex gap-4 flex-wrap">
|
{!loading && (
|
||||||
<Button
|
<div className="flex gap-4 flex-wrap">
|
||||||
gradient={
|
<Button
|
||||||
isInStore
|
gradient={
|
||||||
? {
|
isInStore
|
||||||
from: "from-purple-600 hover:from-purple-500",
|
? {
|
||||||
to: "to-emerald-600 hover:to-emerald-500",
|
from: "from-purple-600 hover:from-purple-500",
|
||||||
}
|
to: "to-emerald-600 hover:to-emerald-500",
|
||||||
: {
|
}
|
||||||
from: "from-purple-600 hover:from-purple-500",
|
: {
|
||||||
to: "to-pink-600 hover:to-pink-500",
|
from: "from-purple-600 hover:from-purple-500",
|
||||||
}
|
to: "to-pink-600 hover:to-pink-500",
|
||||||
}
|
}
|
||||||
className={`flex items-center gap-3`}
|
}
|
||||||
onClick={handleAddToList}
|
className={`flex items-center gap-3`}
|
||||||
>
|
onClick={handleAddToList}
|
||||||
<FaBookmark />
|
>
|
||||||
{isInStore ? "Usuń z listy" : "Dodaj do listy"}
|
<FaBookmark />
|
||||||
</Button>
|
{isInStore ? "Usuń z listy" : "Dodaj do listy"}
|
||||||
<Button
|
</Button>
|
||||||
theme={isFavorite ? "rose" : "glass"}
|
<Button
|
||||||
className={`flex items-center gap-3 ${
|
theme={isFavorite ? "rose" : "glass"}
|
||||||
isFavorite ? "bg-gradient-to-r border-rose-400/30" : ""
|
className={`flex items-center gap-3 ${
|
||||||
}`}
|
isFavorite
|
||||||
onClick={handleToggleFavorite}
|
? "bg-gradient-to-r border-rose-400/30"
|
||||||
>
|
: ""
|
||||||
<FaHeart className={isFavorite ? "text-rose-200" : ""} />
|
}`}
|
||||||
{isFavorite ? "Usuń z ulubionych" : "Dodaj do ulubionych"}
|
onClick={handleToggleFavorite}
|
||||||
</Button>
|
>
|
||||||
<Button
|
<FaHeart
|
||||||
theme={isSeen ? "emerald" : "glass"}
|
className={isFavorite ? "text-rose-200" : ""}
|
||||||
className={`flex items-center gap-3 ${
|
/>
|
||||||
isSeen ? "bg-gradient-to-r border-emerald-400/30" : ""
|
{isFavorite
|
||||||
}`}
|
? "Usuń z ulubionych"
|
||||||
onClick={handleToggleSeen}
|
: "Dodaj do ulubionych"}
|
||||||
>
|
</Button>
|
||||||
<FaEye className={isSeen ? "text-emerald-200" : ""} />
|
<Button
|
||||||
{isSeen
|
theme={isSeen ? "emerald" : "glass"}
|
||||||
? "Oznacz jako nieobejrzany"
|
className={`flex items-center gap-3 ${
|
||||||
: "Oznacz jako obejrzany"}
|
isSeen ? "bg-gradient-to-r border-emerald-400/30" : ""
|
||||||
</Button>
|
}`}
|
||||||
</div>
|
onClick={handleToggleSeen}
|
||||||
|
>
|
||||||
|
<FaEye className={isSeen ? "text-emerald-200" : ""} />
|
||||||
|
{isSeen
|
||||||
|
? "Oznacz jako nieobejrzany"
|
||||||
|
: "Oznacz jako obejrzany"}
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue