@mskcc/carbon-react
Version:
Carbon react components for the MSKCC DSM
49 lines (42 loc) • 1.52 kB
JavaScript
/**
* MSKCC 2021, 2024
*/
;
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;