import 'package:flutter/material.dart'; import '../application/app_bootstrap.dart'; import '../domain/domain.dart'; import 'exercise_library_screen.dart'; import 'history_screen.dart'; import 'program_screen.dart'; import 'theme.dart'; import 'workout_execution_screen.dart'; import 'workout_template_screen.dart'; final class HomeScreen extends StatefulWidget { const HomeScreen({ required this.bootstrap, this.themeMode = ThemeMode.system, this.onThemeModeChanged, super.key, }); final AppBootstrap bootstrap; final ThemeMode themeMode; final ValueChanged? onThemeModeChanged; @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 GameTimeLogo(), actions: [ PopupMenuButton( tooltip: 'Thème', initialValue: widget.themeMode, icon: const Icon(Icons.contrast), onSelected: widget.onThemeModeChanged, itemBuilder: (context) => const [ PopupMenuItem(value: ThemeMode.system, child: Text('Système')), PopupMenuItem(value: ThemeMode.light, child: Text('Clair')), PopupMenuItem(value: ThemeMode.dark, child: Text('Sombre')), ], ), ], ), 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 CourtBlazerAccentPanel( margin: const EdgeInsets.all(12), child: 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, historyUseCases: widget.bootstrap.workoutHistoryUseCases, ), ), ), ), ListTile( leading: const Icon(Icons.history), title: const Text('Historique'), trailing: const Icon(Icons.chevron_right), onTap: () => Navigator.of(context).push( MaterialPageRoute( builder: (context) => HistoryListScreen( historyUseCases: widget.bootstrap.workoutHistoryUseCases, workoutTemplateUseCases: widget.bootstrap.workoutTemplateUseCases, 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, historyUseCases: widget.bootstrap.workoutHistoryUseCases, workoutTemplateUseCases: widget.bootstrap.workoutTemplateUseCases, ), ), ); if (!mounted) return; setState(() { _openSession = widget.bootstrap.activeWorkoutSessionUseCases.findOpen(); }); } }