// 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 _sessionController = StreamController.broadcast(); // // Stream 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 initializeFromPostToken(String token) async { // Map 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 initializeFromPreToken(String token) async { // Map 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 restoreSession() async { // prefs = await SharedPreferences.getInstance(); // // final postToken = await TokenService.getPostToken(); // final preToken = await TokenService.getPreToken(); // // if (postToken != null && postToken.isNotEmpty) { // Map 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 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 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 initializeFromPostToken(String token) async { Map 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 initializeFromPreToken(String token) async { Map 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 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 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(); } }