gallery implementation
This commit is contained in:
parent
5c1a068e2f
commit
c87e0ed7f6
10 changed files with 145 additions and 541 deletions
|
@ -1,6 +1,5 @@
|
|||
import NextImage, { ImageProps } from 'next/image'
|
||||
import { ItemRef } from 'react-photoswipe-gallery'
|
||||
|
||||
const Image = ({ ...rest }: ImageProps & { ref?: ItemRef }) => <NextImage {...rest} />
|
||||
const Image = ({ ...rest }: ImageProps) => <NextImage {...rest} />
|
||||
|
||||
export default Image
|
||||
|
|
|
@ -4,7 +4,7 @@ import YoutubeVideo from './YouTubeVideo'
|
|||
const MediaItem = (props) => {
|
||||
const { type, title, data } = props
|
||||
|
||||
if (type !== 'video' && type !== 'photos') return null
|
||||
if ((type !== 'video' && type !== 'photos') || !data) return null
|
||||
|
||||
const item =
|
||||
type === 'video' ? (
|
||||
|
|
|
@ -1,20 +1,43 @@
|
|||
import 'photoswipe/dist/photoswipe.css'
|
||||
import { Gallery, Item } from 'react-photoswipe-gallery'
|
||||
import { useState } from 'react'
|
||||
import Lightbox from 'react-image-lightbox'
|
||||
import 'react-image-lightbox/style.css'
|
||||
import Image from './Image'
|
||||
|
||||
const PhotoGallery = (props) => {
|
||||
const { title, data } = props
|
||||
const [isOpen, setIsOpen] = useState(false)
|
||||
const [photoIndex, setPhotoIndex] = useState(0)
|
||||
|
||||
return (
|
||||
<Gallery>
|
||||
<div className="flex flex-row gap-2 p-2">
|
||||
{data.length
|
||||
? data.map((d: string) => (
|
||||
<Item cropped key={d}>
|
||||
{({ ref, open }) => <Image alt={title} ref={ref} onClick={open} src={d} />}
|
||||
</Item>
|
||||
? data.map((d: string, index: number) => (
|
||||
<Image
|
||||
key={d}
|
||||
alt={title}
|
||||
onClick={() => {
|
||||
setPhotoIndex(index)
|
||||
setIsOpen(true)
|
||||
}}
|
||||
src={d}
|
||||
className="w-full cursor-pointer object-cover"
|
||||
width="300px"
|
||||
height="300px"
|
||||
/>
|
||||
))
|
||||
: null}
|
||||
</Gallery>
|
||||
|
||||
{isOpen && (
|
||||
<Lightbox
|
||||
mainSrc={data[photoIndex]}
|
||||
nextSrc={data[(photoIndex + 1) % data.length]}
|
||||
prevSrc={data[(photoIndex + data.length - 1) % data.length]}
|
||||
onCloseRequest={() => setIsOpen(false)}
|
||||
onMovePrevRequest={() => setPhotoIndex((photoIndex + data.length - 1) % data.length)}
|
||||
onMoveNextRequest={() => setPhotoIndex((photoIndex + 1) % data.length)}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue