"use client"; import { motion } from "motion/react"; import { useEffect, useState } from "react"; import { TitleCardSkeleton } from "@/components/skeletons"; import { TitleCard } from "@/components/title-card"; interface Genre { id: number; name: string; } interface DiscoverResult { tmdbId: number; type: "movie" | "tv"; title: string; posterPath: string | null; releaseDate: string | null; voteAverage: number; } interface GenreBrowserProps { movieGenres: Genre[]; tvGenres: Genre[]; } const staggerContainer = { hidden: {}, visible: { transition: { staggerChildren: 0.04 } }, }; const staggerItem = { hidden: { opacity: 0, y: 12, scale: 0.98 }, visible: { opacity: 1, y: 0, scale: 1, transition: { type: "spring" as const, stiffness: 300, damping: 24 }, }, }; export function GenreBrowser({ movieGenres, tvGenres }: GenreBrowserProps) { const [mediaType, setMediaType] = useState<"movie" | "tv">("movie"); const [selectedGenre, setSelectedGenre] = useState(null); const [results, setResults] = useState([]); const [loading, setLoading] = useState(false); const genres = mediaType === "movie" ? movieGenres : tvGenres; function switchMediaType(type: "movie" | "tv") { setMediaType(type); setSelectedGenre(null); setResults([]); } useEffect(() => { if (selectedGenre === null) { setResults([]); return; } let cancelled = false; setLoading(true); fetch( `/api/explore/discover?type=${mediaType}&genre=${selectedGenre}&sort_by=popularity.desc`, ) .then((r) => r.json()) .then((data) => { if (!cancelled) { setResults(data.results ?? []); } }) .finally(() => { if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, [selectedGenre, mediaType]); return (

Browse by Genre

{/* Genre chips */}
{genres.map((genre) => ( ))}
{/* Results */} {loading && (
{Array.from({ length: 10 }).map((_, i) => ( // biome-ignore lint/suspicious/noArrayIndexKey: static skeleton placeholders ))}
)} {!loading && results.length > 0 && ( {results.slice(0, 20).map((r) => ( ))} )} {!loading && selectedGenre !== null && results.length === 0 && (

No titles found for this genre.

)}
); }