"use client" import * as Dialog from "@radix-ui/react-dialog" import { AnimatePresence, motion } from "framer-motion" import React, { useState } from "react" import FullView from "./FullView" import Gallery from "./Gallery" import styles from "./Lightbox.module.css" import type { LightboxProps } from "@/types/components/lightbox/lightbox" export default function Lightbox({ images, children, dialogTitle, }: LightboxProps) { const [isOpen, setIsOpen] = useState(false) const [selectedImageIndex, setSelectedImageIndex] = useState(0) const [isFullView, setIsFullView] = useState(false) function handleOpenChange(open: boolean) { if (!open) { setTimeout(() => { setIsOpen(false) setSelectedImageIndex(0) setIsFullView(false) }, 300) // 300ms delay } else { setIsOpen(true) } } function handleNext() { setSelectedImageIndex((prevIndex) => (prevIndex + 1) % images.length) } function handlePrev() { setSelectedImageIndex( (prevIndex) => (prevIndex - 1 + images.length) % images.length ) } const triggerElement = React.Children.map( children, function mapChild(child): React.ReactNode { if (React.isValidElement(child)) { if (child.props.id === "lightboxTrigger") { return React.cloneElement(child, { onClick: () => setIsOpen(true), } as React.HTMLAttributes) } else if (child.props.children) { return React.cloneElement(child, { children: React.Children.map(child.props.children, mapChild), } as React.HTMLAttributes) } } return child } ) return ( <> {triggerElement} {isOpen && ( {isFullView ? ( setIsFullView(false)} onNext={handleNext} onPrev={handlePrev} currentIndex={selectedImageIndex} totalImages={images.length} /> ) : ( setIsOpen(false)} onSelectImage={(image) => { setSelectedImageIndex( images.findIndex((img) => img.url === image.url) ) }} onImageClick={() => setIsFullView(true)} selectedImage={images[selectedImageIndex]} /> )} )} ) }