react-query
Version:
Hooks for managing, caching and syncing asynchronous and remote data in React
34 lines (32 loc) • 1.76 kB
JavaScript
import React from 'react';
import { useSyncExternalStore } from 'use-sync-external-store/shim';
import { notifyManager } from '../core/notifyManager';
import { QueriesObserver } from '../core/queriesObserver';
import { useQueryClient } from './QueryClientProvider';
import { useIsRestoring } from './isRestoring'; // This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.
// - `context` is omitted as it is passed as a root-level option to `useQueries` instead.
export function useQueries({
queries,
context
}) {
const queryClient = useQueryClient({
context
});
const isRestoring = useIsRestoring();
const defaultedQueries = React.useMemo(() => queries.map(options => {
const defaultedOptions = queryClient.defaultQueryOptions(options); // Make sure the results are already in fetching state before subscribing or updating options
defaultedOptions._optimisticResults = isRestoring ? 'isRestoring' : 'optimistic';
return defaultedOptions;
}), [queries, queryClient, isRestoring]);
const [observer] = React.useState(() => new QueriesObserver(queryClient, defaultedQueries));
const result = observer.getOptimisticResult(defaultedQueries);
useSyncExternalStore(React.useCallback(onStoreChange => isRestoring ? () => undefined : observer.subscribe(notifyManager.batchCalls(onStoreChange)), [observer, isRestoring]), () => observer.getCurrentResult(), () => observer.getCurrentResult());
React.useEffect(() => {
// Do not notify on updates because of changes in the options because
// these changes should already be reflected in the optimistic result.
observer.setQueries(defaultedQueries, {
listeners: false
});
}, [defaultedQueries, observer]);
return result;
}