@thibault.sh/hooks
Version:
A comprehensive collection of React hooks for browser storage, UI interactions, and more
2 lines • 10.5 kB
JavaScript
import {useState,useCallback,useEffect,useRef}from'react';var I=Object.defineProperty,C=Object.defineProperties;var k=Object.getOwnPropertyDescriptors;var h=Object.getOwnPropertySymbols;var H=Object.prototype.hasOwnProperty,j=Object.prototype.propertyIsEnumerable;var y=(e,r,t)=>r in e?I(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,v=(e,r)=>{for(var t in r||(r={}))H.call(r,t)&&y(e,t,r[t]);if(h)for(var t of h(r))j.call(r,t)&&y(e,t,r[t]);return e},E=(e,r)=>C(e,k(r));var L=(e,r,t)=>new Promise((i,s)=>{var n=a=>{try{c(t.next(a));}catch(u){s(u);}},o=a=>{try{c(t.throw(a));}catch(u){s(u);}},c=a=>a.done?i(a.value):Promise.resolve(a.value).then(n,o);c((t=t.apply(e,r)).next());});function Re(e){let[r,t]=useState({isLoading:!1,error:null,value:null});return {execute:useCallback((...s)=>L(this,null,function*(){t({isLoading:!0,error:null,value:null});try{let n=yield e(...s);t({isLoading:!1,error:null,value:n});}catch(n){t({isLoading:!1,error:n instanceof Error?n:new Error(String(n)),value:null});}}),[e]),status:r}}var Ie=(e,r)=>{useEffect(()=>{let t=i=>{!(e!=null&&e.current)||e.current.contains(i.target)||r(i);};return document.addEventListener("mousedown",t),document.addEventListener("touchstart",t),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("touchstart",t);}},[e,r]);};var He=e=>{let[r,t]=useState(!1);return useEffect(()=>{let i=window.matchMedia(e);t(i.matches);let s=n=>{t(n.matches);};return i.addEventListener("change",s),()=>{i.removeEventListener("change",s);}},[e]),r};var We=e=>{let[r,t]=useState(!1),i=useRef(null);return useEffect(()=>{let s=(e==null?void 0:e.current)||i.current;if(!s)return;let n=()=>t(!0),o=()=>t(!1);return s.addEventListener("mouseenter",n),s.addEventListener("mouseleave",o),()=>{s.removeEventListener("mouseenter",n),s.removeEventListener("mouseleave",o);}},[]),[i||e,r]};function Ue(e){let[r,t]=useState(!1);return useEffect(()=>{let i=n=>{n.key===e&&t(!0);},s=n=>{n.key===e&&t(!1);};return window.addEventListener("keydown",i),window.addEventListener("keyup",s),()=>{window.removeEventListener("keydown",i),window.removeEventListener("keyup",s);}},[e]),r}function Ne(e){let[r,t]=useState(new Set);return useEffect(()=>{let i=n=>{t(o=>new Set([...o,n.key]));},s=n=>{t(o=>{let c=new Set(o);return c.delete(n.key),c});};return window.addEventListener("keydown",i),window.addEventListener("keyup",s),()=>{window.removeEventListener("keydown",i),window.removeEventListener("keyup",s);}},[]),e.every(i=>r.has(i))}function Qe(e={}){let{delay:r=400,preventContext:t=!0,onPress:i,onLongPress:s,onLongPressCanceled:n}=e,o=useRef(),c=useRef(0),a=useRef(),[u,l]=useState({isPressed:!1,isLongPressed:!1,progress:0}),d=useCallback(()=>{if(!c.current||!u.isPressed)return;let p=Date.now()-c.current,w=Math.min(p/r,1);l(M=>E(v({},M),{progress:w})),w<1&&(a.current=requestAnimationFrame(d));},[r,u.isPressed]);useEffect(()=>()=>{a.current&&cancelAnimationFrame(a.current),o.current&&clearTimeout(o.current);},[]);let f=useCallback(p=>{t&&p.preventDefault(),c.current=Date.now(),l({isPressed:!0,isLongPressed:!1,progress:0}),a.current=requestAnimationFrame(d),o.current=setTimeout(()=>{l(w=>E(v({},w),{isLongPressed:!0})),s==null||s();},r);},[r,s,t,d]),m=useCallback(p=>{a.current&&cancelAnimationFrame(a.current),o.current&&clearTimeout(o.current),u.isLongPressed||(u.progress<1&&(n==null||n()),i==null||i()),l({isPressed:!1,isLongPressed:!1,progress:0});},[n,i,u.isLongPressed,u.progress]),b=useCallback(p=>{a.current&&cancelAnimationFrame(a.current),o.current&&clearTimeout(o.current),u.isPressed&&!u.isLongPressed&&(n==null||n()),l({isPressed:!1,isLongPressed:!1,progress:0});},[n,u.isPressed,u.isLongPressed]);return {handlers:{onMouseDown:f,onMouseUp:m,onMouseLeave:b,onTouchStart:f,onTouchEnd:m,onTouchCancel:b},state:{isPressed:u.isPressed,isLongPressed:u.isLongPressed,progress:u.progress}}}function Ge(){let[e,r]=useState({width:typeof window!="undefined"?window.innerWidth:0,height:typeof window!="undefined"?window.innerHeight:0});return useEffect(()=>{if(typeof window=="undefined")return;let t=()=>{r({width:window.innerWidth,height:window.innerHeight});};return window.addEventListener("resize",t),t(),()=>window.removeEventListener("resize",t)},[]),e}function et(){let[e,r]=useState({x:typeof window!="undefined"?window.scrollX:0,y:typeof window!="undefined"?window.scrollY:0});return useEffect(()=>{if(typeof window=="undefined")return;let t=()=>{r({x:window.scrollX,y:window.scrollY});};return window.addEventListener("scroll",t),t(),()=>window.removeEventListener("scroll",t)},[]),e}function ot(e,r=150){let[t,i]=useState({scrollTop:0,scrollLeft:0,scrollWidth:0,scrollHeight:0,clientWidth:0,clientHeight:0,isScrolling:!1});return useEffect(()=>{if(!e.current)return;let s,n=e.current,o=()=>{let{scrollTop:c,scrollLeft:a,scrollWidth:u,scrollHeight:l,clientWidth:d,clientHeight:f}=n;i(m=>({scrollTop:c,scrollLeft:a,scrollWidth:u,scrollHeight:l,clientWidth:d,clientHeight:f,isScrolling:!0})),clearTimeout(s),s=setTimeout(()=>{i(m=>E(v({},m),{isScrolling:!1}));},r);};return n.addEventListener("scroll",o),o(),()=>{n.removeEventListener("scroll",o),clearTimeout(s);}},[e]),t}function at(e){let[r,t]=useState({width:0,height:0});return useEffect(()=>{if(!e.current)return;let i=e.current,s=new ResizeObserver(n=>{if(!n[0])return;let{width:o,height:c}=n[0].contentRect;t({width:o,height:c});});return s.observe(i),t({width:i.offsetWidth,height:i.offsetHeight}),()=>{s.disconnect();}},[e]),r}function mt(e,{threshold:r=0,root:t=null,rootMargin:i="0%",freezeOnceVisible:s=!1}={}){let[n,o]=useState(null);return useEffect(()=>{let c=e.current;if(!c||s&&(n!=null&&n.isIntersecting))return;let a=new IntersectionObserver(([u])=>{o(u);},{threshold:r,root:t,rootMargin:i});return a.observe(c),()=>{a.disconnect();}},[e,r,t,i,s,n==null?void 0:n.isIntersecting]),n}function Et(e){let[r,t]=useState(null);return useEffect(()=>{if(!e.current)return;let i=e.current,s=new ResizeObserver(n=>{n[0]&&t(n[0]);});return s.observe(i),()=>{s.disconnect();}},[e]),r}function gt(e,r){let[t,i]=useState(e);return useEffect(()=>{let s=setTimeout(()=>{i(e);},r);return ()=>{clearTimeout(s);}},[e,r]),t}function yt(e,r){let[t,i]=useState(e),s=useRef(Date.now());return useEffect(()=>{let n=Date.now(),o=n-s.current;if(o>=r)i(e),s.current=n;else {let c=setTimeout(()=>{i(e),s.current=Date.now();},r-o);return ()=>clearTimeout(c)}},[e,r]),t}function Rt(e,r=1,t=!1){let[i,s]=useState(e),[n,o]=useState(!1),c=useRef(),a=useCallback(()=>{n||(o(!0),c.current=setInterval(()=>{s(d=>{let f=t?d-r:d+r;return t&&f<=0?(clearInterval(c.current),o(!1),0):f});},r*1e3));},[n,r,t]),u=useCallback(()=>{n&&c.current&&(clearInterval(c.current),c.current=void 0,o(!1));},[n]),l=useCallback(()=>{c.current&&(clearInterval(c.current),c.current=void 0),o(!1),s(e);},[e]);return useEffect(()=>()=>{c.current&&(clearInterval(c.current),c.current=void 0);},[]),[i,{start:a,pause:u,reset:l,isRunning:n}]}function zt(e,r){let t=useRef(e);useEffect(()=>{t.current=e;},[e]),useEffect(()=>{if(r===null)return;let s=setInterval(()=>{t.current();},r);return ()=>clearInterval(s)},[r]);}function kt(e,r,t,i){let s=useRef(r);useEffect(()=>{s.current=r;},[r]),useEffect(()=>{let n=(t==null?void 0:t.current)||window;if(!(n!=null&&n.addEventListener))return;let o=c=>{s.current(c);};return n.addEventListener(e,o,i),()=>{n.removeEventListener(e,o,i);}},[e,t,i]);}function $t(e,r){let[t,i]=useState(()=>{if(typeof window=="undefined")return r;try{let o=document.cookie.split("; ").find(c=>c.startsWith(e+"="));return o?decodeURIComponent(o.split("=")[1]):r}catch(o){return console.warn(`Error reading cookie "${e}":`,o),r}}),s=useCallback((o,c={})=>{if(typeof window!="undefined")try{let{days:a=7,path:u="/",domain:l,secure:d=!1,sameSite:f="Lax"}=c,m=new Date(Date.now()+a*864e5).toUTCString();document.cookie=[`${e}=${encodeURIComponent(o)}`,`expires=${m}`,`path=${u}`,l?`domain=${l}`:"",d?"secure":"",`SameSite=${f}`].filter(Boolean).join("; "),i(o);}catch(a){console.warn(`Error setting cookie "${e}":`,a);}},[e]),n=useCallback(()=>{typeof window!="undefined"&&(document.cookie=`${e}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`,i(null));},[e]);return [t,s,n]}function At(e,r){let t=()=>{if(typeof window=="undefined")return r;try{let o=window.localStorage.getItem(e);return o?JSON.parse(o):r}catch(o){return console.warn(`Error reading localStorage key "${e}":`,o),r}},[i,s]=useState(t),n=o=>{try{let c=o instanceof Function?o(i):o;s(c),typeof window!="undefined"&&window.localStorage.setItem(e,JSON.stringify(c));}catch(c){console.warn(`Error setting localStorage key "${e}":`,c);}};return useEffect(()=>{s(t());},[]),[i,n]}function Ft(e,r){let t=()=>{if(typeof window=="undefined")return r;try{let o=window.sessionStorage.getItem(e);return o?JSON.parse(o):r}catch(o){return console.warn(`Error reading sessionStorage key "${e}":`,o),r}},[i,s]=useState(t),n=o=>{try{let c=o instanceof Function?o(i):o;s(c),typeof window!="undefined"&&window.sessionStorage.setItem(e,JSON.stringify(c));}catch(c){console.warn(`Error setting sessionStorage key "${e}":`,c);}};return useEffect(()=>{s(t());},[]),[i,n]}function Vt(e,r,t={}){let{serialize:i=JSON.stringify,deserialize:s=JSON.parse}=t,n=useCallback(()=>{if(typeof window=="undefined")return r;try{let l=new URLSearchParams(window.location.search).get(e);return l?s(l):r}catch(u){return console.warn(`Error reading query parameter "${e}":`,u),r}},[e,r,s]),[o,c]=useState(n),a=useCallback(u=>{try{let l=u instanceof Function?u(o):u;if(c(l),typeof window!="undefined"){let d=new URLSearchParams(window.location.search);d.set(e,i(l));let f=`${window.location.pathname}?${d.toString()}`;window.history.pushState({},"",f);}}catch(l){console.warn(`Error setting query parameter "${e}":`,l);}},[e,i,o]);return useEffect(()=>{let u=()=>{c(n());};return window.addEventListener("popstate",u),()=>window.removeEventListener("popstate",u)},[n]),[o,a]}export{Re as useAsync,Ie as useClickOutside,ot as useContainerScroll,$t as useCookieState,gt as useDebounce,at as useElementSize,kt as useEventListener,We as useHover,mt as useIntersectionObserver,zt as useInterval,Ne as useKeyCombo,Ue as useKeyPress,At as useLocalStorageState,Qe as useLongPress,He as useMediaQuery,Vt as useQueryParamsState,Et as useResizeObserver,et as useScrollPosition,Ft as useSessionStorageState,yt as useThrottle,Rt as useTimer,Ge as useWindowSize};//# sourceMappingURL=index.mjs.map
//# sourceMappingURL=index.mjs.map