Dispatcharr/frontend/src/utils.js

53 lines
1.2 KiB
JavaScript

import React, { useState, useEffect } from 'react';
export default {
Limiter: (n, list) => {
if (!list || !list.length) {
return;
}
var tail = list.splice(n);
var head = list;
var resolved = [];
var processed = 0;
return new Promise(function (resolve) {
head.forEach(function (x) {
var res = x();
resolved.push(res);
res.then(function (y) {
runNext();
return y;
});
});
function runNext() {
if (processed == tail.length) {
resolve(Promise.all(resolved));
} else {
resolved.push(
tail[processed]().then(function (x) {
runNext();
return x;
})
);
processed++;
}
}
});
},
};
// Custom debounce hook
export function useDebounce(value, delay = 500) {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => clearTimeout(handler); // Cleanup timeout on unmount or value change
}, [value, delay]);
return debouncedValue;
}