@thibault.sh/hooks
Version:
A comprehensive collection of React hooks for browser storage, UI interactions, and more
2 lines • 1.59 kB
JavaScript
import {b,a}from'./chunk-IJZYV2FY.mjs';import {useRef,useState,useCallback,useEffect}from'react';function w(R={}){let{delay:a$1=400,preventContext:p=!0,onPress:c,onLongPress:u,onLongPressCanceled:s}=R,t=useRef(),P=useRef(0),r=useRef(),[e,n]=useState({isPressed:!1,isLongPressed:!1,progress:0}),f=useCallback(()=>{if(!P.current||!e.isPressed)return;let o=Date.now()-P.current,i=Math.min(o/a$1,1);n(b$1=>b(a({},b$1),{progress:i})),i<1&&(r.current=requestAnimationFrame(f));},[a$1,e.isPressed]);useEffect(()=>()=>{r.current&&cancelAnimationFrame(r.current),t.current&&clearTimeout(t.current);},[]);let L=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=>b(a({},i),{isLongPressed:!0})),u==null||u();},a$1);},[a$1,u,p,f]),v=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=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}}}export{w as useLongPress};//# sourceMappingURL=useLongPress.mjs.map
//# sourceMappingURL=useLongPress.mjs.map