UNPKG

use-eye-dropper

Version:

Browser color picker hook for React

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