import { ImageProps } from '../image'; import { PlainObject, TNode, UploadDisplayDragEvents } from '../common'; export interface TdUploadProps { accept?: string; action?: string; addBtn?: boolean; addContent?: string | TNode; allowUploadDuplicateFile?: boolean; autoUpload?: boolean; beforeAllFilesUpload?: (file: UploadFile[]) => boolean | Promise; beforeUpload?: (file: UploadFile) => boolean | Promise; capture?: string | boolean; data?: Record | ((files: UploadFile[]) => Record); disabled?: boolean; draggable?: boolean; fileListDisplay?: TNode<{ files: UploadFile[]; dragEvents?: UploadDisplayDragEvents; }>; files?: Array; defaultFiles?: Array; format?: (file: File) => UploadFile; formatRequest?: (requestData: { [key: string]: any; }) => { [key: string]: any; }; formatResponse?: (response: any, context: FormatResponseContext) => ResponseType; headers?: { [key: string]: string; }; imageProps?: ImageProps; isBatchUpload?: boolean; max?: number; method?: 'POST' | 'GET' | 'PUT' | 'OPTIONS' | 'PATCH' | 'post' | 'get' | 'put' | 'options' | 'patch'; mockProgressDuration?: number; multiple?: boolean; name?: string; preview?: boolean; removeBtn?: boolean; requestMethod?: (files: UploadFile | UploadFile[]) => Promise; sizeLimit?: number | SizeLimitObj; uploadAllFilesInOneRequest?: boolean; useMockProgress?: boolean; theme?: 'grid' | 'list'; value?: Array; defaultValue?: Array; modelValue?: Array; withCredentials?: boolean; onCancelUpload?: () => void; onChange?: (value: Array, context: UploadChangeContext) => void; onClickUpload?: (context: { e: MouseEvent; }) => void; onDrag?: (context: { file: UploadFile; index: number; }) => void; onDrop?: (value: Array) => void; onFail?: (options: UploadFailContext) => void; onOneFileFail?: (options: UploadFailContext) => void; onOneFileSuccess?: (context: Pick) => void; onPreview?: (options: { file: UploadFile; index: number; e: MouseEvent; }) => void; onProgress?: (options: ProgressContext) => void; onRemove?: (context: UploadRemoveContext) => void; onSelectChange?: (files: File[], context: UploadSelectChangeContext) => void; onSuccess?: (context: SuccessContext) => void; onValidate?: (context: { type: UploadValidateType; files: UploadFile[]; }) => void; onWaitingUploadFilesChange?: (context: { files: Array; trigger: 'validate' | 'remove' | 'uploaded'; }) => void; } export interface UploadFile extends PlainObject { lastModified?: number; name?: string; percent?: number; raw?: File; response?: { [key: string]: any; }; size?: number; status?: 'success' | 'fail' | 'progress' | 'waiting'; type?: string; uploadTime?: string; url?: string; } export type ResponseType = { error?: string; url?: string; } & Record; export interface FormatResponseContext { file: UploadFile; currentFiles?: UploadFile[]; } export interface RequestMethodResponse { status: 'success' | 'fail'; error?: string; response: { url?: string; files?: UploadFile[]; [key: string]: any; }; } export interface SizeLimitObj { size: number; unit: SizeUnit; message?: string; } export type SizeUnitArray = ['B', 'KB', 'MB', 'GB']; export type SizeUnit = SizeUnitArray[number]; export interface UploadChangeContext { e?: MouseEvent | ProgressEvent; response?: any; trigger: UploadChangeTrigger; index?: number; file?: UploadFile; files?: UploadFile[]; } export type UploadChangeTrigger = 'add' | 'remove' | 'abort' | 'progress-success' | 'progress' | 'progress-fail' | 'sort'; export interface UploadFailContext { e?: ProgressEvent; failedFiles: UploadFile[]; currentFiles: UploadFile[]; response?: any; file: UploadFile; XMLHttpRequest?: XMLHttpRequest; } export interface ProgressContext { e?: ProgressEvent; file?: UploadFile; currentFiles: UploadFile[]; percent: number; type: UploadProgressType; XMLHttpRequest?: XMLHttpRequest; } export type UploadProgressType = 'real' | 'mock'; export interface UploadRemoveContext { index?: number; file?: UploadFile; e: MouseEvent; } export interface UploadSelectChangeContext { currentSelectedFiles: UploadFile[]; } export interface SuccessContext { e?: ProgressEvent; file?: UploadFile; fileList?: UploadFile[]; currentFiles?: UploadFile[]; response?: any; results?: SuccessContext[]; XMLHttpRequest?: XMLHttpRequest; } export type UploadValidateType = 'FILE_OVER_SIZE_LIMIT' | 'FILES_OVER_LENGTH_LIMIT' | 'FILTER_FILE_SAME_NAME' | 'BEFORE_ALL_FILES_UPLOAD' | 'CUSTOM_BEFORE_UPLOAD';