post_enrollment_app/lib/pages/service/SessionManager.dart
2026-05-19 12:30:28 +05:30

301 lines
11 KiB
Dart
Executable File

// import 'dart:async';
// import 'package:flutter/foundation.dart';
// import 'package:shared_preferences/shared_preferences.dart';
// import 'package:jwt_decode/jwt_decode.dart';
// import 'TokenService.dart';
//
// class SessionManager {
// static final SessionManager _instance = SessionManager._internal();
// factory SessionManager() => _instance;
// SessionManager._internal();
//
// SharedPreferences? prefs;
// final StreamController<void> _sessionController = StreamController.broadcast();
//
// Stream<void> get sessionStream => _sessionController.stream;
//
// bool sessionReady = false;
//
// /// ===== Post Enrollment Fields =====
// String? mobileNo;
// String? empClientBranchId;
// String? empCodeString;
// String? gpaEmpName;
// String? empPrimaryId;
// String? client_id;
// String? emp_status;
//
// /// ===== Pre Enrollment Fields =====
// String? enrollmentEmpClientBranchId;
// String? enrollmentEmpCodeString;
// String? enrollmentEmpPrimaryId;
// String? enrollmentGpaEmpName;
// String? enrollmentClient_id;
// String? enrollmentEmp_status;
//
// /// Save Post Enrollment Token
// Future<void> initializeFromPostToken(String token) async {
// Map<String, dynamic> decoded = Jwt.parseJwt(token);
//
// final prefs = await SharedPreferences.getInstance();
//
// mobileNo = decoded['mobile'];
// empClientBranchId = decoded['client_branch_id'];
// empCodeString = decoded['emp_code']?.toString();
// gpaEmpName = decoded['name']?.toString();
// empPrimaryId = decoded['id']?.toString();
// client_id = decoded['client_id']?.toString();
// emp_status = decoded['emp_status']?.toString();
//
// // persist
// prefs.setString('mobileNo', mobileNo ?? '');
// prefs.setString('empCodeString', empCodeString ?? '');
// prefs.setString('gpaEmpName', gpaEmpName ?? '');
// prefs.setString('empPrimaryId', empPrimaryId ?? '');
// prefs.setString('client_id', client_id ?? '');
// prefs.setString('empClientBranchId', empClientBranchId ?? '');
// prefs.setString('emp_status', emp_status ?? '');
//
// debugPrint('Post Session initialized: $decoded');
// }
//
// /// Save Pre Enrollment Token
// Future<void> initializeFromPreToken(String token) async {
// Map<String, dynamic> decoded = Jwt.parseJwt(token);
//
// final prefs = await SharedPreferences.getInstance();
//
// enrollmentEmpClientBranchId = decoded['client_branch_id'];
// enrollmentEmpCodeString = decoded['emp_code']?.toString();
// enrollmentEmpPrimaryId = decoded['id']?.toString();
// enrollmentGpaEmpName = decoded['name']?.toString();
// enrollmentClient_id = decoded['client_id']?.toString();
// enrollmentEmp_status = decoded['emp_status']?.toString();
//
// // persist
// prefs.setString('enrollmentEmpClientBranchId', enrollmentEmpClientBranchId ?? '');
// prefs.setString('enrollmentEmpCodeString', enrollmentEmpCodeString ?? '');
// prefs.setString('enrollmentEmpPrimaryId', enrollmentEmpPrimaryId ?? '');
// prefs.setString('enrollmentGpaEmpName', enrollmentGpaEmpName ?? '');
// prefs.setString('enrollmentClient_id', enrollmentClient_id ?? '');
// prefs.setString('enrollmentEmp_status', enrollmentEmp_status ?? '');
//
// debugPrint('Pre Session initialized: $decoded');
// }
//
// /// Restore session from tokens
// Future<void> restoreSession() async {
// prefs = await SharedPreferences.getInstance();
//
// final postToken = await TokenService.getPostToken();
// final preToken = await TokenService.getPreToken();
//
// if (postToken != null && postToken.isNotEmpty) {
// Map<String, dynamic> decoded = Jwt.parseJwt(postToken);
// mobileNo = decoded['mobile'];
// empClientBranchId = decoded['client_branch_id'];
// empCodeString = decoded['emp_code']?.toString();
// gpaEmpName = decoded['name']?.toString();
// empPrimaryId = decoded['id']?.toString();
// client_id = decoded['client_id']?.toString();
// emp_status = decoded['emp_status']?.toString();
// }
//
// if (preToken != null && preToken.isNotEmpty) {
// Map<String, dynamic> decoded = Jwt.parseJwt(preToken);
// enrollmentEmpClientBranchId = decoded['client_branch_id'];
// enrollmentEmpCodeString = decoded['emp_code']?.toString();
// enrollmentEmpPrimaryId = decoded['id']?.toString();
// enrollmentGpaEmpName = decoded['name']?.toString();
// enrollmentClient_id = decoded['client_id']?.toString();
// enrollmentEmp_status = decoded['emp_status']?.toString();
// }
//
// sessionReady = (postToken?.isNotEmpty ?? false) || (preToken?.isNotEmpty ?? false);
// _sessionController.add(null); // notify GoRouter
// }
//
// bool hasValidTokenSync() => sessionReady;
//
// Future<void> clear() async {
// mobileNo = null;
// empClientBranchId = null;
// empCodeString = null;
// gpaEmpName = null;
// empPrimaryId = null;
// client_id = null;
// emp_status = null;
//
// enrollmentEmpClientBranchId = null;
// enrollmentEmpCodeString = null;
// enrollmentEmpPrimaryId = null;
// enrollmentGpaEmpName = null;
// enrollmentClient_id = null;
// enrollmentEmp_status = null;
//
// await prefs?.clear();
// await TokenService.clearTokens();
// sessionReady = false;
// _sessionController.add(null);
// }
//
// }
import 'package:flutter/foundation.dart';
import 'package:jwt_decode/jwt_decode.dart';
import 'package:nhance_app_pwa/logger.dart';
import 'package:nhance_app_pwa/pages/service/data_manager.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'TokenService.dart';
class SessionManager {
static final SessionManager _instance = SessionManager._internal();
factory SessionManager() => _instance;
SessionManager._internal();
bool isReady = false;
/// Mobile only: false after a full app restart until login / MPIN succeeds.
/// Stays true while the process stays alive (e.g. user only minimized the app).
/// Web always behaves as unlocked ([isMobileAppSessionUnlocked] is true).
bool _mobileAppSessionUnlocked = false;
bool get isMobileAppSessionUnlocked =>
kIsWeb ? true : _mobileAppSessionUnlocked;
void unlockMobileAppSession() {
if (!kIsWeb) _mobileAppSessionUnlocked = true;
}
void lockMobileAppSession() {
if (!kIsWeb) _mobileAppSessionUnlocked = false;
}
// ===== Post Enrollment Fields =====
String? mobileNo;
String? empClientBranchId;
String? empCodeString;
String? gpaEmpName;
String? empPrimaryId;
String? client_id;
String? emp_status;
String? empEmailCorporate;
// ===== Pre Enrollment Fields =====
String? enrollmentEmpClientBranchId;
String? enrollmentEmpCodeString;
String? enrollmentEmpPrimaryId;
String? enrollmentGpaEmpName;
String? enrollmentClient_id;
String? enrollmentEmp_status;
String? enrollmentEmailCorporate;
/// Save Post Enrollment Token
Future<void> initializeFromPostToken(String token) async {
Map<String, dynamic> decoded = Jwt.parseJwt(token);
mobileNo = decoded['mobile'];
empClientBranchId = decoded['client_branch_id'];
empCodeString = decoded['emp_code']?.toString();
gpaEmpName = decoded['name']?.toString();
empPrimaryId = decoded['id']?.toString();
client_id = decoded['client_id']?.toString();
emp_status = decoded['emp_status']?.toString();
empEmailCorporate = decoded['email_corporate']?.toString();
// Web: keep session in memory + JWT in sessionStorage only (no SharedPreferences).
if (!kIsWeb) {
final prefs = await SharedPreferences.getInstance();
prefs.setString('mobileNo', mobileNo ?? '');
prefs.setString('empCodeString', empCodeString ?? '');
prefs.setString('gpaEmpName', gpaEmpName ?? '');
prefs.setString('empPrimaryId', empPrimaryId ?? '');
prefs.setString('client_id', client_id ?? '');
prefs.setString('empClientBranchId', empClientBranchId ?? '');
prefs.setString('emp_status', emp_status ?? '');
prefs.setString('empEmailCorporate', empEmailCorporate ?? '');
}
logDebug('Post Session initialized: $decoded');
}
/// Save Pre Enrollment Token
Future<void> initializeFromPreToken(String token) async {
Map<String, dynamic> decoded = Jwt.parseJwt(token);
enrollmentEmpClientBranchId = decoded['client_branch_id'];
enrollmentEmpCodeString = decoded['emp_code']?.toString();
enrollmentEmpPrimaryId = decoded['id']?.toString();
enrollmentGpaEmpName = decoded['name']?.toString();
enrollmentClient_id = decoded['client_id']?.toString();
enrollmentEmp_status = decoded['emp_status']?.toString();
enrollmentEmailCorporate = decoded['email_corporate']?.toString();
if (!kIsWeb) {
final prefs = await SharedPreferences.getInstance();
prefs.setString(
'enrollmentEmpClientBranchId', enrollmentEmpClientBranchId ?? '');
prefs.setString(
'enrollmentEmpCodeString', enrollmentEmpCodeString ?? '');
prefs.setString(
'enrollmentEmpPrimaryId', enrollmentEmpPrimaryId ?? '');
prefs.setString('enrollmentGpaEmpName', enrollmentGpaEmpName ?? '');
prefs.setString('enrollmentClient_id', enrollmentClient_id ?? '');
prefs.setString('enrollmentEmp_status', enrollmentEmp_status ?? '');
prefs.setString(
'enrollmentEmailCorporate', enrollmentEmailCorporate ?? '');
}
logDebug('Pre Session initialized: $decoded');
}
/// Restore session at startup
Future<void> restoreSession() async {
final postToken = await TokenService.getPostToken();
final preToken = await TokenService.getPreToken();
if (postToken != null && postToken.isNotEmpty) {
await initializeFromPostToken(postToken);
}
if (preToken != null && preToken.isNotEmpty) {
await initializeFromPreToken(preToken);
}
// 🔴 If both tokens are null/empty → clear session
if ((postToken == null || postToken.isEmpty) &&
(preToken == null || preToken.isEmpty)) {
await clear();
}
}
/// Clear all session values
Future<void> clear() async {
mobileNo = null;
empClientBranchId = null;
empCodeString = null;
gpaEmpName = null;
empPrimaryId = null;
client_id = null;
emp_status = null;
empEmailCorporate = null;
enrollmentEmpClientBranchId = null;
enrollmentEmpCodeString = null;
enrollmentEmpPrimaryId = null;
enrollmentGpaEmpName = null;
enrollmentClient_id = null;
enrollmentEmp_status = null;
enrollmentEmailCorporate = null;
final prefs = await SharedPreferences.getInstance();
await prefs.clear();
await DataManager().clearData();
await TokenService.clearTokens();
lockMobileAppSession();
}
}