feat: Implement centralized error handling with ErrorService; replace print statements with logging in services and blocs
feat: Add ErrorContent widget for displaying error messages in dialogs and bottom sheets refactor: Update GroupBloc and GroupRepository to utilize ErrorService for error logging refactor: Enhance user and trip services to log errors using ErrorService refactor: Clean up debug print statements in GroupContent and related components
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
import 'package:firebase_auth/firebase_auth.dart';
|
||||
import 'package:google_sign_in_platform_interface/google_sign_in_platform_interface.dart';
|
||||
import 'package:travel_mate/services/error_service.dart';
|
||||
|
||||
class AuthService {
|
||||
final _errorService = ErrorService();
|
||||
final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
|
||||
|
||||
User? get currentUser => firebaseAuth.currentUser;
|
||||
@@ -89,13 +91,13 @@ class AuthService {
|
||||
}
|
||||
|
||||
} on GoogleSignInException catch (e) {
|
||||
print('Erreur lors de l\'initialisation de Google Sign-In: $e');
|
||||
_errorService.logError('Erreur Google Sign-In: $e', StackTrace.current);
|
||||
rethrow;
|
||||
} on FirebaseAuthException catch (e) {
|
||||
print('Erreur Firebase lors de l\'initialisation de Google Sign-In: $e');
|
||||
_errorService.logError('Erreur Firebase lors de l\'initialisation de Google Sign-In: $e', StackTrace.current);
|
||||
rethrow;
|
||||
} catch (e) {
|
||||
print('Erreur inconnue lors de l\'initialisation de Google Sign-In: $e');
|
||||
_errorService.logError('Erreur inconnue lors de l\'initialisation de Google Sign-In: $e', StackTrace.current);
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
82
lib/services/error_service.dart
Normal file
82
lib/services/error_service.dart
Normal file
@@ -0,0 +1,82 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import '../components/error/error_content.dart';
|
||||
|
||||
class ErrorService {
|
||||
static final ErrorService _instance = ErrorService._internal();
|
||||
factory ErrorService() => _instance;
|
||||
ErrorService._internal();
|
||||
|
||||
// GlobalKey pour accéder au context depuis n'importe où
|
||||
static GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
|
||||
|
||||
// Afficher une erreur en dialog
|
||||
void showError({
|
||||
required String message,
|
||||
String title = 'Erreur',
|
||||
VoidCallback? onRetry,
|
||||
IconData icon = Icons.error_outline,
|
||||
Color? iconColor,
|
||||
}) {
|
||||
final context = navigatorKey.currentContext;
|
||||
if (context != null) {
|
||||
showErrorDialog(
|
||||
context,
|
||||
title: title,
|
||||
message: message,
|
||||
icon: icon,
|
||||
iconColor: iconColor,
|
||||
onRetry: onRetry,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Afficher une erreur en snackbar
|
||||
void showSnackbar({
|
||||
required String message,
|
||||
VoidCallback? onRetry,
|
||||
bool isError = true,
|
||||
}) {
|
||||
final context = navigatorKey.currentContext;
|
||||
if (context != null) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(message),
|
||||
backgroundColor: isError ? Colors.red[400] : Colors.green[600],
|
||||
duration: const Duration(seconds: 4),
|
||||
action: onRetry != null
|
||||
? SnackBarAction(
|
||||
label: 'Réessayer',
|
||||
textColor: Colors.white,
|
||||
onPressed: onRetry,
|
||||
)
|
||||
: null,
|
||||
behavior: SnackBarBehavior.floating,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Logger dans la console (développement)
|
||||
void logError(String source, dynamic error, [StackTrace? stackTrace]) {
|
||||
print('═══════════════════════════════════');
|
||||
print('❌ ERREUR dans $source');
|
||||
print('Message: $error');
|
||||
if (stackTrace != null) {
|
||||
print('StackTrace: $stackTrace');
|
||||
}
|
||||
print('═══════════════════════════════════');
|
||||
}
|
||||
|
||||
// Logger une info (développement)
|
||||
void logInfo(String source, String message) {
|
||||
print('ℹ️ [$source] $message');
|
||||
}
|
||||
|
||||
// Logger un succès
|
||||
void logSuccess(String source, String message) {
|
||||
print('✅ [$source] $message');
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||
import 'package:travel_mate/data/models/group.dart';
|
||||
import 'package:travel_mate/services/error_service.dart';
|
||||
|
||||
class GroupService {
|
||||
final _errorService = ErrorService();
|
||||
final FirebaseFirestore _firestore = FirebaseFirestore.instance;
|
||||
|
||||
Stream<List<Group>> getGroupsStream() {
|
||||
@@ -17,7 +19,7 @@ class GroupService {
|
||||
await _firestore.collection('groups').add(group.toMap());
|
||||
return true;
|
||||
} catch (e) {
|
||||
print('Erreur lors de la création du groupe: $e');
|
||||
_errorService.logError('Erreur lors de la création du groupe: $e', StackTrace.current);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -27,7 +29,7 @@ class GroupService {
|
||||
await _firestore.collection('groups').doc(group.id).update(group.toMap());
|
||||
return true;
|
||||
} catch (e) {
|
||||
print('Erreur lors de la mise à jour du groupe: $e');
|
||||
_errorService.logError('Erreur lors de la mise à jour du groupe: $e', StackTrace.current);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -37,7 +39,7 @@ class GroupService {
|
||||
await _firestore.collection('groups').doc(groupId).delete();
|
||||
return true;
|
||||
} catch (e) {
|
||||
print('Erreur lors de la suppression du groupe: $e');
|
||||
_errorService.logError('Erreur lors de la suppression du groupe: $e', StackTrace.current);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -49,10 +51,9 @@ class GroupService {
|
||||
.where('members', arrayContains: userId)
|
||||
.snapshots()
|
||||
.map((snapshot) {
|
||||
print('Groupes trouvés pour l\'utilisateur $userId: ${snapshot.docs.length}');
|
||||
return snapshot.docs.map((doc) {
|
||||
final group = Group.fromMap(doc.data(), doc.id);
|
||||
print('Groupe: ${group.name}, Membres: ${group.members.length}');
|
||||
_errorService.logError('Groupe: ${group.name}, Membres: ${group.members.length}', StackTrace.current);
|
||||
return group;
|
||||
}).toList();
|
||||
});
|
||||
@@ -65,6 +66,4 @@ class GroupService {
|
||||
Future<void> addMemberToGroup(String groupId, String memberId) async {
|
||||
// TODO: Implémenter l'ajout d'un membre à un groupe
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||
import 'package:travel_mate/services/error_service.dart';
|
||||
import '../data/models/trip.dart';
|
||||
|
||||
class TripService {
|
||||
final _errorService = ErrorService();
|
||||
final FirebaseFirestore _firestore = FirebaseFirestore.instance;
|
||||
static const String _tripsCollection = 'trips';
|
||||
|
||||
@@ -18,7 +20,7 @@ class TripService {
|
||||
return Trip.fromMap({...data, 'id': doc.id});
|
||||
}).toList();
|
||||
} catch (e) {
|
||||
print('Erreur lors du chargement des voyages: $e');
|
||||
_errorService.logError('Erreur lors du chargement des voyages: $e', StackTrace.current);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
@@ -39,16 +41,13 @@ class TripService {
|
||||
await _firestore.collection(_tripsCollection).add(tripData);
|
||||
return true;
|
||||
} catch (e) {
|
||||
print('Erreur lors de l\'ajout du voyage: $e');
|
||||
_errorService.logError('Erreur lors de l\'ajout du voyage: $e', StackTrace.current);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Stream pour écouter les voyages d'un utilisateur en temps réel
|
||||
Stream<List<Trip>> getTripsStreamByUser(String userId, String userEmail) {
|
||||
print('=== STREAM CRÉÉ ===');
|
||||
print('UserId: $userId');
|
||||
|
||||
return _firestore
|
||||
.collection(_tripsCollection)
|
||||
.snapshots()
|
||||
@@ -88,8 +87,7 @@ class TripService {
|
||||
}
|
||||
}
|
||||
} catch (e, stackTrace) {
|
||||
print('Erreur lors du traitement du document ${doc.id}: $e');
|
||||
print('StackTrace: $stackTrace');
|
||||
_errorService.logError('Erreur lors du traitement du document ${doc.id}: $e', stackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,15 +96,14 @@ class TripService {
|
||||
try {
|
||||
return b.createdAt.compareTo(a.createdAt);
|
||||
} catch (e) {
|
||||
print('Erreur lors du tri: $e');
|
||||
_errorService.logError('Erreur lors du tri: $e', StackTrace.current);
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
|
||||
return trips;
|
||||
}).handleError((error, stackTrace) {
|
||||
print('Erreur dans le stream: $error');
|
||||
print('StackTrace: $stackTrace');
|
||||
_errorService.logError('Erreur dans le stream: $error', stackTrace);
|
||||
return <Trip>[];
|
||||
});
|
||||
}
|
||||
@@ -130,7 +127,7 @@ class TripService {
|
||||
trips.add(trip);
|
||||
}
|
||||
} catch (e) {
|
||||
print('Erreur lors de la conversion du voyage créé ${doc.id}: $e');
|
||||
_errorService.logError('Erreur lors de la conversion du voyage créé ${doc.id}: $e', StackTrace.current);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,7 +141,7 @@ class TripService {
|
||||
});
|
||||
return trips;
|
||||
} catch (e) {
|
||||
print('Erreur lors de la récupération des voyages: $e');
|
||||
_errorService.logError('Erreur lors de la récupération des voyages: $e', StackTrace.current);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
@@ -183,8 +180,7 @@ class TripService {
|
||||
return trip;
|
||||
|
||||
} catch (e, stackTrace) {
|
||||
print('Erreur lors de la conversion du document $docId: $e');
|
||||
print('StackTrace: $stackTrace');
|
||||
_errorService.logError('Erreur lors de la conversion du document $docId: $e', stackTrace);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -202,7 +198,7 @@ class TripService {
|
||||
.update(tripData);
|
||||
return true;
|
||||
} catch (e) {
|
||||
print('Erreur lors de la mise à jour du voyage: $e');
|
||||
_errorService.logError('Erreur lors de la mise à jour du voyage: $e', StackTrace.current);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -213,7 +209,7 @@ class TripService {
|
||||
await _firestore.collection(_tripsCollection).doc(tripId).delete();
|
||||
return true;
|
||||
} catch (e) {
|
||||
print('Erreur lors de la suppression du voyage: $e');
|
||||
_errorService.logError('Erreur lors de la suppression du voyage: $e', StackTrace.current);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -232,7 +228,7 @@ class TripService {
|
||||
}
|
||||
return null;
|
||||
} catch (e) {
|
||||
print('Erreur lors de la récupération du voyage: $e');
|
||||
_errorService.logError('Erreur lors de la récupération du voyage: $e', StackTrace.current);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -246,7 +242,7 @@ class TripService {
|
||||
});
|
||||
return true;
|
||||
} catch (e) {
|
||||
print('Erreur lors de l\'ajout du participant: $e');
|
||||
_errorService.logError('Erreur lors de l\'ajout du participant: $e', StackTrace.current);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -260,7 +256,7 @@ class TripService {
|
||||
});
|
||||
return true;
|
||||
} catch (e) {
|
||||
print('Erreur lors du retrait du participant: $e');
|
||||
_errorService.logError('Erreur lors du retrait du participant: $e', StackTrace.current);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||
import 'package:firebase_auth/firebase_auth.dart';
|
||||
import 'package:travel_mate/services/error_service.dart';
|
||||
import '../blocs/user/user_state.dart';
|
||||
|
||||
class UserService {
|
||||
final _errorService = ErrorService();
|
||||
final FirebaseFirestore _firestore;
|
||||
final FirebaseAuth _auth;
|
||||
static const String _usersCollection = 'users';
|
||||
@@ -32,7 +34,7 @@ class UserService {
|
||||
.set(user.toJson());
|
||||
return true;
|
||||
} catch (e) {
|
||||
print('Erreur lors de la création de l\'utilisateur: $e');
|
||||
_errorService.logError('Erreur lors de la création de l\'utilisateur: $e', StackTrace.current);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -53,7 +55,7 @@ class UserService {
|
||||
}
|
||||
return null;
|
||||
} catch (e) {
|
||||
print('Erreur lors de la récupération de l\'utilisateur: $e');
|
||||
_errorService.logError('Erreur lors de la récupération de l\'utilisateur: $e', StackTrace.current);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -76,7 +78,7 @@ class UserService {
|
||||
}
|
||||
return null;
|
||||
} catch (e) {
|
||||
print('Erreur lors de la récupération de l\'utilisateur par email: $e');
|
||||
_errorService.logError('Erreur lors de la récupération de l\'utilisateur par email: $e', StackTrace.current);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -95,7 +97,7 @@ class UserService {
|
||||
}
|
||||
return null;
|
||||
} catch (e) {
|
||||
print('Erreur lors de la récupération de l\'ID utilisateur: $e');
|
||||
_errorService.logError('Erreur lors de la récupération de l\'ID utilisateur: $e', StackTrace.current);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -109,7 +111,7 @@ class UserService {
|
||||
.update(userData);
|
||||
return true;
|
||||
} catch (e) {
|
||||
print('Erreur lors de la mise à jour de l\'utilisateur: $e');
|
||||
_errorService.logError('Erreur lors de la mise à jour de l\'utilisateur: $e', StackTrace.current);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -123,7 +125,7 @@ class UserService {
|
||||
.delete();
|
||||
return true;
|
||||
} catch (e) {
|
||||
print('Erreur lors de la suppression de l\'utilisateur: $e');
|
||||
_errorService.logError('Erreur lors de la suppression de l\'utilisateur: $e', StackTrace.current);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -139,7 +141,7 @@ class UserService {
|
||||
|
||||
return querySnapshot.docs.isNotEmpty;
|
||||
} catch (e) {
|
||||
print('Erreur lors de la vérification de l\'email: $e');
|
||||
_errorService.logError('Erreur lors de la vérification de l\'email: $e', StackTrace.current);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -171,7 +173,7 @@ class UserService {
|
||||
|
||||
return users;
|
||||
} catch (e) {
|
||||
print('Erreur lors de la récupération des utilisateurs: $e');
|
||||
_errorService.logError('Erreur lors de la récupération des utilisateurs: $e', StackTrace.current);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
@@ -190,7 +192,7 @@ class UserService {
|
||||
});
|
||||
}).toList();
|
||||
} catch (e) {
|
||||
print('Erreur lors de la récupération de tous les utilisateurs: $e');
|
||||
_errorService.logError('Erreur lors de la récupération de tous les utilisateurs: $e', StackTrace.current);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
@@ -254,7 +256,7 @@ class UserService {
|
||||
|
||||
return usersMap.values.toList();
|
||||
} catch (e) {
|
||||
print('Erreur lors de la recherche d\'utilisateurs: $e');
|
||||
_errorService.logError('Erreur lors de la recherche d\'utilisateurs: $e', StackTrace.current);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
@@ -270,7 +272,7 @@ class UserService {
|
||||
});
|
||||
return true;
|
||||
} catch (e) {
|
||||
print('Erreur lors de la mise à jour de la dernière connexion: $e');
|
||||
_errorService.logError('Erreur lors de la mise à jour de la dernière connexion: $e', StackTrace.current);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -284,7 +286,7 @@ class UserService {
|
||||
.get();
|
||||
return doc.exists;
|
||||
} catch (e) {
|
||||
print('Erreur lors de la vérification de l\'existence de l\'utilisateur: $e');
|
||||
_errorService.logError('Erreur lors de la vérification de l\'existence de l\'utilisateur: $e', StackTrace.current);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user