import { IReachOptions, IReachQuery } from '@ewb/reach';
export interface IUseSearchProps<T, E, RES> {
    limit?: number;
    defaultSkip?: number;
    skip?: number;
    count?: number;
    skipPages?: boolean;
    paginationMode?: 'client' | 'server';
    query?: IReachOptions['query'];
    responseToData?: (body: RES, state: IUseSearchState<T, E, RES>, response: Response, paginate: boolean) => Partial<IUseSearchState<T, E, RES>> & Pick<IUseSearchState<T, E, RES>, 'items'>;
    reachOptions?: Omit<IReachOptions, 'query'>;
    disableInit?: boolean;
    defaultItems?: T[];
    skipKey?: string;
    limitKey?: string;
    countHeader?: string;
}
export interface IUseSearchState<T, E, RES> extends IUseSearchInfo<RES> {
    busy: boolean;
    items: T[];
    searchQuery: IReachQuery;
    error?: E | null;
}
export interface IUseSearchInfo<RES> {
    count: number;
    limit: number;
    skip: number;
    page: number;
    hasFetched: boolean;
    json?: RES;
    response?: Response;
}
export interface IUseSearchActions<T> {
    unshift: (...items: T[]) => void;
    splice: (start: number, deleteCount?: number, ...items: T[]) => void;
    push: (...items: T[]) => void;
    map: (fn: (item: T) => T) => void;
    filter: (fn: (item: T) => boolean) => void;
    search: (fetchQuery: IReachQuery) => Promise<T[]>;
}
export declare type IUseSearchNextFn<T> = (fetchQuery?: IReachQuery, page?: number) => Promise<T[] | null>;
export declare type IUseSearchRet<T, E, RES> = [
    busy: boolean,
    data: T[],
    error: E | undefined | null,
    next: IUseSearchNextFn<T>,
    info: IUseSearchInfo<RES>,
    actions: IUseSearchActions<T>
];
export declare function useSearch<T, E = any, RES = T[]>(path: string, props: IUseSearchProps<T, E, RES>): IUseSearchRet<T, E, RES>;
