react-use/src/useUnmountPromise.ts
Renovate Bot a27f09fd36
chore: refactoring and rearrangement.
More DRY code. Also move non-hooks to separate directories.

BREAKING CHANGE: all `create*` factories been moved to `factory` subdirectory and in case direct import should be imported like `react-use/esm/factory/createBreakpoint`
BREAKING CHANGE: `comps` directory renamed to `component`
2021-01-30 23:30:26 +03:00

34 lines
940 B
TypeScript

import { useEffect, useMemo, useRef } from 'react';
export type Race = <P extends Promise<any>, E = any>(promise: P, onError?: (error: E) => void) => P;
const useUnmountPromise = (): Race => {
const refUnmounted = useRef(false);
useEffect(() => () => {
refUnmounted.current = true;
});
const wrapper = useMemo(() => {
const race = <P extends Promise<any>, 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;