From 4dea41978d34ddc94c47689a7c5d6caf5f26668e Mon Sep 17 00:00:00 2001 From: Dayron Date: Mon, 20 Oct 2025 00:41:14 +0200 Subject: [PATCH] Error fix : handle logout process in HomePage --- lib/blocs/trip/trip_bloc.dart | 12 ++++++- lib/blocs/trip/trip_event.dart | 8 +++++ lib/blocs/user/user_event.dart | 4 ++- lib/pages/home.dart | 63 +++++++++++++++++++++++++++++++--- 4 files changed, 80 insertions(+), 7 deletions(-) diff --git a/lib/blocs/trip/trip_bloc.dart b/lib/blocs/trip/trip_bloc.dart index 09bffb5..6d29aff 100644 --- a/lib/blocs/trip/trip_bloc.dart +++ b/lib/blocs/trip/trip_bloc.dart @@ -19,6 +19,7 @@ class TripBloc extends Bloc { on(_onDeleteRequested); on(_onParticipantAddRequested); on(_onParticipantRemoveRequested); + on(_onResetTrips); // NOUVEAU } Future _onLoadRequested( @@ -108,6 +109,16 @@ class TripBloc extends Bloc { } } + + Future _onResetTrips( + ResetTrips event, + Emitter emit, + ) async { + await _tripsSubscription?.cancel(); + _tripsSubscription = null; + emit(TripInitial()); + } + @override Future close() { _tripsSubscription?.cancel(); @@ -115,7 +126,6 @@ class TripBloc extends Bloc { } } -// Événement interne pour les mises à jour du stream class _TripUpdated extends TripEvent { final List trips; diff --git a/lib/blocs/trip/trip_event.dart b/lib/blocs/trip/trip_event.dart index d387e6f..4aa2ce4 100644 --- a/lib/blocs/trip/trip_event.dart +++ b/lib/blocs/trip/trip_event.dart @@ -68,4 +68,12 @@ class TripParticipantRemoveRequested extends TripEvent { @override List get props => [tripId, participantEmail]; +} + +// NOUVEAU : Événement pour réinitialiser les trips +class ResetTrips extends TripEvent { + const ResetTrips(); + + @override + List get props => []; } \ No newline at end of file diff --git a/lib/blocs/user/user_event.dart b/lib/blocs/user/user_event.dart index 93cdeb1..4f6f86d 100644 --- a/lib/blocs/user/user_event.dart +++ b/lib/blocs/user/user_event.dart @@ -14,7 +14,9 @@ class UserUpdated extends UserEvent { UserUpdated(this.userData); } -class UserLoggedOut extends UserEvent {} +class UserLoggedOut extends UserEvent { + UserLoggedOut(); +} class LoadUser extends UserEvent { final String userId; diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 8990aee..34a091f 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -9,6 +9,8 @@ import '../blocs/user/user_bloc.dart'; import '../blocs/user/user_event.dart'; import '../blocs/auth/auth_bloc.dart'; import '../blocs/auth/auth_event.dart'; +import '../blocs/trip/trip_bloc.dart'; +import '../blocs/trip/trip_event.dart'; class HomePage extends StatefulWidget { const HomePage({super.key}); @@ -73,6 +75,61 @@ class _HomePageState extends State { Navigator.pop(context); } + // Nouvelle méthode pour gérer la déconnexion proprement + Future _handleLogout() async { + // Fermer le drawer + Navigator.pop(context); + + // Afficher un dialog de confirmation + final shouldLogout = await showDialog( + context: context, + builder: (BuildContext dialogContext) { + return AlertDialog( + title: const Text('Déconnexion'), + content: const Text('Êtes-vous sûr de vouloir vous déconnecter ?'), + actions: [ + TextButton( + onPressed: () => Navigator.pop(dialogContext, false), + child: const Text('Annuler'), + ), + ElevatedButton( + onPressed: () => Navigator.pop(dialogContext, true), + style: ElevatedButton.styleFrom( + backgroundColor: Colors.red, + foregroundColor: Colors.white, + ), + child: const Text('Déconnexion'), + ), + ], + ); + }, + ); + + if (shouldLogout != true || !mounted) return; + + try { + context.read().add(ResetTrips()); + context.read().add(UserLoggedOut()); + _pageCache.clear(); + context.read().add(AuthSignOutRequested()); + await Future.delayed(const Duration(milliseconds: 150)); + if (!mounted) return; + Navigator.of(context).pushNamedAndRemoveUntil( + '/login', + (Route route) => false, // Supprime TOUTES les routes + ); + } catch (e) { + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Erreur lors de la déconnexion: $e'), + backgroundColor: Colors.red, + ), + ); + } + } + } + @override Widget build(BuildContext context) { return Scaffold( @@ -103,11 +160,7 @@ class _HomePageState extends State { ListTile( leading: const Icon(Icons.logout, color: Colors.red), title: const Text("Déconnexion", style: TextStyle(color: Colors.red)), - onTap: () { - Navigator.pop(context); - context.read().add(AuthSignOutRequested()); - Navigator.pushNamedAndRemoveUntil(context, '/login', (route) => false); - }, + onTap: _handleLogout, // Utiliser la nouvelle méthode ), ], ),