Add src/hooks/useWorkoutStorage.ts
This commit is contained in:
120
src/hooks/useWorkoutStorage.ts
Normal file
120
src/hooks/useWorkoutStorage.ts
Normal file
@@ -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<WorkoutSession[]>([]);
|
||||
const [metrics, setMetrics] = useState<UserMetrics | null>(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<WorkoutSession, 'id' | 'createdAt'>) => {
|
||||
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<WorkoutSession>) => {
|
||||
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<UserMetrics>) => {
|
||||
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<typeof useWorkoutStorage>;
|
||||
Reference in New Issue
Block a user