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