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 (

Chapters

{currentChapters.map((chapter, index) => { const isRead = chapter.number <= data?.mediaListEntry?.progress; return ( 6 ? "" : `&anilist=${data.id}`}&num=${ chapter.number }`} className={`flex gap-3 py-4 hover:bg-secondary odd:bg-secondary/30 even:bg-primary`} >
{chapter.number}

{chapter.title || `Chapter ${chapter.number}`}

{selectedProvider}

); })}

Showing{" "} {indexOfFirstChapter + 1} to{" "} {indexOfLastChapter > chapters.length ? chapters.length : indexOfLastChapter} {" "} of {chapters.length} chapters

); }; export default ChapterSelector;