feat(auth): refactor login success flow to inject controllers and load data conditionally
This commit is contained in:
parent
ffba37b767
commit
5b5030ec36
@ -2,7 +2,7 @@ import 'dart:async';
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:marco/helpers/services/app_logger.dart';
|
import 'package:marco/helpers/services/app_logger.dart';
|
||||||
import 'package:marco/helpers/services/permission_service.dart';
|
import 'package:marco/helpers/services/permission_service.dart';
|
||||||
import 'package:marco/model/user_permission.dart';
|
import 'package:marco/model/user_permission.dart';
|
||||||
import 'package:marco/model/employee_info.dart';
|
import 'package:marco/model/employee_info.dart';
|
||||||
@ -17,8 +17,51 @@ class PermissionController extends GetxController {
|
|||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
super.onInit();
|
super.onInit();
|
||||||
_loadDataFromAPI();
|
_initialize();
|
||||||
_startAutoRefresh();
|
}
|
||||||
|
|
||||||
|
Future<void> _initialize() async {
|
||||||
|
final token = await _getAuthToken();
|
||||||
|
if (token?.isNotEmpty ?? false) {
|
||||||
|
await loadData(token!);
|
||||||
|
_startAutoRefresh();
|
||||||
|
} else {
|
||||||
|
logSafe("Token is null or empty. Skipping API load and auto-refresh.", level: LogLevel.warning);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<String?> _getAuthToken() async {
|
||||||
|
try {
|
||||||
|
final prefs = await SharedPreferences.getInstance();
|
||||||
|
final token = prefs.getString('jwt_token');
|
||||||
|
logSafe("Auth token retrieved: $token", level: LogLevel.debug);
|
||||||
|
return token;
|
||||||
|
} catch (e, stacktrace) {
|
||||||
|
logSafe("Error retrieving auth token", level: LogLevel.error, error: e, stackTrace: stacktrace);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> loadData(String token) async {
|
||||||
|
try {
|
||||||
|
final userData = await PermissionService.fetchAllUserData(token);
|
||||||
|
_updateState(userData);
|
||||||
|
await _storeData();
|
||||||
|
logSafe("Data loaded and state updated successfully.");
|
||||||
|
} catch (e, stacktrace) {
|
||||||
|
logSafe("Error loading data from API", level: LogLevel.error, error: e, stackTrace: stacktrace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _updateState(Map<String, dynamic> userData) {
|
||||||
|
try {
|
||||||
|
permissions.assignAll(userData['permissions']);
|
||||||
|
employeeInfo.value = userData['employeeInfo'];
|
||||||
|
projectsInfo.assignAll(userData['projects']);
|
||||||
|
logSafe("State updated with user data.");
|
||||||
|
} catch (e, stacktrace) {
|
||||||
|
logSafe("Error updating state", level: LogLevel.error, error: e, stackTrace: stacktrace);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _storeData() async {
|
Future<void> _storeData() async {
|
||||||
@ -50,54 +93,15 @@ class PermissionController extends GetxController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _loadDataFromAPI() async {
|
|
||||||
final token = await _getAuthToken();
|
|
||||||
if (token?.isNotEmpty ?? false) {
|
|
||||||
await loadData(token!);
|
|
||||||
} else {
|
|
||||||
logSafe("No token found for loading API data.", level: LogLevel.warning);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> loadData(String token) async {
|
|
||||||
try {
|
|
||||||
final userData = await PermissionService.fetchAllUserData(token);
|
|
||||||
_updateState(userData);
|
|
||||||
await _storeData();
|
|
||||||
logSafe("Data loaded and state updated successfully.");
|
|
||||||
} catch (e, stacktrace) {
|
|
||||||
logSafe("Error loading data from API", level: LogLevel.error, error: e, stackTrace: stacktrace);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void _updateState(Map<String, dynamic> userData) {
|
|
||||||
try {
|
|
||||||
permissions.assignAll(userData['permissions']);
|
|
||||||
employeeInfo.value = userData['employeeInfo'];
|
|
||||||
projectsInfo.assignAll(userData['projects']);
|
|
||||||
|
|
||||||
logSafe("State updated with new user data.", );
|
|
||||||
} catch (e, stacktrace) {
|
|
||||||
logSafe("Error updating state", level: LogLevel.error, error: e, stackTrace: stacktrace);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<String?> _getAuthToken() async {
|
|
||||||
try {
|
|
||||||
final prefs = await SharedPreferences.getInstance();
|
|
||||||
final token = prefs.getString('jwt_token');
|
|
||||||
logSafe("Auth token retrieved successfully.", );
|
|
||||||
return token;
|
|
||||||
} catch (e, stacktrace) {
|
|
||||||
logSafe("Error retrieving auth token", level: LogLevel.error, error: e, stackTrace: stacktrace);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void _startAutoRefresh() {
|
void _startAutoRefresh() {
|
||||||
_refreshTimer = Timer.periodic(Duration(minutes: 30), (timer) async {
|
_refreshTimer = Timer.periodic(Duration(minutes: 30), (timer) async {
|
||||||
logSafe("Auto-refresh triggered.");
|
logSafe("Auto-refresh triggered.");
|
||||||
await _loadDataFromAPI();
|
final token = await _getAuthToken();
|
||||||
|
if (token?.isNotEmpty ?? false) {
|
||||||
|
await loadData(token!);
|
||||||
|
} else {
|
||||||
|
logSafe("Token missing during auto-refresh. Skipping.", level: LogLevel.warning);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,7 +120,7 @@ class PermissionController extends GetxController {
|
|||||||
@override
|
@override
|
||||||
void onClose() {
|
void onClose() {
|
||||||
_refreshTimer?.cancel();
|
_refreshTimer?.cancel();
|
||||||
logSafe("PermissionController disposed and timer cancelled.");
|
logSafe("PermissionController disposed and auto-refresh timer cancelled.");
|
||||||
super.onClose();
|
super.onClose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ class ProjectController extends GetxController {
|
|||||||
isProjectSelectionExpanded.value = false;
|
isProjectSelectionExpanded.value = false;
|
||||||
logSafe("Projects fetched: ${projects.length}");
|
logSafe("Projects fetched: ${projects.length}");
|
||||||
} else {
|
} else {
|
||||||
logSafe("No projects found or API call failed.", level: LogLevel.warning);
|
logSafe("No Global projects found or API call failed.", level: LogLevel.warning);
|
||||||
}
|
}
|
||||||
|
|
||||||
isLoadingProjects.value = false;
|
isLoadingProjects.value = false;
|
||||||
|
@ -27,18 +27,28 @@ Future<void> initializeApp() async {
|
|||||||
await ThemeCustomizer.init();
|
await ThemeCustomizer.init();
|
||||||
logSafe("💡 Theme customizer initialized.");
|
logSafe("💡 Theme customizer initialized.");
|
||||||
|
|
||||||
Get.put(PermissionController());
|
final token = LocalStorage.getString('jwt_token');
|
||||||
logSafe("💡 PermissionController injected.");
|
if (token != null && token.isNotEmpty) {
|
||||||
|
if (!Get.isRegistered<PermissionController>()) {
|
||||||
|
Get.put(PermissionController());
|
||||||
|
logSafe("💡 PermissionController injected.");
|
||||||
|
}
|
||||||
|
|
||||||
Get.put(ProjectController(), permanent: true);
|
if (!Get.isRegistered<ProjectController>()) {
|
||||||
logSafe("💡 ProjectController injected as permanent.");
|
Get.put(ProjectController(), permanent: true);
|
||||||
|
logSafe("💡 ProjectController injected as permanent.");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logSafe("⚠️ No token found. Skipping PermissionController and ProjectController injection.");
|
||||||
|
}
|
||||||
|
|
||||||
AppStyle.init();
|
AppStyle.init();
|
||||||
logSafe("💡 AppStyle initialized.");
|
logSafe("💡 AppStyle initialized.");
|
||||||
|
|
||||||
logSafe("✅ App initialization completed successfully.");
|
logSafe("✅ App initialization completed successfully.");
|
||||||
} catch (e, stacktrace) {
|
} catch (e, stacktrace) {
|
||||||
logSafe("⛔ Error during app initialization",
|
logSafe(
|
||||||
|
"⛔ Error during app initialization",
|
||||||
level: LogLevel.error,
|
level: LogLevel.error,
|
||||||
error: e,
|
error: e,
|
||||||
stackTrace: stacktrace,
|
stackTrace: stacktrace,
|
||||||
|
@ -247,32 +247,45 @@ class AuthService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Handle login success flow
|
/// Handle login success flow
|
||||||
static Future<void> _handleLoginSuccess(Map<String, dynamic> data) async {
|
static Future<void> _handleLoginSuccess(Map<String, dynamic> data) async {
|
||||||
logSafe("Processing login success...");
|
logSafe("Processing login success...");
|
||||||
|
|
||||||
final jwtToken = data['token'];
|
final jwtToken = data['token'];
|
||||||
final refreshToken = data['refreshToken'];
|
final refreshToken = data['refreshToken'];
|
||||||
final mpinToken = data['mpinToken'];
|
final mpinToken = data['mpinToken'];
|
||||||
|
|
||||||
await LocalStorage.setJwtToken(jwtToken);
|
// Save tokens
|
||||||
await LocalStorage.setLoggedInUser(true);
|
await LocalStorage.setJwtToken(jwtToken);
|
||||||
|
await LocalStorage.setLoggedInUser(true);
|
||||||
|
|
||||||
if (refreshToken != null) await LocalStorage.setRefreshToken(refreshToken);
|
if (refreshToken != null) {
|
||||||
|
await LocalStorage.setRefreshToken(refreshToken);
|
||||||
if (mpinToken != null && mpinToken.isNotEmpty) {
|
|
||||||
await LocalStorage.setMpinToken(mpinToken);
|
|
||||||
await LocalStorage.setIsMpin(true);
|
|
||||||
} else {
|
|
||||||
await LocalStorage.setIsMpin(false);
|
|
||||||
await LocalStorage.removeMpinToken();
|
|
||||||
}
|
|
||||||
|
|
||||||
final permissionController = Get.put(PermissionController());
|
|
||||||
await permissionController.loadData(jwtToken);
|
|
||||||
|
|
||||||
await Get.find<ProjectController>().fetchProjects();
|
|
||||||
|
|
||||||
isLoggedIn = true;
|
|
||||||
logSafe("Login flow completed.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mpinToken != null && mpinToken.isNotEmpty) {
|
||||||
|
await LocalStorage.setMpinToken(mpinToken);
|
||||||
|
await LocalStorage.setIsMpin(true);
|
||||||
|
} else {
|
||||||
|
await LocalStorage.setIsMpin(false);
|
||||||
|
await LocalStorage.removeMpinToken();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inject controllers if not already registered
|
||||||
|
if (!Get.isRegistered<PermissionController>()) {
|
||||||
|
Get.put(PermissionController());
|
||||||
|
logSafe("✅ PermissionController injected after login.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Get.isRegistered<ProjectController>()) {
|
||||||
|
Get.put(ProjectController(), permanent: true);
|
||||||
|
logSafe("✅ ProjectController injected after login.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load data into controllers
|
||||||
|
await Get.find<PermissionController>().loadData(jwtToken);
|
||||||
|
await Get.find<ProjectController>().fetchProjects();
|
||||||
|
|
||||||
|
isLoggedIn = true;
|
||||||
|
logSafe("✅ Login flow completed and controllers initialized.");
|
||||||
}
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user