{"version":3,"file":"xhr.mjs","sources":["../../../../src/_common/js/upload/xhr.ts"],"sourcesContent":["import isFunction from 'lodash/isFunction';\n/* eslint-disable no-param-reassign */\nimport log from '../log/log';\nimport { UploadFile, XhrOptions } from './types';\nimport { getCurrentDate } from './utils';\n\nexport default function xhr({\n  method = 'POST',\n  action,\n  withCredentials = false,\n  headers = {},\n  data = {},\n  file,\n  files = [],\n  name = 'file',\n  useMockProgress = true,\n  mockProgressDuration = 300,\n  formatRequest,\n  onError,\n  onProgress,\n  onSuccess,\n}: XhrOptions) {\n  // support files\n  const innerFiles: UploadFile[] = files || [];\n  let percent = 0;\n\n  // eslint-disable-next-line no-shadow\n  const xhr = new XMLHttpRequest();\n  if (withCredentials) {\n    xhr.withCredentials = true;\n  }\n\n  let timer1: NodeJS.Timeout;\n  let timer2: NodeJS.Timeout;\n  if (useMockProgress && files[0]?.status === 'progress') {\n    // 超过 500 毫秒再开启虚拟进度\n    const timer2 = setTimeout(() => {\n      // 只有真实进度一直不存在时才需要模拟进度\n      timer1 = setInterval(() => {\n        if (percent + 10 < 100) {\n          percent = Math.max(percent + 10, percent);\n          if (files[0] && percent !== files[0].percent) {\n            files[0].percent = percent;\n            onProgress({\n              percent,\n              file: file || innerFiles[0],\n              files: innerFiles.map((file) => ({ ...file, percent })),\n              type: 'mock',\n              XMLHttpRequest: xhr,\n            });\n          }\n        } else {\n          clearInterval(timer1);\n        }\n      }, mockProgressDuration);\n      clearTimeout(timer2);\n    }, mockProgressDuration);\n  }\n\n  let requestData: { [key: string]: any } = {};\n  if (data) {\n    const extraData = isFunction(data) ? data(innerFiles) : data;\n    Object.assign(requestData, extraData);\n  }\n  innerFiles.forEach((file, index) => {\n    const fileField = innerFiles.length > 1 ? `${name}[${index}]` : name;\n    requestData[fileField] = file.raw;\n  });\n  if (innerFiles.length === 1) {\n    requestData[name] = innerFiles[0].raw;\n  } else {\n    requestData[name] = innerFiles.map((file) => file.raw);\n  }\n  requestData.length = innerFiles.length;\n\n  if (formatRequest) {\n    requestData = formatRequest(requestData);\n  }\n\n  // set send data\n  const formData = new FormData();\n  Object.keys(requestData).forEach((key) => {\n    formData.append(key, requestData[key]);\n  });\n\n  xhr.open(method, action, true);\n  // custom request headers\n  Object.keys(headers).forEach((key) => {\n    xhr.setRequestHeader(key, headers[key]);\n  });\n\n  xhr.onerror = (event: ProgressEvent) => {\n    onError({ event, file, files: innerFiles, XMLHttpRequest: xhr, });\n    clearInterval(timer1);\n    clearTimeout(timer2);\n  };\n\n  xhr.ontimeout = (event) => {\n    onError({ event, file, files: innerFiles, XMLHttpRequest: xhr, });\n  };\n\n  if (xhr.upload) {\n    xhr.upload.onprogress = (event: ProgressEvent) => {\n      let realPercent = 0;\n      if (event.total > 0) {\n        realPercent = Math.round((event.loaded / event.total) * 100);\n      }\n      percent = Math.max(realPercent, percent);\n      if (percent !== realPercent && innerFiles[0]?.percent !== percent) {\n        const progressFiles = innerFiles.map((item) => ({ ...item, percent }));\n        onProgress({\n          event,\n          percent,\n          file: file || progressFiles[0],\n          files: progressFiles,\n          type: 'real',\n          XMLHttpRequest: xhr,\n        });\n      }\n    };\n  }\n\n  // eslint-disable-next-line consistent-return\n  xhr.onload = (event: ProgressEvent) => {\n    let response: { [key: string]: any } = {};\n    response.XMLHttpRequest = xhr;\n    const isFail = xhr.status < 200 || xhr.status >= 300;\n    if (isFail) {\n      return onError({\n        event,\n        file,\n        files: innerFiles,\n        response,\n        XMLHttpRequest: xhr,\n      });\n    }\n    const text = xhr.responseText || xhr.response;\n    try {\n      response = JSON.parse(text);\n    } catch (e) {\n      response = text;\n      log.error('Upload', 'response does not a valid json');\n    }\n    clearInterval(timer1);\n    clearTimeout(timer2);\n    innerFiles.forEach((file) => {\n      file.percent = 100;\n      file.status = 'success';\n      // 如果上传请求返回结果没有上传日期，则使用电脑当前日期显示\n      file.uploadTime = response?.uploadTime || getCurrentDate();\n    });\n    if (typeof response === 'object') {\n      response.XMLHttpRequest = xhr;\n    }\n    onSuccess({\n      event,\n      file: file || innerFiles[0],\n      files: [...innerFiles],\n      XMLHttpRequest: xhr,\n      response,\n    });\n  };\n\n  xhr.send(formData);\n  // @ts-ignore\n  xhr.upload.requestParams = requestData;\n  // @ts-ignore\n  xhr.upload.requestHeaders = headers;\n\n  return xhr;\n}\n"],"names":["method","withCredentials","headers","data","files","name","useMockProgress","mockProgressDuration","xhr","timer2","onProgress","percent","file","type","XMLHttpRequest","isFunction","Object","innerFiles","requestData","onError","event","realPercent","response","log","onSuccess"],"mappings":"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"}