From 2b040b39b76d212ae87b6c82949ebd09c7125bd3 Mon Sep 17 00:00:00 2001 From: bender Date: Wed, 11 Mar 2026 19:54:57 +0000 Subject: [PATCH] Add src/hooks/useWorkoutStorage.ts --- src/hooks/useWorkoutStorage.ts | 120 +++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 src/hooks/useWorkoutStorage.ts diff --git a/src/hooks/useWorkoutStorage.ts b/src/hooks/useWorkoutStorage.ts new file mode 100644 index 0000000..b98c040 --- /dev/null +++ b/src/hooks/useWorkoutStorage.ts @@ -0,0 +1,120 @@ +'use client'; + +import { useState, useCallback, useEffect } from 'react'; +import { WorkoutStorageService, WorkoutSession, UserMetrics } from '@/lib/storage/workoutStorage'; + +export function useWorkoutStorage() { + const [workouts, setWorkouts] = useState([]); + const [metrics, setMetrics] = useState(null); + const [isLoading, setIsLoading] = useState(true); + + // Load initial data + useEffect(() => { + setIsLoading(true); + try { + const loadedWorkouts = WorkoutStorageService.getWorkoutSessions(); + const loadedMetrics = WorkoutStorageService.getMetrics(); + setWorkouts(loadedWorkouts); + setMetrics(loadedMetrics); + } finally { + setIsLoading(false); + } + }, []); + + const saveWorkout = useCallback((session: Omit) => { + try { + const saved = WorkoutStorageService.saveWorkoutSession(session); + setWorkouts(prev => [...prev, saved]); + // Recalculate metrics + const updated = WorkoutStorageService.calculateMetricsFromSessions(); + setMetrics(updated); + return saved; + } catch (error) { + console.error('Error saving workout:', error); + return null; + } + }, []); + + const updateWorkout = useCallback((id: string, updates: Partial) => { + try { + const updated = WorkoutStorageService.updateWorkoutSession(id, updates); + if (updated) { + setWorkouts(prev => prev.map(w => w.id === id ? updated : w)); + // Recalculate metrics + const newMetrics = WorkoutStorageService.calculateMetricsFromSessions(); + setMetrics(newMetrics); + } + return updated; + } catch (error) { + console.error('Error updating workout:', error); + return null; + } + }, []); + + const deleteWorkout = useCallback((id: string) => { + try { + const success = WorkoutStorageService.deleteWorkoutSession(id); + if (success) { + setWorkouts(prev => prev.filter(w => w.id !== id)); + // Recalculate metrics + const updated = WorkoutStorageService.calculateMetricsFromSessions(); + setMetrics(updated); + } + return success; + } catch (error) { + console.error('Error deleting workout:', error); + return false; + } + }, []); + + const getWorkoutsByType = useCallback((type: WorkoutSession['type']) => { + return workouts.filter(w => w.type === type); + }, [workouts]); + + const getWorkoutsByDate = useCallback((date: string) => { + return workouts.filter(w => w.date === date); + }, [workouts]); + + const updateMetrics = useCallback((updates: Partial) => { + try { + const updated = WorkoutStorageService.updateMetrics(updates); + setMetrics(updated); + return updated; + } catch (error) { + console.error('Error updating metrics:', error); + return metrics; + } + }, [metrics]); + + const clearAllData = useCallback(() => { + try { + WorkoutStorageService.clearAllData(); + setWorkouts([]); + setMetrics({ + totalWorkouts: 0, + totalDistance: 0, + totalCalories: 0, + totalWeight: 0, + consistency: 0, + lastUpdated: Date.now(), + }); + } catch (error) { + console.error('Error clearing data:', error); + } + }, []); + + return { + workouts, + metrics, + isLoading, + saveWorkout, + updateWorkout, + deleteWorkout, + getWorkoutsByType, + getWorkoutsByDate, + updateMetrics, + clearAllData, + }; +} + +export type UseWorkoutStorageReturn = ReturnType; \ No newline at end of file