Files
wortis_tpe/lib/pages/session_manager.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('================================');
}
}