@@ -36,8 +28,8 @@ export default function MovieForm({ initialData, onSubmit }: MovieFormProps) {
@@ -48,24 +40,24 @@ export default function MovieForm({ initialData, onSubmit }: MovieFormProps) {
-
-
- {errors.timing &&
This field is required
}
+
+ {errors.duration &&
This field is required
}
-
- {errors.overview &&
This field is required
}
+
+ {errors.description &&
This field is required
}
diff --git a/src/components/movie-tile/movie-tile.test.tsx b/src/components/movie-tile/movie-tile.test.tsx
index 8d4beb9..572a35c 100644
--- a/src/components/movie-tile/movie-tile.test.tsx
+++ b/src/components/movie-tile/movie-tile.test.tsx
@@ -5,6 +5,7 @@ import MovieTile from './movie-tile';
describe('MovieTile component', () => {
const mockedClick = jest.fn();
const movieData= {
+ id: 123,
imageUrl: '/sample.jpg',
movieName: 'Sample Movie',
releaseYear: 2001,
diff --git a/src/components/movie-tile/movie-tile.tsx b/src/components/movie-tile/movie-tile.tsx
index f94d269..f714c2e 100644
--- a/src/components/movie-tile/movie-tile.tsx
+++ b/src/components/movie-tile/movie-tile.tsx
@@ -1,10 +1,10 @@
import React, { MouseEvent , useState } from 'react';
-import Dialog from '../dialog/dialog';
-import MovieForm from '../movie-form/movie-form';
import './movie-tile.scss';
+import { useNavigate } from 'react-router-dom';
interface MovieTileProps {
+ id: number;
imageUrl: string;
movieName: string;
releaseYear: number;
@@ -12,9 +12,9 @@ interface MovieTileProps {
onClick: () => void;
}
-export default function MovieTile({ imageUrl, movieName, releaseYear, genres, onClick }: MovieTileProps) {
+export default function MovieTile({ id, imageUrl, movieName, releaseYear, genres, onClick }: MovieTileProps) {
const [isContextMenuVisible, setContextMenuVisible] = useState(false);
- const [isEditDialogOpen, setIsEditDialogOpen] = useState(false);
+ const navigate = useNavigate();
const openContextMenu = (e: MouseEvent) => {
e.stopPropagation();
@@ -27,22 +27,14 @@ export default function MovieTile({ imageUrl, movieName, releaseYear, genres, on
};
const handleEdit = (e: MouseEvent) => {
- setIsEditDialogOpen(true);
closeContextMenu(e);
+ navigate(`${id}/edit`);
};
const handleDelete = (e: MouseEvent) => {
closeContextMenu(e);
};
- const closeEditDialog = () => {
- setIsEditDialogOpen(false);
- };
-
- const onEditSubmit = (data: any) => {
- console.log('data =', data);
- }
-
return (

@@ -66,12 +58,6 @@ export default function MovieTile({ imageUrl, movieName, releaseYear, genres, on
)}
-
- {isEditDialogOpen && (
-
- )}
);
}
\ No newline at end of file
diff --git a/src/components/pages/home-page.scss b/src/components/pages/home-page.scss
index 59a8c41..5005a3b 100644
--- a/src/components/pages/home-page.scss
+++ b/src/components/pages/home-page.scss
@@ -1,17 +1,21 @@
@import "src/scss/colors";
+@import "src/scss/mixins";
.filter-sort-controls {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 20px;
+ padding: 10px 20px;
+ background: $black;
}
.movie-list {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
- margin-top: 20px;
+ padding: 20px;
+ background: $black;
}
.spinner {
@@ -29,6 +33,34 @@
animation: rotation 1s linear infinite;
}
+.search-container {
+ padding: 20px;
+ background-image: url("../../../public/background.png");
+ background-position: center;
+ background-size: cover;
+
+ &__add-movie {
+ display: flex;
+ justify-content: end;
+ }
+
+ &__add-movie--link {
+ font-size: 20px;
+ text-transform: uppercase;
+ background-color: $grey;
+ border-radius: 4px;
+ color: $red;
+ padding: 10px 20px;
+ text-decoration: none;
+ opacity: 0.9;
+
+ &::before {
+ content: "+";
+ margin-right: 5px;
+ }
+ }
+}
+
@keyframes rotation {
0% {
transform: rotate(0deg);
diff --git a/src/components/pages/home-page.tsx b/src/components/pages/home-page.tsx
index 1a7ba35..695233e 100644
--- a/src/components/pages/home-page.tsx
+++ b/src/components/pages/home-page.tsx
@@ -1,14 +1,16 @@
import Search from '../search/search';
import GenreFilter from '../genre-filter/genre-filter';
-import { useEffect, useState } from 'react';
+import React, { useEffect, useState } from 'react';
import MovieTile from '../movie-tile/movie-tile';
import SortControl, { SortOptionType } from '../sort-control/sort-control';
import MovieDetails from '../movie-details/movie-details';
-
-import './home-page.scss';
+import AddMovieFormDialog from '../add-movie-form/add-movie-form';
import { useMovieService } from '../../services';
import { Movie } from '../../models';
-import { Routes, Route, useSearchParams, useNavigate, useParams } from 'react-router-dom';
+import { Routes, Route, useSearchParams, useNavigate, useParams, Outlet, Link } from 'react-router-dom';
+import EditMovieFormDialog from '../edit-movie-form/edit-movie-form';
+
+import './home-page.scss';
const genres = [
{ label: 'All', value: '' },
@@ -89,10 +91,19 @@ export function HomePage() {
+
+ Add Movie
+
+
}/>
+ }/>
@@ -104,6 +115,7 @@ export function HomePage() {
{movies.map((movie: Movie) =>
+ Find your movie
) => Promise,
- getMovie: (id: number | string) => Promise
+ getMovie: (id: number | string) => Promise,
+ addMovie: (movie: Movie) => void;
+ editMovie: (movie: Movie) => void;
}
export function useMovieService(): MovieService {
@@ -30,11 +32,20 @@ export function useMovieService(): MovieService {
return transformMovie(res);
}
+ const addMovie = (movie: Movie) => {
+ console.log('api add movie =', movie)
+ }
+
+ const editMovie = (movie: Movie) => {
+ console.log('api edit movie =', movie)
+ }
+
const transformMovie = (movie: MovieDTO): Movie => {
return {
id: movie.id,
movieName: movie.title,
imageUrl: movie.poster_path,
+ releaseDate: movie.release_date,
releaseYear: new Date(movie.release_date).getFullYear(),
rating: `${movie.vote_average}`,
duration: `${movie.runtime}`,
@@ -47,6 +58,8 @@ export function useMovieService(): MovieService {
loading,
error,
getMovies,
- getMovie
+ getMovie,
+ addMovie,
+ editMovie
}
}
\ No newline at end of file
diff --git a/src/stories/dialog.stories.tsx b/src/stories/dialog.stories.tsx
index c92bde8..a633634 100644
--- a/src/stories/dialog.stories.tsx
+++ b/src/stories/dialog.stories.tsx
@@ -28,13 +28,15 @@ export const EditMovie: Story = {
title: 'Edit Movie',
children: console.log(data)}
/>,