From aef50f9e3d66425cbfe6ec6db8ef6a1165c0f882 Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Mon, 24 Apr 2023 22:16:41 -0600 Subject: Implemented GitHub and Google auth --- lib/firebase/auth.dart | 71 +++++++++++++++++++++++++++ lib/firebase/email_auth.dart | 37 -------------- lib/screens/dashboard_screen.dart | 37 ++++++++++++-- lib/screens/login_screen.dart | 34 ++++++++++--- lib/screens/register_screen.dart | 4 +- macos/Flutter/GeneratedPluginRegistrant.swift | 2 + pubspec.lock | 40 ++++++++++++--- pubspec.yaml | 1 + 8 files changed, 170 insertions(+), 56 deletions(-) create mode 100644 lib/firebase/auth.dart delete mode 100644 lib/firebase/email_auth.dart diff --git a/lib/firebase/auth.dart b/lib/firebase/auth.dart new file mode 100644 index 0000000..791e69a --- /dev/null +++ b/lib/firebase/auth.dart @@ -0,0 +1,71 @@ +import 'package:firebase_auth/firebase_auth.dart'; + +class Auth { + final FirebaseAuth _auth = FirebaseAuth.instance; + final GithubAuthProvider _githubProvider = GithubAuthProvider(); + final GoogleAuthProvider _googleAuthProvider = GoogleAuthProvider(); + + User? get currentUser => _auth.currentUser; + + Future createUserWithEmailAndPassword({ + required String email, + required String password, + }) async { + try { + await _auth.createUserWithEmailAndPassword( + email: email, + password: password, + ); + return true; + } catch (e) { + print(e); + return false; + } + } + + Future signInWithEmailAndPassword({ + required String email, + required String password, + }) async { + try { + UserCredential cred = await _auth.signInWithEmailAndPassword( + email: email, + password: password, + ); + return cred.user?.emailVerified == true; + } catch (e) { + print(e); + return false; + } + } + + Future signInWithGoogle() async { + try { + await _auth.signInWithProvider(_googleAuthProvider); + return true; + } catch (e) { + print(e); + return false; + } + } + + Future signInWithGithub() async { + try { + await _auth.signInWithProvider(_githubProvider); + return true; + } catch (e) { + print(e); + return false; + } + } + + Future signOut() async { + try { + await _auth.signOut(); + return true; + } catch (e) { + print(e); + return false; + } + } +} diff --git a/lib/firebase/email_auth.dart b/lib/firebase/email_auth.dart deleted file mode 100644 index 3b6844c..0000000 --- a/lib/firebase/email_auth.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:firebase_auth/firebase_auth.dart'; - -class EmailAuth { - final FirebaseAuth _auth = FirebaseAuth.instance; - - Future createUserWithEmailAndPassword({ - required String email, - required String password, - }) async { - try { - await _auth.createUserWithEmailAndPassword( - email: email, - password: password, - ); - return true; - } catch (e) { - print(e); - return false; - } - } - - Future signInWithEmailAndPassword({ - required String email, - required String password, - }) async { - try { - UserCredential cred = await _auth.signInWithEmailAndPassword( - email: email, - password: password, - ); - return cred.user?.emailVerified == true; - } catch (e) { - print(e); - return false; - } - } -} diff --git a/lib/screens/dashboard_screen.dart b/lib/screens/dashboard_screen.dart index 914749c..2e27aa2 100644 --- a/lib/screens/dashboard_screen.dart +++ b/lib/screens/dashboard_screen.dart @@ -1,11 +1,26 @@ import 'package:flutter/material.dart'; +import 'package:pmsna1/firebase/auth.dart'; import 'package:pmsna1/providers/theme_provider.dart'; import 'package:pmsna1/settings/themes.dart'; import 'package:pmsna1/widgets/post_list.dart'; import 'package:provider/provider.dart'; -class DashboardScreen extends StatelessWidget { +class DashboardScreen extends StatefulWidget { const DashboardScreen({super.key}); + + @override + State createState() => _DashboardScreenState(); +} + +class _DashboardScreenState extends State { + late Auth _auth; + + @override + void initState() { + super.initState(); + _auth = Auth(); + } + @override Widget build(BuildContext context) { final ThemeProvider themeProvider = context.watch(); @@ -28,8 +43,10 @@ class DashboardScreen extends StatelessWidget { backgroundImage: NetworkImage('https://avalos.me/images/pro.jpg'), ), - accountName: const Text('Iván Ávalos'), - accountEmail: const Text('avalos@disroot.org'), + accountName: Text(_auth.currentUser?.displayName ?? "Lincite"), + accountEmail: _auth.currentUser?.email != null + ? Text(_auth.currentUser!.email!) + : null, ), ListTile( leading: const Icon(Icons.home), @@ -79,6 +96,12 @@ class DashboardScreen extends StatelessWidget { themeProvider.theme = newSelection.first; }), ), + ), + const Divider(), + ListTile( + title: const Text('Cerrar sesión'), + leading: const Icon(Icons.logout), + onTap: () => signOut(context), ) ], ), @@ -92,4 +115,12 @@ class DashboardScreen extends StatelessWidget { ), ); } + + void signOut(BuildContext context) { + _auth.signOut().then((success) { + if (success) { + Navigator.of(context).popUntil(ModalRoute.withName('/login')); + } + }); + } } diff --git a/lib/screens/login_screen.dart b/lib/screens/login_screen.dart index e70e84d..fd4697c 100644 --- a/lib/screens/login_screen.dart +++ b/lib/screens/login_screen.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:pmsna1/firebase/email_auth.dart'; +import 'package:pmsna1/firebase/auth.dart'; import 'package:pmsna1/widgets/loading_modal_widget.dart'; import 'package:pmsna1/widgets/responsive.dart'; import 'package:social_login_buttons/social_login_buttons.dart'; @@ -15,7 +15,7 @@ class _LoginScreenState extends State with SingleTickerProviderStateMixin { late AnimationController _controller; - final EmailAuth emailAuth = EmailAuth(); + final Auth _auth = Auth(); bool isLoading = false; @@ -97,7 +97,7 @@ class _LoginScreenState extends State SocialLoginButton( buttonType: SocialLoginButtonType.google, text: 'Iniciar sesión con Google', - onPressed: () {}, + onPressed: () => onGoogleLoginClicked(context), ), spacer, SocialLoginButton( @@ -109,7 +109,7 @@ class _LoginScreenState extends State SocialLoginButton( buttonType: SocialLoginButtonType.github, text: 'Iniciar sesión con GitHub', - onPressed: () {}, + onPressed: () => onGithubLoginClicked(context), ), spacer, TextButton( @@ -126,8 +126,8 @@ class _LoginScreenState extends State ); void onLoginClicked(BuildContext context) { - emailAuth - .createUserWithEmailAndPassword( + _auth + .signInWithEmailAndPassword( email: _emailController.text, password: _passwordController.text, ) @@ -140,6 +140,28 @@ class _LoginScreenState extends State }); } + void onGoogleLoginClicked(BuildContext context) { + _auth.signInWithGoogle().then((success) { + setState(() { + isLoading = false; + }); + if (success) { + Navigator.of(context).pushNamed('/dash'); + } + }); + } + + void onGithubLoginClicked(BuildContext context) { + _auth.signInWithGithub().then((success) { + setState(() { + isLoading = false; + }); + if (success) { + Navigator.of(context).pushNamed('/dash'); + } + }); + } + @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/screens/register_screen.dart b/lib/screens/register_screen.dart index aa5c213..16875f2 100644 --- a/lib/screens/register_screen.dart +++ b/lib/screens/register_screen.dart @@ -1,7 +1,7 @@ import 'package:email_validator/email_validator.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; -import 'package:pmsna1/firebase/email_auth.dart'; +import 'package:pmsna1/firebase/auth.dart'; import 'package:pmsna1/widgets/avatar_picker.dart'; import 'package:social_login_buttons/social_login_buttons.dart'; @@ -158,7 +158,7 @@ class _RegisterScreenState extends State { setState(() { isLoading = false; if (validateForm()) { - EmailAuth() + Auth() .createUserWithEmailAndPassword( email: _emailController.text, password: _passwordController.text, diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 54b3ff1..9d1472f 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,7 @@ import FlutterMacOS import Foundation +import cloud_firestore import firebase_auth import firebase_core import path_provider_foundation @@ -12,6 +13,7 @@ import shared_preferences_foundation import sqflite func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FLTFirebaseFirestorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseFirestorePlugin")) FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) diff --git a/pubspec.lock b/pubspec.lock index 2f6c37c..22d137d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: "330d7fcbb72624f5b6d374af8b059b0ef4ba96ba5b8987f874964a1287eb617d" + sha256: "6a0ad72b2bcdb461749e40c01c478212a78db848dfcb2f10f2a461988bc5fb29" url: "https://pub.dev" source: hosted - version: "1.0.18" + version: "1.1.1" archive: dependency: transitive description: @@ -57,6 +57,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + cloud_firestore: + dependency: "direct main" + description: + name: cloud_firestore + sha256: "17b4bac19f367ba1bd84239493a9a4182730221e4780334dd9cd57c4f13eccb7" + url: "https://pub.dev" + source: hosted + version: "4.5.2" + cloud_firestore_platform_interface: + dependency: transitive + description: + name: cloud_firestore_platform_interface + sha256: "76ba7b9dd43ce7f07e75a2349f3eb3e2c61e1bea88fec4798c3377cccf44cd7a" + url: "https://pub.dev" + source: hosted + version: "5.12.1" + cloud_firestore_web: + dependency: transitive + description: + name: cloud_firestore_web + sha256: "0c1305722339e0b3fc0ce62bf6233b3f8762cc105a26af02171b849e6a3b3727" + url: "https://pub.dev" + source: hosted + version: "3.4.2" collection: dependency: transitive description: @@ -165,26 +189,26 @@ packages: dependency: "direct main" description: name: firebase_core - sha256: "75f747cafd7cbd6c00b908e3a7aa59fc31593d46ba8165d9ee8a79e69464a394" + sha256: "239e4ac688674a7e7b5476fd16b0d8e2b5a453d464f32091af3ce1df4ebb7316" url: "https://pub.dev" source: hosted - version: "2.8.0" + version: "2.10.0" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface - sha256: "5615b30c36f55b2777d0533771deda7e5730e769e5d3cb7fda79e9bed86cfa55" + sha256: "0df0a064ab0cad7f8836291ca6f3272edd7b83ad5b3540478ee46a0849d8022b" url: "https://pub.dev" source: hosted - version: "4.5.3" + version: "4.6.0" firebase_core_web: dependency: transitive description: name: firebase_core_web - sha256: "0c1cf1f1022d2245ac117443bb95207952ca770281524d2908e323bc063fb8ff" + sha256: "347351a8f0518f3343d79a9a0690fa67ad232fc32e2ea270677791949eac792b" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.3.0" flutter: dependency: "direct main" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index a189e04..2285eec 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,6 +25,7 @@ dependencies: firebase_auth: ^4.3.0 table_calendar: <=3.0.9 flutter_staggered_grid_view: ^0.6.2 + cloud_firestore: ^4.5.2 dev_dependencies: flutter_test: -- cgit v1.2.3