FirebaseUI and SwiftUI LoginG

Viewed 1357

I´m trying to implement the firebaseUI login in an iOS app using swiftUI.

I´m able to use the main login view, but i can not control the flow after the user was loged on.

This is the code of my "login controller"

import SwiftUI
import FirebaseUI

struct CustomLogin: UIViewControllerRepresentable {
    func makeUIViewController(context: Context) -> UIViewController {
        let authUI = FUIAuth.defaultAuthUI()
        let providers: [FUIAuthProvider] = [
          FUIEmailAuth(),
          FUIFacebookAuth()

         // FUIPhoneAuth(authUI:FUIAuth.defaultAuthUI()),
        ]
        authUI?.providers = providers
        let authViewController = authUI?.authViewController()
      //  let controller = UIViewController()

     //   authUI!.delegate = self
        return authViewController!

       }

       func updateUIViewController(_ uiViewController: UIViewController, context: Context) {


    }

}

struct CustomLogin_Previews: PreviewProvider {
    static var previews: some View {
        CustomLogin()
    }
}

I can show the login flow by add CustomLogin())to my content view.

how can I manage the call backs after the user has logged on?

enter image description here

The user was created in firebase, but the view don´t update.

if someone has implemented a firebaseUI login with SwiftUI I appreciated it.

Thanks

1 Answers

I was able to implement something that worked based off of your code and some Apple tutorials. Basically, you need to add a coordinator to your UIViewControllerRepresentable. You can add your delegate to the coordinator.

Here's my scratch code that works:

import SwiftUI
import FirebaseUI
import Firebase

public var screenWidth: CGFloat {
    return UIScreen.main.bounds.width
}

public var screenHeight: CGFloat {
    return UIScreen.main.bounds.height
}

struct LoginView : View {

    @State private var viewState = CGSize(width: 0, height: screenHeight)
    @State private var MainviewState = CGSize.zero

    var body : some View {
        ZStack {
            CustomLoginViewController { (error) in
                if error == nil {
                    self.status()
                }
            }.offset(y: self.MainviewState.height).animation(.spring())
            MainView().environmentObject(DataStore()).offset(y: self.viewState.height).animation(.spring())
        }
    }

    func status() {
        self.viewState = CGSize(width: 0, height: 0)
        self.MainviewState = CGSize(width: 0, height: screenHeight)
    }
}

struct LoginView_Previews : PreviewProvider {
    static var previews : some View {
        LoginView()
    }
}

struct CustomLoginViewController : UIViewControllerRepresentable {

    var dismiss : (_ error : Error? ) -> Void

    func makeCoordinator() -> CustomLoginViewController.Coordinator {
        Coordinator(self)
    }

    func makeUIViewController(context: Context) -> UIViewController
    {
        let authUI = FUIAuth.defaultAuthUI()

        let providers : [FUIAuthProvider] = [
            FUIEmailAuth(),
            FUIGoogleAuth(),
            FUIOAuth.appleAuthProvider()
        ]

        authUI?.providers = providers
        authUI?.delegate = context.coordinator

        let authViewController = authUI?.authViewController()

        return authViewController!
    }

    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<CustomLoginViewController>)
    {

    }

    //coordinator
    class Coordinator : NSObject, FUIAuthDelegate {
        var parent : CustomLoginViewController

        init(_ customLoginViewController : CustomLoginViewController) {
            self.parent = customLoginViewController
        }

        // MARK: FUIAuthDelegate
        func authUI(_ authUI: FUIAuth, didSignInWith authDataResult: AuthDataResult?, error: Error?)
        {
            if let error = error {
                parent.dismiss(error)
            }
            else {
                parent.dismiss(nil)
            }
        }

        func authUI(_ authUI: FUIAuth, didFinish operation: FUIAccountSettingsOperationType, error: Error?)
        {
        }
    }
}
Related