@data-client/react
Version:
Async State Management without the Management. REST, GraphQL, SSE, Websockets, Fetch
34 lines (32 loc) • 4.18 kB
JavaScript
import { useEffect, useState, useTransition } from 'react';
/**
* Keeps value updated after delay time
*
* @see https://dataclient.io/docs/api/useDebounce
* @param value Any immutable value
* @param delay Time in miliseconds to wait til updating the value
* @param updatable Whether to update at all
* @example
```
const [debouncedQuery, isPending] = useDebounce(query, 200);
const list = useSuspense(getThings, { query: debouncedQuery });
```
*/
export default function useDebounce(value, delay, updatable = true) {
const [debouncedValue, setDebouncedValue] = useState(value);
const [isPending, startTransition] = useTran();
useEffect(() => {
if (!updatable) return;
const handler = setTimeout(() => {
startTransition(() => setDebouncedValue(value));
}, delay);
return () => {
clearTimeout(handler);
};
}, [value, delay, updatable]);
return [debouncedValue, isPending];
}
// compatibility with older react versions
const useTran = useTransition != null ? useTransition : () => [false, identityRun];
const identityRun = fun => fun();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VTdGF0ZSIsInVzZVRyYW5zaXRpb24iLCJ1c2VEZWJvdW5jZSIsInZhbHVlIiwiZGVsYXkiLCJ1cGRhdGFibGUiLCJkZWJvdW5jZWRWYWx1ZSIsInNldERlYm91bmNlZFZhbHVlIiwiaXNQZW5kaW5nIiwic3RhcnRUcmFuc2l0aW9uIiwidXNlVHJhbiIsImhhbmRsZXIiLCJzZXRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0IiwiaWRlbnRpdHlSdW4iLCJmdW4iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbmV4dC91c2VEZWJvdW5jZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VUcmFuc2l0aW9uIH0gZnJvbSAncmVhY3QnO1xuXG4vKipcbiAqIEtlZXBzIHZhbHVlIHVwZGF0ZWQgYWZ0ZXIgZGVsYXkgdGltZVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL3VzZURlYm91bmNlXG4gKiBAcGFyYW0gdmFsdWUgQW55IGltbXV0YWJsZSB2YWx1ZVxuICogQHBhcmFtIGRlbGF5IFRpbWUgaW4gbWlsaXNlY29uZHMgdG8gd2FpdCB0aWwgdXBkYXRpbmcgdGhlIHZhbHVlXG4gKiBAcGFyYW0gdXBkYXRhYmxlIFdoZXRoZXIgdG8gdXBkYXRlIGF0IGFsbFxuICogQGV4YW1wbGVcbiBgYGBcbiBjb25zdCBbZGVib3VuY2VkUXVlcnksIGlzUGVuZGluZ10gPSB1c2VEZWJvdW5jZShxdWVyeSwgMjAwKTtcbiBjb25zdCBsaXN0ID0gdXNlU3VzcGVuc2UoZ2V0VGhpbmdzLCB7IHF1ZXJ5OiBkZWJvdW5jZWRRdWVyeSB9KTtcbiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRGVib3VuY2U8VD4oXG4gIHZhbHVlOiBULFxuICBkZWxheTogbnVtYmVyLFxuICB1cGRhdGFibGUgPSB0cnVlLFxuKTogW1QsIGJvb2xlYW5dIHtcbiAgY29uc3QgW2RlYm91bmNlZFZhbHVlLCBzZXREZWJvdW5jZWRWYWx1ZV0gPSB1c2VTdGF0ZSh2YWx1ZSk7XG4gIGNvbnN0IFtpc1BlbmRpbmcsIHN0YXJ0VHJhbnNpdGlvbl0gPSB1c2VUcmFuKCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXVwZGF0YWJsZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgaGFuZGxlciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc3RhcnRUcmFuc2l0aW9uKCgpID0+IHNldERlYm91bmNlZFZhbHVlKHZhbHVlKSk7XG4gICAgfSwgZGVsYXkpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoaGFuZGxlcik7XG4gICAgfTtcbiAgfSwgW3ZhbHVlLCBkZWxheSwgdXBkYXRhYmxlXSk7XG5cbiAgcmV0dXJuIFtkZWJvdW5jZWRWYWx1ZSwgaXNQZW5kaW5nXTtcbn1cblxuLy8gY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHJlYWN0IHZlcnNpb25zXG5jb25zdCB1c2VUcmFuID0gdXNlVHJhbnNpdGlvbiA/PyAoKCkgPT4gW2ZhbHNlLCBpZGVudGl0eVJ1bl0pO1xuY29uc3QgaWRlbnRpdHlSdW4gPSAoZnVuOiAoLi4uYXJnczogYW55KSA9PiBhbnkpID0+IGZ1bigpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxTQUFTLEVBQUVDLFFBQVEsRUFBRUMsYUFBYSxRQUFRLE9BQU87O0FBRTFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTQyxXQUFXQSxDQUNqQ0MsS0FBUSxFQUNSQyxLQUFhLEVBQ2JDLFNBQVMsR0FBRyxJQUFJLEVBQ0Y7RUFDZCxNQUFNLENBQUNDLGNBQWMsRUFBRUMsaUJBQWlCLENBQUMsR0FBR1AsUUFBUSxDQUFDRyxLQUFLLENBQUM7RUFDM0QsTUFBTSxDQUFDSyxTQUFTLEVBQUVDLGVBQWUsQ0FBQyxHQUFHQyxPQUFPLENBQUMsQ0FBQztFQUU5Q1gsU0FBUyxDQUFDLE1BQU07SUFDZCxJQUFJLENBQUNNLFNBQVMsRUFBRTtJQUVoQixNQUFNTSxPQUFPLEdBQUdDLFVBQVUsQ0FBQyxNQUFNO01BQy9CSCxlQUFlLENBQUMsTUFBTUYsaUJBQWlCLENBQUNKLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUMsRUFBRUMsS0FBSyxDQUFDO0lBQ1QsT0FBTyxNQUFNO01BQ1hTLFlBQVksQ0FBQ0YsT0FBTyxDQUFDO0lBQ3ZCLENBQUM7RUFDSCxDQUFDLEVBQUUsQ0FBQ1IsS0FBSyxFQUFFQyxLQUFLLEVBQUVDLFNBQVMsQ0FBQyxDQUFDO0VBRTdCLE9BQU8sQ0FBQ0MsY0FBYyxFQUFFRSxTQUFTLENBQUM7QUFDcEM7O0FBRUE7QUFDQSxNQUFNRSxPQUFPLEdBQUdULGFBQWEsV0FBYkEsYUFBYSxHQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUVhLFdBQVcsQ0FBRTtBQUM3RCxNQUFNQSxXQUFXLEdBQUlDLEdBQTBCLElBQUtBLEdBQUcsQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119