useFileUpload.ts 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { ref } from 'vue'
  2. import { uploadFile } from '@/api/file'
  3. import { getUploadUrl } from '@/utils/file'
  4. import type { Attachment } from '@/types/flow'
  5. export function useFileUpload() {
  6. const attachmentList = ref<any[]>([])
  7. const previousAttachments = ref<Attachment[]>([])
  8. const previewVisible = ref(false)
  9. const previewUrl = ref('')
  10. async function handleUpload(options: any) {
  11. try {
  12. const res = await uploadFile(options.file)
  13. options.onSuccess?.(res)
  14. } catch (e: any) {
  15. options.onError?.(e)
  16. }
  17. }
  18. async function loadPreviousAttachments(loader?: () => Promise<Attachment[]>) {
  19. if (!loader) {
  20. previousAttachments.value = []
  21. return
  22. }
  23. try {
  24. previousAttachments.value = await loader()
  25. } catch {
  26. previousAttachments.value = []
  27. }
  28. }
  29. function openPreview(url: string) {
  30. if (!url) return
  31. previewUrl.value = url
  32. previewVisible.value = true
  33. }
  34. function handleFilePreview(file: any) {
  35. const url = getUploadUrl(file)
  36. if (url) openPreview(url)
  37. }
  38. function resetFileUpload() {
  39. attachmentList.value = []
  40. previousAttachments.value = []
  41. previewUrl.value = ''
  42. previewVisible.value = false
  43. }
  44. return {
  45. attachmentList,
  46. previousAttachments,
  47. previewVisible,
  48. previewUrl,
  49. handleUpload,
  50. loadPreviousAttachments,
  51. openPreview,
  52. handleFilePreview,
  53. resetFileUpload,
  54. }
  55. }