'use client'; import { useState, useEffect } from 'react'; import { Modal, Button } from './index'; import { ChevronLeft, ChevronRight } from 'lucide-react'; import Image from '../../embed-shims/next-image'; interface ImageGalleryModalProps { images: string[]; isOpen: boolean; onClose: () => void; initialIndex?: number; } /** * Full-screen image gallery modal * Reusable component extracted from TMCG event detail page * Features: Keyboard navigation, prev/next buttons, image counter */ export function ImageGalleryModal({ images, isOpen, onClose, initialIndex = 0, }: ImageGalleryModalProps) { const [selectedImageIndex, setSelectedImageIndex] = useState(initialIndex); // Reset to initial index when modal opens useEffect(() => { if (isOpen) { setSelectedImageIndex(initialIndex); } }, [isOpen, initialIndex]); const goToPreviousImage = () => { if (selectedImageIndex > 0) { setSelectedImageIndex(selectedImageIndex - 1); } }; const goToNextImage = () => { if (selectedImageIndex < images.length - 1) { setSelectedImageIndex(selectedImageIndex + 1); } }; // Keyboard navigation useEffect(() => { const handleKeyPress = (event: KeyboardEvent) => { if (!isOpen) return; switch (event.key) { case 'ArrowLeft': event.preventDefault(); goToPreviousImage(); break; case 'ArrowRight': event.preventDefault(); goToNextImage(); break; case 'Escape': event.preventDefault(); onClose(); break; } }; if (isOpen) { document.addEventListener('keydown', handleKeyPress); return () => { document.removeEventListener('keydown', handleKeyPress); }; } }, [isOpen, selectedImageIndex, images.length]); if (!isOpen || images.length === 0) return null; return (
{/* Navigation Buttons */} {images.length > 1 && ( <> {selectedImageIndex > 0 && (
)} {selectedImageIndex < images.length - 1 && (
)} )} {/* Current Image */} {images[selectedImageIndex] && (
{`Screenshot { // Handle HEIC and other unsupported formats const target = e.target as HTMLImageElement; const imageUrl = images[selectedImageIndex]; const isHeic = imageUrl.toLowerCase().match(/\.heic$/); target.style.display = 'none'; const parent = target.parentElement; if (parent && !parent.querySelector('.image-error')) { const errorDiv = document.createElement('div'); errorDiv.className = 'image-error flex flex-col items-center justify-center text-white text-center px-8'; errorDiv.innerHTML = `

${isHeic ? 'HEIC format not supported in browser' : 'Failed to load image'}

Download original file `; parent.appendChild(errorDiv); } }} />
)} {/* Image Counter */} {images.length > 1 && (
{selectedImageIndex + 1} / {images.length}
)}
); }