Initial commit du projet Flutter
This commit is contained in:
157
lib/pages/session_manager.dart
Normal file
157
lib/pages/session_manager.dart
Normal file
@@ -0,0 +1,157 @@
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
class SessionManager {
|
||||
static const String _keyUserId = 'user_id';
|
||||
static const String _keyToken = 'user_token';
|
||||
static const String _keyRole = 'user_role';
|
||||
static const String _keyPIN = 'user_pin'; // Ajouté pour le PIN
|
||||
static const String _keyLoginDate = 'login_date';
|
||||
static const String _keyIsLoggedIn = 'is_logged_in';
|
||||
|
||||
static SessionManager? _instance;
|
||||
static SharedPreferences? _prefs;
|
||||
|
||||
SessionManager._internal();
|
||||
|
||||
factory SessionManager() {
|
||||
_instance ??= SessionManager._internal();
|
||||
return _instance!;
|
||||
}
|
||||
|
||||
Future<void> _initPrefs() async {
|
||||
_prefs ??= await SharedPreferences.getInstance();
|
||||
}
|
||||
|
||||
/// Sauvegarder une session
|
||||
Future<void> saveSession(
|
||||
String userId, {
|
||||
String? token,
|
||||
String? role,
|
||||
String? pinkey, // Ajouté pour le PIN
|
||||
}) async {
|
||||
await _initPrefs();
|
||||
|
||||
await _prefs!.setString(_keyUserId, userId);
|
||||
await _prefs!.setBool(_keyIsLoggedIn, true);
|
||||
await _prefs!.setString(_keyLoginDate, DateTime.now().toIso8601String());
|
||||
|
||||
if (token != null) {
|
||||
await _prefs!.setString(_keyToken, token);
|
||||
}
|
||||
|
||||
if (role != null) {
|
||||
await _prefs!.setString(_keyRole, role);
|
||||
}
|
||||
|
||||
if (pinkey != null) {
|
||||
await _prefs!.setString(_keyPIN, pinkey);
|
||||
}
|
||||
|
||||
print('Session sauvegardée pour $userId');
|
||||
}
|
||||
|
||||
/// Vérifier si l'utilisateur est connecté
|
||||
Future<bool> isLoggedIn() async {
|
||||
await _initPrefs();
|
||||
return _prefs!.getBool(_keyIsLoggedIn) ?? false;
|
||||
}
|
||||
|
||||
/// Récupérer l'ID utilisateur
|
||||
Future<String?> getUserId() async {
|
||||
await _initPrefs();
|
||||
return _prefs!.getString(_keyUserId);
|
||||
}
|
||||
|
||||
/// Récupérer le token
|
||||
Future<String?> getToken() async {
|
||||
await _initPrefs();
|
||||
return _prefs!.getString(_keyToken);
|
||||
}
|
||||
|
||||
/// Récupérer le rôle
|
||||
Future<String?> getRole() async {
|
||||
await _initPrefs();
|
||||
return _prefs!.getString(_keyRole);
|
||||
}
|
||||
|
||||
/// Récupérer le PIN (nouvelle méthode)
|
||||
Future<String?> getPIN() async {
|
||||
await _initPrefs();
|
||||
return _prefs!.getString(_keyPIN);
|
||||
}
|
||||
|
||||
/// Méthode synchrone pour le PIN (utilisée dans AuthController)
|
||||
String? getPINSync() {
|
||||
return _prefs?.getString(_keyPIN);
|
||||
}
|
||||
|
||||
/// Récupérer la date de connexion
|
||||
Future<DateTime?> getLoginDate() async {
|
||||
await _initPrefs();
|
||||
String? dateString = _prefs!.getString(_keyLoginDate);
|
||||
if (dateString != null) {
|
||||
return DateTime.parse(dateString);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/// Effacer la session
|
||||
Future<void> clearSession() async {
|
||||
await _initPrefs();
|
||||
|
||||
await _prefs!.remove(_keyUserId);
|
||||
await _prefs!.remove(_keyToken);
|
||||
await _prefs!.remove(_keyRole);
|
||||
await _prefs!.remove(_keyPIN); // Supprimer aussi le PIN
|
||||
await _prefs!.remove(_keyLoginDate);
|
||||
await _prefs!.setBool(_keyIsLoggedIn, false);
|
||||
|
||||
print('Session effacée');
|
||||
}
|
||||
|
||||
/// Mettre à jour le token uniquement
|
||||
Future<void> updateToken(String newToken) async {
|
||||
await _initPrefs();
|
||||
await _prefs!.setString(_keyToken, newToken);
|
||||
}
|
||||
|
||||
/// Vérifier si la session a expiré
|
||||
Future<bool> isSessionExpired({Duration? maxAge}) async {
|
||||
maxAge ??= Duration(days: 30); // 30 jours par défaut
|
||||
|
||||
DateTime? loginDate = await getLoginDate();
|
||||
if (loginDate == null) return true;
|
||||
|
||||
return DateTime.now().difference(loginDate) > maxAge;
|
||||
}
|
||||
|
||||
/// Obtenir toutes les informations de session
|
||||
Future<Map<String, dynamic>> getSessionInfo() async {
|
||||
await _initPrefs();
|
||||
|
||||
return {
|
||||
'user_id': await getUserId(),
|
||||
'token': await getToken(),
|
||||
'role': await getRole(),
|
||||
'pin': await getPIN(),
|
||||
'login_date': await getLoginDate(),
|
||||
'is_logged_in': await isLoggedIn(),
|
||||
'is_expired': await isSessionExpired(),
|
||||
};
|
||||
}
|
||||
|
||||
/// Debug: Afficher les informations de session
|
||||
Future<void> debugPrintSession() async {
|
||||
Map<String, dynamic> sessionInfo = await getSessionInfo();
|
||||
print('=== Informations de Session ===');
|
||||
sessionInfo.forEach((key, value) {
|
||||
if (key == 'pin' || key == 'token') {
|
||||
// Masquer les données sensibles
|
||||
print('$key: ${value?.toString().substring(0, 4) ?? 'null'}...');
|
||||
} else {
|
||||
print('$key: $value');
|
||||
}
|
||||
});
|
||||
print('================================');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user