index.tsx 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React, { useState } from 'react'
  4. import s from './style.module.css'
  5. import cn from '@/utils/classnames'
  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. <img
  36. key={index}
  37. className={s.item}
  38. style={imgStyle}
  39. src={src}
  40. alt=''
  41. onClick={() => setImagePreviewUrl(src)}
  42. onError={e => e.currentTarget.remove()}
  43. />
  44. ))}
  45. {
  46. imagePreviewUrl && (
  47. <ImagePreview
  48. url={imagePreviewUrl}
  49. onCancel={() => setImagePreviewUrl('')} title={''} />
  50. )
  51. }
  52. </div>
  53. )
  54. }
  55. export default React.memo(ImageGallery)
  56. export const ImageGalleryTest = () => {
  57. const imgGallerySrcs = (() => {
  58. const srcs = []
  59. for (let i = 0; i < 6; i++)
  60. // srcs.push('https://placekitten.com/640/360')
  61. // srcs.push('https://placekitten.com/360/640')
  62. srcs.push('https://placekitten.com/360/360')
  63. return srcs
  64. })()
  65. return (
  66. <div className='space-y-2'>
  67. {imgGallerySrcs.map((_, index) => (
  68. <div key={index} className='rounded-lg bg-[#D1E9FF80] p-4 pb-2'>
  69. <ImageGallery srcs={imgGallerySrcs.slice(0, index + 1)} />
  70. </div>
  71. ))}
  72. </div>
  73. )
  74. }