From 482b1c8db5cfeaa20d75ce92fcb10f3ca8433633 Mon Sep 17 00:00:00 2001 From: Factiven Date: Fri, 14 Apr 2023 00:07:02 +0700 Subject: Update 5th --- pages/components/scrollTracker.js | 146 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 pages/components/scrollTracker.js (limited to 'pages/components/scrollTracker.js') diff --git a/pages/components/scrollTracker.js b/pages/components/scrollTracker.js new file mode 100644 index 0000000..66419bb --- /dev/null +++ b/pages/components/scrollTracker.js @@ -0,0 +1,146 @@ +import { useState, useEffect } from "react"; +import { motion as m, AnimatePresence } from "framer-motion"; + +const ScrollTracker = () => { + const [scrollPercentage, setScrollPercentage] = useState(0); + const [scrolling, setScrolling] = useState(false); + // console.log(id); + + function handleUnload() { + const currentChapter = localStorage.getItem("currentChapterId"); + const scrollData = JSON.parse(localStorage.getItem("watchedManga")) || []; + const scroll = localStorage.getItem("scrollPercentage"); + if (scroll < 5) { + return; + } + + const existingDataIndex = scrollData.findIndex( + (data) => data.id === currentChapter + ); + if (existingDataIndex !== -1) { + // Update existing data + scrollData[existingDataIndex].timestamp = Date.now(); + scrollData[existingDataIndex].percentage = parseFloat( + localStorage.getItem("scrollPercentage") + ); + } else { + // Add new data + scrollData.push({ + timestamp: Date.now(), + percentage: parseFloat(localStorage.getItem("scrollPercentage")), + id: currentChapter, + }); + } + + localStorage.setItem("watchedManga", JSON.stringify(scrollData)); + } + + function handlePageHide() { + localStorage.setItem("scrollPercentage", scrollPercentage); + handleUnload; + } + + // console.log(data?.id); + + useEffect(() => { + function handleScroll() { + const scrollTop = document.documentElement.scrollTop; + const scrollHeight = + document.documentElement.scrollHeight - + document.documentElement.clientHeight; + const percentage = (scrollTop / scrollHeight) * 100; + setScrollPercentage(percentage); + localStorage.setItem("scrollPercentage", percentage); + } + + function handlePageshow() { + const currentChapter = localStorage.getItem("currentChapterId"); + const lastScrollPercentage = + JSON.parse(localStorage.getItem("watchedManga")) + ?.filter((data) => data.id === currentChapter) + .map((data) => data.percentage) || 0; + + if (lastScrollPercentage >= 95) { + return; + } + + const scrollTop = + (lastScrollPercentage / 100) * + (document.documentElement.scrollHeight - + document.documentElement.clientHeight); + document.documentElement.scrollTop = scrollTop; + } + + window.addEventListener("scroll", handleScroll); + window.addEventListener("pageshow", handlePageshow); + window.addEventListener("beforeunload", handleUnload); + window.addEventListener("pagehide", handlePageHide); + + return () => { + window.removeEventListener("scroll", handleScroll); + window.removeEventListener("pageshow", handlePageshow); + window.removeEventListener("beforeunload", handleUnload); + window.removeEventListener("pagehide", handlePageHide); + }; + }, []); + + useEffect(() => { + if (scrollPercentage > 5) { + setScrolling(true); + } else { + setScrolling(false); + } + }, [scrollPercentage]); + + function handleScrollTop(e) { + e.preventDefault(); + window.scrollTo({ + top: 0, + behavior: "smooth", + }); + } + + // console.log(scrollPercentage); + + return ( + <> + + {scrolling && ( + + + + + + )} + +
+
+
+
+
+ + ); +}; + +export default ScrollTracker; -- cgit v1.2.3