"use client" import { AnimatePresence, motion } from "motion/react" import { useMemo, useState } from "react" import { Button as ButtonRAC } from "react-aria-components" import { useIntl } from "react-intl" import { IconButton } from "../../IconButton" import { Typography } from "../../Typography" import Image from "../../Image" import { cx } from "class-variance-authority" import { useMediaQuery } from "usehooks-ts" import { LightboxImage } from ".." import styles from "./gallery.module.css" import { ImageCounter } from "../../ImageCounter" import { animationVariants, useKeyboardNavigation } from "../util" import { ThumbnailImage } from "./ThumnailImage" import { useThumbnail } from "./useThumbNail" interface GalleryProps { images: LightboxImage[] onClose: () => void onSelectImage: (image: LightboxImage) => void onImageClick: () => void selectedImage: LightboxImage | null hideLabel?: boolean } export function Gallery({ images, onClose, onSelectImage, onImageClick, selectedImage, hideLabel, }: GalleryProps) { const intl = useIntl() const [slideDirection, setSlideDirection] = useState<"left" | "right">("left") const isMobile = useMediaQuery("(max-width: 767px)") const mainImage = selectedImage || images[0] const mainImageIndex = useMemo( () => images.findIndex((img) => img === mainImage), [images, mainImage] ) const thumbnail = useThumbnail({ images: images, mainImageIdx: mainImageIndex, }) function handleNext() { setSlideDirection("left") const nextIndex = (mainImageIndex + 1) % images.length onSelectImage(images[nextIndex]) } function handlePrev() { setSlideDirection("right") const prevIndex = (mainImageIndex - 1 + images.length) % images.length onSelectImage(images[prevIndex]) } useKeyboardNavigation(handlePrev, handleNext) const hasPrevImage = thumbnail.previous !== undefined const hasNextImage = thumbnail.next !== undefined return (
{mainImage.caption && !hideLabel && ( {mainImage.caption} )}