hooks.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import { useMemo, useRef, 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 filesRef = useRef<ImageFile[]>([])
  13. const handleUpload = (imageFile: ImageFile) => {
  14. const files = filesRef.current
  15. const index = files.findIndex(file => file._id === imageFile._id)
  16. if (index > -1) {
  17. const currentFile = files[index]
  18. const newFiles = [...files.slice(0, index), { ...currentFile, ...imageFile }, ...files.slice(index + 1)]
  19. setFiles(newFiles)
  20. filesRef.current = newFiles
  21. }
  22. else {
  23. const newFiles = [...files, imageFile]
  24. setFiles(newFiles)
  25. filesRef.current = newFiles
  26. }
  27. }
  28. const handleRemove = (imageFileId: string) => {
  29. const files = filesRef.current
  30. const index = files.findIndex(file => file._id === imageFileId)
  31. if (index > -1) {
  32. const currentFile = files[index]
  33. const newFiles = [...files.slice(0, index), { ...currentFile, deleted: true }, ...files.slice(index + 1)]
  34. setFiles(newFiles)
  35. filesRef.current = newFiles
  36. }
  37. }
  38. const handleImageLinkLoadError = (imageFileId: string) => {
  39. const files = filesRef.current
  40. const index = files.findIndex(file => file._id === imageFileId)
  41. if (index > -1) {
  42. const currentFile = files[index]
  43. const newFiles = [...files.slice(0, index), { ...currentFile, progress: -1 }, ...files.slice(index + 1)]
  44. filesRef.current = newFiles
  45. setFiles(newFiles)
  46. }
  47. }
  48. const handleImageLinkLoadSuccess = (imageFileId: string) => {
  49. const files = filesRef.current
  50. const index = files.findIndex(file => file._id === imageFileId)
  51. if (index > -1) {
  52. const currentImageFile = files[index]
  53. const newFiles = [...files.slice(0, index), { ...currentImageFile, progress: 100 }, ...files.slice(index + 1)]
  54. filesRef.current = newFiles
  55. setFiles(newFiles)
  56. }
  57. }
  58. const handleReUpload = (imageFileId: string) => {
  59. const files = filesRef.current
  60. const index = files.findIndex(file => file._id === imageFileId)
  61. if (index > -1) {
  62. const currentImageFile = files[index]
  63. imageUpload({
  64. file: currentImageFile.file!,
  65. onProgressCallback: (progress) => {
  66. const newFiles = [...files.slice(0, index), { ...currentImageFile, progress }, ...files.slice(index + 1)]
  67. filesRef.current = newFiles
  68. setFiles(newFiles)
  69. },
  70. onSuccessCallback: (res) => {
  71. const newFiles = [...files.slice(0, index), { ...currentImageFile, fileId: res.id, progress: 100 }, ...files.slice(index + 1)]
  72. filesRef.current = newFiles
  73. setFiles(newFiles)
  74. },
  75. onErrorCallback: () => {
  76. notify({ type: 'error', message: t('common.imageUploader.uploadFromComputerUploadError') })
  77. const newFiles = [...files.slice(0, index), { ...currentImageFile, progress: -1 }, ...files.slice(index + 1)]
  78. filesRef.current = newFiles
  79. setFiles(newFiles)
  80. },
  81. }, !!params.token)
  82. }
  83. }
  84. const handleClear = () => {
  85. setFiles([])
  86. filesRef.current = []
  87. }
  88. const filteredFiles = useMemo(() => {
  89. return files.filter(file => !file.deleted)
  90. }, [files])
  91. return {
  92. files: filteredFiles,
  93. onUpload: handleUpload,
  94. onRemove: handleRemove,
  95. onImageLinkLoadError: handleImageLinkLoadError,
  96. onImageLinkLoadSuccess: handleImageLinkLoadSuccess,
  97. onReUpload: handleReUpload,
  98. onClear: handleClear,
  99. }
  100. }