react-intersections
Version:
## Installation
2 lines (1 loc) • 1.83 kB
JavaScript
import{useState as t,useRef as e,useCallback as n,useEffect as i}from"react";var r=new Set,o=null,a=0,l=function(){o?(null==o||o.forEach((function(t){t.dataset.lastViewStarted=performance.now()})),r=o,o=null):(o=r,r=[],null==o||o.forEach((function(t){!function(t){var e=t.dataset.lastViewStarted,n=performance.now();if(e){var i=n-parseFloat(e);a+=i}t.dataset.lastViewStarted=n.toString()}(t),t.dataset.lastViewStarted=0})))},s=window&&window.__assign||function(){return s=Object.assign||function(t){for(var e,n=1,i=arguments.length;n<i;n++)for(var r in e=arguments[n])Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t},s.apply(this,arguments)},u=function(o){var u=t({inView:!1,visibilityTime:0,entry:null}),c=u[0],v=u[1],d=s({root:window.document,threshold:.5,rootMargin:"0px"},o),f=e(!1),w=function(t){var e;return(null==t?void 0:t.root)instanceof Document?null==t?void 0:t.root:null===(e=null==t?void 0:t.root)||void 0===e?void 0:e.current}(d),b=e(null),V=new IntersectionObserver((function(t){!function(t){var e=t.entries,n=t.inViewStateForObserveOnce,i=t.observerOptions,o=t.observer,s=t.setInViewData;e.forEach((function(t){var e,u=t.target;if(l(),t.isIntersecting?(u.dataset.lastViewStarted=t.time,s({inView:!0,visibilityTime:a,entry:t}),n.current=!0,null===(e=null==i?void 0:i.callback)||void 0===e||e.call(i,{entry:t,inView:!0,visibilityTime:a}),null==r||r.add(u)):(s({inView:!1,visibilityTime:i.getLastVisibleData?a:void 0,entry:t}),null==r||r.delete(u)),i.observeOnce&&n.current)return o.disconnect()}))}({entries:t,inViewStateForObserveOnce:f,observer:V,observerOptions:d,setInViewData:v,targetRef:b,inViewData:c})}),s(s({},d),{root:w})),p=n((function(){(null==b?void 0:b.current)&&V.observe(null==b?void 0:b.current)}),[]);return i((function(){p()}),[p]),s({targetRef:b},c)};export{u as useInViewTrigger};