Skip to content

Commit e838597

Browse files
Merge pull request #1277 from firebase/refactor-remaining-packages
2 parents 193656d + 2424b6c commit e838597

File tree

13 files changed

+268
-237
lines changed

13 files changed

+268
-237
lines changed

FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift

Lines changed: 1 addition & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public protocol DeleteUserSwift {
2929
@MainActor func deleteUser(user: User) async throws
3030
}
3131

32-
public protocol PhoneAuthProviderAuthUIProtocol: AuthProviderSwift {
32+
public protocol PhoneAuthProviderSwift: AuthProviderSwift {
3333
@MainActor func verifyPhoneNumber(phoneNumber: String) async throws -> String
3434
}
3535

@@ -108,42 +108,6 @@ public final class AuthService {
108108
public var currentMFARequired: MFARequired?
109109
private var currentMFAResolver: MultiFactorResolver?
110110

111-
// MARK: - AuthPickerView Modal APIs
112-
113-
public var isShowingAuthModal = false
114-
115-
public enum AuthModalContentType {
116-
case phoneAuth
117-
}
118-
119-
public var currentModal: AuthModalContentType?
120-
121-
public var authModalViewBuilderRegistry: [AuthModalContentType: () -> AnyView] = [:]
122-
123-
public func registerModalView(for type: AuthModalContentType,
124-
@ViewBuilder builder: @escaping () -> AnyView) {
125-
authModalViewBuilderRegistry[type] = builder
126-
}
127-
128-
public func viewForCurrentModal() -> AnyView? {
129-
guard let type = currentModal,
130-
let builder = authModalViewBuilderRegistry[type] else {
131-
return nil
132-
}
133-
return builder()
134-
}
135-
136-
public func presentModal(for type: AuthModalContentType) {
137-
currentModal = type
138-
isShowingAuthModal = true
139-
}
140-
141-
public func dismissModal() {
142-
isShowingAuthModal = false
143-
}
144-
145-
// MARK: - End AuthPickerView Modal APIs
146-
147111
// MARK: - Provider APIs
148112

149113
private var listenerManager: AuthListenerManager?

FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,6 @@ public struct AuthPickerView {
2626
.authenticationFlow == .signIn ? .signUp : .signIn
2727
}
2828

29-
private var isAuthModalPresented: Binding<Bool> {
30-
Binding(
31-
get: { authService.isShowingAuthModal },
32-
set: { authService.isShowingAuthModal = $0 }
33-
)
34-
}
35-
3629
@ViewBuilder
3730
private var authPickerTitleView: some View {
3831
if authService.authView == .authPicker {
@@ -103,33 +96,6 @@ extension AuthPickerView: View {
10396
EmptyView()
10497
}
10598
}
106-
}.sheet(isPresented: isAuthModalPresented) {
107-
VStack(spacing: 0) {
108-
HStack {
109-
Button(action: {
110-
authService.dismissModal()
111-
}) {
112-
HStack(spacing: 4) {
113-
Image(systemName: "chevron.left")
114-
.font(.system(size: 17, weight: .medium))
115-
Text(authService.string.backButtonLabel)
116-
.font(.system(size: 17))
117-
}
118-
.foregroundColor(.blue)
119-
}
120-
Spacer()
121-
}
122-
.padding()
123-
.background(Color(.systemBackground))
124-
125-
Divider()
126-
127-
if let view = authService.viewForCurrentModal() {
128-
view
129-
.frame(maxWidth: .infinity, maxHeight: .infinity)
130-
.padding()
131-
}
132-
}
13399
}
134100
}
135101
}

FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/AccountService+Facebook.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import FirebaseAuthSwiftUI
2424
import Observation
2525

2626
protocol FacebookOperationReauthentication {
27-
var facebookProvider: FacebookProviderAuthUI { get }
27+
var facebookProvider: FacebookProviderSwift { get }
2828
}
2929

3030
extension FacebookOperationReauthentication {
@@ -47,8 +47,8 @@ extension FacebookOperationReauthentication {
4747
@MainActor
4848
class FacebookDeleteUserOperation: AuthenticatedOperation,
4949
@preconcurrency FacebookOperationReauthentication {
50-
let facebookProvider: FacebookProviderAuthUI
51-
init(facebookProvider: FacebookProviderAuthUI) {
50+
let facebookProvider: FacebookProviderSwift
51+
init(facebookProvider: FacebookProviderSwift) {
5252
self.facebookProvider = facebookProvider
5353
}
5454

FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/AuthService+Facebook.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ import FirebaseAuthSwiftUI
2323

2424
public extension AuthService {
2525
@discardableResult
26-
func withFacebookSignIn(scopes scopes: [String]? = nil) -> AuthService {
27-
FacebookProviderAuthUI.configureProvider(scopes: scopes)
28-
registerProvider(providerWithButton: FacebookProviderAuthUI.shared)
26+
func withFacebookSignIn(_ provider: FacebookProviderSwift? = nil) -> AuthService {
27+
registerProvider(providerWithButton: FacebookProviderAuthUI(provider: provider ??
28+
FacebookProviderSwift()))
2929
return self
3030
}
3131
}

FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,6 @@ import FirebaseAuth
1919
import FirebaseAuthSwiftUI
2020
import SwiftUI
2121

22-
let kFacebookEmailScope = "email"
23-
let kFacebookProfileScope = "public_profile"
24-
let kDefaultFacebookScopes = [kFacebookEmailScope, kFacebookProfileScope]
25-
2622
public enum FacebookProviderError: Error {
2723
case signInCancelled(String)
2824
case configurationInvalid(String)
@@ -31,44 +27,20 @@ public enum FacebookProviderError: Error {
3127
case authenticationToken(String)
3228
}
3329

34-
public class FacebookProviderAuthUI: AuthProviderSwift, AuthProviderUI, DeleteUserSwift {
35-
public let id: String = "facebook"
30+
public class FacebookProviderSwift: AuthProviderSwift, DeleteUserSwift {
3631
let scopes: [String]
37-
let shortName = "Facebook"
3832
let providerId = "facebook.com"
3933
private let loginManager = LoginManager()
4034
private var rawNonce: String?
4135
private var shaNonce: String?
4236
// Needed for reauthentication
4337
var isLimitedLogin: Bool = true
44-
45-
public var provider: AuthProviderSwift { self }
46-
47-
@MainActor private static var _shared: FacebookProviderAuthUI = FacebookProviderAuthUI(scopes: kDefaultFacebookScopes)
48-
49-
@MainActor public static var shared: FacebookProviderAuthUI {
50-
return _shared
51-
}
5238

53-
@MainActor public static func configureProvider(scopes: [String]? = nil, isLimitedLogin: Bool = true) {
54-
_shared = FacebookProviderAuthUI(scopes: scopes, isLimitedLogin: isLimitedLogin)
55-
}
56-
57-
public init(scopes: [String]? = nil, isLimitedLogin: Bool = true) {
58-
self.scopes = scopes ?? kDefaultFacebookScopes
39+
public init(scopes: [String] = ["email", "public_profile"], isLimitedLogin: Bool = true) {
40+
self.scopes = scopes
5941
self.isLimitedLogin = isLimitedLogin
6042
}
6143

62-
@MainActor public func authButton() -> AnyView {
63-
AnyView(SignInWithFacebookButton())
64-
}
65-
66-
public func deleteUser(user: User) async throws {
67-
let operation = FacebookDeleteUserOperation(facebookProvider: self)
68-
try await operation(on: user)
69-
}
70-
71-
7244
@MainActor public func createAuthCredential() async throws -> AuthCredential {
7345
let loginType: LoginTracking = isLimitedLogin ? .limited : .enabled
7446

@@ -149,4 +121,22 @@ public class FacebookProviderAuthUI: AuthProviderSwift, AuthProviderUI, DeleteUs
149121
)
150122
}
151123
}
124+
125+
public func deleteUser(user: User) async throws {
126+
let operation = FacebookDeleteUserOperation(facebookProvider: self)
127+
try await operation(on: user)
128+
}
129+
}
130+
131+
public class FacebookProviderAuthUI: AuthProviderUI {
132+
public var provider: AuthProviderSwift
133+
public let id: String = "facebook.com"
134+
135+
public init(provider: AuthProviderSwift) {
136+
self.provider = provider
137+
}
138+
139+
@MainActor public func authButton() -> AnyView {
140+
AnyView(SignInWithFacebookButton(facebookProvider: provider))
141+
}
152142
}

FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,16 @@ import SwiftUI
2323
@MainActor
2424
public struct SignInWithFacebookButton {
2525
@Environment(AuthService.self) private var authService
26+
let facebookProvider: AuthProviderSwift
2627
@State private var errorMessage = ""
2728
@State private var showCanceledAlert = false
2829
@State private var limitedLogin = true
2930
@State private var showUserTrackingAlert = false
3031
@State private var trackingAuthorizationStatus: ATTrackingManager
3132
.AuthorizationStatus = .notDetermined
3233

33-
public init() {
34+
public init(facebookProvider: AuthProviderSwift) {
35+
self.facebookProvider = facebookProvider
3436
_trackingAuthorizationStatus = State(initialValue: ATTrackingManager
3537
.trackingAuthorizationStatus)
3638
}
@@ -65,7 +67,6 @@ extension SignInWithFacebookButton: View {
6567
Button(action: {
6668
Task {
6769
do {
68-
let facebookProvider = FacebookProviderAuthUI(isLimitedLogin: limitedLogin)
6970
try await authService.signIn(facebookProvider)
7071
} catch {
7172
switch error {
@@ -128,6 +129,7 @@ extension SignInWithFacebookButton: View {
128129

129130
#Preview {
130131
FirebaseOptions.dummyConfigurationForPreview()
131-
return SignInWithFacebookButton()
132+
let facebookProvider = FacebookProviderSwift()
133+
return SignInWithFacebookButton(facebookProvider: facebookProvider)
132134
.environment(AuthService())
133135
}

FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Services/AccountService+Google.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import FirebaseAuthSwiftUI
3131
import Observation
3232

3333
protocol GoogleOperationReauthentication {
34-
var googleProvider: GoogleProviderAuthUI { get }
34+
var googleProvider: GoogleProviderSwift { get }
3535
}
3636

3737
extension GoogleOperationReauthentication {
@@ -54,8 +54,8 @@ extension GoogleOperationReauthentication {
5454
@MainActor
5555
class GoogleDeleteUserOperation: AuthenticatedOperation,
5656
@preconcurrency GoogleOperationReauthentication {
57-
let googleProvider: GoogleProviderAuthUI
58-
init(googleProvider: GoogleProviderAuthUI) {
57+
let googleProvider: GoogleProviderSwift
58+
init(googleProvider: GoogleProviderSwift) {
5959
self.googleProvider = googleProvider
6060
}
6161

FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Services/AuthService+Google.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ import FirebaseAuthSwiftUI
2323

2424
public extension AuthService {
2525
@discardableResult
26-
func withGoogleSignIn(scopes scopes: [String]? = nil) -> AuthService {
27-
let clientID = auth.app?.options.clientID ?? ""
28-
registerProvider(providerWithButton: GoogleProviderAuthUI(scopes: scopes, clientID: clientID))
26+
func withGoogleSignIn(_ provider: GoogleProviderSwift? = nil) -> AuthService {
27+
registerProvider(providerWithButton: GoogleProviderAuthUI(provider: provider ??
28+
GoogleProviderSwift(clientID: auth.app?.options.clientID ?? "")))
2929
return self
3030
}
3131
}

FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Services/GoogleProviderAuthUI.swift

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,37 +19,24 @@ import GoogleSignIn
1919
import GoogleSignInSwift
2020
import SwiftUI
2121

22-
let kGoogleUserInfoEmailScope = "https://www.googleapis.com/auth/userinfo.email"
23-
let kGoogleUserInfoProfileScope = "https://www.googleapis.com/auth/userinfo.profile"
24-
let kDefaultScopes = [kGoogleUserInfoEmailScope, kGoogleUserInfoProfileScope]
25-
2622
public enum GoogleProviderError: Error {
2723
case rootViewControllerNotFound(String)
2824
case authenticationToken(String)
2925
case user(String)
3026
}
3127

32-
public class GoogleProviderAuthUI: AuthProviderSwift, AuthProviderUI, DeleteUserSwift {
33-
public let id: String = "google"
28+
public class GoogleProviderSwift: AuthProviderSwift, DeleteUserSwift {
3429
let scopes: [String]
35-
let shortName = "Google"
30+
let clientID: String
3631
let providerId = "google.com"
37-
public let clientID: String
38-
39-
public var provider: AuthProviderSwift { self }
40-
41-
public init(scopes: [String]? = nil, clientID: String = FirebaseApp.app()!.options.clientID!) {
42-
self.scopes = scopes ?? kDefaultScopes
43-
self.clientID = clientID
44-
}
45-
46-
@MainActor public func authButton() -> AnyView {
47-
AnyView(SignInWithGoogleButton())
48-
}
4932

50-
public func deleteUser(user: User) async throws {
51-
let operation = GoogleDeleteUserOperation(googleProvider: self)
52-
try await operation(on: user)
33+
public init(scopes: [String] = [
34+
"https://www.googleapis.com/auth/userinfo.email",
35+
"https://www.googleapis.com/auth/userinfo.profile",
36+
],
37+
clientID: String) {
38+
self.clientID = clientID
39+
self.scopes = scopes
5340
}
5441

5542
@MainActor public func createAuthCredential() async throws -> AuthCredential {
@@ -61,7 +48,7 @@ public class GoogleProviderAuthUI: AuthProviderSwift, AuthProviderUI, DeleteUser
6148
)
6249
}
6350

64-
let config = GIDConfiguration(clientID: self.clientID)
51+
let config = GIDConfiguration(clientID: clientID)
6552
GIDSignIn.sharedInstance.configuration = config
6653

6754
return try await withCheckedThrowingContinuation { continuation in
@@ -86,4 +73,22 @@ public class GoogleProviderAuthUI: AuthProviderSwift, AuthProviderUI, DeleteUser
8673
}
8774
}
8875
}
76+
77+
public func deleteUser(user: User) async throws {
78+
let operation = GoogleDeleteUserOperation(googleProvider: self)
79+
try await operation(on: user)
80+
}
81+
}
82+
83+
public class GoogleProviderAuthUI: AuthProviderUI {
84+
public var provider: AuthProviderSwift
85+
public let id: String = "google.com"
86+
87+
public init(provider: AuthProviderSwift) {
88+
self.provider = provider
89+
}
90+
91+
@MainActor public func authButton() -> AnyView {
92+
AnyView(SignInWithGoogleButton(googleProvider: provider))
93+
}
8994
}

FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ import SwiftUI
2626
@MainActor
2727
public struct SignInWithGoogleButton {
2828
@Environment(AuthService.self) private var authService
29-
private let googleProvider = GoogleProviderAuthUI()
29+
let googleProvider: AuthProviderSwift
30+
31+
public init(googleProvider: AuthProviderSwift) {
32+
self.googleProvider = googleProvider
33+
}
3034

3135
let customViewModel = GoogleSignInButtonViewModel(
3236
scheme: .light,
@@ -48,6 +52,7 @@ extension SignInWithGoogleButton: View {
4852

4953
#Preview {
5054
FirebaseOptions.dummyConfigurationForPreview()
51-
return SignInWithGoogleButton()
55+
let googleProvider = GoogleProviderSwift(clientID: "")
56+
return SignInWithGoogleButton(googleProvider: googleProvider)
5257
.environment(AuthService())
5358
}

0 commit comments

Comments
 (0)