UNPKG

@etsoo/react

Version:

TypeScript ReactJs UI Independent Framework

40 lines (39 loc) 1.32 kB
"use strict"; 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]; }