| 
									
										
										
										
											2023-11-13 22:32:39 +08:00
										 |  |  | 'use client' | 
					
						
							|  |  |  | import type { FC } from 'react' | 
					
						
							|  |  |  | import React, { useState } from 'react' | 
					
						
							|  |  |  | import s from './style.module.css' | 
					
						
							| 
									
										
										
										
											2024-07-09 15:05:40 +08:00
										 |  |  | import cn from '@/utils/classnames' | 
					
						
							| 
									
										
										
										
											2023-11-13 22:32:39 +08:00
										 |  |  | 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) => ( | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-13 22:32:39 +08:00
										 |  |  |         <img | 
					
						
							|  |  |  |           key={index} | 
					
						
							|  |  |  |           className={s.item} | 
					
						
							|  |  |  |           style={imgStyle} | 
					
						
							|  |  |  |           src={src} | 
					
						
							|  |  |  |           alt='' | 
					
						
							|  |  |  |           onClick={() => setImagePreviewUrl(src)} | 
					
						
							| 
									
										
										
										
											2024-06-26 13:21:40 +08:00
										 |  |  |           onError={e => e.currentTarget.remove()} | 
					
						
							| 
									
										
										
										
											2023-11-13 22:32:39 +08:00
										 |  |  |         /> | 
					
						
							|  |  |  |       ))} | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         imagePreviewUrl && ( | 
					
						
							|  |  |  |           <ImagePreview | 
					
						
							|  |  |  |             url={imagePreviewUrl} | 
					
						
							| 
									
										
										
										
											2024-12-05 10:15:21 +08:00
										 |  |  |             onCancel={() => setImagePreviewUrl('')} title={''} /> | 
					
						
							| 
									
										
										
										
											2023-11-13 22:32:39 +08:00
										 |  |  |         ) | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     </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/640/360')
 | 
					
						
							|  |  |  |       // srcs.push('https://placekitten.com/360/640')
 | 
					
						
							|  |  |  |       srcs.push('https://placekitten.com/360/360') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return srcs | 
					
						
							|  |  |  |   })() | 
					
						
							|  |  |  |   return ( | 
					
						
							|  |  |  |     <div className='space-y-2'> | 
					
						
							|  |  |  |       {imgGallerySrcs.map((_, index) => ( | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |         <div key={index} className='rounded-lg bg-[#D1E9FF80] p-4 pb-2'> | 
					
						
							| 
									
										
										
										
											2023-11-13 22:32:39 +08:00
										 |  |  |           <ImageGallery srcs={imgGallerySrcs.slice(0, index + 1)} /> | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  |       ))} | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | } |