Movie-App/src/components/SearchPage.js
2025-01-04 01:59:48 +05:30

138 lines
4.2 KiB
JavaScript

import React, { useState, useEffect } from "react";
import { useLocation, useNavigate } from "react-router-dom";
import "./SearchPage.css";
const SearchPage = () => {
const [movieDetails, setMovieDetails] = useState(null);
const [searchResults, setSearchResults] = useState([]);
const [trailerKey, setTrailerKey] = useState(null);
const location = useLocation();
const navigate = useNavigate();
const queryParams = new URLSearchParams(location.search);
const query = queryParams.get("q");
const movieId = queryParams.get("id");
useEffect(() => {
if (movieId) {
const fetchMovieDetails = async () => {
const movieResponse = await fetch(
`https://api.themoviedb.org/3/movie/${movieId}?api_key=59690efd14e375225c4531fcdced2901`
);
const movieData = await movieResponse.json();
setMovieDetails(movieData);
const videoResponse = await fetch(
`https://api.themoviedb.org/3/movie/${movieId}/videos?api_key=59690efd14e375225c4531fcdced2901`
);
const videoData = await videoResponse?.json();
const trailer = videoData?.results?.find(
(video) => video.type === "Trailer"
);
if (trailer) {
setTrailerKey(trailer?.key);
}
};
fetchMovieDetails();
}
}, [movieId]);
useEffect(() => {
if (query) {
const fetchSearchResults = async () => {
const response = await fetch(
`https://api.themoviedb.org/3/search/movie?api_key=59690efd14e375225c4531fcdced2901&query=${query}`
);
const data = await response.json();
setSearchResults(data?.results);
};
fetchSearchResults();
}
}, [query]);
if (movieDetails) {
return (
<div className="movie-detail-container">
<div className="movie-detail-card">
<img
src={`https://image.tmdb.org/t/p/w500/${movieDetails?.poster_path}`}
alt={movieDetails?.title}
className="movie-detail-poster"
/>
<div className="movie-detail-info">
<h2>{movieDetails?.title}</h2>
<p className="movie-detail-release-date">
<strong>Release Date:</strong> {movieDetails?.release_date}
</p>
<p className="movie-detail-tagline">
<em>{movieDetails?.tagline}</em>
</p>
<p className="movie-detail-overview">{movieDetails?.overview}</p>
<p className="movie-detail-genres">
<strong>Genres:</strong>{" "}
{movieDetails.genres.map((genre) => genre.name).join(", ")}
</p>
<p className="movie-detail-runtime">
<strong>Runtime:</strong> {movieDetails?.runtime} minutes
</p>
<a
href={movieDetails?.homepage}
target="_blank"
rel="noopener noreferrer"
className="movie-detail-link"
>
Official Website
</a>
{trailerKey && (
<div className="movie-trailer">
<h3>Watch Trailer:</h3>
<iframe
title="movie-trailer"
width="100%"
height="400"
src={`https://www.youtube.com/embed/${trailerKey}`}
frameBorder="0"
allowFullScreen
></iframe>
</div>
)}
</div>
</div>
</div>
);
}
if (searchResults?.length > 0) {
return (
<div>
<h1>Search Results for "{query}"</h1>
<div className="search-results">
{searchResults.map((movie) => (
<div
key={movie.id}
className="search-item"
onClick={() => navigate(`/search?id=${movie?.id}`)}
>
<img
src={`https://image.tmdb.org/t/p/w500/${movie?.poster_path}`}
alt={movie?.title}
className="search-item-poster"
/>
<h3>{movie?.title}</h3>
</div>
))}
</div>
</div>
);
}
return <p>No results found.</p>;
};
export default SearchPage;