import React, { useState, useEffect } from 'react'; import { Helmet } from 'react-helmet'; import { useNavigate } from 'react-router-dom'; import { Container } from '@mui/material'; import Navbar from '../ComponentUtils/Headers/Navbar'; import Footer from '../ComponentUtils/Footer'; import ImageGallery from '../ComponentUtils/ImageGallery'; const ModerationGroupsPage = () => { const [groups, setGroups] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [selectedGroup, setSelectedGroup] = useState(null); const [showImages, setShowImages] = useState(false); const navigate = useNavigate(); useEffect(() => { loadModerationGroups(); }, []); const loadModerationGroups = async () => { try { setLoading(true); const response = await fetch('/moderation/groups'); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); setGroups(data.groups); } catch (error) { console.error('Fehler beim Laden der Moderations-Gruppen:', error); setError('Fehler beim Laden der Gruppen'); } finally { setLoading(false); } }; const approveGroup = async (groupId, approved) => { try { const response = await fetch(`/groups/${groupId}/approve`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ approved: approved }) }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } // Update local state setGroups(groups.map(group => group.groupId === groupId ? { ...group, approved: approved } : group )); } catch (error) { console.error('Fehler beim Freigeben der Gruppe:', error); alert('Fehler beim Freigeben der Gruppe'); } }; const deleteImage = async (groupId, imageId) => { console.log('deleteImage called with:', { groupId, imageId }); console.log('API_URL:', window._env_.API_URL); try { // Use relative URL to go through Nginx proxy const url = `/groups/${groupId}/images/${imageId}`; console.log('DELETE request to:', url); const response = await fetch(url, { method: 'DELETE' }); console.log('Response status:', response.status); console.log('Response ok:', response.ok); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } // Remove image from selectedGroup if (selectedGroup && selectedGroup.groupId === groupId) { const updatedImages = selectedGroup.images.filter(img => img.id !== imageId); setSelectedGroup({ ...selectedGroup, images: updatedImages, imageCount: updatedImages.length }); } // Update group image count setGroups(groups.map(group => group.groupId === groupId ? { ...group, imageCount: group.imageCount - 1 } : group )); } catch (error) { console.error('Fehler beim Löschen des Bildes:', error); console.error('Error details:', error.message, error.stack); alert('Fehler beim Löschen des Bildes: ' + error.message); } }; const deleteGroup = async (groupId) => { if (!window.confirm('Gruppe wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.')) { return; } try { const response = await fetch(`/groups/${groupId}`, { method: 'DELETE' }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } setGroups(groups.filter(group => group.groupId !== groupId)); if (selectedGroup && selectedGroup.groupId === groupId) { setSelectedGroup(null); setShowImages(false); } } catch (error) { console.error('Fehler beim Löschen der Gruppe:', error); alert('Fehler beim Löschen der Gruppe'); } }; // Navigate to the dedicated group images page const viewGroupImages = (group) => { navigate(`/moderation/groups/${group.groupId}`); }; if (loading) { return
Lade Gruppen...
; } if (error) { return
{error}
; } const pendingGroups = groups.filter(g => !g.approved); const approvedGroups = groups.filter(g => g.approved); return (
Moderation - Interne Verwaltung

Moderation

{pendingGroups.length} Wartend
{approvedGroups.length} Freigegeben
{groups.length} Gesamt
{/* Wartende Gruppen */}
{/* Freigegebene Gruppen */}
{/* Bilder-Modal */} {showImages && selectedGroup && ( { setShowImages(false); setSelectedGroup(null); }} onDeleteImage={deleteImage} /> )}
); }; // `GroupCard` has been extracted to `../ComponentUtils/GroupCard` const ImageModal = ({ group, onClose, onDeleteImage }) => { return (
e.stopPropagation()}>

{group.title}

Jahr: {group.year}

Ersteller: {group.name}

{group.description && (

Beschreibung: {group.description}

)}

Bilder: {group.images.length}

{group.images.map(image => (
{image.originalName}
{image.originalName}
))}
); }; export default ModerationGroupsPage;