UNPKG

@data-client/react

Version:

Async State Management without the Management. REST, GraphQL, SSE, Websockets, Fetch

34 lines (32 loc) 4.18 kB
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