index.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React, { useState } from 'react'
  4. import cn from 'classnames'
  5. import s from './style.module.css'
  6. import ImagePreview from '@/app/components/base/image-uploader/image-preview'
  7. type Props = {
  8. srcs: string[]
  9. }
  10. const getWidthStyle = (imgNum: number) => {
  11. if (imgNum === 1) {
  12. return {
  13. maxWidth: '100%',
  14. }
  15. }
  16. if (imgNum === 2 || imgNum === 4) {
  17. return {
  18. width: 'calc(50% - 4px)',
  19. }
  20. }
  21. return {
  22. width: 'calc(33.3333% - 5.3333px)',
  23. }
  24. }
  25. const ImageGallery: FC<Props> = ({
  26. srcs,
  27. }) => {
  28. const [imagePreviewUrl, setImagePreviewUrl] = useState('')
  29. const imgNum = srcs.length
  30. const imgStyle = getWidthStyle(imgNum)
  31. return (
  32. <div className={cn(s[`img-${imgNum}`], 'flex flex-wrap')}>
  33. {/* TODO: support preview */}
  34. {srcs.map((src, index) => (
  35. // eslint-disable-next-line @next/next/no-img-element
  36. <img
  37. key={index}
  38. className={s.item}
  39. style={imgStyle}
  40. src={src}
  41. alt=''
  42. onClick={() => setImagePreviewUrl(src)}
  43. />
  44. ))}
  45. {
  46. imagePreviewUrl && (
  47. <ImagePreview
  48. url={imagePreviewUrl}
  49. onCancel={() => setImagePreviewUrl('')}
  50. />
  51. )
  52. }
  53. </div>
  54. )
  55. }
  56. export default React.memo(ImageGallery)
  57. export const ImageGalleryTest = () => {
  58. const imgGallerySrcs = (() => {
  59. const srcs = []
  60. for (let i = 0; i < 6; i++)
  61. // srcs.push('https://placekitten.com/640/360')
  62. // srcs.push('https://placekitten.com/360/640')
  63. srcs.push('https://placekitten.com/360/360')
  64. return srcs
  65. })()
  66. return (
  67. <div className='space-y-2'>
  68. {imgGallerySrcs.map((_, index) => (
  69. <div key={index} className='p-4 pb-2 rounded-lg bg-[#D1E9FF80]'>
  70. <ImageGallery srcs={imgGallerySrcs.slice(0, index + 1)} />
  71. </div>
  72. ))}
  73. </div>
  74. )
  75. }