From 3fba97bf227d97b3a45c5b33387ac5da3a418684 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 11 Mar 2026 19:32:11 +0000 Subject: [PATCH] Add src/components/workout/WorkoutMetricsDisplay.tsx --- .../workout/WorkoutMetricsDisplay.tsx | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/components/workout/WorkoutMetricsDisplay.tsx diff --git a/src/components/workout/WorkoutMetricsDisplay.tsx b/src/components/workout/WorkoutMetricsDisplay.tsx new file mode 100644 index 0000000..3cfcda8 --- /dev/null +++ b/src/components/workout/WorkoutMetricsDisplay.tsx @@ -0,0 +1,86 @@ +'use client'; + +import { useWorkoutData } from '@/hooks/useWorkoutData'; +import { UserMetrics } from '@/lib/storage/workoutStorage'; + +interface WorkoutMetricsDisplayProps { + className?: string; + showRefresh?: boolean; + onRefresh?: () => void; +} + +export const WorkoutMetricsDisplay: React.FC = ({ + className = '', + showRefresh = true, + onRefresh +}) => { + const { metrics, refreshMetrics, isLoading } = useWorkoutData(); + + const handleRefresh = () => { + refreshMetrics(); + onRefresh?.(); + }; + + if (isLoading || !metrics) { + return
Loading metrics...
; + } + + const formatMetric = (value: number, unit: string) => { + return `${value.toLocaleString()}${unit}`; + }; + + return ( +
+
+
+

Total Steps

+

{formatMetric(metrics.totalSteps, ' steps')}

+
+
+

Total Distance

+

{formatMetric(metrics.totalDistance, ' km')}

+
+
+

Total Calories

+

{formatMetric(metrics.totalCalories, ' kcal')}

+
+
+

Total Volume

+

{formatMetric(metrics.totalVolume, ' kg')}

+
+
+

Workout Streak

+

{metrics.workoutStreak} days

+
+ {metrics.lastWorkoutDate && ( +
+

Last Workout

+

{new Date(metrics.lastWorkoutDate).toLocaleDateString()}

+
+ )} +
+ + {Object.keys(metrics.personalRecords).length > 0 && ( +
+

Personal Records

+
    + {Object.entries(metrics.personalRecords).map(([exercise, weight]) => ( +
  • + {exercise} + {weight} kg +
  • + ))} +
+
+ )} + + {showRefresh && ( + + )} +
+ ); +}; + +export default WorkoutMetricsDisplay;