UNPKG

@tanstack/react-query

Version:

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

75 lines (66 loc) 2.16 kB
import type { DefaultError, DefaultedQueryObserverOptions, Query, QueryKey, QueryObserver, QueryObserverResult, } from '@tanstack/query-core' import type { QueryErrorResetBoundaryValue } from './QueryErrorResetBoundary' export const defaultThrowOnError = < TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, >( _error: TError, query: Query<TQueryFnData, TError, TData, TQueryKey>, ) => query.state.data === undefined export const ensureSuspenseTimers = ( defaultedOptions: DefaultedQueryObserverOptions<any, any, any, any, any>, ) => { if (defaultedOptions.suspense) { // Handle staleTime to ensure minimum 1000ms in Suspense mode // This prevents unnecessary refetching when components remount after suspending const clamp = (value: number | 'static' | undefined) => value === 'static' ? value : Math.max(value ?? 1000, 1000) const originalStaleTime = defaultedOptions.staleTime defaultedOptions.staleTime = typeof originalStaleTime === 'function' ? (...args) => clamp(originalStaleTime(...args)) : clamp(originalStaleTime) if (typeof defaultedOptions.gcTime === 'number') { defaultedOptions.gcTime = Math.max(defaultedOptions.gcTime, 1000) } } } export const willFetch = ( result: QueryObserverResult<any, any>, isRestoring: boolean, ) => result.isLoading && result.isFetching && !isRestoring export const shouldSuspend = ( defaultedOptions: | DefaultedQueryObserverOptions<any, any, any, any, any> | undefined, result: QueryObserverResult<any, any>, ) => defaultedOptions?.suspense && result.isPending export const fetchOptimistic = < TQueryFnData, TError, TData, TQueryData, TQueryKey extends QueryKey, >( defaultedOptions: DefaultedQueryObserverOptions< TQueryFnData, TError, TData, TQueryData, TQueryKey >, observer: QueryObserver<TQueryFnData, TError, TData, TQueryData, TQueryKey>, errorResetBoundary: QueryErrorResetBoundaryValue, ) => observer.fetchOptimistic(defaultedOptions).catch(() => { errorResetBoundary.clearReset() })