import type { DefaultError } from '@tanstack/query-core' import type { 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, ) => query.state.data === undefined export const ensureStaleTime = ( defaultedOptions: DefaultedQueryObserverOptions, ) => { if (defaultedOptions.suspense) { // Always set stale time when using suspense to prevent // fetching again when directly mounting after suspending if (typeof defaultedOptions.staleTime !== 'number') { defaultedOptions.staleTime = 1000 } } } export const willFetch = ( result: QueryObserverResult, isRestoring: boolean, ) => result.isLoading && result.isFetching && !isRestoring export const shouldSuspend = ( defaultedOptions: | DefaultedQueryObserverOptions | undefined, result: QueryObserverResult, ) => defaultedOptions?.suspense && result.isPending export const fetchOptimistic = < TQueryFnData, TError, TData, TQueryData, TQueryKey extends QueryKey, >( defaultedOptions: DefaultedQueryObserverOptions< TQueryFnData, TError, TData, TQueryData, TQueryKey >, observer: QueryObserver, errorResetBoundary: QueryErrorResetBoundaryValue, ) => observer.fetchOptimistic(defaultedOptions).catch(() => { errorResetBoundary.clearReset() })