diff --git a/lib/components/group/group_content.dart b/lib/components/group/group_content.dart index 04344f1..52f407c 100644 --- a/lib/components/group/group_content.dart +++ b/lib/components/group/group_content.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:travel_mate/components/error/error_content.dart'; import 'package:travel_mate/components/group/chat_group_content.dart'; +import 'package:travel_mate/components/widgets/user_state_widget.dart'; import '../../blocs/user/user_bloc.dart'; import '../../blocs/user/user_state.dart' as user_state; import '../../blocs/group/group_bloc.dart'; @@ -20,7 +21,7 @@ class _GroupContentState extends State { @override void initState() { super.initState(); - + // Charger immédiatement sans attendre le prochain frame WidgetsBinding.instance.addPostFrameCallback((_) { _loadInitialData(); @@ -30,7 +31,7 @@ class _GroupContentState extends State { void _loadInitialData() { try { final userState = context.read().state; - + if (userState is user_state.UserLoaded) { final userId = userState.user.id; context.read().add(LoadGroupsByUserId(userId)); @@ -44,36 +45,8 @@ class _GroupContentState extends State { @override Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, userState) { - if (userState is user_state.UserLoading) { - return const Scaffold( - body: Center(child: CircularProgressIndicator()), - ); - } - - if (userState is user_state.UserError) { - return Scaffold( - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Icon(Icons.error, size: 64, color: Colors.red), - const SizedBox(height: 16), - Text('Erreur: ${userState.message}'), - ], - ), - ), - ); - } - - if (userState is! user_state.UserLoaded) { - return const Scaffold( - body: Center(child: Text('Utilisateur non connecté')), - ); - } - final user = userState.user; - + return UserStateWrapper( + builder: (context, user) { return BlocConsumer( listener: (context, groupState) { if (groupState is GroupOperationSuccess) { @@ -94,9 +67,7 @@ class _GroupContentState extends State { }, builder: (context, groupState) { return Scaffold( - body: SafeArea( - child: _buildContent(groupState, user.id), - ), + body: SafeArea(child: _buildContent(groupState, user.id)), ); }, ); @@ -123,11 +94,10 @@ class _GroupContentState extends State { } if (groupState is GroupsLoaded) { - if (groupState.groups.isEmpty) { return _buildEmptyState(); } - + return _buildGroupsList(groupState.groups, userId); } @@ -167,13 +137,13 @@ class _GroupContentState extends State { style: TextStyle(fontSize: 14, color: Colors.grey[600]), ), const SizedBox(height: 24), - + ...groups.map((group) { return Padding( padding: const EdgeInsets.only(bottom: 12), child: _buildSimpleGroupCard(group), ); - }) + }), ], ), ); @@ -183,7 +153,7 @@ class _GroupContentState extends State { try { final colors = [Colors.blue, Colors.purple, Colors.green, Colors.orange]; final color = colors[group.name.hashCode.abs() % colors.length]; - + // Membres de manière simple String memberInfo = '${group.members.length} membre(s)'; if (group.members.isNotEmpty) { @@ -193,7 +163,7 @@ class _GroupContentState extends State { .join(', '); memberInfo += '\n$names'; } - + return Card( elevation: 2, child: ListTile( @@ -232,7 +202,10 @@ class _GroupContentState extends State { children: [ Icon(Icons.forum_outlined, size: 80, color: Colors.grey[400]), const SizedBox(height: 16), - const Text('Aucun groupe', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)), + const Text( + 'Aucun groupe', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + ), const SizedBox(height: 8), Text( 'Les groupes sont créés automatiquement', @@ -245,7 +218,7 @@ class _GroupContentState extends State { ); } - Widget _buildErrorState(String error, String userId, bool retry) { + Widget _buildErrorState(String error, String userId, bool retry) { WidgetsBinding.instance.addPostFrameCallback((_) { if (mounted) { if (retry) { @@ -283,21 +256,19 @@ class _GroupContentState extends State { } } }); - + return const Center(child: CircularProgressIndicator()); } - void _openGroupChat(Group group) { + void _openGroupChat(Group group) { try { // Navigation vers la page de chat Navigator.push( context, - MaterialPageRoute( - builder: (context) => ChatGroupContent(group: group), - ), + MaterialPageRoute(builder: (context) => ChatGroupContent(group: group)), ); } catch (e) { _buildErrorState(e.toString(), '', false); } } -} \ No newline at end of file +} diff --git a/lib/components/home/home_content.dart b/lib/components/home/home_content.dart index 2c4dde1..d3be150 100644 --- a/lib/components/home/home_content.dart +++ b/lib/components/home/home_content.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:travel_mate/components/home/create_trip_content.dart'; +import 'package:travel_mate/components/widgets/user_state_widget.dart'; import '../home/show_trip_details_content.dart'; import 'package:travel_mate/components/home/trip_card.dart'; import 'package:travel_mate/services/trip_image_service.dart'; @@ -73,33 +74,8 @@ class _HomeContentState extends State Widget build(BuildContext context) { super.build(context); // Important pour AutomaticKeepAliveClientMixin - return BlocBuilder( - builder: (context, userState) { - if (userState is UserLoading) { - return Scaffold(body: Center(child: CircularProgressIndicator())); - } - - if (userState is UserError) { - return Scaffold( - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.error, size: 64, color: Colors.red), - SizedBox(height: 16), - Text('Erreur: ${userState.message}'), - ], - ), - ), - ); - } - - if (userState is! UserLoaded) { - return Scaffold(body: Center(child: Text('Veuillez vous connecter'))); - } - - final user = userState.user; - + return UserStateWrapper( + builder: (context, user) { return BlocConsumer( listener: (context, tripState) { if (tripState is TripOperationSuccess) { @@ -281,12 +257,13 @@ class _HomeContentState extends State Widget _buildTripsList(List trips) { // Charger les images manquantes en arrière-plan _loadMissingImagesInBackground(trips); - + return Column( - children: trips.map((trip) => TripCard( - trip: trip, - onTap: () => _showTripDetails(trip), - )).toList(), + children: trips + .map( + (trip) => TripCard(trip: trip, onTap: () => _showTripDetails(trip)), + ) + .toList(), ); } diff --git a/lib/components/profile/profile_content.dart b/lib/components/settings/profile/profile_content.dart similarity index 98% rename from lib/components/profile/profile_content.dart rename to lib/components/settings/profile/profile_content.dart index 65f1a6f..22eb3b6 100644 --- a/lib/components/profile/profile_content.dart +++ b/lib/components/settings/profile/profile_content.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:travel_mate/components/widgets/user_state_widget.dart'; -import '../../blocs/user/user_bloc.dart'; -import '../../blocs/user/user_state.dart' as user_state; -import '../../blocs/user/user_event.dart' as user_event; -import '../../services/auth_service.dart'; +import '../../../blocs/user/user_bloc.dart'; +import '../../../blocs/user/user_state.dart' as user_state; +import '../../../blocs/user/user_event.dart' as user_event; +import '../../../services/auth_service.dart'; class ProfileContent extends StatelessWidget { const ProfileContent({super.key}); diff --git a/lib/components/settings/settings_content.dart b/lib/components/settings/settings_content.dart index 02bb4e8..528c5ea 100644 --- a/lib/components/settings/settings_content.dart +++ b/lib/components/settings/settings_content.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'settings_theme_content.dart'; -import '../profile/profile_content.dart'; +import 'profile/profile_content.dart'; class SettingsContent extends StatelessWidget { const SettingsContent({super.key}); @@ -40,7 +40,9 @@ class SettingsContent extends StatelessWidget { onTap: () { Navigator.push( context, - MaterialPageRoute(builder: (context) => const SettingsThemeContent()), + MaterialPageRoute( + builder: (context) => const SettingsThemeContent(), + ), ); }, ),