@etsoo/react
Version:
TypeScript ReactJs UI Independent Framework
40 lines (39 loc) • 1.32 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.useAsyncState = useAsyncState;
const react_1 = __importDefault(require("react"));
/**
* Returns a stateful value, and a async function to update it.
* @param initialState initial stat
* @returns Current state and update action
*/
function useAsyncState(initialState) {
// State
const [state, setState] = react_1.default.useState(initialState);
// Resolve sate
const resolveState = react_1.default.useRef(null);
// Is mounted or not
const isMounted = react_1.default.useRef(false);
react_1.default.useEffect(() => {
isMounted.current = true;
return () => {
isMounted.current = false;
};
}, []);
// When state update
react_1.default.useEffect(() => {
if (resolveState.current) {
resolveState.current(state);
}
}, [state]);
const setAsyncState = react_1.default.useCallback((newState) => new Promise((resolve) => {
if (isMounted.current) {
resolveState.current = resolve;
setState(newState);
}
}), []);
return [state, setAsyncState];
}