feat(otp): implement email saving and loading functionality in OTPController
This commit is contained in:
parent
5b5030ec36
commit
1e1bcc3aa4
@ -25,6 +25,7 @@ class OTPController extends GetxController {
|
|||||||
void onInit() {
|
void onInit() {
|
||||||
super.onInit();
|
super.onInit();
|
||||||
timer.value = 0;
|
timer.value = 0;
|
||||||
|
_loadSavedEmail();
|
||||||
logSafe("[OTPController] Initialized");
|
logSafe("[OTPController] Initialized");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,7 +54,6 @@ class OTPController extends GetxController {
|
|||||||
"[OTPController] OTP send failed",
|
"[OTPController] OTP send failed",
|
||||||
level: LogLevel.warning,
|
level: LogLevel.warning,
|
||||||
error: result['error'],
|
error: result['error'],
|
||||||
|
|
||||||
);
|
);
|
||||||
showAppSnackbar(
|
showAppSnackbar(
|
||||||
title: "Error",
|
title: "Error",
|
||||||
@ -85,6 +85,7 @@ class OTPController extends GetxController {
|
|||||||
if (success) {
|
if (success) {
|
||||||
email.value = userEmail;
|
email.value = userEmail;
|
||||||
isOTPSent.value = true;
|
isOTPSent.value = true;
|
||||||
|
await _saveEmailIfRemembered(userEmail);
|
||||||
_startTimer();
|
_startTimer();
|
||||||
_clearOTPFields();
|
_clearOTPFields();
|
||||||
}
|
}
|
||||||
@ -144,7 +145,7 @@ class OTPController extends GetxController {
|
|||||||
Get.offAllNamed('/home');
|
Get.offAllNamed('/home');
|
||||||
} else {
|
} else {
|
||||||
final error = result['error'] ?? "Failed to verify OTP";
|
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(
|
showAppSnackbar(
|
||||||
title: "Error",
|
title: "Error",
|
||||||
message: error,
|
message: error,
|
||||||
@ -189,10 +190,32 @@ class OTPController extends GetxController {
|
|||||||
for (final node in focusNodes) {
|
for (final node in focusNodes) {
|
||||||
node.unfocus();
|
node.unfocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Optionally remove saved email
|
||||||
|
LocalStorage.removeToken('otp_email');
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _validateEmail(String email) {
|
bool _validateEmail(String email) {
|
||||||
final regex = RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,}$');
|
final regex = RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,}$');
|
||||||
return regex.hasMatch(email);
|
return regex.hasMatch(email);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Save email to local storage if "remember me" is set
|
||||||
|
Future<void> _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<void> _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");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ import 'package:marco/helpers/theme/theme_customizer.dart';
|
|||||||
import 'package:marco/helpers/theme/app_theme.dart';
|
import 'package:marco/helpers/theme/app_theme.dart';
|
||||||
import 'package:url_strategy/url_strategy.dart';
|
import 'package:url_strategy/url_strategy.dart';
|
||||||
import 'package:marco/helpers/services/app_logger.dart';
|
import 'package:marco/helpers/services/app_logger.dart';
|
||||||
|
import 'package:marco/helpers/services/auth_service.dart';
|
||||||
Future<void> initializeApp() async {
|
Future<void> initializeApp() async {
|
||||||
try {
|
try {
|
||||||
logSafe("💡 Starting app initialization...");
|
logSafe("💡 Starting app initialization...");
|
||||||
@ -24,6 +24,20 @@ Future<void> initializeApp() async {
|
|||||||
await LocalStorage.init();
|
await LocalStorage.init();
|
||||||
logSafe("💡 Local storage initialized.");
|
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();
|
await ThemeCustomizer.init();
|
||||||
logSafe("💡 Theme customizer initialized.");
|
logSafe("💡 Theme customizer initialized.");
|
||||||
|
|
||||||
@ -38,8 +52,12 @@ Future<void> initializeApp() async {
|
|||||||
Get.put(ProjectController(), permanent: true);
|
Get.put(ProjectController(), permanent: true);
|
||||||
logSafe("💡 ProjectController injected as permanent.");
|
logSafe("💡 ProjectController injected as permanent.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Load data into controllers if required
|
||||||
|
await Get.find<PermissionController>().loadData(token);
|
||||||
|
await Get.find<ProjectController>().fetchProjects();
|
||||||
} else {
|
} else {
|
||||||
logSafe("⚠️ No token found. Skipping PermissionController and ProjectController injection.");
|
logSafe("⚠️ No valid JWT token found. Skipping controller initialization.");
|
||||||
}
|
}
|
||||||
|
|
||||||
AppStyle.init();
|
AppStyle.init();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user