UNPKG

zent

Version:

一套前端设计语言和基于React的实现

262 lines (233 loc) 7.7 kB
import { FILE_UPLOAD_STATUS } from './constants'; import { II18nLocaleUpload } from '../i18n'; /** 文件对象 */ export interface IUploadFileItem { /** 判断上传文件的唯一id,内部初始化使用,在回调函数中值必存在,外部不需要传 */ // 内部需要对 id 属性赋值,因此不设为 readonly id?: string; /** 重试上传时的文件对象 */ readonly file?: File; // browser file object properties /** 文件名称 */ name: string; /** 文件类型 */ type: string; // upload file object properties /** 文件上传状态 */ status: FILE_UPLOAD_STATUS; /** 文件上传进度 */ percent?: number; } export interface IImageUploadFileItem extends IUploadFileItem { // image extra attrs src?: string; thumbSrc?: string; } /** * 文件项对象的内部属性扩展类型,内部不再使用,且将于 v10 删除 * 为了兼容外部已经使用的情况,保留该类型及相关使用了该类型的对外暴露的API */ export type IUploadFileItemInner<UPLOAD_ITEM extends IUploadFileItem> = UPLOAD_ITEM & { /** * @deprecated * @internal * 判断上传文件的唯一id,仅内部使用,已废弃,且将于 v10 删除 */ _id?: string; /** * @deprecated * @internal * 重试上传时的文件对象,仅内部使用,已废弃,且将于 v10 删除 */ readonly _file?: File; }; // onChange types export type IUploadOnChangeHandler< Value, UPLOAD_ITEM extends IUploadFileItem > = (value: Value, detail?: IUploadChangeDetail<UPLOAD_ITEM>) => void; export interface IUploadChangeDetail<UPLOAD_ITEM extends IUploadFileItem> { item: IUploadFileItemInner<UPLOAD_ITEM>; type: 'change' | 'add' | 'delete' | 'retry'; } // onUpload types export type IUploadOnUploadHandler<ON_UPLOAD_SUCCESS_RETURN = void> = ( file: File, report: (percent: number) => void ) => Promise<ON_UPLOAD_SUCCESS_RETURN>; // error types,错误类型映射表 export interface IUploadErrorMessageConfigMap { /** 文件大小超出限制 */ overMaxSize: { maxSize: number; formattedMaxSize: string }; /** 选择文件数量超出限制 */ overMaxAmount: { maxAmount: number }; } export type IUploadOnErrorHandler = < Type extends keyof IUploadErrorMessageConfigMap >( type: Type, data: IUploadErrorMessageConfigMap[Type] ) => void; // tips types export type IUploadTipConfig<P> = P & { formattedMaxSize: string | null; }; export type IUploadTipsFunc<PROPS> = ( config: IUploadTipConfig<PROPS> ) => React.ReactNode; // image upload types export type IImageOnUploadSuccessReturn = | undefined | null | string | { src: string; thumbSrc: string; }; export type IImageUploadPreviewHandler = ( file: IImageUploadFileItem, fileList: IImageUploadFileItem[] ) => void; /** 基础上传组件 props */ export interface IAbstractUploadProps< UPLOAD_ITEM extends IUploadFileItem, ON_UPLOAD_SUCCESS_RETURN, UPLOAD_ITEM_COMP_PROPS extends IUploadItemProps<UPLOAD_ITEM> > { /** 自定义 className */ className?: string; /** 文件上传前的处理函数,若返回 false 或 Promise.reject,则不上传该文件 */ beforeUpload?: (file: File) => boolean | Promise<void>; /** 文件上传回调 */ onUpload?: IUploadOnUploadHandler<ON_UPLOAD_SUCCESS_RETURN>; /** 发生内部错误时的统一回调函数,错误类型见 IUploadErrorMessageConfigMap */ onError?: IUploadOnErrorHandler; /** 文件大小限制,Infinity 为无限制 */ maxSize?: number; /** 可选文件类型 */ accept?: string; /** 是否禁用 */ disabled?: boolean; /** 是否手动触发文件上传流程 */ manualUpload?: boolean; /** 自定义的上传项展示组件 */ customUploadItem?: React.ComponentType<UPLOAD_ITEM_COMP_PROPS>; } /** 复数上传组件 props */ export interface IAbstractMultiUploadProps< UPLOAD_ITEM extends IUploadFileItem, ON_UPLOAD_SUCCESS_RETURN, UPLOAD_ITEM_COMP_PROPS extends IUploadItemProps<UPLOAD_ITEM> > extends IAbstractUploadProps< UPLOAD_ITEM, ON_UPLOAD_SUCCESS_RETURN, UPLOAD_ITEM_COMP_PROPS > { /** 上传组件文件列表 */ fileList?: UPLOAD_ITEM[]; /** 用于设置已上传的文件列表 */ defaultFileList?: UPLOAD_ITEM[]; /** 文件上传组件内容发生变化时的回调函数 */ onChange: IUploadOnChangeHandler< Array<IUploadFileItemInner<UPLOAD_ITEM>>, UPLOAD_ITEM >; /** 是否支持文件多选 */ multiple?: boolean; /** 文件数量限制,Infinity 为无限制 */ maxAmount?: number; /** 是否可排序 */ sortable?: boolean; } export interface IUploadProps extends IAbstractMultiUploadProps< IUploadFileItem, void, INormalUploadItemProps > { /** 提示文案 */ tips?: React.ReactNode | IUploadTipsFunc<IUploadProps>; /** 是否展示分页信息 */ pagination?: boolean; /** 分页大小 */ pageSize?: number; } export interface IImageUploadProps extends IAbstractMultiUploadProps< IImageUploadFileItem, IImageOnUploadSuccessReturn, IImageUploadItemProps > { /** 提示文案 */ tips?: React.ReactNode | IUploadTipsFunc<IImageUploadProps>; /** 点击图片展示时的回调 */ preview?: IImageUploadPreviewHandler; /** 将图片文件转化为展示用的缩略图 src */ getThumbSrcFromFile: (file: File) => string | Promise<string>; } export interface ISingleUploadProps extends IAbstractUploadProps<IUploadFileItem, void, ISingleUploadItemProps> { /** 提示文案 */ tips?: React.ReactNode | IUploadTipsFunc<ISingleUploadProps>; onChange: IUploadOnChangeHandler<IUploadFileItem | null, IUploadFileItem>; value?: IUploadFileItem | null; } export interface IAbstractUploadTriggerProps< UPLOAD_ITEM extends IUploadFileItem > { i18n: II18nLocaleUpload; fileList?: UPLOAD_ITEM[]; disabled?: boolean; accept?: string; remainAmount?: number; maxSize: number; maxAmount: number; multiple?: boolean; onAddFile: (file: File) => Promise<void>; onError: IUploadOnErrorHandler; } export interface IFileInputProps { accept?: string; disabled?: boolean; // 剩余可上传文件数量 remainAmount: number; multiple?: boolean; onChange: (files: File[]) => void; } export interface IAbstractUploadListProps< UPLOAD_ITEM extends IUploadFileItem, UPLOAD_ITEM_COMP_PROPS extends IUploadItemProps<UPLOAD_ITEM> > { i18n: II18nLocaleUpload; fileList: UPLOAD_ITEM[]; onRetry: (retryItem: IUploadFileItemInner<UPLOAD_ITEM>) => void; onDelete: (retryItem: IUploadFileItemInner<UPLOAD_ITEM>) => void; sortable?: boolean; onSortChange: (list: Array<IUploadFileItemInner<UPLOAD_ITEM>>) => void; customUploadItem?: React.ComponentType<UPLOAD_ITEM_COMP_PROPS>; } export interface IUploadListProps extends IAbstractUploadListProps<IUploadFileItem, INormalUploadItemProps> { pagination: boolean; pageSize: number; } export interface IImageUploadListProps extends IAbstractUploadListProps< IImageUploadFileItem, IImageUploadItemProps > { trigger: React.ReactNode; onPreview: IImageUploadPreviewHandler; } export interface IUploadItemProps<UPLOAD_ITEM extends IUploadFileItem> { item: IUploadFileItemInner<UPLOAD_ITEM>; i18n: II18nLocaleUpload; onRetry: IAbstractUploadListProps<UPLOAD_ITEM, any>['onRetry']; onDelete: IAbstractUploadListProps<UPLOAD_ITEM, any>['onDelete']; } export type INormalUploadItemProps = IUploadItemProps<IUploadFileItem>; export type ISingleUploadItemProps = IUploadItemProps<IUploadFileItem>; export type IImageUploadItemProps = IUploadItemProps<IImageUploadFileItem> & { onPreview: (file: IImageUploadFileItem) => void; };