![Reactive Data Client](https://github.com/reactive/data-client/raw/HEAD/./data_client_logo_and_text.svg?sanitize=true)
![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)
Reducer/flux normalized, framework-agnostic data store. Includes managers/middleware, global referential equality guarantees,
automatic expiry policies, data normalization. Consumes TypeScript Standard Endpoints
Framework Implementations
Sample React Hook suspense implementation
function useSuspense(endpoint, ...args)
const state = useCacheState();
const controller = useController();
const key = args[0] !== null ? endpoint.key(...args) : '';
const cacheResults = key && state.results[key];
const meta = state.meta[key];
const { data, expiryStatus, expiresAt } = useMemo(() => {
return controller.getResponse(endpoint, ...args, state);
}, [
cacheResults,
state.indexes,
state.entities,
state.entityMeta,
meta,
key,
]);
const error = controller.getError(endpoint, ...args, state);
const forceFetch = expiryStatus === ExpiryStatus.Invalid;
const maybePromise = useMemo(() => {
if ((Date.now() <= expiresAt && !forceFetch) || !key) return;
return controller.fetch(endpoint, ...args);
}, [expiresAt, controller, key, forceFetch, state.lastReset]);
if (expiryStatus !== ExpiryStatus.Valid && maybePromise) {
throw maybePromise;
}
if (error) throw error;
return data;
}