UNPKG

motion

Version:

The Motion library for the web

34 lines (31 loc) 1.39 kB
import { useEffect } from 'react'; import { useGestureState } from './use-gesture-state.es.js'; function useViewport(ref, target, options, { inViewport, poses, viewport = {}, onViewportEnter, onViewportLeave, }, { inViewport: inheritedInViewport }, isPoseActive) { const { root, margin: rootMargin, once, threshold } = viewport; const [isInViewport, setViewportState] = useGestureState(target, options, inViewport, inheritedInViewport, poses); isPoseActive.inViewport = isInViewport; let shouldObserve = !!inViewport || !!onViewportEnter || !!onViewportLeave; if (once && isInViewport) shouldObserve = false; useEffect(() => { if (!shouldObserve || typeof IntersectionObserver === "undefined") return; const observer = new IntersectionObserver(([entry]) => { setViewportState(entry.isIntersecting); const callback = entry.isIntersecting ? onViewportEnter : onViewportLeave; callback && callback(entry); }, { root: root === null || root === void 0 ? void 0 : root.current, rootMargin, threshold }); observer.observe(ref.current); return () => observer.disconnect(); }, [ inViewport, onViewportEnter, onViewportLeave, root, rootMargin, threshold, ]); } export { useViewport };