UNPKG

@data-client/react

Version:

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

78 lines (72 loc) 12.8 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import { ExpiryStatus } from '@data-client/core'; import { useEffect, useMemo } from 'react'; import { InteractionManager } from 'react-native'; import useCacheState from './useCacheState.js'; import useController from './useController.js'; import useFocusEffect from './useFocusEffect.native.js'; /** * Use async date with { data, loading, error } (DLE) * @see https://dataclient.io/docs/api/useDLE */ export default function useDLE(endpoint, ...args) { const state = useCacheState(); const controller = useController(); const key = args[0] !== null ? endpoint.key(...args) : ''; const cacheResults = key && state.endpoints[key]; const meta = state.meta[key]; // Compute denormalized value // eslint-disable-next-line prefer-const let { data, expiryStatus, expiresAt, countRef } = useMemo(() => { return controller.getResponseMeta(endpoint, ...args, state); // eslint-disable-next-line react-hooks/exhaustive-deps }, [cacheResults, state.indexes, state.entities, state.entityMeta, meta, key]); // If we are hard invalid we must fetch regardless of triggering or staleness const forceFetch = expiryStatus === ExpiryStatus.Invalid; const maybePromise = useMemo(() => { // null params mean don't do anything if (Date.now() <= expiresAt && !forceFetch || !key) return; return controller.fetch(endpoint, ...args).catch(() => {}); // we need to check against serialized params, since params can change frequently // eslint-disable-next-line react-hooks/exhaustive-deps }, [expiresAt, controller, key, forceFetch, state.lastReset]); // fully "valid" data will not suspend/loading even if it is not fresh const loading = expiryStatus !== ExpiryStatus.Valid && !!maybePromise; useFocusEffect(() => { // revalidating non-suspending data is low priority, so make sure it doesn't stutter animations const task = InteractionManager.runAfterInteractions(() => { if (Date.now() > expiresAt && key) { controller.fetch(endpoint, ...args); } }); return () => task.cancel(); }, []); data = useMemo(() => { // if useSuspense() would suspend, don't include entities from cache if (loading) { if (!endpoint.schema) return undefined; // TODO: use getResponse() once it just returns data return controller.getResponseMeta(endpoint, ...args, _extends({}, state, { entities: {} })).data; } return data; // key substitutes args + endpoint // we only need cacheResults, as entities are not used in this case // eslint-disable-next-line react-hooks/exhaustive-deps }, [key, data, loading, cacheResults]); const error = controller.getError(endpoint, ...args, state); // eslint-disable-next-line react-hooks/exhaustive-deps useEffect(countRef, [data]); return { data, loading, error }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFeHBpcnlTdGF0dXMiLCJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwiSW50ZXJhY3Rpb25NYW5hZ2VyIiwidXNlQ2FjaGVTdGF0ZSIsInVzZUNvbnRyb2xsZXIiLCJ1c2VGb2N1c0VmZmVjdCIsInVzZURMRSIsImVuZHBvaW50IiwiYXJncyIsInN0YXRlIiwiY29udHJvbGxlciIsImtleSIsImNhY2hlUmVzdWx0cyIsImVuZHBvaW50cyIsIm1ldGEiLCJkYXRhIiwiZXhwaXJ5U3RhdHVzIiwiZXhwaXJlc0F0IiwiY291bnRSZWYiLCJnZXRSZXNwb25zZU1ldGEiLCJpbmRleGVzIiwiZW50aXRpZXMiLCJlbnRpdHlNZXRhIiwiZm9yY2VGZXRjaCIsIkludmFsaWQiLCJtYXliZVByb21pc2UiLCJEYXRlIiwibm93IiwiZmV0Y2giLCJjYXRjaCIsImxhc3RSZXNldCIsImxvYWRpbmciLCJWYWxpZCIsInRhc2siLCJydW5BZnRlckludGVyYWN0aW9ucyIsImNhbmNlbCIsInNjaGVtYSIsInVuZGVmaW5lZCIsIl9leHRlbmRzIiwiZXJyb3IiLCJnZXRFcnJvciJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VETEUubmF0aXZlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgRGVub3JtYWxpemUsXG4gIERlbm9ybWFsaXplTnVsbGFibGUsXG4gIEVycm9yVHlwZXMsXG4gIEVuZHBvaW50SW50ZXJmYWNlLFxuICBGZXRjaEZ1bmN0aW9uLFxuICBTY2hlbWEsXG4gIFJlc29sdmVUeXBlLFxufSBmcm9tICdAZGF0YS1jbGllbnQvY29yZSc7XG5pbXBvcnQgeyBFeHBpcnlTdGF0dXMgfSBmcm9tICdAZGF0YS1jbGllbnQvY29yZSc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbk1hbmFnZXIgfSBmcm9tICdyZWFjdC1uYXRpdmUnO1xuXG5pbXBvcnQgdXNlQ2FjaGVTdGF0ZSBmcm9tICcuL3VzZUNhY2hlU3RhdGUuanMnO1xuaW1wb3J0IHVzZUNvbnRyb2xsZXIgZnJvbSAnLi91c2VDb250cm9sbGVyLmpzJztcbmltcG9ydCB1c2VGb2N1c0VmZmVjdCBmcm9tICcuL3VzZUZvY3VzRWZmZWN0Lm5hdGl2ZS5qcyc7XG5cbnR5cGUgU2NoZW1hUmV0dXJuPFMgZXh0ZW5kcyBTY2hlbWEgfCB1bmRlZmluZWQ+ID1cbiAgfCB7XG4gICAgICBkYXRhOiBEZW5vcm1hbGl6ZTxTPjtcbiAgICAgIGxvYWRpbmc6IGZhbHNlO1xuICAgICAgZXJyb3I6IHVuZGVmaW5lZDtcbiAgICB9XG4gIHwgeyBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPFM+OyBsb2FkaW5nOiB0cnVlOyBlcnJvcjogdW5kZWZpbmVkIH1cbiAgfCB7IGRhdGE6IERlbm9ybWFsaXplTnVsbGFibGU8Uz47IGxvYWRpbmc6IGZhbHNlOyBlcnJvcjogRXJyb3JUeXBlcyB9O1xuXG50eXBlIEFzeW5jUmV0dXJuPEU+ID1cbiAgfCB7XG4gICAgICBkYXRhOiBFIGV4dGVuZHMgKC4uLmFyZ3M6IGFueSkgPT4gYW55ID8gUmVzb2x2ZVR5cGU8RT4gOiBhbnk7XG4gICAgICBsb2FkaW5nOiBmYWxzZTtcbiAgICAgIGVycm9yOiB1bmRlZmluZWQ7XG4gICAgfVxuICB8IHsgZGF0YTogdW5kZWZpbmVkOyBsb2FkaW5nOiB0cnVlOyBlcnJvcjogdW5kZWZpbmVkIH1cbiAgfCB7IGRhdGE6IHVuZGVmaW5lZDsgbG9hZGluZzogZmFsc2U7IGVycm9yOiBFcnJvclR5cGVzIH07XG5cbi8qKlxuICogVXNlIGFzeW5jIGRhdGUgd2l0aCB7IGRhdGEsIGxvYWRpbmcsIGVycm9yIH0gKERMRSlcbiAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL3VzZURMRVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VETEU8XG4gIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZTxcbiAgICBGZXRjaEZ1bmN0aW9uLFxuICAgIFNjaGVtYSB8IHVuZGVmaW5lZCxcbiAgICB1bmRlZmluZWQgfCBmYWxzZVxuICA+LFxuPihcbiAgZW5kcG9pbnQ6IEUsXG4gIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XVxuKTogRVsnc2NoZW1hJ10gZXh0ZW5kcyB1bmRlZmluZWQgfCBudWxsID8gQXN5bmNSZXR1cm48RT5cbjogU2NoZW1hUmV0dXJuPEVbJ3NjaGVtYSddPjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRExFPFxuICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U8XG4gICAgRmV0Y2hGdW5jdGlvbixcbiAgICBTY2hlbWEgfCB1bmRlZmluZWQsXG4gICAgdW5kZWZpbmVkIHwgZmFsc2VcbiAgPixcbj4oXG4gIGVuZHBvaW50OiBFLFxuICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0gfCByZWFkb25seSBbbnVsbF1cbik6IHtcbiAgZGF0YTogRVsnc2NoZW1hJ10gZXh0ZW5kcyB1bmRlZmluZWQgfCBudWxsID8gdW5kZWZpbmVkXG4gIDogRGVub3JtYWxpemVOdWxsYWJsZTxFWydzY2hlbWEnXT47XG4gIGxvYWRpbmc6IGJvb2xlYW47XG4gIGVycm9yOiBFcnJvclR5cGVzIHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRExFPFxuICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U8XG4gICAgRmV0Y2hGdW5jdGlvbixcbiAgICBTY2hlbWEgfCB1bmRlZmluZWQsXG4gICAgdW5kZWZpbmVkIHwgZmFsc2VcbiAgPixcbj4oZW5kcG9pbnQ6IEUsIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XSB8IHJlYWRvbmx5IFtudWxsXSk6IGFueSB7XG4gIGNvbnN0IHN0YXRlID0gdXNlQ2FjaGVTdGF0ZSgpO1xuICBjb25zdCBjb250cm9sbGVyID0gdXNlQ29udHJvbGxlcigpO1xuXG4gIGNvbnN0IGtleSA9IGFyZ3NbMF0gIT09IG51bGwgPyBlbmRwb2ludC5rZXkoLi4uYXJncykgOiAnJztcbiAgY29uc3QgY2FjaGVSZXN1bHRzID0ga2V5ICYmIHN0YXRlLmVuZHBvaW50c1trZXldO1xuICBjb25zdCBtZXRhID0gc3RhdGUubWV0YVtrZXldO1xuXG4gIC8vIENvbXB1dGUgZGVub3JtYWxpemVkIHZhbHVlXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgbGV0IHsgZGF0YSwgZXhwaXJ5U3RhdHVzLCBleHBpcmVzQXQsIGNvdW50UmVmIH0gPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gY29udHJvbGxlci5nZXRSZXNwb25zZU1ldGEoZW5kcG9pbnQsIC4uLmFyZ3MsIHN0YXRlKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtcbiAgICBjYWNoZVJlc3VsdHMsXG4gICAgc3RhdGUuaW5kZXhlcyxcbiAgICBzdGF0ZS5lbnRpdGllcyxcbiAgICBzdGF0ZS5lbnRpdHlNZXRhLFxuICAgIG1ldGEsXG4gICAga2V5LFxuICBdKTtcblxuICAvLyBJZiB3ZSBhcmUgaGFyZCBpbnZhbGlkIHdlIG11c3QgZmV0Y2ggcmVnYXJkbGVzcyBvZiB0cmlnZ2VyaW5nIG9yIHN0YWxlbmVzc1xuICBjb25zdCBmb3JjZUZldGNoID0gZXhwaXJ5U3RhdHVzID09PSBFeHBpcnlTdGF0dXMuSW52YWxpZDtcblxuICBjb25zdCBtYXliZVByb21pc2UgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAvLyBudWxsIHBhcmFtcyBtZWFuIGRvbid0IGRvIGFueXRoaW5nXG4gICAgaWYgKChEYXRlLm5vdygpIDw9IGV4cGlyZXNBdCAmJiAhZm9yY2VGZXRjaCkgfHwgIWtleSkgcmV0dXJuO1xuXG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZmV0Y2goZW5kcG9pbnQsIC4uLihhcmdzIGFzIGFueSkpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluc3Qgc2VyaWFsaXplZCBwYXJhbXMsIHNpbmNlIHBhcmFtcyBjYW4gY2hhbmdlIGZyZXF1ZW50bHlcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtleHBpcmVzQXQsIGNvbnRyb2xsZXIsIGtleSwgZm9yY2VGZXRjaCwgc3RhdGUubGFzdFJlc2V0XSk7XG5cbiAgLy8gZnVsbHkgXCJ2YWxpZFwiIGRhdGEgd2lsbCBub3Qgc3VzcGVuZC9sb2FkaW5nIGV2ZW4gaWYgaXQgaXMgbm90IGZyZXNoXG4gIGNvbnN0IGxvYWRpbmcgPSBleHBpcnlTdGF0dXMgIT09IEV4cGlyeVN0YXR1cy5WYWxpZCAmJiAhIW1heWJlUHJvbWlzZTtcblxuICB1c2VGb2N1c0VmZmVjdCgoKSA9PiB7XG4gICAgLy8gcmV2YWxpZGF0aW5nIG5vbi1zdXNwZW5kaW5nIGRhdGEgaXMgbG93IHByaW9yaXR5LCBzbyBtYWtlIHN1cmUgaXQgZG9lc24ndCBzdHV0dGVyIGFuaW1hdGlvbnNcbiAgICBjb25zdCB0YXNrID0gSW50ZXJhY3Rpb25NYW5hZ2VyLnJ1bkFmdGVySW50ZXJhY3Rpb25zKCgpID0+IHtcbiAgICAgIGlmIChEYXRlLm5vdygpID4gZXhwaXJlc0F0ICYmIGtleSkge1xuICAgICAgICBjb250cm9sbGVyLmZldGNoKGVuZHBvaW50LCAuLi4oYXJncyBhcyBQYXJhbWV0ZXJzPEU+KSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4gdGFzay5jYW5jZWwoKTtcbiAgfSwgW10pO1xuXG4gIGRhdGEgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAvLyBpZiB1c2VTdXNwZW5zZSgpIHdvdWxkIHN1c3BlbmQsIGRvbid0IGluY2x1ZGUgZW50aXRpZXMgZnJvbSBjYWNoZVxuICAgIGlmIChsb2FkaW5nKSB7XG4gICAgICBpZiAoIWVuZHBvaW50LnNjaGVtYSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIC8vIFRPRE86IHVzZSBnZXRSZXNwb25zZSgpIG9uY2UgaXQganVzdCByZXR1cm5zIGRhdGFcbiAgICAgIHJldHVybiBjb250cm9sbGVyLmdldFJlc3BvbnNlTWV0YShlbmRwb2ludCwgLi4uYXJncywge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgZW50aXRpZXM6IHt9LFxuICAgICAgfSkuZGF0YSBhcyBhbnk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICAgIC8vIGtleSBzdWJzdGl0dXRlcyBhcmdzICsgZW5kcG9pbnRcbiAgICAvLyB3ZSBvbmx5IG5lZWQgY2FjaGVSZXN1bHRzLCBhcyBlbnRpdGllcyBhcmUgbm90IHVzZWQgaW4gdGhpcyBjYXNlXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBba2V5LCBkYXRhLCBsb2FkaW5nLCBjYWNoZVJlc3VsdHNdKTtcblxuICBjb25zdCBlcnJvciA9IGNvbnRyb2xsZXIuZ2V0RXJyb3IoZW5kcG9pbnQsIC4uLmFyZ3MsIHN0YXRlKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIHVzZUVmZmVjdChjb3VudFJlZiwgW2RhdGFdKTtcblxuICByZXR1cm4ge1xuICAgIGRhdGEsXG4gICAgbG9hZGluZyxcbiAgICBlcnJvcixcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQVNBLFNBQVNBLFlBQVksUUFBUSxtQkFBbUI7QUFDaEQsU0FBU0MsU0FBUyxFQUFFQyxPQUFPLFFBQVEsT0FBTztBQUMxQyxTQUFTQyxrQkFBa0IsUUFBUSxjQUFjO0FBRWpELE9BQU9DLGFBQWEsTUFBTSxvQkFBb0I7QUFDOUMsT0FBT0MsYUFBYSxNQUFNLG9CQUFvQjtBQUM5QyxPQUFPQyxjQUFjLE1BQU0sNEJBQTRCOztBQW9CdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBNkJBLGVBQWUsU0FBU0MsTUFBTUEsQ0FNNUJDLFFB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