UNPKG

ra-core

Version:

Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React

60 lines (51 loc) 1.87 kB
import React from 'react'; import { notifyManager, useQueryClient } from '@tanstack/react-query'; /** * Get the state of the dataProvider connection. * * Returns true if a query or a mutation is pending. * * Custom implementation because react-query's useIsFetching and useIsMutating * render each time the number of active queries changes, which is too often. * * @see useIsFetching * @see useIsMutating */ export const useLoading = (): boolean => { const client = useQueryClient(); const mountedRef = React.useRef(false); const isFetchingRef = React.useRef(client.isFetching() > 0); const isMutatingRef = React.useRef(client.isMutating() > 0); const [isLoading, setIsLoading] = React.useState<boolean>( isFetchingRef.current || isMutatingRef.current ); React.useEffect(() => { mountedRef.current = true; const unsubscribeQueryCache = client.getQueryCache().subscribe( notifyManager.batchCalls(() => { if (mountedRef.current) { isFetchingRef.current = client.isFetching() > 0; setIsLoading( isFetchingRef.current || isMutatingRef.current ); } }) ); const unsubscribeMutationCache = client.getMutationCache().subscribe( notifyManager.batchCalls(() => { if (mountedRef.current) { isMutatingRef.current = client.isMutating() > 0; setIsLoading( isFetchingRef.current || isMutatingRef.current ); } }) ); return () => { mountedRef.current = false; unsubscribeQueryCache(); unsubscribeMutationCache(); }; }, [client]); return isLoading; };