import React, { useState, useEffect, useCallback } from 'react'; import { API, APIHandler, Validators } from './api.js'; const AlbumManager = () => { const [albums, setAlbums] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [selectedAlbums, setSelectedAlbums] = useState(new Set()); const [editingAlbum, setEditingAlbum] = useState(null); // Daten laden const fetchAlbums = useCallback(async () => { try { setLoading(true); const data = await APIHandler.get(API.albums.list); setAlbums(data); setError(null); } catch (err) { setError('Fehler beim Laden der Alben: ' + err.message); console.error('Fetch error:', err); } finally { setLoading(false); } }, []); useEffect(() => { fetchAlbums(); }, [fetchAlbums]); // Album erstellen const handleCreate = async (name, description = '') => { try { //const validationErrors = Validators.album({ name }); //if (Object.keys(validationErrors).length > 0) { // throw new Error(Object.values(validationErrors).join(', ')); //} await APIHandler.post(API.albums.create, { name, description }); await fetchAlbums(); window.showToast('Erfolg', 'Album wurde erstellt', 'success'); } catch (err) { window.showToast('Fehler', err.message, 'danger'); } }; // Album aktualisieren const handleUpdate = async (id, updates) => { try { //const validationErrors = Validators.album(updates); //if (Object.keys(validationErrors).length > 0) { // throw new Error(Object.values(validationErrors).join(', ')); //} await APIHandler.put(API.albums.update(id), updates); await fetchAlbums(); setEditingAlbum(null); window.showToast('Erfolg', 'Album wurde aktualisiert', 'success'); } catch (err) { window.showToast('Fehler', err.message, 'danger'); } }; // Album aktualisieren const handleUpdate = async (id, updates) => { try { const validationErrors = Validators.album(updates); if (Object.keys(validationErrors).length > 0) { throw new Error(Object.values(validationErrors).join(', ')); } await APIHandler.put(API.albums.update(id), updates); await fetchAlbums(); setEditingAlbum(null); window.showToast('Erfolg', 'Album wurde aktualisiert', 'success'); } catch (err) { window.showToast('Fehler', err.message, 'danger'); } }; // Massenbearbeitung const handleBulkDelete = async () => { if (selectedAlbums.size === 0) return; if (!window.confirm(`Möchten Sie ${selectedAlbums.size} Alben wirklich löschen?`)) return; try { await Promise.all( Array.from(selectedAlbums).map(id => APIHandler.delete(API.albums.delete(id)) ) ); setSelectedAlbums(new Set()); await fetchAlbums(); window.showToast('Erfolg', 'Ausgewählte Alben wurden gelöscht', 'success'); } catch (err) { window.showToast('Fehler', err.message, 'danger'); } }; const handleSelectAll = (event) => { if (event.target.checked) { setSelectedAlbums(new Set(albums.map(album => album.id))); } else { setSelectedAlbums(new Set()); } }; if (loading) { return (
Laden...
); } if (error) { return (

Fehler

{error}

); } return (
{/* Toolbar */}
{selectedAlbums.size > 0 && ( )}
{/* Album Liste */}
{albums.map(album => ( ))}
Name Bilder Erstellt Aktionen
{ const newSelected = new Set(selectedAlbums); if (e.target.checked) { newSelected.add(album.id); } else { newSelected.delete(album.id); } setSelectedAlbums(newSelected); }} /> {editingAlbum?.id === album.id ? ( setEditingAlbum({ ...editingAlbum, name: e.target.value })} /> ) : album.name} {album.imageCount} {new Date(album.createdAt).toLocaleDateString()}
{editingAlbum?.id === album.id ? ( <> ) : ( <> )}
{albums.length === 0 && (

Keine Alben vorhanden

)}
); }; export default AlbumManager; window.AlbumManager = AlbumManager; // <-- Diese Zeile ans Ende setzen