bootstrap-vue-next
Version:
Seamless integration of Vue 3, Bootstrap 5, and TypeScript for modern, type-safe UI development
88 lines (87 loc) • 2.43 kB
JavaScript
require("./chunk-CoQrYLCe.js");
const require_functions = require("./functions-DCQKr6wc.js");
let vue = require("vue");
//#region src/utils/debounce.ts
/**
* @internal
*/
function createFilterWrapper(filter, fn) {
function wrapper(...args) {
return new Promise((resolve, reject) => {
Promise.resolve(filter(() => fn.apply(this, args), {
fn,
thisArg: this,
args
})).then(resolve).catch(reject);
});
}
wrapper.cancel = filter.cancel;
return wrapper;
}
/**
* Create an EventFilter that debounce the events
*/
function debounceFilter(ms, options = {}) {
let timer;
let maxTimer;
let lastRejector = require_functions.noop;
const _clearTimeout = (timer) => {
clearTimeout(timer);
lastRejector();
lastRejector = require_functions.noop;
};
let lastInvoker;
const filter = (invoke) => {
const duration = (0, vue.toValue)(ms);
const maxDuration = (0, vue.toValue)(options.maxWait);
if (timer) _clearTimeout(timer);
if (duration <= 0 || maxDuration !== void 0 && maxDuration <= 0) {
if (maxTimer) {
_clearTimeout(maxTimer);
maxTimer = null;
}
return Promise.resolve(invoke());
}
return new Promise((resolve, reject) => {
lastRejector = options.rejectOnCancel ? reject : resolve;
lastInvoker = invoke;
if (maxDuration && !maxTimer) maxTimer = setTimeout(() => {
if (timer) _clearTimeout(timer);
maxTimer = null;
resolve(lastInvoker());
}, maxDuration);
timer = setTimeout(() => {
if (maxTimer) _clearTimeout(maxTimer);
maxTimer = null;
resolve(invoke());
}, duration);
});
};
filter.cancel = () => {
if (timer) _clearTimeout(timer);
if (maxTimer) _clearTimeout(maxTimer);
maxTimer = null;
};
return filter;
}
/**
* Debounce execution of a function.
*
* @see https://vueuse.org/useDebounceFn
* @param fn A function to be executed after delay milliseconds debounced.
* @param ms A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.
* @param options Options
*
* @return A new, debounce, function, provided with a cancel method.
*/
function useDebounceFn(fn, ms = 200, options = {}) {
return createFilterWrapper(debounceFilter(ms, options), fn);
}
//#endregion
Object.defineProperty(exports, "useDebounceFn", {
enumerable: true,
get: function() {
return useDebounceFn;
}
});
//# sourceMappingURL=debounce-BfDJWP7y.js.map