feat(ui): écran Exécution de séance
Ajoute l'écran d'exécution de séance (presentation/workout_execution_screen.dart), avec les ajustements application/domaine/repositories nécessaires et la navigation depuis l'accueil et l'écran séance-modèle. flutter analyze propre, 15/15 tests verts, build APK debug validé. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -1,21 +1,64 @@
|
||||
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 StatelessWidget {
|
||||
final class HomeScreen extends StatefulWidget {
|
||||
const HomeScreen({required this.bootstrap, super.key});
|
||||
|
||||
final AppBootstrap bootstrap;
|
||||
|
||||
@override
|
||||
State<HomeScreen> createState() => _HomeScreenState();
|
||||
}
|
||||
|
||||
final class _HomeScreenState extends State<HomeScreen> {
|
||||
late Future<ActiveWorkoutSession?> _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<ActiveWorkoutSession?>(
|
||||
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'),
|
||||
@ -23,8 +66,8 @@ final class HomeScreen extends StatelessWidget {
|
||||
onTap: () => Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (context) => ExerciseLibraryScreen(
|
||||
exerciseUseCases: bootstrap.exerciseUseCases,
|
||||
mediaUseCases: bootstrap.mediaUseCases,
|
||||
exerciseUseCases: widget.bootstrap.exerciseUseCases,
|
||||
mediaUseCases: widget.bootstrap.mediaUseCases,
|
||||
),
|
||||
),
|
||||
),
|
||||
@ -36,8 +79,8 @@ final class HomeScreen extends StatelessWidget {
|
||||
onTap: () => Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (context) => ProgramListScreen(
|
||||
programUseCases: bootstrap.programUseCases,
|
||||
exerciseUseCases: bootstrap.exerciseUseCases,
|
||||
programUseCases: widget.bootstrap.programUseCases,
|
||||
exerciseUseCases: widget.bootstrap.exerciseUseCases,
|
||||
),
|
||||
),
|
||||
),
|
||||
@ -49,8 +92,11 @@ final class HomeScreen extends StatelessWidget {
|
||||
onTap: () => Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (context) => WorkoutTemplateListScreen(
|
||||
workoutTemplateUseCases: bootstrap.workoutTemplateUseCases,
|
||||
programUseCases: bootstrap.programUseCases,
|
||||
workoutTemplateUseCases:
|
||||
widget.bootstrap.workoutTemplateUseCases,
|
||||
programUseCases: widget.bootstrap.programUseCases,
|
||||
activeUseCases: widget.bootstrap.activeWorkoutSessionUseCases,
|
||||
closeUseCase: widget.bootstrap.closeWorkoutSessionUseCase,
|
||||
),
|
||||
),
|
||||
),
|
||||
@ -59,4 +105,20 @@ final class HomeScreen extends StatelessWidget {
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _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();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user