```Swift import UIKit import Foundation import Firebase import FirebaseAuth import GoogleSignIn import FBSDKLoginKit import SCLAlertView import UserNotifications class LoginViewController: UIViewController{ @IBOutlet weak var emailTextField: UITextField! @IBOutlet weak var passwordTextField: UITextField! @IBOutlet weak var loginButton: UIButton! @IBOutlet weak var errorLabel: UILabel! @IBOutlet weak var passwordEye: UIImageView! @IBOutlet weak var googlrLoginButton: UIButton! var error: Error? @IBOutlet weak var forgotPassword: UILabel! @IBOutlet weak var fbLoginButton: UIButton! override func viewDidLoad() { super.viewDidLoad() passwordTextField!.isSecureTextEntry = true passwordEye!.isUserInteractionEnabled = true passwordEye!.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(eyeSelected))) forgotPassword!.isUserInteractionEnabled = true forgotPassword!.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(forgotPasswordSelected))) let spacerView = UIView(frame:CGRect(x:0, y:0, width:30, height:10)) passwordTextField.leftViewMode = UITextField.ViewMode.always passwordTextField.leftView = spacerView let spacerView2 = UIView(frame:CGRect(x:0, y:0, width:30, height:10)) emailTextField.leftViewMode = UITextField.ViewMode.always emailTextField.leftView = spacerView2 loginButton.layer.cornerRadius = 10 loginButton.clipsToBounds = true googlrLoginButton.layer.cornerRadius = googlrLoginButton.frame.width / 2 googlrLoginButton.layer.masksToBounds = true fbLoginButton.layer.cornerRadius = fbLoginButton.frame.width / 2 fbLoginButton.layer.masksToBounds = true errorLabel.alpha=0 } func aftergoogledismiss(){ GIDSignIn.sharedInstance().delegate = self } override func viewWillDisappear(_ animated: Bool) { aftergoogledismiss() } override func viewWillAppear(_ animated: Bool) { aftergoogledismiss() } var googleSignIn = GIDSignIn.sharedInstance() @IBAction func googleLoginButtonPressed(_ sender: Any){ self.googleAuthLogin() } func googleAuthLogin() { self.googleSignIn?.presentingViewController = self self.googleSignIn?.clientID = "122963184918-q1kp62b948nav07cl6265d0s6r6e173e.apps.googleusercontent.com" self.googleSignIn?.delegate = self self.googleSignIn?.signIn() } @IBAction func didChangeSegement(_ sender:UISegmentedControl){ if sender.selectedSegmentIndex == 1{ let vc = storyboard?.instantiateViewController(identifier: "signupVC") as! SignupViewController vc.modalPresentationStyle = .fullScreen present(vc, animated: true) } } @IBAction func loginButtonTapped(_ sender: UIButton) { let email = emailTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines) let password = passwordTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines) Auth.auth().signIn(withEmail: email, password: password) { (result, error) in if error != nil { sender.shake() SCLAlertView().showError("Oof",subTitle:"😱It looks like there was an error😱") } else { sender.pulsate() let homeViewController = self.storyboard?.instantiateViewController(identifier: "homeVC") as! HomeViewController homeViewController.modalPresentationStyle = .fullScreen self.present(homeViewController, animated: true) } } } @objc private func eyeSelected(){ passwordTextField.isSecureTextEntry.toggle() if passwordTextField.isSecureTextEntry == true{ passwordEye.image = UIImage(systemName: "eye") }else{ passwordEye.image = UIImage(systemName: "eye.fill") } } @objc private func forgotPasswordSelected(){ let email = emailTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines) Auth.auth().sendPasswordReset(withEmail: email) { (error) in if error != nil{ SCLAlertView().showError("Oof",subTitle:"😱It looks like there was an error.😱") }else{ self.emailTextField.text = "" } } } @IBAction func fbLoginButtonPressed(_ sender: Any) { let fbLoginManager = LoginManager() fbLoginManager.logIn(permissions: ["public_profile", "email"], from: self) { (result, error) in if error != nil { SCLAlertView().showError("Oof",subTitle:"😱It looks like there was an error😱") return } guard let accessToken = AccessToken.current else { SCLAlertView().showError("Oof",subTitle:"😱It looks like there was an error😱") return } let credential = FacebookAuthProvider.credential(withAccessToken: accessToken.tokenString) Auth.auth().signIn(with: credential, completion: { (user, error) in if error != nil { SCLAlertView().showError("Oof",subTitle:"😱It looks like there was an error😱") return } else { let connection = GraphRequestConnection() connection.add(GraphRequest(graphPath: "/me", parameters: ["fields" : "id,name,about,birthday"], httpMethod: .get)) { (connection, response, error) in if error != nil { SCLAlertView().showError("Oof",subTitle:"😱It looks like there was an error😱") } else { guard (response as? Dictionary<String,Any>) != nil else { return } } } connection.start() let homeViewController = self.storyboard?.instantiateViewController(identifier: "homeVC") as! HomeViewController homeViewController.modalPresentationStyle = .fullScreen self.present(homeViewController, animated: true) } }) } } } extension UIButton { func pulsate() { let pulse = CASpringAnimation(keyPath: "transform.scale") pulse.duration = 0.2 pulse.fromValue = 0.95 pulse.toValue = 1.0 pulse.autoreverses = true pulse.repeatCount = 2 pulse.initialVelocity = 0.5 pulse.damping = 1.0 layer.add(pulse, forKey: nil) } func shake(){ let shake = CABasicAnimation(keyPath: "position") shake.duration = 0.1 shake.repeatCount = 2 shake.autoreverses = true let fromPoint = CGPoint(x: center.x-5, y: center.y) let fromValue = NSValue(cgPoint: fromPoint) let toPoint = CGPoint(x: center.x + 5, y: center.y) let toValue = NSValue(cgPoint: toPoint) shake.fromValue = fromValue shake.toValue = toValue layer.add(shake, forKey: nil) } } extension LoginViewController: GIDSignInDelegate { func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) { guard let user = user else { SCLAlertView().showError("Oof",subTitle:"😱It looks like there was an error😱") return } let userId = user.userID ?? "" let userIdToken = user.authentication.idToken ?? "" let userEmail = user.profile.email ?? "" let userInfo = ["username":userId,"email":userEmail, "password":"not given"] let homeViewController = self.storyboard?.instantiateViewController(identifier: "homeVC") as! HomeViewController homeViewController.modalPresentationStyle = .fullScreen self.present(homeViewController, animated: true) } func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) { } } ```