import { useEffect, useRef, useState } from "react"; interface UseIntersectionObserverOptions { threshold?: number; root?: Element | null; rootMargin?: string; } export function useIntersectionObserver( options: UseIntersectionObserverOptions = {}, ) { const { threshold = 0.1, root = null, rootMargin = "0px" } = options; const [isIntersecting, setIsIntersecting] = useState(false); const [hasIntersected, setHasIntersected] = useState(false); const elementRef = useRef(null); useEffect(() => { const element = elementRef.current; if (!element) return; const observer = new IntersectionObserver( ([entry]) => { const isElementIntersecting = entry.isIntersecting; setIsIntersecting(isElementIntersecting); if (isElementIntersecting && !hasIntersected) { setHasIntersected(true); } }, { threshold, root, rootMargin, }, ); observer.observe(element); return () => { observer.unobserve(element); }; }, [threshold, root, rootMargin, hasIntersected]); return { ref: elementRef, isIntersecting, hasIntersected, }; }