{"version":3,"file":"use-handlers.mjs","sources":["../../../../../../packages/components/upload/src/use-handlers.ts"],"sourcesContent":["import { watch } from 'vue'\r\nimport { isNil } from 'lodash'\r\nimport { useVModel } from '@vueuse/core'\r\nimport { debugWarn, throwError } from '@sgui-plus/utils/error'\r\nimport { genFileId } from './upload'\r\nimport type { ShallowRef } from 'vue'\r\nimport type {\r\n  UploadContentInstance,\r\n  UploadContentProps,\r\n} from './upload-content'\r\nimport type {\r\n  UploadFile,\r\n  UploadFiles,\r\n  UploadProps,\r\n  UploadRawFile,\r\n  UploadStatus,\r\n} from './upload'\r\n\r\nconst SCOPE = 'SgUpload'\r\n\r\nconst revokeObjectURL = (file: UploadFile) => {\r\n  if (file.url?.startsWith('blob:')) {\r\n    URL.revokeObjectURL(file.url)\r\n  }\r\n}\r\n\r\nexport const useHandlers = (\r\n  props: UploadProps,\r\n  uploadRef: ShallowRef<UploadContentInstance | undefined>\r\n) => {\r\n  const uploadFiles = useVModel(\r\n    props as Omit<UploadProps, 'fileList'> & { fileList: UploadFiles },\r\n    'fileList',\r\n    undefined,\r\n    { passive: true }\r\n  )\r\n\r\n  const getFile = (rawFile: UploadRawFile) =>\r\n    uploadFiles.value.find((file) => file.uid === rawFile.uid)\r\n\r\n  function abort(file: UploadFile) {\r\n    uploadRef.value?.abort(file)\r\n  }\r\n\r\n  function getFiles() {\r\n    return uploadFiles.value\r\n  }\r\n\r\n  function clearFiles(\r\n    /** @default ['ready', 'uploading', 'success', 'fail'] */\r\n    states: UploadStatus[] = ['ready', 'uploading', 'success', 'fail']\r\n  ) {\r\n    uploadFiles.value = uploadFiles.value.filter(\r\n      (row) => !states.includes(row.status)\r\n    )\r\n  }\r\n\r\n  const handleError: UploadContentProps['onError'] = (err, rawFile) => {\r\n    const file = getFile(rawFile)\r\n    if (!file) return\r\n\r\n    // console.error(err)\r\n    file.status = 'fail'\r\n    uploadFiles.value.splice(uploadFiles.value.indexOf(file), 1)\r\n    props.onError(err, file, uploadFiles.value)\r\n    props.onChange(file, uploadFiles.value)\r\n  }\r\n\r\n  const handleProgress: UploadContentProps['onProgress'] = (evt, rawFile) => {\r\n    const file = getFile(rawFile)\r\n    if (!file) return\r\n\r\n    props.onProgress(evt, file, uploadFiles.value)\r\n    file.status = 'uploading'\r\n    file.percentage = Math.round(evt.percent)\r\n  }\r\n\r\n  const handleSuccess: UploadContentProps['onSuccess'] = (\r\n    response,\r\n    rawFile\r\n  ) => {\r\n    const file = getFile(rawFile)\r\n    if (!file) return\r\n\r\n    file.status = 'success'\r\n    file.response = response\r\n    props.onSuccess(response, file, uploadFiles.value)\r\n    props.onChange(file, uploadFiles.value)\r\n  }\r\n\r\n  const handleStart: UploadContentProps['onStart'] = (file) => {\r\n    if (isNil(file.uid)) file.uid = genFileId()\r\n    const uploadFile: UploadFile = {\r\n      name: file.name,\r\n      percentage: 0,\r\n      status: 'ready',\r\n      size: file.size,\r\n      raw: file,\r\n      uid: file.uid,\r\n    }\r\n    if (props.listType === 'picture-card' || props.listType === 'picture') {\r\n      try {\r\n        uploadFile.url = URL.createObjectURL(file)\r\n      } catch (err: unknown) {\r\n        debugWarn(SCOPE, (err as Error).message)\r\n        props.onError(err as Error, uploadFile, uploadFiles.value)\r\n      }\r\n    }\r\n    uploadFiles.value = [...uploadFiles.value, uploadFile]\r\n    props.onChange(uploadFile, uploadFiles.value)\r\n  }\r\n\r\n  const handleRemove: UploadContentProps['onRemove'] = async (\r\n    file\r\n  ): Promise<void> => {\r\n    const uploadFile = file instanceof File ? getFile(file) : file\r\n    if (!uploadFile) throwError(SCOPE, 'file to be removed not found')\r\n\r\n    const doRemove = (file: UploadFile) => {\r\n      abort(file)\r\n      const fileList = uploadFiles.value\r\n      fileList.splice(fileList.indexOf(file), 1)\r\n      props.onRemove(file, fileList)\r\n      revokeObjectURL(file)\r\n    }\r\n\r\n    if (props.beforeRemove) {\r\n      const before = await props.beforeRemove(uploadFile, uploadFiles.value)\r\n      if (before !== false) doRemove(uploadFile)\r\n    } else {\r\n      doRemove(uploadFile)\r\n    }\r\n  }\r\n\r\n  function submit() {\r\n    uploadFiles.value\r\n      .filter(({ status }) => status === 'ready')\r\n      .forEach(({ raw }) => raw && uploadRef.value?.upload(raw))\r\n  }\r\n\r\n  watch(\r\n    () => props.listType,\r\n    (val) => {\r\n      if (val !== 'picture-card' && val !== 'picture') {\r\n        return\r\n      }\r\n\r\n      uploadFiles.value = uploadFiles.value.map((file) => {\r\n        const { raw, url } = file\r\n        if (!url && raw) {\r\n          try {\r\n            file.url = URL.createObjectURL(raw)\r\n          } catch (err: unknown) {\r\n            props.onError(err as Error, file, uploadFiles.value)\r\n          }\r\n        }\r\n        return file\r\n      })\r\n    }\r\n  )\r\n\r\n  watch(\r\n    uploadFiles,\r\n    (files) => {\r\n      for (const file of files) {\r\n        file.uid ||= genFileId()\r\n        file.status ||= 'success'\r\n      }\r\n    },\r\n    { immediate: true, deep: true }\r\n  )\r\n\r\n  return {\r\n    /** @description two-way binding ref from props `fileList` */\r\n    uploadFiles,\r\n    abort,\r\n    getFiles,\r\n    clearFiles,\r\n    handleError,\r\n    handleProgress,\r\n    handleStart,\r\n    handleSuccess,\r\n    handleRemove,\r\n    submit,\r\n  }\r\n}\r\n"],"names":[],"mappings":"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"}