fix(execution): comportement de la flèche retour en séance (ticket #31)
Corrige la flèche de retour sur workout_execution_screen.dart : elle ouvre désormais le choix pause/abandon ou quitter-et-sauvegarder au lieu de ne rien faire. flutter analyze propre, 36/36 tests verts, build APK debug validé. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -78,8 +78,17 @@ final class _WorkoutExecutionScreenState extends State<WorkoutExecutionScreen> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return PopScope(
|
return PopScope(
|
||||||
canPop: false,
|
canPop: false,
|
||||||
|
onPopInvoked: _handleSystemBack,
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
|
automaticallyImplyLeading: false,
|
||||||
|
leading: _canPauseFromNavigation
|
||||||
|
? IconButton(
|
||||||
|
tooltip: 'Mettre en pause',
|
||||||
|
onPressed: () => unawaited(_pause()),
|
||||||
|
icon: const Icon(Icons.arrow_back),
|
||||||
|
)
|
||||||
|
: null,
|
||||||
title: Text(_plan.name),
|
title: Text(_plan.name),
|
||||||
actions: [
|
actions: [
|
||||||
IconButton(
|
IconButton(
|
||||||
@ -263,6 +272,16 @@ final class _WorkoutExecutionScreenState extends State<WorkoutExecutionScreen> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool get _canPauseFromNavigation {
|
||||||
|
return _mode == WorkoutExecutionMode.active ||
|
||||||
|
_mode == WorkoutExecutionMode.rest;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _handleSystemBack(bool didPop) {
|
||||||
|
if (didPop || !_canPauseFromNavigation) return;
|
||||||
|
unawaited(_pause());
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> _pause() async {
|
Future<void> _pause() async {
|
||||||
_restTicker?.cancel();
|
_restTicker?.cancel();
|
||||||
_session = await widget.activeUseCases.pause(_session.metadata.id);
|
_session = await widget.activeUseCases.pause(_session.metadata.id);
|
||||||
|
|||||||
@ -218,6 +218,47 @@ void main() {
|
|||||||
expect(repository.results.single.actualTimeMs, greaterThan(0));
|
expect(repository.results.single.actualTimeMs, greaterThan(0));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testWidgets('la flèche de retour met la séance active en pause', (
|
||||||
|
tester,
|
||||||
|
) async {
|
||||||
|
final clock = _FakeClock(DateTime.utc(2026, 7, 17, 12));
|
||||||
|
final repository = _FakeActiveSessionRepository();
|
||||||
|
final session = ActiveWorkoutSession(
|
||||||
|
metadata: _metadata('session-1'),
|
||||||
|
sourceWorkoutTemplateId: 'template-1',
|
||||||
|
status: ActiveWorkoutStatus.running,
|
||||||
|
startedAt: DateTime.utc(2026, 7, 17, 12),
|
||||||
|
lastPersistedAt: DateTime.utc(2026, 7, 17, 12),
|
||||||
|
elapsedActiveMs: 0,
|
||||||
|
currentProgramIndex: 0,
|
||||||
|
currentExerciseIndex: 0,
|
||||||
|
currentSetIndex: 0,
|
||||||
|
resolvedTemplateSnapshotJson: _sessionSnapshot(
|
||||||
|
setsCount: 2,
|
||||||
|
restSeconds: 0,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
repository.session = session;
|
||||||
|
|
||||||
|
await tester.pumpWidget(
|
||||||
|
MaterialApp(
|
||||||
|
home: WorkoutExecutionScreen(
|
||||||
|
initialSession: session,
|
||||||
|
activeUseCases: _activeUseCases(repository, clock),
|
||||||
|
closeUseCase: _closeUseCase(repository, clock),
|
||||||
|
historyUseCases: _historyUseCases(clock),
|
||||||
|
workoutTemplateUseCases: _workoutTemplateUseCases(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
await tester.tap(find.byTooltip('Mettre en pause'));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
expect(find.text('Reprendre'), findsOneWidget);
|
||||||
|
expect(repository.session?.status, ActiveWorkoutStatus.paused);
|
||||||
|
});
|
||||||
|
|
||||||
testWidgets('le plan de séance affiche les états des séries', (tester) async {
|
testWidgets('le plan de séance affiche les états des séries', (tester) async {
|
||||||
final clock = _FakeClock(DateTime.utc(2026, 7, 17, 12));
|
final clock = _FakeClock(DateTime.utc(2026, 7, 17, 12));
|
||||||
final repository = _FakeActiveSessionRepository();
|
final repository = _FakeActiveSessionRepository();
|
||||||
|
|||||||
Reference in New Issue
Block a user