@thibault.sh/hooks
Version:
A comprehensive collection of React hooks for browser storage, UI interactions, and more
2 lines • 1.7 kB
JavaScript
var chunkWYUJXBCZ_cjs=require('./chunk-WYUJXBCZ.cjs'),react=require('react');function w(R={}){let{delay:a=400,preventContext:p=!0,onPress:c,onLongPress:u,onLongPressCanceled:s}=R,t=react.useRef(),P=react.useRef(0),r=react.useRef(),[e,n]=react.useState({isPressed:!1,isLongPressed:!1,progress:0}),f=react.useCallback(()=>{if(!P.current||!e.isPressed)return;let o=Date.now()-P.current,i=Math.min(o/a,1);n(b=>chunkWYUJXBCZ_cjs.b(chunkWYUJXBCZ_cjs.a({},b),{progress:i})),i<1&&(r.current=requestAnimationFrame(f));},[a,e.isPressed]);react.useEffect(()=>()=>{r.current&&cancelAnimationFrame(r.current),t.current&&clearTimeout(t.current);},[]);let L=react.useCallback(o=>{p&&o.preventDefault(),P.current=Date.now(),n({isPressed:!0,isLongPressed:!1,progress:0}),r.current=requestAnimationFrame(f),t.current=setTimeout(()=>{n(i=>chunkWYUJXBCZ_cjs.b(chunkWYUJXBCZ_cjs.a({},i),{isLongPressed:!0})),u==null||u();},a);},[a,u,p,f]),v=react.useCallback(o=>{r.current&&cancelAnimationFrame(r.current),t.current&&clearTimeout(t.current),e.isLongPressed||(e.progress<1&&(s==null||s()),c==null||c()),n({isPressed:!1,isLongPressed:!1,progress:0});},[s,c,e.isLongPressed,e.progress]),T=react.useCallback(o=>{r.current&&cancelAnimationFrame(r.current),t.current&&clearTimeout(t.current),e.isPressed&&!e.isLongPressed&&(s==null||s()),n({isPressed:!1,isLongPressed:!1,progress:0});},[s,e.isPressed,e.isLongPressed]);return {handlers:{onMouseDown:L,onMouseUp:v,onMouseLeave:T,onTouchStart:L,onTouchEnd:v,onTouchCancel:T},state:{isPressed:e.isPressed,isLongPressed:e.isLongPressed,progress:e.progress}}}exports.useLongPress=w;//# sourceMappingURL=useLongPress.cjs.map
//# sourceMappingURL=useLongPress.cjs.map
;