|
@@ -1,7 +1,11 @@
|
|
|
import type { FC } from 'react'
|
|
|
import { useState } from 'react'
|
|
|
import { useTranslation } from 'react-i18next'
|
|
|
-import { Loading02, XClose } from '@/app/components/base/icons/src/vender/line/general'
|
|
|
+import cn from 'classnames'
|
|
|
+import {
|
|
|
+ Loading02,
|
|
|
+ XClose,
|
|
|
+} from '@/app/components/base/icons/src/vender/line/general'
|
|
|
import { RefreshCcw01 } from '@/app/components/base/icons/src/vender/line/arrows'
|
|
|
import { AlertTriangle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback'
|
|
|
import TooltipPlus from '@/app/components/base/tooltip-plus'
|
|
@@ -30,7 +34,11 @@ const ImageList: FC<ImageListProps> = ({
|
|
|
const [imagePreviewUrl, setImagePreviewUrl] = useState('')
|
|
|
|
|
|
const handleImageLinkLoadSuccess = (item: ImageFile) => {
|
|
|
- if (item.type === TransferMethod.remote_url && onImageLinkLoadSuccess && item.progress !== -1)
|
|
|
+ if (
|
|
|
+ item.type === TransferMethod.remote_url
|
|
|
+ && onImageLinkLoadSuccess
|
|
|
+ && item.progress !== -1
|
|
|
+ )
|
|
|
onImageLinkLoadSuccess(item._id)
|
|
|
}
|
|
|
const handleImageLinkLoadError = (item: ImageFile) => {
|
|
@@ -39,89 +47,95 @@ const ImageList: FC<ImageListProps> = ({
|
|
|
}
|
|
|
|
|
|
return (
|
|
|
- <div className='flex flex-wrap'>
|
|
|
- {
|
|
|
- list.map(item => (
|
|
|
- <div
|
|
|
- key={item._id}
|
|
|
- className='group relative mr-1 border-[0.5px] border-black/5 rounded-lg'
|
|
|
- >
|
|
|
- {
|
|
|
- item.type === TransferMethod.local_file && item.progress !== 100 && (
|
|
|
- <>
|
|
|
- <div
|
|
|
- className='absolute inset-0 flex items-center justify-center z-[1] bg-black/30'
|
|
|
- style={{ left: item.progress > -1 ? `${item.progress}%` : 0 }}
|
|
|
- >
|
|
|
- {
|
|
|
- item.progress === -1 && (
|
|
|
- <RefreshCcw01 className='w-5 h-5 text-white' onClick={() => onReUpload && onReUpload(item._id)} />
|
|
|
- )
|
|
|
- }
|
|
|
- </div>
|
|
|
- {
|
|
|
- item.progress > -1 && (
|
|
|
- <span className='absolute top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%] text-sm text-white mix-blend-lighten z-[1]'>{item.progress}%</span>
|
|
|
- )
|
|
|
- }
|
|
|
- </>
|
|
|
- )
|
|
|
- }
|
|
|
- {
|
|
|
- item.type === TransferMethod.remote_url && item.progress !== 100 && (
|
|
|
- <div className={`
|
|
|
+ <div className="flex flex-wrap">
|
|
|
+ {list.map(item => (
|
|
|
+ <div
|
|
|
+ key={item._id}
|
|
|
+ className="group relative mr-1 border-[0.5px] border-black/5 rounded-lg"
|
|
|
+ >
|
|
|
+ {item.type === TransferMethod.local_file && item.progress !== 100 && (
|
|
|
+ <>
|
|
|
+ <div
|
|
|
+ className="absolute inset-0 flex items-center justify-center z-[1] bg-black/30"
|
|
|
+ style={{ left: item.progress > -1 ? `${item.progress}%` : 0 }}
|
|
|
+ >
|
|
|
+ {item.progress === -1 && (
|
|
|
+ <RefreshCcw01
|
|
|
+ className="w-5 h-5 text-white"
|
|
|
+ onClick={() => onReUpload && onReUpload(item._id)}
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ {item.progress > -1 && (
|
|
|
+ <span className="absolute top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%] text-sm text-white mix-blend-lighten z-[1]">
|
|
|
+ {item.progress}%
|
|
|
+ </span>
|
|
|
+ )}
|
|
|
+ </>
|
|
|
+ )}
|
|
|
+ {item.type === TransferMethod.remote_url && item.progress !== 100 && (
|
|
|
+ <div
|
|
|
+ className={`
|
|
|
absolute inset-0 flex items-center justify-center rounded-lg z-[1] border
|
|
|
- ${item.progress === -1 ? 'bg-[#FEF0C7] border-[#DC6803]' : 'bg-black/[0.16] border-transparent'}
|
|
|
- `}>
|
|
|
- {
|
|
|
- item.progress > -1 && (
|
|
|
- <Loading02 className='animate-spin w-5 h-5 text-white' />
|
|
|
- )
|
|
|
- }
|
|
|
- {
|
|
|
- item.progress === -1 && (
|
|
|
- <TooltipPlus popupContent={t('common.imageUploader.pasteImageLinkInvalid')}>
|
|
|
- <AlertTriangle className='w-4 h-4 text-[#DC6803]' />
|
|
|
- </TooltipPlus>
|
|
|
- )
|
|
|
- }
|
|
|
- </div>
|
|
|
- )
|
|
|
+ ${
|
|
|
+ item.progress === -1
|
|
|
+ ? 'bg-[#FEF0C7] border-[#DC6803]'
|
|
|
+ : 'bg-black/[0.16] border-transparent'
|
|
|
}
|
|
|
- <img
|
|
|
- className='w-16 h-16 rounded-lg object-cover cursor-pointer border-[0.5px] border-black/5'
|
|
|
- alt=''
|
|
|
- onLoad={() => handleImageLinkLoadSuccess(item)}
|
|
|
- onError={() => handleImageLinkLoadError(item)}
|
|
|
- src={item.type === TransferMethod.remote_url ? item.url : item.base64Url}
|
|
|
- onClick={() => item.progress === 100 && setImagePreviewUrl((item.type === TransferMethod.remote_url ? item.url : item.base64Url) as string)}
|
|
|
- />
|
|
|
- {
|
|
|
- !readonly && (
|
|
|
- <div
|
|
|
- className={`
|
|
|
- absolute z-10 -top-[9px] -right-[9px] items-center justify-center w-[18px] h-[18px]
|
|
|
- bg-white hover:bg-gray-50 border-[0.5px] border-black/[0.02] rounded-2xl shadow-lg
|
|
|
- cursor-pointer
|
|
|
- ${item.progress === -1 ? 'flex' : 'hidden group-hover:flex'}
|
|
|
- `}
|
|
|
- onClick={() => onRemove && onRemove(item._id)}
|
|
|
+ `}
|
|
|
+ >
|
|
|
+ {item.progress > -1 && (
|
|
|
+ <Loading02 className="animate-spin w-5 h-5 text-white" />
|
|
|
+ )}
|
|
|
+ {item.progress === -1 && (
|
|
|
+ <TooltipPlus
|
|
|
+ popupContent={t('common.imageUploader.pasteImageLinkInvalid')}
|
|
|
>
|
|
|
- <XClose className='w-3 h-3 text-gray-500' />
|
|
|
- </div>
|
|
|
+ <AlertTriangle className="w-4 h-4 text-[#DC6803]" />
|
|
|
+ </TooltipPlus>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+ <img
|
|
|
+ className="w-16 h-16 rounded-lg object-cover cursor-pointer border-[0.5px] border-black/5"
|
|
|
+ alt={item.file?.name}
|
|
|
+ onLoad={() => handleImageLinkLoadSuccess(item)}
|
|
|
+ onError={() => handleImageLinkLoadError(item)}
|
|
|
+ src={
|
|
|
+ item.type === TransferMethod.remote_url
|
|
|
+ ? item.url
|
|
|
+ : item.base64Url
|
|
|
+ }
|
|
|
+ onClick={() =>
|
|
|
+ item.progress === 100
|
|
|
+ && setImagePreviewUrl(
|
|
|
+ (item.type === TransferMethod.remote_url
|
|
|
+ ? item.url
|
|
|
+ : item.base64Url) as string,
|
|
|
)
|
|
|
}
|
|
|
- </div>
|
|
|
- ))
|
|
|
- }
|
|
|
- {
|
|
|
- imagePreviewUrl && (
|
|
|
- <ImagePreview
|
|
|
- url={imagePreviewUrl}
|
|
|
- onCancel={() => setImagePreviewUrl('')}
|
|
|
/>
|
|
|
- )
|
|
|
- }
|
|
|
+ {!readonly && (
|
|
|
+ <button
|
|
|
+ type="button"
|
|
|
+ className={cn(
|
|
|
+ 'absolute z-10 -top-[9px] -right-[9px] items-center justify-center w-[18px] h-[18px]',
|
|
|
+ 'bg-white hover:bg-gray-50 border-[0.5px] border-black/[0.02] rounded-2xl shadow-lg',
|
|
|
+ item.progress === -1 ? 'flex' : 'hidden group-hover:flex',
|
|
|
+ )}
|
|
|
+ onClick={() => onRemove && onRemove(item._id)}
|
|
|
+ >
|
|
|
+ <XClose className="w-3 h-3 text-gray-500" />
|
|
|
+ </button>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ ))}
|
|
|
+ {imagePreviewUrl && (
|
|
|
+ <ImagePreview
|
|
|
+ url={imagePreviewUrl}
|
|
|
+ onCancel={() => setImagePreviewUrl('')}
|
|
|
+ />
|
|
|
+ )}
|
|
|
</div>
|
|
|
)
|
|
|
}
|