import React, { useState, useCallback } from 'react' import { Box, Modal, ModalOverlay, ModalContent, ModalBody, ModalCloseButton, Flex, IconButton, HStack, Image, } from '@chakra-ui/react' import { ChevronLeftIcon, ChevronRightIcon } from "@chakra-ui/icons"; export interface GalleryImage { src: string alt?: string title?: string } export interface GalleryAttributes { images: GalleryImage[] columns?: number spacing?: number aspectRatio?: string } interface GalleryDisplayProps extends GalleryAttributes { editable?: boolean onEdit?: () => void } export const GalleryView: React.FC = ({ editable = false, onEdit, ...attrs }) => { const [selectedImage, setSelectedImage] = useState(null); const [selectedImageIndex, setSelectedImageIndex] = useState(0); const [isLightboxOpen, setIsLightboxOpen] = useState(false); const handleImageClick = (image: GalleryImage, index: number) => { setSelectedImage(image); setSelectedImageIndex(index); setIsLightboxOpen(true); }; const handlePrevImage = useCallback(() => { if (!attrs.images || attrs.images.length === 0) return; const newIndex = selectedImageIndex > 0 ? selectedImageIndex - 1 : attrs.images.length - 1; setSelectedImageIndex(newIndex); setSelectedImage(attrs.images[newIndex]); }, [selectedImageIndex, attrs.images]); const handleNextImage = useCallback(() => { if (!attrs.images || attrs.images.length === 0) return; const newIndex = selectedImageIndex < attrs.images.length - 1 ? selectedImageIndex + 1 : 0; setSelectedImageIndex(newIndex); setSelectedImage(attrs.images[newIndex]); }, [selectedImageIndex, attrs.images]); const handleThumbnailClick = (index: number) => { if (!attrs.images || attrs.images.length === 0) return; setSelectedImageIndex(index); setSelectedImage(attrs.images[index]); }; // Handle keyboard navigation const handleKeyDown = useCallback((e: React.KeyboardEvent) => { if (e.key === 'ArrowLeft') { handlePrevImage(); } else if (e.key === 'ArrowRight') { handleNextImage(); } }, [handlePrevImage, handleNextImage]); return ( {(attrs.images || [])?.map?.((image, index) => (
handleImageClick(image, index)} > {image.alt}
{ e.currentTarget.style.backgroundColor = 'rgba(0,0,0,0.2)'; }} onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'rgba(0,0,0,0)'; }} />
))} {/* Lightbox */} setIsLightboxOpen(false)} size="xl" > {selectedImage && ( {/* Left arrow */} } position="absolute" left="0" top="50%" transform="translateY(-50%)" onClick={handlePrevImage} variant="ghost" size="lg" zIndex={2} /> {/* Main image */} {selectedImage.alt} {/* Right arrow */} } position="absolute" right="0" top="50%" transform="translateY(-50%)" onClick={handleNextImage} variant="ghost" size="lg" zIndex={2} /> {/* Thumbnails */} {attrs.images.map((image, index) => ( handleThumbnailClick(index)} > {image.alt ))} )} ); }