useDelayReset.js 1.0 KB

12345678910111213141516171819202122232425262728293031
  1. import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
  2. import * as React from 'react';
  3. /**
  4. * Similar with `useLock`, but this hook will always execute last value.
  5. * When set to `true`, it will keep `true` for a short time even if `false` is set.
  6. */
  7. export default function useDelayReset() {
  8. var timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
  9. var _React$useState = React.useState(false),
  10. _React$useState2 = _slicedToArray(_React$useState, 2),
  11. bool = _React$useState2[0],
  12. setBool = _React$useState2[1];
  13. var delayRef = React.useRef(null);
  14. var cancelLatest = function cancelLatest() {
  15. window.clearTimeout(delayRef.current);
  16. };
  17. React.useEffect(function () {
  18. return cancelLatest;
  19. }, []);
  20. var delaySetBool = function delaySetBool(value, callback) {
  21. cancelLatest();
  22. delayRef.current = window.setTimeout(function () {
  23. setBool(value);
  24. if (callback) {
  25. callback();
  26. }
  27. }, timeout);
  28. };
  29. return [bool, delaySetBool, cancelLatest];
  30. }