'use client'; import React, { useEffect, useState, useCallback } from 'react'; import Image from 'next/image'; import { createPortal } from 'react-dom'; interface LightboxProps { isOpen: boolean; images: string[]; initialIndex: number; onClose: () => void; } export default function Lightbox({ isOpen, images, initialIndex, onClose }: LightboxProps) { const [currentIndex, setCurrentIndex] = useState(initialIndex); const [mounted, setMounted] = useState(false); useEffect(() => { setMounted(true); return () => setMounted(false); }, []); const prevImage = useCallback(() => { setCurrentIndex((prev) => (prev === 0 ? images.length - 1 : prev - 1)); }, [images.length]); const nextImage = useCallback(() => { setCurrentIndex((prev) => (prev === images.length - 1 ? 0 : prev + 1)); }, [images.length]); useEffect(() => { if (!isOpen) return; const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); if (e.key === 'ArrowLeft') prevImage(); if (e.key === 'ArrowRight') nextImage(); }; // Lock scroll const originalStyle = window.getComputedStyle(document.body).overflow; document.body.style.overflow = 'hidden'; window.addEventListener('keydown', handleKeyDown); return () => { document.body.style.overflow = originalStyle; window.removeEventListener('keydown', handleKeyDown); }; }, [isOpen, onClose, prevImage, nextImage]); if (!isOpen || !mounted) return null; return createPortal(
{`Gallery
{currentIndex + 1} / {images.length}
{/* Backdrop click to close */}
, document.body ); }