import { useEffect, useState } from "react";

const useProximity = (elemRef, perimeter = 100) => {
  const [withinPerimeter, setWithinPerimeter] = useState(false);

  useEffect(() => {
    if (!elemRef || !elemRef.current) return;

    let ticking = false;
    const { current } = elemRef;
    const { top, right, bottom, left } = current.getBoundingClientRect();
    const perimeterBounds = {
      top: top - perimeter,
      right: right + perimeter,
      bottom: bottom + perimeter,
      left: left - perimeter
    };

    const update = ({ clientX, clientY }) => {
      if (
        clientX > perimeterBounds.left &&
        clientX < perimeterBounds.right &&
        clientY > perimeterBounds.top &&
        clientY < perimeterBounds.bottom
      ) {
        setWithinPerimeter(true);
      } else {
        setWithinPerimeter(false);
      }

      ticking = false;
    };

    const onMousemove = event => {
      if (!ticking) {
        window.requestAnimationFrame(() => {
          update(event);
        });

        ticking = true;
      }
    };

    document.addEventListener("mousemove", onMousemove);
    return () => document.removeEventListener("mousemove", onMousemove);
  }, [elemRef, perimeter]);

  return withinPerimeter;
};