From 1e1bcc3aa4a66a7d2a9b2df37549f25e9b2f56a6 Mon Sep 17 00:00:00 2001 From: Vaibhav Surve Date: Wed, 9 Jul 2025 16:40:23 +0530 Subject: [PATCH] feat(otp): implement email saving and loading functionality in OTPController --- lib/controller/auth/otp_controller.dart | 27 +++++++++++++++++++++-- lib/helpers/services/app_initializer.dart | 22 ++++++++++++++++-- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/lib/controller/auth/otp_controller.dart b/lib/controller/auth/otp_controller.dart index 06ebf88..43c76ac 100644 --- a/lib/controller/auth/otp_controller.dart +++ b/lib/controller/auth/otp_controller.dart @@ -25,6 +25,7 @@ class OTPController extends GetxController { void onInit() { super.onInit(); timer.value = 0; + _loadSavedEmail(); logSafe("[OTPController] Initialized"); } @@ -53,7 +54,6 @@ class OTPController extends GetxController { "[OTPController] OTP send failed", level: LogLevel.warning, error: result['error'], - ); showAppSnackbar( title: "Error", @@ -85,6 +85,7 @@ class OTPController extends GetxController { if (success) { email.value = userEmail; isOTPSent.value = true; + await _saveEmailIfRemembered(userEmail); _startTimer(); _clearOTPFields(); } @@ -144,7 +145,7 @@ class OTPController extends GetxController { Get.offAllNamed('/home'); } else { final error = result['error'] ?? "Failed to verify OTP"; - logSafe("[OTPController] OTP verification failed", level: LogLevel.warning, error: error, ); + logSafe("[OTPController] OTP verification failed", level: LogLevel.warning, error: error); showAppSnackbar( title: "Error", message: error, @@ -189,10 +190,32 @@ class OTPController extends GetxController { for (final node in focusNodes) { node.unfocus(); } + + // Optionally remove saved email + LocalStorage.removeToken('otp_email'); } bool _validateEmail(String email) { final regex = RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,}$'); return regex.hasMatch(email); } + + /// Save email to local storage if "remember me" is set + Future _saveEmailIfRemembered(String email) async { + final remember = LocalStorage.getBool('remember_me') ?? false; + if (remember) { + await LocalStorage.setToken('otp_email', email); + } + } + + /// Load email from local storage if "remember me" is true + Future _loadSavedEmail() async { + final remember = LocalStorage.getBool('remember_me') ?? false; + if (remember) { + final savedEmail = LocalStorage.getToken('otp_email') ?? ''; + emailController.text = savedEmail; + email.value = savedEmail; + logSafe("[OTPController] Loaded saved email from local storage: $savedEmail"); + } + } } diff --git a/lib/helpers/services/app_initializer.dart b/lib/helpers/services/app_initializer.dart index 0f6e7d0..5d55b0c 100644 --- a/lib/helpers/services/app_initializer.dart +++ b/lib/helpers/services/app_initializer.dart @@ -7,7 +7,7 @@ import 'package:marco/helpers/theme/theme_customizer.dart'; import 'package:marco/helpers/theme/app_theme.dart'; import 'package:url_strategy/url_strategy.dart'; import 'package:marco/helpers/services/app_logger.dart'; - +import 'package:marco/helpers/services/auth_service.dart'; Future initializeApp() async { try { logSafe("💡 Starting app initialization..."); @@ -24,6 +24,20 @@ Future initializeApp() async { await LocalStorage.init(); logSafe("💡 Local storage initialized."); + // If a refresh token is found, try to refresh the JWT token + final refreshToken = await LocalStorage.getRefreshToken(); + if (refreshToken != null && refreshToken.isNotEmpty) { + logSafe("🔁 Refresh token found. Attempting to refresh JWT..."); + final success = await AuthService.refreshToken(); + + if (!success) { + logSafe("⚠️ Refresh token invalid or expired. Skipping controller injection."); + // Optionally, clear tokens and force logout here if needed + } + } else { + logSafe("❌ No refresh token found. Skipping refresh."); + } + await ThemeCustomizer.init(); logSafe("💡 Theme customizer initialized."); @@ -38,8 +52,12 @@ Future initializeApp() async { Get.put(ProjectController(), permanent: true); logSafe("💡 ProjectController injected as permanent."); } + + // Load data into controllers if required + await Get.find().loadData(token); + await Get.find().fetchProjects(); } else { - logSafe("⚠️ No token found. Skipping PermissionController and ProjectController injection."); + logSafe("⚠️ No valid JWT token found. Skipping controller initialization."); } AppStyle.init();