diff --git a/src/useUnmountPromise.ts b/src/useUnmountPromise.ts new file mode 100644 index 0000000000..e63a437c12 --- /dev/null +++ b/src/useUnmountPromise.ts @@ -0,0 +1,33 @@ +import { useMemo, useRef } from 'react'; + +export type Race =
, E = any>(promise: P, onError?: (error: E) => void) => P; + +const useUnmountPromise = (): Race => { + const refUnmounted = useRef(false); + useRef(() => () => { + refUnmounted.current = true; + }); + + const wrapper = useMemo(() => { + const race =
, E>(promise: P, onError?: (error: E) => void) => { + const newPromise: P = new Promise((resolve, reject) => { + promise.then( + result => { + if (!refUnmounted.current) resolve(result); + }, + error => { + if (!refUnmounted.current) reject(error); + else if (onError) onError(error); + else console.error('useUnmountPromise', error); + } + ); + }) as P; + return newPromise; + }; + return race; + }, []); + + return wrapper; +}; + +export default useUnmountPromise;