diff --git a/frontend/src/Components/Pages/ModerationGroupImagesPage.js b/frontend/src/Components/Pages/ModerationGroupImagesPage.js index 23aecc5..cd27420 100644 --- a/frontend/src/Components/Pages/ModerationGroupImagesPage.js +++ b/frontend/src/Components/Pages/ModerationGroupImagesPage.js @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useCallback } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { Button, Container } from '@mui/material'; import Swal from 'sweetalert2/dist/sweetalert2.js'; @@ -10,6 +10,9 @@ import Footer from '../ComponentUtils/Footer'; import ImageGallery from '../ComponentUtils/ImageGallery'; import DescriptionInput from '../ComponentUtils/MultiUpload/DescriptionInput'; +// Services +import { updateImageOrder } from '../../services/reorderService'; + @@ -24,6 +27,7 @@ const ModerationGroupImagesPage = () => { // selectedImages will hold objects compatible with ImagePreviewGallery const [selectedImages, setSelectedImages] = useState([]); const [metadata, setMetadata] = useState({ year: new Date().getFullYear(), title: '', description: '', name: '' }); + const [isReordering, setIsReordering] = useState(false); useEffect(() => { loadGroup(); @@ -122,6 +126,53 @@ const ModerationGroupImagesPage = () => { setSelectedImages(prev => prev.filter((_, index) => index !== indexToRemove)); }; + // Handle drag-and-drop reordering + const handleReorder = useCallback(async (reorderedItems) => { + if (isReordering) return; // Prevent concurrent reordering + + try { + setIsReordering(true); + console.log('🔄 Reordering images:', reorderedItems.map(img => ({ id: img.id, fileName: img.fileName }))); + + // Update local state immediately (optimistic update) + setSelectedImages(reorderedItems); + + // Also update group state to keep consistency + if (group) { + setGroup({ ...group, images: reorderedItems }); + } + + // Send API request + await updateImageOrder(groupId, reorderedItems.map(img => img.id)); + + // Show success feedback + Swal.fire({ + icon: 'success', + title: 'Reihenfolge gespeichert', + timer: 1500, + showConfirmButton: false, + toast: true, + position: 'top-end' + }); + + } catch (error) { + console.error('❌ Fehler beim Neuordnen:', error); + + // Rollback on error - reload original order + await loadGroup(); + + Swal.fire({ + icon: 'error', + title: 'Fehler beim Speichern', + text: 'Reihenfolge konnte nicht gespeichert werden', + timer: 3000, + showConfirmButton: false + }); + } finally { + setIsReordering(false); + } + }, [groupId, group, isReordering, loadGroup]); + // Note: approve/delete group actions are intentionally removed from this page if (loading) return