25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

useTimeout.js 2.0 KiB

3 yıl önce
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. "use strict";
  2. exports.__esModule = true;
  3. exports.default = useTimeout;
  4. var _react = require("react");
  5. var _useMounted = _interopRequireDefault(require("./useMounted"));
  6. var _useWillUnmount = _interopRequireDefault(require("./useWillUnmount"));
  7. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  8. /*
  9. * Browsers including Internet Explorer, Chrome, Safari, and Firefox store the
  10. * delay as a 32-bit signed integer internally. This causes an integer overflow
  11. * when using delays larger than 2,147,483,647 ms (about 24.8 days),
  12. * resulting in the timeout being executed immediately.
  13. *
  14. * via: https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout
  15. */
  16. var MAX_DELAY_MS = Math.pow(2, 31) - 1;
  17. function setChainedTimeout(handleRef, fn, timeoutAtMs) {
  18. var delayMs = timeoutAtMs - Date.now();
  19. handleRef.current = delayMs <= MAX_DELAY_MS ? setTimeout(fn, delayMs) : setTimeout(function () {
  20. return setChainedTimeout(handleRef, fn, timeoutAtMs);
  21. }, MAX_DELAY_MS);
  22. }
  23. /**
  24. * Returns a controller object for setting a timeout that is properly cleaned up
  25. * once the component unmounts. New timeouts cancel and replace existing ones.
  26. */
  27. function useTimeout() {
  28. var isMounted = (0, _useMounted.default)(); // types are confused between node and web here IDK
  29. var handleRef = (0, _react.useRef)();
  30. (0, _useWillUnmount.default)(function () {
  31. return clearTimeout(handleRef.current);
  32. });
  33. return (0, _react.useMemo)(function () {
  34. var clear = function clear() {
  35. return clearTimeout(handleRef.current);
  36. };
  37. function set(fn, delayMs) {
  38. if (delayMs === void 0) {
  39. delayMs = 0;
  40. }
  41. if (!isMounted()) return;
  42. clear();
  43. if (delayMs <= MAX_DELAY_MS) {
  44. // For simplicity, if the timeout is short, just set a normal timeout.
  45. handleRef.current = setTimeout(fn, delayMs);
  46. } else {
  47. setChainedTimeout(handleRef, fn, Date.now() + delayMs);
  48. }
  49. }
  50. return {
  51. set: set,
  52. clear: clear
  53. };
  54. }, []);
  55. }