import React, { useState } from 'react'; import { useTranslation } from '@/hooks/useI18n.tsx'; import { Eye, Trash2, UploadCloud } from 'lucide-react'; import Button from '@/components/ui/Button.tsx'; import { Card, CardContent } from '@/components/ui/Card.tsx'; interface ImageGalleryProps { images: string[]; onChange?: (images: string[]) => void; maxImages?: number; className?: string; editable?: boolean; title?: string; } const ImageGallery: React.FC = ({ images = [], onChange, maxImages = 10, className = '', editable = false, title }) => { const { t } = useTranslation(); const [selectedImageIndex, setSelectedImageIndex] = useState(null); const handleImageUpload = (event: React.ChangeEvent) => { const files = event.target.files; if (!files || !onChange) return; const newImages: string[] = []; Array.from(files).forEach(file => { if (images.length + newImages.length >= maxImages) return; const reader = new FileReader(); reader.onload = (e) => { const result = e.target?.result as string; if (result) { newImages.push(result); if (newImages.length === files.length || images.length + newImages.length >= maxImages) { onChange([...images, ...newImages]); } } }; reader.readAsDataURL(file); }); }; const handleRemoveImage = (index: number) => { if (!onChange) return; const newImages = images.filter((_, i) => i !== index); onChange(newImages); }; const openLightbox = (index: number) => { setSelectedImageIndex(index); }; const closeLightbox = () => { setSelectedImageIndex(null); }; const goToPrevious = () => { if (selectedImageIndex === null) return; setSelectedImageIndex(selectedImageIndex > 0 ? selectedImageIndex - 1 : images.length - 1); }; const goToNext = () => { if (selectedImageIndex === null) return; setSelectedImageIndex(selectedImageIndex < images.length - 1 ? selectedImageIndex + 1 : 0); }; return (
{title && (

{title}

)}
{images.map((image, index) => (
{`${t('imageGallery.imageAlt')} openLightbox(index)} loading="lazy" onError={(e) => { (e.target as HTMLImageElement).style.display = 'none'; }} /> {/* Overlay with actions */}
{editable && onChange && ( )}
))} {/* Upload placeholder */} {editable && onChange && images.length < maxImages && (
)}
{images.length === 0 && !editable && (

{t('imageGallery.noImages')}

)} {/* Lightbox */} {selectedImageIndex !== null && (
{`${t('imageGallery.imageAlt')} {/* Navigation buttons */} {images.length > 1 && ( <> )} {/* Close button */} {/* Image counter */}
{selectedImageIndex + 1} / {images.length}
)}
); }; export default ImageGallery;