File Viewer

Download
//
//  AuthenticationManager.swift
//  TrackMyDay
//
//  Created by Pranav Zagade on 11/29/24.
//

import Firebase
import GoogleSignIn
import FirebaseAuth
import SwiftUI

class AuthenticationManager: ObservableObject {
    @Published var isAuthenticated: Bool = false
    @Published var user: FirebaseAuth.User? = nil
    @Published var displayName: String = ""

    init() {
        self.user = Auth.auth().currentUser
        self.isAuthenticated = user != nil
        self.displayName = user?.displayName ?? "Guest"
    }

 
    func signInWithGoogle(presenting: UIViewController) {
        guard let clientID = FirebaseApp.app()?.options.clientID else { return }

        let config = GIDConfiguration(clientID: clientID)
        GIDSignIn.sharedInstance.configuration = config

        GIDSignIn.sharedInstance.signIn(withPresenting: presenting) { result, error in
            if let error = error {
                print("Google Sign-In Error: \(error.localizedDescription)")
                return
            }

            guard let user = result?.user,
                  let idToken = user.idToken?.tokenString else {
                return
            }

            let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: user.accessToken.tokenString)

            Auth.auth().signIn(with: credential) { authResult, error in
                if let error = error {
                    print("Firebase Sign-In Error: \(error.localizedDescription)")
                    return
                }

                
                if let authResult = authResult {
                    let authUser = authResult.user

                    DispatchQueue.main.async {
                        self.user = authUser
                        self.displayName = authUser.displayName ?? "Guest"
                        self.isAuthenticated = true
                    }
                }
            }
        }
    }


    func signUpWithEmail(email: String, password: String, completion: @escaping (Result<Void, Error>) -> Void) {
        Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
            if let error = error {
                completion(.failure(error))
                return
            }

            guard let authUser = authResult?.user else {
                completion(.failure(NSError(domain: "AuthError", code: 0, userInfo: [NSLocalizedDescriptionKey: "Unable to get user"])))
                return
            }

            DispatchQueue.main.async {
                self.user = authUser
                self.displayName = authUser.email ?? "User"
                self.isAuthenticated = true
                completion(.success(()))
            }
        }
    }


    func loginWithEmail(email: String, password: String, completion: @escaping (Result<Void, Error>) -> Void) {
        Auth.auth().signIn(withEmail: email, password: password) { authResult, error in
            if let error = error {
                completion(.failure(error))
                return
            }

            guard let authUser = authResult?.user else {
                completion(.failure(NSError(domain: "AuthError", code: 0, userInfo: [NSLocalizedDescriptionKey: "Unable to get user"])))
                return
            }

            DispatchQueue.main.async {
                self.user = authUser
                self.displayName = authUser.email ?? "User"
                self.isAuthenticated = true
                completion(.success(()))
            }
        }
    }


    func signOut() {
        do {
            try Auth.auth().signOut()
            self.isAuthenticated = false
            self.user = nil
            self.displayName = "Guest"
        } catch {
            print("Sign Out Error: \(error.localizedDescription)")
        }
    }
}