|
'use client' |
|
import type { FC } from 'react' |
|
import React, { useState } from 'react' |
|
import s from './style.module.css' |
|
import cn from '@/utils/classnames' |
|
import ImagePreview from '@/app/components/base/image-uploader/image-preview' |
|
|
|
type Props = { |
|
srcs: string[] |
|
} |
|
|
|
const getWidthStyle = (imgNum: number) => { |
|
if (imgNum === 1) { |
|
return { |
|
maxWidth: '100%', |
|
} |
|
} |
|
|
|
if (imgNum === 2 || imgNum === 4) { |
|
return { |
|
width: 'calc(50% - 4px)', |
|
} |
|
} |
|
|
|
return { |
|
width: 'calc(33.3333% - 5.3333px)', |
|
} |
|
} |
|
|
|
const ImageGallery: FC<Props> = ({ |
|
srcs, |
|
}) => { |
|
const [imagePreviewUrl, setImagePreviewUrl] = useState('') |
|
|
|
const imgNum = srcs.length |
|
const imgStyle = getWidthStyle(imgNum) |
|
return ( |
|
<div className={cn(s[`img-${imgNum}`], 'flex flex-wrap')}> |
|
{/* TODO: support preview */} |
|
{srcs.map((src, index) => ( |
|
// eslint-disable-next-line @next/next/no-img-element |
|
<img |
|
key={index} |
|
className={s.item} |
|
style={imgStyle} |
|
src={src} |
|
alt='' |
|
onClick={() => setImagePreviewUrl(src)} |
|
onError={e => e.currentTarget.remove()} |
|
/> |
|
))} |
|
{ |
|
imagePreviewUrl && ( |
|
<ImagePreview |
|
url={imagePreviewUrl} |
|
onCancel={() => setImagePreviewUrl('')} |
|
/> |
|
) |
|
} |
|
</div> |
|
) |
|
} |
|
|
|
export default React.memo(ImageGallery) |
|
|
|
export const ImageGalleryTest = () => { |
|
const imgGallerySrcs = (() => { |
|
const srcs = [] |
|
for (let i = 0; i < 6; i++) |
|
|
|
|
|
srcs.push('https://placekitten.com/360/360') |
|
|
|
return srcs |
|
})() |
|
return ( |
|
<div className='space-y-2'> |
|
{imgGallerySrcs.map((_, index) => ( |
|
<div key={index} className='p-4 pb-2 rounded-lg bg-[#D1E9FF80]'> |
|
<ImageGallery srcs={imgGallerySrcs.slice(0, index + 1)} /> |
|
</div> |
|
))} |
|
</div> |
|
) |
|
} |
|
|