import React, { ReactNode } from "react"; import { AxiosProgressEvent } from "axios"; export interface MtUploadResponse { success: boolean; message: string; data?: any; } export type MtUploadStatus = 'ready' | 'uploading' | 'success' | 'fail'; export type MtUploadUserFile = Omit & Partial>; export interface MtUploadRawFile extends File { uid?: number; } export interface MtUploadFile { name: string; percentage?: number; status?: MtUploadStatus; size?: number; response?: unknown; uid: number; url?: string; raw?: MtUploadRawFile; } export type MtUploadFiles = MtUploadFile[]; export interface MtUploadProgressEvent extends AxiosProgressEvent { percent?: number; } export interface MtUploadProps { children?: ReactNode; /** 自定义class */ customClass?: string | (() => string); /** 请求 URL */ action?: string; /** 设置上传的请求头部 */ headers?: Record; /** 设置上传请求方法 */ method?: string; /** 是否支持多选文件 */ multiple?: boolean; /** 上传时附带的额外参数 */ data?: Record; /** 上传的文件字段名 */ name?: string; /** 支持发送 cookie 凭证信息 */ withCredentials?: boolean; /** 接受上传的文件类型 image/png, image/jpeg image/gif image/* video/* */ accept?: string; /** 允许上传文件的最大数量 */ limit?: number; /** 是否启用拖拽上传 */ drag?: boolean; /** 是否显示已上传文件列表 */ showFileList?: boolean; /** 是否禁用上传 */ disabled?: boolean; /** 默认上传文件 */ fileList?: MtUploadUserFile[]; /** 向上传递 fileList ,监听动态修改*/ changeFileList?: (fileList: MtUploadUserFile[]) => void; /** 原生属性 crossOrigin '' | 'anonymous' | 'use-credentials' */ crossOrigin?: string; /** 文件预览 */ onPreview?: (uploadFile: MtUploadFile) => void; /** 文件移除钩子 */ onRemove?: (uploadFile: MtUploadFile, uploadFiles: MtUploadFiles) => void; /** 文件上传成功时的钩子 */ onSuccess?: (response: any, uploadFile: MtUploadFile, uploadFiles: MtUploadFiles) => void; /** 文件上传失败时的钩子 */ onError?: (error: Error, uploadFile: MtUploadFile, uploadFiles: MtUploadFiles) => void; /** 文件上传时的钩子 */ onProgress?: (evt: MtUploadProgressEvent, uploadFile: MtUploadFile, uploadFiles: MtUploadFiles) => void; /** 文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用 */ onChange?: (uploadFile: MtUploadFile, uploadFiles: MtUploadFiles) => void; /** 当超出限制时,执行的钩子函数 */ onExceed?: (files: File[], uploadFiles: MtUploadUserFile[]) => void; /** 上传文件之前的钩子,参数为上传的文件, 若返回false或者返回 Promise 且被 reject,则停止上传。 */ beforeUpload?: (rawFile: MtUploadRawFile) => boolean; /** 删除文件之前的钩子,参数为上传的文件和文件列表, 若返回 false 或者返回 Promise 且被 reject,则停止删除。 */ beforeRemove?: (uploadFile: MtUploadFile, uploadFiles: MtUploadFiles) => boolean; /** 文件列表的类型 'text' | 'picture' | 'picture-card' */ listType?: string; /** 是否自动上传文件 */ autoUpload?: boolean; /** 当文件被拖入上传区域时执行的回调功能 */ onDrop?: (event: React.DragEvent) => void; /** 支持上传文件夹 */ directory?: boolean; /** 通过覆盖默认的上传行为,可以自定义自己的上传实现 */ customRequest?: () => void; /** 文件上传按钮trigger自定义卡槽 */ triggerSlot?: ReactNode; /** 文件上传默认布局自定义卡槽 */ defaultSlot?: ReactNode; /** 文件上传提示语自定义卡槽 */ tipSlot?: ReactNode; /** 文件展示列表自定义卡槽 */ fileSlot?: ReactNode; }