"use client"; import { useEffect, useState } from "react"; import { SearchBar } from "@/components/SearchBar"; import { MovieHeader } from "@/components/MovieHeader"; import { MovieInsightPanel } from "@/components/MovieInsightPanel"; import type { TmdbMovieDetails, TmdbSearchResult } from "@/lib/tmdb"; export default function HomePage() { const [selectedMovie, setSelectedMovie] = useState( null, ); const [movieDetails, setMovieDetails] = useState( null, ); const [isLoadingMovie, setIsLoadingMovie] = useState(false); const [movieError, setMovieError] = useState(null); // Preload a random interesting movie on initial page load to demonstrate the app useEffect(() => { const DEMO_IDS = [27205, 157336, 155, 550, 496243, 424]; // Inception, Interstellar, Dark Knight, Fight Club, Parasite, Schindler's List const loadDemo = async () => { const id = DEMO_IDS[Math.floor(Math.random() * DEMO_IDS.length)]; try { const res = await fetch(`/api/movie/${id}`); if (!res.ok) return; const details: TmdbMovieDetails = await res.json(); const minimalSearch: TmdbSearchResult = { id: details.id, title: details.title, release_date: details.release_date || "", poster_path: details.poster_path, overview: details.overview || "", }; setSelectedMovie(minimalSearch); setMovieDetails(details); } catch { // silently fall back to empty state if demo preload fails } }; if (!selectedMovie) { void loadDemo(); } }, []); const handleSelect = async (movie: TmdbSearchResult) => { setSelectedMovie(movie); setMovieDetails(null); setMovieError(null); setIsLoadingMovie(true); try { const res = await fetch(`/api/movie/${movie.id}`); if (!res.ok) { throw new Error("Failed to load movie details"); } const details: TmdbMovieDetails = await res.json(); setMovieDetails(details); } catch (err) { setMovieError( err instanceof Error ? err.message : "Failed to load movie details", ); } finally { setIsLoadingMovie(false); } }; const hasFullMovie = movieDetails != null; return ( <> {/* Compact navbar: title + slogan on left, search on right */}
{!selectedMovie && (

Search for any film using the bar above. We'll generate ratings explained, skip guides, sensitivity warnings, production facts, and more.

)} {selectedMovie && (
{hasFullMovie ? ( ) : (

{selectedMovie.title} {selectedMovie.release_date ? ( ({selectedMovie.release_date.slice(0, 4)}) ) : null}

{selectedMovie.overview && (

{selectedMovie.overview}

)} {isLoadingMovie && (

Loading extended details...

)} {movieError && (

{movieError}. Card content will still load.

)}
)} g.name) ?? []} />
)}
); }