use-eye-dropper
Version:
Browser color picker hook for React
2 lines (1 loc) • 1.23 kB
JavaScript
!function(o,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("react")):"function"==typeof define&&define.amd?define(["react"],e):(o||self).useEyeDropper=e(o.react)}(this,function(o){const e=()=>"undefined"!=typeof window&&"EyeDropper"in window,n=()=>{throw new Error("Unsupported browser.")};return r=>{const t=o.useMemo(()=>{var o;return(o=e()&&new EyeDropper(r))?EyeDropper.prototype.open.bind(o):n},[r]),[i,f]=(()=>{const n=o.useRef(),[r,t]=o.useState(!1);o.useEffect(()=>(n.current=!0,t(e()),()=>{n.current=!1}),[]);const i=o.useCallback(()=>r,[r]);return[n,i]})(),s=o.useRef(),c=o.useCallback(()=>{void 0!==s.current&&s.current.abort()},[s]),u=o.useCallback(async function(o){void 0===o&&(o={}),c();const{signal:e,...n}=o,r=new AbortController;s.current=r;const f=void 0!==e?(o=>{if("any"in AbortSignal)return AbortSignal.any(o);const e=new AbortController,n=()=>{e.abort();for(const e of o)e.removeEventListener("abort",n)};for(const e of o){if(e.aborted){n();break}e.addEventListener("abort",n)}return e.signal})([e,r.signal]):r.signal;try{return await t({...n,signal:f})}catch(o){throw i.current||(o.canceled=!0),o}},[s,i,c,t]);return o.useEffect(()=>c,[c]),{open:u,close:c,isSupported:f}}});