import Link from "next/link"; import { useState, useEffect } from "react"; import { ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, } from "@heroicons/react/24/outline"; const ChapterSelector = ({ chaptersData, data, setWatch, mangaId }) => { const [selectedProvider, setSelectedProvider] = useState( chaptersData[0]?.providerId || "" ); // const [selectedChapter, setSelectedChapter] = useState(""); const [chapters, setChapters] = useState([]); const [currentPage, setCurrentPage] = useState(1); const [chaptersPerPage] = useState(10); useEffect(() => { const selectedChapters = chaptersData.find( (c) => c.providerId === selectedProvider ); setChapters(selectedChapters?.chapters || []); // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedProvider, chaptersData]); useEffect(() => { setCurrentPage(1); }, [data.id]); // Get current posts const indexOfLastChapter = currentPage * chaptersPerPage; const indexOfFirstChapter = indexOfLastChapter - chaptersPerPage; const currentChapters = chapters.slice( indexOfFirstChapter, indexOfLastChapter ); // Create page numbers const pageNumbers = []; for (let i = 1; i <= Math.ceil(chapters.length / chaptersPerPage); i++) { pageNumbers.push(i); } // Custom function to handle pagination display const getDisplayedPageNumbers = (currentPage, totalPages, margin) => { const pageRange = [...Array(totalPages).keys()].map((i) => i + 1); if (totalPages <= 5) { return pageRange; } if (currentPage <= margin) { return [...pageRange.slice(0, margin), "...", totalPages]; } if (currentPage > totalPages - margin) { return [1, "...", ...pageRange.slice(-margin)]; } return [ 1, "...", ...pageRange.slice(currentPage - 2, currentPage + 1), "...", totalPages, ]; }; const displayedPageNumbers = getDisplayedPageNumbers( currentPage, pageNumbers.length, 3 ); useEffect(() => { if (chapters) { const getEpi = data?.nextAiringEpisode ? chapters[data?.mediaListEntry?.progress] : chapters[0]; if (getEpi) { const watchUrl = `/en/manga/read/${selectedProvider}?id=${mangaId}&chapterId=${encodeURIComponent( getEpi.id )}&anilist=${data.id}&num=${getEpi.number}`; setWatch(watchUrl); } else { setWatch(null); } } // eslint-disable-next-line react-hooks/exhaustive-deps }, [chapters]); return (
{chapter.title || `Chapter ${chapter.number}`}
{selectedProvider}
Showing{" "} {indexOfFirstChapter + 1} to{" "} {indexOfLastChapter > chapters.length ? chapters.length : indexOfLastChapter} {" "} of {chapters.length} chapters