Newer
Older
My-Portfolio / frontend / src / components / sections / ElementObserver.jsx
import { useEffect, useState } from "react";

const ElementObserver = (selectors, options = { threshold: 0.2 }) => {
  const [visibleElements, setVisibleElements] = useState(new Set());

  useEffect(() => {
    const elements = selectors.flatMap((selector) =>
      Array.from(document.querySelectorAll(selector))
    );
    if (elements.length === 0) return;

    const handleIntersection = (entries) => {
      entries.forEach((entry) => {
        setVisibleElements((prevVisibleElements) => {
          const newVisibleElements = new Set(prevVisibleElements);
          if (entry.isIntersecting) {
            newVisibleElements.add(entry.target);
          } else {
            newVisibleElements.delete(entry.target);
          }
          return newVisibleElements;
        });
      });
    };

    const observer = new IntersectionObserver(handleIntersection, options);
    elements.forEach((element) => observer.observe(element));

    return () => elements.forEach((element) => observer.unobserve(element));
  }, [selectors, options]);

  return (element) => visibleElements.has(element);
};

export default ElementObserver;