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:
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user