import type { DefaultError, DefaultedQueryObserverOptions, Query, QueryKey, QueryObserverResult, ThrowOnError, } from '@tanstack/query-core' export const shouldSuspend = ( defaultedOptions: | DefaultedQueryObserverOptions | undefined, result: QueryObserverResult, isRestoring: boolean ) => defaultedOptions?.suspense && willFetch(result, isRestoring) export const willFetch = ( result: QueryObserverResult, isRestoring: boolean ) => result.isPending && !isRestoring export const getHasError = < TData, TError, TQueryFnData, TQueryData, TQueryKey extends QueryKey, >({ result, throwOnError, query, }: { result: QueryObserverResult throwOnError: | ThrowOnError | undefined query: Query }) => { return ( result.isError && !result.isFetching && shouldThrowError(throwOnError, [result.error, query]) ) } export function shouldThrowError boolean>( throwOnError: boolean | T | undefined, params: Parameters ): boolean { // Allow useErrorBoundary function to override throwing behavior on a per-error basis if (typeof throwOnError === 'function') { return throwOnError(...params) } return !!throwOnError } export const defaultThrowOnError = < TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, >( _error: TError, query: Query ) => typeof query.state.data === 'undefined' export const ensureStaleTime = ( defaultedOptions: DefaultedQueryObserverOptions ) => { if (defaultedOptions.suspense) { if (typeof defaultedOptions.staleTime !== 'number') { return { ...defaultedOptions, staleTime: 1000, } } } return defaultedOptions }