import { useState } from 'react' import { useHasTmdbKey } from '../hooks/use-external' import LazyMount from '../components/ui/LazyMount' import { usePreferencesStore } from '../stores/preferences-store' import { regionForUser } from '../lib/format' import DiscoverFilters, { DEFAULT_FILTERS, hasAnyActiveFilters, type DiscoverFilterState, } from '../components/discover/DiscoverFilters' import TonightHero from '../components/discover/TonightHero' import { MoodChips, MoodRow } from '../components/discover/MoodChips' import Roulette from '../components/discover/Roulette' import DecadeStrip from '../components/discover/DecadeStrip' import CanonicalLists from '../components/discover/CanonicalLists' import OnThisDay from '../components/discover/OnThisDay' import LibraryGapFinder from '../components/discover/LibraryGapFinder' import { BrowseSection, genreTiles, languageTiles, studioTiles, networkTiles, type BrowseKey, } from '../components/discover/BrowseGrid' import { NoKey, Hero } from './discover/chrome' import { FilteredGrid } from './discover/filtered-grid' import { TrendingDayRow, TrendingWeekRow, PopularMoviesRow, PopularTvRow, UpcomingMoviesRow, TopRatedMoviesRow, TopRatedTvRow, CultClassicsRow, } from './discover/rows' /** * Discover page - intent-driven entry to TMDB content the user doesn't * already have. * * Layout: * 1. Compact page header * 2. Sticky filter bar (movie/tv + advanced filters) * 3. Editorial spotlight - one big "pick of the day" * 4. Mood chips - 10 vibes that resolve to a single content row * 5. 3-4 curated rows (Trending / Acclaimed / Coming soon / etc.) * 6. Browse-by sections: genre, language, studio, network - compact * tile grids with inline expansion when a tile is clicked * * Active filters take over the page with the existing FilteredGrid - that * mode is unchanged so the filter workflow stays familiar. */ export default function DiscoverPage() { const hasTmdb = useHasTmdbKey() const prefs = usePreferencesStore() const region = prefs.region || regionForUser() const [filters, setFilters] = useState(() => ({ ...DEFAULT_FILTERS, watchRegion: region, })) const [moodId, setMoodId] = useState(null) const [decade, setDecade] = useState(null) const [expanded, setExpanded] = useState(null) if (!hasTmdb) return const filterMode = hasAnyActiveFilters(filters) const kind = filters.kind // Reset the mood / expansion when toggling movie<->tv since both are // kind-scoped and the previously-active mood may not exist on the // other side. function onFiltersChange(next: DiscoverFilterState) { if (next.kind !== filters.kind) { setMoodId(null) setDecade(null) setExpanded(null) } setFilters(next) } return (
{filterMode ? ( ) : ( <>
{moodId && (
)}
{kind === 'movie' ? ( <> ) : ( <> )}
{kind === 'movie' && } {kind === 'movie' && } {kind === 'movie' && }
Browse by
{kind === 'movie' && ( )} {kind === 'movie' && ( )} {kind === 'tv' && ( )} )}
) }