firebase esta feita acabar o register

This commit is contained in:
2026-01-06 17:17:37 +00:00
parent 24bd74aedc
commit 44937ca6d3
14 changed files with 594 additions and 233 deletions

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:playmaker/Controllers/login_controller.dart';
import 'package:playmaker/pages/RegisterPage.dart';
class BasketTrackHeader extends StatelessWidget {
const BasketTrackHeader({super.key});
@@ -54,121 +55,47 @@
const LoginFormFields({super.key, required this.controller});
@override
Widget build(BuildContext context) {
final screenWidth = MediaQuery.of(context).size.width;
// TAMANHOS AUMENTADOS
final verticalPadding = screenWidth > 600 ? 26.0 : 20.0; // ↑ Aumentado
final spacing = screenWidth > 600 ? 28.0 : 20.0; // ↑ Aumentado
final labelFontSize = screenWidth > 600 ? 18.0 : 16.0; // ↑ Aumentado
final textFontSize = screenWidth > 600 ? 18.0 : 16.0; // ↑ Aumentado
@override
Widget build(BuildContext context) {
final screenWidth = MediaQuery.of(context).size.width;
final verticalPadding = screenWidth > 600 ? 22.0 : 16.0;
return Column(
children: [
TextField(
controller: controller.emailController,
style: TextStyle(fontSize: textFontSize), // ↑ Tamanho do texto
decoration: InputDecoration(
labelText: 'E-mail',
labelStyle: TextStyle(fontSize: labelFontSize), // ↑ Tamanho do label
prefixIcon: Icon(Icons.email_outlined, size: 24), // ↑ Ícone maior
errorText: controller.emailError,
errorStyle: TextStyle(fontSize: 14), // ↑ Tamanho do erro
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: Colors.grey[400]!),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: Colors.grey[400]!),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(color: Color(0xFFE74C3C), width: 2),
),
contentPadding: EdgeInsets.symmetric(
horizontal: 18, // ↑ Aumentado
vertical: verticalPadding,
),
),
keyboardType: TextInputType.emailAddress,
onChanged: (_) {
if (controller.emailError != null) {
controller.validateEmail(controller.emailController.text);
}
},
return Column(
children: [
TextField(
controller: controller.emailController,
decoration: InputDecoration(
labelText: 'E-mail',
prefixIcon: const Icon(Icons.email_outlined),
// O erro agora vem diretamente do controller
errorText: controller.emailError,
border: OutlineInputBorder(borderRadius: BorderRadius.circular(12)),
contentPadding: EdgeInsets.symmetric(vertical: verticalPadding, horizontal: 16),
),
SizedBox(height: spacing),
TextField(
controller: controller.passwordController,
style: TextStyle(fontSize: textFontSize), // ↑ Tamanho do texto
decoration: InputDecoration(
labelText: 'Palavra-passe',
labelStyle: TextStyle(fontSize: labelFontSize), // ↑ Tamanho do label
prefixIcon: Icon(Icons.lock_outlined, size: 24), // ↑ Ícone maior
suffixIcon: IconButton(
icon: Icon(
controller.obscurePassword
? Icons.visibility_outlined
: Icons.visibility_off_outlined,
color: Colors.grey[600],
size: 24, // ↑ Ícone maior
),
onPressed: controller.togglePasswordVisibility,
),
errorText: controller.passwordError,
errorStyle: TextStyle(fontSize: 14), // ↑ Tamanho do erro
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: Colors.grey[400]!),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: Colors.grey[400]!),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(color: Color(0xFFE74C3C), width: 2),
),
contentPadding: EdgeInsets.symmetric(
horizontal: 18, // ↑ Aumentado
vertical: verticalPadding,
),
keyboardType: TextInputType.emailAddress,
),
const SizedBox(height: 20),
TextField(
controller: controller.passwordController,
obscureText: controller.obscurePassword,
decoration: InputDecoration(
labelText: 'Palavra-passe',
prefixIcon: const Icon(Icons.lock_outlined),
errorText: controller.passwordError,
suffixIcon: IconButton(
icon: Icon(controller.obscurePassword
? Icons.visibility_outlined
: Icons.visibility_off_outlined),
onPressed: controller.togglePasswordVisibility,
),
obscureText: controller.obscurePassword,
onChanged: (_) {
if (controller.passwordError != null) {
controller.validatePassword(controller.passwordController.text);
}
},
border: OutlineInputBorder(borderRadius: BorderRadius.circular(12)),
contentPadding: EdgeInsets.symmetric(vertical: verticalPadding, horizontal: 16),
),
SizedBox(height: screenWidth > 600 ? 20.0 : 14.0), // ↑ Aumentado
Align(
alignment: Alignment.centerRight,
child: TextButton(
onPressed: () {},
style: TextButton.styleFrom(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8), // ↑ Mais espaço
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
),
child: Text(
'Recuperar Palavra-passe',
style: TextStyle(
fontSize: screenWidth > 600 ? 18.0 : 15.0, // ↑ Aumentado
color: const Color(0xFFE74C3C),
fontWeight: FontWeight.w600, // ↑ Mais negrito
),
),
),
),
],
);
}
),
],
);
}
}
class LoginButton extends StatelessWidget {
final LoginController controller;
final VoidCallback onLoginSuccess;
@@ -226,37 +153,42 @@
}
}
class CreateAccountButton extends StatelessWidget {
const CreateAccountButton({super.key});
class CreateAccountButton extends StatelessWidget {
const CreateAccountButton({super.key});
@override
Widget build(BuildContext context) {
final screenWidth = MediaQuery.of(context).size.width;
// BOTÃO MAIOR
final buttonHeight = screenWidth > 600 ? 70.0 : 58.0; // ↑ Aumentado
final fontSize = screenWidth > 600 ? 22.0 : 18.0; // ↑ Aumentado
@override
Widget build(BuildContext context) {
final screenWidth = MediaQuery.of(context).size.width;
final buttonHeight = screenWidth > 600 ? 70.0 : 58.0;
final fontSize = screenWidth > 600 ? 22.0 : 18.0;
return SizedBox(
width: double.infinity,
height: buttonHeight,
child: OutlinedButton(
onPressed: () {},
style: OutlinedButton.styleFrom(
foregroundColor: const Color(0xFFE74C3C),
side: const BorderSide(color: Color(0xFFE74C3C), width: 2), // ↑ Borda mais grossa
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(14), // ↑ Bordas mais arredondadas
),
),
child: Text(
'Criar Conta',
style: TextStyle(
fontSize: fontSize,
fontWeight: FontWeight.w700, // ↑ Mais negrito
),
return SizedBox(
width: double.infinity,
height: buttonHeight,
child: OutlinedButton(
onPressed: () {
// Navega para a página de registo que criaste
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const RegisterPage()),
);
},
style: OutlinedButton.styleFrom(
foregroundColor: const Color(0xFFE74C3C),
side: const BorderSide(color: Color(0xFFE74C3C), width: 2),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(14),
),
),
);
}
}
child: Text(
'Criar Conta',
style: TextStyle(
fontSize: fontSize,
fontWeight: FontWeight.w700,
),
),
),
);
}
}

View File

@@ -0,0 +1,53 @@
import 'package:flutter/material.dart';
import 'package:playmaker/controllers/register_controller.dart';
class RegisterFormFields extends StatelessWidget {
final RegisterController controller;
const RegisterFormFields({super.key, required this.controller});
@override
Widget build(BuildContext context) {
final verticalPadding = MediaQuery.of(context).size.width > 600 ? 22.0 : 16.0;
return Column(
children: [
// Campo Email
TextField(
controller: controller.emailController,
decoration: InputDecoration(
labelText: 'E-mail',
prefixIcon: const Icon(Icons.email_outlined),
errorText: controller.emailError,
border: OutlineInputBorder(borderRadius: BorderRadius.circular(12)),
),
),
const SizedBox(height: 20),
// Campo Password
TextField(
controller: controller.passwordController,
obscureText: true,
decoration: InputDecoration(
labelText: 'Palavra-passe',
prefixIcon: const Icon(Icons.lock_outlined),
errorText: controller.passwordError,
border: OutlineInputBorder(borderRadius: BorderRadius.circular(12)),
),
),
const SizedBox(height: 20),
// NOVO: Campo Confirmar Password
TextField(
controller: controller.confirmPasswordController,
obscureText: true,
decoration: InputDecoration(
labelText: 'Confirmar Palavra-passe',
prefixIcon: const Icon(Icons.lock_clock_outlined),
errorText: controller.confirmPasswordError, // Erro específico
border: OutlineInputBorder(borderRadius: BorderRadius.circular(12)),
contentPadding: EdgeInsets.symmetric(vertical: verticalPadding, horizontal: 16),
),
),
],
);
}
}