import { t } from "i18next"; import { useEffect, useRef, useState } from "react"; import { useNavigate } from "react-router-dom"; import { getCuratedMovieLists, getMovieDetailsForIds, } from "@/backend/metadata/traktApi"; import { TMDBMovieData } from "@/backend/metadata/types/tmdb"; import type { CuratedMovieList } from "@/backend/metadata/types/trakt"; import { Icon, Icons } from "@/components/Icon"; import { WideContainer } from "@/components/layout/WideContainer"; import { MediaCard } from "@/components/media/MediaCard"; import { Heading1 } from "@/components/utils/Text"; import { useIsMobile } from "@/hooks/useIsMobile"; import { CarouselNavButtons } from "@/pages/discover/components/CarouselNavButtons"; import { SubPageLayout } from "@/pages/layouts/SubPageLayout"; import { useDiscoverStore } from "@/stores/discover"; import { useOverlayStack } from "@/stores/interface/overlayStack"; import { MediaItem } from "@/utils/mediaTypes"; import { MediaCarousel } from "./components/MediaCarousel"; export function DiscoverMore() { const [curatedLists, setCuratedLists] = useState([]); const [movieDetails, setMovieDetails] = useState<{ [listSlug: string]: TMDBMovieData[]; }>({}); const { showModal } = useOverlayStack(); const carouselRefs = useRef<{ [key: string]: HTMLDivElement | null }>({}); const navigate = useNavigate(); const { lastView } = useDiscoverStore(); const { isMobile } = useIsMobile(); useEffect(() => { const fetchCuratedLists = async () => { try { const lists = await getCuratedMovieLists(); setCuratedLists(lists); // Fetch movie details for each list one after another const details: { [listSlug: string]: TMDBMovieData[] } = {}; for (const list of lists) { try { const movies = await getMovieDetailsForIds(list.tmdbIds, 50); if (movies.length > 0) { details[list.listSlug] = movies; setMovieDetails({ ...details }); } } catch (error) { console.error( `Failed to fetch movies for list ${list.listSlug}:`, error, ); } } } catch (error) { console.error("Failed to fetch curated lists:", error); } }; fetchCuratedLists(); }, []); const handleShowDetails = async (media: MediaItem) => { showModal("discover-details", { id: Number(media.id), type: media.type === "movie" ? "movie" : "show", }); }; const handleBack = () => { if (lastView) { navigate(lastView.url); window.scrollTo(0, lastView.scrollPosition); } else { navigate(-1); } }; const handleWheel = (e: React.WheelEvent) => { if (Math.abs(e.deltaX) > Math.abs(e.deltaY)) { e.stopPropagation(); e.preventDefault(); } }; return (
{t("discover.allLists")}
{/* Latest Movies */}
{/* Top Rated Movies */}
{/* Curated Movie Lists */} {curatedLists.map((list) => (

{list.listName}

{ carouselRefs.current[list.listSlug] = el; }} onWheel={handleWheel} >
{movieDetails[list.listSlug]?.map((movie: TMDBMovieData) => (
))}
{!isMobile && ( )}
))} ); }