import React, { useState, useEffect } from 'react'; import { Icons } from './IconSet'; interface GalleryImage { id: string; url: string; } interface GalleryManagementModalProps { isOpen: boolean; onClose: () => void; projectId: string; onUpdate: () => void; } const GalleryManagementModal: React.FC = ({ isOpen, onClose, projectId, onUpdate }) => { const [images, setImages] = useState([]); const [loading, setLoading] = useState(false); const [imageUrl, setImageUrl] = useState(''); const [error, setError] = useState(null); useEffect(() => { if (isOpen && projectId) { loadGallery(); } }, [isOpen, projectId]); const loadGallery = async () => { try { setLoading(true); const response = await fetch(`https://vollidioten.ceraticsoft.de/api/projects/${projectId}/gallery`); if (response.ok) { const data = await response.json(); setImages(data); } else { setError('Fehler beim Laden der Galerie'); } } catch (err) { console.error('Error loading gallery:', err); setError('Netzwerkfehler'); } finally { setLoading(false); } }; const addImage = async () => { if (!imageUrl.trim()) return; try { setLoading(true); setError(null); const response = await fetch(`https://vollidioten.ceraticsoft.de/api/projects/${projectId}/gallery`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ imageUrl: imageUrl.trim() }) }); if (response.ok) { await loadGallery(); setImageUrl(''); onUpdate(); } else { const errorData = await response.json(); setError(errorData.error || 'Fehler beim Hinzufügen'); } } catch (err) { console.error('Error adding image:', err); setError('Netzwerkfehler'); } finally { setLoading(false); } }; const removeImage = async (imageId: string) => { try { setLoading(true); const response = await fetch(`https://vollidioten.ceraticsoft.de/api/projects/${projectId}/gallery/${imageId}`, { method: 'DELETE', credentials: 'include' }); if (response.ok) { await loadGallery(); onUpdate(); } else { setError('Fehler beim Löschen'); } } catch (err) { console.error('Error removing image:', err); setError('Netzwerkfehler'); } finally { setLoading(false); } }; if (!isOpen) return null; return (

Galerie verwalten

{error && (

{error}

)} {/* Add Image */}

Bild hinzufügen

{/* URL Input */}
setImageUrl(e.target.value)} placeholder="Bild-URL eingeben..." className="flex-1 bg-[#0b0b0d] border border-border rounded p-2 text-sm" />

Geben Sie eine direkte URL zu einem Bild ein (z.B. von Imgur, Discord, etc.)

{/* File Upload */}
{ const files = e.target.files as FileList; if (!files || files.length === 0) return; try { setLoading(true); setError(null); // Upload each file const fileArray = Array.from(files) as File[]; for (const file of fileArray) { const formData = new FormData(); formData.append('gallery', file); const response = await fetch(`https://vollidioten.ceraticsoft.de/api/projects/${projectId}/gallery/upload`, { method: 'POST', credentials: 'include', body: formData }); if (!response.ok) { const errorData = await response.json(); setError(errorData.error || `Fehler beim Hochladen von ${file.name}`); break; } } // Reload gallery after all uploads await loadGallery(); } catch (err) { console.error('Error uploading images:', err); setError('Netzwerkfehler beim Hochladen'); } finally { setLoading(false); } }} className="hidden" id="gallery-upload" />
{/* Gallery Grid */}

Galerie-Bilder ({images.length})

{loading ? (
) : images.length === 0 ? (

Noch keine Bilder in der Galerie.

Fügen Sie Bild-URLs hinzu, um Ihre Galerie zu füllen.

) : (
{images.map((image, index) => (
{`Galerie { const target = e.target as HTMLImageElement; target.src = 'https://via.placeholder.com/200x200/374151/6b7280?text=Bild+fehlerhaft'; }} />
{/* Delete Button */} {/* Overlay on hover */}
))}
)}
); }; export default GalleryManagementModal;