[go: nahoru, domu]

Skip to content

Commit

Permalink
Splitting Components
Browse files Browse the repository at this point in the history
  • Loading branch information
AmirrMahmoudi committed Jan 1, 2024
1 parent 361dab0 commit 6e0f796
Show file tree
Hide file tree
Showing 8 changed files with 615 additions and 107 deletions.
38 changes: 0 additions & 38 deletions src/App.css

This file was deleted.

253 changes: 231 additions & 22 deletions src/App.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,234 @@
import logo from './logo.svg';
import './App.css';

function App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
import { useState } from "react";

const tempMovieData = [
{
imdbID: "tt1375666",
Title: "Inception",
Year: "2010",
Poster:
"https://m.media-amazon.com/images/M/MV5BMjAxMzY3NjcxNF5BMl5BanBnXkFtZTcwNTI5OTM0Mw@@._V1_SX300.jpg",
},
{
imdbID: "tt0133093",
Title: "The Matrix",
Year: "1999",
Poster:
"https://m.media-amazon.com/images/M/MV5BNzQzOTk3OTAtNDQ0Zi00ZTVkLWI0MTEtMDllZjNkYzNjNTc4L2ltYWdlXkEyXkFqcGdeQXVyNjU0OTQ0OTY@._V1_SX300.jpg",
},
{
imdbID: "tt6751668",
Title: "Parasite",
Year: "2019",
Poster:
"https://m.media-amazon.com/images/M/MV5BYWZjMjk3ZTItODQ2ZC00NTY5LWE0ZDYtZTI3MjcwN2Q5NTVkXkEyXkFqcGdeQXVyODk4OTc3MTY@._V1_SX300.jpg",
},
];

const tempWatchedData = [
{
imdbID: "tt1375666",
Title: "Inception",
Year: "2010",
Poster:
"https://m.media-amazon.com/images/M/MV5BMjAxMzY3NjcxNF5BMl5BanBnXkFtZTcwNTI5OTM0Mw@@._V1_SX300.jpg",
runtime: 148,
imdbRating: 8.8,
userRating: 10,
},
{
imdbID: "tt0088763",
Title: "Back to the Future",
Year: "1985",
Poster:
"https://m.media-amazon.com/images/M/MV5BZmU0M2Y1OGUtZjIxNi00ZjBkLTg1MjgtOWIyNThiZWIwYjRiXkEyXkFqcGdeQXVyMTQxNzMzNDI@._V1_SX300.jpg",
runtime: 116,
imdbRating: 8.5,
userRating: 9,
},
];

const average = (arr) =>
arr.reduce((acc, cur, i, arr) => acc + cur / arr.length, 0);

export default function App() {
return (
<>
<NavBar />
<Main />
</>
);
}

export default App;
const NavBar = () => {
return (
<nav className="nav-bar">
<Logo />
<Search />
<NumResults />
</nav>
);
};

const Logo = () => {
return (
<div className="logo">
<span role="img">🍿</span>
<h1>usePopcorn</h1>
</div>
);
};
const Search = () => {
const [query, setQuery] = useState("");
return (
<input
className="search"
type="text"
placeholder="Search movies..."
value={query}
onChange={(e) => setQuery(e.target.value)}
/>
);
};
const NumResults = () => {
return (
<p className="num-results">
Found <strong>X</strong> results
</p>
);
};

const Main = () => {
return (
<main className="main">
<ListBox />
<WatchedBox />
</main>
);
};

const ListBox = () => {
const [isOpen1, setIsOpen1] = useState(true);
return (
<div className="box">
<button
className="btn-toggle"
onClick={() => setIsOpen1((open) => !open)}
>
{isOpen1 ? "–" : "+"}
</button>
{isOpen1 && <MovieList />}
</div>
);
};

const MovieList = () => {
const [movies, setMovies] = useState(tempMovieData);

return (
<ul className="list">
{movies?.map((movie) => (
<Movie movie={movie} key={movie.imdbID} />
))}
</ul>
);
};

const Movie = ({ movie }) => {
return (
<li>
<img src={movie.Poster} alt={`${movie.Title} poster`} />
<h3>{movie.Title}</h3>
<div>
<p>
<span>🗓</span>
<span>{movie.Year}</span>
</p>
</div>
</li>
);
};

const WatchedBox = () => {
const [watched, setWatched] = useState(tempWatchedData);
const [isOpen2, setIsOpen2] = useState(true);

return (
<div className="box">
<button
className="btn-toggle"
onClick={() => setIsOpen2((open) => !open)}
>
{isOpen2 ? "–" : "+"}
</button>
{isOpen2 && (
<>
<WatchedSummary watched={watched} />
<WatchedMoviesList watched={watched} />
</>
)}
</div>
);
};

const WatchedSummary = ({ watched }) => {
const avgImdbRating = average(watched.map((movie) => movie.imdbRating));
const avgUserRating = average(watched.map((movie) => movie.userRating));
const avgRuntime = average(watched.map((movie) => movie.runtime));

return (
<div className="summary">
<h2>Movies you watched</h2>
<div>
<p>
<span>#️⃣</span>
<span>{watched.length} movies</span>
</p>
<p>
<span>⭐️</span>
<span>{avgImdbRating}</span>
</p>
<p>
<span>🌟</span>
<span>{avgUserRating}</span>
</p>
<p>
<span></span>
<span>{avgRuntime} min</span>
</p>
</div>
</div>
);
};

const WatchedMoviesList = ({ watched }) => {
return (
<ul className="list">
{watched.map((movie) => (
<WatchedMovie movie={movie} key={movie.imdbID} />
))}
</ul>
);
};

const WatchedMovie = ({ movie }) => {
return (
<li>
<img src={movie.Poster} alt={`${movie.Title} poster`} />
<h3>{movie.Title}</h3>
<div>
<p>
<span>⭐️</span>
<span>{movie.imdbRating}</span>
</p>
<p>
<span>🌟</span>
<span>{movie.userRating}</span>
</p>
<p>
<span></span>
<span>{movie.runtime} min</span>
</p>
</div>
</li>
);
};
8 changes: 0 additions & 8 deletions src/App.test.js

This file was deleted.

Loading

0 comments on commit 6e0f796

Please sign in to comment.