From d90f9db6bb89b5a4daf58bd9b0ddfd3c97c95fae Mon Sep 17 00:00:00 2001 From: William Tran Date: Mon, 28 Jun 2021 16:47:48 -0400 Subject: [PATCH] Add debounce --- components/OrganizedContent.tsx | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/components/OrganizedContent.tsx b/components/OrganizedContent.tsx index 01b79d1f..56699795 100644 --- a/components/OrganizedContent.tsx +++ b/components/OrganizedContent.tsx @@ -208,6 +208,7 @@ const Footer = ({ headings, currentIndex, link: Link }: ChildProps) => { const Burger = ({ open, setOpen }: MobileProps) => { const [prevScrollPos, setPrevScrollPos] = useState(0); const [visible, setVisible] = useState(true); + const debouncedPrevScrollPos = useDebounce(prevScrollPos, 100); useEffect(() => { const handleScroll = () => { @@ -216,8 +217,8 @@ const Burger = ({ open, setOpen }: MobileProps) => { // set state based on location info (explained in more detail below) setVisible( - (prevScrollPos > currentScrollPos && - prevScrollPos - currentScrollPos > 70) || + (debouncedPrevScrollPos > currentScrollPos && + debouncedPrevScrollPos - currentScrollPos > 70) || currentScrollPos < 10 ); @@ -227,7 +228,7 @@ const Burger = ({ open, setOpen }: MobileProps) => { window.addEventListener("scroll", handleScroll); return () => window.removeEventListener("scroll", handleScroll); - }, [prevScrollPos, visible]); + }, [debouncedPrevScrollPos, visible]); const line1 = open ? styles.burgerLineOpen1 : styles.burgerLineClosed1; const line2 = open ? styles.burgerLineOpen2 : styles.burgerLineClosed2; @@ -288,3 +289,17 @@ function useOutsideAlerter( }; }, [ref, setOpen]); } + +function useDebounce(value: T, delay?: number): T { + const [debouncedValue, setDebouncedValue] = useState(value); + + useEffect(() => { + const timer = setTimeout(() => setDebouncedValue(value), delay || 500); + + return () => { + clearTimeout(timer); + }; + }, [value, delay]); + + return debouncedValue; +}