diff --git a/frontend/app/(main)/gallery/page.tsx b/frontend/app/(main)/gallery/page.tsx index fa9493b..83206c4 100644 --- a/frontend/app/(main)/gallery/page.tsx +++ b/frontend/app/(main)/gallery/page.tsx @@ -11,6 +11,10 @@ import { } from "@/components/ui/pagination"; import useMedia from "@/hooks/use-media"; import { Loader2 } from "lucide-react"; +import Lightbox from "yet-another-react-lightbox"; +import "yet-another-react-lightbox/styles.css"; +import Zoom from "yet-another-react-lightbox/plugins/zoom"; +import { useState } from "react"; export default function PhotoGallery() { const { @@ -23,6 +27,8 @@ export default function PhotoGallery() { mutate, } = useMedia(); + const [index, setIndex] = useState(null); + return (
@@ -34,11 +40,11 @@ export default function PhotoGallery() {
) : (
- {data?.items.map((photo) => ( + {data?.items.map((photo, idx) => (
{}} + onClick={() => setIndex(idx)} >
))} + setIndex(null)} + slides={data?.items.map((i) => ({ src: i.url }))} + index={index ?? 0} + plugins={[Zoom]} + />
)} diff --git a/frontend/components/homepage-gallery.tsx b/frontend/components/homepage-gallery.tsx index da78461..2b199e0 100644 --- a/frontend/components/homepage-gallery.tsx +++ b/frontend/components/homepage-gallery.tsx @@ -2,8 +2,11 @@ import useMedia from "@/hooks/use-media"; import { CarouselItem } from "./ui/carousel"; -import Image from "next/image"; import { Loader2 } from "lucide-react"; +import { useState } from "react"; +import Lightbox, { SlideImage } from "yet-another-react-lightbox"; +import "yet-another-react-lightbox/styles.css"; +import Zoom from "yet-another-react-lightbox/plugins/zoom"; export default function HomepageGalleryItems() { const { @@ -17,6 +20,8 @@ export default function HomepageGalleryItems() { isValidating, } = useMedia(20); + const [index, setIndex] = useState(null); + if (isLoading) { return (
@@ -27,8 +32,12 @@ export default function HomepageGalleryItems() { return ( <> - {data?.items.map((i) => ( - + {data?.items.map((i, idx) => ( + setIndex(idx)} + className="pl-[20px] md:max-w-[452px] cursor-pointer" + >
))} + setIndex(null)} + slides={data?.items.map((i) => ({ src: i.url }))} + index={index ?? 0} + plugins={[Zoom]} + /> ); } diff --git a/frontend/components/photo-viewer.tsx b/frontend/components/photo-viewer.tsx new file mode 100644 index 0000000..a56f45a --- /dev/null +++ b/frontend/components/photo-viewer.tsx @@ -0,0 +1,27 @@ +"use client"; + +import { + Dialog, + DialogContent, + DialogTitle, + DialogTrigger, +} from "@radix-ui/react-dialog"; +import Image, { ImageProps } from "next/image"; +import React, { useState } from "react"; + +const PhotoViewer: React.FC = ({ ...props }) => { + const [selected, setSelected] = useState(false); + return ( + + {props.alt} + + setSelected(true)} {...props} /> + + + + + + ); +}; + +export default PhotoViewer; diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 99465b9..b0b5ba0 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -52,6 +52,7 @@ "swr": "^2.3.0", "tailwind-merge": "^2.6.0", "tailwindcss-animate": "^1.0.7", + "yet-another-react-lightbox": "^3.21.7", "zod": "^3.24.1" }, "devDependencies": { @@ -7783,6 +7784,19 @@ "node": ">= 14" } }, + "node_modules/yet-another-react-lightbox": { + "version": "3.21.7", + "resolved": "https://registry.npmjs.org/yet-another-react-lightbox/-/yet-another-react-lightbox-3.21.7.tgz", + "integrity": "sha512-dcdokNuCIl92f0Vl+uzeKULnQhztIGpoZFUMvtVNUPmtwsQWpqWufeieDPeg9JtFyVCcbj4vYw3V00DS0QNoWA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 384acbb..9e88078 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -53,6 +53,7 @@ "swr": "^2.3.0", "tailwind-merge": "^2.6.0", "tailwindcss-animate": "^1.0.7", + "yet-another-react-lightbox": "^3.21.7", "zod": "^3.24.1" }, "devDependencies": {