From 8924fed85c39e9f0c066729a3ceea43a32ebd8ae Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 11 Mar 2026 19:32:11 +0000 Subject: [PATCH] Add src/components/workout/WorkoutSaver.tsx --- src/components/workout/WorkoutSaver.tsx | 129 ++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 src/components/workout/WorkoutSaver.tsx diff --git a/src/components/workout/WorkoutSaver.tsx b/src/components/workout/WorkoutSaver.tsx new file mode 100644 index 0000000..9a90c3e --- /dev/null +++ b/src/components/workout/WorkoutSaver.tsx @@ -0,0 +1,129 @@ +'use client'; + +import { useState } from 'react'; +import { useWorkoutData } from '@/hooks/useWorkoutData'; +import { WorkoutSession, ExerciseLog } from '@/lib/storage/workoutStorage'; + +interface WorkoutSaverProps { + onSave?: (session: WorkoutSession) => void; + onError?: (error: string) => void; +} + +export const WorkoutSaver: React.FC = ({ onSave, onError }) => { + const { addSession } = useWorkoutData(); + const [isSaving, setIsSaving] = useState(false); + + const saveCardioWorkout = async (data: { + distance: number; + duration: number; + pace: string; + calories: number; + steps?: number; + }) => { + setIsSaving(true); + try { + const session: Omit = { + date: new Date().toISOString(), + type: 'cardio', + distance: data.distance, + duration: data.duration, + pace: data.pace, + calories: data.calories, + steps: data.steps + }; + const success = addSession(session); + if (success && onSave) { + onSave(session as WorkoutSession); + } else if (!success && onError) { + onError('Failed to save cardio workout'); + } + } catch (error) { + if (onError) onError('Error saving cardio workout'); + console.error(error); + } finally { + setIsSaving(false); + } + }; + + const saveTrainingWorkout = async (data: { + exercises: ExerciseLog[]; + duration: number; + calories?: number; + }) => { + setIsSaving(true); + try { + const session: Omit = { + date: new Date().toISOString(), + type: 'training', + exercises: data.exercises, + duration: data.duration, + calories: data.calories + }; + const success = addSession(session); + if (success && onSave) { + onSave(session as WorkoutSession); + } else if (!success && onError) { + onError('Failed to save training workout'); + } + } catch (error) { + if (onError) onError('Error saving training workout'); + console.error(error); + } finally { + setIsSaving(false); + } + }; + + const saveNutritionLog = async (data: { + meals: Array<{ + name: string; + calories: number; + protein: number; + carbs: number; + fats: number; + }>; + }) => { + setIsSaving(true); + try { + const meals = data.meals.map((meal, index) => ({ + id: `meal-${index}-${Date.now()}`, + name: meal.name, + calories: meal.calories, + protein: meal.protein, + carbs: meal.carbs, + fats: meal.fats, + timestamp: new Date().toISOString() + })); + + const totalCalories = data.meals.reduce((sum, meal) => sum + meal.calories, 0); + const totalProtein = data.meals.reduce((sum, meal) => sum + meal.protein, 0); + + const session: Omit = { + date: new Date().toISOString(), + type: 'nutrition', + meals, + calories: totalCalories, + notes: `Total Protein: ${totalProtein}g` + }; + const success = addSession(session); + if (success && onSave) { + onSave(session as WorkoutSession); + } else if (!success && onError) { + onError('Failed to save nutrition log'); + } + } catch (error) { + if (onError) onError('Error saving nutrition log'); + console.error(error); + } finally { + setIsSaving(false); + } + }; + + return { + saveCardioWorkout, + saveTrainingWorkout, + saveNutritionLog, + isSaving + }; +}; + +export default WorkoutSaver;