Refactor movie filtering and management features: update MovieList and MovieCard components to use new filter props; enhance global store with updateMovie functionality; implement movie state updates for seen and favorite statuses.

This commit is contained in:
Norbert Maciaszek
2025-08-05 22:30:53 +02:00
parent b08cdea130
commit 3809110a39
5 changed files with 93 additions and 31 deletions

View File

@@ -7,13 +7,18 @@ export default async function Home() {
<SearchMovies />
<MovieList
heading="Upcoming"
onlyUpcoming
filterUpcoming={1}
sort="releaseDate"
sortDirection="desc"
/>
<MovieList heading="My Watchlist" onlyReleased showFilters />
<MovieList heading="Seen" onlySeen />
<MovieList heading="Favorites" onlyFavorites />
<MovieList
heading="My Watchlist"
filterReleased={1}
filterSeen={0}
showFilters
/>
<MovieList heading="Seen" filterSeen={1} />
<MovieList heading="Favorites" filterFavorites={1} />
</main>
);
}

View File

@@ -2,16 +2,20 @@
import { movies } from "@/lib/db/schema";
import { createContext, FC, use, useState } from "react";
type Movie = typeof movies.$inferSelect;
type GlobalStore = {
movies: (typeof movies.$inferSelect)[];
addMovie: (movie: typeof movies.$inferSelect) => void;
movies: Movie[];
addMovie: (movie: Movie) => void;
deleteMovie: (id: number) => void;
updateMovie: (id: number, movie: Partial<Movie>) => void;
};
const globalStore = createContext<GlobalStore>({
movies: [],
addMovie: () => {},
deleteMovie: () => {},
updateMovie: () => {},
});
type Props = {
@@ -22,7 +26,7 @@ type Props = {
export const GlobalStoreProvider: FC<Props> = ({ children, initialMovies }) => {
const [movies, setMovies] = useState<GlobalStore["movies"]>(initialMovies);
const addMovie = async (movie: GlobalStore["movies"][number]) => {
const addMovie = async (movie: Movie) => {
if (movies.find((m) => m.id === movie.id)) return;
setMovies((prev) => [...prev, movie]);
@@ -32,8 +36,16 @@ export const GlobalStoreProvider: FC<Props> = ({ children, initialMovies }) => {
setMovies((prev) => prev.filter((m) => m.id !== id));
};
const updateMovie = async (id: number, movie: Partial<Movie>) => {
setMovies((prev) =>
prev.map((m) => (m.id === id ? { ...m, ...movie } : m))
);
};
return (
<globalStore.Provider value={{ movies, addMovie, deleteMovie }}>
<globalStore.Provider
value={{ movies, addMovie, deleteMovie, updateMovie }}
>
{children}
</globalStore.Provider>
);