dify/web/app/components/datasets/common/image-list/index.tsx
Stephen Zhou a84c2d36a3
style: format with vp fmt (#38803)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-07-12 15:57:46 +00:00

79 lines
2.1 KiB
TypeScript

import type { ImageInfo } from '../image-previewer'
import type { FileEntity } from '@/app/components/base/file-thumb'
import { cn } from '@langgenius/dify-ui/cn'
import { useCallback, useMemo, useState } from 'react'
import FileThumb from '@/app/components/base/file-thumb'
import ImagePreviewer from '../image-previewer'
import More from './more'
type Image = {
name: string
mimeType: string
sourceUrl: string
size: number
extension: string
}
type ImageListProps = {
images: Image[]
size: 'sm' | 'md'
limit?: number
className?: string
}
const ImageList = ({ images, size, limit = 9, className }: ImageListProps) => {
const [showMore, setShowMore] = useState(false)
const [previewIndex, setPreviewIndex] = useState(0)
const [previewImages, setPreviewImages] = useState<ImageInfo[]>([])
const limitedImages = useMemo(() => {
return showMore ? images : images.slice(0, limit)
}, [images, limit, showMore])
const handleShowMore = useCallback(() => {
setShowMore(true)
}, [])
const handleImageClick = useCallback(
(file: FileEntity) => {
const index = limitedImages.findIndex((image) => image.sourceUrl === file.sourceUrl)
if (index === -1) return
setPreviewIndex(index)
setPreviewImages(
limitedImages.map((image) => ({
url: image.sourceUrl,
name: image.name,
size: image.size,
})),
)
},
[limitedImages],
)
const handleClosePreview = useCallback(() => {
setPreviewImages([])
}, [])
return (
<>
<div className={cn('flex flex-wrap gap-1', className)}>
{limitedImages.map((image) => (
<FileThumb key={image.sourceUrl} file={image} size={size} onClick={handleImageClick} />
))}
{images.length > limit && !showMore && (
<More count={images.length - limitedImages.length} onClick={handleShowMore} />
)}
</div>
{previewImages.length > 0 && (
<ImagePreviewer
images={previewImages}
initialIndex={previewIndex}
onClose={handleClosePreview}
/>
)}
</>
)
}
export default ImageList