From a110a70696d69fb00b718188d968cdb18aa0d7d7 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Wed, 23 Apr 2025 13:46:25 +0100 Subject: [PATCH 1/8] chore: move ContentView to separate file --- .../FirebaseSwiftUIExample/ContentView.swift | 48 +++++++++++++++++++ .../FirebaseSwiftUIExampleApp.swift | 40 +--------------- 2 files changed, 49 insertions(+), 39 deletions(-) create mode 100644 samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift new file mode 100644 index 00000000000..57fc53e0ca3 --- /dev/null +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift @@ -0,0 +1,48 @@ +// +// ContentView.swift +// FirebaseSwiftUIExample +// +// Created by Russell Wheatley on 23/04/2025. +// + +import FirebaseAuth +import FirebaseAuthSwiftUI +import FirebaseFacebookSwiftUI +import FirebaseGoogleSwiftUI +import FirebasePhoneAuthSwiftUI +import SwiftUI + +struct ContentView: View { + let authService: AuthService + + init() { + // Auth.auth().signInAnonymously() + + let actionCodeSettings = ActionCodeSettings() + actionCodeSettings.handleCodeInApp = true + actionCodeSettings + .url = URL(string: "https://flutterfire-e2e-tests.firebaseapp.com") + actionCodeSettings.linkDomain = "flutterfire-e2e-tests.firebaseapp.com" + actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!) + let configuration = AuthConfiguration( + shouldAutoUpgradeAnonymousUsers: true, + emailLinkSignInActionCodeSettings: actionCodeSettings + ) + let facebookProvider = FacebookProviderSwift() + let phoneAuthProvider = PhoneAuthProviderSwift() + authService = AuthService( + configuration: configuration, + googleProvider: googleProvider, + facebookProvider: facebookProvider, + phoneAuthProvider: phoneAuthProvider + ) + } + + var body: some View { + AuthPickerView { + SignInWithGoogleButton() + SignInWithFacebookButton() + PhoneAuthButtonView() + }.environment(authService) + } +} diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift index c5f85d500f3..8e6137c427e 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift @@ -4,14 +4,11 @@ // // Created by Russell Wheatley on 18/02/2025. // - import FacebookCore import FirebaseAuth -import FirebaseAuthSwiftUI import FirebaseCore -import FirebaseFacebookSwiftUI import FirebaseGoogleSwiftUI -import FirebasePhoneAuthSwiftUI +import Foundation import SwiftData import SwiftUI @@ -73,38 +70,3 @@ struct FirebaseSwiftUIExampleApp: App { } } } - -struct ContentView: View { - let authService: AuthService - - init() { - // Auth.auth().signInAnonymously() - - let actionCodeSettings = ActionCodeSettings() - actionCodeSettings.handleCodeInApp = true - actionCodeSettings - .url = URL(string: "https://flutterfire-e2e-tests.firebaseapp.com") - actionCodeSettings.linkDomain = "flutterfire-e2e-tests.firebaseapp.com" - actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!) - let configuration = AuthConfiguration( - shouldAutoUpgradeAnonymousUsers: true, - emailLinkSignInActionCodeSettings: actionCodeSettings - ) - let facebookProvider = FacebookProviderSwift() - let phoneAuthProvider = PhoneAuthProviderSwift() - authService = AuthService( - configuration: configuration, - googleProvider: googleProvider, - facebookProvider: facebookProvider, - phoneAuthProvider: phoneAuthProvider - ) - } - - var body: some View { - AuthPickerView { - SignInWithGoogleButton() - SignInWithFacebookButton() - PhoneAuthButtonView() - }.environment(authService) - } -} From 1853f800f4a0a9fb007cd1363573dd1490ba6031 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Wed, 23 Apr 2025 14:06:52 +0100 Subject: [PATCH 2/8] chore: use label argument instead of label closure --- .../Sources/Views/AuthPickerView.swift | 4 ++-- .../Sources/Views/EmailAuthView.swift | 12 ++++++------ .../Sources/Views/EmailLinkView.swift | 8 ++++---- .../Sources/Views/PasswordRecoveryView.swift | 8 ++++---- .../Sources/Views/VerifyEmailView.swift | 4 ++-- .../Sources/Views/SignInWithFacebookButton.swift | 4 ++-- .../Sources/Views/SignInWithGoogleButton.swift | 4 ++-- .../Sources/Views/PhoneAuthButtonView.swift | 8 ++++---- 8 files changed, 26 insertions(+), 26 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift index 517149ce98f..35046df5896 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift @@ -38,11 +38,11 @@ extension AuthPickerView: View { withAnimation { switchFlow() } - }) { + }, label: { Text(authService.authenticationFlow == .signUp ? "Log in" : "Sign up") .fontWeight(.semibold) .foregroundColor(.blue) - } + }) } Text(authService.errorMessage).foregroundColor(.red) } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift index f09a0432268..d5cc8b3be85 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift @@ -82,9 +82,9 @@ extension EmailAuthView: View { if authService.authenticationFlow == .login { Button(action: { authService.authView = .passwordRecovery - }) { + }, label: { Text("Forgotten Password?") - } + }) } if authService.authenticationFlow == .signUp { @@ -108,7 +108,7 @@ extension EmailAuthView: View { if authService.authenticationFlow == .login { await signInWithEmailPassword() } else { await createUserWithEmailPassword() } } - }) { + }, label: { if authService.authenticationState != .authenticating { Text(authService.authenticationFlow == .login ? "Log in with password" : "Sign up") .padding(.vertical, 8) @@ -119,16 +119,16 @@ extension EmailAuthView: View { .padding(.vertical, 8) .frame(maxWidth: .infinity) } - } + }) .disabled(!isValid) .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) .buttonStyle(.borderedProminent) Button(action: { authService.authView = .passwordRecovery - }) { + }, label: { Text("Prefer Email link sign-in?") - } + }) } } } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift index b8dbcce8f6e..dc0a6ddc317 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift @@ -35,11 +35,11 @@ extension EmailLinkView: View { await sendEmailLink() authService.emailLink = email } - }) { + }, label: { Text("Send email sign-in link") .padding(.vertical, 8) .frame(maxWidth: .infinity) - } + }) .disabled(!CommonUtils.isValidEmail(email)) .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) @@ -66,11 +66,11 @@ extension EmailLinkView: View { } .navigationBarItems(leading: Button(action: { authService.authView = .authPicker - }) { + }, label: { Image(systemName: "chevron.left") .foregroundColor(.blue) Text("Back") .foregroundColor(.blue) - }) + })) } } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift index c53a6969e70..a2a20027d22 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift @@ -33,11 +33,11 @@ extension PasswordRecoveryView: View { Task { await sendPasswordRecoveryEmail() } - }) { + }, label: { Text("Password Recovery") .padding(.vertical, 8) .frame(maxWidth: .infinity) - } + }) .disabled(!CommonUtils.isValidEmail(email)) .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) @@ -59,11 +59,11 @@ extension PasswordRecoveryView: View { } .navigationBarItems(leading: Button(action: { authService.authView = .authPicker - }) { + }, label: { Image(systemName: "chevron.left") .foregroundColor(.blue) Text("Back") .foregroundColor(.blue) - }) + })) } } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift index 99014a47abb..518cfd4fea9 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift @@ -19,11 +19,11 @@ extension VerifyEmailView: View { Task { await sendEmailVerification() } - }) { + }, label: { Text("Verify email address?") .padding(.vertical, 8) .frame(maxWidth: .infinity) - } + }) .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) .buttonStyle(.borderedProminent) diff --git a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift index 1699a5bfb44..e89a89d3cf5 100644 --- a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift +++ b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift @@ -60,7 +60,7 @@ extension SignInWithFacebookButton: View { } } } - }) { + }, label: { HStack { Image(systemName: "f.circle.fill") .font(.title) @@ -73,7 +73,7 @@ extension SignInWithFacebookButton: View { .frame(maxWidth: .infinity) .background(Color.blue) .cornerRadius(8) - } + }) .alert(isPresented: $showCanceledAlert) { Alert( title: Text("Facebook login cancelled"), diff --git a/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift b/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift index 241b50ea480..09a9728083d 100644 --- a/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift +++ b/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift @@ -20,7 +20,7 @@ extension SignInWithGoogleButton: View { Task { try await signInWithGoogle() } - }) { + }, label: { if authService.authenticationState != .authenticating { HStack { Image(systemName: "globe") // Placeholder for Google logo @@ -46,6 +46,6 @@ extension SignInWithGoogleButton: View { .padding(.vertical, 8) .frame(maxWidth: .infinity) } - } + }) } } diff --git a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift index 2addf55123e..9cbea24464a 100644 --- a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift +++ b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift @@ -39,11 +39,11 @@ extension PhoneAuthButtonView: View { ) } } - }) { + }, label: { Text("Send SMS code") .padding(.vertical, 8) .frame(maxWidth: .infinity) - } + }) .disabled(!PhoneUtils.isValidPhoneNumber(phoneNumber)) .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) @@ -69,7 +69,7 @@ extension PhoneAuthButtonView: View { } showVerificationCodeInput = false } - }) { + }, label: { Text("Verify phone number and sign-in") .foregroundColor(.white) .padding() @@ -77,7 +77,7 @@ extension PhoneAuthButtonView: View { .background(Color.green) .cornerRadius(8) .padding(.horizontal) - } + }) }.onOpenURL { url in authService.auth.canHandle(url) } From 8cea58f758c8b84f45714eac24b4803eb220ea42 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Wed, 23 Apr 2025 14:51:59 +0100 Subject: [PATCH 3/8] chore: rename protocols and providers --- .../Sources/Services/AuthService.swift | 24 +++++++++---------- ...ift.swift => FacebookProviderAuthUI.swift} | 2 +- ...Swift.swift => GoogleProviderAuthUI.swift} | 2 +- ...ft.swift => PhoneAuthProviderAuthUI.swift} | 2 +- .../FirebaseSwiftUIExample/ContentView.swift | 4 ++-- .../FirebaseSwiftUIExampleApp.swift | 2 +- 6 files changed, 18 insertions(+), 18 deletions(-) rename FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/{FacebookProviderSwift.swift => FacebookProviderAuthUI.swift} (98%) rename FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Services/{GoogleProviderSwift.swift => GoogleProviderAuthUI.swift} (96%) rename FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Services/{PhoneAuthProviderSwift.swift => PhoneAuthProviderAuthUI.swift} (87%) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift index c5ecdc16433..539355855e5 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift @@ -1,16 +1,16 @@ @preconcurrency import FirebaseAuth import SwiftUI -public protocol GoogleProviderProtocol { +public protocol GoogleProviderAuthUIProtocol { func handleUrl(_ url: URL) -> Bool @MainActor func signInWithGoogle(clientID: String) async throws -> AuthCredential } -public protocol FacebookProviderProtocol { +public protocol FacebookProviderAuthUIProtocol { @MainActor func signInWithFacebook(isLimitedLogin: Bool) async throws -> AuthCredential } -public protocol PhoneAuthProviderProtocol { +public protocol PhoneAuthProviderAuthUIProtocol { @MainActor func verifyPhoneNumber(phoneNumber: String) async throws -> String } @@ -61,9 +61,9 @@ private final class AuthListenerManager { @Observable public final class AuthService { public init(configuration: AuthConfiguration = AuthConfiguration(), auth: Auth = Auth.auth(), - googleProvider: GoogleProviderProtocol? = nil, - facebookProvider: FacebookProviderProtocol? = nil, - phoneAuthProvider: PhoneAuthProviderProtocol? = nil) { + googleProvider: GoogleProviderAuthUIProtocol? = nil, + facebookProvider: FacebookProviderAuthUIProtocol? = nil, + phoneAuthProvider: PhoneAuthProviderAuthUIProtocol? = nil) { self.auth = auth self.configuration = configuration self.googleProvider = googleProvider @@ -85,11 +85,11 @@ public final class AuthService { public let passwordPrompt: PasswordPromptCoordinator = .init() private var listenerManager: AuthListenerManager? - private let googleProvider: GoogleProviderProtocol? - private let facebookProvider: FacebookProviderProtocol? - private let phoneAuthProvider: PhoneAuthProviderProtocol? + private let googleProvider: GoogleProviderAuthUIProtocol? + private let facebookProvider: FacebookProviderAuthUIProtocol? + private let phoneAuthProvider: PhoneAuthProviderAuthUIProtocol? - private var safeGoogleProvider: GoogleProviderProtocol { + private var safeGoogleProvider: GoogleProviderAuthUIProtocol { get throws { guard let provider = googleProvider else { throw AuthServiceError @@ -99,7 +99,7 @@ public final class AuthService { } } - private var safeFacebookProvider: FacebookProviderProtocol { + private var safeFacebookProvider: FacebookProviderAuthUIProtocol { get throws { guard let provider = facebookProvider else { throw AuthServiceError @@ -109,7 +109,7 @@ public final class AuthService { } } - private var safePhoneAuthProvider: PhoneAuthProviderProtocol { + private var safePhoneAuthProvider: PhoneAuthProviderAuthUIProtocol { get throws { guard let provider = phoneAuthProvider else { throw AuthServiceError diff --git a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderSwift.swift b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift similarity index 98% rename from FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderSwift.swift rename to FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift index c72887efae1..8ca5d23633b 100644 --- a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderSwift.swift +++ b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift @@ -20,7 +20,7 @@ public enum FacebookProviderError: Error { case authenticationToken(String) } -public class FacebookProviderSwift: FacebookProviderProtocol { +public class FacebookProviderAuthUI: FacebookProviderAuthUIProtocol { let scopes: [String] let shortName = "Facebook" let providerId = "facebook.com" diff --git a/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Services/GoogleProviderSwift.swift b/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Services/GoogleProviderAuthUI.swift similarity index 96% rename from FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Services/GoogleProviderSwift.swift rename to FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Services/GoogleProviderAuthUI.swift index f042e95e711..7329090cc8a 100644 --- a/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Services/GoogleProviderSwift.swift +++ b/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Services/GoogleProviderAuthUI.swift @@ -12,7 +12,7 @@ public enum GoogleProviderError: Error { case user(String) } -public class GoogleProviderSwift: @preconcurrency GoogleProviderProtocol { +public class GoogleProviderAuthUI: @preconcurrency GoogleProviderAuthUIProtocol { let scopes: [String] let shortName = "Google" let providerId = "google.com" diff --git a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Services/PhoneAuthProviderSwift.swift b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Services/PhoneAuthProviderAuthUI.swift similarity index 87% rename from FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Services/PhoneAuthProviderSwift.swift rename to FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Services/PhoneAuthProviderAuthUI.swift index df78c63ca8c..65f845a1310 100644 --- a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Services/PhoneAuthProviderSwift.swift +++ b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Services/PhoneAuthProviderAuthUI.swift @@ -3,7 +3,7 @@ import FirebaseAuthSwiftUI public typealias VerificationID = String -public class PhoneAuthProviderSwift: @preconcurrency PhoneAuthProviderProtocol { +public class PhoneAuthProviderAuthUI: @preconcurrency PhoneAuthProviderAuthUIProtocol { public init() {} @MainActor public func verifyPhoneNumber(phoneNumber: String) async throws -> VerificationID { diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift index 57fc53e0ca3..b7e4e229ec6 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift @@ -28,8 +28,8 @@ struct ContentView: View { shouldAutoUpgradeAnonymousUsers: true, emailLinkSignInActionCodeSettings: actionCodeSettings ) - let facebookProvider = FacebookProviderSwift() - let phoneAuthProvider = PhoneAuthProviderSwift() + let facebookProvider = FacebookProviderAuthUI() + let phoneAuthProvider = PhoneAuthProviderAuthUI() authService = AuthService( configuration: configuration, googleProvider: googleProvider, diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift index 8e6137c427e..d41301364ff 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift @@ -12,7 +12,7 @@ import Foundation import SwiftData import SwiftUI -let googleProvider = GoogleProviderSwift() +let googleProvider = GoogleProviderAuthUI() class AppDelegate: NSObject, UIApplicationDelegate { func application(_ application: UIApplication, From 0e724852f188a3635738af39553b9e0bf45e243e Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Thu, 24 Apr 2025 10:39:39 +0100 Subject: [PATCH 4/8] chore: create previews for all Views --- .../Sources/Utils/CommonUtils.swift | 16 ++++++++++++++++ .../Sources/Views/EmailAuthView.swift | 6 ++++++ .../Sources/Views/EmailLinkView.swift | 6 ++++++ .../Sources/Views/PasswordPromptView.swift | 4 ++++ .../Sources/Views/PasswordRecoveryView.swift | 6 ++++++ .../Sources/Views/SignedInView.swift | 6 ++++++ .../Sources/Views/VerifyEmailView.swift | 6 ++++++ .../Sources/Views/SignInWithFacebookButton.swift | 6 ++++++ .../Sources/Views/SignInWithGoogleButton.swift | 6 ++++++ .../Sources/Views/PhoneAuthButtonView.swift | 6 ++++++ 10 files changed, 68 insertions(+) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/CommonUtils.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/CommonUtils.swift index 308b12bd772..38a21546903 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/CommonUtils.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/CommonUtils.swift @@ -1,4 +1,5 @@ import CommonCrypto +import FirebaseCore import Foundation import Security @@ -46,4 +47,19 @@ public class CommonUtils { } return hash.map { String(format: "%02x", $0) }.joined() } + + public static func dummyConfigurationForPreview() { + guard FirebaseApp.app() == nil else { return } + + let options = FirebaseOptions( + googleAppID: "1:123:ios:123abc456def7890", + gcmSenderID: "dummy" + ) + options.apiKey = "dummy" + options.projectID = "dummy-project-id" + options.bundleID = Bundle.main.bundleIdentifier ?? "com.example.dummy" + options.clientID = "dummy-abc.apps.googleusercontent.com" + + FirebaseApp.configure(options: options) + } } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift index d5cc8b3be85..a31d9f02435 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift @@ -132,3 +132,9 @@ extension EmailAuthView: View { } } } + +#Preview { + CommonUtils.dummyConfigurationForPreview() + return EmailAuthView() + .environment(AuthService()) +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift index dc0a6ddc317..e734cf417a1 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift @@ -74,3 +74,9 @@ extension EmailLinkView: View { })) } } + +#Preview { + CommonUtils.dummyConfigurationForPreview() + return EmailLinkView() + .environment(AuthService()) +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordPromptView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordPromptView.swift index 0af5733d903..6a4db96bb2d 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordPromptView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordPromptView.swift @@ -27,3 +27,7 @@ extension PasswordPromptSheet: View { .padding() } } + +#Preview { + PasswordPromptSheet(coordinator: PasswordPromptCoordinator()) +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift index a2a20027d22..a5f7ac65921 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift @@ -67,3 +67,9 @@ extension PasswordRecoveryView: View { })) } } + +#Preview { + CommonUtils.dummyConfigurationForPreview() + return PasswordRecoveryView() + .environment(AuthService()) +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift index 6b27315eb12..d281683b74d 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift @@ -43,3 +43,9 @@ extension SignedInView: View { } } } + +#Preview { + CommonUtils.dummyConfigurationForPreview() + return SignedInView() + .environment(AuthService()) +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift index 518cfd4fea9..51557006725 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift @@ -42,3 +42,9 @@ extension VerifyEmailView: View { } } } + +#Preview { + CommonUtils.dummyConfigurationForPreview() + return VerifyEmailView() + .environment(AuthService()) +} diff --git a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift index e89a89d3cf5..c41401ded9b 100644 --- a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift +++ b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift @@ -108,3 +108,9 @@ extension SignInWithFacebookButton: View { Text(errorMessage).foregroundColor(.red) } } + +#Preview { + CommonUtils.dummyConfigurationForPreview() + return SignInWithFacebookButton() + .environment(AuthService()) +} diff --git a/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift b/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift index 09a9728083d..51885f42926 100644 --- a/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift +++ b/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift @@ -49,3 +49,9 @@ extension SignInWithGoogleButton: View { }) } } + +#Preview { + CommonUtils.dummyConfigurationForPreview() + return SignInWithGoogleButton() + .environment(AuthService()) +} diff --git a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift index 9cbea24464a..84c084c25d8 100644 --- a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift +++ b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift @@ -90,3 +90,9 @@ extension PhoneAuthButtonView: View { Text(errorMessage).foregroundColor(.red) } } + +#Preview { + CommonUtils.dummyConfigurationForPreview() + return PhoneAuthButtonView() + .environment(AuthService()) +} From aa5c0c73b6e71224ee6deb34b50847173f82edb7 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Wed, 7 May 2025 11:40:44 +0100 Subject: [PATCH 5/8] uncomment anonymous sign-in --- .../FirebaseSwiftUIExample/ContentView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift index b7e4e229ec6..5532b9e17e4 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift @@ -16,7 +16,7 @@ struct ContentView: View { let authService: AuthService init() { - // Auth.auth().signInAnonymously() + Auth.auth().signInAnonymously() let actionCodeSettings = ActionCodeSettings() actionCodeSettings.handleCodeInApp = true From 757a302a9f670e5e9b931b1b61074f831ab48319 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Wed, 7 May 2025 11:46:07 +0100 Subject: [PATCH 6/8] revert back to original Button label --- .../Sources/Views/EmailAuthView.swift | 12 ++++++------ .../Sources/Views/EmailLinkView.swift | 4 ++-- .../Sources/Views/PasswordRecoveryView.swift | 4 ++-- .../Sources/Views/VerifyEmailView.swift | 4 ++-- .../Sources/Views/SignInWithFacebookButton.swift | 4 ++-- .../Sources/Views/SignInWithGoogleButton.swift | 4 ++-- .../Sources/Views/PhoneAuthButtonView.swift | 8 ++++---- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift index a31d9f02435..bbdd9f74eaf 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift @@ -82,9 +82,9 @@ extension EmailAuthView: View { if authService.authenticationFlow == .login { Button(action: { authService.authView = .passwordRecovery - }, label: { + }) { Text("Forgotten Password?") - }) + } } if authService.authenticationFlow == .signUp { @@ -108,7 +108,7 @@ extension EmailAuthView: View { if authService.authenticationFlow == .login { await signInWithEmailPassword() } else { await createUserWithEmailPassword() } } - }, label: { + }) { if authService.authenticationState != .authenticating { Text(authService.authenticationFlow == .login ? "Log in with password" : "Sign up") .padding(.vertical, 8) @@ -119,16 +119,16 @@ extension EmailAuthView: View { .padding(.vertical, 8) .frame(maxWidth: .infinity) } - }) + } .disabled(!isValid) .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) .buttonStyle(.borderedProminent) Button(action: { authService.authView = .passwordRecovery - }, label: { + }) { Text("Prefer Email link sign-in?") - }) + } } } } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift index e734cf417a1..9e288f8e1c1 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift @@ -35,11 +35,11 @@ extension EmailLinkView: View { await sendEmailLink() authService.emailLink = email } - }, label: { + }) { Text("Send email sign-in link") .padding(.vertical, 8) .frame(maxWidth: .infinity) - }) + } .disabled(!CommonUtils.isValidEmail(email)) .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift index a5f7ac65921..573c9572215 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift @@ -33,11 +33,11 @@ extension PasswordRecoveryView: View { Task { await sendPasswordRecoveryEmail() } - }, label: { + }) { Text("Password Recovery") .padding(.vertical, 8) .frame(maxWidth: .infinity) - }) + } .disabled(!CommonUtils.isValidEmail(email)) .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift index 51557006725..ba8e510c5ad 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift @@ -19,11 +19,11 @@ extension VerifyEmailView: View { Task { await sendEmailVerification() } - }, label: { + }) { Text("Verify email address?") .padding(.vertical, 8) .frame(maxWidth: .infinity) - }) + } .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) .buttonStyle(.borderedProminent) diff --git a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift index c41401ded9b..3a4e90f3640 100644 --- a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift +++ b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift @@ -60,7 +60,7 @@ extension SignInWithFacebookButton: View { } } } - }, label: { + }) { HStack { Image(systemName: "f.circle.fill") .font(.title) @@ -73,7 +73,7 @@ extension SignInWithFacebookButton: View { .frame(maxWidth: .infinity) .background(Color.blue) .cornerRadius(8) - }) + } .alert(isPresented: $showCanceledAlert) { Alert( title: Text("Facebook login cancelled"), diff --git a/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift b/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift index 51885f42926..af907f25b37 100644 --- a/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift +++ b/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift @@ -20,7 +20,7 @@ extension SignInWithGoogleButton: View { Task { try await signInWithGoogle() } - }, label: { + }) { if authService.authenticationState != .authenticating { HStack { Image(systemName: "globe") // Placeholder for Google logo @@ -46,7 +46,7 @@ extension SignInWithGoogleButton: View { .padding(.vertical, 8) .frame(maxWidth: .infinity) } - }) + } } } diff --git a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift index 84c084c25d8..2c025dde628 100644 --- a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift +++ b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift @@ -39,11 +39,11 @@ extension PhoneAuthButtonView: View { ) } } - }, label: { + }) { Text("Send SMS code") .padding(.vertical, 8) .frame(maxWidth: .infinity) - }) + } .disabled(!PhoneUtils.isValidPhoneNumber(phoneNumber)) .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) @@ -69,7 +69,7 @@ extension PhoneAuthButtonView: View { } showVerificationCodeInput = false } - }, label: { + }) { Text("Verify phone number and sign-in") .foregroundColor(.white) .padding() @@ -77,7 +77,7 @@ extension PhoneAuthButtonView: View { .background(Color.green) .cornerRadius(8) .padding(.horizontal) - }) + } }.onOpenURL { url in authService.auth.canHandle(url) } From d06bc07be30b1bd0a34e627fe5c88269c2447c76 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Wed, 7 May 2025 11:58:36 +0100 Subject: [PATCH 7/8] use FirebaseOptions extension for dummy config --- .../FirebaseAuthSwiftUI/Sources/Utils/CommonUtils.swift | 4 +++- .../FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift | 3 ++- .../FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift | 3 ++- .../Sources/Views/PasswordRecoveryView.swift | 3 ++- .../FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift | 3 ++- .../FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift | 3 ++- .../Sources/Views/SignInWithFacebookButton.swift | 3 ++- .../Sources/Views/SignInWithGoogleButton.swift | 3 ++- .../Sources/Views/PhoneAuthButtonView.swift | 3 ++- 9 files changed, 19 insertions(+), 9 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/CommonUtils.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/CommonUtils.swift index 38a21546903..7be8e14f8c5 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/CommonUtils.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/CommonUtils.swift @@ -47,8 +47,10 @@ public class CommonUtils { } return hash.map { String(format: "%02x", $0) }.joined() } +} - public static func dummyConfigurationForPreview() { +public extension FirebaseOptions { + static func dummyConfigurationForPreview() { guard FirebaseApp.app() == nil else { return } let options = FirebaseOptions( diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift index bbdd9f74eaf..1e7c3c3caa2 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift @@ -5,6 +5,7 @@ // Created by Russell Wheatley on 20/03/2025. // import FirebaseAuth +import FirebaseCore import SwiftUI private enum FocusableField: Hashable { @@ -134,7 +135,7 @@ extension EmailAuthView: View { } #Preview { - CommonUtils.dummyConfigurationForPreview() + FirebaseOptions.dummyConfigurationForPreview() return EmailAuthView() .environment(AuthService()) } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift index 9e288f8e1c1..35327800616 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift @@ -1,4 +1,5 @@ import FirebaseAuth +import FirebaseCore import SwiftUI public struct EmailLinkView { @@ -76,7 +77,7 @@ extension EmailLinkView: View { } #Preview { - CommonUtils.dummyConfigurationForPreview() + FirebaseOptions.dummyConfigurationForPreview() return EmailLinkView() .environment(AuthService()) } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift index 573c9572215..b64d1361b9f 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift @@ -1,3 +1,4 @@ +import FirebaseCore import SwiftUI public struct PasswordRecoveryView { @@ -69,7 +70,7 @@ extension PasswordRecoveryView: View { } #Preview { - CommonUtils.dummyConfigurationForPreview() + FirebaseOptions.dummyConfigurationForPreview() return PasswordRecoveryView() .environment(AuthService()) } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift index d281683b74d..9efa2917321 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift @@ -1,3 +1,4 @@ +import FirebaseCore import SwiftUI @MainActor @@ -45,7 +46,7 @@ extension SignedInView: View { } #Preview { - CommonUtils.dummyConfigurationForPreview() + FirebaseOptions.dummyConfigurationForPreview() return SignedInView() .environment(AuthService()) } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift index ba8e510c5ad..ddf246c9158 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift @@ -1,3 +1,4 @@ +import FirebaseCore import SwiftUI public struct VerifyEmailView { @@ -44,7 +45,7 @@ extension VerifyEmailView: View { } #Preview { - CommonUtils.dummyConfigurationForPreview() + FirebaseOptions.dummyConfigurationForPreview() return VerifyEmailView() .environment(AuthService()) } diff --git a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift index 3a4e90f3640..3520fe67c70 100644 --- a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift +++ b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift @@ -3,6 +3,7 @@ import FacebookCore import FacebookLogin import FirebaseAuth import FirebaseAuthSwiftUI +import FirebaseCore import SwiftUI @MainActor @@ -110,7 +111,7 @@ extension SignInWithFacebookButton: View { } #Preview { - CommonUtils.dummyConfigurationForPreview() + FirebaseOptions.dummyConfigurationForPreview() return SignInWithFacebookButton() .environment(AuthService()) } diff --git a/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift b/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift index af907f25b37..a7b8d79796b 100644 --- a/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift +++ b/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift @@ -1,4 +1,5 @@ import FirebaseAuthSwiftUI +import FirebaseCore import SwiftUI @MainActor @@ -51,7 +52,7 @@ extension SignInWithGoogleButton: View { } #Preview { - CommonUtils.dummyConfigurationForPreview() + FirebaseOptions.dummyConfigurationForPreview() return SignInWithGoogleButton() .environment(AuthService()) } diff --git a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift index 2c025dde628..4e971dcdeaf 100644 --- a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift +++ b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift @@ -1,4 +1,5 @@ import FirebaseAuthSwiftUI +import FirebaseCore import SwiftUI @MainActor @@ -92,7 +93,7 @@ extension PhoneAuthButtonView: View { } #Preview { - CommonUtils.dummyConfigurationForPreview() + FirebaseOptions.dummyConfigurationForPreview() return PhoneAuthButtonView() .environment(AuthService()) } From cd2e84eeded5fef2accd69c17289ebaaf357fe64 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Wed, 7 May 2025 15:09:51 +0100 Subject: [PATCH 8/8] fix: merge conflict resolution mistakes --- .../Sources/Services/AuthService.swift | 16 ++++++++-------- .../Sources/Views/AuthPickerView.swift | 4 ++-- .../Sources/Views/EmailLinkView.swift | 4 ++-- .../Sources/Views/PasswordRecoveryView.swift | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift index 1db701427fa..69e3536e14d 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift @@ -6,15 +6,15 @@ public protocol ExternalAuthProvider { @MainActor var authButton: ButtonType { get } } -public protocol GoogleProviderAuthUIProtocol { +public protocol GoogleProviderAuthUIProtocol: ExternalAuthProvider { @MainActor func signInWithGoogle(clientID: String) async throws -> AuthCredential } -public protocol FacebookProviderAuthUIProtocol { +public protocol FacebookProviderAuthUIProtocol: ExternalAuthProvider { @MainActor func signInWithFacebook(isLimitedLogin: Bool) async throws -> AuthCredential } -public protocol PhoneAuthProviderAuthUIProtocol { +public protocol PhoneAuthProviderAuthUIProtocol: ExternalAuthProvider { @MainActor func verifyPhoneNumber(phoneNumber: String) async throws -> String } @@ -66,9 +66,9 @@ private final class AuthListenerManager { @Observable public final class AuthService { public init(configuration: AuthConfiguration = AuthConfiguration(), auth: Auth = Auth.auth(), - googleProvider: GoogleProviderAuthUIProtocol? = nil, - facebookProvider: FacebookProviderAuthUIProtocol? = nil, - phoneAuthProvider: PhoneAuthProviderAuthUIProtocol? = nil) { + googleProvider: (any GoogleProviderAuthUIProtocol)? = nil, + facebookProvider: (any FacebookProviderAuthUIProtocol)? = nil, + phoneAuthProvider: (any PhoneAuthProviderAuthUIProtocol)? = nil) { self.auth = auth self.configuration = configuration self.googleProvider = googleProvider @@ -106,7 +106,7 @@ public final class AuthService { } } - private var safeFacebookProvider: FacebookProviderAuthUIProtocol { + private var safeFacebookProvider: any FacebookProviderAuthUIProtocol { get throws { guard let provider = facebookProvider else { throw AuthServiceError @@ -116,7 +116,7 @@ public final class AuthService { } } - private var safePhoneAuthProvider: PhoneAuthProviderAuthUIProtocol { + private var safePhoneAuthProvider: any PhoneAuthProviderAuthUIProtocol { get throws { guard let provider = phoneAuthProvider else { throw AuthServiceError diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift index 35046df5896..517149ce98f 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift @@ -38,11 +38,11 @@ extension AuthPickerView: View { withAnimation { switchFlow() } - }, label: { + }) { Text(authService.authenticationFlow == .signUp ? "Log in" : "Sign up") .fontWeight(.semibold) .foregroundColor(.blue) - }) + } } Text(authService.errorMessage).foregroundColor(.red) } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift index 35327800616..321b492c7b6 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift @@ -67,12 +67,12 @@ extension EmailLinkView: View { } .navigationBarItems(leading: Button(action: { authService.authView = .authPicker - }, label: { + }) { Image(systemName: "chevron.left") .foregroundColor(.blue) Text("Back") .foregroundColor(.blue) - })) + }) } } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift index b64d1361b9f..b237526aca3 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift @@ -60,12 +60,12 @@ extension PasswordRecoveryView: View { } .navigationBarItems(leading: Button(action: { authService.authView = .authPicker - }, label: { + }) { Image(systemName: "chevron.left") .foregroundColor(.blue) Text("Back") .foregroundColor(.blue) - })) + }) } }