mirror of
https://github.com/streamich/react-use.git
synced 2026-01-18 14:06:52 +00:00
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`
34 lines
940 B
TypeScript
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;
|