@data-client/react
Version:
Async State Management without the Management. REST, GraphQL, SSE, Websockets, Fetch
50 lines (46 loc) • 8.61 kB
JavaScript
import { ExpiryStatus } from '@data-client/core';
import { useMemo } from 'react';
import { InteractionManager } from 'react-native';
import useCacheState from './useCacheState.js';
import useController from './useController.js';
import useFocusEffect from './useFocusEffect.native.js';
/**
* Request a resource if it is not in cache.
* @see https://dataclient.io/docs/api/useFetch
*/
export default function useFetch(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
const {
expiryStatus,
expiresAt
} = 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;
// if args is [null], we won't get to this line
return controller.fetch(endpoint, ...args);
// 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]);
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();
}, []);
return maybePromise;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFeHBpcnlTdGF0dXMiLCJ1c2VNZW1vIiwiSW50ZXJhY3Rpb25NYW5hZ2VyIiwidXNlQ2FjaGVTdGF0ZSIsInVzZUNvbnRyb2xsZXIiLCJ1c2VGb2N1c0VmZmVjdCIsInVzZUZldGNoIiwiZW5kcG9pbnQiLCJhcmdzIiwic3RhdGUiLCJjb250cm9sbGVyIiwia2V5IiwiY2FjaGVSZXN1bHRzIiwiZW5kcG9pbnRzIiwibWV0YSIsImV4cGlyeVN0YXR1cyIsImV4cGlyZXNBdCIsImdldFJlc3BvbnNlTWV0YSIsImluZGV4ZXMiLCJlbnRpdGllcyIsImVudGl0eU1ldGEiLCJmb3JjZUZldGNoIiwiSW52YWxpZCIsIm1heWJlUHJvbWlzZSIsIkRhdGUiLCJub3ciLCJmZXRjaCIsImxhc3RSZXNldCIsInRhc2siLCJydW5BZnRlckludGVyYWN0aW9ucyIsImNhbmNlbCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VGZXRjaC5uYXRpdmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVub3JtYWxpemVOdWxsYWJsZSwgRXhwaXJ5U3RhdHVzLCBOSSB9IGZyb20gJ0BkYXRhLWNsaWVudC9jb3JlJztcbmltcG9ydCB7XG4gIEVuZHBvaW50SW50ZXJmYWNlLFxuICBEZW5vcm1hbGl6ZSxcbiAgU2NoZW1hLFxuICBGZXRjaEZ1bmN0aW9uLFxufSBmcm9tICdAZGF0YS1jbGllbnQvY29yZSc7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25NYW5hZ2VyIH0gZnJvbSAncmVhY3QtbmF0aXZlJztcblxuaW1wb3J0IHVzZUNhY2hlU3RhdGUgZnJvbSAnLi91c2VDYWNoZVN0YXRlLmpzJztcbmltcG9ydCB1c2VDb250cm9sbGVyIGZyb20gJy4vdXNlQ29udHJvbGxlci5qcyc7XG5pbXBvcnQgdXNlRm9jdXNFZmZlY3QgZnJvbSAnLi91c2VGb2N1c0VmZmVjdC5uYXRpdmUuanMnO1xuXG4vKipcbiAqIFJlcXVlc3QgYSByZXNvdXJjZSBpZiBpdCBpcyBub3QgaW4gY2FjaGUuXG4gKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS91c2VGZXRjaFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VGZXRjaDxcbiAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlPFxuICAgIEZldGNoRnVuY3Rpb24sXG4gICAgU2NoZW1hIHwgdW5kZWZpbmVkLFxuICAgIHVuZGVmaW5lZCB8IGZhbHNlXG4gID4sXG4+KFxuICBlbmRwb2ludDogRSxcbiAgLi4uYXJnczogcmVhZG9ubHkgWy4uLlBhcmFtZXRlcnM8RT5dXG4pOiBFWydzY2hlbWEnXSBleHRlbmRzIHVuZGVmaW5lZCB8IG51bGwgPyBSZXR1cm5UeXBlPEU+XG46IFByb21pc2U8RGVub3JtYWxpemU8RVsnc2NoZW1hJ10+PjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRmV0Y2g8XG4gIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZTxcbiAgICBGZXRjaEZ1bmN0aW9uLFxuICAgIFNjaGVtYSB8IHVuZGVmaW5lZCxcbiAgICB1bmRlZmluZWQgfCBmYWxzZVxuICA+LFxuPihcbiAgZW5kcG9pbnQ6IEUsXG4gIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XSB8IHJlYWRvbmx5IFtudWxsXVxuKTogRVsnc2NoZW1hJ10gZXh0ZW5kcyB1bmRlZmluZWQgfCBudWxsID8gUmV0dXJuVHlwZTxFPiB8IHVuZGVmaW5lZFxuOiBQcm9taXNlPERlbm9ybWFsaXplTnVsbGFibGU8RVsnc2NoZW1hJ10+PjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRmV0Y2g8XG4gIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZTxcbiAgICBGZXRjaEZ1bmN0aW9uLFxuICAgIFNjaGVtYSB8IHVuZGVmaW5lZCxcbiAgICB1bmRlZmluZWQgfCBmYWxzZVxuICA+LFxuPihcbiAgZW5kcG9pbnQ6IEUsXG4gIC4uLmFyZ3M6IHJlYWRvbmx5IFsuLi5QYXJhbWV0ZXJzPEU+XSB8IHJlYWRvbmx5IFtudWxsXVxuKTogUHJvbWlzZTxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhdGUgPSB1c2VDYWNoZVN0YXRlKCk7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSB1c2VDb250cm9sbGVyKCk7XG5cbiAgY29uc3Qga2V5ID0gYXJnc1swXSAhPT0gbnVsbCA/IGVuZHBvaW50LmtleSguLi5hcmdzKSA6ICcnO1xuICBjb25zdCBjYWNoZVJlc3VsdHMgPSBrZXkgJiYgc3RhdGUuZW5kcG9pbnRzW2tleV07XG4gIGNvbnN0IG1ldGEgPSBzdGF0ZS5tZXRhW2tleV07XG5cbiAgLy8gQ29tcHV0ZSBkZW5vcm1hbGl6ZWQgdmFsdWVcbiAgY29uc3QgeyBleHBpcnlTdGF0dXMsIGV4cGlyZXNBdCB9ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0UmVzcG9uc2VNZXRhKGVuZHBvaW50LCAuLi5hcmdzLCBzdGF0ZSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXG4gICAgY2FjaGVSZXN1bHRzLFxuICAgIHN0YXRlLmluZGV4ZXMsXG4gICAgc3RhdGUuZW50aXRpZXMsXG4gICAgc3RhdGUuZW50aXR5TWV0YSxcbiAgICBtZXRhLFxuICAgIGtleSxcbiAgXSk7XG5cbiAgLy8gSWYgd2UgYXJlIGhhcmQgaW52YWxpZCB3ZSBtdXN0IGZldGNoIHJlZ2FyZGxlc3Mgb2YgdHJpZ2dlcmluZyBvciBzdGFsZW5lc3NcbiAgY29uc3QgZm9yY2VGZXRjaCA9IGV4cGlyeVN0YXR1cyA9PT0gRXhwaXJ5U3RhdHVzLkludmFsaWQ7XG5cbiAgY29uc3QgbWF5YmVQcm9taXNlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gbnVsbCBwYXJhbXMgbWVhbiBkb24ndCBkbyBhbnl0aGluZ1xuICAgIGlmICgoRGF0ZS5ub3coKSA8PSBleHBpcmVzQXQgJiYgIWZvcmNlRmV0Y2gpIHx8ICFrZXkpIHJldHVybjtcbiAgICAvLyBpZiBhcmdzIGlzIFtudWxsXSwgd2Ugd29uJ3QgZ2V0IHRvIHRoaXMgbGluZVxuICAgIHJldHVybiBjb250cm9sbGVyLmZldGNoKGVuZHBvaW50LCAuLi4oYXJncyBhcyBQYXJhbWV0ZXJzPEU+KSk7XG4gICAgLy8gd2UgbmVlZCB0byBjaGVjayBhZ2FpbnN0IHNlcmlhbGl6ZWQgcGFyYW1zLCBzaW5jZSBwYXJhbXMgY2FuIGNoYW5nZSBmcmVxdWVudGx5XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbZXhwaXJlc0F0LCBrZXksIGZvcmNlRmV0Y2gsIHN0YXRlLmxhc3RSZXNldF0pO1xuXG4gIHVzZUZvY3VzRWZmZWN0KCgpID0+IHtcbiAgICAvLyByZXZhbGlkYXRpbmcgbm9uLXN1c3BlbmRpbmcgZGF0YSBpcyBsb3cgcHJpb3JpdHksIHNvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IHN0dXR0ZXIgYW5pbWF0aW9uc1xuICAgIGNvbnN0IHRhc2sgPSBJbnRlcmFjdGlvbk1hbmFnZXIucnVuQWZ0ZXJJbnRlcmFjdGlvbnMoKCkgPT4ge1xuICAgICAgaWYgKERhdGUubm93KCkgPiBleHBpcmVzQXQgJiYga2V5KSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZmV0Y2goZW5kcG9pbnQsIC4uLihhcmdzIGFzIFBhcmFtZXRlcnM8RT4pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiAoKSA9PiB0YXNrLmNhbmNlbCgpO1xuICB9LCBbXSk7XG5cbiAgcmV0dXJuIG1heWJlUHJvbWlzZTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBOEJBLFlBQVksUUFBWSxtQkFBbUI7QUFPekUsU0FBU0MsT0FBTyxRQUFRLE9BQU87QUFDL0IsU0FBU0Msa0JBQWtCLFFBQVEsY0FBYztBQUVqRCxPQUFPQyxhQUFhLE1BQU0sb0JBQW9CO0FBQzlDLE9BQU9DLGFBQWEsTUFBTSxvQkFBb0I7QUFDOUMsT0FBT0MsY0FBYyxNQUFNLDRCQUE0Qjs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBeUJBLGVBQWUsU0FBU0MsUUFBUUEsQ0FPOUJDLFFBQVcsRUFDWCxHQUFHQyxJQUFtRCxFQUM1QjtFQUMxQixNQUFNQyxLQUFLLEdBQUdOLGFBQWEsQ0FBQyxDQUFDO0VBQzdCLE1BQU1PLFVBQVUsR0FBR04sYUFBYSxDQUFDLENBQUM7RUFFbEMsTUFBTU8sR0FBRyxHQUFHSCxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxHQUFHRCxRQUFRLENBQUNJLEdBQUcsQ0FBQyxHQUFHSCxJQUFJLENBQUMsR0FBRyxFQUFFO0VBQ3pELE1BQU1JLFlBQVksR0FBR0QsR0FBRyxJQUFJRixLQUFLLENBQUNJLFNBQVMsQ0FBQ0YsR0FBRyxDQUFDO0VBQ2hELE1BQU1HLElBQUksR0FBR0wsS0FBSyxDQUFDSyxJQUFJLENBQUNILEdBQUcsQ0FBQzs7RUFFNUI7RUFDQSxNQUFNO0lBQUVJLFlBQVk7SUFBRUM7RUFBVSxDQUFDLEdBQUdmLE9BQU8sQ0FBQyxNQUFNO0lBQ2hELE9BQU9TLFVBQVUsQ0FBQ08sZUFBZSxDQUFDVixRQUFRLEVBQUUsR0FBR0MsSUFBSSxFQUFFQyxLQUFLLENBQUM7SUFDM0Q7RUFDRixDQUFDLEVBQUUsQ0FDREcsWUFBWSxFQUNaSCxLQUFLLENBQUNTLE9BQU8sRUFDYlQsS0FBSyxDQUFDVSxRQUFRLEVBQ2RWLEtBQUssQ0FBQ1csVUFBVSxFQUNoQk4sSUFBSSxFQUNKSCxHQUFHLENBQ0osQ0FBQzs7RUFFRjtFQUNBLE1BQU1VLFVBQVUsR0FBR04sWUFBWSxLQUFLZixZQUFZLENBQUNzQixPQUFPO0VBRXhELE1BQU1DLFlBQVksR0FBR3RCLE9BQU8sQ0FBQyxNQUFNO0lBQ2pDO0lBQ0EsSUFBS3VCLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUMsSUFBSVQsU0FBUyxJQUFJLENBQUNLLFVBQVUsSUFBSyxDQUFDVixHQUFHLEVBQUU7SUFDdEQ7SUFDQSxPQUFPRCxVQUFVLENBQUNnQixLQUFLLENBQUNuQixRQUFRLEVBQUUsR0FBSUMsSUFBc0IsQ0FBQztJQUM3RDtJQUNBO0VBQ0YsQ0FBQyxFQUFFLENBQUNRLFNBQVMsRUFBRUwsR0FBRyxFQUFFVSxVQUFVLEVBQUVaLEtBQUssQ0FBQ2tCLFNBQVMsQ0FBQyxDQUFDO0VBRWpEdEIsY0FBYyxDQUFDLE1BQU07SUFDbkI7SUFDQSxNQUFNdUIsSUFBSSxHQUFHMUIsa0JBQWtCLENBQUMyQixvQkFBb0IsQ0FBQyxNQUFNO01BQ3pELElBQUlMLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUMsR0FBR1QsU0FBUyxJQUFJTCxHQUFHLEVBQUU7UUFDakNELFVBQVUsQ0FBQ2dCLEtBQUssQ0FBQ25CLFFBQVEsRUFBRSxHQUFJQyxJQUFzQixDQUFDO01BQ3hEO0lBQ0YsQ0FBQyxDQUFDO0lBRUYsT0FBTyxNQUFNb0IsSUFBSSxDQUFDRSxNQUFNLENBQUMsQ0FBQztFQUM1QixDQUFDLEVBQUUsRUFBRSxDQUFDO0VBRU4sT0FBT1AsWUFBWTtBQUNyQiIsImlnbm9yZUxpc3QiOltdfQ==