From 4874a3073450c0dfcb1c443342bcae78728a471b Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Sat, 27 May 2023 17:19:44 -0600 Subject: Se implementa verificación de cuentas MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/screens/dashboard_screen.dart | 5 --- lib/screens/login_screen.dart | 67 +++++++++++++++++++++++++++++++------- lib/screens/onboarding_screen.dart | 2 ++ lib/screens/register_screen.dart | 49 ++++++++++++++++++++-------- 4 files changed, 93 insertions(+), 30 deletions(-) (limited to 'lib/screens') diff --git a/lib/screens/dashboard_screen.dart b/lib/screens/dashboard_screen.dart index be3aca0..72bbab7 100644 --- a/lib/screens/dashboard_screen.dart +++ b/lib/screens/dashboard_screen.dart @@ -109,11 +109,6 @@ class _DashboardScreenState extends State { } void signOut(BuildContext context) { - /*_auth.signOut().then((success) { - if (success) { - Navigator.of(context).popUntil(ModalRoute.withName('/login')); - } - });*/ _auth.signOut().then((success) { if (success) { Navigator.of(context).pushReplacementNamed('/login'); diff --git a/lib/screens/login_screen.dart b/lib/screens/login_screen.dart index f00328b..c98a565 100644 --- a/lib/screens/login_screen.dart +++ b/lib/screens/login_screen.dart @@ -1,4 +1,6 @@ +import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; +import 'package:linkchat/settings/preferences.dart'; import 'package:social_login_buttons/social_login_buttons.dart'; import '../firebase/auth.dart'; @@ -19,6 +21,7 @@ class _LoginScreenState extends State final Auth _auth = Auth(); bool isLoading = false; + bool isInit = false; final padding = 16.0; final spacer = const SizedBox(height: 16.0); @@ -107,42 +110,84 @@ class _LoginScreenState extends State ); void onLoginClicked(BuildContext context) { + setState(() { + isLoading = true; + }); _auth .signInWithEmailAndPassword( email: _emailController.text, password: _passwordController.text, ) - .then((success) { + .then((result) { setState(() { isLoading = false; }); - // TODO: checar si el resultado es true - Navigator.of(context).pushReplacementNamed('/dash'); + result.fold( + (user) { + if (user != null && user.emailVerified == false) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('El correo no está verificado')), + ); + } else { + Preferences.getShowOnboarding().then((show) { + Navigator.of(context) + .pushReplacementNamed(show ? '/onboard' : '/dash'); + }); + } + }, + (error) => handleError(error), + ); }); } void onGoogleLoginClicked(BuildContext context) { - _auth.signInWithGoogle().then((success) { + setState(() { + isLoading = true; + }); + _auth.signInWithGoogle().then((result) { setState(() { isLoading = false; }); - if (success) { - Navigator.of(context).pushReplacementNamed('/dash'); - } + result.fold( + (user) {}, + (error) => handleError(error), + ); }); } void onGithubLoginClicked(BuildContext context) { - _auth.signInWithGithub().then((success) { + setState(() { + isLoading = true; + }); + _auth.signInWithGithub().then((result) { setState(() { isLoading = false; }); - if (success) { - Navigator.of(context).pushReplacementNamed('/dash'); - } + result.fold( + (user) {}, + (error) => handleError(error), + ); }); } + void handleError(FirebaseException error) { + String message; + switch (error.code) { + case 'invalid-email': + message = 'El correo electrónico es inválido'; + case 'user-disabled': + message = 'El usuario está desactivado'; + case 'user-not-found': + message = 'El usuario no existe'; + case 'wrong-password': + message = 'La contraseña es incorrecta.'; + default: + message = 'Ocurrió un error desconocido'; + } + ScaffoldMessenger.of(context) + .showSnackBar(SnackBar(content: Text(message))); + } + @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/screens/onboarding_screen.dart b/lib/screens/onboarding_screen.dart index e1755c4..5d1ff7a 100644 --- a/lib/screens/onboarding_screen.dart +++ b/lib/screens/onboarding_screen.dart @@ -1,5 +1,6 @@ import 'package:concentric_transition/concentric_transition.dart'; import 'package:flutter/material.dart'; +import 'package:linkchat/settings/preferences.dart'; import 'package:lottie/lottie.dart'; import '../widgets/responsive.dart'; @@ -95,6 +96,7 @@ class OnboardingScreen extends StatelessWidget { ); }, onFinish: () { + Preferences.setShowOnboarding(false); Navigator.of(context).pushNamed('/dash'); }, ), diff --git a/lib/screens/register_screen.dart b/lib/screens/register_screen.dart index 9a11923..0ba0cf9 100644 --- a/lib/screens/register_screen.dart +++ b/lib/screens/register_screen.dart @@ -158,21 +158,42 @@ class _RegisterScreenState extends State { void onRegisterClicked(BuildContext context) { setState(() { - isLoading = false; - if (validateForm()) { - Auth() - .createUserWithEmailAndPassword( - email: _emailController.text, - password: _passwordController.text, - displayName: _nameController.text, - avatar: File(_avatar!.path), - ) - .then((success) { - if (success) { - Navigator.of(context).pushReplacementNamed('/onboard'); + isLoading = true; + }); + + if (validateForm()) { + Auth() + .createUserWithEmailAndPassword( + email: _emailController.text, + password: _passwordController.text, + displayName: _nameController.text, + avatar: File(_avatar!.path), + ) + .then((result) { + setState(() { + isLoading = false; + }); + result.fold((user) { + Navigator.of(context).pushReplacementNamed('/login'); + }, (error) { + String message; + switch (error.code) { + case 'email-already-in-use': + message = 'El correo electrónico ya se encuentra en uso'; + case 'invalid-email': + message = 'El correo electrónico es inválido'; + case 'operation-not-allowed': + message = 'La operación no está permitida'; + case 'weak-password': + message = 'La contraseña es muy débil'; + default: + message = 'Ocurrió un error desconocido'; } + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(message)), + ); }); - } - }); + }); + } } } -- cgit v1.2.3