UNPKG

bootstrap-vue-next

Version:

Seamless integration of Vue 3, Bootstrap 5, and TypeScript for modern, type-safe UI development

82 lines (81 loc) 2.25 kB
import { t as noop } from "./functions-BcMenQqL.mjs"; import { toValue } from "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 = noop; const _clearTimeout = (timer) => { clearTimeout(timer); 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; } /** * 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 export { useDebounceFn as t }; //# sourceMappingURL=debounce-C_wjWVGH.mjs.map