{"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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"}