hooks.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { useState } from 'react'
  2. import { useParams } from 'next/navigation'
  3. import { useTranslation } from 'react-i18next'
  4. import { imageUpload } from './utils'
  5. import { useToastContext } from '@/app/components/base/toast'
  6. import type { ImageFile } from '@/types/app'
  7. export const useImageFiles = () => {
  8. const params = useParams()
  9. const { t } = useTranslation()
  10. const { notify } = useToastContext()
  11. const [files, setFiles] = useState<ImageFile[]>([])
  12. const handleUpload = (imageFile: ImageFile) => {
  13. const newFiles = [...files, imageFile]
  14. setFiles(newFiles)
  15. }
  16. const handleRemove = (imageFileId: string) => {
  17. const index = files.findIndex(file => file._id === imageFileId)
  18. if (index > -1) {
  19. const newFiles = [...files.slice(0, index), ...files.slice(index + 1)]
  20. setFiles(newFiles)
  21. }
  22. }
  23. const handleImageLinkLoadError = (imageFileId: string) => {
  24. const index = files.findIndex(file => file._id === imageFileId)
  25. if (index > -1) {
  26. const currentFile = files[index]
  27. const newFiles = [...files.slice(0, index), { ...currentFile, progress: -1 }, ...files.slice(index + 1)]
  28. setFiles(newFiles)
  29. }
  30. }
  31. const handleImageLinkLoadSuccess = (imageFileId: string) => {
  32. const index = files.findIndex(file => file._id === imageFileId)
  33. if (index > -1) {
  34. const currentImageFile = files[index]
  35. const newFiles = [...files.slice(0, index), { ...currentImageFile, progress: 100 }, ...files.slice(index + 1)]
  36. setFiles(newFiles)
  37. }
  38. }
  39. const handleReUpload = (imageFileId: string) => {
  40. const index = files.findIndex(file => file._id === imageFileId)
  41. if (index > -1) {
  42. const currentImageFile = files[index]
  43. imageUpload({
  44. file: currentImageFile.file!,
  45. onProgressCallback: (progress) => {
  46. const newFiles = [...files.slice(0, index), { ...currentImageFile, progress }, ...files.slice(index + 1)]
  47. setFiles(newFiles)
  48. },
  49. onSuccessCallback: (res) => {
  50. const newFiles = [...files.slice(0, index), { ...currentImageFile, fileId: res.id, progress: 100 }, ...files.slice(index + 1)]
  51. setFiles(newFiles)
  52. },
  53. onErrorCallback: () => {
  54. notify({ type: 'error', message: t('common.imageUploader.uploadFromComputerUploadError') })
  55. const newFiles = [...files.slice(0, index), { ...currentImageFile, progress: -1 }, ...files.slice(index + 1)]
  56. setFiles(newFiles)
  57. },
  58. }, !!params.token)
  59. }
  60. }
  61. const handleClear = () => {
  62. setFiles([])
  63. }
  64. return {
  65. files,
  66. onUpload: handleUpload,
  67. onRemove: handleRemove,
  68. onImageLinkLoadError: handleImageLinkLoadError,
  69. onImageLinkLoadSuccess: handleImageLinkLoadSuccess,
  70. onReUpload: handleReUpload,
  71. onClear: handleClear,
  72. }
  73. }