diff --git a/src/app/page.tsx b/src/app/page.tsx index 057956d..53beb0f 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -7,13 +7,18 @@ export default async function Home() { - - - + + + ); } diff --git a/src/app/store/globalStore.tsx b/src/app/store/globalStore.tsx index 476476a..15b7ade 100644 --- a/src/app/store/globalStore.tsx +++ b/src/app/store/globalStore.tsx @@ -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) => void; }; const globalStore = createContext({ movies: [], addMovie: () => {}, deleteMovie: () => {}, + updateMovie: () => {}, }); type Props = { @@ -22,7 +26,7 @@ type Props = { export const GlobalStoreProvider: FC = ({ children, initialMovies }) => { const [movies, setMovies] = useState(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 = ({ children, initialMovies }) => { setMovies((prev) => prev.filter((m) => m.id !== id)); }; + const updateMovie = async (id: number, movie: Partial) => { + setMovies((prev) => + prev.map((m) => (m.id === id ? { ...m, ...movie } : m)) + ); + }; + return ( - + {children} ); diff --git a/src/components/atoms/MovieCard/index.tsx b/src/components/atoms/MovieCard/index.tsx index dca007e..d4158b5 100644 --- a/src/components/atoms/MovieCard/index.tsx +++ b/src/components/atoms/MovieCard/index.tsx @@ -1,7 +1,7 @@ "use client"; -import { FC, useState } from "react"; +import { FC } from "react"; import { ReadMore } from "../ReadMore"; -import { addMovie, deleteMovie } from "@/lib/db"; +import { addMovie, deleteMovie, updateMovie } from "@/lib/db"; import { useGlobalStore } from "@/app/store/globalStore"; type Props = { @@ -16,6 +16,8 @@ type Props = { notes?: string; }; +const buttonClass = "px-2 py-6 text-sm w-full transition-colors cursor-pointer"; + export const MovieCard: FC = ({ id, title, @@ -31,9 +33,12 @@ export const MovieCard: FC = ({ movies, addMovie: addMovieToStore, deleteMovie: deleteMovieFromStore, + updateMovie: updateMovieInStore, } = useGlobalStore(); const alreadyInStore = movies.find((m) => m.id === id); + const isReleased = new Date(releaseDate) < new Date(); + const handleAdd = async () => { const movie = { id, @@ -55,6 +60,16 @@ export const MovieCard: FC = ({ deleteMovieFromStore(id); }; + const handleSeen = async () => { + await updateMovie(id, { seen: seen ? 0 : 1 }); + updateMovieInStore(id, { seen: seen ? 0 : 1 }); + }; + + const handleFavorite = async () => { + await updateMovie(id, { favorite: favorite ? 0 : 1 }); + updateMovieInStore(id, { favorite: favorite ? 0 : 1 }); + }; + return (
@@ -85,22 +100,41 @@ export const MovieCard: FC = ({
-
+ {/*
*/} +
{!alreadyInStore && ( )} {alreadyInStore && ( - + <> + {isReleased && ( + + )} + + + + + )}
diff --git a/src/components/molecules/MovieList/index.tsx b/src/components/molecules/MovieList/index.tsx index ff389e4..9179e3a 100644 --- a/src/components/molecules/MovieList/index.tsx +++ b/src/components/molecules/MovieList/index.tsx @@ -5,10 +5,10 @@ import { useGlobalStore } from "@/app/store/globalStore"; type Props = { heading: string; - onlySeen?: boolean; - onlyFavorites?: boolean; - onlyUpcoming?: boolean; - onlyReleased?: boolean; + filterSeen?: 0 | 1; + filterFavorites?: 0 | 1; + filterUpcoming?: 0 | 1; + filterReleased?: 0 | 1; showFilters?: boolean; sort?: "title" | "releaseDate" | "popularity"; @@ -17,10 +17,10 @@ type Props = { export const MovieList: FC = ({ heading, - onlyFavorites, - onlySeen, - onlyUpcoming, - onlyReleased, + filterSeen, + filterFavorites, + filterUpcoming, + filterReleased, showFilters = false, sort = "title", sortDirection = "asc", @@ -31,11 +31,15 @@ export const MovieList: FC = ({ const { movies } = useGlobalStore(); const filteredMovies = movies.filter((movie) => { - if (onlySeen) return movie.seen === 1; - if (onlyFavorites) return movie.favorite === 1; - if (onlyUpcoming) return new Date(movie.releaseDate) > new Date(); - if (onlyReleased) return new Date(movie.releaseDate) < new Date(); - return true; + let result = true; + if (typeof filterSeen === "number") result = movie.seen === filterSeen; + if (typeof filterFavorites === "number") + result = result && movie.favorite === filterFavorites; + if (typeof filterUpcoming === "number") + result = result && new Date(movie.releaseDate) > new Date(); + if (typeof filterReleased === "number") + result = result && new Date(movie.releaseDate) < new Date(); + return result; }); let sortedMovies = filteredMovies.sort((a, b) => { diff --git a/src/lib/db/index.ts b/src/lib/db/index.ts index e03433b..3d57755 100644 --- a/src/lib/db/index.ts +++ b/src/lib/db/index.ts @@ -16,3 +16,10 @@ export const addMovie = async (movie: typeof movies.$inferInsert) => { export const deleteMovie = async (id: number) => { await db.delete(movies).where(eq(movies.id, id)); }; + +export const updateMovie = async ( + id: number, + movie: Partial +) => { + await db.update(movies).set(movie).where(eq(movies.id, id)); +};