useScrollPosition Hook
Get the current and previews scroll position of the browser window
Implementation
Interface
export interface IScrollPosition {
  x: number;
  y: number;
  prevX: number;
  prevY: number;
}
Utility-func
const isBrowser = typeof window !== 'undefined'
function getScrollPosition() {
  return isBrowser
    ? { x: window.pageXOffset, y: window.pageYOffset }
    : { x: 0, y: 0 };
}
Hook
import { useState, useEffect } from 'react';
export default function useScrollPosition() {
  const [position, setScrollPosition] = useState<IScrollPosition>({
    ...getScrollPosition(),
    prevX: getScrollPosition().x,
    prevY: getScrollPosition().y,
  });
  useEffect(() => {
    let requestRunning: null | number = null;
    function handleScroll() {
      if (isBrowser && requestRunning === null) {
        requestRunning = window.requestAnimationFrame(() => {
          setScrollPosition((prevScrollPosition) => {
            return {
              ...getScrollPosition(),
              prevX: prevScrollPosition.x,
              prevY: prevScrollPosition.y,
            };
          });
          requestRunning = null;
        });
      }
    }
    if (isBrowser) {
      window.addEventListener('scroll', handleScroll);
      return () => window.removeEventListener('scroll', handleScroll);
    }
  }, []);
  return position;
}