From fc877ab76e71e26a61aea024ebb36e35f3a7dcac Mon Sep 17 00:00:00 2001 From: Juan Felipe Duarte <70235683+DuarteJFelipe@users.noreply.github.com> Date: Wed, 12 Apr 2023 16:32:40 -0500 Subject: [PATCH] login con email --- android/app/src/main/AndroidManifest.xml | 2 +- .../authentication_repository.dart | 35 +- .../controllers/login_email_controller.dart | 5 + lib/src/screens/login.dart | 18 - lib/src/screens/login_email.dart | 11 +- lib/src/screens/register.dart | 421 +++++++++--------- 6 files changed, 255 insertions(+), 237 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index b26ff0f..704325a 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ createUserWithEmailAndPassword( String email, String password) async { try { - // try { - // await firebase.collection('Users').doc().set({ - // "Email": email, - // "Password": password, - // }); - // } catch (e) { - // print('Error $e'); - // } await _auth.createUserWithEmailAndPassword( email: email, password: password); @@ -91,7 +83,11 @@ class AuthenticationRepository extends GetxController { : Get.to(LoginScreen()); } on FirebaseAuthException catch (e) { final ex = SignUpWithEmailAndPasswordFailure.code(e.code); - print('FIREBASE AUTH EXCEPTION - ${ex.message}'); + Get.snackbar( + 'Correo Invalido', + 'Por favor pruebe con otro.', + snackPosition: SnackPosition.BOTTOM, + ); } catch (_) { const ex = SignUpWithEmailAndPasswordFailure(); print('EXCEPTION - ${ex.message}'); @@ -103,6 +99,27 @@ class AuthenticationRepository extends GetxController { try { await _auth.signInWithEmailAndPassword(email: email, password: password); } on FirebaseAuthException catch (e) { + if (e.code == 'wrong-password') { + Get.snackbar( + 'Contraseña incorrecta', + 'Por favor intentelo de nuevo.', + snackPosition: SnackPosition.BOTTOM, + ); + } + if (e.code == 'invalid-email') { + Get.snackbar( + 'Ingrese un email valido', + 'Por favor pruebe con otro.', + snackPosition: SnackPosition.BOTTOM, + ); + } + if (e.code == 'user-not-found') { + Get.snackbar( + 'Email no encontrado', + 'Este correo no se encuentra registrado.', + snackPosition: SnackPosition.BOTTOM, + ); + } } catch (_) {} } diff --git a/lib/src/controllers/login_email_controller.dart b/lib/src/controllers/login_email_controller.dart index 0130320..ed29f60 100644 --- a/lib/src/controllers/login_email_controller.dart +++ b/lib/src/controllers/login_email_controller.dart @@ -7,4 +7,9 @@ class LoginEmailController extends GetxController { final email = TextEditingController(); final password = TextEditingController(); + + void loginUser(String email, String password) { + AuthenticationRepository.instance + .loginWithEmailAndPassword(email, password); + } } diff --git a/lib/src/screens/login.dart b/lib/src/screens/login.dart index 3dd4c33..a12947b 100644 --- a/lib/src/screens/login.dart +++ b/lib/src/screens/login.dart @@ -96,24 +96,6 @@ class _LoginScreenState extends State { filled: true, ), ), - // child: TextFormField( - // controller: controller.phoneNo, - // decoration: InputDecoration( - // enabledBorder: OutlineInputBorder( - // borderSide: BorderSide(color: Color(0xFFECECEC)), - // borderRadius: BorderRadius.all( - // Radius.circular(50), - // )), - // focusedBorder: OutlineInputBorder( - // borderSide: BorderSide(color: Color(0xFFECECEC)), - // borderRadius: BorderRadius.all( - // Radius.circular(50), - // )), - // hintText: '+57', - // fillColor: Color.fromARGB(255, 239, 239, 239), - // filled: true, - // prefixIcon: Icon(Icons.phone_android_outlined)), - // ), ), ), const Padding( diff --git a/lib/src/screens/login_email.dart b/lib/src/screens/login_email.dart index 35acce2..85a0553 100644 --- a/lib/src/screens/login_email.dart +++ b/lib/src/screens/login_email.dart @@ -5,6 +5,7 @@ import 'package:prosappco/main.dart'; import 'package:prosappco/src/authentication/authentication_repository.dart'; import 'package:prosappco/src/components/primary_btn.dart'; import 'package:prosappco/src/controllers/login_email_controller.dart'; +import 'package:prosappco/src/controllers/register_controller.dart'; import 'package:prosappco/src/screens/login.dart'; import 'package:prosappco/src/screens/welcome.dart'; import 'package:provider/provider.dart'; @@ -216,7 +217,15 @@ class _LoginEmailScreenState extends State { Padding( padding: const EdgeInsets.only(bottom: 40), child: Center( - child: PrimaryButtom(onPressed: () {}, label: 'Iniciar'), + child: PrimaryButtom( + onPressed: () { + if (_formKey.currentState!.validate()) { + LoginEmailController.instance.loginUser( + controller.email.text.trim(), + controller.password.text.trim()); + } + }, + label: 'Iniciar'), ), ), RichText( diff --git a/lib/src/screens/register.dart b/lib/src/screens/register.dart index bc058d5..dfde15d 100644 --- a/lib/src/screens/register.dart +++ b/lib/src/screens/register.dart @@ -28,130 +28,166 @@ class _RegisterScreenState extends State { child: Scaffold( resizeToAvoidBottomInset: false, backgroundColor: Color(0xFFD6F4FF), - body: Stack( - children: [ - Container( - margin: const EdgeInsets.only(top: 130), - width: double.infinity, - height: 800, - decoration: const BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only( - topRight: Radius.circular(50), - topLeft: Radius.circular(50))), - ), - Container( - margin: const EdgeInsets.only(top: 20, left: 30), - child: const Image( - image: AssetImage('images/logo_prosapp.png'), - width: 180, - height: 100, + body: GestureDetector( + onTap: () => FocusScope.of(context).unfocus(), + child: Stack( + children: [ + Container( + margin: const EdgeInsets.only(top: 130), + width: double.infinity, + height: 800, + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topRight: Radius.circular(50), + topLeft: Radius.circular(50))), ), - ), - Container( - padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 20), - margin: const EdgeInsets.only( - top: 125, - left: 25, + Container( + margin: const EdgeInsets.only(top: 20, left: 30), + child: const Image( + image: AssetImage('images/logo_prosapp.png'), + width: 180, + height: 100, + ), ), - child: Row( - children: [ - IconButton( - icon: Icon( - Icons.arrow_back, - size: 30, - ), - onPressed: () { - Navigator.pop(context); - }, - ), - Text( - 'Registro', - style: TextStyle( - color: Color(0xFF262626), - fontSize: 38.0, - fontWeight: FontWeight.bold, - ), - textAlign: TextAlign.right, - ), - ], - ), - ), - Container( - padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 20), - margin: const EdgeInsets.only(top: 200, left: 50, right: 50), - child: Column(children: [ - Padding( - padding: EdgeInsets.only(bottom: 20), - child: ElevatedButton( - onPressed: () async { - await AuthenticationRepository.instance - .signInWithGoogle(); - }, - style: ElevatedButton.styleFrom( - primary: Color(0xFF2BA4EC), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(50), - ), - elevation: 0, - minimumSize: Size(230, 60), + Container( + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 20), + margin: const EdgeInsets.only( + top: 125, + left: 25, + ), + child: Row( + children: [ + IconButton( + icon: Icon( + Icons.arrow_back, + size: 30, ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, + onPressed: () { + Navigator.pop(context); + }, + ), + Text( + 'Registro', + style: TextStyle( + color: Color(0xFF262626), + fontSize: 38.0, + fontWeight: FontWeight.bold, + ), + textAlign: TextAlign.right, + ), + ], + ), + ), + Container( + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 20), + margin: const EdgeInsets.only(top: 200, left: 50, right: 50), + child: Column(children: [ + Padding( + padding: EdgeInsets.only(bottom: 20), + child: ElevatedButton( + onPressed: () async { + await AuthenticationRepository.instance + .signInWithGoogle(); + }, + style: ElevatedButton.styleFrom( + primary: Color(0xFF2BA4EC), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(50), + ), + elevation: 0, + minimumSize: Size(230, 60), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Entrar con Google ', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 18, + ), + ), + SizedBox(width: 5), + FaIcon(FontAwesomeIcons.google), + ], + )), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 0), + child: Row( + children: [ + Expanded( + child: Divider( + color: Colors.black38, + thickness: 1, + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 10), + child: Text("ó"), + ), + Expanded( + child: Divider( + color: Colors.black38, + thickness: 1, + ), + ), + ], + ), + ), + Form( + key: _formKey, + child: Column( children: [ - Text( - 'Entrar con Google ', - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 18, + const Padding( + padding: EdgeInsets.only(bottom: 5), + child: Align( + alignment: Alignment.topLeft, + child: Text('Email', + style: TextStyle( + fontSize: 18.0, + color: Color(0xFF65676B))), + )), + Padding( + padding: EdgeInsets.only(bottom: 18), + child: TextFormField( + controller: controller.email, + decoration: InputDecoration( + enabledBorder: OutlineInputBorder( + borderSide: + BorderSide(color: Color(0xFFECECEC)), + borderRadius: BorderRadius.all( + Radius.circular(50), + )), + focusedBorder: OutlineInputBorder( + borderSide: + BorderSide(color: Color(0xFFECECEC)), + borderRadius: BorderRadius.all( + Radius.circular(50), + )), + hintText: 'Hello@gmail.com', + fillColor: Color.fromARGB(255, 239, 239, 239), + filled: true, + prefixIcon: Icon(Icons.email_outlined)), ), ), - SizedBox(width: 5), - FaIcon(FontAwesomeIcons.google), - ], - )), - ), - Padding( - padding: EdgeInsets.symmetric(vertical: 0), - child: Row( - children: [ - Expanded( - child: Divider( - color: Colors.black38, - thickness: 1, - ), - ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 10), - child: Text("ó"), - ), - Expanded( - child: Divider( - color: Colors.black38, - thickness: 1, - ), - ), - ], - ), - ), - Form( - key: _formKey, - child: Column( - children: [ - const Padding( - padding: EdgeInsets.only(bottom: 5), - child: Align( - alignment: Alignment.topLeft, - child: Text('Email', - style: TextStyle( - fontSize: 18.0, color: Color(0xFF65676B))), - )), - Padding( - padding: EdgeInsets.only(bottom: 18), - child: TextFormField( - controller: controller.email, - decoration: InputDecoration( + const Padding( + padding: EdgeInsets.only(bottom: 5), + child: Align( + alignment: Alignment.topLeft, + child: Text('Password', + style: TextStyle( + fontSize: 18.0, + color: Color(0xFF65676B))), + )), + Padding( + padding: const EdgeInsets.only(bottom: 25), + child: TextFormField( + controller: controller.password, + obscureText: _obscureText, + decoration: InputDecoration( enabledBorder: OutlineInputBorder( borderSide: BorderSide(color: Color(0xFFECECEC)), @@ -164,105 +200,74 @@ class _RegisterScreenState extends State { borderRadius: BorderRadius.all( Radius.circular(50), )), - hintText: 'Hello@gmail.com', + hintText: 'Contraseña', fillColor: Color.fromARGB(255, 239, 239, 239), filled: true, - prefixIcon: Icon(Icons.email_outlined)), - ), - ), - const Padding( - padding: EdgeInsets.only(bottom: 5), - child: Align( - alignment: Alignment.topLeft, - child: Text('Password', - style: TextStyle( - fontSize: 18.0, color: Color(0xFF65676B))), - )), - Padding( - padding: const EdgeInsets.only(bottom: 25), - child: TextFormField( - controller: controller.password, - obscureText: _obscureText, - decoration: InputDecoration( - enabledBorder: OutlineInputBorder( - borderSide: - BorderSide(color: Color(0xFFECECEC)), - borderRadius: BorderRadius.all( - Radius.circular(50), - )), - focusedBorder: OutlineInputBorder( - borderSide: - BorderSide(color: Color(0xFFECECEC)), - borderRadius: BorderRadius.all( - Radius.circular(50), - )), - hintText: 'Contraseña', - fillColor: Color.fromARGB(255, 239, 239, 239), - filled: true, - prefixIcon: Icon(Icons.lock_outline), - suffixIcon: IconButton( - icon: Icon( - _obscureText - ? Icons.visibility_off - : Icons.visibility, - color: Colors.grey, + prefixIcon: Icon(Icons.lock_outline), + suffixIcon: IconButton( + icon: Icon( + _obscureText + ? Icons.visibility_off + : Icons.visibility, + color: Colors.grey, + ), + onPressed: () { + setState(() { + _obscureText = !_obscureText; + }); + }, ), - onPressed: () { - setState(() { - _obscureText = !_obscureText; - }); - }, + ), + ), + ), + ], + )), + Padding( + padding: const EdgeInsets.only(bottom: 25), + child: Center( + child: PrimaryButtom( + onPressed: () { + if (_formKey.currentState!.validate()) { + RegisterController.instance.registerUser( + controller.email.text.trim(), + controller.password.text.trim()); + } + }, + label: 'Registrarme', + ), + ), + ), + RichText( + text: TextSpan( + style: TextStyle( + fontSize: 16.0, + color: Color(0xFF65676B), + fontFamily: 'Poppins', + ), + children: [ + TextSpan(text: 'Ya estas registrado? '), + WidgetSpan( + child: GestureDetector( + onTap: () { + Navigator.pushReplacementNamed(context, '/login'); + }, + child: Text( + 'Iniciar Sesión', + style: TextStyle( + fontSize: 16.0, + color: Color(0xFF2BA4EC), + fontWeight: FontWeight.w600, ), ), ), ), ], - )), - Padding( - padding: const EdgeInsets.only(bottom: 25), - child: Center( - child: PrimaryButtom( - onPressed: () { - if (_formKey.currentState!.validate()) { - RegisterController.instance.registerUser( - controller.email.text.trim(), - controller.password.text.trim()); - } - }, - label: 'Registrarme', ), - ), - ), - RichText( - text: TextSpan( - style: TextStyle( - fontSize: 16.0, - color: Color(0xFF65676B), - fontFamily: 'Poppins', - ), - children: [ - TextSpan(text: 'Ya estas registrado? '), - WidgetSpan( - child: GestureDetector( - onTap: () { - Navigator.pushReplacementNamed(context, '/login'); - }, - child: Text( - 'Iniciar Sesión', - style: TextStyle( - fontSize: 16.0, - color: Color(0xFF2BA4EC), - fontWeight: FontWeight.w600, - ), - ), - ), - ), - ], - ), - ) - ]), - ), - ], + ) + ]), + ), + ], + ), ), )); }