diff --git a/lib/presentation/program_screen.dart b/lib/presentation/program_screen.dart index 700e657..84d4deb 100644 --- a/lib/presentation/program_screen.dart +++ b/lib/presentation/program_screen.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import '../application/application.dart'; @@ -121,6 +123,7 @@ final class _ProgramFormScreenState extends State { late final TextEditingController _nameController; late final TextEditingController _defaultRestController; late final List<_ProgramExerciseDraft> _exercises; + Timer? _addedSnackBarTimer; var _saving = false; bool get _isEditing => widget.program != null; @@ -145,6 +148,7 @@ final class _ProgramFormScreenState extends State { @override void dispose() { + _addedSnackBarTimer?.cancel(); _nameController.dispose(); _defaultRestController.dispose(); super.dispose(); @@ -253,12 +257,25 @@ final class _ProgramFormScreenState extends State { setState(() { _exercises.add(draft); }); - ScaffoldMessenger.of(context).showSnackBar( + final messenger = ScaffoldMessenger.of(context); + _addedSnackBarTimer?.cancel(); + _addedSnackBarTimer = Timer(const Duration(seconds: 3), () { + if (mounted) { + messenger.hideCurrentSnackBar(); + } + }); + messenger.showSnackBar( SnackBar( + duration: const Duration(seconds: 3), content: const Text('Exercice ajouté'), action: SnackBarAction( label: 'Personnaliser', - onPressed: () => _customizeExercise(draft.key), + onPressed: () { + _addedSnackBarTimer?.cancel(); + _addedSnackBarTimer = null; + messenger.hideCurrentSnackBar(); + _customizeExercise(draft.key); + }, ), ), ); diff --git a/test/presentation/program_screen_test.dart b/test/presentation/program_screen_test.dart index fe47706..7d7129e 100644 --- a/test/presentation/program_screen_test.dart +++ b/test/presentation/program_screen_test.dart @@ -103,6 +103,61 @@ void main() { }, ); + testWidgets( + 'la popup exercice ajouté disparaît et se ferme à la personnalisation', + (tester) async { + final exerciseRepository = _FakeExerciseRepository() + ..exercises.add( + Exercise( + metadata: _metadata('exercise-1'), + name: 'Squat', + hasTimeMeasure: true, + hasRepsMeasure: false, + hasScoreMeasure: false, + ), + ); + + await tester.pumpWidget( + MaterialApp( + home: ProgramFormScreen( + programUseCases: _programUseCases( + _FakeProgramRepository(), + exerciseRepository, + ), + exerciseUseCases: _exerciseUseCases(exerciseRepository), + ), + ), + ); + + await tester.tap(find.text('Ajouter un exercice')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Squat')); + await tester.pumpAndSettle(); + + expect(find.text('Exercice ajouté'), findsOneWidget); + + for (var i = 0; i < 5; i++) { + await tester.pump(const Duration(seconds: 1)); + } + await tester.pump(const Duration(milliseconds: 500)); + + expect(find.text('Exercice ajouté'), findsNothing); + + await tester.tap(find.text('Ajouter un exercice')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Squat').first); + await tester.pumpAndSettle(); + + expect(find.text('Exercice ajouté'), findsOneWidget); + + await tester.tap(find.text('Personnaliser')); + await tester.pumpAndSettle(); + + expect(find.text('Exercice ajouté'), findsNothing); + expect(find.text("Personnaliser l'exercice"), findsOneWidget); + }, + ); + testWidgets('affiche l’objectif de chrono pour un score en mode chrono', ( tester, ) async {