@dvcol/common-utils
Version:
Typescript library for common utility functions and constants
82 lines (77 loc) • 2.3 kB
JavaScript
;Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// lib/common/utils/debounce.utils.ts
function debounce(func, delay = 250, timout = { value: void 0 }, cancel) {
const timeoutId = timout;
let resolve;
let reject;
let promise;
const previous = [];
const clear = () => {
if (timeoutId.value === void 0) return;
clearTimeout(timeoutId.value);
const result = _optionalChain([cancel, 'optionalCall', _ => _(...previous)]);
timeoutId.value = void 0;
previous.length = 0;
return result;
};
const finish = () => {
timeoutId.value = void 0;
previous.length = 0;
promise = void 0;
};
const fn = async (...args) => {
if (!promise) ({ resolve, reject, promise } = Promise.withResolvers());
clear();
previous.push(...args);
timeoutId.value = setTimeout(async () => {
try {
const result = await func(...args);
resolve(result);
} catch (error) {
reject(error);
} finally {
finish();
}
}, delay);
return promise;
};
Object.defineProperties(fn, {
cancel: {
value: clear
},
timeout: {
get: () => timeoutId.value
},
resolve: {
value: (value) => {
resolve(value);
finish();
}
},
reject: {
value: (error) => {
reject(error);
finish();
}
},
previous: {
get: () => previous
},
promise: {
get: () => promise
}
});
return fn;
}
function useDebounce({
fn,
cancel,
delay = 250,
timeout = { value: void 0 }
}) {
const debounced = debounce(fn, delay, timeout, cancel);
return {
debounce: debounced,
cancel: debounced.cancel
};
}
exports.debounce = debounce; exports.useDebounce = useDebounce;