UNPKG

azure-devops-ui

Version:

React components for building web UI in Azure DevOps

1 lines 1.18 kB
import*as React from"react";const makeCancelable=e=>{let a=!1;const c=new Promise((t,n)=>{const r=()=>(a&&(c.catch(()=>{}),n({isCanceled:!0})),a);e.then(e=>r()||t(e)),e.catch(e=>r()||n(e))});return{promise:c,cancel(){a=!0}}};function timeout(e,a,c){return new Promise((t,n)=>{const r=setTimeout(()=>{n(null==c?`Timed out after ${a} ms.`:c)},a);e.then(e=>{t(e),clearTimeout(r)},e=>{n(e),clearTimeout(r)})})}async function wait(t){return new Promise(e=>{setTimeout(e,t)})}async function delay(e,t){return(await Promise.all([e,wait(t)]))[0]}function allSettled(r){const a=new Array(r.length);return new Promise(e=>{let n=0;for(let t=0;t<r.length;++t)r[t].then(e=>{a[t]={state:"fulfilled",value:e}},e=>{a[t]={state:"rejected",reason:e}}).then(()=>{++n===r.length&&e(a)})})}function usePromise(){const t=React.useRef([]);return React.useEffect(()=>()=>{t.current&&(t.current.forEach(e=>e.cancel()),t.current=null)},[]),{trackPromise:React.useCallback(e=>{e=makeCancelable(e);if(t.current)return t.current.push(e),e.promise;throw new Error("usePromise hook: `trackPromise` called after using component was unmounted.")},[])}}export{makeCancelable,timeout,wait,delay,allSettled,usePromise};