| '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> |
| ) |
| } |
|
|