import React, { ReactNode } from "react";
import { RcFile as OriRcFile, Action, UploadRequestMethod, UploadRequestHeader, BeforeUploadFileType, UploadRequestOption } from 'rc-upload/lib/interface';
import { TooltipProps } from "../Tooltip";
type UploadType = 'drag' | 'select';
export type { BeforeUploadFileType };
export interface RcFile extends OriRcFile {
    readonly lastModifiedDate: Date;
}
export interface UploadFile<T = any> {
    /** uid */
    uid: string;
    /** file name */
    name: string;
    /** file mime type */
    type?: string;
    /** file size */
    size?: number;
    /** file 时间戳 */
    lastModified?: number;
    /** file 日期 */
    lastModifiedDate?: Date;
    /** file 默认显示url */
    url?: string;
    /** file 上传时 dataUrl */
    dataUrl?: string;
    /** 原始文件 */
    originFileObj?: RcFile;
}
export interface IShowUploadList {
    /** 是否显示删除图标 */
    showRemoveIcon?: boolean;
    /** 删除图标 */
    removeIcon?: React.ReactNode;
}
type ItemRender<T = any> = (file: UploadFile, fileList?: Array<UploadFile<T>>) => React.ReactNode;
export interface DefaultImage {
    /** 图片地址 */
    imageUrl: string;
    /** 图片名称 */
    imageName?: string;
}
export interface AvatarProps {
    /** 圆角 */
    borderRadius?: string | number;
    /** 是否展示重置按钮 */
    showReset?: boolean;
    /** 图片地址 */
    defaultImage?: DefaultImage;
    /** 是否展示图片名称 */
    showName?: boolean;
}
export interface UploadProps<T = any> {
    /**上传类型*/
    type?: UploadType;
    /**发到后台的文件参数名*/
    name?: string;
    /**样式*/
    style?: React.CSSProperties;
    /**cls*/
    className?: string;
    /**禁用*/
    disabled?: boolean;
    /** 禁用提示 */
    disabledTooltip?: TooltipProps;
    /**控件默认span*/
    component?: React.JSXElementConstructor<any>;
    /**上传地址*/
    action?: Action;
    /**http method*/
    method?: UploadRequestMethod;
    /**文件夹上传*/
    directory?: boolean;
    /**上传所需额外参数或返回上传额外参数的方法*/
    data?: object | ((file: RcFile | string | Blob) => object);
    /**设置上传的请求头部，IE10 以上有效*/
    headers?: UploadRequestHeader;
    /**接受上传的文件类型*/
    accept?: string;
    /**是否支持多选文件,开启后按住 ctrl 可选择多个文件*/
    multiple?: boolean;
    /** 头像 */
    avatarProps?: boolean | AvatarProps;
    /**上传文件改变时的状态*/
    onChange?: (info: UploadFile[]) => void;
    /**上传开始*/
    onStart?: (file: RcFile) => void;
    /**上传错误*/
    onError?: (error: Error, ret?: object, file?: RcFile) => void;
    /**上传成功*/
    onSuccess?: (response: object, file: RcFile, xhr?: object) => void;
    /**上传进度*/
    onProgress?: (event: {
        percent: number;
    }, file?: RcFile) => void;
    /**上传之前*/
    beforeUpload?: (file: RcFile, FileList?: RcFile[]) => BeforeUploadFileType | Promise<void | BeforeUploadFileType>;
    /**通过覆盖默认的上传行为，可以自定义自己的上传实现*/
    customRequest?: (option: UploadRequestOption) => void;
    /**上传请求时是否携带 cookie*/
    withCredentials?: boolean;
    /**点击打开弹框*/
    openFileDialogOnClick?: boolean;
    /**点击移除文件时的回调*/
    onRemove?: (file: UploadFile<T>) => void | boolean | Promise<void | boolean>;
    /**默认已上传的文件列表*/
    defaultFileList?: Array<UploadFile<T>>;
    /**已经上传的文件列表（受控）*/
    fileList?: Array<UploadFile<T>>;
    /**限制上传数量*/
    maxCount?: number;
    /**是否展示文件列表*/
    showUploadList?: boolean | IShowUploadList;
    /**子节点*/
    children?: React.ReactNode;
    /**自定义上传列表项*/
    itemRender?: ItemRender<T>;
    /**是否显示错误提示 leaveDelay 负数为不自动关闭*/
    showUploadError?: boolean | {
        uploadErrorMsg?: string;
        leaveDelay?: number;
    };
    /**大小*/
    size?: 'small' | 'medium' | 'large';
    /** 开启暂存文件，beforeUpload 需返回 false 停止上传 */
    stash?: boolean;
    /** 是否显示上传loading*/
    showLoading?: boolean;
    /** 是否显示上传loading，后期删除*/
    uploading?: boolean;
    /** 是否展示loading */
    loading?: boolean;
    /** 当文件被拖入上传区域时执行的回调功能 */
    onDrop?: (event: React.DragEvent) => void;
    /** 拖拽上传时 拖拽区域元素 */
    dragArea?: {
        /** 图标 */
        areaIcon?: ReactNode;
        /** 文本 */
        areaText?: ReactNode;
        /** 描述 */
        areaDesc?: ReactNode;
    };
}
export interface UploadListProps<T = any> {
    /**文件列表类型*/
    listType?: 'text' | 'picture-card';
    /**文件列表数据*/
    items?: Array<UploadFile<T>>;
    /**文件删除*/
    onRemove?: (file: UploadFile<T>) => void | boolean;
    /**是否显示删除图标*/
    showRemoveIcon?: boolean;
    /**删除图标节点*/
    removeIcon?: React.ReactNode | ((file: UploadFile) => React.ReactNode);
    /**自定义上传列表项*/
    itemRender?: ItemRender<T>;
    /**用于控制这个组件只回显图片 不能上传和删除*/
    readonly?: boolean;
}
