UNPKG

react-atom-trigger

Version:

React component to execute code when you scroll to an element. Simple react-waypoint alternative in typescript.

1 lines 3.62 kB
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`react`)):typeof define==`function`&&define.amd?define([`exports`,`react`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.reactAtomTrigger={},e.React))})(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var n=Object.create,r=Object.defineProperty,i=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,o=Object.getPrototypeOf,s=Object.prototype.hasOwnProperty,c=(e,t,n,o)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var c=a(t),l=0,u=c.length,d;l<u;l++)d=c[l],!s.call(e,d)&&d!==n&&r(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(o=i(t,d))||o.enumerable});return e};t=((e,t,i)=>(i=e==null?{}:n(o(e)),c(t||!e||!e.__esModule?r(i,`default`,{value:e,enumerable:!0}):i,e)))(t);let l=({scrollEvent:e,callback:n,getDebugInfo:r,triggerOnce:i=!1,className:a,behavior:o=`default`,dimensions:s,offset:c=[0,0,0,0]})=>{let l=t.default.useRef(null),[u,d]=t.default.useState(void 0),f=t.default.useRef(void 0),[p,m]=t.default.useState({leftViewport:0,enteredViewport:0});return t.default.useLayoutEffect(()=>{if(l.current){let e=l.current.getBoundingClientRect(),[t,n,r,i]=c;e.top>t&&e.bottom<s.height-r&&e.left>i&&e.right<s.width-n?d(`inViewport`):e.top>s.height-r?d(`bottom`):d(`top`)}},[l,e,s,c]),t.default.useLayoutEffect(()=>{if(f.current===void 0&&u!==void 0&&(f.current=u),u===`inViewport`&&(f.current===`bottom`||f.current===`top`)){if(o===`enter`&&(!i||i&&p.enteredViewport)||o===`default`&&(!i||i&&(p.enteredViewport<1||p.leftViewport<1))){n&&n();let e={...p,enteredViewport:p.enteredViewport+1};r&&r({timesTriggered:e,trigger:`entered`}),m(e)}f.current=u}if((u===`top`||u===`bottom`)&&f.current===`inViewport`&&(f.current=u,o===`leave`&&(!i||i&&p.leftViewport===0)||o===`default`&&(!i||i&&(p.leftViewport<1||p.enteredViewport<1)))){n&&n();let e={...p,leftViewport:p.leftViewport+1};r&&r({timesTriggered:e,trigger:`left`}),m(e)}},[u,n,i,o,r]),t.default.createElement(`div`,{ref:l,style:{display:`table`},className:a})};function u(e,t){}function d(){let{scrollX:e,scrollY:t}=window;return{scrollX:e,scrollY:t}}function f(){let{innerWidth:e,innerHeight:t}=window;return{width:e,height:t}}function p(e){let[n,r]=t.default.useState(f()),i=t.default.useRef(null),a=t.default.useRef(!1),o=e?.eventListenerTimeoutMs||15;return t.default.useEffect(()=>{r(f());function t(){i.current&&clearTimeout(i.current),i.current=setTimeout(()=>r(f()),o)}return window.addEventListener(`resize`,t,{passive:e?.passiveEventListener}),a.current=!0,()=>{a&&window.removeEventListener(`resize`,t)}},[]),n}function m({containerRef:e,options:n}){let[r,i]=t.default.useState(d()),a=t.default.useRef(null),o=t.default.useRef(!1);return t.default.useEffect(()=>{let t=e=>{let t=e.target;a.current&&clearTimeout(a.current),a.current=setTimeout(()=>{i({scrollX:t.scrollLeft,scrollY:t.scrollTop})},n?.eventListenerTimeoutMs||15)},r=e?.current;return r&&(r&&o.current===!1&&r.addEventListener(`scroll`,t,{passive:n?.passiveEventListener}),o.current=!0),()=>{o&&r&&r.removeEventListener(`scroll`,t)}},[e]),r}function h(e){let[n,r]=t.default.useState(d()),i=t.default.useRef(null),a=t.default.useRef(!1);return t.default.useEffect(()=>{let t=()=>{i.current&&clearTimeout(i.current),i.current=setTimeout(()=>{let{scrollX:e,scrollY:t}=d();r({scrollX:e,scrollY:t})},e?.eventListenerTimeoutMs||20)};return window.addEventListener(`scroll`,t,{passive:e?.passiveEventListener}),a.current=!0,()=>{a&&window.removeEventListener(`scroll`,t)}},[]),n}e.AtomTrigger=l,e.log=u,e.useContainerScroll=m,e.useWindowDimensions=p,e.useWindowScroll=h});