@@ -16,15 +16,17 @@ import {
1616 useUserProfiles ,
1717 createUserProfile ,
1818 updateUserProfile ,
19+ createMesocycle ,
1920} from './hooks/useDatabase' ;
2021import { seedStarterExercises } from './lib/seedData' ;
2122import { seedSampleMesocycle } from './lib/seedMesocycle' ;
23+ import { generateSplitDays } from './lib/generateSplitDays' ;
2224import { db } from './db' ;
2325import type { BeforeInstallPromptEvent } from './types/global' ;
2426import type { Exercise } from './types/models' ;
2527import './App.css' ;
2628
27- type Page = 'workout ' | 'exercises ' | 'mesocycles ' | 'progress' | 'settings' ;
29+ type Page = 'mesocycles ' | 'workout ' | 'exercises ' | 'progress' | 'settings' ;
2830
2931function App ( ) {
3032 const exercises = useExercises ( ) ;
@@ -33,7 +35,7 @@ function App() {
3335 useState < BeforeInstallPromptEvent | null > ( null ) ;
3436 const [ isOnline , setIsOnline ] = useState ( navigator . onLine ) ;
3537 const [ isLoading , setIsLoading ] = useState ( true ) ;
36- const [ currentPage , setCurrentPage ] = useState < Page > ( 'workout ' ) ;
38+ const [ currentPage , setCurrentPage ] = useState < Page > ( 'mesocycles ' ) ;
3739 const [ showOnboarding , setShowOnboarding ] = useState ( false ) ;
3840
3941 // Check if we should show onboarding
@@ -229,6 +231,45 @@ function App() {
229231 } ) ;
230232 }
231233
234+ // Create mesocycle if requested
235+ if ( data . createMesocycle && data . trainingSplit && data . mesocycleWeeks ) {
236+ try {
237+ const startDate = new Date ( ) ;
238+ const endDate = new Date ( ) ;
239+ endDate . setDate ( endDate . getDate ( ) + data . mesocycleWeeks * 7 ) ;
240+
241+ const splitDays = generateSplitDays ( data . trainingSplit ) ;
242+
243+ await createMesocycle ( {
244+ name : data . mesocycleName || 'My First Mesocycle' ,
245+ startDate,
246+ endDate,
247+ durationWeeks : data . mesocycleWeeks ,
248+ currentWeek : 1 ,
249+ deloadWeek : data . mesocycleWeeks , // Last week is deload
250+ trainingSplit : data . trainingSplit ,
251+ splitDays,
252+ status : 'active' ,
253+ notes : 'Created during onboarding' ,
254+ } ) ;
255+ } catch ( err ) {
256+ // Handle the case where an active mesocycle already exists gracefully
257+ if (
258+ err instanceof Error &&
259+ err . message . includes (
260+ 'Cannot create active mesocycle: another mesocycle is already active'
261+ )
262+ ) {
263+ console . warn (
264+ 'Skipping mesocycle creation during onboarding because an active mesocycle already exists.'
265+ ) ;
266+ } else {
267+ // Re-throw unexpected errors to be handled by the outer catch
268+ throw err ;
269+ }
270+ }
271+ }
272+
232273 setShowOnboarding ( false ) ;
233274 } catch ( error ) {
234275 console . error ( 'Failed to complete onboarding:' , error ) ;
@@ -306,10 +347,12 @@ function App() {
306347 ) }
307348 </ div >
308349
309- { currentPage === 'workout' && < WorkoutSession /> }
310-
311350 { currentPage === 'mesocycles' && < MesocycleDashboard /> }
312351
352+ { currentPage === 'workout' && (
353+ < WorkoutSession onNavigate = { setCurrentPage } />
354+ ) }
355+
313356 { currentPage === 'exercises' && (
314357 < ExerciseList
315358 exercises = { exercises || [ ] }
0 commit comments