@@ -12,6 +12,7 @@ public protocol GoogleProviderAuthUIProtocol: ExternalAuthProvider {
1212
1313public protocol FacebookProviderAuthUIProtocol : ExternalAuthProvider {
1414 @MainActor func signInWithFacebook( isLimitedLogin: Bool ) async throws -> AuthCredential
15+ @MainActor func deleteUser( user: User ) async throws
1516}
1617
1718public protocol PhoneAuthProviderAuthUIProtocol : ExternalAuthProvider {
@@ -82,17 +83,30 @@ public final class AuthService {
8283 public var authenticationFlow : AuthenticationFlow = . login
8384 public var errorMessage = " "
8485 public let passwordPrompt : PasswordPromptCoordinator = . init( )
85-
86- public var googleProvider : ( any GoogleProviderAuthUIProtocol ) ?
87- public var facebookProvider : ( any FacebookProviderAuthUIProtocol ) ?
88- public var phoneAuthProvider : ( any PhoneAuthProviderAuthUIProtocol ) ?
86+ private var unsafeGoogleProvider : ( any GoogleProviderAuthUIProtocol ) ?
87+ private var unsafeFacebookProvider : ( any FacebookProviderAuthUIProtocol ) ?
88+ private var unsafePhoneAuthProvider : ( any PhoneAuthProviderAuthUIProtocol ) ?
8989
9090 private var listenerManager : AuthListenerManager ?
9191 public var signedInCredential : AuthCredential ?
9292
93+ var emailSignInEnabled = false
94+
9395 private var providers : [ ExternalAuthProvider ] = [ ]
9496 public func register( provider: ExternalAuthProvider ) {
95- providers. append ( provider)
97+ switch provider {
98+ case let google as GoogleProviderAuthUIProtocol :
99+ unsafeGoogleProvider = google
100+ providers. append ( provider)
101+ case let facebook as FacebookProviderAuthUIProtocol :
102+ unsafeFacebookProvider = facebook
103+ providers. append ( provider)
104+ case let phone as PhoneAuthProviderAuthUIProtocol :
105+ unsafePhoneAuthProvider = phone
106+ providers. append ( provider)
107+ default :
108+ break
109+ }
96110 }
97111
98112 public func renderButtons( spacing: CGFloat = 16 ) -> AnyView {
@@ -105,31 +119,28 @@ public final class AuthService {
105119 )
106120 }
107121
108- private var safeGoogleProvider : any GoogleProviderAuthUIProtocol {
122+ private var googleProvider : any GoogleProviderAuthUIProtocol {
109123 get throws {
110- guard let provider = googleProvider else {
111- throw AuthServiceError
112- . notConfiguredProvider ( " `GoogleProviderSwift` has not been configured " )
124+ guard let provider = unsafeGoogleProvider else {
125+ fatalError ( " `GoogleProviderAuthUI` has not been configured " )
113126 }
114127 return provider
115128 }
116129 }
117130
118- private var safeFacebookProvider : any FacebookProviderAuthUIProtocol {
131+ private var facebookProvider : any FacebookProviderAuthUIProtocol {
119132 get throws {
120- guard let provider = facebookProvider else {
121- throw AuthServiceError
122- . notConfiguredProvider ( " `FacebookProviderSwift` has not been configured " )
133+ guard let provider = unsafeFacebookProvider else {
134+ fatalError ( " `FacebookProviderAuthUI` has not been configured " )
123135 }
124136 return provider
125137 }
126138 }
127139
128- private var safePhoneAuthProvider : any PhoneAuthProviderAuthUIProtocol {
140+ private var phoneAuthProvider : any PhoneAuthProviderAuthUIProtocol {
129141 get throws {
130- guard let provider = phoneAuthProvider else {
131- throw AuthServiceError
132- . notConfiguredProvider ( " `PhoneAuthProviderSwift` has not been configured " )
142+ guard let provider = unsafePhoneAuthProvider else {
143+ fatalError ( " `PhoneAuthProviderAuthUI` has not been configured " )
133144 }
134145 return provider
135146 }
@@ -215,7 +226,8 @@ public final class AuthService {
215226 if shouldHandleAnonymousUpgrade {
216227 try await handleAutoUpgradeAnonymousUser ( credentials: credentials)
217228 } else {
218- try await auth. signIn ( with: credentials)
229+ let result = try await auth. signIn ( with: credentials)
230+ signedInCredential = result. credential
219231 }
220232 updateAuthenticationState ( )
221233 } catch {
@@ -247,9 +259,13 @@ public final class AuthService {
247259public extension AuthService {
248260 func deleteUser( ) async throws {
249261 do {
250- if let user = auth. currentUser {
251- let operation = EmailPasswordDeleteUserOperation ( passwordPrompt: passwordPrompt)
252- try await operation ( on: user)
262+ if let user = auth. currentUser, let providerId = signedInCredential? . provider {
263+ if providerId == " password " {
264+ let operation = EmailPasswordDeleteUserOperation ( passwordPrompt: passwordPrompt)
265+ try await operation ( on: user)
266+ } else if providerId == " facebook.com " {
267+ try await facebookProvider. deleteUser ( user: user)
268+ }
253269 }
254270
255271 } catch {
@@ -282,6 +298,11 @@ public extension AuthService {
282298// MARK: - Email/Password Sign In
283299
284300public extension AuthService {
301+ func withEmailSignIn( ) -> AuthService {
302+ emailSignInEnabled = true
303+ return self
304+ }
305+
285306 func signIn( withEmail email: String , password: String ) async throws {
286307 let credential = EmailAuthProvider . credential ( withEmail: email, password: password)
287308 try await signIn ( credentials: credential)
@@ -295,7 +316,8 @@ public extension AuthService {
295316 let credential = EmailAuthProvider . credential ( withEmail: email, password: password)
296317 try await handleAutoUpgradeAnonymousUser ( credentials: credential)
297318 } else {
298- try await auth. createUser ( withEmail: email, password: password)
319+ let result = try await auth. createUser ( withEmail: email, password: password)
320+ signedInCredential = result. credential
299321 }
300322 updateAuthenticationState ( )
301323 } catch {
@@ -410,7 +432,7 @@ public extension AuthService {
410432 " OAuth client ID not found. Please make sure Google Sign-In is enabled in the Firebase console. You may have to download a new GoogleService-Info.plist file after enabling Google Sign-In. "
411433 )
412434 }
413- let credential = try await safeGoogleProvider . signInWithGoogle ( clientID: clientID)
435+ let credential = try await googleProvider . signInWithGoogle ( clientID: clientID)
414436
415437 try await signIn ( credentials: credential)
416438 }
@@ -420,7 +442,7 @@ public extension AuthService {
420442
421443public extension AuthService {
422444 func signInWithFacebook( limitedLogin: Bool = true ) async throws {
423- let credential = try await safeFacebookProvider
445+ let credential = try await facebookProvider
424446 . signInWithFacebook ( isLimitedLogin: limitedLogin)
425447 try await signIn ( credentials: credential)
426448 }
@@ -431,7 +453,7 @@ public extension AuthService {
431453public extension AuthService {
432454 func verifyPhoneNumber( phoneNumber: String ) async throws -> String {
433455 do {
434- return try await safePhoneAuthProvider . verifyPhoneNumber ( phoneNumber: phoneNumber)
456+ return try await phoneAuthProvider . verifyPhoneNumber ( phoneNumber: phoneNumber)
435457 } catch {
436458 errorMessage = string. localizedErrorMessage (
437459 for: error
0 commit comments