import React, { useState, useEffect } from 'react'; import { LineChart, Line, BarChart, Bar, PieChart, Pie, Cell, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts'; const COLORS = ['#0088FE', '#00C49F', '#FFBB28', '#FF8042']; const StatsVisualization = () => { const [stats, setStats] = useState(null); const [storageStats, setStorageStats] = useState(null); useEffect(() => { fetchStats(); const interval = setInterval(fetchStats, 30000); return () => clearInterval(interval); }, []); const fetchStats = async () => { try { const [statsResponse, storageResponse] = await Promise.all([ fetch('/backend/image-stats'), fetch('/backend/storage-stats') ]); const statsData = await statsResponse.json(); const storageData = await storageResponse.json(); setStats(statsData); setStorageStats(storageData); } catch (error) { console.error('Fehler beim Laden der Statistiken:', error); } }; if (!stats || !storageStats) return
Lade Statistiken...
; return (
{/* Monatliche Bilderzahl */}
Bilder pro Monat
{/* Album & Kategorie Verteilung */}
Alben Verteilung
`${name}: ${(percent * 100).toFixed(0)}%`} outerRadius={80} fill="#8884d8" dataKey="value" > {stats.albums.map((entry, index) => ( ))}
Kategorie Verteilung
`${name}: ${(percent * 100).toFixed(0)}%`} outerRadius={80} fill="#8884d8" dataKey="value" > {stats.categories.map((entry, index) => ( ))}
{/* Speichernutzung nach Format */}
Speichernutzung nach Format
); }; export default StatsVisualization; ### END: stats-visualization.txt ### START: stats-visualization-updated.txt import React, { useState, useEffect, useCallback } from 'react'; import { API, APIHandler } from '@/api'; import { LineChart, Line, BarChart, Bar, PieChart, Pie, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, Cell } from 'recharts'; // Farbpalette für Charts const COLORS = ['#0088FE', '#00C49F', '#FFBB28', '#FF8042', '#8884d8', '#82ca9d']; const StatsVisualization = () => { const [stats, setStats] = useState(null); const [storageStats, setStorageStats] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [refreshInterval, setRefreshInterval] = useState(30000); // 30 Sekunden // Daten laden const fetchStats = useCallback(async () => { try { setLoading(true); const [statsData, storageData] = await Promise.all([ APIHandler.get(API.statistics.images), APIHandler.get(API.statistics.storage) ]); setStats(statsData); setStorageStats(storageData); setError(null); } catch (err) { setError('Fehler beim Laden der Statistiken: ' + err.message); console.error('Fetch error:', err); } finally { setLoading(false); } }, []); // Auto-Refresh useEffect(() => { fetchStats(); if (refreshInterval > 0) { const interval = setInterval(fetchStats, refreshInterval); return () => clearInterval(interval); } }, [fetchStats, refreshInterval]); // Format für Byte-Größen const formatBytes = (bytes) => { if (bytes === 0) return '0 B'; const k = 1024; const sizes = ['B', 'KB', 'MB', 'GB', 'TB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; }; // Custom Tooltip für Charts const CustomTooltip = ({ active, payload, label, valueFormatter }) => { if (!active || !payload || !payload.length) return null; return (

{`${label}`}

{payload.map((entry, index) => (

{`${entry.name}: ${valueFormatter ? valueFormatter(entry.value) : entry.value}`}

))}
); }; if (loading) { return (
Laden...
); } if (error) { return (

Fehler

{error}

); } return (
{/* Toolbar */}
{/* Monatliche Bilder */}
Bilder pro Monat
} />
{/* Album & Kategorie Verteilung */}
Album Verteilung
`${name}: ${(percent * 100).toFixed(1)}%` } outerRadius={80} fill="#8884d8" dataKey="value" > {stats?.albums.map((entry, index) => ( ))} } />
Kategorie Verteilung
`${name}: ${(percent * 100).toFixed(1)}%` } outerRadius={80} fill="#8884d8" dataKey="value" > {stats?.categories.map((entry, index) => ( ))} } />
{/* Speichernutzung */}
Speichernutzung nach Format
} />
); }; export default StatsVisualization; window.StatsVisualization = StatsVisualization; // <-- Diese Zeile ans Ende setzen