import { ObservableQuery, ObservableQueryOptions, ObservableQueryResult, } from '../vanilla/observableQuery' import { isNumber } from '../vanilla/utils' import type { QueryErrorResetBoundaryValue } from './QueryErrorResetBoundary' export const suspenseOptions: Partial = { suspense: true, enabled: true, throwOnError: (_error, queryInfo) => queryInfo.state.data === undefined, } export const ensureStaleTime = ( defaultedOptions: ObservableQueryOptions ) => { if (defaultedOptions.suspense) { // Always set stale time when using suspense to prevent // fetching again when directly mounting after suspending if (!isNumber(defaultedOptions.staleTime)) { defaultedOptions.staleTime = 1000 } } } export const willFetch = (result: ObservableQueryResult) => result.isLoading && result.isFetching export const shouldSuspend = ( defaultedOptions: ObservableQueryOptions | undefined, result: ObservableQueryResult ) => defaultedOptions?.suspense && willFetch(result) export const fetchOptimistic = ( defaultedOptions: ObservableQueryOptions, obsQuery: ObservableQuery, errorResetBoundary: QueryErrorResetBoundaryValue ) => { return obsQuery.fetchOptimistic(defaultedOptions).catch(() => { errorResetBoundary.clearReset() }) }