"use client"; // needed for client-specific features like interactivity, state, event handlers import {useState, useEffect} from "react"; import {useRouter} from "next/navigation"; import { useRef } from "react"; type movie = { // define TypeScript type for movie title: string; slug?: string; poster?: string | null; }; export default function Home() { const [search, setSearch] = useState(""); const [error, setError] = useState(""); const router = useRouter(); // router object for navigating to other pages const likesRef = useRef(null); const recsRef = useRef(null); const scroll = ( ref: React.RefObject, dir: "left" | "right" ) => { if (ref.current) { ref.current.scrollBy({ left: dir === "left" ? -700 : 700, behavior: "smooth", }); } }; const userSearch = async (e: any) => { // handles form submission - must be async for await to work (await = pauses until JSON parsing is complete!) e.preventDefault(); // prevent default form submission (page reloading) if (!search.trim()) return; try { const res = await fetch(`/api/search?q=${encodeURIComponent(search)}`); const movies: movie[] = await res.json(); // convert HTTP response from JSON into JS array of movie objects if (movies.length > 0 && movies[0].slug) // if at least one movie is returned from API and first movie has a slug defined router.push(`/movie/${movies[0].slug}`); // then navigate user to movie detail page using slug of first movie in results else setError("Movie not found"); // if no movies were returned or first movie has no slug, show error message } catch (err) { setError("Error fetching movies"); console.error(err); } }; return (
{ setSearch(e.target.value); // update search text as user types setError(""); // clear error when user starts typing }} className="px-4 py-2 border rounded bg-box w-230" /> {search && ( // clear button )}

Your Likes

Movie 1
Movie 2
Movie 3
Movie 4
Movie 5
Movie 6

Your Recommendations

Movie 1
Movie 2
Movie 3
Movie 4
Movie 5
Movie 6
); }