From 9f5d9cc424cfbcc6ac1819a5b4fa48fd7b57c22d Mon Sep 17 00:00:00 2001 From: Factiven Date: Sun, 23 Apr 2023 23:34:10 +0700 Subject: Added Infinite Scroll at [param].js --- pages/search/[param].js | 217 +++++++++++++++++++++++++++++++----------------- 1 file changed, 141 insertions(+), 76 deletions(-) diff --git a/pages/search/[param].js b/pages/search/[param].js index ca20b40..78da79e 100644 --- a/pages/search/[param].js +++ b/pages/search/[param].js @@ -64,20 +64,23 @@ export default function Card() { hasil = null; tipe = "MANGA"; } - // console.log(hasil); + // ; const [search, setQuery] = useState(hasil); const [type, setSelectedType] = useState(tipe); const [seasonYear, setSeasonYear] = useState(); const [season, setSeason] = useState(); const [genres, setSelectedGenre] = useState(); - const [perPage, setPerPage] = useState(25); + const [perPage, setPerPage] = useState(10); const [sort, setSelectedSort] = useState(["POPULARITY_DESC"]); const [isVisible, setIsVisible] = useState(false); const inputRef = useRef(null); + const [page, setPage] = useState(1); + const [nextPage, setNextPage] = useState(true); + async function advance() { setLoading(true); const data = await aniAdvanceSearch( @@ -86,17 +89,55 @@ export default function Card() { seasonYear, season, genres, + page, perPage, sort ); - setData(data); + if (data.media.length === 0) { + setNextPage(false); + } else if (data !== null && page > 1) { + setData((prevData) => { + return [...(prevData ?? []), ...data.media]; + }); + setNextPage(data.pageInfo.hasNextPage); + } else { + setData(data.media); + } + setNextPage(data.pageInfo.hasNextPage); setLoading(false); } useEffect(() => { + setData(null); + setPage(1); + setNextPage(true); advance(); }, [search, type, seasonYear, season, genres, perPage, sort]); + useEffect(() => { + advance(); + }, [page]); + + useEffect(() => { + function handleScroll() { + if (page > 10 || !nextPage) { + window.removeEventListener("scroll", handleScroll); + return; + } + + if ( + window.innerHeight + window.pageYOffset >= + document.body.offsetHeight - 0 + ) { + setPage((prevPage) => prevPage + 1); + } + } + + window.addEventListener("scroll", handleScroll); + + return () => window.removeEventListener("scroll", handleScroll); + }, [page, nextPage]); + const handleKeyDown = async (event) => { if (event.key === "Enter") { event.preventDefault(); @@ -125,7 +166,7 @@ export default function Card() { router.push(`/search/${e.target.value.toLowerCase()}`); } - // console.log(genres); + // ); return ( <> @@ -171,7 +212,10 @@ export default function Card() {

SORT

setSelectedGenre(e.target.value)} + onChange={(e) => + setSelectedGenre( + e.target.value === "undefined" + ? undefined + : e.target.value + ) + } > - + {genre.map((option) => { - // console.log(option); return (