@data-client/react
Version:
Async State Management without the Management. REST, GraphQL, SSE, Websockets, Fetch
67 lines (61 loc) • 11.1 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import { ExpiryStatus } from '@data-client/core';
import { useEffect, useMemo } from 'react';
import useCacheState from './useCacheState.js';
import useController from './useController.js';
/**
* Use async data 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, key, forceFetch, state.lastReset]);
// fully "valid" data will not suspend/loading even if it is not fresh
const loading = expiryStatus !== ExpiryStatus.Valid && !!maybePromise;
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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFeHBpcnlTdGF0dXMiLCJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwidXNlQ2FjaGVTdGF0ZSIsInVzZUNvbnRyb2xsZXIiLCJ1c2VETEUiLCJlbmRwb2ludCIsImFyZ3MiLCJzdGF0ZSIsImNvbnRyb2xsZXIiLCJrZXkiLCJjYWNoZVJlc3VsdHMiLCJlbmRwb2ludHMiLCJtZXRhIiwiZGF0YSIsImV4cGlyeVN0YXR1cyIsImV4cGlyZXNBdCIsImNvdW50UmVmIiwiZ2V0UmVzcG9uc2VNZXRhIiwiaW5kZXhlcyIsImVudGl0aWVzIiwiZW50aXR5TWV0YSIsImZvcmNlRmV0Y2giLCJJbnZhbGlkIiwibWF5YmVQcm9taXNlIiwiRGF0ZSIsIm5vdyIsImZldGNoIiwiY2F0Y2giLCJsYXN0UmVzZXQiLCJsb2FkaW5nIiwiVmFsaWQiLCJzY2hlbWEiLCJ1bmRlZmluZWQiLCJfZXh0ZW5kcyIsImVycm9yIiwiZ2V0RXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvaG9va3MvdXNlRExFLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgRGVub3JtYWxpemUsXG4gIERlbm9ybWFsaXplTnVsbGFibGUsXG4gIEVycm9yVHlwZXMsXG4gIEVuZHBvaW50SW50ZXJmYWNlLFxuICBGZXRjaEZ1bmN0aW9uLFxuICBTY2hlbWEsXG4gIFJlc29sdmVUeXBlLFxufSBmcm9tICdAZGF0YS1jbGllbnQvY29yZSc7XG5pbXBvcnQgeyBFeHBpcnlTdGF0dXMgfSBmcm9tICdAZGF0YS1jbGllbnQvY29yZSc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB1c2VDYWNoZVN0YXRlIGZyb20gJy4vdXNlQ2FjaGVTdGF0ZS5qcyc7XG5pbXBvcnQgdXNlQ29udHJvbGxlciBmcm9tICcuL3VzZUNvbnRyb2xsZXIuanMnO1xuXG50eXBlIFNjaGVtYVJldHVybjxTIGV4dGVuZHMgU2NoZW1hIHwgdW5kZWZpbmVkPiA9XG4gIHwge1xuICAgICAgZGF0YTogRGVub3JtYWxpemU8Uz47XG4gICAgICBsb2FkaW5nOiBmYWxzZTtcbiAgICAgIGVycm9yOiB1bmRlZmluZWQ7XG4gICAgfVxuICB8IHsgZGF0YTogRGVub3JtYWxpemVOdWxsYWJsZTxTPjsgbG9hZGluZzogdHJ1ZTsgZXJyb3I6IHVuZGVmaW5lZCB9XG4gIHwgeyBkYXRhOiBEZW5vcm1hbGl6ZU51bGxhYmxlPFM+OyBsb2FkaW5nOiBmYWxzZTsgZXJyb3I6IEVycm9yVHlwZXMgfTtcblxudHlwZSBBc3luY1JldHVybjxFPiA9XG4gIHwge1xuICAgICAgZGF0YTogRSBleHRlbmRzICguLi5hcmdzOiBhbnkpID0+IGFueSA/IFJlc29sdmVUeXBlPEU+IDogYW55O1xuICAgICAgbG9hZGluZzogZmFsc2U7XG4gICAgICBlcnJvcjogdW5kZWZpbmVkO1xuICAgIH1cbiAgfCB7IGRhdGE6IHVuZGVmaW5lZDsgbG9hZGluZzogdHJ1ZTsgZXJyb3I6IHVuZGVmaW5lZCB9XG4gIHwgeyBkYXRhOiB1bmRlZmluZWQ7IGxvYWRpbmc6IGZhbHNlOyBlcnJvcjogRXJyb3JUeXBlcyB9O1xuXG4vKipcbiAqIFVzZSBhc3luYyBkYXRhIHdpdGggeyBkYXRhLCBsb2FkaW5nLCBlcnJvciB9IChETEUpXG4gKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS91c2VETEVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRExFPFxuICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2U8XG4gICAgRmV0Y2hGdW5jdGlvbixcbiAgICBTY2hlbWEgfCB1bmRlZmluZWQsXG4gICAgdW5kZWZpbmVkIHwgZmFsc2VcbiAgPixcbj4oXG4gIGVuZHBvaW50OiBFLFxuICAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl1cbik6IEVbJ3NjaGVtYSddIGV4dGVuZHMgdW5kZWZpbmVkIHwgbnVsbCA/IEFzeW5jUmV0dXJuPEU+XG46IFNjaGVtYVJldHVybjxFWydzY2hlbWEnXT47XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZURMRTxcbiAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPFxuICAgIEZldGNoRnVuY3Rpb24sXG4gICAgU2NoZW1hIHwgdW5kZWZpbmVkLFxuICAgIHVuZGVmaW5lZCB8IGZhbHNlXG4gID4sXG4+KFxuICBlbmRwb2ludDogRSxcbiAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dIHwgcmVhZG9ubHkgW251bGxdXG4pOiB7XG4gIGRhdGE6IEVbJ3NjaGVtYSddIGV4dGVuZHMgdW5kZWZpbmVkIHwgbnVsbCA/IHVuZGVmaW5lZFxuICA6IERlbm9ybWFsaXplTnVsbGFibGU8RVsnc2NoZW1hJ10+O1xuICBsb2FkaW5nOiBib29sZWFuO1xuICBlcnJvcjogRXJyb3JUeXBlcyB8IHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZURMRTxcbiAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPFxuICAgIEZldGNoRnVuY3Rpb24sXG4gICAgU2NoZW1hIHwgdW5kZWZpbmVkLFxuICAgIHVuZGVmaW5lZCB8IGZhbHNlXG4gID4sXG4+KGVuZHBvaW50OiBFLCAuLi5hcmdzOiByZWFkb25seSBbLi4uUGFyYW1ldGVyczxFPl0gfCByZWFkb25seSBbbnVsbF0pOiBhbnkge1xuICBjb25zdCBzdGF0ZSA9IHVzZUNhY2hlU3RhdGUoKTtcbiAgY29uc3QgY29udHJvbGxlciA9IHVzZUNvbnRyb2xsZXIoKTtcblxuICBjb25zdCBrZXkgPSBhcmdzWzBdICE9PSBudWxsID8gZW5kcG9pbnQua2V5KC4uLmFyZ3MpIDogJyc7XG4gIGNvbnN0IGNhY2hlUmVzdWx0cyA9IGtleSAmJiBzdGF0ZS5lbmRwb2ludHNba2V5XTtcbiAgY29uc3QgbWV0YSA9IHN0YXRlLm1ldGFba2V5XTtcblxuICAvLyBDb21wdXRlIGRlbm9ybWFsaXplZCB2YWx1ZVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gIGxldCB7IGRhdGEsIGV4cGlyeVN0YXR1cywgZXhwaXJlc0F0LCBjb3VudFJlZiB9ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0UmVzcG9uc2VNZXRhKGVuZHBvaW50LCAuLi5hcmdzLCBzdGF0ZSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXG4gICAgY2FjaGVSZXN1bHRzLFxuICAgIHN0YXRlLmluZGV4ZXMsXG4gICAgc3RhdGUuZW50aXRpZXMsXG4gICAgc3RhdGUuZW50aXR5TWV0YSxcbiAgICBtZXRhLFxuICAgIGtleSxcbiAgXSk7XG5cbiAgLy8gSWYgd2UgYXJlIGhhcmQgaW52YWxpZCB3ZSBtdXN0IGZldGNoIHJlZ2FyZGxlc3Mgb2YgdHJpZ2dlcmluZyBvciBzdGFsZW5lc3NcbiAgY29uc3QgZm9yY2VGZXRjaCA9IGV4cGlyeVN0YXR1cyA9PT0gRXhwaXJ5U3RhdHVzLkludmFsaWQ7XG5cbiAgY29uc3QgbWF5YmVQcm9taXNlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gbnVsbCBwYXJhbXMgbWVhbiBkb24ndCBkbyBhbnl0aGluZ1xuICAgIGlmICgoRGF0ZS5ub3coKSA8PSBleHBpcmVzQXQgJiYgIWZvcmNlRmV0Y2gpIHx8ICFrZXkpIHJldHVybjtcblxuICAgIHJldHVybiBjb250cm9sbGVyLmZldGNoKGVuZHBvaW50LCAuLi4oYXJncyBhcyBhbnkpKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgLy8gd2UgbmVlZCB0byBjaGVjayBhZ2FpbnN0IHNlcmlhbGl6ZWQgcGFyYW1zLCBzaW5jZSBwYXJhbXMgY2FuIGNoYW5nZSBmcmVxdWVudGx5XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbZXhwaXJlc0F0LCBrZXksIGZvcmNlRmV0Y2gsIHN0YXRlLmxhc3RSZXNldF0pO1xuXG4gIC8vIGZ1bGx5IFwidmFsaWRcIiBkYXRhIHdpbGwgbm90IHN1c3BlbmQvbG9hZGluZyBldmVuIGlmIGl0IGlzIG5vdCBmcmVzaFxuICBjb25zdCBsb2FkaW5nID0gZXhwaXJ5U3RhdHVzICE9PSBFeHBpcnlTdGF0dXMuVmFsaWQgJiYgISFtYXliZVByb21pc2U7XG5cbiAgZGF0YSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIC8vIGlmIHVzZVN1c3BlbnNlKCkgd291bGQgc3VzcGVuZCwgZG9uJ3QgaW5jbHVkZSBlbnRpdGllcyBmcm9tIGNhY2hlXG4gICAgaWYgKGxvYWRpbmcpIHtcbiAgICAgIGlmICghZW5kcG9pbnQuc2NoZW1hKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgLy8gVE9ETzogdXNlIGdldFJlc3BvbnNlKCkgb25jZSBpdCBqdXN0IHJldHVybnMgZGF0YVxuICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0UmVzcG9uc2VNZXRhKGVuZHBvaW50LCAuLi5hcmdzLCB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBlbnRpdGllczoge30sXG4gICAgICB9KS5kYXRhIGFzIGFueTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gICAgLy8ga2V5IHN1YnN0aXR1dGVzIGFyZ3MgKyBlbmRwb2ludFxuICAgIC8vIHdlIG9ubHkgbmVlZCBjYWNoZVJlc3VsdHMsIGFzIGVudGl0aWVzIGFyZSBub3QgdXNlZCBpbiB0aGlzIGNhc2VcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtrZXksIGRhdGEsIGxvYWRpbmcsIGNhY2hlUmVzdWx0c10pO1xuXG4gIGNvbnN0IGVycm9yID0gY29udHJvbGxlci5nZXRFcnJvcihlbmRwb2ludCwgLi4uYXJncywgc3RhdGUpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgdXNlRWZmZWN0KGNvdW50UmVmLCBbZGF0YV0pO1xuXG4gIHJldHVybiB7XG4gICAgZGF0YSxcbiAgICBsb2FkaW5nLFxuICAgIGVycm9yLFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBU0EsU0FBU0EsWUFBWSxRQUFRLG1CQUFtQjtBQUNoRCxTQUFTQyxTQUFTLEVBQUVDLE9BQU8sUUFBUSxPQUFPO0FBRTFDLE9BQU9DLGFBQWEsTUFBTSxvQkFBb0I7QUFDOUMsT0FBT0MsYUFBYSxNQUFNLG9CQUFvQjs7QUFvQjlDO0FBQ0E7QUFDQTtBQUNBOztBQTZCQSxlQUFlLFNBQVNDLE1BQU1BLENBTTVCQyxRQUFXLEVBQUUsR0FBR0MsSUFBbUQsRUFBTztFQUMxRSxNQUFNQyxLQUFLLEdBQUdMLGFBQWEsQ0FBQyxDQUFDO0VBQzdCLE1BQU1NLFVBQVUsR0FBR0wsYUFBYSxDQUFDLENBQUM7RUFFbEMsTUFBTU0sR0FBRyxHQUFHSCxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxHQUFHRCxRQUFRLENBQUNJLEdBQUcsQ0FBQyxHQUFHSCxJQUFJLENBQUMsR0FBRyxFQUFFO0VBQ3pELE1BQU1JLFlBQVksR0FBR0QsR0FBRyxJQUFJRixLQUFLLENBQUNJLFNBQVMsQ0FBQ0YsR0FBRyxDQUFDO0VBQ2hELE1BQU1HLElBQUksR0FBR0wsS0FBSyxDQUFDSyxJQUFJLENBQUNILEdBQUcsQ0FBQzs7RUFFNUI7RUFDQTtFQUNBLElBQUk7SUFBRUksSUFBSTtJQUFFQyxZQUFZO0lBQUVDLFNBQVM7SUFBRUM7RUFBUyxDQUFDLEdBQUdmLE9BQU8sQ0FBQyxNQUFNO0lBQzlELE9BQU9PLFVBQVUsQ0FBQ1MsZUFBZSxDQUFDWixRQUFRLEVBQUUsR0FBR0MsSUFBSSxFQUFFQyxLQUFLLENBQUM7SUFDM0Q7RUFDRixDQUFDLEVBQUUsQ0FDREcsWUFBWSxFQUNaSCxLQUFLLENBQUNXLE9BQU8sRUFDYlgsS0FBSyxDQUFDWSxRQUFRLEVBQ2RaLEtBQUssQ0FBQ2EsVUFBVSxFQUNoQlIsSUFBSSxFQUNKSCxHQUFHLENBQ0osQ0FBQzs7RUFFRjtFQUNBLE1BQU1ZLFVBQVUsR0FBR1AsWUFBWSxLQUFLZixZQUFZLENBQUN1QixPQUFPO0VBRXhELE1BQU1DLFlBQVksR0FBR3RCLE9BQU8sQ0FBQyxNQUFNO0lBQ2pDO0lBQ0EsSUFBS3VCLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUMsSUFBSVYsU0FBUyxJQUFJLENBQUNNLFVBQVUsSUFBSyxDQUFDWixHQUFHLEVBQUU7SUFFdEQsT0FBT0QsVUFBVSxDQUFDa0IsS0FBSyxDQUFDckIsUUFBUSxFQUFFLEdBQUlDLElBQVksQ0FBQyxDQUFDcUIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbkU7SUFDQTtFQUNGLENBQUMsRUFBRSxDQUFDWixTQUFTLEVBQUVOLEdBQUcsRUFBRVksVUFBVSxFQUFFZCxLQUFLLENBQUNxQixTQUFTLENBQUMsQ0FBQzs7RUFFakQ7RUFDQSxNQUFNQyxPQUFPLEdBQUdmLFlBQVksS0FBS2YsWUFBWSxDQUFDK0IsS0FBSyxJQUFJLENBQUMsQ0FBQ1AsWUFBWTtFQUVyRVYsSUFBSSxHQUFHWixPQUFPLENBQUMsTUFBTTtJQUNuQjtJQUNBLElBQUk0QixPQUFPLEVBQUU7TUFDWCxJQUFJLENBQUN4QixRQUFRLENBQUMwQixNQUFNLEVBQUUsT0FBT0MsU0FBUztNQUN0QztNQUNBLE9BQU94QixVQUFVLENBQUNTLGVBQWUsQ0FBQ1osUUFBUSxFQUFFLEdBQUdDLElBQUksRUFBQTJCLFFBQUEsS0FDOUMxQixLQUFLO1FBQ1JZLFFBQVEsRUFBRSxDQUFDO01BQUMsRUFDYixDQUFDLENBQUNOLElBQUk7SUFDVDtJQUNBLE9BQU9BLElBQUk7SUFDWDtJQUNBO0lBQ0E7RUFDRixDQUFDLEVBQUUsQ0FBQ0osR0FBRyxFQUFFSSxJQUFJLEVBQUVnQixPQUFPLEVBQUVuQixZQUFZLENBQUMsQ0FBQztFQUV0QyxNQUFNd0IsS0FBSyxHQUFHMUIsVUFBVSxDQUFDMkIsUUFBUSxDQUFDOUIsUUFBUSxFQUFFLEdBQUdDLElBQUksRUFBRUMsS0FBSyxDQUFDOztFQUUzRDtFQUNBUCxTQUFTLENBQUNnQixRQUFRLEVBQUUsQ0FBQ0gsSUFBSSxDQUFDLENBQUM7RUFFM0IsT0FBTztJQUNMQSxJQUFJO0lBQ0pnQixPQUFPO0lBQ1BLO0VBQ0YsQ0FBQztBQUNIIiwiaWdub3JlTGlzdCI6W119