301 lines
11 KiB
Dart
Executable File
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();
|
|
}
|
|
}
|