import 'package:flutter/material.dart'; import '../application/app_bootstrap.dart'; import '../domain/domain.dart'; import 'exercise_library_screen.dart'; import 'program_screen.dart'; import 'workout_execution_screen.dart'; import 'workout_template_screen.dart'; final class HomeScreen extends StatefulWidget { const HomeScreen({required this.bootstrap, super.key}); final AppBootstrap bootstrap; @override State createState() => _HomeScreenState(); } final class _HomeScreenState extends State { late Future _openSession; @override void initState() { super.initState(); _openSession = widget.bootstrap.activeWorkoutSessionUseCases.findOpen(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('GameTime')), body: ListView( children: [ FutureBuilder( future: _openSession, builder: (context, snapshot) { final session = snapshot.data; if (session == null) { return const SizedBox.shrink(); } final plan = WorkoutExecutionPlan.fromSession(session); final position = ExecutionPosition( programIndex: session.currentProgramIndex, exerciseIndex: session.currentExerciseIndex, setIndex: session.currentSetIndex, ); final exercise = plan.exerciseAt(position); return MaterialBanner( content: Text( 'Séance en cours — Reprendre · ${exercise.name}, ' 'série ${position.setIndex + 1}/${exercise.setsCount}', ), actions: [ TextButton( onPressed: () => _resume(session), child: const Text('Reprendre'), ), ], ); }, ), ListTile( leading: const Icon(Icons.fitness_center), title: const Text('Exercices'), trailing: const Icon(Icons.chevron_right), onTap: () => Navigator.of(context).push( MaterialPageRoute( builder: (context) => ExerciseLibraryScreen( exerciseUseCases: widget.bootstrap.exerciseUseCases, mediaUseCases: widget.bootstrap.mediaUseCases, ), ), ), ), ListTile( leading: const Icon(Icons.list_alt), title: const Text('Programmes'), trailing: const Icon(Icons.chevron_right), onTap: () => Navigator.of(context).push( MaterialPageRoute( builder: (context) => ProgramListScreen( programUseCases: widget.bootstrap.programUseCases, exerciseUseCases: widget.bootstrap.exerciseUseCases, ), ), ), ), ListTile( leading: const Icon(Icons.event_note), title: const Text('Séances'), trailing: const Icon(Icons.chevron_right), onTap: () => Navigator.of(context).push( MaterialPageRoute( builder: (context) => WorkoutTemplateListScreen( workoutTemplateUseCases: widget.bootstrap.workoutTemplateUseCases, programUseCases: widget.bootstrap.programUseCases, activeUseCases: widget.bootstrap.activeWorkoutSessionUseCases, closeUseCase: widget.bootstrap.closeWorkoutSessionUseCase, ), ), ), ), ], ), ); } Future _resume(ActiveWorkoutSession session) async { await Navigator.of(context).push( MaterialPageRoute( builder: (context) => WorkoutExecutionScreen( initialSession: session, activeUseCases: widget.bootstrap.activeWorkoutSessionUseCases, closeUseCase: widget.bootstrap.closeWorkoutSessionUseCase, ), ), ); if (!mounted) return; setState(() { _openSession = widget.bootstrap.activeWorkoutSessionUseCases.findOpen(); }); } }