UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 10.3 kB
{"version":3,"file":"use-handlers.mjs","sources":["../../../../../../packages/components/upload/src/use-handlers.ts"],"sourcesContent":["import { nextTick, watch } from 'vue'\nimport { isNil } from 'lodash-unified'\nimport { useVModel } from '@vueuse/core'\nimport { debugWarn, throwError } from '@element-plus/utils'\nimport { genFileId } from './upload'\n\nimport type { ShallowRef } from 'vue'\nimport type {\n UploadContentInstance,\n UploadContentProps,\n} from './upload-content'\nimport type {\n UploadFile,\n UploadFiles,\n UploadProps,\n UploadRawFile,\n UploadStatus,\n} from './upload'\n\nconst SCOPE = 'ElUpload'\n\nconst revokeFileObjectURL = (file: UploadFile) => {\n if (file.url?.startsWith('blob:')) {\n URL.revokeObjectURL(file.url)\n }\n}\n\nexport const useHandlers = (\n props: UploadProps &\n Required<\n Pick<\n UploadProps,\n | 'listType'\n | 'onChange'\n | 'onError'\n | 'onProgress'\n | 'onSuccess'\n | 'onRemove'\n >\n >,\n uploadRef: ShallowRef<UploadContentInstance | undefined>\n) => {\n const uploadFiles = useVModel(\n props as Omit<UploadProps, 'fileList'> & { fileList: UploadFiles },\n 'fileList',\n undefined,\n { passive: true }\n )\n\n const getFile = (rawFile: UploadRawFile) =>\n uploadFiles.value.find((file) => file.uid === rawFile.uid)\n\n function abort(file?: UploadFile) {\n uploadRef.value?.abort(file)\n }\n\n function clearFiles(\n /** @default ['ready', 'uploading', 'success', 'fail'] */\n states: UploadStatus[] = ['ready', 'uploading', 'success', 'fail']\n ) {\n uploadFiles.value = uploadFiles.value.filter(\n (row) => !states.includes(row.status)\n )\n }\n\n function removeFile(file: UploadFile) {\n uploadFiles.value = uploadFiles.value.filter(\n (uploadFile) => uploadFile.uid !== file.uid\n )\n }\n\n const emitChange = (file: UploadFile) => {\n nextTick(() => props.onChange(file, uploadFiles.value))\n }\n\n const handleError: UploadContentProps['onError'] = (err, rawFile) => {\n const file = getFile(rawFile)\n if (!file) return\n\n console.error(err)\n file.status = 'fail'\n removeFile(file)\n props.onError(err, file, uploadFiles.value)\n emitChange(file)\n }\n\n const handleProgress: UploadContentProps['onProgress'] = (evt, rawFile) => {\n const file = getFile(rawFile)\n if (!file) return\n\n props.onProgress(evt, file, uploadFiles.value)\n file.status = 'uploading'\n file.percentage = Math.round(evt.percent)\n }\n\n const handleSuccess: UploadContentProps['onSuccess'] = (\n response,\n rawFile\n ) => {\n const file = getFile(rawFile)\n if (!file) return\n\n file.status = 'success'\n file.response = response\n props.onSuccess(response, file, uploadFiles.value)\n emitChange(file)\n }\n\n const handleStart: UploadContentProps['onStart'] = (file) => {\n if (isNil(file.uid)) file.uid = genFileId()\n const uploadFile: UploadFile = {\n name: file.name,\n percentage: 0,\n status: 'ready',\n size: file.size,\n raw: file,\n uid: file.uid,\n }\n if (props.listType === 'picture-card' || props.listType === 'picture') {\n try {\n uploadFile.url = URL.createObjectURL(file)\n } catch (err: unknown) {\n debugWarn(SCOPE, (err as Error).message)\n props.onError(err as Error, uploadFile, uploadFiles.value)\n }\n }\n uploadFiles.value = [...uploadFiles.value, uploadFile]\n emitChange(uploadFile)\n }\n\n const handleRemove: UploadContentProps['onRemove'] = async (\n file\n ): Promise<void> => {\n const uploadFile = file instanceof File ? getFile(file) : file\n if (!uploadFile) throwError(SCOPE, 'file to be removed not found')\n\n const doRemove = (file: UploadFile) => {\n abort(file)\n removeFile(file)\n props.onRemove(file, uploadFiles.value)\n revokeFileObjectURL(file)\n }\n\n if (props.beforeRemove) {\n const before = await props.beforeRemove(uploadFile, uploadFiles.value)\n if (before !== false) doRemove(uploadFile)\n } else {\n doRemove(uploadFile)\n }\n }\n\n function submit() {\n uploadFiles.value\n .filter(({ status }) => status === 'ready')\n .forEach(({ raw }) => raw && uploadRef.value?.upload(raw))\n }\n\n watch(\n () => props.listType,\n (val) => {\n if (val !== 'picture-card' && val !== 'picture') {\n return\n }\n\n uploadFiles.value = uploadFiles.value.map((file) => {\n const { raw, url } = file\n if (!url && raw) {\n try {\n file.url = URL.createObjectURL(raw)\n } catch (err: unknown) {\n props.onError(err as Error, file, uploadFiles.value)\n }\n }\n return file\n })\n }\n )\n\n watch(\n uploadFiles,\n (files) => {\n for (const file of files) {\n file.uid ||= genFileId()\n file.status ||= 'success'\n }\n },\n { immediate: true, deep: true }\n )\n\n return {\n /** @description two-way binding ref from props `fileList` */\n uploadFiles,\n abort,\n clearFiles,\n handleError,\n handleProgress,\n handleStart,\n handleSuccess,\n handleRemove,\n submit,\n revokeFileObjectURL,\n }\n}\n"],"names":["file"],"mappings":"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"}