UNPKG

@mskcc/carbon-react

Version:

Carbon react components for the MSKCC DSM

49 lines (42 loc) 1.52 kB
/** * MSKCC 2021, 2024 */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var React = require('react'); /** * `useDelayedState` mirrors `useState` but also allows you to add a delay to * when your state updates. You can provide a second argument to `setState`, * `delayMs`, which will be the time in milliseconds after which the state is * updated. * * This hook will clean up pending timers in `useEffect` and will cancel any * pending timers when a `setState` is called before the state is updated from * a previous call */ function useDelayedState(initialState) { const [state, setState] = React.useState(initialState); const timeoutId = React.useRef(null); // We use `useCallback` to match the signature of React's `useState` which will // always return the same reference for the `setState` updater const setStateWithDelay = React.useCallback(function (stateToSet) { let delayMs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; window.clearTimeout(timeoutId.current ?? undefined); timeoutId.current = null; if (delayMs === 0) { setState(stateToSet); return; } timeoutId.current = window.setTimeout(() => { setState(stateToSet); timeoutId.current = null; }, delayMs); }, []); React.useEffect(() => { return () => { window.clearTimeout(timeoutId.current ?? undefined); }; }, []); return [state, setStateWithDelay]; } exports.useDelayedState = useDelayedState;