Advertisement
dev017

movie search with typeScript & react

Jul 28th, 2023
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { useState } from "react";
  2. import { Container, InputGroup, FormControl, Button } from "react-bootstrap";
  3. import axios from "axios";
  4.  
  5. interface Movie {
  6.   Title: string;
  7.   Year: string;
  8.   imdbID: string;
  9.   Type: string;
  10.   Poster: string;
  11. }
  12.  
  13. const MovieSearch = () => {
  14.   const [searchTerm, setSearchTerm] = useState("");
  15.   const [searchResults, setSearchResults] = useState<Movie[]>([]);
  16.   const [favorites, setFavorites] = useState<Movie[]>([]);
  17.  
  18.   const searchMovies = async () => {
  19.     const response = await axios.get(
  20.       `http://www.omdbapi.com/?s=${searchTerm}&apikey=<your-api-key>`
  21.     );
  22.     setSearchResults(response.data.Search);
  23.   };
  24.  
  25.   const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  26.     setSearchTerm(e.target.value);
  27.   };
  28.  
  29.   const handleAddToFavorites = (movie: Movie) => {
  30.     setFavorites((prevFavorites) => [...prevFavorites, movie]);
  31.   };
  32.  
  33.   return (
  34.     <Container>
  35.       <h1>Movie Search</h1>
  36.       <InputGroup className="mb-3">
  37.         <FormControl
  38.           placeholder="Search movies..."
  39.           onChange={handleInputChange}
  40.         />
  41.         <Button variant="outline-secondary" onClick={searchMovies}>
  42.           Search
  43.         </Button>
  44.       </InputGroup>
  45.       <div className="row">
  46.         {searchResults.map((movie) => (
  47.           <div key={movie.imdbID} className="col-md-4">
  48.             <div className="card mb-4 shadow-sm">
  49.               <img
  50.                 src={movie.Poster}
  51.                 alt={`${movie.Title} poster`}
  52.                 className="card-img-top"
  53.               />
  54.               <div className="card-body">
  55.                 <h5 className="card-title">{movie.Title}</h5>
  56.                 <p className="card-text">
  57.                   <strong>Year: </strong>
  58.                   {movie.Year}
  59.                   <br />
  60.                   <strong>Type: </strong>
  61.                   {movie.Type}
  62.                 </p>
  63.                 <Button variant="primary" onClick={() => handleAddToFavorites(movie)}>
  64.                   Add to Favorites
  65.                 </Button>
  66.               </div>
  67.             </div>
  68.           </div>
  69.         ))}
  70.       </div>
  71.       <hr />
  72.       <h2>Favorites</h2>
  73.       <div className="row">
  74.         {favorites.map((favorite) => (
  75.           <div key={favorite.imdbID} className="col-md-4">
  76.             <div className="card mb-4 shadow-sm">
  77.               <img
  78.                 src={favorite.Poster}
  79.                 alt={`${favorite.Title} poster`}
  80.                 className="card-img-top"
  81.               />
  82.               <div className="card-body">
  83.                 <h5 className="card-title">{favorite.Title}</h5>
  84.                 <p className="card-text">
  85.                   <strong>Year: </strong>
  86.                   {favorite.Year}
  87.                   <br />
  88.                   <strong>Type: </strong>
  89.                   {favorite.Type}
  90.                 </p>
  91.               </div>
  92.             </div>
  93.           </div>
  94.         ))}
  95.       </div>
  96.     </Container>
  97.   );
  98. };
  99.  
  100. export default MovieSearch;
  101.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement