import { useState, useEffect } from 'react' import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer, CartesianGrid, PieChart, Pie, } from 'recharts' import { api } from '../utils/api' import KpiTilesOverview from './KpiTilesOverview' const PERIODS = [ { v: 7, label: '7 Tage' }, { v: 28, label: '28 Tage' }, { v: 90, label: '90 Tage' }, { v: 9999, label: 'Gesamt' }, ] /** * Layer 2b: Kennzahlen und Charts nur aus GET /api/charts/fitness-dashboard-viz (activity_metrics). * * @param {number} [period] – gesteuert von außen (z. B. Verlauf `PeriodSelector`); mit `onPeriodChange` koppeln. * @param {(n: number) => void} [onPeriodChange] * @param {boolean} [hidePeriodSelector] – eigenes Zeitraum-Dropdown ausblenden (wenn die Seite oben schon einen Zeitraum wählt). */ export default function FitnessDashboardOverview({ period: periodProp, onPeriodChange, hidePeriodSelector = false, }) { const [internalPeriod, setInternalPeriod] = useState(28) const controlled = periodProp !== undefined && typeof onPeriodChange === 'function' const period = controlled ? periodProp : internalPeriod const setPeriod = controlled ? onPeriodChange : setInternalPeriod const [viz, setViz] = useState(null) const [loading, setLoading] = useState(true) const [err, setErr] = useState(null) useEffect(() => { let cancelled = false setLoading(true) setErr(null) api .getFitnessDashboardViz(period) .then((v) => { if (!cancelled) setViz(v) }) .catch((e) => { if (!cancelled) setErr(e.message || 'Laden fehlgeschlagen') }) .finally(() => { if (!cancelled) setLoading(false) }) return () => { cancelled = true } }, [period]) if (loading) { return (
Noch keine Aktivitätsdaten. Sobald du Trainings erfasst oder importierst, erscheinen Kennzahlen und Diagramme hier.
Kennzahlen und Charts nutzen dieselbe Berechnung wie die KI-Platzhalter (Aktivitäts-Data-Layer). Zusammenfassung ca. {eff} Tage · Volumen-Chart {wUsed} Wochen · Typ-Verteilung{' '} {dTyp} Tage {viz.last_updated ? ( <> {' '} · letzte Aktivität {viz.last_updated} > ) : null} .