UNPKG

react-query

Version:

Hooks for managing, caching and syncing asynchronous and remote data in React

34 lines (32 loc) 1.76 kB
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; }