Manter sessão e loading
This commit is contained in:
@@ -126,10 +126,9 @@ class AppRouter {
|
||||
),
|
||||
],
|
||||
|
||||
// Redirect unauthenticated users to login
|
||||
// Let splash screen handle all navigation logic
|
||||
redirect: (context, state) {
|
||||
// TODO: Implement authentication check
|
||||
// For now, allow all routes
|
||||
// Allow all routes - splash screen will handle authentication and navigation
|
||||
return null;
|
||||
},
|
||||
);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:firebase_auth/firebase_auth.dart';
|
||||
import 'session_service.dart';
|
||||
|
||||
/// Service for handling Firebase Authentication
|
||||
class AuthService {
|
||||
@@ -90,12 +91,38 @@ class AuthService {
|
||||
try {
|
||||
print('DEBUG: Tentando fazer logout');
|
||||
await _auth.signOut();
|
||||
print('DEBUG: Logout realizado com sucesso');
|
||||
|
||||
// Clear saved session
|
||||
await SessionService.clearSession();
|
||||
|
||||
print('DEBUG: Logout e limpeza de sessão realizados com sucesso');
|
||||
} catch (e) {
|
||||
print('DEBUG: Erro ao fazer logout: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// Attempt auto-login with saved credentials
|
||||
static Future<bool> attemptAutoLogin() async {
|
||||
try {
|
||||
final sessionData = await SessionService.shouldAutoLogin();
|
||||
|
||||
if (sessionData['shouldAutoLogin'] == true) {
|
||||
final email = sessionData['email'];
|
||||
print('DEBUG: Attempting auto-login for: $email');
|
||||
|
||||
// Note: For security reasons, we cannot auto-login without password
|
||||
// This method just checks if auto-login is available
|
||||
// The actual login still requires user to enter password
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
} catch (e) {
|
||||
print('DEBUG: Error in auto-login attempt: $e');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// Get user-friendly error message
|
||||
static String _getErrorMessage(String code) {
|
||||
print('DEBUG: Processando código de erro: $code');
|
||||
|
||||
130
lib/core/services/session_service.dart
Normal file
130
lib/core/services/session_service.dart
Normal file
@@ -0,0 +1,130 @@
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:firebase_auth/firebase_auth.dart';
|
||||
|
||||
/// Service for managing persistent user sessions
|
||||
class SessionService {
|
||||
static const String _rememberMeKey = 'remember_me';
|
||||
static const String _userEmailKey = 'user_email';
|
||||
static const String _userDisplayNameKey = 'user_display_name';
|
||||
static const String _lastLoginTimeKey = 'last_login_time';
|
||||
|
||||
/// Save session preferences when user chooses "Remember me"
|
||||
static Future<void> saveSession({
|
||||
required bool rememberMe,
|
||||
required String email,
|
||||
String? displayName,
|
||||
}) async {
|
||||
try {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
|
||||
// Save remember me preference
|
||||
await prefs.setBool(_rememberMeKey, rememberMe);
|
||||
|
||||
if (rememberMe) {
|
||||
// Save user details for auto-login
|
||||
await prefs.setString(_userEmailKey, email);
|
||||
if (displayName != null) {
|
||||
await prefs.setString(_userDisplayNameKey, displayName);
|
||||
}
|
||||
await prefs.setInt(_lastLoginTimeKey, DateTime.now().millisecondsSinceEpoch);
|
||||
} else {
|
||||
// Clear saved session if remember me is unchecked
|
||||
await clearSession();
|
||||
}
|
||||
|
||||
print('DEBUG: Session saved - Remember me: $rememberMe, Email: $email');
|
||||
} catch (e) {
|
||||
print('DEBUG: Error saving session: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// Check if user should be automatically logged in
|
||||
static Future<Map<String, dynamic>> shouldAutoLogin() async {
|
||||
try {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
|
||||
final rememberMe = prefs.getBool(_rememberMeKey) ?? false;
|
||||
final email = prefs.getString(_userEmailKey);
|
||||
final displayName = prefs.getString(_userDisplayNameKey);
|
||||
final lastLoginTime = prefs.getInt(_lastLoginTimeKey);
|
||||
|
||||
print('DEBUG: Auto-login check - Remember me: $rememberMe, Email: $email');
|
||||
|
||||
if (rememberMe && email != null) {
|
||||
// Check if session is not too old (optional: 30 days)
|
||||
if (lastLoginTime != null) {
|
||||
final lastLogin = DateTime.fromMillisecondsSinceEpoch(lastLoginTime);
|
||||
final now = DateTime.now();
|
||||
final daysSinceLogin = now.difference(lastLogin).inDays;
|
||||
|
||||
if (daysSinceLogin <= 30) {
|
||||
return {
|
||||
'shouldAutoLogin': true,
|
||||
'email': email,
|
||||
'displayName': displayName,
|
||||
};
|
||||
} else {
|
||||
print('DEBUG: Session too old, clearing session');
|
||||
await clearSession();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {'shouldAutoLogin': false};
|
||||
} catch (e) {
|
||||
print('DEBUG: Error checking auto-login: $e');
|
||||
return {'shouldAutoLogin': false};
|
||||
}
|
||||
}
|
||||
|
||||
/// Clear saved session data
|
||||
static Future<void> clearSession() async {
|
||||
try {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
await prefs.remove(_rememberMeKey);
|
||||
await prefs.remove(_userEmailKey);
|
||||
await prefs.remove(_userDisplayNameKey);
|
||||
await prefs.remove(_lastLoginTimeKey);
|
||||
|
||||
print('DEBUG: Session cleared');
|
||||
} catch (e) {
|
||||
print('DEBUG: Error clearing session: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// Get current session info
|
||||
static Future<Map<String, dynamic>> getCurrentSession() async {
|
||||
try {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
|
||||
return {
|
||||
'rememberMe': prefs.getBool(_rememberMeKey) ?? false,
|
||||
'email': prefs.getString(_userEmailKey),
|
||||
'displayName': prefs.getString(_userDisplayNameKey),
|
||||
'lastLoginTime': prefs.getInt(_lastLoginTimeKey),
|
||||
};
|
||||
} catch (e) {
|
||||
print('DEBUG: Error getting current session: $e');
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
/// Update session with current Firebase user
|
||||
static Future<void> updateSessionWithCurrentUser() async {
|
||||
try {
|
||||
final user = FirebaseAuth.instance.currentUser;
|
||||
if (user != null) {
|
||||
final currentSession = await getCurrentSession();
|
||||
if (currentSession['rememberMe'] == true) {
|
||||
await saveSession(
|
||||
rememberMe: true,
|
||||
email: user.email ?? '',
|
||||
displayName: user.displayName,
|
||||
);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
print('DEBUG: Error updating session with current user: $e');
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user