{"version":3,"file":"upload-content.mjs","sources":["../../../../../../packages/components/upload/src/upload-content.vue"],"sourcesContent":["<template>\n  <div\n    :class=\"\n      [\n        `handle-${listType}`,\n        {\n          'is-drag': drag,\n          'is-disabled': disabled,\n        }\n      ]\"\n    :tabindex=\"disabled ? '-1' : '0'\"\n    @click=\"handleClick\"\n    @keydown.self.enter.space=\"handleKeydown\"\n  >\n    <template v-if=\"drag\">\n      <upload-dragger :disabled=\"disabled\" @file=\"uploadFiles\">\n        <slot></slot>\n      </upload-dragger>\n    </template>\n    <template v-else>\n      <slot></slot>\n    </template>\n    <input\n      ref=\"inputRef\"\n      class=\"upload-input\"\n      :name=\"name\"\n      :multiple=\"multiple\"\n      :accept=\"accept\"\n      :disabled=\"disabled\"\n      type=\"file\"\n      @change=\"handleChange\"\n      @click.stop\n    >\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { shallowRef } from 'vue'\nimport { isPlainObject, isPromise } from '@vue/shared'\nimport { cloneDeep, isEqual } from 'lodash-unified'\nimport { entriesOf, isFunction } from '@hongluan-ui/utils'\nimport { useConsistentProp } from '@hongluan-ui/hooks'\nimport UploadDragger from './upload-dragger.vue'\nimport { uploadContentProps } from './upload-content'\nimport { genFileId } from './upload'\n\nimport type { UploadContentProps } from './upload-content'\n\nimport type {\n  UploadRequestOptions,\n  UploadRawFile,\n  UploadFile,\n  UploadHooks,\n} from './upload'\n\ndefineOptions({\n  name: 'UploadContent',\n  inheritAttrs: false,\n})\n\nconst props = defineProps(uploadContentProps)\n\nconst { disabled } = useConsistentProp()\n\nconst requests = shallowRef<Record<string, XMLHttpRequest | Promise<unknown>>>(\n  {},\n)\nconst inputRef = shallowRef<HTMLInputElement>()\n\nconst uploadFiles = (files: File[]) => {\n  if (files.length === 0) return\n\n  const { autoUpload, limit, fileList, multiple, onStart, onExceed } = props\n\n  if (limit && fileList.length + files.length > limit) {\n    onExceed(files, fileList)\n    return\n  }\n\n  if (!multiple) {\n    files = files.slice(0, 1)\n  }\n\n  for (const file of files) {\n    const rawFile = file as UploadRawFile\n    rawFile.uid = genFileId()\n    onStart(rawFile)\n    if (autoUpload) upload(rawFile)\n  }\n}\n\nconst upload = async (rawFile: UploadRawFile): Promise<void> => {\n  inputRef.value.value = ''\n\n  if (!props.beforeUpload) {\n    return doUpload(rawFile)\n  }\n\n  let hookResult: Exclude<ReturnType<UploadHooks['beforeUpload']>, Promise<any>>\n  let beforeData: UploadContentProps['data'] = {}\n\n  try {\n    // origin data: Handle data changes after synchronization tasks are executed\n    const originData = props.data\n    const beforeUploadPromise = props.beforeUpload(rawFile)\n    beforeData = isPlainObject(props.data) ? cloneDeep(props.data) : props.data\n    hookResult = await beforeUploadPromise\n    if (isPlainObject(props.data) && isEqual(originData, beforeData)) {\n      beforeData = cloneDeep(props.data)\n    }\n  } catch {\n    hookResult = false\n  }\n\n  if (hookResult === false) {\n    props.onRemove(rawFile)\n    return\n  }\n\n  let file: File = rawFile\n  if (hookResult instanceof Blob) {\n    if (hookResult instanceof File) {\n      file = hookResult\n    } else {\n      file = new File([hookResult], rawFile.name, {\n        type: rawFile.type,\n      })\n    }\n  }\n\n  doUpload(\n    Object.assign(file, {\n      uid: rawFile.uid,\n    }),\n    beforeData,\n  )\n}\n\nconst resolveData = async (\n  data: UploadContentProps['data'],\n  rawFile: UploadRawFile,\n): Promise<Record<string, any>> => {\n  if (isFunction(data)) {\n    return data(rawFile)\n  }\n\n  return data\n}\n\nconst doUpload = async (\n  rawFile: UploadRawFile,\n  beforeData?: UploadContentProps['data'],\n) => {\n  const {\n    headers,\n    data,\n    method,\n    withCredentials,\n    name: filename,\n    action,\n    onProgress,\n    onSuccess,\n    onError,\n    httpRequest,\n  } = props\n\n  try {\n    beforeData = await resolveData(beforeData ?? data, rawFile)\n  } catch {\n    props.onRemove(rawFile)\n    return\n  }\n\n  const { uid } = rawFile\n  const options: UploadRequestOptions = {\n    headers: (headers || {}) as Record<string, any>,\n    withCredentials,\n    file: rawFile,\n    data: beforeData,\n    method,\n    filename,\n    action,\n    onProgress: evt => {\n      onProgress(evt, rawFile)\n    },\n    onSuccess: res => {\n      onSuccess(res, rawFile)\n      delete requests.value[uid]\n    },\n    onError: err => {\n      onError(err, rawFile)\n      delete requests.value[uid]\n    },\n  }\n  const request = httpRequest(options)\n  requests.value[uid] = request\n  if (request instanceof Promise) {\n    request.then(options.onSuccess, options.onError)\n  }\n}\n\nconst handleChange = (e: Event) => {\n  const files = (e.target as HTMLInputElement).files\n  if (!files) return\n  uploadFiles(Array.from(files))\n}\n\nconst handleClick = () => {\n  if (!disabled.value) {\n    inputRef.value.value = ''\n    inputRef.value.click()\n  }\n}\n\nconst handleKeydown = () => {\n  handleClick()\n}\n\nconst abort = (file?: UploadFile) => {\n  const _reqs = entriesOf(requests.value).filter(\n    file ? ([uid]) => String(file.uid) === uid : () => true,\n  )\n  _reqs.forEach(([uid, req]) => {\n    if (req instanceof XMLHttpRequest) req.abort()\n    delete requests.value[uid]\n  })\n}\n\ndefineExpose({\n  abort,\n  upload,\n})\n</script>\n"],"names":[],"mappings":"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"}