UNPKG

ahooks

Version:
89 lines (88 loc) 3.49 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _debounce = _interopRequireDefault(require("lodash/debounce")); var _react = require("react"); var _useUpdateEffect = _interopRequireDefault(require("../../../useUpdateEffect")); var _cancelledError = require("../utils/cancelledError"); var useDebouncePlugin = function useDebouncePlugin(fetchInstance, _ref) { var debounceWait = _ref.debounceWait, debounceLeading = _ref.debounceLeading, debounceTrailing = _ref.debounceTrailing, debounceMaxWait = _ref.debounceMaxWait, ready = _ref.ready; var debouncedRef = (0, _react.useRef)(undefined); var pendingRejectRef = (0, _react.useRef)(undefined); var options = (0, _react.useMemo)(function () { var ret = {}; if (debounceLeading !== undefined) { ret.leading = debounceLeading; } if (debounceTrailing !== undefined) { ret.trailing = debounceTrailing; } if (debounceMaxWait !== undefined) { ret.maxWait = debounceMaxWait; } return ret; }, [debounceLeading, debounceTrailing, debounceMaxWait]); (0, _react.useEffect)(function () { if (debounceWait) { var _originRunAsync = fetchInstance.runAsync.bind(fetchInstance); debouncedRef.current = (0, _debounce["default"])(function (callback) { callback(); }, debounceWait, options); // debounce runAsync should be promise // https://github.com/lodash/lodash/issues/4400#issuecomment-834800398 fetchInstance.runAsync = function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (fetchInstance.options.ready === false) { return _originRunAsync.apply(void 0, args); } (0, _cancelledError.cancelPendingPromise)(pendingRejectRef); return new Promise(function (resolve, reject) { var _a; var callbackInvoked = false; pendingRejectRef.current = reject; (_a = debouncedRef.current) === null || _a === void 0 ? void 0 : _a.call(debouncedRef, function () { callbackInvoked = true; pendingRejectRef.current = undefined; _originRunAsync.apply(void 0, args).then(resolve)["catch"](reject); }); if (!callbackInvoked && options.trailing === false) { (0, _cancelledError.cancelPendingPromise)(pendingRejectRef); } }); }; return function () { var _a; (_a = debouncedRef.current) === null || _a === void 0 ? void 0 : _a.cancel(); (0, _cancelledError.cancelPendingPromise)(pendingRejectRef); fetchInstance.runAsync = _originRunAsync; }; } }, [debounceWait, options, fetchInstance]); (0, _useUpdateEffect["default"])(function () { var _a; if (ready === false) { (_a = debouncedRef.current) === null || _a === void 0 ? void 0 : _a.cancel(); (0, _cancelledError.cancelPendingPromise)(pendingRejectRef); } }, [ready]); if (!debounceWait) { return {}; } return { onCancel: function onCancel() { var _a; (_a = debouncedRef.current) === null || _a === void 0 ? void 0 : _a.cancel(); (0, _cancelledError.cancelPendingPromise)(pendingRejectRef); } }; }; var _default = exports["default"] = useDebouncePlugin;