shineout
Version:
Shein 前端组件库
537 lines (536 loc) • 17 kB
TypeScript
import * as React from 'react';
import { ReactNode } from 'react';
import { ObjectType, StandardProps } from '../@types/common';
import { PopoverConfirmProps } from '../Popover/Props';
import { GapProps } from '../Gap/Props';
import { ButtonProps } from '../Button/Props';
import { GetInputableProps } from '../Form/Props';
export interface FileRecord {
name: string;
process: number;
status: number;
blob: File;
xhr?: Xhr | void;
message?: string;
}
export declare type XhrType = Xhr;
interface Xhr {
status: number;
statusText?: string;
responseType?: XMLHttpRequestResponseType;
responseText?: string;
response?: any;
abort?: () => void;
[key: string]: any;
}
export interface SimpleUploadProps<ValueItem> extends StandardProps {
/**
* @en The type of the upload file, same as the standard,See details [accept](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#accept)
* @cn 上传文件类型, 和标准一致, 详见[accept](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#accept)
*/
accept?: string;
/**
* @en The address for uploading
* @cn 上传地址
*/
action?: string | ((file: File) => string);
/**
* @en The callback of before upload
* @cn 上传前的回调
*/
beforeUpload?: (file: File, validatorHandle: (error: Error, _file: File) => boolean) => Promise<any>;
/**
* @en Upload placeholder
* @cn 上传占位内容
*/
children?: React.ReactNode;
/**
* @inner 废弃属性
*/
cors?: boolean;
/**
* @inner 内部属性
*/
imageStyle?: React.CSSProperties;
/**
* @en Request headers
* @cn 请求头部信息
* @override object
*/
headers?: ObjectType;
/**
* @en The filename received by the server. If it is not filled in, use the name.
* @cn 服务端接收的 filename,不填使用 name
*/
htmlName?: string;
/**
* @en Maximum number of uploaded files
* @cn 最大上传文件数
* @default 100
*/
limit?: number;
/**
* @en Whether multi-select files are supported
* @cn 是否支持多选文件
* @default false
*/
multiple?: boolean;
/**
* @en The key access data in the Form
* @cn Form 内存取数据的 key
*/
name?: string;
/**
* @en The callback function when the value is changing(Upload successfully, delete). values: Array, the value is the onSuccess returns
* @cn 值改变回调(上传成功,删除)。values: 数组, 其每个值是 onSuccess 的返回值
*/
onChange: (values: ValueItem[]) => void;
/**
* @en onProgress
* @cn 上传中进度
*/
onProgress?: ((fileInfo: FileRecord) => any) | false;
/**
* @en onSuccess
* @cn 上传成功事件
* res: 上传接口返回结果
* file: 选择的文件
* data: 请求的数据
* xhr: 返回的 response
*/
onSuccess?: (res: any, file: File, data?: any, xhr?: Xhr) => ValueItem | Error;
/**
* @en onError callback
* @cn 上传出错事件(props 中为 onHttpError)
*/
onError?: (xhr: Xhr, file: File) => string | undefined;
/**
* @en The callback function when to upload unsuccessfully. The returned result is as the error message.
* @cn 上传失败时回调,返回结果作为错误内容提示
*/
onHttpError?: (xhr: Xhr, file: File) => string | undefined;
/**
* @en The callback function before cancel upload file.
* @cn 取消文件上传前的回调
*/
beforeCancel?: (xhr: Xhr) => void;
/**
* @en Additional parameters submitted to the server
* @cn 提交到服务端的额外参数
* @override object
*/
params?: ObjectType;
/**
* @en Whether to recover deleted values.
* @cn 是否可以恢复已删除的value
* @default true
*/
recoverAble?: boolean;
/**
* @en Display results
* @cn 结果展示
* @default a => a
*/
renderResult?: (data: any) => React.ReactNode;
/**
* @en Custom upload method. options: the options of upload
* @cn 自定义上传方法。 options: 上传的配置
* @override (options: UploadOptions) => Xhr | void
*/
request?: (options: UploadOptions<ValueItem>) => Xhr | void;
/**
* @inner 内部属性
*/
validateHook: (func: () => Promise<any>) => void;
/**
* @en Check file before uploading
* @cn 上传前文件校验,详见下方 Validator
* @override Validator
*/
validator?: Validator;
/**
* @en value
* @cn defaultValue 和 value 可以同时设置,defaultValue 会被value覆盖 在 Form 中,value会被表单接管,value 无效
* @override any[]
*/
value: ValueItem[];
/**
* @en custom Result component
* @cn 自定义Result 组件
*/
customResult?: React.ComponentType<{
value: any;
files: any;
onValueRemove: (index: number) => void;
onFileRemove: (id: string) => void;
}>;
/**
* @en Whether to take the cookie
* @cn 是否携带 cookie
* @default false
*/
withCredentials?: boolean;
/**
* @en callback when start
* @cn 开始上传的回调函数
*/
onStart?: (file: File) => void;
/**
* @en show upload list
* @cn 是否展示上传列表
* @default true
*/
showUploadList?: boolean;
/**
* @en Whether to handle the case of validation failure, if a function is provided, it is judged by the return value of the function.
* @cn 是否处理校验失败的情况, 如果提供一个函数, 则以函数的返回值判断是否处理此 error
* @default true
*/
validatorHandle?: ((error: any, file: File) => boolean) | boolean;
/**
* @en is disabled
* @cn 是否禁用
* @default false
*/
disabled?: boolean;
/**
* @en The same as the native webkitdirectory tag
* @cn 同原生 input 标签的 webkitdirectory 属性
*/
webkitdirectory?: boolean | string;
/**
* @en Custom content of result
* @cn 自定义结果的内容
*/
renderContent?: (res: any, value: ValueItem, index: number, values: ValueItem[]) => React.ReactNode;
/**
* @en drop to update
* @cn 是否开启拖拽上传文件
* @default false
*/
drop?: boolean;
/**
* @en Filter after file selection, users can customize the list of files that need to be uploaded eventually. Need to return a new file list
* @cn 文件选中后的筛选,用户可自定义最终需要上传的文件列表。需返回一个新的文件列表
*/
filesFilter?: (fileList: File[]) => File[];
/**
* @en remove update failed callback
* @cn 上传失败图片删除之后的回调
*/
onErrorRemove?: (xhr: Xhr, file: File, fileInfo?: any) => void;
forceAccept?: boolean;
/**
* @inner 内部属性
*/
leftHandler?: boolean;
/**
* @en how to preview the image
* @cn 自定义预览图片操作,默认为画廊展示
*/
onPreview?: (url: string, value: ValueItem, index: number, values: ValueItem[], fun: {
preview: () => void;
}) => void;
/**
* @en Confirmation before deletion
* @cn 是否在删除文件和图片前弹出确认
*/
removeConfirm?: string | PopoverConfirmProps;
/**
* @en callback before remove
* @cn 删除前的确认,返回一个Promise用于最终确定是否删除
*/
beforeRemove?: (value: ValueItem) => Promise<any>;
/**
* @en Custom error prompt after forceAccept type verification fails
* @cn forceAccept 类型校验失败后自定义错误提示
*/
forceAcceptErrorMsg?: string;
/**
* @en Can the file be deleted
* @cn 文件是否可以删除
* @default true
*/
canDelete?: ((value: ValueItem, index: number) => boolean) | boolean;
/**
* @en Adjust the spacing to be consistent with the [Gap](/components/Gap) props
* @cn 调整间距 同 [Gap](/components/Gap) 属性
* @default {column: 12, row: 12}
*/
gapProps?: GapProps;
/**
* @en set xhr.responseType
* @cn 设置 xhr.responseType
*/
responseType?: XMLHttpRequestResponseType;
}
/**
* @title Upload
*/
export declare type UploadProps<ValueItem> = Omit<GetInputableProps<AcceptUpload<ValueItem>, ValueItem[]>, 'filterSameChange'>;
export interface FileInputProps extends Pick<SimpleUploadProps<any>, 'webkitdirectory' | 'accept' | 'multiple'> {
onChange: (e: any) => void;
}
export interface AcceptUpload<ValueItem> extends Omit<SimpleUploadProps<ValueItem>, 'forceAccept'> {
/**
* @en After disabled the file type filtering provided by accept, it is mandatory to check the file type, value same as accept
* @cn 在使用时关闭了 accept 提供的文件类型过滤后,强制对文件类型进行校验(值同accept)
*/
forceAccept?: string;
}
export interface DraggerProps {
children: React.ReactNode;
multiple: boolean;
addFile: (...args: any) => void;
accept: string;
disabled?: boolean;
limit: number;
}
export interface DropProps<ValueItem> extends Pick<AcceptUpload<ValueItem>, 'drop' | 'accept' | 'disabled'> {
multiple?: boolean;
dropData?: any;
onDrop?: (files: File[], index: number) => void;
className?: string;
children?: ReactNode;
}
export interface FileProps {
id: string;
message?: string;
name: string;
onRemove: (id: string) => void;
process: number;
status: number;
}
export interface ImageFileProps {
id: string;
message?: string;
onRemove: (id: string) => void;
process: number;
status: number;
style?: React.CSSProperties;
data?: string;
}
/**
* @title Upload.Image
* @en The basic API is the same as Upload, and the specific API is as follows:
* @cn 基本 API 和 Upload 相同,特定的 API 如下:
*/
export interface SimpleUploadImagePropsSpec<ValueItem> {
/**
* @en Add image view is displayed on the left
* @cn 添加图片视图是否在左侧展示
* @default false
*/
leftHandler?: AcceptUpload<ValueItem>['leftHandler'];
/**
* @en same as style.height
* @cn 同 style.height
*/
height?: number;
/**
* @en same as style.width
* @cn 同 style.width
*/
width?: number;
/**
* @en ignore image preview
* @cn 是否忽略上传图片预览
* @default false
*/
ignorePreview?: boolean;
}
export interface SimpleUploadImageProps<ValueItem> extends AcceptUpload<ValueItem>, SimpleUploadImagePropsSpec<ValueItem> {
}
export interface UploadImageHandlerProps {
className?: string;
disabled?: boolean;
urlInvalid?: boolean;
children?: React.ReactNode;
style?: React.CSSProperties;
width?: number;
height?: number;
onKeyDown?: React.KeyboardEventHandler;
onMouseDown?: React.MouseEventHandler;
[key: string]: any;
}
export interface UploadImageResultProps {
index: number;
value: any;
values: any[];
onRecover?: (index: number, value: any) => void;
recoverAble?: boolean;
showRecover?: boolean;
style?: React.CSSProperties;
onRemove?: (index: number) => void;
renderResult?: AcceptUpload<any>['renderResult'];
renderContent?: AcceptUpload<any>['renderContent'];
onPreview?: AcceptUpload<any>['onPreview'];
removeConfirm?: AcceptUpload<any>['removeConfirm'];
}
/**
* @title Upload.Button
* @en The basic API is the same as Upload, and the specific API is as follows:
* @cn 基本 API 和 Upload 相同,特定的 API 如下:
*/
export interface UploadProgressPropsSpec extends Pick<ButtonProps, 'type' | 'size' | 'outline'> {
/**
* @en button default content
* @cn 按钮默认内容
*/
placeholder?: React.ReactNode;
/**
* @en content of uploading, will have spin if a string
* @cn 上传中按钮的内容,如果是字符串默认会有spin loading
*/
loading?: React.ReactNode;
/**
* @en same as [Button](/components.Button) type
* @cn 同 [Button](/components.Button) type
* @default 'primary'
*/
type?: ButtonProps['type'];
}
export interface UploadProgressProps<ValueItem> extends AcceptUpload<ValueItem>, UploadProgressPropsSpec {
}
export interface UploadRemoveConfirmProps {
confirm?: AcceptUpload<any>['removeConfirm'];
onRemove?: () => void;
onVisibleChange?: (v: boolean) => void;
}
export interface UploadResultProps {
index: number;
value: any;
onRecover?: (index: number, value: any) => void;
recoverAble?: boolean;
showRecover?: boolean;
style?: React.CSSProperties;
onRemove?: (index: number) => void;
renderResult?: AcceptUpload<any>['renderResult'];
renderContent?: AcceptUpload<any>['renderContent'];
onPreview?: AcceptUpload<any>['onPreview'];
removeConfirm?: AcceptUpload<any>['removeConfirm'];
}
export declare type UploadImageProps<ValueItem> = Omit<GetInputableProps<SimpleUploadImageProps<ValueItem>, ValueItem[]>, 'filterSameChange'>;
export declare class Image<ValueItem> extends React.Component<UploadImageProps<ValueItem>, any> {
render: () => JSX.Element;
}
export declare class ImageHandler extends React.Component<UploadImageHandlerProps, any> {
render: () => JSX.Element;
}
export declare type UploadButtonProps<ValueItem> = Omit<GetInputableProps<UploadProgressProps<ValueItem>, ValueItem[]>, 'filterSameChange'>;
/**
* @title UploadOptions
* @isDetail true
*/
export interface UploadOptions<T> {
/**
* @en The upload address can be obtained from action
* @cn 上传地址从 action 中获取
*/
url: string;
/**
* @en key of formData
* @cn formData 中存的字段名
*/
name: string;
/**
* @inner 内部属性
*/
cors?: SimpleUploadProps<T>['cors'];
/**
* @en same as withCredentials in props
* @cn 同 props 中的 withCredentials
*/
withCredentials: SimpleUploadProps<T>['withCredentials'];
/**
* @en same as responseType in props
* @cn 同 props 中的 responseType
*/
responseType: SimpleUploadProps<T>['responseType'];
/**
* @en incoming file
* @cn 传入文件
*/
file: File;
/**
* @en request header information
* @cn 请求头部信息
* @override object
*/
headers?: ObjectType;
/**
* @en onError callback
* @cn 上传出错事件(props 中为 onHttpError)
*/
onError: (xhr: Partial<Xhr>) => void;
/**
* @en onLoad
* @cn 上传事件
*/
onLoad: (xhr?: Xhr) => void;
/**
* @en onProgress
* @cn 上传中进度
*/
onProgress: (event?: ProgressEvent, msg?: string) => any;
/**
* @en onStart
* @cn 开始上传事件
*/
onStart?: (file: File) => void;
/**
* @en onSuccess
* @cn 上传成功事件
*/
onSuccess?: (res?: string, file?: File, data?: any, xhr?: Xhr) => T | Error;
/**
* @en params
* @cn 上传参数
* @override object
*/
params?: ObjectType;
}
/**
* @title Validator
*/
export interface Validator {
/**
* @en custom validator
* @cn 自定义校验
*/
customValidator?: (file: File) => void | Error | Promise<any>;
/**
* @en Judge the file extension, return the Error when the verification fails.
* @cn 判断后缀名,传入参数为文件后缀,校验失败返回 Error
*/
ext?: (ext: string) => void | Error | Promise<any>;
/**
* @en It is only valid for Image to determine the size of images and return the Error when the verification fails.
* @cn 只对 Image 有效,判断图片尺寸,校验失败返回 Error
* @override union
*/
imageSize?: (image: {
width: number;
height: number;
}) => void | Error;
/**
* @en Judge the size of the file and return the Error when the verification fails.
* @cn 判断文件大小,校验失败返回 Error
*/
size?: (size: number) => void | Error | Promise<any>;
}
export declare class UploadButton<ValueItem> extends React.Component<UploadButtonProps<ValueItem>, any> {
render: () => JSX.Element;
}
export declare class UploadDragger extends React.Component<any, any> {
render: () => JSX.Element;
}
export declare class Upload<ValueItem> extends React.Component<UploadProps<ValueItem>, any> {
static Image: typeof Image;
static ImageHandler: typeof ImageHandler;
static Button: typeof UploadButton;
static Dragger: typeof UploadDragger;
render: () => JSX.Element;
}
export declare type UploadType = typeof Upload;
export {};