@thy-rathana/nuxt-infinite-scroll
Version:
Look at the [Nuxt documentation](https://nuxt.com/docs/getting-started/introduction) to learn more.
41 lines (38 loc) • 1.6 kB
TypeScript
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 };