diff --git a/lib/ui/register_account/view/RegisterAccount.dart b/lib/ui/register_account/view/RegisterAccount.dart index 5ea87db..7c0a390 100644 --- a/lib/ui/register_account/view/RegisterAccount.dart +++ b/lib/ui/register_account/view/RegisterAccount.dart @@ -120,13 +120,18 @@ class _RegisterAccountState extends State<_RegisterAccount> { width: 291, height: 64, child: ElevatedButton( - onPressed: () { - viewModel.register().catchError((e) => showDialog( - context: context, - builder: (BuildContext context) => - ErrorPopUp(content: Text('$e')), - )); - // Ação ao clicar no botão de cadastro + onPressed: () async { + try { + await viewModel.register(context); + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text("Cadastro concluído com sucesso!"))); + } catch(e) { + showDialog( + context: context, + builder: (BuildContext context) => ErrorPopUp(content: Text('$e')), + //Ação ao clicar no botão de cadastro + ); + } }, child: Consumer( builder: (context, value, child) => value.isLoading diff --git a/lib/ui/register_account/viewModel/RegisterViewModel.dart b/lib/ui/register_account/viewModel/RegisterViewModel.dart index d91b31a..3398ace 100644 --- a/lib/ui/register_account/viewModel/RegisterViewModel.dart +++ b/lib/ui/register_account/viewModel/RegisterViewModel.dart @@ -1,9 +1,9 @@ +import 'package:aranduapp/ui/shared/ErrorPopUp.dart'; import 'package:flutter/material.dart'; import '../model/RegisterRequest.dart'; import '../service/RegisterService.dart'; class RegisterAccountViewModel extends ChangeNotifier { - final GlobalKey formKey = GlobalKey(); final TextEditingController nameController = TextEditingController(); final TextEditingController emailController = TextEditingController(); @@ -13,14 +13,14 @@ class RegisterAccountViewModel extends ChangeNotifier { final TextEditingController confPasswordController = TextEditingController(); bool isLoading = false; - bool isTermsAccepted = false; + bool isTermsAccepted = false; void toggleTermsAccepted(bool value) { isTermsAccepted = value; notifyListeners(); } - Future register() async { + Future register(BuildContext context) async { if (isLoading) return; // Valida se os termos foram aceitos if (!isTermsAccepted) { @@ -43,10 +43,11 @@ class RegisterAccountViewModel extends ChangeNotifier { ); // Chamada do serviço de registro await RegisterService.register(request); + } catch (e) { + rethrow; } finally { isLoading = false; notifyListeners(); } } } - diff --git a/lib/ui/shared/TextEmail.dart b/lib/ui/shared/TextEmail.dart index 385bbbc..27f533c 100644 --- a/lib/ui/shared/TextEmail.dart +++ b/lib/ui/shared/TextEmail.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; class TextEmail extends StatelessWidget{ - + final String label; final TextEditingController controller; final EdgeInsetsGeometry padding; @@ -11,8 +11,9 @@ class TextEmail extends StatelessWidget{ const TextEmail ({ super.key, + this.label = 'E-mail', required this.padding, - required this.controller + required this.controller, }); @@ -22,12 +23,18 @@ class TextEmail extends StatelessWidget{ return Padding( padding: padding, child: TextFormField( - validator: (value) => value == null|| emailRegex.hasMatch(value) ? null : 'E-mail inválido', + validator: (value) { + if (value == null || value.trim().isEmpty) { + return '$label Obrigatório.'; + } else if (!emailRegex.hasMatch(value.trim())) { + return 'Opa, $label inválido!\n(Ex: exemplo@gmail.com)'; + } + return null; + }, controller: controller, decoration: InputDecoration ( prefixIcon: Icon ( Icons.email_outlined, color: Theme.of(context).colorScheme.primary), - labelText: 'E-mail' - ), + labelText: label), ), ); } diff --git a/lib/ui/shared/TextName.dart b/lib/ui/shared/TextName.dart index e650f5f..620315b 100644 --- a/lib/ui/shared/TextName.dart +++ b/lib/ui/shared/TextName.dart @@ -17,8 +17,16 @@ class TextName extends StatelessWidget { return Padding( padding: padding, child: TextFormField( - validator: (value) => - value == null || value.trim().length < 3 ? '$label inválido' : null, + validator: (value) { + if (value == null || value.trim().isEmpty) { + return '$label Obrigatório.'; + } else if (value.trim().length < 2) { + return 'Opa, seu $label está pequeno!\nacrescente mais caracteres. (Ex: Ana)'; + } else if (value.trim().length < 3) { + return 'Opa, seu $label está pequeno!\nacrescente mais um caractere. (Ex: Ana)'; + } + return null; + }, controller: controller, decoration: InputDecoration( prefixIcon: Icon(Icons.person_outline, diff --git a/lib/ui/shared/TextPassword.dart b/lib/ui/shared/TextPassword.dart index a0d2f63..06379b4 100644 --- a/lib/ui/shared/TextPassword.dart +++ b/lib/ui/shared/TextPassword.dart @@ -1,56 +1,56 @@ import 'package:flutter/material.dart'; class TextPassWord extends StatefulWidget { - + final String label; final TextEditingController controller; final EdgeInsetsGeometry padding; - const TextPassWord ({ - super.key, - required this.padding, - required this.controller + const TextPassWord({ + super.key, + this.label = 'Senha', + required this.padding, + required this.controller, }); - @override State createState() { return _TextPassWord(); - } + } } - class _TextPassWord extends State { bool _hidePassord = true; @override Widget build(BuildContext context) { - - return - Padding( - padding: widget.padding, - child: TextFormField( + return Padding( + padding: widget.padding, + child: TextFormField( validator: (value) { - if (value == null || value.isEmpty || value.length < 8) { - return 'Senha inválida'; + if (value == null || value.isEmpty) { + return '${widget.label} Obrigatória.'; + } else if (value.length < 8) { + return '${widget.label} deve ter no mínimo 8 caracteres.\n(Ex: @abd1234)'; } return null; }, controller: widget.controller, - obscureText: _hidePassord, - decoration: InputDecoration ( - prefixIcon: Icon ( Icons.lock_outline, color: Theme.of(context).colorScheme.primary), - suffixIcon: GestureDetector ( - onTap: () => setState(() { _hidePassord = !_hidePassord; }), - child: Icon( - _hidePassord ? Icons.visibility_off_outlined : Icons.visibility_outlined, - color: Theme.of(context).colorScheme.primary - ) - ), - labelText: 'Senha' - ), + obscureText: _hidePassord, + decoration: InputDecoration( + prefixIcon: Icon(Icons.lock_outline, + color: Theme.of(context).colorScheme.primary), + suffixIcon: GestureDetector( + onTap: () => setState(() { + _hidePassord = !_hidePassord; + }), + child: Icon( + _hidePassord + ? Icons.visibility_off_outlined + : Icons.visibility_outlined, + color: Theme.of(context).colorScheme.primary)), + labelText: widget.label, ), - ); - - - } + ), + ); + } } diff --git a/pubspec.lock b/pubspec.lock index 36d2843..a9796c2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -577,7 +577,7 @@ packages: dependency: transitive description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted version: "1.9.0" diff --git a/test/ui/Shared/ErrorPopUp_test.dart b/test/ui/Shared/ErrorPopUp_test.dart index 5977af6..3bee757 100644 --- a/test/ui/Shared/ErrorPopUp_test.dart +++ b/test/ui/Shared/ErrorPopUp_test.dart @@ -29,6 +29,8 @@ void main() { // Rebuild após o tap para processar a navegação await tester.pumpAndSettle(); - expect(find.text('OK'), findsNothing); // O popup desapareceu + expect(find.text('OK'), findsNothing); + expect(find.byIcon(Icons.error), findsNothing); + expect(find.text('Este é um erro'), findsNothing); // O popup desapareceu }); } diff --git a/test/ui/Shared/TextEmail_test.dart b/test/ui/Shared/TextEmail_test.dart index 9474a3d..fb07c2e 100644 --- a/test/ui/Shared/TextEmail_test.dart +++ b/test/ui/Shared/TextEmail_test.dart @@ -28,10 +28,10 @@ void main() { } // Teste de validação para diferentes casos - await testEmail("", "E-mail inválido"); // Campo vazio - await testEmail("joaozinhi", "E-mail inválido"); // Sem '@' - await testEmail("joaozinhi@", "E-mail inválido"); // Sem domínio - await testEmail("joao@domain", "E-mail inválido"); // Sem extensão + await testEmail("", "E-mail Obrigatório."); // Campo vazio + await testEmail("joaozinhi", "Opa, E-mail inválido!\n(Ex: exemplo@gmail.com)"); // Sem '@' + await testEmail("joaozinhi@", "Opa, E-mail inválido!\n(Ex: exemplo@gmail.com)"); // Sem domínio + await testEmail("joao@domain", "Opa, E-mail inválido!\n(Ex: exemplo@gmail.com)"); // Sem extensão await testEmail("joao@example.com", null); // Entrada válida }); } diff --git a/test/ui/Shared/TextName_test.dart b/test/ui/Shared/TextName_test.dart index 6a493b2..b18e1ae 100644 --- a/test/ui/Shared/TextName_test.dart +++ b/test/ui/Shared/TextName_test.dart @@ -26,9 +26,9 @@ void main() { } // Teste de validação para diferentes casos de nome - await testName("", 'Nome inválido'); // Campo vazio - await testName(" a", 'Nome inválido'); // Nome com menos de 3 caracteres - await testName("Jo", 'Nome inválido'); // Nome com 2 caracteres + await testName("", 'Nome Obrigatório.'); // Campo vazio + await testName(" a", 'Opa, seu Nome está pequeno!\nacrescente mais caracteres. (Ex: Ana)'); // Nome com menos de 3 caracteres + await testName("Jo", 'Opa, seu Nome está pequeno!\nacrescente mais um caractere. (Ex: Ana)'); // Nome com 2 caracteres await testName("João", null); // Nome válido await testName("Maria", null); // Outro nome válido }); diff --git a/test/ui/Shared/TextPassword_test.dart b/test/ui/Shared/TextPassword_test.dart index a1551d4..95172d9 100644 --- a/test/ui/Shared/TextPassword_test.dart +++ b/test/ui/Shared/TextPassword_test.dart @@ -33,9 +33,9 @@ void main() { } // Testa senhas inválidas, válidas e campo vazio - await testPassword('12345', "Senha inválida"); // Senha muito curta + await testPassword('12345', "Senha deve ter no mínimo 8 caracteres.\n(Ex: @abd1234)"); // Senha muito curta await testPassword('validPassword123', null); // Senha válida - await testPassword('', 'Senha inválida'); // Campo vazio + await testPassword('', 'Senha Obrigatória.'); // Campo vazio }); // Testa a funcionalidade de visibilidade da senha