import React, { ReactNode } from 'react'; import { TooltipProps } from '../Tooltip'; import { RcFile as OriRcFile, Action, UploadRequestMethod, UploadRequestHeader, BeforeUploadFileType, UploadRequestOption } from 'rc-upload/lib/interface'; import { OperateBtnListProps } from 'src/OperateBtn'; type UploadType = 'drag' | 'select'; export type { BeforeUploadFileType }; export interface RcFile extends OriRcFile { readonly lastModifiedDate: Date; } export interface UploadFile { /** 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; /** 缩略图 */ thumbUrl?: string; /** 原始文件 */ originFileObj?: RcFile; /** 上传状态,不同状态展示颜色也会有所不同,默认为 done */ status?: 'error' | 'done' | 'removed'; /** 响应 */ response?: string; /** 默认文件 */ isDefault?: boolean; } export interface IShowUploadList { /** 是否显示删除图标 */ showRemoveIcon?: boolean; /** 删除图标 */ removeIcon?: React.ReactNode; /** 是否显示预览图标 */ showPreviewIcon?: boolean; /** 预览图标 */ previewIcon?: React.ReactNode; } type ItemRender = (file: UploadFile, fileList?: Array>) => React.ReactNode; export interface DefaultImage { /** 图片地址 */ imageUrl: string; /** 图片名称 */ imageName?: string; } export interface AvatarProps { /** 圆角 */ borderRadius?: string | number; /** 是否展示重置按钮 */ showReset?: boolean; /** 图片地址 */ defaultImage?: DefaultImage; /** 是否展示图片名称 */ showName?: boolean; } export interface UploadProps { /**上传类型*/ type?: UploadType; /**发到后台的文件参数名*/ name?: string; /**样式*/ style?: React.CSSProperties; /**cls*/ className?: string; /**禁用*/ disabled?: boolean; /** 禁用提示 */ disabledTooltip?: TooltipProps; /**控件默认span*/ component?: React.JSXElementConstructor; /**上传地址*/ 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; /**通过覆盖默认的上传行为,可以自定义自己的上传实现*/ customRequest?: (option: UploadRequestOption) => void; /**上传请求时是否携带 cookie*/ withCredentials?: boolean; /**点击打开弹框*/ openFileDialogOnClick?: boolean; /**点击移除文件时的回调*/ onRemove?: (file: UploadFile) => void | boolean | Promise; /**默认已上传的文件列表*/ defaultFileList?: Array>; /**已经上传的文件列表(受控)*/ fileList?: Array>; /**限制上传数量*/ maxCount?: number; /**是否展示文件列表*/ showUploadList?: boolean | IShowUploadList; /**子节点*/ children?: React.ReactNode; /**自定义上传列表项*/ itemRender?: ItemRender; /**是否显示错误提示 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; }; /** * 上传列表操作按钮组 * @param actions 上传列表方法 */ actionRender?: (file: UploadFile, actions: IActions) => React.ReactNode; operateBtnProps?: (file: UploadFile, actions: IActions) => OperateBtnListProps; /**点击文件链接或预览图标时的回调, 返回值为false时,阻止组件默认的预览*/ onPreview?: (file: UploadFile, event?: React.MouseEvent) => Promise; /** * 是否移除错误提示弹窗,默认不移除 */ removeErrorTip?: boolean; /** 默认文件 */ defaultFile?: UploadFile; /** 上传高度 */ height?: number | string; } interface IActions { onRemove: () => void; onPreview: () => void; } export interface UploadListProps { /**文件列表类型*/ listType?: 'text' | 'picture-card'; /**文件列表数据*/ items?: Array>; /**文件删除*/ onRemove?: (file: UploadFile) => void | boolean; /**是否显示删除图标*/ showRemoveIcon?: boolean; /**预览图标*/ showPreviewIcon?: boolean; /**删除图标节点*/ removeIcon?: React.ReactNode | ((file: UploadFile) => React.ReactNode); /**预览图标节点*/ previewIcon?: React.ReactNode | ((file: UploadFile) => React.ReactNode); /**自定义上传列表项*/ itemRender?: ItemRender; /**用于控制这个组件只回显图片 不能上传和删除*/ readonly?: boolean; /** * 自定义渲染上传列表操作按钮组 * @param actions 上传列表方法 */ actionRender?: (file: UploadFile, actions: IActions) => React.ReactNode; /** * 渲染上传列表操作按钮组 * @param actions 上传列表方法 */ operateBtnProps?: (file: UploadFile, actions: IActions) => OperateBtnListProps; /**点击文件链接或预览图标时的回调, 返回值为false时,阻止组件默认的预览*/ onPreview?: (file: UploadFile, event?: React.MouseEvent) => Promise; /**是否禁用*/ disabled?: boolean; }