import React, { useCallback, useMemo, useState } from "react"; import { useParams } from "react-router-dom"; import { Icon, Icons } from "@/components/Icon"; import { useLoading } from "@/hooks/useLoading"; import { MWMediaType, MWSeasonWithEpisodeMeta } from "@/backend/metadata/types"; import { getMetaFromId } from "@/backend/metadata/getmeta"; import { decodeJWId } from "@/backend/metadata/justwatch"; import { Loading } from "@/components/layout/Loading"; import { IconPatch } from "@/components/buttons/IconPatch"; import { useVideoPlayerState } from "../VideoContext"; import { VideoPlayerIconButton } from "../parts/VideoPlayerIconButton"; import { VideoPopout } from "../parts/VideoPopout"; interface Props { className?: string; } function PopupSection(props: { children?: React.ReactNode; className?: string; }) { return (
{props.children}
); } function PopupEpisodeSelect() { const params = useParams<{ media: string; }>(); const { videoState } = useVideoPlayerState(); const [isPickingSeason, setIsPickingSeason] = useState(false); const { current, seasons } = videoState.seasonData; const [currentVisibleSeason, setCurrentVisibleSeason] = useState<{ seasonId: string; season?: MWSeasonWithEpisodeMeta; } | null>(null); const [reqSeasonMeta, loading, error] = useLoading( (id: string, seasonId: string) => { return getMetaFromId(MWMediaType.SERIES, id, seasonId); } ); const requestSeason = useCallback( (sId: string) => { setCurrentVisibleSeason({ seasonId: sId, season: undefined, }); setIsPickingSeason(false); reqSeasonMeta(decodeJWId(params.media)?.id as string, sId).then((v) => { if (v?.meta.type !== MWMediaType.SERIES) return; setCurrentVisibleSeason({ seasonId: sId, season: v?.meta.seasonData, }); }); }, [reqSeasonMeta, params.media] ); const currentSeasonId = currentVisibleSeason?.seasonId ?? current?.seasonId; const setCurrent = useCallback( (seasonId: string, episodeId: string) => { videoState.setCurrentEpisode(seasonId, episodeId); }, [videoState] ); const currentSeasonInfo = useMemo(() => { return seasons?.find((season) => season.id === currentSeasonId); }, [seasons, currentSeasonId]); const currentSeasonEpisodes = useMemo(() => { if (currentVisibleSeason?.season) { return currentVisibleSeason?.season?.episodes; } return videoState?.seasonData.seasons?.find?.( (season) => season && season.id === currentSeasonId )?.episodes; }, [videoState, currentSeasonId, currentVisibleSeason]); const toggleIsPickingSeason = () => { setIsPickingSeason(!isPickingSeason); }; const setSeason = (id: string) => { requestSeason(id); setCurrentVisibleSeason({ seasonId: id }); }; if (isPickingSeason) return ( <> Pick a season
{currentSeasonInfo ? videoState?.seasonData?.seasons?.map?.((season) => (
setSeason(season.id)} > {season.title}
)) : "No season"}
); return ( <> {currentSeasonInfo?.title || ""} {loading ? (
) : error ? (

Something went wrong loading the episodes for{" "} {currentSeasonInfo?.title?.toLowerCase()}

) : (
{currentSeasonEpisodes && currentSeasonInfo ? currentSeasonEpisodes.map((e) => (
setCurrent(currentSeasonInfo.id, e.id)} key={e.id} > {e.number}. {e.title}
)) : "No episodes"}
)}
); } export function SeriesSelectionControl(props: Props) { const { videoState } = useVideoPlayerState(); if (!videoState.seasonData.isSeries) return null; return (
videoState.openPopout("episodes")} />
); }