element-plus
Version:
A Component Library for Vue 3
1 lines • 7.27 kB
Source Map (JSON)
{"version":3,"file":"useHandlers.mjs","sources":["../../../../../../packages/components/upload/src/useHandlers.ts"],"sourcesContent":["import { ref, watch } from 'vue'\nimport { NOOP } from '@vue/shared'\nimport cloneDeep from 'lodash/cloneDeep'\n\n// Inline types\nimport type {\n ListType,\n UploadFile,\n UploadStatus,\n ElFile,\n ElUploadProgressEvent,\n IUseHandlersProps,\n} from './upload.type'\ntype UploadRef = {\n abort: (file: UploadFile) => void\n upload: (file: ElFile) => void\n}\n// helpers\nfunction getFile(rawFile: ElFile, uploadFiles: UploadFile[]) {\n return uploadFiles.find((file) => file.uid === rawFile.uid)\n}\n\nfunction genUid(seed: number) {\n return Date.now() + seed\n}\n\nexport default (props: IUseHandlersProps) => {\n const uploadFiles = ref<UploadFile[]>([])\n const uploadRef = ref<UploadRef>(null)\n\n let tempIndex = 1\n\n function abort(file: UploadFile) {\n uploadRef.value.abort(file)\n }\n\n function clearFiles(status: UploadStatus[] = ['success', 'fail']) {\n uploadFiles.value = uploadFiles.value.filter((row) => {\n return status.indexOf(row.status) === -1\n })\n }\n\n function handleError(err: Error, rawFile: ElFile) {\n const file = getFile(rawFile, uploadFiles.value)\n file.status = 'fail'\n uploadFiles.value.splice(uploadFiles.value.indexOf(file), 1)\n props.onError(err, file, uploadFiles.value)\n props.onChange(file, uploadFiles.value)\n }\n\n function handleProgress(ev: ElUploadProgressEvent, rawFile: ElFile) {\n const file = getFile(rawFile, uploadFiles.value)\n props.onProgress(ev, file, uploadFiles.value)\n file.status = 'uploading'\n file.percentage = ev.percent || 0\n }\n\n function handleSuccess(res: any, rawFile: ElFile) {\n const file = getFile(rawFile, uploadFiles.value)\n if (file) {\n file.status = 'success'\n file.response = res\n props.onSuccess(res, file, uploadFiles.value)\n props.onChange(file, uploadFiles.value)\n }\n }\n\n function handleStart(rawFile: ElFile) {\n const uid = genUid(tempIndex++)\n rawFile.uid = uid\n const file: UploadFile = {\n name: rawFile.name,\n percentage: 0,\n status: 'ready',\n size: rawFile.size,\n raw: rawFile,\n uid,\n }\n if (props.listType === 'picture-card' || props.listType === 'picture') {\n try {\n file.url = URL.createObjectURL(rawFile)\n } catch (err) {\n console.error('[Element Error][Upload]', err)\n props.onError(err, file, uploadFiles.value)\n }\n }\n uploadFiles.value.push(file)\n props.onChange(file, uploadFiles.value)\n }\n\n function handleRemove(file: UploadFile, raw: ElFile) {\n if (raw) {\n file = getFile(raw, uploadFiles.value)\n }\n const revokeObjectURL = () => {\n if (file.url && file.url.indexOf('blob:') === 0) {\n URL.revokeObjectURL(file.url)\n }\n }\n const doRemove = () => {\n abort(file)\n const fileList = uploadFiles.value\n fileList.splice(fileList.indexOf(file), 1)\n props.onRemove(file, fileList)\n revokeObjectURL()\n }\n if (!props.beforeRemove) {\n doRemove()\n } else if (typeof props.beforeRemove === 'function') {\n const before = props.beforeRemove(file, uploadFiles.value)\n if (before instanceof Promise) {\n before\n .then(() => {\n doRemove()\n })\n .catch(NOOP)\n } else if (before !== false) {\n doRemove()\n }\n }\n }\n\n function submit() {\n uploadFiles.value\n .filter((file) => file.status === 'ready')\n .forEach((file) => {\n uploadRef.value.upload(file.raw)\n })\n }\n\n watch(\n () => props.listType,\n (val: ListType) => {\n if (val === 'picture-card' || val === 'picture') {\n uploadFiles.value = uploadFiles.value.map((file) => {\n if (!file.url && file.raw) {\n try {\n file.url = URL.createObjectURL(file.raw)\n } catch (err) {\n props.onError(err, file, uploadFiles.value)\n }\n }\n return file\n })\n }\n }\n )\n\n watch(\n () => props.fileList,\n (fileList: UploadFile[]) => {\n uploadFiles.value = fileList.map((file) => {\n const cloneFile = cloneDeep(file)\n return {\n ...cloneFile,\n uid: file.uid || genUid(tempIndex++),\n status: file.status || 'success',\n }\n })\n },\n {\n immediate: true,\n deep: true,\n }\n )\n\n return {\n abort,\n clearFiles,\n handleError,\n handleProgress,\n handleStart,\n handleSuccess,\n handleRemove,\n submit,\n uploadFiles,\n uploadRef,\n }\n}\n"],"names":[],"mappings":"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"}