import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_google_authentication/Services/google_auth.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; class SignUpPage extends StatefulWidget { bool isLogin; SignUpPage(this.isLogin); @override _SignUpPageState createState() => _SignUpPageState(isLogin); } class _SignUpPageState extends State { bool isLogin; _SignUpPageState(this.isLogin); bool loggingIn = false; TextEditingController email = new TextEditingController(); TextEditingController password = new TextEditingController(); bool showPassword = false; void showSnackBar() { final snackBar = new SnackBar( content: Text('Invalid Credentials!'), backgroundColor: Colors.red, padding: EdgeInsets.symmetric(horizontal: 10), behavior: SnackBarBehavior.floating, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(14), ), ); ScaffoldMessenger.of(context).showSnackBar(snackBar); } @override Widget build(BuildContext context) { final Size size = MediaQuery.of(context).size; return Scaffold( body: SingleChildScrollView( child: Container( height: size.height, width: double.infinity, child: Stack( alignment: Alignment.center, children: [ Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( (isLogin) ? 'Login' : 'SignUp', style: GoogleFonts.alice( fontWeight: FontWeight.bold, fontSize: 29, ), ), SizedBox( height: 20, ), SvgPicture.asset( (isLogin) ? 'assets/signup.svg' : 'assets/signup.svg', width: size.width * 0.5, height: size.height * 0.3, ), SizedBox( height: 25, ), Padding( padding: const EdgeInsets.only(left: 30, right: 30), child: TextField( controller: email, keyboardType: TextInputType.emailAddress, decoration: InputDecoration( border: OutlineInputBorder( borderSide: BorderSide.none, borderRadius: BorderRadius.circular(29), ), hintText: 'Your Email', filled: true, fillColor: Color(0xFFF1E6FF), prefixIcon: Icon( Icons.person, color: Color(0xFF6F35A5), ), ), ), ), SizedBox( height: 15, ), Padding( padding: const EdgeInsets.only(left: 30, right: 30), child: TextField( controller: password, obscureText: !showPassword, decoration: InputDecoration( border: OutlineInputBorder( borderSide: BorderSide.none, borderRadius: BorderRadius.circular(29), ), hintText: 'Password', filled: true, fillColor: Color(0xFFF1E6FF), prefixIcon: Icon( Icons.lock, color: Color(0xFF6F35A5), ), suffixIcon: showPassword ? IconButton( icon: Icon( Icons.visibility_off, color: Color(0xFF6F35A5), ), onPressed: () { setState(() { showPassword = !showPassword; }); }, ) : IconButton( icon: Icon( Icons.visibility, color: Color(0xFF6F35A5), ), onPressed: () { setState(() { showPassword = !showPassword; }); }, )), ), ), SizedBox( height: 30, ), Container( width: size.width * 0.8, child: ClipRRect( borderRadius: BorderRadius.circular(29), child: TextButton( style: TextButton.styleFrom( padding: EdgeInsets.symmetric( vertical: 15, horizontal: 40), backgroundColor: Color(0xFF6F35A5), ), onPressed: () { String _email = email.text; String _password = password.text; !(isLogin) ? signUpClicked(_email, _password, context) : loginClicked(_email, _password, context); }, child: Text( (isLogin) ? 'Login' : 'SignUp', style: GoogleFonts.alata( color: Colors.white, fontWeight: FontWeight.bold, fontSize: 20), ), ), ), ), SizedBox( height: 18, ), Container( width: size.width * 0.81, child: ClipRRect( borderRadius: BorderRadius.circular(29), child: TextButton.icon( style: TextButton.styleFrom( padding: EdgeInsets.symmetric( vertical: 15, horizontal: 40), backgroundColor: Color(0xFF6F35A5), ), onPressed: () { final provider = Provider.of( context, listen: false); provider.googleLogin().then((value) { Navigator.popUntil( context, (route) => route.isFirst); }).catchError((onError) { showSnackBar(); }); }, icon: FaIcon( FontAwesomeIcons.google, color: Colors.white, ), label: Text( (isLogin) ? 'Login with Google' : 'SignUp with Google', style: GoogleFonts.alata( color: Colors.white, fontWeight: FontWeight.bold, fontSize: 20), ), ), ), ), SizedBox( height: 20, ), GestureDetector( onTap: () { setState(() { isLogin = !isLogin; }); }, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( (isLogin) ? 'Don\'t have an account?' : 'Already have an account?', style: GoogleFonts.lato( color: Color(0xFF6F35A5), ), ), Text( (isLogin) ? 'SignUp' : 'SignIn', style: GoogleFonts.lato( fontWeight: FontWeight.bold, color: Color(0xFF6F35A5), ), ), ], ), ) ], ) ], ), ), ), ); } signUpClicked(String _email, String _password, BuildContext context) { FirebaseAuth.instance .createUserWithEmailAndPassword(email: _email, password: _password) .then((value) { setState(() { loggingIn = true; }); Future.delayed(Duration(seconds: 1, milliseconds: 50), () { Navigator.popUntil(context, (route) => route.isFirst); }); }).catchError((e) { showSnackBar(); }); } bool loginClicked(String _email, String _password, BuildContext context) { FirebaseAuth.instance .signInWithEmailAndPassword(email: _email, password: _password) .then((value) { setState(() { loggingIn = true; }); Future.delayed(Duration(seconds: 1, milliseconds: 50), () { Navigator.pop(context); }); }).catchError((e) { showSnackBar(); }); return loggingIn; } }