validação entre professor e aluno, criação de placeholder para a tela de professores e mudanças na firebase

This commit is contained in:
2026-05-08 16:37:36 +01:00
parent c821ce8e1e
commit 1b7b03034d
6 changed files with 461 additions and 73 deletions

View File

@@ -7,7 +7,9 @@ import '../../../../core/services/session_service.dart';
import '../../../../shared/presentation/widgets/custom_notification.dart';
class LoginPage extends StatefulWidget {
const LoginPage({super.key});
final String? selectedRole;
const LoginPage({super.key, this.selectedRole});
@override
State<LoginPage> createState() => _LoginPageState();
@@ -62,12 +64,41 @@ class _LoginPageState extends State<LoginPage> {
print('DEBUG: Iniciando processo de login para: $email');
// Attempt login with Firebase
await AuthService.signInWithEmailAndPassword(
final result = await AuthService.signInWithEmailAndPassword(
email: email,
password: password,
);
print('DEBUG: Login Firebase bem-sucedido, salvando sessão');
print('DEBUG: Login Firebase bem-sucedido');
print('DEBUG: Role selecionado na tela anterior: ${widget.selectedRole}');
// Ler role na Firestore
final uid = result?.user?.uid;
if (uid == null) throw Exception('Erro ao obter UID');
final actualRole = await AuthService.getUserRole(uid);
print('DEBUG: Role real do usuário na Firestore: $actualRole');
// Validar se o role selecionado corresponde ao role real
final selectedRole = widget.selectedRole;
if (selectedRole != null && actualRole != null && selectedRole != actualRole) {
// Role não corresponde - mostrar erro
setState(() {
_isLoading = false;
});
String errorMessage;
if (selectedRole == 'teacher' && actualRole == 'student') {
errorMessage = 'Este email está registado como Aluno. Não pode aceder à área de Professores.';
} else if (selectedRole == 'student' && actualRole == 'teacher') {
errorMessage = 'Este email está registado como Professor. Não pode aceder à área de Alunos.';
} else {
errorMessage = 'O tipo de utilizador selecionado não corresponde ao perfil registado.';
}
_showRoleErrorDialog('Acesso Negado', errorMessage);
return;
}
// Save session based on remember me preference
await SessionService.saveSession(
@@ -76,9 +107,6 @@ class _LoginPageState extends State<LoginPage> {
displayName: AuthService.currentUser?.displayName,
);
print('DEBUG: Sessão salva, navegando para dashboard');
// Navigate to student dashboard after successful login
if (mounted) {
setState(() {
_isLoading = false;
@@ -90,7 +118,12 @@ class _LoginPageState extends State<LoginPage> {
message: 'Login realizado com sucesso!',
);
context.go('/student-dashboard');
// Redirecionar baseado no role real
if (actualRole == 'teacher') {
context.go('/teacher-dashboard');
} else {
context.go('/student-dashboard');
}
}
} catch (e) {
print('DEBUG: Erro no login: $e');
@@ -110,6 +143,41 @@ class _LoginPageState extends State<LoginPage> {
}
}
void _showRoleErrorDialog(String title, String message) {
showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: Text(
title,
style: const TextStyle(
color: Color(0xFF2D3748),
fontWeight: FontWeight.bold,
),
),
content: Text(
message,
style: const TextStyle(color: Color(0xFF2D3748)),
),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
// Fazer logout para limpar a sessão
AuthService.signOut();
},
child: const Text(
'Voltar',
style: TextStyle(color: Color(0xFF82C9BD)),
),
),
],
);
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(