import * as vue from 'vue';
import { MaybeRef, Ref } from 'vue';
import * as _vue_shared from '@vue/shared';

type DefaultResponse<TItem> = {
    list?: TItem[];
    total?: number;
};
type InitialData<TResponse extends DefaultResponse<TItem>, TItem> = TResponse & DefaultResponse<TItem>;
interface InfiniteScrollOptions<TQuery, TItem, TResponse extends DefaultResponse<TItem>> {
    fetchFn: (query: TQuery & {
        page: number;
        page_size: number;
    }) => Promise<InitialData<TResponse, TItem> | undefined>;
    filters: MaybeRef<TQuery>;
    pageSize?: number;
    distance?: number;
}
declare function useNuxtInfiniteScroll<TQuery, TItem, TResponse extends DefaultResponse<TItem>>({ fetchFn, filters, pageSize, distance, }: InfiniteScrollOptions<TQuery, TItem, TResponse>): Promise<{
    data: [TResponse] extends [Ref<any, any>] ? _vue_shared.IfAny<TResponse, Ref<TResponse, TResponse>, TResponse> : Ref<vue.UnwrapRef<TResponse>, TResponse | vue.UnwrapRef<TResponse>>;
    items: Ref<TItem[], TItem[]>;
    isLoading: Ref<boolean, boolean>;
    isEnd: Ref<boolean, boolean>;
    isNoData: Ref<boolean, boolean>;
    reset: () => void;
    fetchMore: (callbackFc?: () => void) => Promise<void>;
    setTarget: (el: HTMLElement | null) => void;
}>;
type UseInfiniteScrollFetch = {
    data: Ref<any>;
    items: Ref<any[]>;
    isLoading: Ref<boolean>;
    isEnd: Ref<boolean>;
    isNoData: Ref<boolean>;
    reset: () => void;
    fetchMore: () => Promise<void>;
    setTarget: (el: HTMLElement | null) => void;
};

export { type UseInfiniteScrollFetch, useNuxtInfiniteScroll };
