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 */}
{/* 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 (
);
}
if (error) {
return (
Fehler
{error}
);
}
return (
{/* Toolbar */}
{/* Monatliche Bilder */}
{/* 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