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