import { ChangeEvent, Dispatch, SetStateAction } from 'react';
import { IReachOptions } from '@ewb/reach';
export interface IUseCrudProps<T extends object, RET = T> {
    idKey: keyof T;
    subPath?: string;
    disableAutoSave?: boolean;
    initWithGet?: boolean;
    reachOptions?: Omit<IReachOptions, 'method' | 'data'>;
    dontSetStateOnPost?: boolean;
    alwaysPatch?: boolean;
    alwaysPost?: boolean;
    forcePatch?: (keyof T)[];
}
declare type IUseCrudMeta<T extends object> = {
    [key in keyof T]?: any;
};
export interface IUseCrudState<T extends object, E> {
    path: string;
    busy: boolean;
    data: Partial<T>;
    initialData: Partial<T>;
    edited: Edited<T>;
    meta: IUseCrudMeta<T>;
    dirty: boolean;
    error?: E;
}
declare type Edited<T> = {
    [key in keyof T]?: boolean;
};
export interface IUseCrudActions {
    read: () => Promise<void>;
    delete: () => Promise<void>;
}
declare type ValidEvents = HTMLInputElement | HTMLTextAreaElement;
export declare type IUseCrudSetFn<T extends object> = <K extends keyof T>(key: K, disableAutosave?: boolean) => (event: ChangeEvent<ValidEvents> | T[K], meta?: any) => void;
export declare type IUseCrudSaveFn<T> = () => Promise<T | null>;
export declare type IUseCrudSetDataFn<T extends object> = (data: Partial<T>, meta?: IUseCrudMeta<T>, isEdited?: boolean) => void;
export declare type IUseCrudRet<T extends object, E, RET = T> = [
    IUseCrudState<T, E>,
    IUseCrudSetFn<T>,
    IUseCrudSaveFn<RET>,
    IUseCrudSetDataFn<T>,
    IUseCrudActions,
    Dispatch<SetStateAction<IUseCrudState<T, E>>>
] & {
    state: IUseCrudState<T, E>;
    set: IUseCrudSetFn<T>;
    save: IUseCrudSaveFn<RET>;
    setData: IUseCrudSetDataFn<T>;
    actions: IUseCrudActions;
    setState: Dispatch<SetStateAction<IUseCrudState<T, E>>>;
};
export declare function useCrud<T extends object, E = any, RET = T>(path: string, data: Partial<T>, props: IUseCrudProps<T>): IUseCrudRet<T, E, RET>;
export {};
