mirror of
https://gitee.com/vant-contrib/vant.git
synced 2025-09-20 02:29:59 +08:00
* feat(Uploader): max-size prop can be a function * chore: revert demo * test: fix snapshot * docs: upd
115 lines
2.5 KiB
TypeScript
115 lines
2.5 KiB
TypeScript
import { createNamespace, isFunction } from '../utils';
|
|
import type { ImageFit } from '../image';
|
|
import type { Interceptor } from '../utils/interceptor';
|
|
|
|
const [name, bem] = createNamespace('uploader');
|
|
|
|
export { name, bem };
|
|
|
|
export type UploaderResultType = 'dataUrl' | 'text' | 'file';
|
|
|
|
export type UploaderFileListItem = {
|
|
url?: string;
|
|
file?: File;
|
|
content?: string;
|
|
isImage?: boolean;
|
|
status?: '' | 'uploading' | 'done' | 'failed';
|
|
message?: string;
|
|
imageFit?: ImageFit;
|
|
deletable?: boolean;
|
|
previewSize?: number | string;
|
|
beforeDelete?: Interceptor;
|
|
};
|
|
|
|
export type UploaderMaxSize = number | string | ((file: File) => boolean);
|
|
|
|
export function toArray<T>(item: T | T[]): T[] {
|
|
if (Array.isArray(item)) {
|
|
return item;
|
|
}
|
|
|
|
return [item];
|
|
}
|
|
|
|
export function readFileContent(file: File, resultType: UploaderResultType) {
|
|
return new Promise<string | void>((resolve) => {
|
|
if (resultType === 'file') {
|
|
resolve();
|
|
return;
|
|
}
|
|
|
|
const reader = new FileReader();
|
|
|
|
reader.onload = (event) => {
|
|
resolve((event.target as FileReader).result as string);
|
|
};
|
|
|
|
if (resultType === 'dataUrl') {
|
|
reader.readAsDataURL(file);
|
|
} else if (resultType === 'text') {
|
|
reader.readAsText(file);
|
|
}
|
|
});
|
|
}
|
|
|
|
export function isOversize(
|
|
items: UploaderFileListItem | UploaderFileListItem[],
|
|
maxSize: UploaderMaxSize
|
|
): boolean {
|
|
return toArray(items).some((item) => {
|
|
if (item.file) {
|
|
if (isFunction(maxSize)) {
|
|
return maxSize(item.file);
|
|
}
|
|
return item.file.size > maxSize;
|
|
}
|
|
return false;
|
|
});
|
|
}
|
|
|
|
export function filterFiles(
|
|
items: UploaderFileListItem[],
|
|
maxSize: UploaderMaxSize
|
|
) {
|
|
const valid: UploaderFileListItem[] = [];
|
|
const invalid: UploaderFileListItem[] = [];
|
|
|
|
items.forEach((item) => {
|
|
if (isOversize(item, maxSize)) {
|
|
invalid.push(item);
|
|
} else {
|
|
valid.push(item);
|
|
}
|
|
});
|
|
|
|
return { valid, invalid };
|
|
}
|
|
|
|
const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i;
|
|
|
|
export function isImageUrl(url: string): boolean {
|
|
return IMAGE_REGEXP.test(url);
|
|
}
|
|
|
|
export function isImageFile(item: UploaderFileListItem): boolean {
|
|
// some special urls cannot be recognized
|
|
// user can add `isImage` flag to mark it as an image url
|
|
if (item.isImage) {
|
|
return true;
|
|
}
|
|
|
|
if (item.file && item.file.type) {
|
|
return item.file.type.indexOf('image') === 0;
|
|
}
|
|
|
|
if (item.url) {
|
|
return isImageUrl(item.url);
|
|
}
|
|
|
|
if (typeof item.content === 'string') {
|
|
return item.content.indexOf('data:image') === 0;
|
|
}
|
|
|
|
return false;
|
|
}
|