'use client' import * as React from 'react' import { shouldThrowError } from '@tanstack/query-core' import type { DefaultedQueryObserverOptions, Query, QueryKey, QueryObserverResult, ThrowOnError, } from '@tanstack/query-core' import type { QueryErrorResetBoundaryValue } from './QueryErrorResetBoundary' export const ensurePreventErrorBoundaryRetry = < TQueryFnData, TError, TData, TQueryData, TQueryKey extends QueryKey, >( options: DefaultedQueryObserverOptions< TQueryFnData, TError, TData, TQueryData, TQueryKey >, errorResetBoundary: QueryErrorResetBoundaryValue, query: Query | undefined, ) => { const throwOnError = query?.state.error && typeof options.throwOnError === 'function' ? shouldThrowError(options.throwOnError, [query.state.error, query]) : options.throwOnError if ( options.suspense || options.experimental_prefetchInRender || throwOnError ) { // Prevent retrying failed query if the error boundary has not been reset yet if (!errorResetBoundary.isReset()) { options.retryOnMount = false } } } export const useClearResetErrorBoundary = ( errorResetBoundary: QueryErrorResetBoundaryValue, ) => { React.useEffect(() => { errorResetBoundary.clearReset() }, [errorResetBoundary]) } export const getHasError = < TData, TError, TQueryFnData, TQueryData, TQueryKey extends QueryKey, >({ result, errorResetBoundary, throwOnError, query, suspense, }: { result: QueryObserverResult errorResetBoundary: QueryErrorResetBoundaryValue throwOnError: ThrowOnError query: Query | undefined suspense: boolean | undefined }) => { return ( result.isError && !errorResetBoundary.isReset() && !result.isFetching && query && ((suspense && result.data === undefined) || shouldThrowError(throwOnError, [result.error, query])) ) }