import { useEffect, useState, Fragment } from "react"; import { ChevronDownIcon, ClockIcon } from "@heroicons/react/20/solid"; import { convertSecondsToTime } from "../../utils/getTimes"; import ChangeView from "./changeView"; import ThumbnailOnly from "./viewMode/thumbnailOnly"; import ThumbnailDetail from "./viewMode/thumbnailDetail"; import ListMode from "./viewMode/listMode"; import axios from "axios"; export default function AnimeEpisode({ info, progress }) { const [providerId, setProviderId] = useState(); // default provider const [currentPage, setCurrentPage] = useState(1); // for pagination const [visible, setVisible] = useState(false); // for mobile view const itemsPerPage = 13; // choose your number of items per page const [loading, setLoading] = useState(true); const [artStorage, setArtStorage] = useState(null); const [view, setView] = useState(3); const [isDub, setIsDub] = useState(false); const [providers, setProviders] = useState(null); useEffect(() => { setLoading(true); setProviders(null); const fetchData = async () => { try { const { data: firstResponse } = await axios.get( `/api/consumet/episode/${info.id}${isDub === true ? "?dub=true" : ""}` ); if (firstResponse.data.length > 0) { const defaultProvider = firstResponse.data?.find( (x) => x.providerId === "gogoanime" ); setProviderId( defaultProvider?.providerId || firstResponse.data[0].providerId ); // set to first provider id } setArtStorage(JSON.parse(localStorage.getItem("artplayer_settings"))); setProviders(firstResponse.data); setLoading(false); } catch (error) { setLoading(false); setProviders([]); } }; fetchData(); }, [info.id, isDub]); const episodes = providers?.find((provider) => provider.providerId === providerId) ?.episodes || []; const lastEpisodeIndex = currentPage * itemsPerPage; const firstEpisodeIndex = lastEpisodeIndex - itemsPerPage; const currentEpisodes = episodes.slice(firstEpisodeIndex, lastEpisodeIndex); const totalPages = Math.ceil(episodes.length / itemsPerPage); const handleChange = (event) => { setProviderId(event.target.value); }; const handlePageChange = (pageNumber) => { setCurrentPage(pageNumber); }; useEffect(() => { if (episodes?.some((item) => item?.title === null)) { setView(3); } }, [providerId, episodes]); return ( <>
{info && (

Episodes

)} {info?.nextAiringEpisode && (

Next :

{convertSecondsToTime( info.nextAiringEpisode.timeUntilAiring )}
)}
setIsDub((prev) => !prev)} className="flex lg:hidden flex-col items-center relative rounded-md bg-secondary py-1.5 px-3 font-karla text-sm hover:ring-1 ring-action cursor-pointer group" > {isDub ? "Dub" : "Sub"} Switch to {isDub ? "Sub" : "Dub"}
setVisible(!visible)} >
{providers && (
setIsDub((prev) => !prev)} className="hidden lg:flex flex-col items-center relative rounded-[3px] bg-secondary py-1 px-3 font-karla text-sm hover:ring-1 ring-action cursor-pointer group" > {isDub ? "Dub" : "Sub"} Switch to {isDub ? "Sub" : "Dub"}
)} {providers && providers.length > 0 && ( <>
{/* Select Providers */}
{totalPages > 1 && (
)}
)}
{/* Episodes */} {!loading ? (
{Array.isArray(providers) ? ( providers.length > 0 ? ( currentEpisodes.map((episode, index) => { return ( {view === 1 && ( )} {view === 2 && ( )} {view === 3 && ( )} ); }) ) : (

Oops!

It looks like this anime is not available.

) ) : (

{providers.message}

)}
) : (
)}
); }