From 5b5030ec3635449be90a79fc7a0ff0b3bf9532f1 Mon Sep 17 00:00:00 2001 From: Vaibhav Surve Date: Wed, 9 Jul 2025 15:48:15 +0530 Subject: [PATCH] feat(auth): refactor login success flow to inject controllers and load data conditionally --- lib/controller/permission_controller.dart | 102 +++++++++++----------- lib/controller/project_controller.dart | 2 +- lib/helpers/services/app_initializer.dart | 20 +++-- lib/helpers/services/auth_service.dart | 61 ++++++++----- 4 files changed, 106 insertions(+), 79 deletions(-) diff --git a/lib/controller/permission_controller.dart b/lib/controller/permission_controller.dart index 166b2f0..0802f33 100644 --- a/lib/controller/permission_controller.dart +++ b/lib/controller/permission_controller.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:get/get.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/model/user_permission.dart'; import 'package:marco/model/employee_info.dart'; @@ -17,8 +17,51 @@ class PermissionController extends GetxController { @override void onInit() { super.onInit(); - _loadDataFromAPI(); - _startAutoRefresh(); + _initialize(); + } + + Future _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 _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 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 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 _storeData() async { @@ -50,54 +93,15 @@ class PermissionController extends GetxController { } } - Future _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 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 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 _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() { _refreshTimer = Timer.periodic(Duration(minutes: 30), (timer) async { 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 void onClose() { _refreshTimer?.cancel(); - logSafe("PermissionController disposed and timer cancelled."); + logSafe("PermissionController disposed and auto-refresh timer cancelled."); super.onClose(); } } diff --git a/lib/controller/project_controller.dart b/lib/controller/project_controller.dart index 6fed738..a31cfcd 100644 --- a/lib/controller/project_controller.dart +++ b/lib/controller/project_controller.dart @@ -66,7 +66,7 @@ class ProjectController extends GetxController { isProjectSelectionExpanded.value = false; logSafe("Projects fetched: ${projects.length}"); } 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; diff --git a/lib/helpers/services/app_initializer.dart b/lib/helpers/services/app_initializer.dart index d674a39..0f6e7d0 100644 --- a/lib/helpers/services/app_initializer.dart +++ b/lib/helpers/services/app_initializer.dart @@ -27,18 +27,28 @@ Future initializeApp() async { await ThemeCustomizer.init(); logSafe("💡 Theme customizer initialized."); - Get.put(PermissionController()); - logSafe("💡 PermissionController injected."); + final token = LocalStorage.getString('jwt_token'); + if (token != null && token.isNotEmpty) { + if (!Get.isRegistered()) { + Get.put(PermissionController()); + logSafe("💡 PermissionController injected."); + } - Get.put(ProjectController(), permanent: true); - logSafe("💡 ProjectController injected as permanent."); + if (!Get.isRegistered()) { + Get.put(ProjectController(), permanent: true); + logSafe("💡 ProjectController injected as permanent."); + } + } else { + logSafe("⚠️ No token found. Skipping PermissionController and ProjectController injection."); + } AppStyle.init(); logSafe("💡 AppStyle initialized."); logSafe("✅ App initialization completed successfully."); } catch (e, stacktrace) { - logSafe("⛔ Error during app initialization", + logSafe( + "⛔ Error during app initialization", level: LogLevel.error, error: e, stackTrace: stacktrace, diff --git a/lib/helpers/services/auth_service.dart b/lib/helpers/services/auth_service.dart index bff8272..5c0bc0c 100644 --- a/lib/helpers/services/auth_service.dart +++ b/lib/helpers/services/auth_service.dart @@ -247,32 +247,45 @@ class AuthService { } /// Handle login success flow - static Future _handleLoginSuccess(Map data) async { - logSafe("Processing login success..."); + static Future _handleLoginSuccess(Map data) async { + logSafe("Processing login success..."); - final jwtToken = data['token']; - final refreshToken = data['refreshToken']; - final mpinToken = data['mpinToken']; + final jwtToken = data['token']; + final refreshToken = data['refreshToken']; + final mpinToken = data['mpinToken']; - await LocalStorage.setJwtToken(jwtToken); - await LocalStorage.setLoggedInUser(true); + // Save tokens + await LocalStorage.setJwtToken(jwtToken); + await LocalStorage.setLoggedInUser(true); - 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().fetchProjects(); - - isLoggedIn = true; - logSafe("Login flow completed."); + 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(); + } + + // Inject controllers if not already registered + if (!Get.isRegistered()) { + Get.put(PermissionController()); + logSafe("✅ PermissionController injected after login."); + } + + if (!Get.isRegistered()) { + Get.put(ProjectController(), permanent: true); + logSafe("✅ ProjectController injected after login."); + } + + // Load data into controllers + await Get.find().loadData(jwtToken); + await Get.find().fetchProjects(); + + isLoggedIn = true; + logSafe("✅ Login flow completed and controllers initialized."); } +} \ No newline at end of file