UNPKG

xdesign-vue-next

Version:

XDesign Component for vue-next

1 lines 26.2 kB
{"version":3,"file":"useUpload.mjs","sources":["../../../src/upload/hooks/useUpload.ts"],"sourcesContent":["import { ref, computed, toRefs } from 'vue';\nimport merge from 'lodash/merge';\nimport { SizeLimitObj, TdUploadProps, UploadChangeContext, UploadFile, UploadRemoveContext } from '../type';\nimport {\n getFilesAndErrors,\n validateFile,\n upload,\n getTriggerTextField,\n getDisplayFiles,\n formatToUploadFile,\n} from '../../_common/js/upload/main';\nimport { getFileList } from '../../_common/js/upload/utils';\nimport useVModel from '../../hooks/useVModel';\nimport { InnerProgressContext, OnResponseErrorContext, SuccessContext } from '../../_common/js/upload/types';\nimport { useConfig } from '../../hooks/useConfig';\n\nexport type ValidateParams = Parameters<TdUploadProps['onValidate']>[0];\n\n/**\n * 上传组件全部逻辑,方便脱离 UI,自定义 UI 组件\n */\nexport default function useUpload(props: TdUploadProps) {\n const inputRef = ref<HTMLInputElement>();\n // TODO: Form 表单控制上传组件是否禁用\n const { disabled, autoUpload, isBatchUpload, multiple, files, modelValue, defaultFiles } = toRefs(props);\n const { globalConfig, t, classPrefix } = useConfig('upload');\n const [uploadValue, setUploadValue] = useVModel(files, modelValue, defaultFiles.value, props.onChange, 'files');\n const xhrReq = ref<{ files: UploadFile[]; xhrReq: XMLHttpRequest }[]>([]);\n const toUploadFiles = ref<UploadFile[]>([]);\n const sizeOverLimitMessage = ref('');\n\n const locale = computed(() => merge({}, globalConfig.value, props.locale));\n\n const tipsClasses = `${classPrefix.value}-upload__tips ${classPrefix.value}-size-s`;\n const errorClasses = [tipsClasses].concat(`${classPrefix.value}-upload__tips-error`);\n const placeholderClass = `${classPrefix.value}-upload__placeholder`;\n\n // 单文件场景:触发元素文本\n const triggerUploadText = computed(() => {\n const field = getTriggerTextField({\n isBatchUpload: isBatchUpload.value,\n multiple: multiple.value,\n status: uploadValue.value?.[0]?.status,\n autoUpload: autoUpload.value,\n });\n return locale.value.triggerUploadText[field];\n });\n\n const uploading = ref(false);\n\n // 文件列表显示的内容(自动上传和非自动上传有所不同)\n const displayFiles = computed(() => {\n return getDisplayFiles({\n multiple: props.multiple,\n toUploadFiles: toUploadFiles.value,\n uploadValue: uploadValue.value,\n autoUpload: autoUpload.value,\n isBatchUpload: isBatchUpload.value,\n });\n });\n\n const uploadFilePercent = (params: { file: UploadFile; percent: number }) => {\n const { file, percent } = params;\n const index = toUploadFiles.value.findIndex((item) => file.raw === item.raw);\n toUploadFiles.value[index] = { ...toUploadFiles.value[index], percent };\n };\n\n const updateFilesProgress = () => {\n if (props.autoUpload) {\n toUploadFiles.value = [...toUploadFiles.value];\n }\n };\n\n const onResponseError = (p: OnResponseErrorContext) => {\n if (!p || !p.files || !p.files[0]) return;\n const { response, event, files } = p;\n updateFilesProgress();\n props.onOneFileFail?.({\n e: event,\n file: files?.[0],\n currentFiles: files,\n failedFiles: files,\n response,\n });\n // 单选或多文件替换,需要清空上一次上传成功的文件\n if (!props.multiple || props.isBatchUpload) {\n setUploadValue([], {\n trigger: 'progress-fail',\n e: p.event,\n file: p.files[0],\n });\n }\n };\n\n // 多文件上传场景,单个文件进度\n const onResponseProgress = (p: InnerProgressContext) => {\n updateFilesProgress();\n props.onProgress?.({\n e: p.event,\n file: p.file,\n currentFiles: p.files,\n percent: p.percent,\n type: p.type,\n XMLHttpRequest: p.XMLHttpRequest,\n });\n };\n\n // 多文件上传场景,单个文件上传成功后\n const onResponseSuccess = (p: SuccessContext) => {\n // 只有多个上传请求同时触发时才需 onOneFileSuccess\n if (props.multiple && !props.uploadAllFilesInOneRequest) {\n updateFilesProgress();\n props.onOneFileSuccess?.({\n e: p.event,\n file: p.files[0],\n response: p.response,\n });\n }\n };\n\n function getSizeLimitError(sizeLimitObj: SizeLimitObj) {\n const limit = sizeLimitObj;\n return limit.message\n ? t(limit.message, { sizeLimit: limit.size })\n : `${t(locale.value.sizeLimitMessage, { sizeLimit: limit.size })} ${limit.unit}`;\n }\n\n const handleNotAutoUpload = (toFiles: UploadFile[]) => {\n const tmpFiles = props.multiple && !isBatchUpload.value ? uploadValue.value.concat(toFiles) : toFiles;\n if (!tmpFiles.length) return;\n setUploadValue(tmpFiles, {\n trigger: 'add',\n index: uploadValue.value.length,\n file: toFiles[0],\n files: toFiles,\n });\n toUploadFiles.value = [];\n };\n\n const onFileChange = (files: File[]) => {\n if (disabled.value) return;\n const params = { currentSelectedFiles: formatToUploadFile([...files], props.format) };\n props.onSelectChange?.([...files], params);\n validateFile({\n uploadValue: uploadValue.value,\n // @ts-ignore\n files: [...files],\n allowUploadDuplicateFile: props.allowUploadDuplicateFile,\n max: props.max,\n sizeLimit: props.sizeLimit,\n isBatchUpload: isBatchUpload.value,\n autoUpload: autoUpload.value,\n format: props.format,\n beforeUpload: props.beforeUpload,\n beforeAllFilesUpload: props.beforeAllFilesUpload,\n }).then((args) => {\n // 自定义全文件校验不通过\n if (args.validateResult?.type === 'BEFORE_ALL_FILES_UPLOAD') {\n const params: ValidateParams = { type: 'BEFORE_ALL_FILES_UPLOAD', files: args.files };\n props.onValidate?.(params);\n return;\n }\n // 文件数量校验不通过\n if (args.lengthOverLimit) {\n const params: ValidateParams = { type: 'FILES_OVER_LENGTH_LIMIT', files: args.files };\n props.onValidate?.(params);\n if (!args.files.length) return;\n }\n // 过滤相同的文件名\n if (args.hasSameNameFile) {\n const params: ValidateParams = { type: 'FILTER_FILE_SAME_NAME', files: args.files };\n props.onValidate?.(params);\n }\n // 文件大小校验结果处理(已过滤超出限制的文件)\n if (args.fileValidateList instanceof Array) {\n const { sizeLimitErrors, beforeUploadErrorFiles, toFiles } = getFilesAndErrors(\n args.fileValidateList,\n getSizeLimitError,\n );\n const tmpWaitingFiles = autoUpload.value ? toFiles : toUploadFiles.value.concat(toFiles);\n toUploadFiles.value = tmpWaitingFiles;\n props.onWaitingUploadFilesChange?.({ files: tmpWaitingFiles, trigger: 'validate' });\n // 文件大小处理\n if (sizeLimitErrors[0]) {\n sizeOverLimitMessage.value = sizeLimitErrors[0].file.response.error;\n props.onValidate?.({ type: 'FILE_OVER_SIZE_LIMIT', files: sizeLimitErrors.map((t) => t.file) });\n } else {\n sizeOverLimitMessage.value = '';\n // 自定义方法 beforeUpload 拦截的文件\n if (beforeUploadErrorFiles.length) {\n const params: ValidateParams = { type: 'CUSTOM_BEFORE_UPLOAD', files: beforeUploadErrorFiles };\n props.onValidate?.(params);\n }\n }\n // 如果是自动上传\n if (autoUpload.value) {\n uploadFiles(tmpWaitingFiles);\n } else {\n handleNotAutoUpload(tmpWaitingFiles);\n }\n }\n });\n\n // 清空 <input type=\"file\"> 元素的文件,避免出现重复文件无法选择的情况\n inputRef.value.value = null;\n };\n\n const onNormalFileChange = (e: InputEvent) => {\n const fileList = getFileList((e.target as HTMLInputElement).files);\n onFileChange?.(fileList);\n };\n\n function onDragFileChange(files: File[]) {\n onFileChange?.(files);\n }\n\n function onPasteFileChange(e: ClipboardEvent) {\n onFileChange?.([...e.clipboardData.items].map((file: DataTransferItem) => file.getAsFile()) as any);\n }\n\n /**\n * 上传文件。对外暴露方法,修改时需谨慎\n * @param toFiles 本地上传的文件列表\n */\n function uploadFiles(toFiles?: UploadFile[]) {\n const notUploadedFiles = uploadValue.value.filter((t) => t.status !== 'success');\n const files = autoUpload.value ? toFiles || toUploadFiles.value : notUploadedFiles;\n if (!files || !files.length) return;\n uploading.value = true;\n xhrReq.value = [];\n upload({\n action: props.action,\n headers: props.headers,\n method: props.method,\n name: props.name,\n withCredentials: props.withCredentials,\n uploadedFiles: uploadValue.value,\n toUploadFiles: files,\n multiple: props.multiple,\n isBatchUpload: isBatchUpload.value,\n autoUpload: props.autoUpload,\n uploadAllFilesInOneRequest: props.uploadAllFilesInOneRequest,\n useMockProgress: props.useMockProgress,\n data: props.data,\n mockProgressDuration: props.mockProgressDuration,\n requestMethod: props.requestMethod,\n formatRequest: props.formatRequest,\n formatResponse: props.formatResponse,\n onResponseProgress,\n onResponseSuccess,\n onResponseError,\n setXhrObject: (xhr) => {\n if (xhr.files[0]?.raw && xhrReq.value.find((item) => item.files[0]?.raw === xhr.files[0].raw)) return;\n xhrReq.value = xhrReq.value.concat(xhr);\n },\n }).then(\n // 多文件场景时,全量文件完成后\n ({ status, data, list, failedFiles }) => {\n uploading.value = false;\n if (status === 'success') {\n setUploadValue([...data.files], {\n trigger: 'add',\n file: data.files[0],\n });\n xhrReq.value = [];\n props.onSuccess?.({\n fileList: data.files,\n currentFiles: files,\n file: files[0],\n // 只有全部请求完成后,才会存在该字段\n results: list?.map((t) => t.data),\n // 单文件单请求有一个 response,多文件多请求有多个 response\n response: data.response || list.map((t) => t.data.response),\n XMLHttpRequest: data.XMLHttpRequest,\n });\n } else if (failedFiles?.[0]) {\n props.onFail?.({\n e: data.event,\n file: failedFiles[0],\n failedFiles,\n currentFiles: files,\n response: data.response,\n XMLHttpRequest: data.XMLHttpRequest,\n });\n }\n\n // 非自动上传,文件都在 uploadValue,不涉及 toUploadFiles\n if (autoUpload.value) {\n toUploadFiles.value = failedFiles;\n props.onWaitingUploadFilesChange?.({ files: failedFiles, trigger: 'uploaded' });\n }\n },\n );\n }\n\n function onInnerRemove(p: UploadRemoveContext) {\n sizeOverLimitMessage.value = '';\n p.e.stopPropagation?.();\n const changePrams: UploadChangeContext = {\n e: p.e,\n trigger: 'remove',\n index: p.index,\n file: p.file,\n };\n // remove all files for batchUpload\n if (props.isBatchUpload || !props.multiple) {\n toUploadFiles.value = [];\n props.onWaitingUploadFilesChange?.({ files: [], trigger: 'remove' });\n setUploadValue([], changePrams);\n } else if (!props.autoUpload) {\n uploadValue.value.splice(p.index, 1);\n setUploadValue([...uploadValue.value], changePrams);\n } else {\n // autoUpload 场景下, p.index < uploadValue.length 表示移除已经上传成功的文件;反之表示移除待上传列表文件\n // eslint-disable-next-line\n if (p.index < uploadValue.value.length) {\n uploadValue.value.splice(p.index, 1);\n setUploadValue([...uploadValue.value], changePrams);\n } else {\n toUploadFiles.value.splice(p.index - uploadValue.value.length, 1);\n toUploadFiles.value = [...toUploadFiles.value];\n props.onWaitingUploadFilesChange?.({ files: [...toUploadFiles.value], trigger: 'remove' });\n }\n }\n props.onRemove?.(p);\n }\n\n const triggerUpload = (e?: MouseEvent) => {\n if (disabled.value || !inputRef.value) return;\n e?.stopPropagation?.();\n (inputRef.value as HTMLInputElement).click();\n };\n\n const cancelUpload = (context?: { file?: UploadFile; e?: MouseEvent }) => {\n xhrReq.value?.forEach((item) => {\n item.xhrReq?.abort();\n });\n uploading.value = false;\n\n if (autoUpload.value) {\n toUploadFiles.value = toUploadFiles.value.map((item) => ({ ...item, status: 'waiting' }));\n } else {\n setUploadValue(\n uploadValue.value.map((item) => {\n if (item.status !== 'success') {\n return { ...item, status: 'waiting' };\n }\n return item;\n }),\n { trigger: 'abort' },\n );\n }\n\n if (context?.file && !autoUpload.value) {\n onInnerRemove?.({ file: context.file, e: context.e, index: 0 });\n }\n\n props.onCancelUpload?.();\n };\n\n return {\n t,\n locale,\n classPrefix,\n triggerUploadText,\n toUploadFiles,\n uploadValue,\n displayFiles,\n sizeOverLimitMessage,\n uploading,\n tipsClasses,\n errorClasses,\n placeholderClass,\n inputRef,\n disabled,\n xhrReq,\n uploadFilePercent,\n uploadFiles,\n onFileChange,\n onNormalFileChange,\n onDragFileChange,\n onPasteFileChange,\n onInnerRemove,\n triggerUpload,\n cancelUpload,\n };\n}\n"],"names":["uploadValue","setUploadValue","merge","toUploadFiles","percent","updateFilesProgress","e","currentFiles","failedFiles","response","trigger","file","index","files","validateFile","type","sizeOverLimitMessage","inputRef","onFileChange","t","upload","onResponseProgress","onResponseSuccess","onResponseError","setXhrObject","status","onInnerRemove","locale","classPrefix","triggerUploadText","displayFiles","uploading","tipsClasses","errorClasses","placeholderClass","disabled","xhrReq","uploadFilePercent","uploadFiles","onNormalFileChange","onDragFileChange","onPasteFileChange","triggerUpload","cancelUpload"],"mappings":"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"}