diff --git a/components/Stats.tsx b/components/Stats.tsx index 6c7b935..017322b 100644 --- a/components/Stats.tsx +++ b/components/Stats.tsx @@ -5,132 +5,132 @@ import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContai import { t } from '../services/i18n'; interface StatsProps { - sessions: WorkoutSession[]; - lang: Language; + sessions: WorkoutSession[]; + lang: Language; } const Stats: React.FC = ({ sessions, lang }) => { - - const volumeData = useMemo(() => { - const data = [...sessions].reverse().map(session => { - const sessionWeight = session.userBodyWeight || 70; - const work = session.sets.reduce((acc, set) => { - let setWork = 0; - const reps = set.reps || 0; - const weight = set.weight || 0; - if (set.type === ExerciseType.STRENGTH) { - setWork = weight * reps; - } else if (set.type === ExerciseType.BODYWEIGHT) { - const percentage = set.bodyWeightPercentage || 100; - const effectiveBw = sessionWeight * (percentage / 100); - setWork = (effectiveBw + weight) * reps; - } else if (set.type === ExerciseType.STATIC) { - setWork = 0; - } - return acc + Math.max(0, setWork); - }, 0); - return { - date: new Date(session.startTime).toLocaleDateString(lang === 'ru' ? 'ru-RU' : 'en-US', { day: 'numeric', month: 'short' }), - work: Math.round(work) - }; - }).filter(d => d.work > 0); - return data; - }, [sessions, lang]); + const volumeData = useMemo(() => { + const data = [...sessions].reverse().map(session => { + const sessionWeight = session.userBodyWeight || 70; + const work = session.sets.reduce((acc, set) => { + let setWork = 0; + const reps = set.reps || 0; + const weight = set.weight || 0; + if (set.type === ExerciseType.STRENGTH) { + setWork = weight * reps; + } else if (set.type === ExerciseType.BODYWEIGHT) { + const percentage = set.bodyWeightPercentage || 100; + const effectiveBw = sessionWeight * (percentage / 100); + setWork = (effectiveBw + weight) * reps; + } else if (set.type === ExerciseType.STATIC) { + setWork = 0; + } + return acc + Math.max(0, setWork); + }, 0); - const setsData = useMemo(() => { - return [...sessions].reverse().map(session => ({ - date: new Date(session.startTime).toLocaleDateString(lang === 'ru' ? 'ru-RU' : 'en-US', { day: 'numeric', month: 'short' }), - sets: session.sets.length - })); - }, [sessions, lang]); + return { + date: new Date(session.startTime).toLocaleDateString(lang === 'ru' ? 'ru-RU' : 'en-US', { day: 'numeric', month: 'short' }), + work: Math.round(work) + }; + }).filter(d => d.work > 0); + return data; + }, [sessions, lang]); - const weightData = useMemo(() => { - return [...sessions].reverse() - .filter(s => s.userBodyWeight) - .map(session => ({ + const setsData = useMemo(() => { + return [...sessions].reverse().map(session => ({ date: new Date(session.startTime).toLocaleDateString(lang === 'ru' ? 'ru-RU' : 'en-US', { day: 'numeric', month: 'short' }), - weight: session.userBodyWeight + sets: session.sets.length })); - }, [sessions, lang]); + }, [sessions, lang]); - if (sessions.length < 2) { - return ( -
-

{t('not_enough_data', lang)}

-
- ) - } + const weightData = useMemo(() => { + return [...sessions].reverse() + .filter(s => s.userBodyWeight) + .map(session => ({ + date: new Date(session.startTime).toLocaleDateString(lang === 'ru' ? 'ru-RU' : 'en-US', { day: 'numeric', month: 'short' }), + weight: session.userBodyWeight + })); + }, [sessions, lang]); - return ( -
-

{t('progress', lang)}

+ if (sessions.length < 2) { + return ( +
+

{t('not_enough_data', lang)}

+
+ ) + } - {/* Volume Chart */} -
-
-
-

{t('volume_title', lang)}

-

{t('volume_subtitle', lang)}

-
+ return ( +
+

{t('progress', lang)}

+ + {/* Volume Chart */} +
+
+
+

{t('volume_title', lang)}

+

{t('volume_subtitle', lang)}

+
+
+
+ + + + + `${(val / 1000).toFixed(1)}k`} /> + [`${val.toLocaleString()} kg`, t('volume_title', lang)]} + /> + + + +
+
+ + {/* Sets Chart */} +
+

{t('sets_title', lang)}

+
+ + + + + + + + + +
+
+ + {/* Body Weight Chart */} +
+

{t('weight_title', lang)}

+
+ + + + + + [`${val} kg`, t('weight_kg', lang)]} + /> + + + +
+
-
- - - - - `${(val/1000).toFixed(1)}k`} /> - [`${val.toLocaleString()} kg`, t('volume_title', lang)]} - /> - - - -
-
- - {/* Sets Chart */} -
-

{t('sets_title', lang)}

-
- - - - - - - - - -
-
- - {/* Body Weight Chart */} -
-

{t('weight_title', lang)}

-
- - - - - - [`${val} kg`, t('weight_kg', lang)]} - /> - - - -
-
-
- ); + ); }; export default Stats;