@@ -12,6 +12,7 @@ public protocol GoogleProviderAuthUIProtocol: ExternalAuthProvider {
12
12
13
13
public protocol FacebookProviderAuthUIProtocol : ExternalAuthProvider {
14
14
@MainActor func signInWithFacebook( isLimitedLogin: Bool ) async throws -> AuthCredential
15
+ @MainActor func deleteUser( user: User ) async throws
15
16
}
16
17
17
18
public protocol PhoneAuthProviderAuthUIProtocol : ExternalAuthProvider {
@@ -82,17 +83,30 @@ public final class AuthService {
82
83
public var authenticationFlow : AuthenticationFlow = . login
83
84
public var errorMessage = " "
84
85
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 ) ?
89
89
90
90
private var listenerManager : AuthListenerManager ?
91
91
public var signedInCredential : AuthCredential ?
92
92
93
+ var emailSignInEnabled = false
94
+
93
95
private var providers : [ ExternalAuthProvider ] = [ ]
94
96
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
+ }
96
110
}
97
111
98
112
public func renderButtons( spacing: CGFloat = 16 ) -> AnyView {
@@ -105,31 +119,28 @@ public final class AuthService {
105
119
)
106
120
}
107
121
108
- private var safeGoogleProvider : any GoogleProviderAuthUIProtocol {
122
+ private var googleProvider : any GoogleProviderAuthUIProtocol {
109
123
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 " )
113
126
}
114
127
return provider
115
128
}
116
129
}
117
130
118
- private var safeFacebookProvider : any FacebookProviderAuthUIProtocol {
131
+ private var facebookProvider : any FacebookProviderAuthUIProtocol {
119
132
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 " )
123
135
}
124
136
return provider
125
137
}
126
138
}
127
139
128
- private var safePhoneAuthProvider : any PhoneAuthProviderAuthUIProtocol {
140
+ private var phoneAuthProvider : any PhoneAuthProviderAuthUIProtocol {
129
141
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 " )
133
144
}
134
145
return provider
135
146
}
@@ -215,7 +226,8 @@ public final class AuthService {
215
226
if shouldHandleAnonymousUpgrade {
216
227
try await handleAutoUpgradeAnonymousUser ( credentials: credentials)
217
228
} else {
218
- try await auth. signIn ( with: credentials)
229
+ let result = try await auth. signIn ( with: credentials)
230
+ signedInCredential = result. credential
219
231
}
220
232
updateAuthenticationState ( )
221
233
} catch {
@@ -247,9 +259,13 @@ public final class AuthService {
247
259
public extension AuthService {
248
260
func deleteUser( ) async throws {
249
261
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
+ }
253
269
}
254
270
255
271
} catch {
@@ -282,6 +298,11 @@ public extension AuthService {
282
298
// MARK: - Email/Password Sign In
283
299
284
300
public extension AuthService {
301
+ func withEmailSignIn( ) -> AuthService {
302
+ emailSignInEnabled = true
303
+ return self
304
+ }
305
+
285
306
func signIn( withEmail email: String , password: String ) async throws {
286
307
let credential = EmailAuthProvider . credential ( withEmail: email, password: password)
287
308
try await signIn ( credentials: credential)
@@ -295,7 +316,8 @@ public extension AuthService {
295
316
let credential = EmailAuthProvider . credential ( withEmail: email, password: password)
296
317
try await handleAutoUpgradeAnonymousUser ( credentials: credential)
297
318
} 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
299
321
}
300
322
updateAuthenticationState ( )
301
323
} catch {
@@ -410,7 +432,7 @@ public extension AuthService {
410
432
" 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. "
411
433
)
412
434
}
413
- let credential = try await safeGoogleProvider . signInWithGoogle ( clientID: clientID)
435
+ let credential = try await googleProvider . signInWithGoogle ( clientID: clientID)
414
436
415
437
try await signIn ( credentials: credential)
416
438
}
@@ -420,7 +442,7 @@ public extension AuthService {
420
442
421
443
public extension AuthService {
422
444
func signInWithFacebook( limitedLogin: Bool = true ) async throws {
423
- let credential = try await safeFacebookProvider
445
+ let credential = try await facebookProvider
424
446
. signInWithFacebook ( isLimitedLogin: limitedLogin)
425
447
try await signIn ( credentials: credential)
426
448
}
@@ -431,7 +453,7 @@ public extension AuthService {
431
453
public extension AuthService {
432
454
func verifyPhoneNumber( phoneNumber: String ) async throws -> String {
433
455
do {
434
- return try await safePhoneAuthProvider . verifyPhoneNumber ( phoneNumber: phoneNumber)
456
+ return try await phoneAuthProvider . verifyPhoneNumber ( phoneNumber: phoneNumber)
435
457
} catch {
436
458
errorMessage = string. localizedErrorMessage (
437
459
for: error
0 commit comments