@etsoo/react
Version:
TypeScript ReactJs UI Independent Framework
34 lines (33 loc) • 989 B
JavaScript
import React from "react";
/**
* Returns a stateful value, and a async function to update it.
* @param initialState initial stat
* @returns Current state and update action
*/
export function useAsyncState(initialState) {
// State
const [state, setState] = React.useState(initialState);
// Resolve sate
const resolveState = React.useRef(null);
// Is mounted or not
const isMounted = React.useRef(false);
React.useEffect(() => {
isMounted.current = true;
return () => {
isMounted.current = false;
};
}, []);
// When state update
React.useEffect(() => {
if (resolveState.current) {
resolveState.current(state);
}
}, [state]);
const setAsyncState = React.useCallback((newState) => new Promise((resolve) => {
if (isMounted.current) {
resolveState.current = resolve;
setState(newState);
}
}), []);
return [state, setAsyncState];
}