diff --git a/lib/ui/login/view/LoginView.dart b/lib/ui/login/view/LoginView.dart index ae86c56..de7fbb7 100644 --- a/lib/ui/login/view/LoginView.dart +++ b/lib/ui/login/view/LoginView.dart @@ -1,6 +1,7 @@ import 'package:aranduapp/core/log/Log.dart'; import 'package:aranduapp/ui/home/view/HomeView.dart'; import 'package:aranduapp/ui/shared/TextAndLink.dart'; +import 'package:aranduapp/ui/shared/arabescos.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; @@ -106,7 +107,14 @@ class _LoginState extends State<_Login> { return SingleChildScrollView( child: Column( mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, children: [ + const Row( + mainAxisSize: MainAxisSize.min, + children: [ + TrianglesAndRhombus(), + ], + ), const SizedBox(height: 80), const TitleSlogan(), const SizedBox(height: 80), @@ -154,7 +162,7 @@ class _LoginState extends State<_Login> { onTap: () { Navigator.of(context).push( MaterialPageRoute( - builder: (context) => RecoverAccount(), + builder: (context) => const RecoverAccount(), ), ); }, diff --git a/lib/ui/login/viewModel/LoginViewModel.dart b/lib/ui/login/viewModel/LoginViewModel.dart index 137b386..47ba35d 100644 --- a/lib/ui/login/viewModel/LoginViewModel.dart +++ b/lib/ui/login/viewModel/LoginViewModel.dart @@ -1,33 +1,26 @@ - import 'package:flutter/material.dart'; import 'package:local_auth/local_auth.dart'; import 'package:aranduapp/ui/login/service/LoginService.dart'; import 'package:aranduapp/ui/login/model/LoginRequest.dart'; -import 'package:aranduapp/ui/home/view/HomeView.dart'; - class LoginViewModel extends ChangeNotifier { - final BuildContext context; - + bool isLoading; final GlobalKey formKey; final TextEditingController emailController; final TextEditingController passwordController; - LoginViewModel(this.context) : - isLoading = false, - formKey = GlobalKey(), - emailController = TextEditingController(), - passwordController = TextEditingController(); + LoginViewModel(this.context) + : isLoading = false, + formKey = GlobalKey(), + emailController = TextEditingController(), + passwordController = TextEditingController(); - - Future loginWithEmailAndPassword() async { - // TODO use mutex to make this - if (isLoading){ + if (isLoading) { return; } @@ -39,8 +32,8 @@ class LoginViewModel extends ChangeNotifier { throw Exception('Valores inválidos'); } - await LoginService.login(LoginRequest(emailController.text, passwordController.text)); - + await LoginService.login( + LoginRequest(emailController.text, passwordController.text)); } catch (e) { rethrow; } finally { @@ -55,16 +48,12 @@ class LoginViewModel extends ChangeNotifier { throw UnimplementedError(); } - Future loginWithDeviceAuth() async { - bool value = await LocalAuthentication().authenticate( - localizedReason: 'Toque com o dedo no sensor para logar'); - - if (!value) - throw Exception(); - - } - - + Future loginWithDeviceAuth() async { + bool value = await LocalAuthentication() + .authenticate(localizedReason: 'Toque com o dedo no sensor para logar'); + if (!value) { + throw Exception(); + } + } } - diff --git a/lib/ui/register_account/view/RegisterAccount.dart b/lib/ui/register_account/view/RegisterAccount.dart index 4e4e269..0990160 100644 --- a/lib/ui/register_account/view/RegisterAccount.dart +++ b/lib/ui/register_account/view/RegisterAccount.dart @@ -1,7 +1,7 @@ -import 'package:aranduapp/ui/login/view/LoginView.dart'; import 'package:aranduapp/ui/shared/OrDivider.dart'; import 'package:aranduapp/ui/shared/TextAndLink.dart'; import 'package:aranduapp/ui/shared/TextName.dart'; +import 'package:aranduapp/ui/shared/arabescos.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:aranduapp/core/log/Log.dart'; @@ -46,6 +46,12 @@ class _RegisterAccountState extends State<_RegisterAccount> { child: Column( mainAxisAlignment: MainAxisAlignment.start, children: [ + const Row( + mainAxisSize: MainAxisSize.min, + children: [ + TrianglesAndRhombus(), + ], + ), const SizedBox(height: 80), const TitleSlogan(), const SizedBox(height: 10), diff --git a/lib/ui/shared/CustomInputDecoration.dart b/lib/ui/shared/CustomInputDecoration.dart new file mode 100644 index 0000000..4268f3f --- /dev/null +++ b/lib/ui/shared/CustomInputDecoration.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +InputDecoration customInputDecoration({ + required String labelText, + Widget? prefixIcon, + GestureDetector? suffixIcon, +}) { + return InputDecoration( + labelText: labelText, + prefixIcon: prefixIcon, + suffixIcon: suffixIcon, + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14.0), + borderSide: const BorderSide(color: Colors.transparent), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14.0), + borderSide: const BorderSide(color: Colors.transparent), + ), + errorBorder: OutlineInputBorder( + borderSide: const BorderSide(color: Colors.red, width: 2.0), + borderRadius: BorderRadius.circular(14.0), + ), + focusedErrorBorder: OutlineInputBorder( + borderSide: const BorderSide(color: Colors.redAccent, width: 2.0), + borderRadius: BorderRadius.circular(14.0), + ), + filled: true, + fillColor: const Color.fromARGB(255, 44, 44, 44), + ); +} diff --git a/lib/ui/shared/TextEmail.dart b/lib/ui/shared/TextEmail.dart index 385bbbc..d2e3bb8 100644 --- a/lib/ui/shared/TextEmail.dart +++ b/lib/ui/shared/TextEmail.dart @@ -1,35 +1,29 @@ +import 'package:aranduapp/ui/shared/CustomInputDecoration.dart'; import 'package:flutter/material.dart'; -class TextEmail extends StatelessWidget{ - - +class TextEmail extends StatelessWidget { final TextEditingController controller; final EdgeInsetsGeometry padding; - static final RegExp emailRegex = RegExp(r'^[\w-\.]+@([\w-]+\.)+\w{2,4}$'); - - - const TextEmail ({ - super.key, - required this.padding, - required this.controller - }); - + static final RegExp emailRegex = RegExp(r'^[\w-\.]+@([\w-]+\.)+\w{2,4}$'); + const TextEmail({super.key, required this.padding, required this.controller}); @override Widget build(BuildContext context) { return Padding( - padding: padding, + padding: padding, child: TextFormField( - validator: (value) => value == null|| emailRegex.hasMatch(value) ? null : 'E-mail inválido', + validator: (value) => value == null || emailRegex.hasMatch(value) + ? null + : 'E-mail inválido', controller: controller, - decoration: InputDecoration ( - prefixIcon: Icon ( Icons.email_outlined, color: Theme.of(context).colorScheme.primary), - labelText: 'E-mail' + decoration: customInputDecoration( + prefixIcon: Icon(Icons.email_outlined, + color: Theme.of(context).colorScheme.primary), + labelText: 'E-mail', ), ), ); } - } diff --git a/lib/ui/shared/TextName.dart b/lib/ui/shared/TextName.dart index e650f5f..ebdfd69 100644 --- a/lib/ui/shared/TextName.dart +++ b/lib/ui/shared/TextName.dart @@ -1,3 +1,4 @@ +import 'package:aranduapp/ui/shared/CustomInputDecoration.dart'; import 'package:flutter/material.dart'; class TextName extends StatelessWidget { @@ -20,10 +21,11 @@ class TextName extends StatelessWidget { validator: (value) => value == null || value.trim().length < 3 ? '$label inválido' : null, controller: controller, - decoration: InputDecoration( - prefixIcon: Icon(Icons.person_outline, - color: Theme.of(context).colorScheme.primary), - labelText: label), + decoration: customInputDecoration( + prefixIcon: Icon(Icons.person_outline, + color: Theme.of(context).colorScheme.primary), + labelText: label, + ), ), ); } diff --git a/lib/ui/shared/TextPassword.dart b/lib/ui/shared/TextPassword.dart index a0d2f63..defa740 100644 --- a/lib/ui/shared/TextPassword.dart +++ b/lib/ui/shared/TextPassword.dart @@ -1,34 +1,27 @@ +import 'package:aranduapp/ui/shared/CustomInputDecoration.dart'; import 'package:flutter/material.dart'; class TextPassWord extends StatefulWidget { - final TextEditingController controller; final EdgeInsetsGeometry padding; - const TextPassWord ({ - super.key, - required this.padding, - required this.controller - }); - + const TextPassWord( + {super.key, 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'; @@ -36,21 +29,22 @@ class _TextPassWord extends State { 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: customInputDecoration( + 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', ), - ); - - - } + ), + ); + } } diff --git a/lib/ui/shared/arabescos.dart b/lib/ui/shared/arabescos.dart new file mode 100644 index 0000000..06b428a --- /dev/null +++ b/lib/ui/shared/arabescos.dart @@ -0,0 +1,82 @@ +import 'package:flutter/material.dart'; + +class TrianglesAndRhombus extends StatelessWidget { + const TrianglesAndRhombus({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: _buildPattern(10), + ), + ], + ); + } + + List _buildPattern(int count) { + List widgets = []; + for (int i = 0; i < count; i++) { + if (i % 2 == 0) { + widgets.add(CustomPaint( + size: const Size(40, 40), + painter: RhombusPainter(offset: 8), + )); + } else { + widgets.add(CustomPaint( + size: const Size(40, 20), + painter: InvertedTrianglePainter(), + )); + } + } + return widgets; + } +} + +class RhombusPainter extends CustomPainter { + final double offset; + + RhombusPainter({required this.offset}); + + @override + void paint(Canvas canvas, Size size) { + final paint = Paint() + ..color = Colors.grey.shade800 + ..style = PaintingStyle.fill; + + final path = Path(); + + path.moveTo(size.width / 2, offset); + path.lineTo(size.width, size.height / 2 + offset); + path.lineTo(size.width / 2, size.height + offset); + path.lineTo(0, size.height / 2 + offset); + path.close(); + + canvas.drawPath(path, paint); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +} + +class InvertedTrianglePainter extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + final paint = Paint() + ..color = Colors.grey.shade800 + ..style = PaintingStyle.fill; + + final path = Path(); + + path.moveTo(0, 0); + path.lineTo(size.width, 0); + path.lineTo(size.width / 2, size.height); + path.close(); + + canvas.drawPath(path, paint); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +}