UNPKG

use-eye-dropper

Version:

Browser color picker hook for React

2 lines (1 loc) 1.28 kB
import{useMemo as o,useRef as r,useCallback as e,useEffect as n,useState as t}from"react";const p=()=>"undefined"!=typeof window&&"EyeDropper"in window,s=()=>{let o="Unsupported browser.";throw o="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 c=o(()=>{var o;return(o=p()&&new EyeDropper(i))?EyeDropper.prototype.open.bind(o):s},[i]),[a,d]=(()=>{const o=r(),[s,i]=t(!1);n(()=>(o.current=!0,i(p()),()=>{o.current=!1}),[]);const c=e(()=>s,[s]);return[o,c]})(),l=r(),w=e(()=>{void 0!==l.current&&l.current.abort()},[l]),u=e(async function(o){void 0===o&&(o={}),w();const{signal:r,...e}=o,n=new AbortController;l.current=n;const t=void 0!==r?(o=>{if("any"in AbortSignal)return AbortSignal.any(o);const r=new AbortController,e=()=>{r.abort();for(const r of o)r.removeEventListener("abort",e)};for(const r of o){if(r.aborted){e();break}r.addEventListener("abort",e)}return r.signal})([r,n.signal]):n.signal;try{return await c({...e,signal:t})}catch(o){throw a.current||(o.canceled=!0),o}},[l,a,w,c]);return n(()=>w,[w]),{open:u,close:w,isSupported:d}};export{i as default};