158 lines
4.3 KiB
Dart
158 lines
4.3 KiB
Dart
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('================================');
|
|
}
|
|
}
|