diff --git a/src/components/nav.js b/src/components/nav.js index d8bb287..6df3960 100644 --- a/src/components/nav.js +++ b/src/components/nav.js @@ -42,7 +42,7 @@ export default function Nav() { const logoRef = useRef(); useEffect(() => { const throttled = throttle(() => logoRef.current.rotate(window.scrollY), 200, { trailing: true }); - window.addEventListener("scroll", throttled); + window.addEventListener("scroll", throttled, { passive: true }); return () => window.removeEventListener("scroll", throttled); }, []); diff --git a/src/components/scroll.js b/src/components/scroll.js new file mode 100644 index 0000000..08b0343 --- /dev/null +++ b/src/components/scroll.js @@ -0,0 +1,68 @@ +import React, { useEffect } from "react"; +import { throttle } from "lodash"; + +let currScreen = 0; +const minScreen = 0; +const maxScreen = 4; // todo: unhardcode? + +const scrollScreen = throttle(isScrolledDown => { + const scrollMod = isScrolledDown ? 1 : -1; + + console.log(currScreen + scrollMod); + if (currScreen + scrollMod < minScreen || currScreen + scrollMod > maxScreen) return; + + console.log((currScreen + scrollMod) * window.innerHeight); + window.scrollTo(0, (currScreen + scrollMod) * window.innerHeight); + currScreen += scrollMod; +}, 1500, { leading: true, trailing: false }); + +const scrollScreenWheel = e => { + e.preventDefault(); + if (e.deltaY === 0) return; + scrollScreen(e.deltaY > 0); +}; + +let scrollY; + +const screenSwipeStart = throttle(e => { + scrollY = e.touches[0].clientY; +}, 200); + +const screenSwipeMove = throttle(e => { + if (!scrollY) return; + + const currY = e.touches[0].clientY; + if (currY - scrollY === 0) return; + scrollScreen(currY > scrollY); + scrollY = null; + + e.preventDefault(); +}, 200); + + +export default function Scroll() { + useEffect(() => { + window.addEventListener("wheel", scrollScreenWheel, { passive: false }); + window.addEventListener("touchstart", screenSwipeStart); + window.addEventListener("touchmove", screenSwipeMove); + + return () => { + window.removeEventListener("wheel", scrollScreenWheel); + window.removeEventListener("touchstart", screenSwipeStart); + window.removeEventListener("touchmove", screenSwipeMove); + }; + }, []); + + return ( +