bootstrap-vue-next
Version:
Seamless integration of Vue 3, Bootstrap 5, and TypeScript for modern, type-safe UI development
65 lines (64 loc) • 1.81 kB
JavaScript
import { toValue } from "vue";
const noop = () => {
};
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;
}
function debounceFilter(ms, options = {}) {
let timer;
let maxTimer;
let lastRejector = noop;
const _clearTimeout = (timer2) => {
clearTimeout(timer2);
lastRejector();
lastRejector = noop;
};
let lastInvoker;
const filter = (invoke) => {
const duration = toValue(ms);
const maxDuration = 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;
}
function useDebounceFn(fn, ms = 200, options = {}) {
return createFilterWrapper(debounceFilter(ms, options), fn);
}
export {
useDebounceFn as u
};
//# sourceMappingURL=debounce-BHqBzJ1a.mjs.map