import type { Dispatch, SetStateAction } from 'react';
import AbitCache from '../services/AbitCache';
type TKey = string | object | unknown[];
type TAbortSignal = {
    signal: AbortSignal;
};
type TCacheFetcher<Data> = (key: TKey, signal: TAbortSignal) => Promise<Data>;
type TOnErrorRetry = (err: Error, key: TKey, revalidate: () => Promise<void>) => void;
type TOnSettled<Data, Variables> = (data: Data | null, error: Error | null, variables: Variables) => void;
type TCacheOptions<Data = unknown> = {
    isEnabled?: boolean;
    isSuspense?: boolean;
    staleTime?: number;
    isRevalidateIfStale?: boolean;
    isRevalidateOnFocus?: boolean;
    isRevalidateOnReconnect?: boolean;
    isKeepPreviousData?: boolean;
    shouldRetryOnError?: boolean;
    errorRetryInterval?: number;
    errorRetryCount?: number;
    dedupingInterval?: number;
    focusThrottleInterval?: number;
    onSuccess?: (data: Data, key: TKey) => void;
    onError?: (err: Error, key: TKey) => void;
    onErrorRetry?: TOnErrorRetry;
    isDeepEqual?: (a: Data | null, b: Data | null) => boolean;
};
type TOptimisticFunction<Data> = (previousData: Data | null) => Data;
type TMutateOptions<Data, Variables> = {
    isRevalidate?: boolean;
    isRollbackOnError?: boolean;
    optimisticData?: Data | TOptimisticFunction<Data>;
    onSuccess?: (data: Data) => void;
    onError?: (error: Error) => void;
    onSettled?: TOnSettled<Data, Variables>;
};
type TMutateFetcher<Data, Variables> = (variables: Variables, abortSignal: TAbortSignal) => Promise<Data>;
type TCacheEntry<Data = unknown> = {
    data: Data;
    timestamp: number;
};
type TCacheConfig = {
    readonly Cache: AbitCache;
} & TCacheOptions;
type TUseQueryReturn<Data> = {
    data: Data | null;
    error: Error | null;
    isLoading: boolean;
    clear: () => void;
    invalidate: (key: TKey) => void;
    invalidateMatching: (pattern: string) => void;
    revalidate: () => Promise<void>;
};
type TRevalidateOnFocusParams = {
    key: TKey;
    isRevalidateOnFocus: boolean;
    isEnabled: boolean;
    staleTime: number;
    focusThrottleInterval: number;
    revalidate: () => Promise<void>;
};
type TOnReconnectParams = {
    key: TKey;
    staleTime: number;
    isEnabled: boolean;
    isRevalidateOnReconnect: boolean;
    revalidate: () => Promise<void>;
};
type TUseRevalidateParams<Data> = {
    key: TKey;
    isEnabled: boolean;
    shouldRetryOnError: boolean;
    errorRetryInterval: number;
    errorRetryCount: number;
    dedupingInterval: number;
    fetcher: TCacheFetcher<Data>;
    setIsLoading: Dispatch<SetStateAction<boolean>>;
    setData: (newData: Data) => void;
    setError: Dispatch<SetStateAction<Error | null>>;
    onSuccess?: (data: Data, key: TKey) => void;
    onError?: (err: Error, key: TKey) => void;
    onErrorRetry?: TOnErrorRetry;
};
type TDefaultConfig = Required<Omit<TCacheConfig, 'onErrorRetry' | 'onSuccess' | 'onError'>>;
export type { TCacheConfig, TCacheEntry, TCacheFetcher, TCacheOptions, TDefaultConfig, TKey, TMutateFetcher, TMutateOptions, TOnReconnectParams, TOptimisticFunction, TRevalidateOnFocusParams, TUseQueryReturn, TUseRevalidateParams, };
