POWR/utils/workout.ts
DocNR 29c4dd1675 feat(database): Add workout and template persistence
Implements database tables and services for workout and template storage:
- Updates schema to version 5 with new workout and template tables
- Adds WorkoutService for CRUD operations on workouts
- Enhances TemplateService for template management
- Creates NostrWorkoutService for bidirectional Nostr event handling
- Implements React hooks for database access
- Connects workout store to database layer for persistence
- Improves offline support with publication queue

This change ensures workouts and templates are properly saved to SQLite
and can be referenced across app sessions, while maintaining Nostr
integration for social sharing.
2025-03-08 15:48:07 -05:00

49 lines
1.5 KiB
TypeScript

// utils/workout.ts
import { generateId } from '@/utils/ids';
import type {
Workout,
WorkoutSet,
WorkoutExercise
} from '@/types/workout';
import type { WorkoutTemplate } from '@/types/templates';
export function convertTemplateToWorkout(template: WorkoutTemplate) {
// Convert template exercises to workout exercises with empty sets
const exercises: WorkoutExercise[] = template.exercises.map((templateExercise) => {
const now = Date.now();
return {
id: generateId('local'),
title: templateExercise.exercise.title,
type: templateExercise.exercise.type,
category: templateExercise.exercise.category,
equipment: templateExercise.exercise.equipment,
tags: templateExercise.exercise.tags || [],
availability: {
source: ['local']
},
created_at: now,
// Create the specified number of sets from template
sets: Array.from({ length: templateExercise.targetSets || 0 }, (): WorkoutSet => ({
id: generateId('local'),
weight: 0, // Start empty, but could use last workout weight
reps: templateExercise.targetReps, // Use target reps from template
type: 'normal',
isCompleted: false
}))
};
});
return {
id: generateId('local'),
title: template.title,
type: template.type,
exercises,
description: template.description,
startTime: Date.now(),
isCompleted: false,
created_at: Date.now(),
availability: {
source: ['local']
}
};
}