use-eye-dropper
Version:
Browser color picker hook for React
2 lines (1 loc) • 1.26 kB
JavaScript
import{useMemo as r,useRef as o,useCallback as e,useEffect as n,useState as t}from"react";const p=()=>"undefined"!=typeof window&&"EyeDropper"in window,s=()=>{let r="Unsupported browser.";throw r="Unsupported browser: no EyeDropper in Window. Check https://developer.mozilla.org/en-US/docs/Web/API/EyeDropper_API.",new Error("Unsupported browser: no EyeDropper in Window. Check https://developer.mozilla.org/en-US/docs/Web/API/EyeDropper_API.")},i=i=>{const a=r(()=>{var r;return(r=p()&&new EyeDropper(i))?EyeDropper.prototype.open.bind(r):s},[i]),[c,d]=(()=>{const r=o(),[s,i]=t(!1);n(()=>(r.current=!0,i(p()),()=>{r.current=!1}),[]);const a=e(()=>s,[s]);return[r,a]})(),l=o(),w=e(()=>{void 0!==l.current&&l.current.abort()},[l]),b=e(async(r={})=>{w();const{signal:o,...e}=r,n=new AbortController;l.current=n;const t=void 0!==o?(r=>{if("any"in AbortSignal)return AbortSignal.any(r);const o=new AbortController,e=()=>{o.abort();for(const o of r)o.removeEventListener("abort",e)};for(const o of r){if(o.aborted){e();break}o.addEventListener("abort",e)}return o.signal})([o,n.signal]):n.signal;try{return await a({...e,signal:t})}catch(r){throw c.current||(r.canceled=!0),r}},[l,c,w,a]);return n(()=>w,[w]),{open:b,close:w,isSupported:d}};export{i as default};