Files
GameTime/lib/presentation/home_screen.dart
Blomios 34b3638ce3 feat(ui): écran Historique des séances
Ajoute l'écran d'historique des séances (presentation/history_screen.dart),
avec les ajustements application/domaine/repositories nécessaires et la
navigation depuis l'accueil. Complète le dernier écran du périmètre UI.
flutter analyze propre, 18/18 tests verts, build APK debug validé.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 19:17:55 +02:00

145 lines
5.2 KiB
Dart

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 '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<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'),
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<void> _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();
});
}
}