From d698c296327b395b7da99981da71ec4b5750d172 Mon Sep 17 00:00:00 2001 From: Ademola Fadumo Date: Mon, 27 Oct 2025 15:31:27 +0100 Subject: [PATCH 01/38] ui changes --- .../Configuration/AuthProvider.swift | 147 +++++ .../Extensions/Color+Hex.swift | 24 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 35 ++ .../Resources/Assets.xcassets/Contents.json | 6 + .../firebase-auth-logo.imageset/Contents.json | 23 + .../firebase_auth_120dp 1.png | Bin 0 -> 31998 bytes .../firebase_auth_120dp 2.png | Bin 0 -> 15823 bytes .../firebase_auth_120dp.png | Bin 0 -> 35146 bytes .../fui-ic-anonymous.imageset/Contents.json | 23 + .../fui_ic_anonymous_white_24dp 1.png | Bin 0 -> 7879 bytes .../fui_ic_anonymous_white_24dp 2.png | Bin 0 -> 3635 bytes .../fui_ic_anonymous_white_24dp.png | Bin 0 -> 12883 bytes .../fui-ic-apple.imageset/Contents.json | 23 + .../fui_ic_apple_white_24dp 1.png | Bin 0 -> 9453 bytes .../fui_ic_apple_white_24dp 2.png | Bin 0 -> 4572 bytes .../fui_ic_apple_white_24dp.png | Bin 0 -> 15394 bytes .../fui-ic-facebook.imageset/Contents.json | 23 + .../fui_ic_facebook_white_22dp 1.png | Bin 0 -> 5231 bytes .../fui_ic_facebook_white_22dp 2.png | Bin 0 -> 2524 bytes .../fui_ic_facebook_white_22dp.png | Bin 0 -> 8550 bytes .../fui-ic-github.imageset/Contents.json | 23 + .../fui_ic_github_white_24dp 1.png | Bin 0 -> 13957 bytes .../fui_ic_github_white_24dp 2.png | Bin 0 -> 6636 bytes .../fui_ic_github_white_24dp.png | Bin 0 -> 22107 bytes .../fui-ic-googleg.imageset/Contents.json | 23 + .../fui_ic_googleg_color_24dp 1.png | Bin 0 -> 14824 bytes .../fui_ic_googleg_color_24dp 2.png | Bin 0 -> 7275 bytes .../fui_ic_googleg_color_24dp.png | Bin 0 -> 24342 bytes .../fui-ic-mail.imageset/Contents.json | 23 + .../fui_ic_mail_white_24dp 1.png | Bin 0 -> 5707 bytes .../fui_ic_mail_white_24dp 2.png | Bin 0 -> 2507 bytes .../fui_ic_mail_white_24dp.png | Bin 0 -> 9512 bytes .../fui-ic-microsoft.imageset/Contents.json | 23 + .../fui_ic_microsoft_24dp 1.png | Bin 0 -> 2753 bytes .../fui_ic_microsoft_24dp 2.png | Bin 0 -> 1150 bytes .../fui_ic_microsoft_24dp.png | Bin 0 -> 5102 bytes .../fui-ic-phone.imageset/Contents.json | 23 + .../fui_ic_phone_white_24dp 1.png | Bin 0 -> 7532 bytes .../fui_ic_phone_white_24dp 2.png | Bin 0 -> 3332 bytes .../fui_ic_phone_white_24dp.png | Bin 0 -> 12472 bytes .../Contents.json | 23 + .../fui_ic_twitter_bird_white_24dp 1.png | Bin 0 -> 10311 bytes .../fui_ic_twitter_bird_white_24dp 2.png | Bin 0 -> 4861 bytes .../fui_ic_twitter_bird_white_24dp.png | Bin 0 -> 16207 bytes .../fui-ic-yahoo.imageset/Contents.json | 23 + .../fui_ic_yahoo_24dp 1.png | Bin 0 -> 8024 bytes .../fui_ic_yahoo_24dp 2.png | Bin 0 -> 3783 bytes .../fui_ic_yahoo_24dp.png | Bin 0 -> 13470 bytes .../Theme/ProviderStyle.swift | 36 ++ .../FirebaseAuthView/Theme/Theme.swift | 14 + .../Views/AuthMethodPickerListView.swift | 73 +++ .../Views/Components/AnnotatedString.swift | 56 ++ .../Views/Components/AuthProviderButton.swift | 83 +++ .../Views/Components/AuthTextField.swift | 169 ++++++ .../Views/Email/EmailResetPasswordView.swift | 102 ++++ .../Views/Email/EmailSignInView.swift | 107 ++++ .../Views/Email/EmailSignUpView.swift | 103 ++++ .../Views/FirebaseAuthView.swift | 45 ++ .../Views/FirebaseAuthViewInternal.swift | 321 ++++++++++ .../Views/Phone/CountrySelector.swift | 77 +++ .../Views/Phone/EnterPhoneNumberView.swift | 87 +++ .../Phone/EnterVerificationCodeView.swift | 103 ++++ .../Phone/VerificationCodeInputField.swift | 555 ++++++++++++++++++ .../Sources/Strings/Localizable.xcstrings | 230 ++++++++ .../project.pbxproj | 176 +++++- .../ContentViewSheetExample.swift | 81 +++ .../FirebaseSwiftUIExampleApp.swift | 11 +- 68 files changed, 2897 insertions(+), 8 deletions(-) create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Configuration/AuthProvider.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Extensions/Color+Hex.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-anonymous.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-facebook.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-github.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-github.imageset/fui_ic_github_white_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-github.imageset/fui_ic_github_white_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-github.imageset/fui_ic_github_white_24dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-mail.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-yahoo.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-yahoo.imageset/fui_ic_yahoo_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-yahoo.imageset/fui_ic_yahoo_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-yahoo.imageset/fui_ic_yahoo_24dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Theme/ProviderStyle.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Theme/Theme.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/AuthMethodPickerListView.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AnnotatedString.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AuthProviderButton.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AuthTextField.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailResetPasswordView.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignInView.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignUpView.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthView.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthViewInternal.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/CountrySelector.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterPhoneNumberView.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterVerificationCodeView.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/VerificationCodeInputField.swift create mode 100644 samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentViewSheetExample.swift diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Configuration/AuthProvider.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Configuration/AuthProvider.swift new file mode 100644 index 0000000000..c5a9c9a6c2 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Configuration/AuthProvider.swift @@ -0,0 +1,147 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI +import FirebaseAuth + +enum AuthProvider: CaseIterable { + case google + case facebook + case twitter + case github + case email + case phone + case anonymous + case microsoft + case yahoo + case apple + + var id: String { + switch self { + case .google: return GoogleAuthProvider.id + case .facebook: return FacebookAuthProvider.id + case .twitter: return TwitterAuthProvider.id + case .github: return GitHubAuthProvider.id + case .email: return EmailAuthProvider.id + case .phone: return PhoneAuthProvider.id + case .anonymous: return "anonymous" + case .microsoft: return "microsoft.com" + case .yahoo: return "yahoo.com" + case .apple: return "apple.com" + } + } + + var buttonTitle: String { + switch self { + case .google: + return "Sign in with Google" + case .facebook: + return "Sign in with Facebook" + case .twitter: + return "Sign in with Twitter" + case .github: + return "Sign in with GitHub" + case .email: + return "Sign in with Email" + case .phone: + return "Sign in with Phone" + case .anonymous: + return "Sign in Anonymously" + case .microsoft: + return "Sign in with Microsoft" + case .yahoo: + return "Sign in with Yahoo" + case .apple: + return "Sign in with Apple" + } + } + + var isSocialProvider: Bool { + switch self { + case .google, .facebook, .twitter, .github: + return true + default: + return false + } + } + + static func from(id: String) -> AuthProvider? { + Self.allCases.first { $0.id == id } + } + + var providerStyle: ProviderStyle { + switch self { + case .google: + return ProviderStyle( + icon: .fuiIcGoogleg, + backgroundColor: Color(hex: 0xFFFFFF), + contentColor: Color(hex: 0x757575) + ) + case .facebook: + return ProviderStyle( + icon: .fuiIcFacebook, + backgroundColor: Color(hex: 0x3B5998), + contentColor: Color(hex: 0xFFFFFF) + ) + case .twitter: + return ProviderStyle( + icon: .fuiIcTwitterBird, + backgroundColor: Color(hex: 0x5BAAF4), + contentColor: Color(hex: 0xFFFFFF) + ) + case .github: + return ProviderStyle( + icon: .fuiIcGithub, + backgroundColor: Color(hex: 0x24292E), + contentColor: Color(hex: 0xFFFFFF) + ) + case .email: + return ProviderStyle( + icon: .fuiIcMail, + backgroundColor: Color(hex: 0xD0021B), + contentColor: Color(hex: 0xFFFFFF) + ) + case .phone: + return ProviderStyle( + icon: .fuiIcPhone, + backgroundColor: Color(hex: 0x43C5A5), + contentColor: Color(hex: 0xFFFFFF) + ) + case .anonymous: + return ProviderStyle( + icon: .fuiIcAnonymous, + backgroundColor: Color(hex: 0xF4B400), + contentColor: Color(hex: 0xFFFFFF) + ) + case .microsoft: + return ProviderStyle( + icon: .fuiIcMicrosoft, + backgroundColor: Color(hex: 0x2F2F2F), + contentColor: Color(hex: 0xFFFFFF) + ) + case .yahoo: + return ProviderStyle( + icon: .fuiIcYahoo, + backgroundColor: Color(hex: 0x720E9E), + contentColor: Color(hex: 0xFFFFFF) + ) + case .apple: + return ProviderStyle( + icon: .fuiIcApple, + backgroundColor: Color(hex: 0x000000), + contentColor: Color(hex: 0xFFFFFF) + ) + } + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Extensions/Color+Hex.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Extensions/Color+Hex.swift new file mode 100644 index 0000000000..afcc90b692 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Extensions/Color+Hex.swift @@ -0,0 +1,24 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +extension Color { + init(hex: Int, opacity: Double = 1.0) { + let red = Double((hex & 0xFF0000) >> 16) / 255.0 + let green = Double((hex & 0xFF00) >> 8) / 255.0 + let blue = Double((hex & 0xFF) >> 0) / 255.0 + self.init(.sRGB, red: red, green: green, blue: blue, opacity: opacity) + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000000..eb87897008 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..2305880107 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,35 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/Contents.json new file mode 100644 index 0000000000..d41340246f --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "firebase_auth_120dp 2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "firebase_auth_120dp 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "firebase_auth_120dp.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 1.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 1.png new file mode 100644 index 0000000000000000000000000000000000000000..6a6374e30edb3627e445045a6cfaab0ee86500b1 GIT binary patch literal 31998 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..351fa59fe5a0c215853266f7ae53ed06e2d2b001 GIT binary patch literal 15823 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..5c2f2bcd903744406682ab3e8e305f551d854640 GIT binary patch literal 3635 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..9d57c10f7e08c6b66f26d8c0a35659a32cc033e9 GIT binary patch literal 12883 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 Lvy&ydr11X*2XF~} literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/Contents.json new file mode 100644 index 0000000000..b8005dda54 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "fui_ic_apple_white_24dp 2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "fui_ic_apple_white_24dp 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "fui_ic_apple_white_24dp.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 1.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 1.png new file mode 100644 index 0000000000000000000000000000000000000000..d251bbd78f51ab2afa7202ece5d658cabf887910 GIT binary patch literal 9453 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 R+0bg6wluXl^~{(^{XY_^*C+r0 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..7c239197b30a45ee2ee91a4527e4849e13a605ab GIT binary patch literal 4572 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 DxB6~5 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..6cc6fcf3c95492e53680d03c52ed8cb34ce495b0 GIT binary patch literal 2524 zcmc&$`BRf=68^F<96|`ftRR;=ShrI$W6#bYo9$zuTXlqa49%>QTK@@? z?T2S6-Wb+)kUZ4*F-KF~F-UCiTG4U{J^c?=Tozgq5QQMnNmt7=ZZkeuYr||t9zU`? z)G@fEY$AFqEuHE3)LQENIpj%X=+~hxv%&Sm`DEnZpi@Fjr@;H%k!1FuYf zjRk97|K{GVQE1bmF^ikmE?=um_4yKhpdlK_D5%Xr)&j|lacz#WGuAvc`@>O{ zPGZ0E$1BX)*VGMM7t9Cug5QC8K z98Zp)=yT->vnn-!sj@B@U2kuR7!Xk8?U5L3a~^C&5s~Ngr$Q0VK&f|I(teW-zFS+o^o1kVAN({j($f9L z3mZS!9jAf)V!@V2W=QKYHxp~m%^Pjh zumX0&3-!h zq>pKKD(GvAo%N5Jjf_0-F05(~uN-aSdFwkjlS7ZtvIfK2)QUCyt(eWM^4%0_kCvZX z`?vn;G9L={WZ_otam@0f*I768UGdOAgY%c?{5Kv?s-+^sOnBvo`^Q0_4}M7;Cl9tF zBKuOCmR`|^W~$gF5u3_8zj0wY$D>FA!3?Ic2`n4q{ErxE6V`;==CBUxA(;B+A|z&X z0QDllBNp!jR^>lQ^sv&gZ&gGvB_pN&O~DNg=JHt9%4Ze=Y>f=d(5o%sqyw@^M!}@VjgW@ zrHcaMLXxkn49n)mlOpCf-dNgk(Ef1hLQ-d%IFI%0B;)qM75x+1d<)c>J5d~skf7Be z_tSfduL~CVnKFs@2b#=zfx`ZzO5+d&SIxh*QX9dIqjrX05g#J+rz51nuHcWepfdst!vgnN4fBbMjA(*&iOxRoS}e zHK9e++7~5PjmVD8lq1~*3tLOw_bbLjRGfNjzH)cskQn1L4`Vj+&%Ep@u}TaSR5huU zm{NKl?>h2&W%PXW6|r^tTfOJ|C#}JfgnPveBv#sBfr(#MyAtIn|Rwx1bLR!hpG+VaubB`dX zruh)OskaG5o>))v6+rNJOp;N%s$SJm6jWlCqw(G%NX{0~F#q0*aXCj?J5`hqf$2EJ z7Ty6Y>zQ21H#Jg3jCyO!Zzs)WMlt*p5Tg^Xu8=KN&Ozt*2#K)j$<_a%+S(v047H~yr0JE6h1 zz3uM|I4z!czW70^e&Ktl(Q-Z|uP+5mamNL*yF6)^s(<(kckv%?lD}Z@|KD=Wt-fR; z>y@0Lt*($pazh7;#4EF$N%^JCX57Bih1%ZqGlu?h5qqdN0eoza(4d~~UtLV@2!=Wv%)x8!Ed zqHZlA*S)uEEXwP0tV~$zHE-J7-Km=S@m5yLct#g$2r=Zhj5ZM()iVvf%{a!k>2Siyw*Gj))&ByuN1#Fg literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp.png new file mode 100644 index 0000000000000000000000000000000000000000..717ca815a1e02617dc50ddbaf19b6d05662f381b GIT binary patch literal 8550 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 sbuA!s;KX!%c;Q#;t literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-github.imageset/fui_ic_github_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-github.imageset/fui_ic_github_white_24dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..aa84b536ca2c894f7b9953519bb5d5bdf4b158bd GIT binary patch literal 6636 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 acX${NZix@jUg~gHeCoK(FJ&b6oBsz)0*MF! literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/Contents.json new file mode 100644 index 0000000000..f6ede1b0b3 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "fui_ic_googleg_color_24dp 2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "fui_ic_googleg_color_24dp 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "fui_ic_googleg_color_24dp.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 1.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 1.png new file mode 100644 index 0000000000000000000000000000000000000000..c9f49bd31f578ff6c0a19338eb581b07cf5a7eaa GIT binary patch literal 14824 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..a3c7bf97cad3e34040a66dd11c7ef641304f18a8 GIT binary patch literal 7275 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..9df17f75fe88db866439c8a1d0d09a63accfb95c GIT binary patch literal 24342 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..937721e2eb58c35f02b62e0cccab8f6b0771e229 GIT binary patch literal 2507 zcmds3{XdiIAHQcaVIp)kA#>32kj$b7&v#-Wc~+h+TM9)fWoc%LQ^Y!nhVpcxjwPl% zHgx7;XPbv|jQNT>eOojS->CKV{JnSng!AL~e!Z^O{kh)P=kxx2uJ?7l?$3SG_ZUG< zWrqp?0BRmb4*LTD3@;yBkPwpE8{PxGl#`BxBm;n|mVCf~;!+F*!jk<7hk&{Py%}hN zhy}et0BFcpT_Y+&0nr|Z!N4o9xwr4n>-Om&-}x}L%P%I?bpFddKy0f*gp!|X<8~6*EdhiF9~P$)`zdpKY07yUe5^1@sFQ(ranJ1 zrBdmW@C`pv5&2q>XgEyuz}pKa7WgaII8LdH|Bf*JQI*yv-5r)i z&4%6Ow(ac6qN`t5PaoZD&t4RS2v!VYHU$dfO|n=k{`{<~P5Di%y`D+>?R9NU9??vi zs!HhZ&z#jb*?HrPG3ohXII-yrLqG3syum(2#)zhFwpc{oq?DE_@Dj|WqugGSR*9mR zxOjfMi@JzGv*O^FL}dOq4P^?;*- z8D2@;6#tNT_UV(=J}XhpEkS6M8Cw?X)rFCaE&LwYv`DyUb>{vj=(N1K0Ok88zVmy; z*jcWlMm)x)Pcr>n*g44Xk?A6bm?m~sOAC9y9xp(_r@J)B8`rWn>mCsSkA7=kX1YPt z4rd$+d(%*`wz`F#k3kOAA4FO%Eg13UqcJWqg_xJZ&V1}DiVN&07dq3i?b$>?m+8t( zw*ga(xq!K!#F>V*ze5DjHre=15Fv(RkV&V!OqUGY7>;xz5DP`YLD`Wkn8T1Bf30yF zDfT3$>rTNk8p|6H;%I~SA+BxoSp^jQzdTL;T8<_OO~SaCF4by~(5Ems*1>}1k&D|& zqobqFMYe94D0tTEG-l_d5qbRw{h70bCJX7=Wk#fX6$;+AkMMy^ZQU=wtKvTJ z$x_<4n88U*yWFJ8rA6+3eT5k{f1{SWCqYeI^P2h4p8bSnD-`+0FJ|sVO&=O2Z>%Jy zbCme`@jpkn)wr9kj>bqR6BF{ZZ;GqF;M3pU=-I%C6GkrVsXA&|!=~;-y+h&eElZ0} z0#%OG230Pw^W0W4^{#tb9<;dt%L-xQI8VL%7!lL8Ua+iug*}C%wf9#DeOwuH-Vpc@ z?`#Ol2<{B%aXW%>G^jT^a>{_uab4m?NDK$gEDHXy6 z2G+iR4+@SifnXCb#g0o$EA*9I_GUOvXlKE6OqZ0fyq$x%a_?l*rEEjqK#U5P77U@r zyn%Rh7Ay>+b2bK3Am(pSnFht!b~$sLuf&LFjzhKNLc;59VcS7996*zu$}~uq=6=V$ zvzGWul9j;VGGf;Zlx|6fo?stL**&UBVl`{^`Hy)Btq zh6qV7Hb5qT%&GmL=$Y9L1LU9OLW4}KG-{Yj^YWMEyE1MQZ)Ie`_-kLbup4G8mxwfc z`cZm?KyNE1ytz1c8++PpvXMZo6l zlG{#wdAZJe-QaSUJ`K`DY@<9pMj4-H?bahV1C;T{8gf+CA%2JJ*bjkd9k~W5u-Dc5 ze3slHS%c&t%9L{rxG~Oe4JiG4kLT#Q$>Tkaa@ry+??AJ?++okmGgy&z4;AyD;rE^2 zq9JiUyg^{lpH3_P`V)`#6`{j;h=sq=BDqlLs3SfM*o-nB>j)zMUluu`U=spYsqUAd zuao5A73gchn^eSAnwVeF+#Vhkj)}w`X6XEO)SKU|-{) zrY62)>E|(`FD6o!&1nzU{r7eU2VExBa_bW2_|*U<;Dv6x-@1ioc7!+wpaep*hCeP_ zdfo4T|FbeDHE4crv?1d&L7-iYq3{))Je_V8DH2=?$?Vk*;SHG{>m;|u#n6-O-84L-CdZCO7|nr z@$(0{()8%~qu*uRLPyH+fmSS)yx3pKa2Nlfs|x zmkP#|{-xdJn%43{)D=4Qd8K;f0s0^R%s_z-Z#Dty$Cbn^R?0m&kB8f_!*z$E>Hh=M Cy+;NB literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..273756411a41d04e01a0aff3ec3f1dc2bfb1e0d0 GIT binary patch literal 9512 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 F{};?xjK=@~ literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/Contents.json new file mode 100644 index 0000000000..123e877f0a --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "fui_ic_microsoft_24dp 2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "fui_ic_microsoft_24dp 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "fui_ic_microsoft_24dp.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 1.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 1.png new file mode 100644 index 0000000000000000000000000000000000000000..b43f424a5deb534ac6d2ab2fcfbb2d23e4dc9a9c GIT binary patch literal 2753 zcmeAS@N?(olHy`uVBq!ia0y~yV9EmG6b?3^$if@E{6LDcz$3Dlfk8|agc&`9R6YO& z8H#P zhB=q#eABnDe_Nb>`*zGTv)2rkw?F4NU#gUQVD-Fo=J)H2MfdtG-xSyDZ%>`arg5un z$z=wH2`X0@7#6iiF*r;KU}oqL0tQ2%6EA~;*9t}k7fw@#291Sm3<9d7ibjKAG!=}f zj6iOY1k(3oMXKDxmdKI;Vst0O686wg3PC literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..5455ead2cfef72fd8694462a5586268c4cb9cf11 GIT binary patch literal 1150 zcmeAS@N?(olHy`uVBq!ia0y~yU^E3{BMvs8$ZRS1JwS@Hz$3Dlfq`2Xgc%uT&5-~K zG8PB9J29*~C-V}>VM%xNb!1@J*w6hZkrl`l_H=O!sbGA2XK!vupn$`}%4rihCKPb; zX*3AEX}Q6Afkkw~x+4LMPgu-kbNn{R-Vlc2zZSBHx`A2K?9xcmJ5Z_#OG+l$TiKl^&2z^eW3QyH~KC1$(!TiM4y|5)Y`k-pQq zZhCauv*$5ujm@18eM(-}e?L#jk4?elN`pusbC3(KhoGr~>nMkoVeqtMTXjVGy7rdT zX9l<5PQS{RGUv=)q(}ua57cis6K4KB{d0~Tub}$x%HN;vPV4-7I_8Yk`}VH>)3bjX z2;N>_Vl#j9&)S$QCAsv?rRVzJC$0ElrTA_oqvj&EB^^=|l(HPUR*Z6J8wRM+Mk4P| bbv;A+741`n=R|=82?K+ttDnm{r-UW|nDJ-W literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..98ca3614c576c1d1768bde855ef38fa308b2d3f2 GIT binary patch literal 5102 zcmeAS@N?(olHy`uVBq!ia0y~yV4e@e(>U0GA{laOTYwa2fk$L91B0Rk2s64)GfV&q zG8PB9J29*~C-V}>VM%xNb!1@J*w6hZk(Gf#xY^UiF{Fa=?e&ehlNlvkFP=Zf%G!EU zftA^yDRaV$LmEB~Mw|wYFEliS%uaCJYw&R4U_4gQ5%a}+PVgSldGC0DMh*&KGv%tz zmF=I?cR!Z7&&ROxu*^N1zdQENZQZ$J-rJAYV|W=>1`E{esIYv`o-{jhMR3Kuxn<@I zOUyRkJSX&b##@_NcNs2NotxfRpI{60j({*QWEq|uQ3sNiA2}Hq9Q&W|Z&k8IVmhf%9d0xnN-tMdCKQc3H{d#9`v`uW5 zT-CXH_4?a8=RY$p_?nXU{Ojf2kqaI_zsbw6_WtJhy|ey0$H z%lFP4lCeK~^UuuJj0?8TJAFBh=g2i?V2(2!3?V++C>m`Mjy8u!`vRl=qtVXcXwMkW mumCW5jDpb+AP@q7^#3uPd}MlnRj1`5NU5i*pUXO@geCx$upqbq literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/Contents.json new file mode 100644 index 0000000000..14af6b8003 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "fui_ic_phone_white_24dp 2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "fui_ic_phone_white_24dp 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "fui_ic_phone_white_24dp.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 1.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 1.png new file mode 100644 index 0000000000000000000000000000000000000000..e040bdf1a94b7fc1fe045209eaabd2f5bcd447ce GIT binary patch literal 7532 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..70579d4aa656686573d90b39e3068e3c9e8291cb GIT binary patch literal 3332 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 u4^GOLXDcSda)ci$-o literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..27a6b5438ccc5f590062dfab3a71fbf81af4873c GIT binary patch literal 12472 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 QA;z5323LnNduIIq0$!{$#{d8T literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/Contents.json new file mode 100644 index 0000000000..f9efe37c15 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "fui_ic_twitter_bird_white_24dp 2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "fui_ic_twitter_bird_white_24dp 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "fui_ic_twitter_bird_white_24dp.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 1.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 1.png new file mode 100644 index 0000000000000000000000000000000000000000..4c99510bc3bb6ced4ff13c23904b8fbc4b62ef11 GIT binary patch literal 10311 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..2546331cec12cee64d29758eea08800e77e79d47 GIT binary patch literal 4861 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..14148143179c87a2d8b2fdf19d4af5c73ee177c4 GIT binary patch literal 16207 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ⅅ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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Theme/ProviderStyle.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Theme/ProviderStyle.swift new file mode 100644 index 0000000000..207d3355e8 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Theme/ProviderStyle.swift @@ -0,0 +1,36 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +struct ProviderStyle { + let icon: ImageResource? + let backgroundColor: Color + let contentColor: Color + var iconTint: Color? = nil + let shape: AnyShape = AnyShape(RoundedRectangle(cornerRadius: 4, style: .continuous)) + let elevation: CGFloat = 2 + + static let empty = ProviderStyle( + icon: nil, + backgroundColor: .white, + contentColor: .black + ) + + static var `default`: [String: ProviderStyle] { + Dictionary(uniqueKeysWithValues: AuthProvider.allCases.map { provider in + (provider.id, provider.providerStyle) + }) + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Theme/Theme.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Theme/Theme.swift new file mode 100644 index 0000000000..d0e8d78724 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Theme/Theme.swift @@ -0,0 +1,14 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/AuthMethodPickerListView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/AuthMethodPickerListView.swift new file mode 100644 index 0000000000..24d5035596 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/AuthMethodPickerListView.swift @@ -0,0 +1,73 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +struct AuthMethodPickerListView: View { + var onProviderSelected: (AuthProvider) -> Void + + var body: some View { + GeometryReader { proxy in + ScrollView { + VStack(spacing: 16) { + AuthProviderButton( + provider: .apple, + onClick: onProviderSelected + ) + AuthProviderButton( + provider: .anonymous, + onClick: onProviderSelected + ) + AuthProviderButton( + provider: .email, + onClick: onProviderSelected + ) + AuthProviderButton( + provider: .phone, + onClick: onProviderSelected + ) + AuthProviderButton( + provider: .google, + onClick: onProviderSelected + ) + AuthProviderButton( + provider: .facebook, + onClick: onProviderSelected + ) + AuthProviderButton( + provider: .twitter, + onClick: onProviderSelected + ) + AuthProviderButton( + provider: .github, + onClick: onProviderSelected + ) + AuthProviderButton( + provider: .microsoft, + onClick: onProviderSelected + ) + AuthProviderButton( + provider: .yahoo, + onClick: onProviderSelected + ) + } + .padding(.horizontal, proxy.size.width * 0.18) + } + } + } +} + +#Preview { + AuthMethodPickerListView { selectedProvider in } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AnnotatedString.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AnnotatedString.swift new file mode 100644 index 0000000000..fdec24b9a2 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AnnotatedString.swift @@ -0,0 +1,56 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +struct AnnotatedString: View { + let fullText: String + let links: [(label: String, url: String)] + + init( + fullText: String, + links: [(String, String)], + ) { + self.fullText = fullText + self.links = links + } + + var body: some View { + let text = makeAttributedText() + Text(text) + .multilineTextAlignment(.center) + .tint(.accentColor) // Use theme color + .onOpenURL { url in + // Handle URL tap (optional custom handling) + UIApplication.shared.open(url) + } + } + + private func makeAttributedText() -> AttributedString { + let template = fullText + var attributed = AttributedString(template) + + for (label, urlString) in links { + guard let range = attributed.range(of: label), + let url = URL(string: urlString) + else { continue } + + attributed[range].link = url + attributed[range].foregroundColor = UIColor.tintColor + attributed[range].underlineStyle = Text.LineStyle.single + } + + return attributed + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AuthProviderButton.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AuthProviderButton.swift new file mode 100644 index 0000000000..d28601badd --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AuthProviderButton.swift @@ -0,0 +1,83 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +struct AuthProviderButton: View { + let provider: AuthProvider + let onClick: (AuthProvider) -> Void + var enabled: Bool = true + var style: ProviderStyle? = nil + + private var resolvedStyle: ProviderStyle { + style ?? provider.providerStyle + } + + var body: some View { + let providerStyle = resolvedStyle + Button { + onClick(provider) + } label: { + HStack(spacing: 12) { + if let iconResource = providerStyle.icon { + providerIcon(for: iconResource, tint: providerStyle.iconTint) + } + Text(provider.buttonTitle) + .lineLimit(1) + .truncationMode(.tail) + .foregroundStyle(providerStyle.contentColor) + } + } + .buttonStyle(ProviderButtonStyle(style: providerStyle)) + .disabled(!enabled) + } + + @ViewBuilder + private func providerIcon(for resource: ImageResource, tint: Color?) -> some View { + if let tint { + Image(resource) + .renderingMode(.template) + .resizable() + .scaledToFit() + .frame(width: 24, height: 24) + .foregroundStyle(tint) + } else { + Image(resource) + .renderingMode(.original) + .resizable() + .scaledToFit() + .frame(width: 24, height: 24) + } + } +} + +private struct ProviderButtonStyle: PrimitiveButtonStyle { + let style: ProviderStyle + + func makeBody(configuration: Configuration) -> some View { + Button(action: configuration.trigger) { + configuration.label + .padding(.horizontal, 8) + .frame(maxWidth: .infinity, alignment: .leading) + } + .buttonStyle(.borderedProminent) + .tint(style.backgroundColor) + .shadow( + color: Color.black.opacity(0.12), + radius: Double(style.elevation), + x: 0, + y: style.elevation > 0 ? 1 : 0 + ) + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AuthTextField.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AuthTextField.swift new file mode 100644 index 0000000000..29b4f936d2 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AuthTextField.swift @@ -0,0 +1,169 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +struct FieldValidation: Identifiable, Equatable { + let id = UUID() + let message: String + var valid: Bool = false +} + +struct AuthTextField: View { + //@Environment(Theme.self) private var theme + @FocusState private var isFocused: Bool + @State var invalidInput: Bool = false + @State var obscured: Bool = true + + @Binding var text: String + let localizedTitle: String + let prompt: String + var textAlignment: TextAlignment = .leading + var keyboardType: UIKeyboardType = .default + var contentType: UITextContentType? = nil + var isSecureTextField: Bool = false + var validations: [FieldValidation] = [] + var formState: ((Bool) -> Void)? = nil + var onSubmit: ((String) -> Void)? = nil + var onChange: ((String) -> Void)? = nil + private let leading: () -> Leading? + + init( + text: Binding, + localizedTitle: String, + prompt: String, + textAlignment: TextAlignment = .leading, + keyboardType: UIKeyboardType = .default, + contentType: UITextContentType? = nil, + sensitive: Bool = false, + validations: [FieldValidation] = [], + formState: ((Bool) -> Void)? = nil, + onSubmit: ((String) -> Void)? = nil, + onChange: ((String) -> Void)? = nil, + @ViewBuilder leading: @escaping () -> Leading? = { EmptyView() } + ) { + self._text = text + self.localizedTitle = localizedTitle + self.prompt = prompt + self.textAlignment = textAlignment + self.keyboardType = keyboardType + self.contentType = contentType + self.isSecureTextField = sensitive + self.validations = validations + self.formState = formState + self.onSubmit = onSubmit + self.onChange = onChange + self.leading = leading + } + + var allRequirementsMet: Bool { + validations.allSatisfy { $0.valid == true } + } + + var body: some View { + VStack(alignment: .leading) { + Text(localizedTitle) + HStack(spacing: 8) { + leading() + Group { + if isSecureTextField { + ZStack(alignment: .trailing) { + SecureField(localizedTitle, text: $text, prompt: Text(prompt)) + .opacity(obscured ? 1 : 0) + .focused($isFocused) + .frame(height: 24) + TextField(localizedTitle, text: $text, prompt: Text(prompt)) + .opacity(obscured ? 0 : 1) + .focused($isFocused) + .frame(height: 24) + if !text.isEmpty { + Button { + withAnimation(.easeInOut(duration: 0.2)) { + obscured.toggle() + } + // Reapply focus after toggling + DispatchQueue.main.async { + isFocused = true + } + } label: { + Image(systemName: obscured ? "eye" : "eye.slash") + } + .buttonStyle(.plain) + } + } + } else { + TextField( + localizedTitle, + text: $text, + prompt: Text(prompt) + ) + .frame(height: 24) + } + } + } + .frame(maxWidth: .infinity) + .keyboardType(keyboardType) + .textContentType(contentType) + .autocapitalization(.none) + .disableAutocorrection(true) + .focused($isFocused) + .onSubmit { + onSubmit?(text) + } + .onChange(of: text) { oldValue, newValue in + onChange?(newValue) + } + .multilineTextAlignment(textAlignment) + .textFieldStyle(.plain) + .padding(.vertical, 12) + .padding(.horizontal, 12) + .background { + RoundedRectangle(cornerRadius: 8) + .fill(Color.accentColor.opacity(0.05)) + .strokeBorder(lineWidth: isFocused ? 3 : 1) + .foregroundStyle(isFocused ? Color.accentColor : Color(.systemFill)) + } + .contentShape(Rectangle()) + .onTapGesture { + withAnimation { + isFocused = true + } + } + if !validations.isEmpty { + VStack(alignment: .leading, spacing: 4) { + ForEach(validations) { validation in + HStack { + Image(systemName: isSecureTextField ? "lock.open" : "x.square") + .foregroundStyle(validation.valid ? .gray : .red) + Text(validation.message) + .strikethrough(validation.valid, color: .gray) + .foregroundStyle(.gray) + .fixedSize(horizontal: false, vertical: true) + } + } + } + .onChange(of: allRequirementsMet) { oldValue, newValue in + formState?(newValue) + if !newValue { + withAnimation(.easeInOut(duration: 0.08).repeatCount(4)) { + invalidInput = true + } completion: { + invalidInput = false + } + } + } + } + } + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailResetPasswordView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailResetPasswordView.swift new file mode 100644 index 0000000000..b0361db1a8 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailResetPasswordView.swift @@ -0,0 +1,102 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +struct EmailResetPasswordView: View { + let state: EmailAuthContentState + + var body: some View { + VStack(spacing: 32) { + VStack(spacing: 16) { + if state.resetLinkSent { + VStack(spacing: 12) { + Image(systemName: "checkmark.circle.fill") + .font(.system(size: 48)) + .foregroundStyle(.green) + + Text("Password reset link sent!") + .font(.headline) + + Text("Check your email at \(state.email.wrappedValue) for a link to reset your password.") + .font(.subheadline) + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + } + .padding() + } else { + VStack(spacing: 16) { + Text("Enter your email address and we'll send you a link to reset your password.") + .font(.subheadline) + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + + AuthTextField( + text: state.email, + localizedTitle: "Email", + prompt: "Enter your email", + keyboardType: .emailAddress, + contentType: .emailAddress + ) + + Button { + state.onSendResetLinkClick() + } label: { + if state.isLoading { + ProgressView() + .frame(height: 32) + .frame(maxWidth: .infinity) + } else { + Text("Send Reset Link") + .frame(height: 32) + .frame(maxWidth: .infinity) + } + } + .buttonStyle(.borderedProminent) + .disabled(state.isLoading) + + if let error = state.error { + Text(error) + .foregroundStyle(.red) + .font(.caption) + } + } + } + } + } + .navigationTitle("Reset Password") + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + } +} + +#Preview { + NavigationStack { + EmailResetPasswordView(state: EmailAuthContentState( + isLoading: false, + error: nil, + email: .constant(""), + password: .constant(""), + confirmPassword: .constant(""), + displayName: .constant(""), + resetLinkSent: false, + onSignInClick: {}, + onSignUpClick: {}, + onSendResetLinkClick: {}, + onGoToSignUp: {}, + onGoToSignIn: {}, + onGoToResetPassword: {} + )) + .safeAreaPadding() + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignInView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignInView.swift new file mode 100644 index 0000000000..3157d2ca5f --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignInView.swift @@ -0,0 +1,107 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI +import FirebaseAuthSwiftUI + +struct EmailSignInView: View { + let authService: AuthService + let state: EmailAuthContentState + + var body: some View { + VStack(spacing: 32) { + VStack(spacing: 16) { + Group { + AuthTextField( + text: state.email, + localizedTitle: "Email", + prompt: "Enter your email", + keyboardType: .emailAddress, + contentType: .emailAddress + ) + AuthTextField( + text: state.password, + localizedTitle: "Password", + prompt: "Enter your password", + contentType: .password, + sensitive: true + ) + } + + Button { + state.onGoToResetPassword() + } label: { + Text("Forgot password?") + .frame(maxWidth: .infinity, alignment: .trailing) + } + + Button { + state.onSignInClick() + } label: { + if state.isLoading { + ProgressView() + .frame(height: 32) + .frame(maxWidth: .infinity) + } else { + Text("Sign in") + .frame(height: 32) + .frame(maxWidth: .infinity) + } + } + .buttonStyle(.borderedProminent) + .disabled(state.isLoading) + + if let error = state.error { + Text(error) + .foregroundStyle(.red) + .font(.caption) + } + } + + Button { + state.onGoToSignUp() + } label: { + Text("Create an Account") + .frame(maxWidth: .infinity) + } + .disabled(state.isLoading) + } + .navigationTitle("Sign in with email") + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + } +} + +#Preview { + NavigationStack { + EmailSignInView( + authService: AuthService(), + state: EmailAuthContentState( + isLoading: false, + error: nil, + email: .constant(""), + password: .constant(""), + confirmPassword: .constant(""), + displayName: .constant(""), + resetLinkSent: false, + onSignInClick: {}, + onSignUpClick: {}, + onSendResetLinkClick: {}, + onGoToSignUp: {}, + onGoToSignIn: {}, + onGoToResetPassword: {} + ) + ) + .safeAreaPadding() + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignUpView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignUpView.swift new file mode 100644 index 0000000000..51e1413a09 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignUpView.swift @@ -0,0 +1,103 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +struct EmailSignUpView: View { + let state: EmailAuthContentState + + var body: some View { + VStack(spacing: 32) { + VStack(spacing: 16) { + Group { + AuthTextField( + text: state.displayName, + localizedTitle: "Display Name", + prompt: "Enter your name", + contentType: .name + ) + + AuthTextField( + text: state.email, + localizedTitle: "Email", + prompt: "Enter your email", + keyboardType: .emailAddress, + contentType: .emailAddress + ) + + AuthTextField( + text: state.password, + localizedTitle: "Password", + prompt: "Enter your password", + contentType: .newPassword, + sensitive: true + ) + + AuthTextField( + text: state.confirmPassword, + localizedTitle: "Confirm Password", + prompt: "Re-enter your password", + contentType: .newPassword, + sensitive: true + ) + } + + Button { + state.onSignUpClick() + } label: { + if state.isLoading { + ProgressView() + .frame(height: 32) + .frame(maxWidth: .infinity) + } else { + Text("Create Account") + .frame(height: 32) + .frame(maxWidth: .infinity) + } + } + .buttonStyle(.borderedProminent) + .disabled(state.isLoading) + + if let error = state.error { + Text(error) + .foregroundStyle(.red) + .font(.caption) + } + } + } + .navigationTitle("Create an account") + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + } +} + +#Preview { + NavigationStack { + EmailSignUpView(state: EmailAuthContentState( + isLoading: false, + error: nil, + email: .constant(""), + password: .constant(""), + confirmPassword: .constant(""), + displayName: .constant(""), + resetLinkSent: false, + onSignInClick: {}, + onSignUpClick: {}, + onSendResetLinkClick: {}, + onGoToSignUp: {}, + onGoToSignIn: {}, + onGoToResetPassword: {} + )) + .safeAreaPadding() + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthView.swift new file mode 100644 index 0000000000..2c353095b2 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthView.swift @@ -0,0 +1,45 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +public struct FirebaseAuthView: View { + public init( + authService: AuthService, + isPresented: Binding = .constant(false), + interactiveDismissDisabled: Bool = true, + @ViewBuilder content: @escaping () -> Content = { EmptyView() } + ) { + self.authService = authService + self.isPresented = isPresented + self.interactiveDismissDisabled = interactiveDismissDisabled + self.content = content + } + + private var authService: AuthService + private var isPresented: Binding + private var interactiveDismissDisabled: Bool + private let content: () -> Content? + + + public var body: some View { + content() + .sheet(isPresented: isPresented) { + FirebaseAuthViewInternal( + authService: authService, + interactiveDismissDisabled: interactiveDismissDisabled + ) + } + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthViewInternal.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthViewInternal.swift new file mode 100644 index 0000000000..b62d3900ab --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthViewInternal.swift @@ -0,0 +1,321 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +struct StringError: LocalizedError { + let message: String + + var errorDescription: String? { message } +} + +enum Route: Hashable { + case emailAuth(EmailAuthMode) + case phoneAuth(PhoneAuthStep) + + @ViewBuilder + @MainActor + func destination( + authService: AuthService, + emailAuthState: EmailAuthContentState, + phoneAuthState: PhoneAuthContentState + ) -> some View { + switch self { + case .emailAuth(let mode): + switch mode { + case .signIn: + EmailSignInView( + authService: authService, + state: emailAuthState + ) + .safeAreaPadding() + case .signUp: + EmailSignUpView(state: emailAuthState) + .safeAreaPadding() + case .resetPassword: + EmailResetPasswordView(state: emailAuthState) + .safeAreaPadding() + } + case .phoneAuth(let step): + switch step { + case .enterPhoneNumber: + EnterPhoneNumberView(state: phoneAuthState) + .safeAreaPadding() + case .enterVerificationCode: + EnterVerificationCodeView(state: phoneAuthState) + .safeAreaPadding() + } + } + } +} + +enum EmailAuthMode { + case signIn + case signUp + case resetPassword +} + +enum PhoneAuthStep { + case enterPhoneNumber + case enterVerificationCode +} + +struct CountryData { + let name: String + let dialCode: String + let code: String + + var flag: String { + // Convert country code to flag emoji + let base: UInt32 = 127397 + var emoji = "" + for scalar in code.unicodeScalars { + if let unicodeScalar = UnicodeScalar(base + scalar.value) { + emoji.append(String(unicodeScalar)) + } + } + return emoji + } + + static let `default` = CountryData(name: "United States", dialCode: "+1", code: "US") +} + +struct EmailAuthContentState { + var isLoading: Bool + var error: String? + var email: Binding + var password: Binding + var confirmPassword: Binding + var displayName: Binding + var resetLinkSent: Bool + var onSignInClick: () -> Void + var onSignUpClick: () -> Void + var onSendResetLinkClick: () -> Void + var onGoToSignUp: () -> Void + var onGoToSignIn: () -> Void + var onGoToResetPassword: () -> Void +} + +struct PhoneAuthContentState { + var isLoading: Bool + var error: String? + var phoneNumber: Binding + var selectedCountry: Binding + var verificationCode: Binding + var fullPhoneNumber: String + var resendTimer: Int + var onSendCodeClick: () -> Void + var onVerifyCodeClick: () -> Void + var onResendCodeClick: () -> Void + var onChangeNumberClick: () -> Void +} + +@Observable +class Navigator { + var routes: [Route] = [] + + func push(_ route: Route) { + routes.append(route) + } + + @discardableResult + func pop() -> Route? { + routes.popLast() + } +} + +struct FirebaseAuthViewInternal: View { + init( + authService: AuthService, + interactiveDismissDisabled: Bool = true + ) { + self.authService = authService + self.interactiveDismissDisabled = interactiveDismissDisabled + } + + private var authService: AuthService + private var interactiveDismissDisabled: Bool + @State private var navigator = Navigator() + + // Email Auth State + @State private var email = "" + @State private var password = "" + @State private var confirmPassword = "" + @State private var displayName = "" + @State private var emailError: String? + @State private var resetLinkSent = false + + // Phone Auth State + @State private var phoneNumber = "" + @State private var verificationCode = "" + @State private var selectedCountry: CountryData = .default + @State private var phoneIsLoading = false + @State private var phoneError: String? + @State private var resendTimer = 0 + + @State private var isShowingErrorAlert = false + + var body: some View { + NavigationStack(path: $navigator.routes) { + authMethodPicker + .navigationTitle("Authentication") + .navigationBarTitleDisplayMode(.large) + .navigationDestination(for: Route.self) { route in + route.destination( + authService: authService, + emailAuthState: createEmailAuthState(), + phoneAuthState: createPhoneAuthState() + ) + } + } + .alert( + isPresented: $isShowingErrorAlert, + error: StringError(message: authService.currentError?.message ?? "") + ) { + Button("OK") { + isShowingErrorAlert = false + } + } + .onChange(of: authService.currentError?.message ?? "") { _, newValue in + debugPrint("onChange: \(newValue)") + isShowingErrorAlert = !newValue.isEmpty + } + .interactiveDismissDisabled(interactiveDismissDisabled) + } + + @ViewBuilder + var authMethodPicker: some View { + VStack { + Image(.firebaseAuthLogo) + AuthMethodPickerListView { selectedProvider in + switch selectedProvider { + case .email: + navigator.push(.emailAuth(.signIn)) + case .phone: + navigator.push(.phoneAuth(.enterPhoneNumber)) + default: + break + } + } + .padding(.vertical, 16) + tosAndPPFooter + .padding(.horizontal, 16) + } + .padding(.top, 24) + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + + @ViewBuilder + var tosAndPPFooter: some View { + AnnotatedString( + fullText: "By continuing, you accept our Terms of Service and Privacy Policy.", + links: [ + ("Terms of Service", "https://example.com/terms"), + ("Privacy Policy", "https://example.com/privacy") + ] + ) + } + + // MARK: - State Creation + + private func createEmailAuthState() -> EmailAuthContentState { + EmailAuthContentState( + isLoading: authService.authenticationState == .authenticating, + error: emailError, + email: $email, + password: $password, + confirmPassword: $confirmPassword, + displayName: $displayName, + resetLinkSent: resetLinkSent, + onSignInClick: handleEmailSignIn, + onSignUpClick: handleEmailSignUp, + onSendResetLinkClick: handleSendResetLink, + onGoToSignUp: { + handleEmailAuthNavigation(route: .emailAuth(.signUp)) + }, + onGoToSignIn: { + handleEmailAuthNavigation(route: .emailAuth(.signIn)) + }, + onGoToResetPassword: { + handleEmailAuthNavigation(route: .emailAuth(.resetPassword)) + } + ) + } + + private func createPhoneAuthState() -> PhoneAuthContentState { + PhoneAuthContentState( + isLoading: authService.authenticationState == .authenticating, + error: phoneError, + phoneNumber: $phoneNumber, + selectedCountry: $selectedCountry, + verificationCode: $verificationCode, + fullPhoneNumber: "\(selectedCountry.dialCode)\(phoneNumber)", + resendTimer: resendTimer, + onSendCodeClick: handleSendCode, + onVerifyCodeClick: handleVerifyCode, + onResendCodeClick: handleResendCode, + onChangeNumberClick: { + verificationCode = "" + navigator.pop() + } + ) + } + + // MARK: - Email Auth Handlers + + private func handleEmailAuthNavigation(route: Route) { + email = "" + password = "" + confirmPassword = "" + displayName = "" + navigator.push(route) + } + + private func handleEmailSignIn() { + Task { + try? await authService.signIn(email: email, password: password) + } + } + + private func handleEmailSignUp() { + Task { + try? await authService.createUser(email: email, password: password) + } + } + + private func handleSendResetLink() { + Task { + try? await authService.sendPasswordRecoveryEmail(email: email) + } + } + + // MARK: - Phone Auth Handlers + + private func handleSendCode() { + // TODO: Implement send code logic + navigator.push(.phoneAuth(.enterVerificationCode)) + } + + private func handleVerifyCode() { + // TODO: Implement verify code logic + } + + private func handleResendCode() { + // TODO: Implement resend code logic + } +} + +#Preview { + FirebaseAuthViewInternal(authService: AuthService()) +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/CountrySelector.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/CountrySelector.swift new file mode 100644 index 0000000000..77a00f5f63 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/CountrySelector.swift @@ -0,0 +1,77 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +struct CountrySelector: View { + @Binding var selectedCountry: CountryData + var enabled: Bool = true + var allowedCountries: Set? = nil + + // Common countries list + private let allCountries: [CountryData] = [ + CountryData(name: "United States", dialCode: "+1", code: "US"), + CountryData(name: "United Kingdom", dialCode: "+44", code: "GB"), + CountryData(name: "Canada", dialCode: "+1", code: "CA"), + CountryData(name: "Australia", dialCode: "+61", code: "AU"), + CountryData(name: "Germany", dialCode: "+49", code: "DE"), + CountryData(name: "France", dialCode: "+33", code: "FR"), + CountryData(name: "India", dialCode: "+91", code: "IN"), + CountryData(name: "Nigeria", dialCode: "+234", code: "NG"), + CountryData(name: "South Africa", dialCode: "+27", code: "ZA"), + CountryData(name: "Japan", dialCode: "+81", code: "JP"), + CountryData(name: "China", dialCode: "+86", code: "CN"), + CountryData(name: "Brazil", dialCode: "+55", code: "BR"), + CountryData(name: "Mexico", dialCode: "+52", code: "MX"), + CountryData(name: "Spain", dialCode: "+34", code: "ES"), + CountryData(name: "Italy", dialCode: "+39", code: "IT"), + ] + + private var filteredCountries: [CountryData] { + if let allowedCountries = allowedCountries { + return allCountries.filter { allowedCountries.contains($0.code) } + } + return allCountries + } + + var body: some View { + Menu { + ForEach(filteredCountries, id: \.code) { country in + Button { + selectedCountry = country + } label: { + Text("\(country.flag) \(country.name) (\(country.dialCode))") + } + } + } label: { + HStack(spacing: 4) { + Text(selectedCountry.flag) + .font(.title3) + Text(selectedCountry.dialCode) + .font(.body) + .foregroundStyle(.primary) + Image(systemName: "chevron.down") + .font(.caption2) + .foregroundStyle(.secondary) + } + } + .disabled(!enabled) + } +} + +#Preview { + CountrySelector( + selectedCountry: .constant(.default) + ) +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterPhoneNumberView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterPhoneNumberView.swift new file mode 100644 index 0000000000..98a300a154 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterPhoneNumberView.swift @@ -0,0 +1,87 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +struct EnterPhoneNumberView: View { + let state: PhoneAuthContentState + + var body: some View { + VStack(spacing: 16) { + Text("Enter your phone number to get started") + .font(.subheadline) + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + .frame(maxWidth: .infinity, alignment: .leading) + + // Phone number input with country selector + AuthTextField( + text: state.phoneNumber, + localizedTitle: "Phone Number", + prompt: "Enter your phone number", + keyboardType: .phonePad, + contentType: .telephoneNumber, + onChange: { _ in } + ) { + CountrySelector( + selectedCountry: state.selectedCountry, + enabled: !state.isLoading + ) + } + + Button { + state.onSendCodeClick() + } label: { + if state.isLoading { + ProgressView() + .frame(height: 32) + .frame(maxWidth: .infinity) + } else { + Text("Send Code") + .frame(height: 32) + .frame(maxWidth: .infinity) + } + } + .buttonStyle(.borderedProminent) + .disabled(state.isLoading || state.phoneNumber.wrappedValue.isEmpty) + + if let error = state.error { + Text(error) + .foregroundStyle(.red) + .font(.caption) + } + } + .navigationTitle("Sign in with phone") + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + } +} + +#Preview { + NavigationStack { + EnterPhoneNumberView(state: PhoneAuthContentState( + isLoading: false, + error: nil, + phoneNumber: .constant(""), + selectedCountry: .constant(.default), + verificationCode: .constant(""), + fullPhoneNumber: "+1 ", + resendTimer: 0, + onSendCodeClick: {}, + onVerifyCodeClick: {}, + onResendCodeClick: {}, + onChangeNumberClick: {} + )) + .safeAreaPadding() + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterVerificationCodeView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterVerificationCodeView.swift new file mode 100644 index 0000000000..59d20290a7 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterVerificationCodeView.swift @@ -0,0 +1,103 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +struct EnterVerificationCodeView: View { + let state: PhoneAuthContentState + + var body: some View { + VStack(spacing: 32) { + VStack(spacing: 16) { + VStack(spacing: 8) { + Text("We sent a code to \(state.fullPhoneNumber)") + .font(.subheadline) + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + .frame(maxWidth: .infinity, alignment: .leading) + Button { + state.onChangeNumberClick() + } label: { + Text("Change number") + .font(.caption) + .frame(maxWidth: .infinity, alignment: .leading) + } + } + .padding(.bottom) + .frame(maxWidth: .infinity, alignment: .leading) + + // Verification code input + VerificationCodeInputField( + code: state.verificationCode, + isError: state.error != nil, + errorMessage: state.error + ) + + Button { + state.onVerifyCodeClick() + } label: { + if state.isLoading { + ProgressView() + .frame(height: 32) + .frame(maxWidth: .infinity) + } else { + Text("Verify Code") + .frame(height: 32) + .frame(maxWidth: .infinity) + } + } + .buttonStyle(.borderedProminent) + .disabled(state.isLoading || state.verificationCode.wrappedValue.count != 6) + } + + // Resend code section + VStack(spacing: 8) { + if state.resendTimer > 0 { + Text("Resend code in \(state.resendTimer)s") + .font(.caption) + .foregroundStyle(.secondary) + } else { + Button { + state.onResendCodeClick() + } label: { + Text("Resend Code") + .font(.caption) + } + .disabled(state.isLoading) + } + } + } + .navigationTitle("Verify Phone Number") + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + } +} + +#Preview { + NavigationStack { + EnterVerificationCodeView(state: PhoneAuthContentState( + isLoading: false, + error: nil, + phoneNumber: .constant(""), + selectedCountry: .constant(.default), + verificationCode: .constant(""), + fullPhoneNumber: "+1 5551234567", + resendTimer: 0, + onSendCodeClick: {}, + onVerifyCodeClick: {}, + onResendCodeClick: {}, + onChangeNumberClick: {} + )) + .safeAreaPadding() + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/VerificationCodeInputField.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/VerificationCodeInputField.swift new file mode 100644 index 0000000000..ae795e4018 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/VerificationCodeInputField.swift @@ -0,0 +1,555 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI +import UIKit + +struct VerificationCodeInputField: View { + init( + code: Binding, + codeLength: Int = 6, + isError: Bool = false, + errorMessage: String? = nil, + onCodeComplete: @escaping (String) -> Void = { _ in }, + onCodeChange: @escaping (String) -> Void = { _ in } + ) { + self._code = code + self.codeLength = codeLength + self.isError = isError + self.errorMessage = errorMessage + self.onCodeComplete = onCodeComplete + self.onCodeChange = onCodeChange + self._digitFields = State(initialValue: Array(repeating: "", count: codeLength)) + } + + @Binding var code: String + let codeLength: Int + let isError: Bool + let errorMessage: String? + let onCodeComplete: (String) -> Void + let onCodeChange: (String) -> Void + + @State private var digitFields: [String] = [] + @State private var focusedIndex: Int? = nil + @State private var pendingInternalCodeUpdates = 0 + + var body: some View { + VStack(spacing: 8) { + HStack(spacing: 8) { + ForEach(0.. 0 { + pendingInternalCodeUpdates -= 1 + return + } + updateDigitFieldsFromCode(shouldUpdateFocus: true) + } + } + + private func updateDigitFieldsFromCode(shouldUpdateFocus: Bool, forceFocus: Bool = false) { + let sanitized = code.filter { $0.isNumber } + let truncated = String(sanitized.prefix(codeLength)) + var newFields = Array(repeating: "", count: codeLength) + + for (offset, character) in truncated.enumerated() { + newFields[offset] = String(character) + } + + let fieldsChanged = newFields != digitFields + if fieldsChanged { + digitFields = newFields + } + + if code != truncated { + commitCodeChange(truncated) + } + + if shouldUpdateFocus && (fieldsChanged || forceFocus) { + let newFocus = truncated.count < codeLength ? truncated.count : nil + DispatchQueue.main.async { + withAnimation(.easeInOut(duration: 0.2)) { + focusedIndex = newFocus + } + } + } + + if fieldsChanged && truncated.count == codeLength { + DispatchQueue.main.async { + onCodeComplete(truncated) + } + } + } + + private func commitCodeChange(_ newCode: String) { + if code != newCode { + pendingInternalCodeUpdates += 1 + code = newCode + } + } + + private func handleDigitChanged(at index: Int, newDigit: String) { + let sanitized = newDigit.filter { $0.isNumber } + + guard !sanitized.isEmpty else { + processSingleDigitInput(at: index, digit: "") + return + } + + let firstDigit = String(sanitized.prefix(1)) + processSingleDigitInput(at: index, digit: firstDigit) + + let remainder = String(sanitized.dropFirst()) + let availableSlots = max(codeLength - (index + 1), 0) + if availableSlots > 0 { + let trimmedRemainder = String(remainder.prefix(availableSlots)) + if !trimmedRemainder.isEmpty { + applyBulkInput(startingAt: index + 1, digits: trimmedRemainder) + } + } + } + + private func processSingleDigitInput(at index: Int, digit: String) { + if digitFields[index] != digit { + digitFields[index] = digit + } + + let newCode = digitFields.joined() + commitCodeChange(newCode) + onCodeChange(newCode) + + if !digit.isEmpty, + let nextIndex = findNextEmptyField(startingFrom: index) { + DispatchQueue.main.async { + if focusedIndex != nextIndex { + withAnimation(.easeInOut(duration: 0.2)) { + focusedIndex = nextIndex + } + } + } + } + + if newCode.count == codeLength { + DispatchQueue.main.async { + onCodeComplete(newCode) + } + } + } + + + private func handleBackspace(at index: Int) { + // If current field is empty, move to previous field and clear it + if digitFields[index].isEmpty && index > 0 { + digitFields[index - 1] = "" + DispatchQueue.main.async { + let previousIndex = index - 1 + if focusedIndex != previousIndex { + withAnimation(.easeInOut(duration: 0.2)) { + focusedIndex = previousIndex + } + } + } + } else { + // Clear current field + digitFields[index] = "" + } + + // Update the main code string + let newCode = digitFields.joined() + commitCodeChange(newCode) + onCodeChange(newCode) + } + + private func applyBulkInput(startingAt index: Int, digits: String) { + guard !digits.isEmpty, index < codeLength else { return } + + var updatedFields = digitFields + var currentIndex = index + + for digit in digits where currentIndex < codeLength { + updatedFields[currentIndex] = String(digit) + currentIndex += 1 + } + + if digitFields != updatedFields { + digitFields = updatedFields + } + + let newCode = updatedFields.joined() + commitCodeChange(newCode) + onCodeChange(newCode) + + if newCode.count == codeLength { + DispatchQueue.main.async { + onCodeComplete(newCode) + } + } else { + let clampedIndex = max(min(currentIndex - 1, codeLength - 1), 0) + if let nextIndex = findNextEmptyField(startingFrom: clampedIndex) { + DispatchQueue.main.async { + if focusedIndex != nextIndex { + withAnimation(.easeInOut(duration: 0.2)) { + focusedIndex = nextIndex + } + } + } + } + } + } + + private func findNextEmptyField(startingFrom index: Int) -> Int? { + // Look for the next empty field after the current index + for i in (index + 1).. Void + let onBackspace: () -> Void + let onFocusChanged: (Bool) -> Void + + private var borderWidth: CGFloat { + if isError { return 2 } + if isFocused || !digit.isEmpty { return 3 } + return 1 + } + + private var borderColor: Color { + if isError { return .red } + if isFocused || !digit.isEmpty { return .accentColor } + return Color(.systemFill) + } + + var body: some View { + BackspaceAwareTextField( + text: $digit, + isFirstResponder: isFocused, + onDeleteBackwardWhenEmpty: { + if digit.isEmpty { + onBackspace() + } else { + digit = "" + } + }, + onFocusChanged: { isFocused in + onFocusChanged(isFocused) + }, + maxCharacters: maxDigits, + configuration: { textField in + textField.font = .systemFont(ofSize: 24, weight: .medium) + textField.textAlignment = .center + textField.keyboardType = .numberPad + textField.textContentType = .oneTimeCode + textField.autocapitalizationType = .none + textField.autocorrectionType = .no + }, + onTextChange: { newValue in + onDigitChanged(newValue) + } + ) + .frame(width: 48, height: 48) + .background( + RoundedRectangle(cornerRadius: 8) + .fill(Color.accentColor.opacity(0.05)) + .overlay( + RoundedRectangle(cornerRadius: 8) + .stroke(borderColor, lineWidth: borderWidth) + ) + ) + .frame(maxWidth: .infinity) + .accessibilityElement(children: .ignore) + .accessibilityLabel("Digit \(position) of \(totalDigits)") + .accessibilityValue(digit.isEmpty ? "Empty" : digit) + .accessibilityHint("Enter verification code digit") + .animation(.easeInOut(duration: 0.2), value: isFocused) + .animation(.easeInOut(duration: 0.2), value: digit) + } +} + +private struct BackspaceAwareTextField: UIViewRepresentable { + @Binding var text: String + var isFirstResponder: Bool + let onDeleteBackwardWhenEmpty: () -> Void + let onFocusChanged: (Bool) -> Void + let maxCharacters: Int + let configuration: (UITextField) -> Void + let onTextChange: (String) -> Void + + func makeUIView(context: Context) -> BackspaceUITextField { + context.coordinator.parent = self + let textField = BackspaceUITextField() + textField.delegate = context.coordinator + textField.addTarget( + context.coordinator, + action: #selector(Coordinator.editingChanged(_:)), + for: .editingChanged + ) + configuration(textField) + textField.onDeleteBackward = { [weak textField] in + guard let textField else { return } + if (textField.text ?? "").isEmpty { + onDeleteBackwardWhenEmpty() + } + } + return textField + } + + func updateUIView(_ uiView: BackspaceUITextField, context: Context) { + context.coordinator.parent = self + if uiView.text != text { + uiView.text = text + } + + uiView.onDeleteBackward = { [weak uiView] in + guard let uiView else { return } + if (uiView.text ?? "").isEmpty { + onDeleteBackwardWhenEmpty() + } + } + + if isFirstResponder { + if !context.coordinator.isFirstResponder { + context.coordinator.isFirstResponder = true + DispatchQueue.main.async { [weak uiView] in + guard let uiView, !uiView.isFirstResponder else { return } + uiView.becomeFirstResponder() + } + } + } else if context.coordinator.isFirstResponder { + context.coordinator.isFirstResponder = false + } + } + + func makeCoordinator() -> Coordinator { + Coordinator(parent: self) + } + + final class Coordinator: NSObject, UITextFieldDelegate { + var parent: BackspaceAwareTextField + var isFirstResponder = false + + init(parent: BackspaceAwareTextField) { + self.parent = parent + } + + @objc func editingChanged(_ sender: UITextField) { + let updatedText = sender.text ?? "" + parent.text = updatedText + parent.onTextChange(updatedText) + } + + func textFieldDidBeginEditing(_ textField: UITextField) { + isFirstResponder = true + animateFocusChange(for: textField, focused: true) + parent.onFocusChanged(true) + } + + func textFieldDidEndEditing(_ textField: UITextField) { + isFirstResponder = false + animateFocusChange(for: textField, focused: false) + parent.onFocusChanged(false) + } + + private func animateFocusChange(for textField: UITextField, focused: Bool) { + let targetTransform: CGAffineTransform = focused ? CGAffineTransform(scaleX: 1.05, y: 1.05) : .identity + UIView.animate( + withDuration: 0.2, + delay: 0, + options: [.curveEaseInOut, .allowUserInteraction] + ) { + textField.transform = targetTransform + } + } + + func textField( + _ textField: UITextField, + shouldChangeCharactersIn range: NSRange, + replacementString string: String + ) -> Bool { + if string.isEmpty { + return true + } + + let digitsOnly = string.filter { $0.isNumber } + guard !digitsOnly.isEmpty else { + return false + } + + let currentText = textField.text ?? "" + let nsCurrent = currentText as NSString + + if digitsOnly.count > 1 || string.count > 1 { + let limit = max(parent.maxCharacters, 1) + let truncated = String(digitsOnly.prefix(limit)) + let proposed = nsCurrent.replacingCharacters(in: range, with: truncated) + parent.onTextChange(String(proposed.prefix(limit))) + return false + } + + let updated = nsCurrent.replacingCharacters(in: range, with: digitsOnly) + return updated.count <= 1 + } + } +} + +private final class BackspaceUITextField: UITextField { + var onDeleteBackward: (() -> Void)? + + override func deleteBackward() { + let wasEmpty = (text ?? "").isEmpty + super.deleteBackward() + if wasEmpty { + onDeleteBackward?() + } + } +} + +// MARK: - Preview + +#Preview("Normal State") { + @Previewable @State var code = "" + + return VStack(spacing: 32) { + Text("Enter Verification Code") + .font(.title2) + .fontWeight(.semibold) + + VerificationCodeInputField( + code: $code, + onCodeComplete: { completedCode in + print("Code completed: \(completedCode)") + }, + onCodeChange: { newCode in + print("Code changed: \(newCode)") + } + ) + + Text("Current code: \(code)") + .font(.caption) + .foregroundColor(.secondary) + } + .padding() +} + +#Preview("Error State") { + @Previewable @State var code = "12345" + + return VStack(spacing: 32) { + Text("Enter Verification Code") + .font(.title2) + .fontWeight(.semibold) + + VerificationCodeInputField( + code: $code, + isError: true, + errorMessage: "Invalid verification code", + onCodeComplete: { completedCode in + print("Code completed: \(completedCode)") + }, + onCodeChange: { newCode in + print("Code changed: \(newCode)") + } + ) + + Text("Current code: \(code)") + .font(.caption) + .foregroundColor(.secondary) + } + .padding() +} + +#Preview("Custom Length") { + @Previewable @State var code = "" + + return VStack(spacing: 32) { + Text("Enter 4-Digit Code") + .font(.title2) + .fontWeight(.semibold) + + VerificationCodeInputField( + code: $code, + codeLength: 4, + onCodeComplete: { completedCode in + print("Code completed: \(completedCode)") + }, + onCodeChange: { newCode in + print("Code changed: \(newCode)") + } + ) + + Text("Current code: \(code)") + .font(.caption) + .foregroundColor(.secondary) + } + .padding() +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings index a9b077b883..ef52e93e9f 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings @@ -3,6 +3,22 @@ "strings" : { "%@" : { + }, + "%@ %@ (%@)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@ %2$@ (%3$@)" + } + } + } + }, + "β€’β€’β€’β€’β€’β€’%@" : { + + }, + "Account: %@" : { + }, "AccountDisabledError" : { "comment" : "Error message displayed when the account is disabled. Use short/abbreviated translation for 'email' which is less than 15 chars.", @@ -27,6 +43,12 @@ } } } + }, + "Add an extra layer of security to your account" : { + + }, + "Add Another Method" : { + }, "AddPasswordAlertMessage" : { "comment" : "Alert message shown when adding account password.", @@ -162,6 +184,18 @@ } } } + }, + "as:" : { + + }, + "Authentication" : { + + }, + "Authentication Method" : { + + }, + "Authenticator App" : { + }, "AuthPickerTitle" : { "comment" : "Title for auth picker screen.", @@ -213,6 +247,18 @@ } } } + }, + "Change number" : { + + }, + "Check your email at %@ for a link to reset your password." : { + + }, + "Choose Authentication Method" : { + + }, + "Choose verification method:" : { + }, "ChoosePassword" : { "comment" : "Placeholder for the password text field in a sign up form.", @@ -237,6 +283,15 @@ } } } + }, + "Complete Setup" : { + + }, + "Complete Sign-In" : { + + }, + "Complete sign-in with your second factor" : { + }, "ConfirmEmail" : { "comment" : "Title of confirm email label.", @@ -261,6 +316,18 @@ } } } + }, + "Copied to clipboard!" : { + + }, + "Create Account" : { + + }, + "Create an account" : { + + }, + "Create an Account" : { + }, "Delete" : { "comment" : "Text of Delete action button.", @@ -321,6 +388,19 @@ } } } + }, + "Digit %lld of %lld" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Digit %1$lld of %2$lld" + } + } + } + }, + "Display Name" : { + }, "Don't have an account yet?" : { "localizations" : { @@ -439,6 +519,36 @@ } } } + }, + "Enrolled Methods" : { + + }, + "Enrolled: %@" : { + + }, + "Enter 6-digit code" : { + + }, + "Enter Code from App" : { + + }, + "Enter the 6-digit code from your authenticator app" : { + + }, + "Enter Verification Code" : { + + }, + "Enter verification code digit" : { + + }, + "Enter your email address and we'll send you a link to reset your password." : { + + }, + "Enter Your Phone Number" : { + + }, + "Enter your phone number to get started" : { + }, "EnterYourEmail" : { "comment" : "Title for email entry screen, email text field placeholder. Use short/abbreviated translation for 'email' which is less than 15 chars.", @@ -499,6 +609,9 @@ } } } + }, + "Forgot password?" : { + }, "ForgotPassword" : { "comment" : "Button text for 'Forgot Password' action.", @@ -523,6 +636,9 @@ } } } + }, + "Get Started" : { + }, "InvalidEmailError" : { "comment" : "Error message displayed when user enters an invalid email address. Use short/abbreviated translation for 'email' which is less than 15 chars.", @@ -557,6 +673,21 @@ } } } + }, + "Manage Two-Factor Authentication" : { + + }, + "Manage your authentication methods" : { + + }, + "Manual Entry Key:" : { + + }, + "MFA is not enabled in the current configuration. Please contact your administrator." : { + + }, + "Multi-Factor Authentication Disabled" : { + }, "Name" : { "comment" : "Label next to a name text field.", @@ -581,6 +712,15 @@ } } } + }, + "No Authentication Methods" : { + + }, + "No Authentication Methods Available" : { + + }, + "No MFA methods are configured as allowed. Please contact your administrator." : { + }, "OK" : { "comment" : "OK button title.", @@ -593,6 +733,9 @@ } } } + }, + "Password reset link sent!" : { + }, "PasswordRecoveryEmailSentMessage" : { "comment" : "Message displayed when the email for password recovery has been sent.", @@ -653,6 +796,9 @@ } } } + }, + "Phone Number" : { + }, "PlaceholderChosePassword" : { "comment" : "Placeholder of secret input cell when user changes password.", @@ -797,6 +943,9 @@ } } } + }, + "Remove" : { + }, "Resend" : { "comment" : "Resend button title.", @@ -809,6 +958,15 @@ } } } + }, + "Resend Code" : { + + }, + "Resend code in %llds" : { + + }, + "Reset Password" : { + }, "Save" : { "comment" : "Save button title.", @@ -821,6 +979,12 @@ } } } + }, + "Scan QR Code" : { + + }, + "Scan with your authenticator app or tap to open directly" : { + }, "Send" : { "comment" : "Send button title.", @@ -833,6 +997,12 @@ } } } + }, + "Send Code" : { + + }, + "Send Reset Link" : { + }, "SendEmailSignInLinkButtonLabel" : { "comment" : "Button label for sending email sign-in link", @@ -845,6 +1015,21 @@ } } } + }, + "Set Up Two-Factor Authentication" : { + + }, + "Set up two-factor authentication to add an extra layer of security to your account." : { + + }, + "Sign in" : { + + }, + "Sign in with email" : { + + }, + "Sign in with phone" : { + }, "Sign up" : { @@ -944,6 +1129,18 @@ } } } + }, + "SMS Authentication" : { + + }, + "SMS Verification" : { + + }, + "SMS: %@" : { + + }, + "Tap to open in authenticator app" : { + }, "TermsOfService" : { "comment" : "Text linked to a web page with the Terms of Service content.", @@ -992,6 +1189,12 @@ } } } + }, + "Two-Factor Authentication" : { + + }, + "Unable to generate QR Code" : { + }, "UnlinkAction" : { "comment" : "Button title for unlinking account action.", @@ -1087,6 +1290,9 @@ } } } + }, + "Use an authenticator app like Google Authenticator or Authy to generate verification codes." : { + }, "UserNotFoundError" : { "comment" : "Error message displayed when there's no account matching the email address. Use short/abbreviated translation for 'email' which is less than 15 chars.", @@ -1099,6 +1305,12 @@ } } } + }, + "Verification Code" : { + + }, + "Verify Code" : { + }, "Verify email address?" : { "comment" : "Label for sending email verification to user.", @@ -1110,6 +1322,9 @@ } } } + }, + "Verify Phone Number" : { + }, "VerifyItsYou" : { "comment" : "Alert message title show for re-authorization.", @@ -1122,6 +1337,21 @@ } } } + }, + "We sent a code to %@" : { + + }, + "We'll send a code to β€’β€’β€’β€’β€’β€’%@" : { + + }, + "We'll send a verification code to this number" : { + + }, + "We'll send a verification code to your phone" : { + + }, + "We'll send a verification code to your phone number each time you sign in." : { + }, "WeakPasswordError" : { "comment" : "Error message displayed when the password is too weak.", diff --git a/samples/swift/FirebaseUI-demo-swift.xcodeproj/project.pbxproj b/samples/swift/FirebaseUI-demo-swift.xcodeproj/project.pbxproj index dabd26609d..d236027bae 100644 --- a/samples/swift/FirebaseUI-demo-swift.xcodeproj/project.pbxproj +++ b/samples/swift/FirebaseUI-demo-swift.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 4617B75BF5701E48387F35F6 /* Pods_FirebaseUI_demo_swift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 25F197CFBB06559F4B537E37 /* Pods_FirebaseUI_demo_swift.framework */; }; + 6096FEF87E5B53C0792BC146 /* Pods_FirebaseUI_demo_swiftTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 637019691D9C301621749DE1 /* Pods_FirebaseUI_demo_swiftTests.framework */; }; 89B2924722568B1C00CEF7D7 /* twtrsymbol.png in Resources */ = {isa = PBXBuildFile; fileRef = 89B2924622568B1C00CEF7D7 /* twtrsymbol.png */; }; 8D5F93B01D9B192D00D5A2E4 /* StorageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D5F93AF1D9B192D00D5A2E4 /* StorageViewController.swift */; }; 8DABC9891D3D82D600453807 /* FUIAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DABC9881D3D82D600453807 /* FUIAppDelegate.swift */; }; @@ -49,6 +51,9 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 25F197CFBB06559F4B537E37 /* Pods_FirebaseUI_demo_swift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_FirebaseUI_demo_swift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 637019691D9C301621749DE1 /* Pods_FirebaseUI_demo_swiftTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_FirebaseUI_demo_swiftTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6F5993EFB11CBA0003C0DE94 /* Pods-FirebaseUI-demo-swiftTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FirebaseUI-demo-swiftTests.release.xcconfig"; path = "Target Support Files/Pods-FirebaseUI-demo-swiftTests/Pods-FirebaseUI-demo-swiftTests.release.xcconfig"; sourceTree = ""; }; 89B2924622568B1C00CEF7D7 /* twtrsymbol.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = twtrsymbol.png; sourceTree = ""; }; 8D5F93AF1D9B192D00D5A2E4 /* StorageViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StorageViewController.swift; sourceTree = ""; }; 8DABC9851D3D82D600453807 /* FirebaseUI-demo-swift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "FirebaseUI-demo-swift.app"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -59,6 +64,8 @@ 8DABC99D1D3D82D600453807 /* FirebaseUI-demo-swiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FirebaseUI-demo-swiftTests.swift"; sourceTree = ""; }; 8DABC99F1D3D82D600453807 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8DD51E361D873B0D00E2CA51 /* UIStoryboardExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIStoryboardExtension.swift; sourceTree = ""; }; + 8E009A2D4461F77B9CEB0C4D /* Pods-FirebaseUI-demo-swiftTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FirebaseUI-demo-swiftTests.debug.xcconfig"; path = "Target Support Files/Pods-FirebaseUI-demo-swiftTests/Pods-FirebaseUI-demo-swiftTests.debug.xcconfig"; sourceTree = ""; }; + A885F4D8D84B72ADACBE725B /* Pods-FirebaseUI-demo-swift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FirebaseUI-demo-swift.release.xcconfig"; path = "Target Support Files/Pods-FirebaseUI-demo-swift/Pods-FirebaseUI-demo-swift.release.xcconfig"; sourceTree = ""; }; C302C1D51D91CC7B00ADBD41 /* FUIAuthViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FUIAuthViewController.swift; sourceTree = ""; }; C302C1D71D91CC7B00ADBD41 /* ChatCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatCollectionViewCell.swift; sourceTree = ""; }; C302C1D81D91CC7B00ADBD41 /* ChatViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatViewController.swift; sourceTree = ""; }; @@ -166,6 +173,7 @@ C39BC04F1DB812330060F6AF /* FUICustomPasswordVerificationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FUICustomPasswordVerificationViewController.swift; sourceTree = ""; }; C39BC0501DB812330060F6AF /* FUICustomPasswordVerificationViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FUICustomPasswordVerificationViewController.xib; sourceTree = ""; }; C3F23ECC1D80F3300020509F /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + DB206ACE5B8C8DC3A2E47E00 /* Pods-FirebaseUI-demo-swift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FirebaseUI-demo-swift.debug.xcconfig"; path = "Target Support Files/Pods-FirebaseUI-demo-swift/Pods-FirebaseUI-demo-swift.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -173,6 +181,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 4617B75BF5701E48387F35F6 /* Pods_FirebaseUI_demo_swift.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -180,6 +189,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 6096FEF87E5B53C0792BC146 /* Pods_FirebaseUI_demo_swiftTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -202,6 +212,7 @@ 8DABC99C1D3D82D600453807 /* FirebaseUI-demo-swiftTests */, 8DABC9861D3D82D600453807 /* Products */, 9C43BF8CA810E7C909775084 /* Pods */, + C129AF2D5B3F8906D7A96042 /* Frameworks */, ); sourceTree = ""; }; @@ -240,10 +251,23 @@ 9C43BF8CA810E7C909775084 /* Pods */ = { isa = PBXGroup; children = ( + DB206ACE5B8C8DC3A2E47E00 /* Pods-FirebaseUI-demo-swift.debug.xcconfig */, + A885F4D8D84B72ADACBE725B /* Pods-FirebaseUI-demo-swift.release.xcconfig */, + 8E009A2D4461F77B9CEB0C4D /* Pods-FirebaseUI-demo-swiftTests.debug.xcconfig */, + 6F5993EFB11CBA0003C0DE94 /* Pods-FirebaseUI-demo-swiftTests.release.xcconfig */, ); path = Pods; sourceTree = ""; }; + C129AF2D5B3F8906D7A96042 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 25F197CFBB06559F4B537E37 /* Pods_FirebaseUI_demo_swift.framework */, + 637019691D9C301621749DE1 /* Pods_FirebaseUI_demo_swiftTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; C302C1D31D91CC7B00ADBD41 /* Samples */ = { isa = PBXGroup; children = ( @@ -305,9 +329,11 @@ isa = PBXNativeTarget; buildConfigurationList = 8DABC9A21D3D82D600453807 /* Build configuration list for PBXNativeTarget "FirebaseUI-demo-swift" */; buildPhases = ( + 3D86CE81C1F8711347A14B72 /* [CP] Check Pods Manifest.lock */, 8DABC9811D3D82D600453807 /* Sources */, 8DABC9821D3D82D600453807 /* Frameworks */, 8DABC9831D3D82D600453807 /* Resources */, + 04D211F7D3B42A6D19A9E000 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -322,6 +348,7 @@ isa = PBXNativeTarget; buildConfigurationList = 8DABC9A51D3D82D600453807 /* Build configuration list for PBXNativeTarget "FirebaseUI-demo-swiftTests" */; buildPhases = ( + 94F892B9CDD1C2428D7F724B /* [CP] Check Pods Manifest.lock */, 8DABC9951D3D82D600453807 /* Sources */, 8DABC9961D3D82D600453807 /* Frameworks */, 8DABC9971D3D82D600453807 /* Resources */, @@ -348,7 +375,6 @@ TargetAttributes = { 8DABC9841D3D82D600453807 = { CreatedOnToolsVersion = 7.3.1; - DevelopmentTeam = YYX2P3XVJ7; LastSwiftMigration = 1020; SystemCapabilities = { com.apple.BackgroundModes = { @@ -497,6 +523,149 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 04D211F7D3B42A6D19A9E000 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-FirebaseUI-demo-swift/Pods-FirebaseUI-demo-swift-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework", + "${BUILT_PRODUCTS_DIR}/AppCheckCore/AppCheckCore.framework", + "${BUILT_PRODUCTS_DIR}/BoringSSL-GRPC/openssl_grpc.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseAnonymousAuthUI/FirebaseAnonymousAuthUI.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseAppCheckInterop/FirebaseAppCheckInterop.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseAuth/FirebaseAuth.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseAuthInterop/FirebaseAuthInterop.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseAuthUI/FirebaseAuthUI.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseCoreExtension/FirebaseCoreExtension.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseDatabase/FirebaseDatabase.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseDatabaseUI/FirebaseDatabaseUI.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseEmailAuthUI/FirebaseEmailAuthUI.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseFacebookAuthUI/FirebaseFacebookAuthUI.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseFirestore/FirebaseFirestore.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseFirestoreInternal/FirebaseFirestoreInternal.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseFirestoreUI/FirebaseFirestoreUI.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseGoogleAuthUI/FirebaseGoogleAuthUI.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseOAuthUI/FirebaseOAuthUI.framework", + "${BUILT_PRODUCTS_DIR}/FirebasePhoneAuthUI/FirebasePhoneAuthUI.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseSharedSwift/FirebaseSharedSwift.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseStorage/FirebaseStorage.framework", + "${BUILT_PRODUCTS_DIR}/FirebaseStorageUI/FirebaseStorageUI.framework", + "${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework", + "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", + "${BUILT_PRODUCTS_DIR}/GoogleSignIn/GoogleSignIn.framework", + "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", + "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework", + "${BUILT_PRODUCTS_DIR}/RecaptchaInterop/RecaptchaInterop.framework", + "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework", + "${BUILT_PRODUCTS_DIR}/abseil/absl.framework", + "${BUILT_PRODUCTS_DIR}/gRPC-C++/grpcpp.framework", + "${BUILT_PRODUCTS_DIR}/gRPC-Core/grpc.framework", + "${BUILT_PRODUCTS_DIR}/leveldb-library/leveldb.framework", + "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBAEMKit/FBAEMKit.framework/FBAEMKit", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKCoreKit/FBSDKCoreKit.framework/FBSDKCoreKit", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKCoreKit_Basics/FBSDKCoreKit_Basics.framework/FBSDKCoreKit_Basics", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/FBSDKLoginKit/FBSDKLoginKit.framework/FBSDKLoginKit", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppCheckCore.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/openssl_grpc.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAnonymousAuthUI.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAppCheckInterop.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAuthInterop.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAuthUI.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreExtension.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreInternal.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseDatabase.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseDatabaseUI.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseEmailAuthUI.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseFacebookAuthUI.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseFirestore.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseFirestoreInternal.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseFirestoreUI.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseGoogleAuthUI.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseOAuthUI.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebasePhoneAuthUI.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseSharedSwift.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseStorage.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseStorageUI.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleSignIn.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RecaptchaInterop.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/absl.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpcpp.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpc.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/leveldb.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBAEMKit.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBSDKCoreKit.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBSDKCoreKit_Basics.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBSDKLoginKit.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-FirebaseUI-demo-swift/Pods-FirebaseUI-demo-swift-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 3D86CE81C1F8711347A14B72 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-FirebaseUI-demo-swift-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 94F892B9CDD1C2428D7F724B /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-FirebaseUI-demo-swiftTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 8DABC9811D3D82D600453807 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -748,12 +917,13 @@ }; 8DABC9A31D3D82D600453807 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DB206ACE5B8C8DC3A2E47E00 /* Pods-FirebaseUI-demo-swift.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; BITCODE_GENERATION_MODE = ""; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "FirebaseUI-demo-swift/FirebaseUI-demo-swift.entitlements"; - DEVELOPMENT_TEAM = YYX2P3XVJ7; + DEVELOPMENT_TEAM = ""; HEADER_SEARCH_PATHS = ( "$(inherited)", "${PODS_ROOT}/Firebase/Core/Sources", @@ -792,7 +962,7 @@ BITCODE_GENERATION_MODE = ""; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "FirebaseUI-demo-swift/FirebaseUI-demo-swift.entitlements"; - DEVELOPMENT_TEAM = YYX2P3XVJ7; + DEVELOPMENT_TEAM = ""; HEADER_SEARCH_PATHS = ( "$(inherited)", "${PODS_ROOT}/Firebase/Core/Sources", diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentViewSheetExample.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentViewSheetExample.swift new file mode 100644 index 0000000000..791305d831 --- /dev/null +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentViewSheetExample.swift @@ -0,0 +1,81 @@ +// +// ContentViewSheetExample.swift +// FirebaseUI +// +// Created by Ademola Fadumo on 20/10/2025. +// + +import SwiftUI +import FirebaseAuth +import FirebaseAuthSwiftUI +import FirebaseGoogleSwiftUI +import FirebaseFacebookSwiftUI +import FirebasePhoneAuthSwiftUI + +struct ContentViewSheetExample: View { + init() { + 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( + tosUrl: URL(string: "https://example.com/tos"), + privacyPolicyUrl: URL(string: "https://example.com/privacy"), + emailLinkSignInActionCodeSettings: actionCodeSettings, + mfaEnabled: true + ) + + authService = AuthService( + configuration: configuration + ) + .withGoogleSignIn() + .withPhoneSignIn() + .withTwitterSignIn() + .withFacebookSignIn() + .withEmailSignIn() + } + + @State private var authService: AuthService + @State private var isPresented: Bool = false + + var body: some View { + FirebaseAuthView( + authService: authService, + isPresented: $isPresented + ) { + NavigationStack { + VStack { + if authService.authenticationState == .unauthenticated { + Text("Not Authenticated") + } else { + Text("Authenticated - \(authService.currentUser?.email ?? "")") + Button { + Task { + try? await authService.signOut() + } + } label: { + Text("Sign Out") + } + .buttonStyle(.borderedProminent) + } + } + .navigationTitle("Firebase UI Demo") + } + .onAppear { + isPresented = authService.authenticationState == .unauthenticated + } + .onChange(of: authService.authenticationState) { oldValue, newValue in + debugPrint("authService.authenticationState - \(newValue)") + if newValue != .authenticating { + isPresented = newValue == .unauthenticated + } + } + } + } +} + +#Preview { + ContentViewSheetExample() +} diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift index 735bbbb0f5..00a72d02a0 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift @@ -79,11 +79,12 @@ struct FirebaseSwiftUIExampleApp: App { var body: some Scene { WindowGroup { - if testRunner { - TestView() - } else { - ContentView() - } + ContentViewSheetExample() +// if testRunner { +// TestView() +// } else { +// ContentView() +// } } } } From 47b3a606e0b65f48649b3157b4a18917d9524fd2 Mon Sep 17 00:00:00 2001 From: Ademola Fadumo Date: Tue, 28 Oct 2025 19:48:04 +0100 Subject: [PATCH 02/38] refactor: use provider styles --- .../Sources/Views/SignInWithAppleButton.swift | 24 +- .../Sources/Strings/Localizable.xcstrings | 2 +- .../Sources/Views/AuthPickerView.swift | 52 +- .../Sources/Views/EmailAuthView.swift | 147 ++--- .../Sources/Components/AnnotatedString.swift | 55 ++ .../Components/AuthProviderButton.swift | 83 +++ .../Sources/Components/AuthTextField.swift | 173 ++++++ .../Sources/Components/CountrySelector.swift | 108 ++++ .../VerificationCodeInputField.swift | 555 ++++++++++++++++++ .../Sources/Extensions/Color+Hex.swift | 25 + .../AccentColor.colorset}/Contents.json | 6 +- .../AppIcon.appiconset/Contents.json | 35 ++ .../Resources/Assets.xcassets}/Contents.json | 1 - .../Contents.json | 9 +- .../firebase_auth_120dp 1.png | Bin 0 -> 31998 bytes .../firebase_auth_120dp 2.png | Bin 0 -> 15823 bytes .../firebase_auth_120dp.png | Bin 0 -> 35146 bytes .../fui-ic-anonymous.imageset}/Contents.json | 11 +- .../fui_ic_anonymous_white_24dp 1.png | Bin 0 -> 7879 bytes .../fui_ic_anonymous_white_24dp 2.png | Bin 0 -> 3635 bytes .../fui_ic_anonymous_white_24dp.png | Bin 0 -> 12883 bytes .../fui-ic-apple.imageset}/Contents.json | 11 +- .../fui_ic_apple_white_24dp 1.png | Bin 0 -> 9453 bytes .../fui_ic_apple_white_24dp 2.png | Bin 0 -> 4572 bytes .../fui_ic_apple_white_24dp.png | Bin 0 -> 15394 bytes .../fui-ic-facebook.imageset}/Contents.json | 11 +- .../fui_ic_facebook_white_22dp 1.png | Bin 0 -> 5231 bytes .../fui_ic_facebook_white_22dp 2.png | Bin 0 -> 2524 bytes .../fui_ic_facebook_white_22dp.png | Bin 0 -> 8550 bytes .../fui-ic-github.imageset/Contents.json | 23 + .../fui_ic_github_white_24dp 1.png | Bin 0 -> 13957 bytes .../fui_ic_github_white_24dp 2.png | Bin 0 -> 6636 bytes .../fui_ic_github_white_24dp.png | Bin 0 -> 22107 bytes .../fui-ic-googleg.imageset/Contents.json | 23 + .../fui_ic_googleg_color_24dp 1.png | Bin 0 -> 14824 bytes .../fui_ic_googleg_color_24dp 2.png | Bin 0 -> 7275 bytes .../fui_ic_googleg_color_24dp.png | Bin 0 -> 24342 bytes .../fui-ic-mail.imageset/Contents.json | 23 + .../fui_ic_mail_white_24dp 1.png | Bin 0 -> 5707 bytes .../fui_ic_mail_white_24dp 2.png | Bin 0 -> 2507 bytes .../fui_ic_mail_white_24dp.png | Bin 0 -> 9512 bytes .../fui-ic-microsoft.imageset/Contents.json | 23 + .../fui_ic_microsoft_24dp 1.png | Bin 0 -> 2753 bytes .../fui_ic_microsoft_24dp 2.png | Bin 0 -> 1150 bytes .../fui_ic_microsoft_24dp.png | Bin 0 -> 5102 bytes .../fui-ic-phone.imageset/Contents.json | 23 + .../fui_ic_phone_white_24dp 1.png | Bin 0 -> 7532 bytes .../fui_ic_phone_white_24dp 2.png | Bin 0 -> 3332 bytes .../fui_ic_phone_white_24dp.png | Bin 0 -> 12472 bytes .../Contents.json | 23 + .../fui_ic_twitter_bird_white_24dp 1.png | Bin 0 -> 10311 bytes .../fui_ic_twitter_bird_white_24dp 2.png | Bin 0 -> 4861 bytes .../fui_ic_twitter_bird_white_24dp.png | Bin 0 -> 16207 bytes .../fui-ic-yahoo.imageset/Contents.json | 23 + .../fui_ic_yahoo_24dp 1.png | Bin 0 -> 8024 bytes .../fui_ic_yahoo_24dp 2.png | Bin 0 -> 3783 bytes .../fui_ic_yahoo_24dp.png | Bin 0 -> 13470 bytes .../Sources/Theme/ProviderStyle.swift | 127 ++++ .../Views/SignInWithFacebookButton.swift | 22 +- .../Views/SignInWithGoogleButton.swift | 15 +- .../github_logo.imageset/ic_github.png | Bin 800 -> 0 bytes .../github_logo.imageset/ic_github@2x.png | Bin 1789 -> 0 bytes .../github_logo.imageset/ic_github@3x.png | Bin 3106 -> 0 bytes .../microsoft_logo.imageset/ic_microsoft.png | Bin 508 -> 0 bytes .../ic_microsoft@2x.png | Bin 619 -> 0 bytes .../ic_microsoft@3x.png | Bin 626 -> 0 bytes .../yahoo_logo.imageset/ic_yahoo.png | Bin 1895 -> 0 bytes .../yahoo_logo.imageset/ic_yahoo@2x.png | Bin 2917 -> 0 bytes .../yahoo_logo.imageset/ic_yahoo@3x.png | Bin 3781 -> 0 bytes .../Services/OAuthProviderSwift+Presets.swift | 19 +- .../Sources/Views/GenericOAuthButton.swift | 34 +- .../Sources/Views/PhoneAuthButtonView.swift | 15 +- .../ic_twitter-white.png | Bin 103016 -> 0 bytes .../Views/SignInWithTwitterButton.swift | 24 +- Package.swift | 25 +- .../FirebaseSwiftUIExample/ContentView.swift | 4 +- .../FirebaseSwiftUIExampleApp.swift | 12 +- 77 files changed, 1536 insertions(+), 230 deletions(-) create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AnnotatedString.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AuthProviderButton.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AuthTextField.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/CountrySelector.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/VerificationCodeInputField.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Extensions/Color+Hex.swift rename FirebaseSwiftUI/{FirebaseTwitterSwiftUI/Sources/Resources/Media.xcassets => FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/AccentColor.colorset}/Contents.json (51%) create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json rename FirebaseSwiftUI/{FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets => FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets}/Contents.json (98%) rename FirebaseSwiftUI/{FirebaseTwitterSwiftUI/Sources/Resources/Media.xcassets/twitter_logo.imageset => FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset}/Contents.json (63%) create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp.png rename FirebaseSwiftUI/{FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/yahoo_logo.imageset => FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-anonymous.imageset}/Contents.json (54%) create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp.png rename FirebaseSwiftUI/{FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/github_logo.imageset => FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-apple.imageset}/Contents.json (54%) create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp.png rename FirebaseSwiftUI/{FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/microsoft_logo.imageset => FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset}/Contents.json (53%) create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-github.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-github.imageset/fui_ic_github_white_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-github.imageset/fui_ic_github_white_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-github.imageset/fui_ic_github_white_24dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-googleg.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-mail.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-microsoft.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-phone.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-yahoo.imageset/Contents.json create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-yahoo.imageset/fui_ic_yahoo_24dp 1.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-yahoo.imageset/fui_ic_yahoo_24dp 2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-yahoo.imageset/fui_ic_yahoo_24dp.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Theme/ProviderStyle.swift delete mode 100644 FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/github_logo.imageset/ic_github.png delete mode 100644 FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/github_logo.imageset/ic_github@2x.png delete mode 100644 FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/github_logo.imageset/ic_github@3x.png delete mode 100644 FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/microsoft_logo.imageset/ic_microsoft.png delete mode 100644 FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/microsoft_logo.imageset/ic_microsoft@2x.png delete mode 100644 FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/microsoft_logo.imageset/ic_microsoft@3x.png delete mode 100644 FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/yahoo_logo.imageset/ic_yahoo.png delete mode 100644 FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/yahoo_logo.imageset/ic_yahoo@2x.png delete mode 100644 FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/yahoo_logo.imageset/ic_yahoo@3x.png delete mode 100644 FirebaseSwiftUI/FirebaseTwitterSwiftUI/Sources/Resources/Media.xcassets/twitter_logo.imageset/ic_twitter-white.png diff --git a/FirebaseSwiftUI/FirebaseAppleSwiftUI/Sources/Views/SignInWithAppleButton.swift b/FirebaseSwiftUI/FirebaseAppleSwiftUI/Sources/Views/SignInWithAppleButton.swift index 693491dbfe..d3c5c2151a 100644 --- a/FirebaseSwiftUI/FirebaseAppleSwiftUI/Sources/Views/SignInWithAppleButton.swift +++ b/FirebaseSwiftUI/FirebaseAppleSwiftUI/Sources/Views/SignInWithAppleButton.swift @@ -13,6 +13,7 @@ // limitations under the License. import FirebaseAuthSwiftUI +import FirebaseAuthUIComponents import SwiftUI /// A button for signing in with Apple @@ -27,27 +28,14 @@ public struct SignInWithAppleButton { extension SignInWithAppleButton: View { public var body: some View { - Button(action: { + AuthProviderButton( + label: "Sign in with Apple", + style: .apple, + accessibilityId: "sign-in-with-apple-button" + ) { Task { try? await authService.signIn(provider) } - }) { - HStack { - Image(systemName: "apple.logo") - .resizable() - .renderingMode(.template) - .scaledToFit() - .frame(width: 24, height: 24) - .foregroundColor(.white) - Text("Sign in with Apple") - .fontWeight(.semibold) - .foregroundColor(.white) - } - .frame(maxWidth: .infinity, alignment: .leading) - .padding() - .background(Color.black) - .cornerRadius(8) } - .accessibilityIdentifier("sign-in-with-apple-button") } } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings index ef52e93e9f..33388d8aff 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings @@ -204,7 +204,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Welcome" + "value" : "Sign in with Firebase" } } } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift index 20220a0d5b..ba3310f6bf 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift @@ -22,8 +22,9 @@ public struct AuthPickerView { public init() {} private func switchFlow() { - authService.authenticationFlow = authService - .authenticationFlow == .signIn ? .signUp : .signIn + authService.authenticationFlow = + authService + .authenticationFlow == .signIn ? .signUp : .signIn } @ViewBuilder @@ -41,7 +42,7 @@ extension AuthPickerView: View { public var body: some View { ScrollView { VStack { - authPickerTitleView + //authPickerTitleView if authService.authenticationState == .authenticated { switch authService.authView { case .mfaEnrollment: @@ -63,29 +64,39 @@ extension AuthPickerView: View { MFAResolutionView() case .authPicker: if authService.emailSignInEnabled { - Text(authService.authenticationFlow == .signIn ? authService.string - .emailLoginFlowLabel : authService.string.emailSignUpFlowLabel) - Divider() +// Text( +// authService.authenticationFlow == .signIn +// ? authService.string +// .emailLoginFlowLabel +// : authService.string.emailSignUpFlowLabel +// ) EmailAuthView() } VStack { authService.renderButtons() - }.padding(.horizontal) + } if authService.emailSignInEnabled { Divider() HStack { - Text(authService - .authenticationFlow == .signIn ? authService.string.dontHaveAnAccountYetLabel : - authService.string.alreadyHaveAnAccountLabel) + Text( + authService + .authenticationFlow == .signIn + ? authService.string.dontHaveAnAccountYetLabel + : authService.string.alreadyHaveAnAccountLabel + ) Button(action: { withAnimation { switchFlow() } }) { - Text(authService.authenticationFlow == .signUp ? authService.string - .emailLoginFlowLabel : authService.string.emailSignUpFlowLabel) - .fontWeight(.semibold) - .foregroundColor(.blue) + Text( + authService.authenticationFlow == .signUp + ? authService.string + .emailLoginFlowLabel + : authService.string.emailSignUpFlowLabel + ) + .fontWeight(.semibold) + .foregroundColor(.blue) }.accessibilityIdentifier("switch-auth-flow") } } @@ -96,11 +107,16 @@ extension AuthPickerView: View { } } } + .safeAreaPadding() + .navigationTitle(authService.string.authPickerTitle) } - .errorAlert(error: Binding( - get: { authService.currentError }, - set: { authService.currentError = $0 } - ), okButtonLabel: authService.string.okButtonLabel) + .errorAlert( + error: Binding( + get: { authService.currentError }, + set: { authService.currentError = $0 } + ), + okButtonLabel: authService.string.okButtonLabel + ) } } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift index c11f506f6a..a55db55e9a 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift @@ -31,15 +31,15 @@ private enum FocusableField: Hashable { @MainActor public struct EmailAuthView { @Environment(AuthService.self) private var authService - + @State private var email = "" @State private var password = "" @State private var confirmPassword = "" - + @FocusState private var focus: FocusableField? - + public init() {} - + private var isValid: Bool { return if authService.authenticationFlow == .signIn { !email.isEmpty && !password.isEmpty @@ -47,11 +47,11 @@ public struct EmailAuthView { !email.isEmpty && !password.isEmpty && password == confirmPassword } } - + private func signInWithEmailPassword() async { try? await authService.signIn(email: email, password: password) } - + private func createUserWithEmailPassword() async { try? await authService.createUser(email: email, password: password) } @@ -59,79 +59,92 @@ public struct EmailAuthView { extension EmailAuthView: View { public var body: some View { - VStack { - LabeledContent { - TextField(authService.string.emailInputLabel, text: $email) - .textInputAutocapitalization(.never) - .disableAutocorrection(true) - .focused($focus, equals: .email) - .submitLabel(.next) - .onSubmit { - self.focus = .password - } - } label: { - Image(systemName: "at") - } - .padding(.vertical, 6) - .background(Divider(), alignment: .bottom) - .padding(.bottom, 4) + VStack(spacing: 16) { + AuthTextField( + text: $email, + localizedTitle: "Email", + prompt: authService.string.emailInputLabel, + keyboardType: .emailAddress, + contentType: .emailAddress, + onSubmit: { _ in + self.focus = .password + }, + leading: { + Image(systemName: "at") + } + ) + .focused($focus, equals: .email) .accessibilityIdentifier("email-field") - - LabeledContent { - SecureField(authService.string.passwordInputLabel, text: $password) - .focused($focus, equals: .password) - .textInputAutocapitalization(.never) - .disableAutocorrection(true) - .submitLabel(.go) - .onSubmit { - Task { await signInWithEmailPassword() } - } - } label: { - Image(systemName: "lock") - } - .padding(.vertical, 6) - .background(Divider(), alignment: .bottom) - .padding(.bottom, 8) + AuthTextField( + text: $password, + localizedTitle: "Password", + prompt: authService.string.passwordInputLabel, + contentType: .password, + sensitive: true, + onSubmit: { _ in + Task { await signInWithEmailPassword() } + }, + leading: { + Image(systemName: "lock") + } + ) + .submitLabel(.go) + .focused($focus, equals: .password) .accessibilityIdentifier("password-field") - if authService.authenticationFlow == .signIn { - Button(action: { - authService.authView = .passwordRecovery - }) { + NavigationLink { + PasswordRecoveryView() + .environment(authService) + } label: { Text(authService.string.passwordButtonLabel) - }.accessibilityIdentifier("password-recovery-button") - } + .frame(maxWidth: .infinity, alignment: .trailing) + } + .accessibilityIdentifier("password-recovery-button") +// Button(action: { +// authService.authView = .passwordRecovery +// }) { +// Text(authService.string.passwordButtonLabel) +// }.accessibilityIdentifier("password-recovery-button") + } + if authService.authenticationFlow == .signUp { - LabeledContent { - SecureField(authService.string.confirmPasswordInputLabel, text: $confirmPassword) - .focused($focus, equals: .confirmPassword) - .textInputAutocapitalization(.never) - .disableAutocorrection(true) - .submitLabel(.go) - .onSubmit { - Task { await createUserWithEmailPassword() } - } - } label: { - Image(systemName: "lock") - } - .padding(.vertical, 6) - .background(Divider(), alignment: .bottom) - .padding(.bottom, 8) + AuthTextField( + text: $confirmPassword, + localizedTitle: "Confirm Password", + prompt: authService.string.confirmPasswordInputLabel, + contentType: .password, + sensitive: true, + onSubmit: { _ in + Task { await createUserWithEmailPassword() } + }, + leading: { + Image(systemName: "lock") + } + ) + .submitLabel(.go) + .focused($focus, equals: .confirmPassword) .accessibilityIdentifier("confirm-password-field") } - + Button(action: { Task { - if authService.authenticationFlow == .signIn { await signInWithEmailPassword() } - else { await createUserWithEmailPassword() } + if authService.authenticationFlow == .signIn { + await signInWithEmailPassword() + } else { + await createUserWithEmailPassword() + } } }) { if authService.authenticationState != .authenticating { - Text(authService.authenticationFlow == .signIn ? authService.string - .signInWithEmailButtonLabel : authService.string.signUpWithEmailButtonLabel) - .padding(.vertical, 8) - .frame(maxWidth: .infinity) + Text( + authService.authenticationFlow == .signIn + ? authService.string + .signInWithEmailButtonLabel + : authService.string.signUpWithEmailButtonLabel + ) + .padding(.vertical, 8) + .frame(maxWidth: .infinity) } else { ProgressView() .progressViewStyle(CircularProgressViewStyle(tint: .white)) @@ -140,7 +153,7 @@ extension EmailAuthView: View { } } .disabled(!isValid) - .padding([.top, .bottom, .horizontal], 8) + .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) .buttonStyle(.borderedProminent) .accessibilityIdentifier("sign-in-button") diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AnnotatedString.swift b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AnnotatedString.swift new file mode 100644 index 0000000000..8979e0cc42 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AnnotatedString.swift @@ -0,0 +1,55 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +public struct AnnotatedString: View { + let fullText: String + let links: [(label: String, url: String)] + + public init( + fullText: String, + links: [(String, String)] + ) { + self.fullText = fullText + self.links = links + } + + public var body: some View { + let text = makeAttributedText() + Text(text) + .multilineTextAlignment(.center) + .tint(.accentColor) + .onOpenURL { url in + UIApplication.shared.open(url) + } + } + + private func makeAttributedText() -> AttributedString { + let template = fullText + var attributed = AttributedString(template) + + for (label, urlString) in links { + guard let range = attributed.range(of: label), + let url = URL(string: urlString) + else { continue } + + attributed[range].link = url + attributed[range].foregroundColor = UIColor.tintColor + attributed[range].underlineStyle = Text.LineStyle.single + } + + return attributed + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AuthProviderButton.swift b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AuthProviderButton.swift new file mode 100644 index 0000000000..549ed65680 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AuthProviderButton.swift @@ -0,0 +1,83 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +/// A styled button component for authentication providers +/// Used by all provider packages to maintain consistent UI +public struct AuthProviderButton: View { + let label: String + let style: ProviderStyle + let action: () -> Void + var enabled: Bool + var accessibilityId: String? + + public init( + label: String, + style: ProviderStyle, + enabled: Bool = true, + accessibilityId: String? = nil, + action: @escaping () -> Void + ) { + self.label = label + self.style = style + self.enabled = enabled + self.accessibilityId = accessibilityId + self.action = action + } + + public var body: some View { + Button(action: action) { + HStack(spacing: 12) { + if let icon = style.icon { + providerIcon(for: icon, tint: style.iconTint) + } + Text(label) + .lineLimit(1) + .truncationMode(.tail) + .foregroundStyle(style.contentColor) + } + .padding(.horizontal, 8) + .frame(maxWidth: .infinity, alignment: .leading) + } + .buttonStyle(.borderedProminent) + .tint(style.backgroundColor) + .shadow( + color: Color.black.opacity(0.12), + radius: Double(style.elevation), + x: 0, + y: style.elevation > 0 ? 1 : 0 + ) + .disabled(!enabled) + .accessibilityIdentifier(accessibilityId ?? "auth-provider-button") + } + + @ViewBuilder + private func providerIcon(for image: Image, tint: Color?) -> some View { + if let tint { + image + .renderingMode(.template) + .resizable() + .scaledToFit() + .frame(width: 24, height: 24) + .foregroundStyle(tint) + } else { + image + .renderingMode(.original) + .resizable() + .scaledToFit() + .frame(width: 24, height: 24) + } + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AuthTextField.swift b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AuthTextField.swift new file mode 100644 index 0000000000..2d027156bc --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AuthTextField.swift @@ -0,0 +1,173 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +public struct FieldValidation: Identifiable, Equatable { + public let id = UUID() + public let message: String + public var valid: Bool = false + + public init(message: String, valid: Bool = false) { + self.message = message + self.valid = valid + } +} + +public struct AuthTextField: View { + @FocusState private var isFocused: Bool + @State var invalidInput: Bool = false + @State var obscured: Bool = true + + @Binding var text: String + let localizedTitle: String + let prompt: String + var textAlignment: TextAlignment = .leading + var keyboardType: UIKeyboardType = .default + var contentType: UITextContentType? = nil + var isSecureTextField: Bool = false + var validations: [FieldValidation] = [] + var formState: ((Bool) -> Void)? = nil + var onSubmit: ((String) -> Void)? = nil + var onChange: ((String) -> Void)? = nil + private let leading: () -> Leading? + + public init( + text: Binding, + localizedTitle: String, + prompt: String, + textAlignment: TextAlignment = .leading, + keyboardType: UIKeyboardType = .default, + contentType: UITextContentType? = nil, + sensitive: Bool = false, + validations: [FieldValidation] = [], + formState: ((Bool) -> Void)? = nil, + onSubmit: ((String) -> Void)? = nil, + onChange: ((String) -> Void)? = nil, + @ViewBuilder leading: @escaping () -> Leading? = { EmptyView() } + ) { + self._text = text + self.localizedTitle = localizedTitle + self.prompt = prompt + self.textAlignment = textAlignment + self.keyboardType = keyboardType + self.contentType = contentType + self.isSecureTextField = sensitive + self.validations = validations + self.formState = formState + self.onSubmit = onSubmit + self.onChange = onChange + self.leading = leading + } + + var allRequirementsMet: Bool { + validations.allSatisfy { $0.valid == true } + } + + public var body: some View { + VStack(alignment: .leading) { + Text(localizedTitle) + HStack(spacing: 8) { + leading() + Group { + if isSecureTextField { + ZStack(alignment: .trailing) { + SecureField(localizedTitle, text: $text, prompt: Text(prompt)) + .opacity(obscured ? 1 : 0) + .focused($isFocused) + .frame(height: 24) + TextField(localizedTitle, text: $text, prompt: Text(prompt)) + .opacity(obscured ? 0 : 1) + .focused($isFocused) + .frame(height: 24) + if !text.isEmpty { + Button { + withAnimation(.easeInOut(duration: 0.2)) { + obscured.toggle() + } + // Reapply focus after toggling + DispatchQueue.main.async { + isFocused = true + } + } label: { + Image(systemName: obscured ? "eye" : "eye.slash") + } + .buttonStyle(.plain) + } + } + } else { + TextField( + localizedTitle, + text: $text, + prompt: Text(prompt) + ) + .frame(height: 24) + } + } + } + .frame(maxWidth: .infinity) + .keyboardType(keyboardType) + .textContentType(contentType) + .autocapitalization(.none) + .disableAutocorrection(true) + .focused($isFocused) + .onSubmit { + onSubmit?(text) + } + .onChange(of: text) { oldValue, newValue in + onChange?(newValue) + } + .multilineTextAlignment(textAlignment) + .textFieldStyle(.plain) + .padding(.vertical, 12) + .padding(.horizontal, 12) + .background { + RoundedRectangle(cornerRadius: 8) + .fill(Color.accentColor.opacity(0.05)) + .strokeBorder(lineWidth: isFocused ? 3 : 1) + .foregroundStyle(isFocused ? Color.accentColor : Color(.systemFill)) + } + .contentShape(Rectangle()) + .onTapGesture { + withAnimation { + isFocused = true + } + } + if !validations.isEmpty { + VStack(alignment: .leading, spacing: 4) { + ForEach(validations) { validation in + HStack { + Image(systemName: isSecureTextField ? "lock.open" : "x.square") + .foregroundStyle(validation.valid ? .gray : .red) + Text(validation.message) + .strikethrough(validation.valid, color: .gray) + .foregroundStyle(.gray) + .fixedSize(horizontal: false, vertical: true) + } + } + } + .onChange(of: allRequirementsMet) { oldValue, newValue in + formState?(newValue) + if !newValue { + withAnimation(.easeInOut(duration: 0.08).repeatCount(4)) { + invalidInput = true + } completion: { + invalidInput = false + } + } + } + } + } + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/CountrySelector.swift b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/CountrySelector.swift new file mode 100644 index 0000000000..55238169c3 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/CountrySelector.swift @@ -0,0 +1,108 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +public struct CountryData: Equatable { + public let name: String + public let dialCode: String + public let code: String + + public init(name: String, dialCode: String, code: String) { + self.name = name + self.dialCode = dialCode + self.code = code + } + + public var flag: String { + let base: UInt32 = 127397 + var s = "" + for v in code.unicodeScalars { + s.unicodeScalars.append(UnicodeScalar(base + v.value)!) + } + return String(s) + } + + @MainActor public static let `default` = CountryData( + name: "United States", + dialCode: "+1", + code: "US" + ) +} + +public struct CountrySelector: View { + @Binding var selectedCountry: CountryData + var enabled: Bool = true + var allowedCountries: Set? = nil + + public init( + selectedCountry: Binding, + enabled: Bool = true, + allowedCountries: Set? = nil + ) { + self._selectedCountry = selectedCountry + self.enabled = enabled + self.allowedCountries = allowedCountries + } + + // Common countries list + private let allCountries: [CountryData] = [ + CountryData(name: "United States", dialCode: "+1", code: "US"), + CountryData(name: "United Kingdom", dialCode: "+44", code: "GB"), + CountryData(name: "Canada", dialCode: "+1", code: "CA"), + CountryData(name: "Australia", dialCode: "+61", code: "AU"), + CountryData(name: "Germany", dialCode: "+49", code: "DE"), + CountryData(name: "France", dialCode: "+33", code: "FR"), + CountryData(name: "India", dialCode: "+91", code: "IN"), + CountryData(name: "Nigeria", dialCode: "+234", code: "NG"), + CountryData(name: "South Africa", dialCode: "+27", code: "ZA"), + CountryData(name: "Japan", dialCode: "+81", code: "JP"), + CountryData(name: "China", dialCode: "+86", code: "CN"), + CountryData(name: "Brazil", dialCode: "+55", code: "BR"), + CountryData(name: "Mexico", dialCode: "+52", code: "MX"), + CountryData(name: "Spain", dialCode: "+34", code: "ES"), + CountryData(name: "Italy", dialCode: "+39", code: "IT"), + ] + + private var filteredCountries: [CountryData] { + if let allowedCountries = allowedCountries { + return allCountries.filter { allowedCountries.contains($0.code) } + } + return allCountries + } + + public var body: some View { + Menu { + ForEach(filteredCountries, id: \.code) { country in + Button { + selectedCountry = country + } label: { + Text("\(country.flag) \(country.name) (\(country.dialCode))") + } + } + } label: { + HStack(spacing: 4) { + Text(selectedCountry.flag) + .font(.title3) + Text(selectedCountry.dialCode) + .font(.body) + .foregroundStyle(.primary) + Image(systemName: "chevron.down") + .font(.caption2) + .foregroundStyle(.secondary) + } + } + .disabled(!enabled) + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/VerificationCodeInputField.swift b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/VerificationCodeInputField.swift new file mode 100644 index 0000000000..fdcf2da1cc --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/VerificationCodeInputField.swift @@ -0,0 +1,555 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI +import UIKit + +public struct VerificationCodeInputField: View { + public init( + code: Binding, + codeLength: Int = 6, + isError: Bool = false, + errorMessage: String? = nil, + onCodeComplete: @escaping (String) -> Void = { _ in }, + onCodeChange: @escaping (String) -> Void = { _ in } + ) { + self._code = code + self.codeLength = codeLength + self.isError = isError + self.errorMessage = errorMessage + self.onCodeComplete = onCodeComplete + self.onCodeChange = onCodeChange + self._digitFields = State(initialValue: Array(repeating: "", count: codeLength)) + } + + @Binding var code: String + let codeLength: Int + let isError: Bool + let errorMessage: String? + let onCodeComplete: (String) -> Void + let onCodeChange: (String) -> Void + + @State private var digitFields: [String] = [] + @State private var focusedIndex: Int? = nil + @State private var pendingInternalCodeUpdates = 0 + + public var body: some View { + VStack(spacing: 8) { + HStack(spacing: 8) { + ForEach(0.. 0 { + pendingInternalCodeUpdates -= 1 + return + } + updateDigitFieldsFromCode(shouldUpdateFocus: true) + } + } + + private func updateDigitFieldsFromCode(shouldUpdateFocus: Bool, forceFocus: Bool = false) { + let sanitized = code.filter { $0.isNumber } + let truncated = String(sanitized.prefix(codeLength)) + var newFields = Array(repeating: "", count: codeLength) + + for (offset, character) in truncated.enumerated() { + newFields[offset] = String(character) + } + + let fieldsChanged = newFields != digitFields + if fieldsChanged { + digitFields = newFields + } + + if code != truncated { + commitCodeChange(truncated) + } + + if shouldUpdateFocus && (fieldsChanged || forceFocus) { + let newFocus = truncated.count < codeLength ? truncated.count : nil + DispatchQueue.main.async { + withAnimation(.easeInOut(duration: 0.2)) { + focusedIndex = newFocus + } + } + } + + if fieldsChanged && truncated.count == codeLength { + DispatchQueue.main.async { + onCodeComplete(truncated) + } + } + } + + private func commitCodeChange(_ newCode: String) { + if code != newCode { + pendingInternalCodeUpdates += 1 + code = newCode + } + } + + private func handleDigitChanged(at index: Int, newDigit: String) { + let sanitized = newDigit.filter { $0.isNumber } + + guard !sanitized.isEmpty else { + processSingleDigitInput(at: index, digit: "") + return + } + + let firstDigit = String(sanitized.prefix(1)) + processSingleDigitInput(at: index, digit: firstDigit) + + let remainder = String(sanitized.dropFirst()) + let availableSlots = max(codeLength - (index + 1), 0) + if availableSlots > 0 { + let trimmedRemainder = String(remainder.prefix(availableSlots)) + if !trimmedRemainder.isEmpty { + applyBulkInput(startingAt: index + 1, digits: trimmedRemainder) + } + } + } + + private func processSingleDigitInput(at index: Int, digit: String) { + if digitFields[index] != digit { + digitFields[index] = digit + } + + let newCode = digitFields.joined() + commitCodeChange(newCode) + onCodeChange(newCode) + + if !digit.isEmpty, + let nextIndex = findNextEmptyField(startingFrom: index) { + DispatchQueue.main.async { + if focusedIndex != nextIndex { + withAnimation(.easeInOut(duration: 0.2)) { + focusedIndex = nextIndex + } + } + } + } + + if newCode.count == codeLength { + DispatchQueue.main.async { + onCodeComplete(newCode) + } + } + } + + + private func handleBackspace(at index: Int) { + // If current field is empty, move to previous field and clear it + if digitFields[index].isEmpty && index > 0 { + digitFields[index - 1] = "" + DispatchQueue.main.async { + let previousIndex = index - 1 + if focusedIndex != previousIndex { + withAnimation(.easeInOut(duration: 0.2)) { + focusedIndex = previousIndex + } + } + } + } else { + // Clear current field + digitFields[index] = "" + } + + // Update the main code string + let newCode = digitFields.joined() + commitCodeChange(newCode) + onCodeChange(newCode) + } + + private func applyBulkInput(startingAt index: Int, digits: String) { + guard !digits.isEmpty, index < codeLength else { return } + + var updatedFields = digitFields + var currentIndex = index + + for digit in digits where currentIndex < codeLength { + updatedFields[currentIndex] = String(digit) + currentIndex += 1 + } + + if digitFields != updatedFields { + digitFields = updatedFields + } + + let newCode = updatedFields.joined() + commitCodeChange(newCode) + onCodeChange(newCode) + + if newCode.count == codeLength { + DispatchQueue.main.async { + onCodeComplete(newCode) + } + } else { + let clampedIndex = max(min(currentIndex - 1, codeLength - 1), 0) + if let nextIndex = findNextEmptyField(startingFrom: clampedIndex) { + DispatchQueue.main.async { + if focusedIndex != nextIndex { + withAnimation(.easeInOut(duration: 0.2)) { + focusedIndex = nextIndex + } + } + } + } + } + } + + private func findNextEmptyField(startingFrom index: Int) -> Int? { + // Look for the next empty field after the current index + for i in (index + 1).. Void + let onBackspace: () -> Void + let onFocusChanged: (Bool) -> Void + + private var borderWidth: CGFloat { + if isError { return 2 } + if isFocused || !digit.isEmpty { return 3 } + return 1 + } + + private var borderColor: Color { + if isError { return .red } + if isFocused || !digit.isEmpty { return .accentColor } + return Color(.systemFill) + } + + var body: some View { + BackspaceAwareTextField( + text: $digit, + isFirstResponder: isFocused, + onDeleteBackwardWhenEmpty: { + if digit.isEmpty { + onBackspace() + } else { + digit = "" + } + }, + onFocusChanged: { isFocused in + onFocusChanged(isFocused) + }, + maxCharacters: maxDigits, + configuration: { textField in + textField.font = .systemFont(ofSize: 24, weight: .medium) + textField.textAlignment = .center + textField.keyboardType = .numberPad + textField.textContentType = .oneTimeCode + textField.autocapitalizationType = .none + textField.autocorrectionType = .no + }, + onTextChange: { newValue in + onDigitChanged(newValue) + } + ) + .frame(width: 48, height: 48) + .background( + RoundedRectangle(cornerRadius: 8) + .fill(Color.accentColor.opacity(0.05)) + .overlay( + RoundedRectangle(cornerRadius: 8) + .stroke(borderColor, lineWidth: borderWidth) + ) + ) + .frame(maxWidth: .infinity) + .accessibilityElement(children: .ignore) + .accessibilityLabel("Digit \(position) of \(totalDigits)") + .accessibilityValue(digit.isEmpty ? "Empty" : digit) + .accessibilityHint("Enter verification code digit") + .animation(.easeInOut(duration: 0.2), value: isFocused) + .animation(.easeInOut(duration: 0.2), value: digit) + } +} + +private struct BackspaceAwareTextField: UIViewRepresentable { + @Binding var text: String + var isFirstResponder: Bool + let onDeleteBackwardWhenEmpty: () -> Void + let onFocusChanged: (Bool) -> Void + let maxCharacters: Int + let configuration: (UITextField) -> Void + let onTextChange: (String) -> Void + + func makeUIView(context: Context) -> BackspaceUITextField { + context.coordinator.parent = self + let textField = BackspaceUITextField() + textField.delegate = context.coordinator + textField.addTarget( + context.coordinator, + action: #selector(Coordinator.editingChanged(_:)), + for: .editingChanged + ) + configuration(textField) + textField.onDeleteBackward = { [weak textField] in + guard let textField else { return } + if (textField.text ?? "").isEmpty { + onDeleteBackwardWhenEmpty() + } + } + return textField + } + + func updateUIView(_ uiView: BackspaceUITextField, context: Context) { + context.coordinator.parent = self + if uiView.text != text { + uiView.text = text + } + + uiView.onDeleteBackward = { [weak uiView] in + guard let uiView else { return } + if (uiView.text ?? "").isEmpty { + onDeleteBackwardWhenEmpty() + } + } + + if isFirstResponder { + if !context.coordinator.isFirstResponder { + context.coordinator.isFirstResponder = true + DispatchQueue.main.async { [weak uiView] in + guard let uiView, !uiView.isFirstResponder else { return } + uiView.becomeFirstResponder() + } + } + } else if context.coordinator.isFirstResponder { + context.coordinator.isFirstResponder = false + } + } + + func makeCoordinator() -> Coordinator { + Coordinator(parent: self) + } + + final class Coordinator: NSObject, UITextFieldDelegate { + var parent: BackspaceAwareTextField + var isFirstResponder = false + + init(parent: BackspaceAwareTextField) { + self.parent = parent + } + + @objc func editingChanged(_ sender: UITextField) { + let updatedText = sender.text ?? "" + parent.text = updatedText + parent.onTextChange(updatedText) + } + + func textFieldDidBeginEditing(_ textField: UITextField) { + isFirstResponder = true + animateFocusChange(for: textField, focused: true) + parent.onFocusChanged(true) + } + + func textFieldDidEndEditing(_ textField: UITextField) { + isFirstResponder = false + animateFocusChange(for: textField, focused: false) + parent.onFocusChanged(false) + } + + private func animateFocusChange(for textField: UITextField, focused: Bool) { + let targetTransform: CGAffineTransform = focused ? CGAffineTransform(scaleX: 1.05, y: 1.05) : .identity + UIView.animate( + withDuration: 0.2, + delay: 0, + options: [.curveEaseInOut, .allowUserInteraction] + ) { + textField.transform = targetTransform + } + } + + func textField( + _ textField: UITextField, + shouldChangeCharactersIn range: NSRange, + replacementString string: String + ) -> Bool { + if string.isEmpty { + return true + } + + let digitsOnly = string.filter { $0.isNumber } + guard !digitsOnly.isEmpty else { + return false + } + + let currentText = textField.text ?? "" + let nsCurrent = currentText as NSString + + if digitsOnly.count > 1 || string.count > 1 { + let limit = max(parent.maxCharacters, 1) + let truncated = String(digitsOnly.prefix(limit)) + let proposed = nsCurrent.replacingCharacters(in: range, with: truncated) + parent.onTextChange(String(proposed.prefix(limit))) + return false + } + + let updated = nsCurrent.replacingCharacters(in: range, with: digitsOnly) + return updated.count <= 1 + } + } +} + +private final class BackspaceUITextField: UITextField { + var onDeleteBackward: (() -> Void)? + + override func deleteBackward() { + let wasEmpty = (text ?? "").isEmpty + super.deleteBackward() + if wasEmpty { + onDeleteBackward?() + } + } +} + +// MARK: - Preview + +#Preview("Normal State") { + @Previewable @State var code = "" + + return VStack(spacing: 32) { + Text("Enter Verification Code") + .font(.title2) + .fontWeight(.semibold) + + VerificationCodeInputField( + code: $code, + onCodeComplete: { completedCode in + print("Code completed: \(completedCode)") + }, + onCodeChange: { newCode in + print("Code changed: \(newCode)") + } + ) + + Text("Current code: \(code)") + .font(.caption) + .foregroundColor(.secondary) + } + .padding() +} + +#Preview("Error State") { + @Previewable @State var code = "12345" + + return VStack(spacing: 32) { + Text("Enter Verification Code") + .font(.title2) + .fontWeight(.semibold) + + VerificationCodeInputField( + code: $code, + isError: true, + errorMessage: "Invalid verification code", + onCodeComplete: { completedCode in + print("Code completed: \(completedCode)") + }, + onCodeChange: { newCode in + print("Code changed: \(newCode)") + } + ) + + Text("Current code: \(code)") + .font(.caption) + .foregroundColor(.secondary) + } + .padding() +} + +#Preview("Custom Length") { + @Previewable @State var code = "" + + return VStack(spacing: 32) { + Text("Enter 4-Digit Code") + .font(.title2) + .fontWeight(.semibold) + + VerificationCodeInputField( + code: $code, + codeLength: 4, + onCodeComplete: { completedCode in + print("Code completed: \(completedCode)") + }, + onCodeChange: { newCode in + print("Code changed: \(newCode)") + } + ) + + Text("Current code: \(code)") + .font(.caption) + .foregroundColor(.secondary) + } + .padding() +} diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Extensions/Color+Hex.swift b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Extensions/Color+Hex.swift new file mode 100644 index 0000000000..efd6751ee3 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Extensions/Color+Hex.swift @@ -0,0 +1,25 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +extension Color { + init(hex: UInt, alpha: Double = 1.0) { + let red = Double((hex >> 16) & 0xFF) / 255.0 + let green = Double((hex >> 8) & 0xFF) / 255.0 + let blue = Double(hex & 0xFF) / 255.0 + + self.init(.sRGB, red: red, green: green, blue: blue, opacity: alpha) + } +} diff --git a/FirebaseSwiftUI/FirebaseTwitterSwiftUI/Sources/Resources/Media.xcassets/Contents.json b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 51% rename from FirebaseSwiftUI/FirebaseTwitterSwiftUI/Sources/Resources/Media.xcassets/Contents.json rename to FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/AccentColor.colorset/Contents.json index 6cc12269b3..eb87897008 100644 --- a/FirebaseSwiftUI/FirebaseTwitterSwiftUI/Sources/Resources/Media.xcassets/Contents.json +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/AccentColor.colorset/Contents.json @@ -1,7 +1,11 @@ { + "colors" : [ + { + "idiom" : "universal" + } + ], "info" : { "author" : "xcode", "version" : 1 } } - diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..2305880107 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,35 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/Contents.json b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/Contents.json similarity index 98% rename from FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/Contents.json rename to FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/Contents.json index 6cc12269b3..73c00596a7 100644 --- a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/Contents.json +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/Contents.json @@ -4,4 +4,3 @@ "version" : 1 } } - diff --git a/FirebaseSwiftUI/FirebaseTwitterSwiftUI/Sources/Resources/Media.xcassets/twitter_logo.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/Contents.json similarity index 63% rename from FirebaseSwiftUI/FirebaseTwitterSwiftUI/Sources/Resources/Media.xcassets/twitter_logo.imageset/Contents.json rename to FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/Contents.json index bd4799c6c3..d41340246f 100644 --- a/FirebaseSwiftUI/FirebaseTwitterSwiftUI/Sources/Resources/Media.xcassets/twitter_logo.imageset/Contents.json +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/Contents.json @@ -1,15 +1,17 @@ { "images" : [ { - "filename" : "ic_twitter-white.png", + "filename" : "firebase_auth_120dp 2.png", "idiom" : "universal", "scale" : "1x" }, { + "filename" : "firebase_auth_120dp 1.png", "idiom" : "universal", "scale" : "2x" }, { + "filename" : "firebase_auth_120dp.png", "idiom" : "universal", "scale" : "3x" } @@ -17,10 +19,5 @@ "info" : { "author" : "xcode", "version" : 1 - }, - "properties" : { - "preserves-vector-representation" : true, - "template-rendering-intent" : "template" } } - diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 1.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 1.png new file mode 100644 index 0000000000000000000000000000000000000000..6a6374e30edb3627e445045a6cfaab0ee86500b1 GIT binary patch literal 31998 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 2.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..351fa59fe5a0c215853266f7ae53ed06e2d2b001 GIT binary patch literal 15823 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..5c2f2bcd903744406682ab3e8e305f551d854640 GIT binary patch literal 3635 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..9d57c10f7e08c6b66f26d8c0a35659a32cc033e9 GIT binary patch literal 12883 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 Lvy&ydr11X*2XF~} literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/github_logo.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-apple.imageset/Contents.json similarity index 54% rename from FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/github_logo.imageset/Contents.json rename to FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-apple.imageset/Contents.json index ac6bbbb149..b8005dda54 100644 --- a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/github_logo.imageset/Contents.json +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-apple.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "ic_github.png", + "filename" : "fui_ic_apple_white_24dp 2.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "ic_github@2x.png", + "filename" : "fui_ic_apple_white_24dp 1.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "ic_github@3x.png", + "filename" : "fui_ic_apple_white_24dp.png", "idiom" : "universal", "scale" : "3x" } @@ -19,10 +19,5 @@ "info" : { "author" : "xcode", "version" : 1 - }, - "properties" : { - "preserves-vector-representation" : true, - "template-rendering-intent" : "template" } } - diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 1.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 1.png new file mode 100644 index 0000000000000000000000000000000000000000..d251bbd78f51ab2afa7202ece5d658cabf887910 GIT binary patch literal 9453 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 R+0bg6wluXl^~{(^{XY_^*C+r0 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..7c239197b30a45ee2ee91a4527e4849e13a605ab GIT binary patch literal 4572 zcmX|F2{=@3`#*zWEEBR!W(aLEmMCLi2X7@Ym>Fecs~E#rvSiC^S4!H*l9+0k8Dt$x zmL`h6n2@mzSyF_?*4s!_|LOg%|97tIxz6u*-@p6Z=f3XeJmG0A#~Y+Sy=ZK)m-k;qpC=J?kZ2CV-d7-hFy@GY5qxWNYk_t^%4uYC=yS zNsxw{fQe8Br0=?qmulIl#}kD+(E;WCi@y>X&+-`Yp~I-e(x-O{`}cBpM6AVO-+-fU85Md^Hl$Ju=%r3&!?z1H1<`D@QS*- zUq32i`~&Fs(DBYn2x>+VVbjPt6V6M)6e&?egU5(E-b=m;<75c4K$evBOY)dx-FaC% ziY$rf5u)#1zFrQgN6L_h@BYfyNoNRvL&!0mzMJVtfdKu&q~0rEfs(OAwI)2t+2md! zbX#_a*Z)uj<<>1}XB#c%z>spp3_+$`I0M^kI$=j+-w@`}vYOJ99^2(B2&}i80uu&e zSd*z<`6>}48al+ts@J)+K)@&&Yp$i^cqljwDy(3BD2@U_LszKQ^-!i)6FE3SSKgNPf|>o;`Le9BDtDd>lt4}K79qKC^Q+Ao><7Dvzhp>%Z{4icPY0KW3Ii+_%9me$wF3U%nJ00W%6+zQ{@yQc*-7hSzQ>);sVP z)TX_{{L~DQsJ=t}<*^raG?MYj-XeWH%L=xN#D)jCrLJ8M%-@!O+c&^KQ!`AWHmI-( zLq-=GeA>4C6)#czEiU z{Wzt>42&S}Zc=-9eS!DTcjDh=`?{`#m#Wn7$#`Kn%_WSt2K^pv${w6pQ})@CT8_&< z{;Z`o=4b!Lv=w6bQvw7fwvp;5-7R;{;=uFy-`{`O)+b^*=AA2u9pS2Dk(U6g|8#X^ z>i%vSO6>UC{TTzzyNitUOXJ>nYN7pnaml9O17z@rZ|!ENYv#`5x`CK$)GN`2 zqw|+HFT=G`LN2FqL7!v@pO<_KwoQZL_3&_wG4}@R$JzL1?A7-@rXNS9Rn#v#r*U6y zRCieD{r!5{OgBDT{qhudowCzzKKi{_TQH$3e@#hJ43l?ypWo|OYt8<-@welgTigjt z26~H!!)NO#%vG&zGT${X<}bxdqRG-*l-R2L=Q~9V@#Y=judd-*b(wXm%WWg7W#?o_ z(hV-TXSI%PDvvA2frDI9@o(Ighl~}55tL|egaWJf&GZM;`(AV4>nro&hWI<)%OowS z?$s}jb2+ZnqOzpRM1#J@v;TQv?i8|BwU3acwq4+roq?e6{8fgeb zuFmV=5>=b%J)x+M%?5WWgsE+T<*T*Bq=&F^+3Ep3i6P44&!R7Uk=7r#D)&-wC$lr* z!{e1BV$aNmnM#I?yYj*1496i#-U7MObXlZQ09kG*q3M+xMI0 zPHDl^M<0V$yq%IrS~L)y2*Q=p`NyU?)={F9x;y5CW0X80Hh$Fdsyy`6F5`^34sU_H<;1;GXCuK zed}hNJ?+!;3r-S1=4fCWlw0M2L=lP?MSONO4tMcz=Vonnju=J2;CiYAu*F?B3QS_d zoC^cxcOkRgr$YOn1Uk9zG00e(@U1~FUU61p&08M!mB^a?Cc(E%y_M^csH!2LzU@QJ zM|3!n9-VCZr^X?}v1p+%$a3^oN05E6RiIgN*P_CXy*34j!kZz8vZO@cU2ORS;z1M|{0Y{!e`dO4@s5;kKQ7kF7*4oU){t=eM|1j$Wlwr@6DsAS% zFFyf^xm+wQfaDgEXVnIh7O@CocNDc-ahJ~}oLJ$y7d<`hI&@~Thbzo(hB7^=IwC$2 zSK#W?&A%`YwV3H=)ih{dm&LyvOud@P^>pM$_vdi z0*wu~tf|5z!StWXB0ex}8Be!1*WT?R;EVsk9hU8Oi%inF!8orub&e@$>?Fy;y;Ise z4SrpO6@u@C?nP&tpnQx<(hyl09$p7x4gjsq@*#)M(FId)MewaTWWuX7YKnSCrglep zQ*Eo{lFlV4G$K_<&m~y8M2pZD58yI#lxRt=v)ZBgp%5DyNdH?W{#D4LVBz%W{~J8> z;@z9_R@m)$mpa#F!P_-Fv~oGhIdcGrwx#_{Yr3x_+)Ow!nZ=j0#?d$cHr)gT;MD(s zKNiUU6O8bO#WaE}31FaUp!LYkDhNugG@%#TsK!akH}$Q!Lm81|JvH^!LZZ~loW`;+ z!hSzaj|rZ7^%^XB`q2eic)UhU>wg__22!>flh!m)xQ?Lcbnf7wEJgH7W~`vr>O{U! zO@&n&LQwTEyr%VLEVIZVlWQeZlVg>xilKvQ2UEPd1Qk!DAj}f&sG={M zo~}-d6K7Tn=_yDy7?A`&JWTmT#)u;6)_u%*f|y?WrcNV87pW(Zm>yF%dz5se z+^FHV4&Y`MQU(1cPiiP-`6dt-&xt-nlMe!!K3_?y9EcGmZ#BhFPB(0ivnzAtrJ=NQ zZXpE>-qkZd%J4Q`QzVs$%-nKvt+8-_)t1h60Cw>z=M@G&G(~#e|5eB9-W9SYva5H# zx@7pfmvHERL;EE%uVd}ZT`rnu2mVF8TcFA~?S`7Rt;8?uG6C`7yawMk!_`%bwY`G6la6Qv zCh*Ni=b!y6Bt-A|btF`WzUjaoND;CeFK`JuIUOG-hEBsg27?m_OUOw@WZ#wTz<1sp z`yXc@)*=-KPHu!}t{_*HQ~N8y7{1kty+{fLEKje^qeK=m81wo32W;ezqz3EB}luxv7g@Kzb)t@$!6x(uToDkOLVX*i>=BQSvSuMjVnima2I7_M<0` zS3WB$J>%nL2Vru#&LL~SuKjko{tQXx7c#sZaQu{;LOaU2#N?xaGM`QA6|BrKn@;w# z)zuSs-=w~$j_@P0Nzk$W))UG8j9tu~i(&78vD4MziKh1$6V7*=V#c(-nSx@j$`Fj7 zR#gp@{l4m!;&398HxGD-_I z8}+Eult|;(h_)a%`-zs33;#Aw13rP#y=Pa^8B*7Nx;M9wNxA|&9a2NoxYiQI1Krd&37{Z!r*pAKQ(AnzrfDCr(bu#Jo= z47D2FFwD{0tPzfn!3UKpp~=EugNUpO_`;y!V4_#o4jk!!1VjIo6^|xM@~bK6cI3n3 z6L#Az;O$Y2l4Ko2ppzvvz5W{XK-wP4DEZ@y6`NAYnh8$jU4x@(@72>i%EJ?@A{pmJ$EWMMAmIcVSF@aNt(I%nnDCPGbS8XU;u@WX8W)HS)2Smu(}W z2Bau_Aht8tCpDmaORV{9Ly6gms?TSC#OSi_&*M#-)H%^F@zTa_JRDlup2j;|BFprN z-&b1sRi1ci)=aSD6hSD{R#b$y{U|=tTiV6skT!WetL@FFEo|mxbq?RIhH@(c6?x*P zI)o`c_WVo>*ccWT(|EY%z(C`9C$eAQL*9WaZHjT(!^@*P3*TzQ)+ZXpj`q87KO0(- zcgn)2?rihM8pAcvJOD0bD0z5dZ7Zi+t<~I4;kIpmC;4{wDk=07yCUJBVqyx$>{bH) zpZ29nUF{m}HcRSy?Z?{>b`eURQu^c578)Wm?mu9W zCNE=Ix*7U13}SJn{=NM_YdodS4~u^{yfK_Qn%Rp?ZR#>Uj-&eSY;W$&Z5+&|CJ{5% zXMdP~57WOP9p^T2@SWA_UEiJLt)uq>tPX3~o}UIG4Q}{e((haKqtV(YN5h66CMwNG zz1Y;Vz+0*8>COwKcfB8M^lI55%qdDmKbrR2<9(rhVA!&mF5L5Lg$y3=$jsFbNzjTYaCr<*w$_vKO@Wwg1xKN0g?*Wa3ElBY^@noIqsA|zw7 z$^4h|T>;wXNQ;qd;kpz6^nyWL*zRpMsHAoIAiRi@x9r-2 zP}xQ4U*2K}ZLW0Kx@GSP-0-{MYl;URnew)M&zvtL#3?AKu2xkzH7wD$)$0s8!={|MQK`Gji*u*u@Wm-*ICiL}8!*U;lQw z0JL4bL8j!vH&)F>u@x@5ojAiAv4Hy<^|(()mU2GJ4Cjr13H)eF&5pa}lUJZMONcn6 zV;KK3slG$}<-Wd^`rjYO&@W2@w-VIi26QSkf7F)AW;d&HjgY+-4Uc^F6I%SDW-l?m z{~h+(qJV`|GZJipr&BsX-O0lx(O=|Ib`F+a^raMact6LAT zWg_0TeD_&qfxC-A+qqV(bze|#%f62qX4eM?@m^~=1jLpc7Ht)l+9?O5k4PfJ2j2PP zh1#2``XXLiv9A(|1zQAs83Ox!JPFZHsy;gsdx63`W~If}!v;iT^~f4#%tW?isR~~a zd68_Jr!3y87P&8CpTWL|belK#7|2JdqUCmzqNwWBtAq5T7`>a-mlcbpr@)r-HU#z^ z7_#oz{n_H;@QGq!HX^JAbX$%x6uqJVi8h%$MK2;eI9tL)4EFGlzmr_MJwR>w4QaXp zw)k4&@WT+B&!UZ-d1*vHH=1W`snM=6Lsmn+TZEEmuclb5Ur<)-KEp(PWS>7Jiq3T! zDDL1I3|`c*9T9Cz8&E{r`=xSb7xk)mpVqS;2jp|j>W%WA4%1Y#cc?6gj(%8XB78hg zXkqq{1d_HxNQr%BxLnx*rEG^ieDxAqW6CQ+HXo?lTh3sA4yqAD56W2$;}h~0g`HyT zMiam@A~C^cHYcaqYjGyY>sTfUty;F3B1n?A5WN0(hH`n1>y$CFzXeG87Yx6=Qg&!z zqL*pCRxgIm$9!q}@>hmGRn! zIxPfbnBjfr(#g%jafcC6r!61`t;=x&Vd>u6qV6c04hqF~P-E#`_;Wu!wGH@AFb-n< z=6@)y8JXcgre71QpexiR&w_FER|UK&$0$qL9lkyC)FmYcamfAyjXVWh$fg4q zRqdo0&4&JmHm#{-H<sMS?Lq)ta=0 zGABV-425mGn_Ktk#F2A4aa0@ND$nWLNKo7^0N@G$XsNuOM7t%3;QLh>RbAutq`+R7 zy7z4#2|DLz%WeV{V*eIL4tp=oKASNtj-IYMVLI6VZBo=}7m)DFb|k3%;E3q0Re*o2 zW1Ud<$@>IePi8;f3lG{zEeNsDSXAsP&KAYgCd9Hop4W3DxXk6A$ijCMeKD?JFnncs zzzU?OK*Z&G+m6r_%3nm1yo`W3TTwKnAxx|ZOah&9Zg{6+jh@84`dD=AG}8}{0-jK zHwIO>i>X$N`Fru@k;y7CE)y8dPSdMoe}wh7vs)@?4QYqGltHYyhfRA!ML=e{pry`b zN<^zfFjLzKM}gK}BPVun4XDM~6iB+gFxXN1_F-xbLYSC+-G+G%*}b%|jN0j{f9jN}yz zoZRbWCYV~y^Zzz3>Q4q)>F|i8r*$_pS4o3RwcS8dY)3vud>2_Ig1x&)F^al_D-(KM zOhgx~JVCuR@~LFiy9A!(M;nk^LTItn$+jqb52&^Esof(Ma&@U8VNawkEd>&!j8l4v za+4KZxJwvwomD?ne61VPv5vqHm4}x>KjdqVK~a51nfY^H8m_V<3h#S;s`; zqQ2p?Ba$C?0{qC6E2+Q3N=rb>=#vv^G4CF{07{qcC=q9l_WH3ad#KV%m>W~uQ7070 zTl8>Kkv66!8ER=Vma-C|jJm zBEdwLR1OrCUevd|kI!8NJojDwkWthY^?-T(ASu_R70A=tJ^9P>$;w5vtfGDN)!=DX ziL5`tNa8ictQ5CCh0$~xHu%7)(sR}Uoc&G9F>VaC3yqM}r<^O0kF7s}FX*7**(v3WuY;#p4C_JQwV`4$;bdqb!C4GA_j2n{)5^X<$-TCK zw=rNvI39(6BM$&pT8YuJjvmU@0d?~_d}qw9peu>qt5zv?_vVx+eK63nIvKuh0)lpG zKV&qIZj!6Yfq@;^z)&Q6xO4r9rxJ82Fm%JqucH_RT{=8}_b7&_bpa5R-YUnBS{h95 zQ@))^sl;Z`Vr2NKSx=nmgn?-9&Ph?aWR*uk$me#Ub^@1#bKVH7Hk9ouqGmmhBedax z3r;V`bZGU)0*h1ofydOSBKna2?h)Ejbe;$@W3p&R>o6n0}8Ao7(spR?rQQ55% zxI+sB)Tg||vn6GYpNx^|)>n=Cm`!Ng1gy+{rsFkqmL~~5i+!g%)bYNj;V2OqMo1$c z?M~I4GtUl@=%11dbM7*YpIL7L6WU zR6O|oCoqGSicN79D;_*8NCqzrgro>+w>XND=pt1|#E?Dj+_iznyXu4%s5=Yz_UwmY z09Z3s6gd3shix0aPLa1ATT~y(op!$^2t-sRG7-mPWKRUyXjo_zb_(~v5Rl);6f(jU zEpYZ2{jx6cQYLtx7g^He_IVm#Hk#GXPlg-gY zW>@@d_no*BCx8i|uy}ch+SR+YHU+giJ{h6(cw^83i;0tIcO1EE>J+^WVl%i8@_vq< zVue`LAg|pE1CiVZk7ePr>B3t##eD8*y|E<|Pj|&m#cka|rqM%prgZCBN}D{z5DS7! zp4ma}FOc4=!L#^iqo3O%)6Gr!Z+ zk?->i5;D86nJ8>e5au9PFjZ7A^!+<+?FszHU0?$rbWc~ipYM58tC)*`>ctffapvLP zFO_q(!5y19zsO0GZ5awzWr=BDfT)6M#t&Nw8k*l$y%?Rtth8S5^qnUcDZSV`7K4R$ z8Z7zJ3yN(03bTqTKf?qfl_+n4`;v=&?MPtdpf|5Tetg~Kn{tYFRScnA9c-)Y5%Z_v zQ65q`Xbh;Pn~zB+Ot($xpxc>1)5`*lvS^5K3Q;Z=JsLg?2Xk+WR6{1V5c}L}Pii5z zhU3edDh?su>qp%lIfs+=tm^>*_MK6(`Ak^O{p=x8Ynb{>>lmJT9w4UJeHP{I2Ut|k zq0z^?P6<~do-+1&50E&xT9i!$l`wNt8UFG-u>Y3eNt+~F6Gpr=hDLv7GNc9OII~0m z(`Vl-$qx8u>ev?%fnSuzc!(YW`Cw{Eb$?A>@$3lBY~dt-E&eh*NJMb*lp=l4AyGsv z-L>S?;9-d@?|fzYS+H52Su}NX^5gI_%I~q#!&=B#5gV&c;1=0!iT%rzT9U8}g{}t9 z9i7gtOo=>JKR;`gbX>!v2GLW%1yZx;8wQV+QH*9LnDsTW)45X)Hzlpl>MqCA*94hn z#e9rVV{Qw%zIpz`rxo)_H?LpqCAoe~f1T(kH^*B}C&H!Np0MN44>LX^JB8l&%c_=NHGf z!N!K48hbXDa6W$nj5^C={kR&TRdP?<*34}|J+|^675kU5)d~cxpN@#6|2a~ z;3o0Fsq)yEHH^;3VSzH629pOv6!Y?^i1UoyuEUD3;R z^j0zgxW{*RzTRI(F|L&>9$4PFG5(Jh?d8E{tm<=I?=ZF3M}AM4{;}8y0`9J_DY>rq zE*FLe)w&ets3l~{T4lONCl<#kyPqGNejLA3g30brgsoY3mTEhycqaZ)`?DiI=Y09B zpgVH%RmxC_>6h_6Yrl)6XOBppSATlj{b5$C#T%a-MrE1o4R`B?L~faox|Uua4zII< zPX%1ZbkKI$A9ls&^V!j%`>!69d5({f`cR%y6k;qPR8$$_3UIMC8iEddydV|g?{Q&tX^W)#D2rM(M8q`!7i2TW}n0Pw19{R(>IJHp}?>}-_6hN6F{?`HtI51GQEy=`E>6wzGGKV zJNdQIlNhP2BbwswQTpvfR+t2K}Qyls6 zB-OKiHimb?C2mwMG0Qt*kS$)YmqY05pq8*awMGr;=J#ynmzw42xvMr5SaS%=1I@a6 zl3F$JjSZXBrEb&#iu~+v6~&(mwf{17>Wv*39UcI+m#%W1U(pmV4ejk7YSEaA(& z4`K2xB}-Qj!y=vsiaB|CDlfUL$5;GjSe}Dj=+Tka4Fba`^8Y}kp_mzNZb6W}xw$#61Ya1TsG6mG^&W6fghD92nM_fgrJV3w8RdUW(C0r-Q|WD6 zAB5lIlB9eUEVIBwj%^TEJMs1lYgEeh6-a^xzoNm1qwKSb+@QoB&2)i8WSRv*! z6%d{wms^5~(G`Ohyuac}nHy7jVkCNla42GIk9SD6$fwsS?{-@rKaNLVhoghOi-xa| zzNtvO^OkyM&fP^v6qVlBhe@I^saVP4fOi(;s`AnXrwqTopudt}?hO>s1g;2CZ~FzQ zD419L1&8L{cINk;q}cN>iV)&GjVU{Grp!#}@LTqGQDl~JAi3dhSGFar^p;?h{DDJe zImx3IEXnIWl1!x#7v0ytGg<+c?9NRU2g;7&#Fr4)zb$oXoN_|+!DDpPhd-u^_8va@G;AqCFN>vdS1n?%l3=TkY0`hnatN*vj-qqz3Frmn&K|5g zfk#Sr0K~E?L8@*6ug75N68QdtB{M+}6=@;#^hh$uIAne2(Wu1^+0TXaHrf?65MQo( zbGJvTc&s9^=~=5KBaVQqSL`3${632=Pi%_+WCQ8PO{D%YhImWZKq|n1B;^UnO?rs6 zEForG<4K~nt3oB~{zbds^*r{P9V4W~ihuTNTh32)&BySVw#3lxJXR)~>)xg$os^#Z z4EEjCJo#_Cvdxy-mD=E5ci z+2fH~fRVknB(Pp4-#F{>(5H?-0oT<0IW<_F}w^C%RQ@tX8~D*KwM^bk4;3B=f)d0{I? zmbMUP41=W++a1tbdm?lhKQ+V%dtd4C$R?piwdT|QXMkvxtx9i!%@BQa0C7tBLj`cc zf5pN87-L@}2C{$TZMt5PQAG1^3-j%2TgF|ba#V2Q(+Ak$wU9%n-ANw)P3POUkJ`_I zr)-W`LN+i7h~ajYJ+ZeN`4|AB&kcin4b%=oJt1gJu$j52FLfZ*JxvCON{2FdO)e(P zUoBTO5sDa1PKY^nUdrbI^~{EEqoOFct6_YuRo`ptv*7B3M&&XH9qcktT4G@?=~H>0 zOHgn0O~^VG~yqEVBF?1+GV8Bqs-9kD+5CLfbuVwLwbiFB2wZW*tHSu%B-{ z*B){>F%kf7-3g=h0BZ-IrBUe)_~}Jqmp*p92~#%oAvl5#QIdb&R8UG0C{L!=38Q5# zJu}5g-L-`qvw99xY2OGI9o3dR!4OI|&9Pvw9?o!LU|4;6cNP3m5?1COw8@Hxc*ucJjv8=3(O z7P+fd7T}Z@FKxtt-nDoY)sAl=XY2=hW#3CP%58+Mxsc3Zc*ucd+bv6d&+HE%N~gw= zH8zQX;C}W5JMJ-ICOGhgyP|T$5n49{IV1Tt;CmznV=$<)z??(gvU{jn>i9`Ky4re0 zGjlC1?NcG_eT<7&hi5-Himra;T+uwZj;73M)I-)k9#K0}6D66S3`3=nb4BGr(!qhd z*KG0!ggyaKfZFlt$kNQhDP8*ILx}#jT4g~bhpd*;2hfYc9!g0t3tYgV6|_g$mo5K{X~5jmvw2rjPd4f`+tPIPt?)uz$YwK&$%$Ta z9CFOUn&$hsz9vhi+R<7ttII3RzDpkOpba!&f_`vMjMRN`B;z^;09!=jkUjocw2A%% z$lVBOHs{4_DyfKXteDkuOK#yPU!T&)!NqfF0bqYG9xV0>;gE?7tCB7sGP^XAA=d&s zna9ZTRwb{J&RPpZG(aG*++LV*>gwhLz|HlW>J%3fXajYan9Tv2LOj=krUH!oI~s{A z5{0E0bt8dT>A@_0BqIsKFRmF~SWRmUV)XzCfR(_Kznvram4?CV#6evyn+ch=T$$NO zl20XdEk7(~UKWFL2yIg&3XWr9@>;=u70*?pm}U`As6$yx`}E~QRpR_G4=nmn>-#P_ zv6j}_j3K2~&Y+Swg2#|fL4K2K=qDA3f-!dti*PgnSp2C5;Mm=IeI2XQTeKt*3hgpj zHhmmT+?dLCcmZKF$`w6GQav?d&V=*HIj$dH^*cX|xGp2sq;Szq>qO2Bs%!Mt2YY0rU#hw%O z>3>Ktg)ZQ~*L}ugD=xz3mug55R_;MJ<%t4sC`PP`Z9U036VHvr82<5FEH1?!l0@{Z zaO@%bxe-E*?kbSq;YR9$vG@Hm-0jaQ3z7itn!dx<4novIUvg|=1q0(cN^ZCz?PbCd zj6zm%c31CZZEIdLc4wKnw*kX8q zGnw}>o*Vcdt~>r6flZK;6U>9;9-K`u1H%Cx{{8Sj>rn0%z!f0^Bq|{4!BU|AzOcia zk^Q>=ca)4v!SB6aNftA``uR zv2EQ5G)^OiVinw#fVlwkbc;Vr24i|T5%XqkF_>r;i1~CvbsEcxNiHu(EMB%8A@Sj1q=EJDO)k}dev$YE=w>K z59%soR&nJ!rf$IYO5+G=NKY4bVZdGfTh`@S`9OyE9;96zEQWG*?L)jp|5cR-x+0im zM8#rCTlPa4%X1@kW$}W&L_v`RJWL-nC*b;$L5To~TnoSqt}7iwn5Ts6Ckf+DUrW1Y z6#?L2*kta*Y}Dz#G?;&f!HR>6s3sWp<18s&07vkbaJo0TZl@ZZHc2TIrq z%5@*%oG^Mq#0Z=&chQ|&!QNuR6k-(&=MvUlt$TR0Gb84wM;%=?h+@u&9%?=z2{$_d zrruYZuWg{N0>^o%x8IX@Mmaqtfd&%~RRrG<8eS-Y0N@^3#5m$`_K?8@Xuh6C`y{kT4`o$FzsSf6Ih z>6-!cv@uZnuE(F{DmJnUoZ%xZQg};(Bgg!{K0>#*#0ubgTM4*g=&nQ;D_0RXOM#u9&$c?t-+SM8T_(+2*hpPKjiytz-JHbN9fCs)9}d{K4J4x z3vq61Xswv|j{IbeE0%zV6kr>;PxGd1k*7S73>U#i)K3tXQevcd(j4+i3^lD1_fyyz zJ-G&OYZ0P3O*mny!5vKpSa~PGDT3jAd0cT3%*XtCczX=TOTkw&T6=bB@54TXUi&?9 z(OoHS;v~$t`0res$(Lu(gGr2qj;9VtGN-8DfHIG_q)a%yZej@Dn#~VXUhKDec1b53 z02^S3o(~O&%N7T~IjFD<2)%negCn>}U!+#k(!2@#T))@MLKgdc-3pxOTT6`#Zd>-m zb02q~0EMU}o;YF^c)^&d=1@!5>lpF@e$#zwSB8gwWf>8fOg;NcEC z@cc6zSIhQiwfHY>li(X$#e(}PKH)PZUo1})LbU<~JU7zSxS;?@K5K_FU(2$TcIIs$ z(b#7YBE(eq6a~>m%6qso6nGMSf2G}(WJW$X2EN{so3zFSE~Un#A>i(B-{$g1R|s9ktr~xfSwv9Ylw$e(fp5;xs2BBnSqNzg*Ps5Jc-dV*b<%P>pWaQKJmDjyD6b2l2U z7r^Pn^S`(Uxr_V0fO1#%3|#sTz3-trw#IWq?*R?LT_I0rSJAI*@Tp9|G>UE+z93?v znD17htHcCgQCjF1w9NT9{mN24OScw$M_wZyRP6jtl=B6Un ztM&CeXx#}lL*o|mmPFeRL)bO?$@X>6g!BxEpr^njc!qdwmLjoP2q7$w3eQW3&EOqF z$>18F%UfrhA8}3R_Z1cci!iznb*IE|HH&fltZ3c7}|kpmj#az&;5z%iqnvtRBo+k-)Up!((M|e zu?-QraEv?MvHCgof%;2&@r|i_^}WEUjWHhH0FLwY zW}^y$HQe%TChz@a7*(?vq4aIBi$|}|5!*(q7G3%?p8M#RI`HED)7f9|RP{X%iM~;d z@y49UDmkulazhd1%Jw&aeWQ%QZPfmNEf6e?ZH$se)=sTHHL?>H0hwjJFJx+Uq9I&v zBw5AHgr;}j+?dIIkzd>BuKGj_ts)(0KC^#ISUh*rECj%pK&hTn-J9A~eJYn4VSqFr zbzk6nh`#Bd?Qg_3N`Q3e`SVp2dE(H5BzI>gov(Uh9C7H5cg);AY=VT2|WZPl2n&LjgsF{tHkSavs)n|syf>nG;Lf2~V(Qz=RT%rJK46(1` z2S~ym`l!m$g_||{@}{9eGP+2zC3U0+-2}xo8Cae2!T)(TMI`Z6ZzX`Dn8_udeXxdB z@gW)<#i7;@VG{0QETf3tOQR~^?i*qV)lldvbP3ziHYEGP`wGGjX0xBXi= z4xip#)rT_cpzH6l$hu{^#?m0p zRgyWX&-q&u4&sN4{RyU{wP0~OOs&!@^P`qpM}Jga*5K*#?@ZW{aNOY_u;CGUUV9$ zN6Guz3Y%0C$HP{Dx|kM|{Y{u|sc*UaqM{)erQIbWuoT{y`k2XoyY#pw4msa_2)%*) z)ZWK%pVLnL{y+_~aOV>nY&AN{gbuEO-9m4{nieZQi zuX1kW?F=MVzZtn6fo-@5=4;VHuR~0Q{HQ^?K9E)G!1_aexq&17*nA`JWgxNVIVRM| zlN!FegiSeaHF#u=(^Y?wJ&?LtwyWeZ*m7e>0x!d=g>dp!3?5x7d%m7la{3-DY;KEr zyK)h-4&GG9lHm}Ns(_}(6y}-#-3LH~fC(D^b*wz7v8e(E1G!vf5g{s^?(P%5F?1X1IyuIJdm=(1o9@rDkXQKq*N6iyL4y_|8a zjb@~SL0Z!uwSTLy={B}s%Jv~wsLtG6z$;FF=`y*vBLR>BZ;N>}0d_Le7Pa3VlIr>6 zLfwjCtgyoNE@v!lr-d%5f5OC2xsW$@@6teODkc%CXfe6KgqfW(4olYrSZ)9n$;WnC zZaw6>v4udu=;fh<+;f3Mb8`$8XtCSxBy4I51QvCl?qr2#lC(CKGiwW>`xc^ta2<#Z z_W>Da^JYi?1jYOPhh-TK=3G;6`$uBk?NO#SP(uJsXdeQDWp|!dBG%->Ehb~{w3lmP z7sMN@{Iu>wv)9nljMK-E!QvTzK6Lq_=5bgpp=1B zR~ZeH`w%QD2U;%6pYk=mGyC-r_hKFp5a0m)OdRq_6Xr{;XdX>UMM?yf4-`X2y@kMX zlnv;Q(Z_M?5}RJQ@&Ubjp< zc_zv9^)@>eEF*$)oo3(Y4CMws3vNm*f`k0-7(4Nh3DdX!%?8LKK9aW>3?w#P_yp9x zfvz%_$^62pwc9`z^i7YIEUIrzt#yQA$2AWtakvjcCK-bFrYqR&hMA2Ckct)Ysq}67 z31R6CcL@e z1h_4Hw5yW0m{M*bG?daL(5gSvWPa?*B<=XQ7J7{!k>O(W7gWa2ZKUNs0qYHIH&BaG zpo;TT+efoPYCte55n<5$oq9v2If(%=v^neq_bVkrG`qNd5(;~LkJ_R_5kGbJ6NwMt z!o#8{P4Y?9H&P96vDUC@aG5)cJ&i_J@lYn|+;1uUPvyY!#?5$OngwAK(1TvyH`w$C zlnNh1GSW8c35eIJrAlvG2W|J`QC#=M_az{yJz<|#KqPV};Rhr&JEAPV_R()*wJ={3^fryeOl zk9ORbgMmCK+jT}6Y57#{{j)0R3mhO+?GF_xPC|z_DgAh~{Odvk9;7yQKT)#QcxFn6 z0Gi?+wNmzX3HEIu_Q@zeGQ)!l0;sW2urPNbTCdlPx*EikE*^MWuKK~nyeFRo8V7Fs?5D)pEopd2VNKgjhriU zs@pTvwAO@aLhj~``@rd1EWPbY`lS(vRJU3@^6Eds3=!OhFFr}85Q>yNJ}@x-CGylevN z6^*m%x7^vW4Ui1abpllOXObrG)y6dRh@)J4_p1E~5ON!;+B;*rzlP!wMBU!ork$Tk z2&{0Bv0wi51N&a~RQ!D)nl<``8w)0y8?->RQ7#P29QPPY`jIm)igrYdVQ>gFnUfwsp8x{`WYk$8 zDCw<;WX-lFSi;{xK0klBoo*?H))GYWRRlk$!uk?5%b zqcI7h$f?1cbPlN4-d-!C-!TNoM9O!+>5`)g&W1jfh7X`O(g01GBlPTOMjTwsIY1y@ zSssVh47LlqtMq=8C-OyiPrBVYpkWOtQ6F!sf3;GZVGOhC@26rDCw}Z6$=Bi#vd@TZ zMQqE*PW|gVMEAlERk9&V8hP1+D}ubN+@b!t%lQxJ(AM(8DZq73Usv@8^h54kmB3|< zPFw1(!lS1xahi7_b+Xe-H7jyC2D*~vb>?m$(c9(@&b?t=3a(P_vvGNaxTT;$havEs zKRmS#p$dIaU?pdBAg659;5rBo4wee(#2A?X`00ZGVG(^~a=%~fN2C9tgLzZ&Q=_$^ z5ja%-|yYn}>>P zqrF>3;#Xvn8eNWn%2BM};iQmXWEND~(7ZfRGi*Jbxbwc8CLM3RzVDOd?~p^wSf;FG zAqm-b_n?cd$Ws9toYvEy%0W3N6pE($(BurcBpc24+D83$Oc%_*99{;ksljV$He1?j z+dK-oK$Ak-p*i>X1FD1+S{c%pDtREmKgNi!rE;dYVkp9y`AB+qlu} zyBGy_lLWIZcXZv@zNp#d?BK>g`P{Snf^0ueXr}B=nhX1To7IlG@^}(k z%WcP~UH4AURb6$yPo-`a(H}hC#oc4&Tn7~kUWhGa~~xDOxRfggZUKv%xOMN-Gm zb^72Kj-_$7BY3}8`fZm6(=&7Oh8M$wPLoyG_h2vk)>B4#vG~IMH$3W31Z!A}{c-E# zoKqus$-W~Jxd!dRJ?tvc))7Tp;T3EOwjz< zvgpQ(Ba&YmRQ0!gsr@zPDcUcU-RCDr37GfkGU6G|3R)a{gET!kgwo2qyc3rhOp&LQ z6&0^TW=xgMg)dO%7#lJ-e@kr&rLAKx3zaYJ(m$J^4`n)Fb>x^>ZxK_vt-WB61rV zG_zmJ+w>O*ye}1nSEZ&dlJTiNaI^a3on%T!q=I!gY`Uc4Z~ww%uFu2kI9UhgHgcJ4 zUVoA>uiB+hP~0XN4&Aj5l6kDq3yM!ypJ@$V(R$3r7*;9UeD)P}>h3tO<=8a_i>EZr zEr>Zee2D4Trp#ANeBI1-AegL|`clA!;EBmINH!qtjdN=ZP8n5ye i?&|*^|4qJ_7ngJU(tFQ;AKVKOa*T2VD5=NznqEthh3|X^hs}RYOE&HC3!I)$w6q0x1 zBuiwFWyX@9oh;A&^}K&P*ZcnS{PX_vd*8XPx$g5lpL5QA?&X|w-*=qZSwn%%Vw(W~ z0;f;unFGL~4*x2fxFP2<<@jyb@CKZ+2?9VEi~Lci%@0gLCMw9>@FaNIyqg6-I6ZYt zbO3mj$hYFm1;BRB(|S4<1k^;YNvy+280|05$bTf^Ew^8F^QaoNzy6Wgwng;nc`rY2 z#(^6r2M*jgc4pvMM)I>7e3ch}Lh91g^WMcMP7Wm{hv-HVk>nRQ_{wCiC$!sgJBCRL zcv~ZrdG=z%0dG4>3{s%Y-72*dwRy_ zN#oq0RoJ?*w79r6{$_gElto|=by>w+BXL%%8U?7m>1>u|OT%=~4jpNin;zTLS3fPC zoeQraVmLvPLlN<;MN52XY}PX_(;ceVOKUHQluiFYgP9lB8m89$GbfE3EF$x6Wo|p6 zwJ8S;!gEE=Z_bM2HYKsx^?`o=7(gqWeLm88Kv|6>DfI-ATi@!!0~W)3*-OPfF{D`D zXV=~`NKaRm*s5XxygTF{dhPL~w`n1rk(epp&f*3%FXFkGZPtGD{ULxXHuvb`=rb(g zJqF-VHTj2#A2AZI(7@PC)+d&7B60*z5aI)A4}~nJcE`)zp0g#c&&eTp+t;-~<^8+D z-ZC5;mvI2(4tC}*1SANlV?(M?04F~5eU8V4bH9wY<*S+AEoy*<7k?)9D{d$Kl#m2N z95@-gv}nokX$x{sBYBPTCbD4nx;)Q4M-R2M{!8E^u|0aE6}L_^6QUdrxpT7<1w0CV z_}{%QQ2k^s6M(duBEgxVoD}L&PZSUcd}{lBc_7;tEj#OfG>gBeFsAo zMxzbK0Wh)fga^y93~E z#-}QkYj!MWS!*pRyo^}!zWuz^-x@zZSvB-K1v9yxS$DCPRn#8>$6jG^a+qCTcSo>! z-QV86FScwhp)jdyt!HuFv?8K!d*-!j*L8}+YL=10MD1Gj)2K{e66v=mi4+#N-rQ%o zj@g=gkBLeP!d}u;AysZpF9@7mS^nN4Qjqmv`|+rQq@QD?;kgG9VM;gWZMIw!Huyoe zh^WwrJKQo|^M@o|>_xeuQ%kL^>?+jME^#yd{9d*A9Ju&){p zw(O~u&F|HwyPoFTn+~nUp7);{_}mrWzO8)-K)tc#L(P>xhg2fitB3K;c8?EI*VT|O^ITQgJtXCe%N3#e7=E28K-EqkR$piTu=BS@y@UHoz&!&!w-vVg z@!1iPJlT@b7~?x|M&xqP_u&5W7#-^P88>qAn%yWZnpc7>deGlNPRDS+<%gQQC)SqN- zlcS??DEFe~nW8u1vX)I3XyZ^KBN_Xme*Lf1S0Uc}$sW*q#gb^QF9!&~XL{v`|A(NW z+8x?6n*B>vX+zkca@W{w7as}%Uf)P{yjriHofHe{)2hBBU0F3-wI!f3 zw_WP>wMA>xuYCk?*-T1J>5#4_oZO;I=9-Ap;c)fr?HWr?i%vuLldrtqo0Q5#4PUfr zEb-^LBBV~UFTKw-16M1k&|Vz%OPWBg3|^UA80=Y^1Jejx0%3g!vxWwLcjxm5=|MWr zIP@ZMA`=Y9KvT^@MHd<)!}dc>^ISFeQhA&sry$PSIMhj#SHkIX+9Yjdn>wur*L!^l z3uT^BUzePCE&5?B9(=zF$Idfi*S z8p>4)=R#q;&%0>o!)oB`tENX~LR^-ZzxDHOMZv7V?jo%&;4sjzS##ejQl9vkH@lbK z4P9`sxxIfu*7`c*8AqN2L#*3y3LHwCRQQ2jSdUm?>Gm$(i?K5HP2+`%0WYNq8M))7 zOW&>Qwv(3HwdCo}!_eoqJbQR4xd)9b5;d01!YBIwaAcf>R$e$%iG8+89}Qpl%2N>6 zoXU}5Fa-)j=kA$0>^$M>p4hxlxA1AM;(4|=r(i2_gy`a#BC$TErPQAD7sBuzODXlp zIqJMR)u8nwV^W*JE0I0-=C0;7ch~7s(z-}Wv6n!oH>%JYBko3QbQ?*RuG<&lwS$hP zQk1E=W6$a|#A2)`dA)=n=jVsHb-vueSN@u>gI(mQ2~3o2;hVb=bAzT)4M+ZjtPOwV zL3f{m-j#b)9anU}Cr?d=B7TF7JFO6<6u3kTVM+ykl7LMd0+m(=FjG+s*zA2?r z9>GHtGW-H+M`fzcMA~mq;^Ul%PA5G&=F$eET0GMYA@K7Pn?J$uDc1E&WJ-$A(KHOK z8EAQ!!N!aG?g}?-k^mv24Fz;QS(qfGL>n;+_NWC?w_7C90kP zm(+>lA)Rq_gHtvpQz!)&&g}S~&0FFV? z))rr=Cj_T5|Lb&(l)4FmN@dnmzj@kjhS(^nD%q(3&l=>6`@Di1x>7NjB|R4q%;hb^ zenX~PvETbJVvRK}_g|FF1ktGA8RC~yL-Mu+DQK3v>6n0@0wQ+d#3-gv3YKxRC^#~M z4FVZi2JA-+kBqDV(WKqADn&e_mvpr4f{B-w1{0wsG~mh}?-f^o8J{dCez8)`O9|nX zI9Dz~t=kPZhlZg=T<%l-jx!1{tjTgReZFrQcH2G~nQtA^MZGpprR~d|CvK)SXd~*goInZ`mRmbbhK(}^&y=&cOrwduJDSj6& z3qT+CAI>|CJsfhIR=}^Pn^r#%8FSCXW@rcKulXJaukM~}`<&SGK2{GU1a|HoPA?|b+8|0(!iz1;rHrU$|IATbYT=N#ov z3*4J2Y)7j|!&!LQmJfKqU-|?KFVs>jf#na*kt1#ZDAX_M)TtOxJwz_>DsrPDT!Nt0 zN}79hfJTS!Fai6<2T>p+$GWV6_Abr2r9Vs#0FU4AagGv7gf-Zahkw50XEQp(@jIIf z(8gz%P2`Kuy-X>7!393IG31_{iyV=5o{nqg(O(8*{_mIJ6O06^+I1%rBh&8}a)+R@@;KRx<4TmyASp$XU=sdj^A-P|4 zEdX>+oL8(Dbm4d9GVOEiza#;iM^L_SGt_b_Ns`OxY`<8z_d?{DSMU-1^{Z^=nncYLS zv#nkURLom5F)ModK?Ak_u+W1e_XthM+u?uzG0P+Pq&kz?_H_r(BG_sDvwAO2Iz|2y DxB6~5 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 2.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..6cc6fcf3c95492e53680d03c52ed8cb34ce495b0 GIT binary patch literal 2524 zcmc&$`BRf=68^F<96|`ftRR;=ShrI$W6#bYo9$zuTXlqa49%>QTK@@? z?T2S6-Wb+)kUZ4*F-KF~F-UCiTG4U{J^c?=Tozgq5QQMnNmt7=ZZkeuYr||t9zU`? z)G@fEY$AFqEuHE3)LQENIpj%X=+~hxv%&Sm`DEnZpi@Fjr@;H%k!1FuYf zjRk97|K{GVQE1bmF^ikmE?=um_4yKhpdlK_D5%Xr)&j|lacz#WGuAvc`@>O{ zPGZ0E$1BX)*VGMM7t9Cug5QC8K z98Zp)=yT->vnn-!sj@B@U2kuR7!Xk8?U5L3a~^C&5s~Ngr$Q0VK&f|I(teW-zFS+o^o1kVAN({j($f9L z3mZS!9jAf)V!@V2W=QKYHxp~m%^Pjh zumX0&3-!h zq>pKKD(GvAo%N5Jjf_0-F05(~uN-aSdFwkjlS7ZtvIfK2)QUCyt(eWM^4%0_kCvZX z`?vn;G9L={WZ_otam@0f*I768UGdOAgY%c?{5Kv?s-+^sOnBvo`^Q0_4}M7;Cl9tF zBKuOCmR`|^W~$gF5u3_8zj0wY$D>FA!3?Ic2`n4q{ErxE6V`;==CBUxA(;B+A|z&X z0QDllBNp!jR^>lQ^sv&gZ&gGvB_pN&O~DNg=JHt9%4Ze=Y>f=d(5o%sqyw@^M!}@VjgW@ zrHcaMLXxkn49n)mlOpCf-dNgk(Ef1hLQ-d%IFI%0B;)qM75x+1d<)c>J5d~skf7Be z_tSfduL~CVnKFs@2b#=zfx`ZzO5+d&SIxh*QX9dIqjrX05g#J+rz51nuHcWepfdst!vgnN4fBbMjA(*&iOxRoS}e zHK9e++7~5PjmVD8lq1~*3tLOw_bbLjRGfNjzH)cskQn1L4`Vj+&%Ep@u}TaSR5huU zm{NKl?>h2&W%PXW6|r^tTfOJ|C#}JfgnPveBv#sBfr(#MyAtIn|Rwx1bLR!hpG+VaubB`dX zruh)OskaG5o>))v6+rNJOp;N%s$SJm6jWlCqw(G%NX{0~F#q0*aXCj?J5`hqf$2EJ z7Ty6Y>zQ21H#Jg3jCyO!Zzs)WMlt*p5Tg^Xu8=KN&Ozt*2#K)j$<_a%+S(v047H~yr0JE6h1 zz3uM|I4z!czW70^e&Ktl(Q-Z|uP+5mamNL*yF6)^s(<(kckv%?lD}Z@|KD=Wt-fR; z>y@0Lt*($pazh7;#4EF$N%^JCX57Bih1%ZqGlu?h5qqdN0eoza(4d~~UtLV@2!=Wv%)x8!Ed zqHZlA*S)uEEXwP0tV~$zHE-J7-Km=S@m5yLct#g$2r=Zhj5ZM()iVvf%{a!k>2Siyw*Gj))&ByuN1#Fg literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp.png new file mode 100644 index 0000000000000000000000000000000000000000..717ca815a1e02617dc50ddbaf19b6d05662f381b GIT binary patch literal 8550 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 sbuA!s;KX!%c;Q#;t literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-github.imageset/fui_ic_github_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-github.imageset/fui_ic_github_white_24dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..aa84b536ca2c894f7b9953519bb5d5bdf4b158bd GIT binary patch literal 6636 zcmZ8mbyySL*B>YdIHW{UK~g{@MyJ4}wt=)G1|!BmN>V{O1}Y`Bkpfb}B&9=`k{jJ1 z$d?kNWQ3Hw{QiCK^PK0N^SLMPbMJHSIrq77PYrbF={V^C006z7F4!0Vpa5NwG!69? zl73zO?5d;n(uMl~05@6wM-+g}Z1yXV!pB%g6YzPEd*e#D?yLdR0062JZ=NHm0053~ zJ+Ox9ON#9u+kRuu*r7I%LL?4?1OvB3TK19&607LdfhfzIq~-Uf1F_DhmUunzlsh=rKzZm_ISK3`cG*5;14tGSKqQ9O*16vIS`~% z*DpE}HQ_K%{Y*dHkB+uZiF@&I8Dj1eB1wEV`ZKTqbKN2?grxr5Ri@LQ#q0jOXp$Zf z#ILk;NZD{7RrKE*ye5m+;@3?QFb3YO8J4!R#F6>w?UG+B9jwZ1D`pC26LbQ5)9!mv#mttnqxkJY*|)1H zwcKw5Yh&5%Wxmn@zg)pgze4QtzA_drncI~<`2+Bk*_dX)L`}1@JNjljDSTd08I^yc z#4J|J@8$bm+xM2iS5-QK+XqI+fxSJ3D=)d6urVL1&3NP_i}JAxwVy(6t^RLJFzN=n z18Zu}W|uTlM^~kemp4ZRMX~7CFD2g!krQ$8kexo5e~YZADzSXpW&YDN0Y6QgXN-Vq zi-d-0XuDX(EbAy3E=KIwITb&PH;Vb>)rw4;v~!|1cSyxE!_w-npL{0z?w7waeWa1v zz?ywr)I<-;kryKMQ-bBjmtL+OF62GR!p&BszH*?7-Fh%AqkI{o^;s0;ZXQB$*4?Yt z#L%g1NHUN|-id(jsEcTrhxKAO6VkPs(5M=?o&hWRip8d&+NH<*(z5Mz7jiIk+p0hi z7ix=#zgb6H(H8FRp9uuzkcLo#Bf+xojtX(VL1PIaIFfBxtQ_l7xfwUXVH&?BB4%PD4=wKks}ux9>Wp&4s8mjw)97K^YUkc{lnAEuu{FTLTP3n zoLK&+26tpZ!=afI8*C89k@56qGIakv189(+Kl8^Nw>h1_529ldlc3;6+?T!>+|I2t z3UKOsCz`q;-KX!7lQZ3z*irtod^26BH?ljPHST@D-Gq`d_dV=501)}^!Oa@dWHh3( zPxq7bO~V8kang2}p5wSv>0mA&Q=chHDI;1#J2g>QgrouCBl^-&d*0AV&1)!|&+s`y z3F$nFgJOfDd?x#$%8VUhvEIinI~3t?F_8aX7MyYP=9VH#+RCZ;!VxIVr`)f2<2tI0 z*d=k!?1o^5%R(+^R*>mS-=>wgce`FR{W-)0>iWT>ma9XEXa2^v(kboQJ{}k4JX5EK z=HYAEr%|s5@o;k*A`{9uxectg5XI&+ah&DnTMz8H87#2*sq2pokJIReUmg$L`oyc3 zy&ExYDaUy*P84n@>V^N7GW2ioYL02d8Pz_W*PC)W%$CfbFP<;mM}0Qf_V*v1x2M?b zrbOf9Br20K(7TUL&oY*h9Xz zvzca=H>YpA5HIBfwH__7X5R8rRQpCJeMtYx)8bZb+-1J`NxWjU-IN;_`GvFkQ}IcB_g!_6*x4;47=e;(f?iG{$v``!~{AzpIv~% zIgpKC_e9mv2HsIioeP}!klOcMBxnh;8lq;FRHipHpey9!k-&*k3WW0-vZ97*Wt*P4 zKGk0XR+~qwq&e(uH%})xdLH2RxKy$?;cMf9wk?XCNl;Lrzk@# zu0gA>+`WO6My7ZEen z!R@fU_5fD4mzXv(KzS0F_Dk=zLsXIY57`KHWgc4z=H_dOaxE=A4#BS@8sEDZdld37 zrjQmnHSiZ*Mo$<(`~mkf{DVh}UOPJs4pB4x5bm${3LlTscPztPT#;A{;58BNq;Z!Q>#H5nfztYQw(oY;J5KDJ2QC< z0XY+peXn>u(hW<@tIVsqZ|QeOkT?lTLD6!t)1+P#TX$(n7#CzNm##HVqmAKM{Sb54 zXn%P{a?Dg5d4uo{ZE5tWmOTwVm~vc?#2Vdlo%Z(j^Ebxgvv9psZb&Q>YebzGK8 ziXrFnc=Z<@rjMqEH{G6MIdTMA`cCyU<(^d%SB|Z2orLG7;V^nN-=((w3gW)E?`ph3 z08iEyko6u%&m@+#C@7-U64lrxUStEtZ*WaLnxGUz*VL zmVfruza=y&L&7VY%>5KJ1|O#;d*%EKt7IA!wJsTIxcJ^KX+>bz2z}YVCb+8I5-Bj; z>SiT4wK-GY*@P!SG34@TLv8pd`AGFVX?VdhZf6rjo@{kg=Wv1yEz*U!kxH(#oVWKt z=1!@~?jDFv4E|#7SQO+85mJ-x?WJ@kk?>Y?p3hN%v^7fHZix4S-fBTOXi#NYlQ@z3 z2bkAk>pnbp6AxrkVF?PK z26qm#+~q)!X^Y>+jC|#-2RUg!3{_%gEEqY~N|nS~^4wx@7^{j`*4dDMFWJjFQY^BN zsJ0Hb?@ZAB$K|zj^*{Q`7m>vcRW)jq`}E+DXFR_Gr+?_TSm9W!U`qdHY_&b2$ZZi9 z;bAowAGlDHSyQxWd3dB8F;!({FU{$bfE6n?=UDPWw5_)P~u( zp_pfGT^YO_wkdVFO?cP)*N<0GC=E_QsQ=NO)5~?k%2qX1vUdK&HZs;yb}O(;l7FAz zEB5_0C?z%or1~N~jU$;y9hq^W2IAXaVxXKUT56!Hk+b?sdj8&FreTA2Fh+VtY@sPQPF% z!YIL}Uln3Fk{PJnTFQv7)7?3~abZ1Gq$hbZER4x-M~IhpRup_S|B4YU*v!r*)Cw;5 za-(-- ze6@Eo9aX!uXQW=1Z3!|XO1>PcA`AM?3=T=%TS95aG+e2NJ{}LG=h=zEVVY18FqpSS z7FO_e;|BTI9H*Dmc0D;*@VpUEyz@3%z>1!yHFaSnD@&+&Z7RpTwoOJBA}8A?od|=D z(AVbeEsMu)S#~AvZr`{k2KvJmyR|=_wy)gKj5P0LmU&N6_UYRjEur1+9q@9R z9yZ1zt-&73_TYs>wzDobs`nEVd5>j4stl_0!^cUkQ?^?`kh`n-hoS^-CX(h*hhXXK zRAO7DG|QsKf7#*MKEvc4Zh<5JVDY1iA~Hw!+-sU$;O=7?3U|v#8u;2mG0;UP-S~S& zw5>wFp2K@Gq@e>5VL6dsW{k?_C&e!2)icX&|$LS z=Xhpc(Wc2o;7Pbcm)j;Qg>0sHMJ47u$-iAB={`)yRY0q zAUiio^Nv*^yig&!leSII6Oc^!;U+3`@&4*rzA*|2iV^xs_tZ_thTIbakK5Rp5r%N& zE`u$N`q9RZ1`z^!N(+) z@&xTE$!|6%NN~62LUnWs{j#9PL1xJ;Y;FI1TK;z-0ZNpNle3H#LUH2mLaf^Q{+RGoa(L6@dj+cm zS_SH6hi*Oa&CMoL4FPdoLSfiy=x zt3OF1T(a4>QTD}x2C|vnb=udJW;a&Ty`_=I+}+VrzR@VlTdT-Dff<-q2FM-M(@dZw z+3!4nfrI50Tuya_)BsH8^<6927}2dVjw9p0n>u+>fOS5-Ebh5SY0STJVud6QEk)orl+;CPSN$J1uEqSw% z&9-LHzHOx26{WcjDjEhWtAEiP6Al;;zR*ANV&2BO&&8$yfG#U}0 zeY7SHA@YR%5;rq^n$73JtYYUA9<98@$`4Hw4#a?W_fVEOMaCny6@tq~6-Q~-^A(W3 z%5P0Py+QhK@4M!~E$j<*gtr@|#yH1KvRh@oNnZ=jSLDL;1iV9`Apbhcpyua{`AsLc zPJY_d9XU)WG4w@_oW9VxS^KS6UNyL5SZ&?Ykc$*-04kSt$Y0|*6RI&pjCFkSTce8j-X2`6lFSiajVIzvvBXj)(0NPuCIDD3P;G2ItBSePEq&nzm>TPowBAEd^yOYwgDl4CWXXz^@_ zP4R6T;qlou=Xiw`*kf(6Rq%<)5iG-1zS}OwL>3L)U7KF{8Hx=zWxTKJD0eX*1kp38 z?b2~)I%DzF--Rw5YoQF8Zm!*Ov=z5vaa^m0XQ?=7Z+ohI+!jg?&+SzyfxvSzw#&L4kL&>_f*vSjT8k2MwR z>zeic0~K7XoW9Pr6chT=|1g@Ba^PvsiyfvBkJ?0Qj}&Vx?cJqppML6V@#vO-vd#gBiW0#ov60aK0xXG9$^Nw4&_%q0cv-C)*U_%i_4M`)m{`bU>T!bIXz` zp_~z2`zVMn(@5HYsJph%cgTag(IXn4eNr)HyI(^C%2#e0yo;9h)B03r z2$c2yS&ImO_X-igeBnarcBRSga4KA{C=slAC89OAHIKUg>lNlmwn>WnIElK&6yd;n z55ccmGf+G)e&+oq=X#xV>e{Y@j4+aZGx|BGpyp zp$cjp+^GtF(ET;O-+9;GL5c&V>G?@4ygQtt0JRxC!^?sqR21FK_F2gA(a%oNo@*Tl zz6Ix5BS3%cV4bTL6T2k~KXbw^pVhPwx>xv!;1Zr~vDmHh;e$j{NXehFMp{t*1=@RE z_^2@1X%~N-=)NpUw46;`%b(F}A4h+x_EA`ozOtIZ^)H~oB}qFhDde70Z!VN(Rt`jF z;DamUst$@gfL<-nw}QZzm57$j6_JtGQnTn1w8a>Z*s{T&fN~jq8>{%H-z$q4WPQF# zQME+8v1$0kv^lU=d^$s$)?U^hKyXVmNRwN?I}x{XuIwON&qLS(;71*8xYmnC#y#q5 z-;;;Vbe(vBwYf6m0>je>AFIE>^ry((G4@z`0hl4ZES&j!0OXC{ps-@)^hXs+!j^8c zBe?#Tfy;PG3kqn$dsj@RFm>I{_#Ou7A2C>3V(Kaq#YuRm&YBrgEzez~LQi-Yaa}8Z z)FPj@dVP!SZ6xvzlU96S=~qTBDuUZ}Pz>jpWejfrPY2v#Z=eI;T_2OUX zJ*#IyaM(Kz1hye!mR(hE-2wo4ho%C#JGx#BPDNVN2nTW`Oep0Ve(2=upk`Zops`}4 zaPszWV`4V#Jm7KU2Kn-NaBDqX5G9{$g=hJfatgLFR*8>ez2t^_chLK7Y|qV+U`+JQ z)z!dI7Trgs49|}Sz||h2by~2&w_dHQKDotI4_pG5bXU!M+pRIn?*|b7S;>IAgJ_Sr3ge( zYA8~r;}HS~h*G70%X#npp8E$6*)p>;v$L~1<@eN3UyJ1^?@<5%%k^uQZvsF=gntP~ z=wXioFkOZJ7(K38cmaTtKm0>nNszRIod~a+S{k6Ji*Ft_XdTt{)Bz}sVcNY-2Y|`% z>zCDyA0U>-_lTTYgK|?+4HE|fPsn<-OvehI*rAYY$GFc(T(;vwXwo(xBSix~#L^MU zRSEYK!aS0c$g6#?^758%bT2Rp7k7G3;fZXzPJ2oa&&jcHbg~1frke0dU61d%YqVAP#w}a6mv?o_(0@e zH&ls_eb6b5)#8JZzy4MSB1uROT@5q{EIoEwp!xmB`%m0y1b1FG%~k)|9{MuLc@^=E z0mX?=jbpE2joq3R_;DA{_sI15ADIXHHCqeEHB{-r*sEAZa^}q^R%X0jv3$Mj#Y~O3 z)6JeU?^rb_|2SxxGC@v>h6_rvA$H`5#x%Su9`#_V@rLA(l~sGZRzuq}Zg* zC$>WTRqjmemSmU#-hu;zxMcKcnmr$`OjxKVc<82lms&p9%~|3iscN9rnzTt)k*%F- zjG}GoUb;h}ngg69f7pLkRyZ!ooUZ-KH@WML4UB0Qyv1nn=p#fBFHGal^+(1q&k*C+ zVIJPir=(X+mlGGuX!wxHwfNwLNlry1M^WM}m&A+_M#B>*&Z#4^=z6M}vjm&2Badx< zs!pIHg4LjvRvyokfoXIJ4sU9G=yf4uqS)H^nBNM+T^oXq~5iUp4Y@xGZ*}iB#=KmFLlWc z&P?TUg1j1csOaFAgLH@7Zy%ryB~hF?`p%J^CLKZr9Jo4wVf*9H4fr~eip*|fL`xhs&?P4`U5GKK6<9<|L8SuItQ#`$3>Hb~ z5{_B%`1DwXr{QJ%KjH%%zjO9Yu zPr8{N3ZI3o(heaix-`Cp4Rc^_=pzk6qs&v)(T-Yvf+@hFV`ouw@zzV*O5dZJ?$Xx$XR<9t04r3cxAE{MCdxr z5Z>yoVXW`){=E55OErO7O0#)oPa0j1G>Vfq;nU0+Q%-vUda!nz`8H=V8msXb(h=Wr z1*oMrdn@bRUbP2$TPQs4orl7^h0V1eJM0pOxzX4nw)uul^yC53DMA}9O*Rw&9*c|> z8m(dNnRsH;Ob2A%4r<2*rv_G%r3TtKZ?P_j6Wxp?U$N(Ar5)hFWMCX7ud^mb0Z_Cm zW-VUPqhZaw|4@56IB~w6(_S?k&j>~zyecw?pi#Fr#$+Jpn;-DzuZk_z(c;ISXM}U* z{e%5dv6BeE*UN3`^xdwa<5QYzMRUjz1SfcL`-utDQn97e?E_=X?U;7E^dRaC zJ5Xae1P>I%emWhO{Z7G33<+|+S`>Vua+BXd@Xzgb0)?f(@O__m@U_h)TVzt4Hd^=c zItNIWiTJ1{!4t2Wq~?Eg`vR>laQe!g|4}V3SppHSTTSyg7?2e0Ytypws4c+v%_~O5 zZ}JJ#!AFun4*_KwD6@KBXcJj21E&fO=zyeXN$c*LCSE+`K}elWULufC)U2JzclorG zgZ;#1ERL|-Xf_-OD}*f>*uvj=a&v%r%2Jr<5$?_DpJWrl_MHR#9pvsB2)mez{Umsk zysJdeW!BM^B4efr!-AC8!}!oe!04S*dFD%V=@qQntW22NU`C$ zo|d0zfCP4aj`IPTd2M5iL`w48>j3{Wy7XwWBSK0Li@D`MTQkT7>;!DGNn2;^BEocW z+02`5S_CC#fZyY3GW-YEIwgQ}u&<7R+r2o-9)Xn9gvd2`ei26P4QRmB@2*d9l1A&h zzzcTNJO{TJek7QB(A=Za!R(Znc{fve<4{=SKP;s#>3f1CdtsvY^*|9|SX17kqLUq_ zTl-d-3pjn|9&wzH^|h#dbJ%KSKWu5Et}t_LfGC9$0Z`o zD_bt@Z~&*_LrA=@MREd?N?2P#!5t(8Yu2i~TkmvMYYNj%HrWuLK1!_zU{2F!=tHRi zA;CE@Q^DcD;Xl=$8^Tz3S9JICq6k^?X|y1TD7o18PIAP-`RdUm)$kusT>dca#=RS;W`^xj121q=WWTt(C+`xJoU$9eQ zhB{(*6e?Td`U$>hIOUxX`ID{937V0@cd zoj}8m8P1PBtIhlu0puITFe#6zEqG-~>xBAY`8Sv0>N%P=iNWU=q`xtt2=&)&tyCk= zY6IZnLw&-zaitaOIm5Kz1At+9;v@8qodKF4Y-=n|1MsFFloS;FPr$o?(Dn|$g|3HI z7ZfV!sIOX(X)8KB9WPi-a7rLRvTyRBSL3XYHJLvb>nSu7b>1L0m>Yl!F#*?CG4fk{ zC1+8DRK_F#taV#8_M5_yQl%RbF)}&1&0H(BhMS@t*3vi3@caJ1nL0H8@*jwzC-!A?oAJ=5(EsNirxe>LCbPI)bDSs6l;x$lu~e z?nl%DMxvCU9TJpiK@!Uav0br;U+i?a!9q{bgl}VyQdC^1DB>3O9 z@O3+12)*KkccqG+eentcUlD_!O zo*;g2t=2`uqe)Tb{3cLJGJ(mDsCA@^8aT(BWWL^xNN=8FEI@5ZC41ri(PV+gZrrHyAvVn2r>FRXB9LyfD-dokN1sr6=I%d-7CPK z9{>q=aeaOLf~bo^SW_`NN@VFsBqIO?8;;5Hww@Jr{yp97aHT8$Iz)A~cn-`(V|1Ge8{9eJY=?1Ohl&nUbg&`U{7f)( ztVSOMczUjg_5>X7KojH9NQuu3VF9Xy0uGj@Q@ZJY8lh-?Vg6y zj3?rJWVPPB^1nRanSL>e4GKA_x5c3)jV`y7Ofo%o$S zKcfc;-SJKqPIiC%m;=LBuol_K))Eg9Hq3ZQt!@$RJtQ=!4>M!84li#Y9~V=aEWe{5 ze`PKjYAamvmZ!}eL_aE|bf6x-!iC9ngJ_SD>Bw-P&Q6)ZN<0=%%i zD*V+pCUrPO;_d2I0`U}OZTG1|6~GsJrZks**pDx||6@};<$pp$vT&tbM?^+w%^m*W>zYO9ZF7WP}9Cew$Uy3uHX5o4CaHY8t${stlQ44 z+W@swp5}b^C(a!_FV66Mz0&&ByW7fuJD9^Rlxo9B41Cql>Pgp^$bEN9XVIRo_3B^B zP~(rg>~wg0ONLg}j)j%js9o<+tIv5yfJMlGGAmjL`%8T|atmXZ`HY2{S)0~`3;A1G z^Z-d#DSZEQSI%^^$$`(JR)88?bHuzY6<7TDIwO(uBGZ-u!d6+w*2eJ$amB_u?xLAu zB*52Mmm*}AHBQVjc}C|&l~$9Nm3opA&0)^iyuVYz8FR z4s)L|CE=wKukpuO4hbDjDfMSjURv{QL*2J~(Pk-odijf!N_wg)M+4;$F0qfN^S#H# z14R?n`#7hD^RHMgD<*qrjX3xjj$l>8HjawPjhYUp+*=&qy#RIJp*H01-nGKuub2** ziq2ox1ij>Hf_`;8$rpL7Gm{N$H-d|?(Y|$H6Uo8!)XuRz374pDX zfm_K}?UW{JRF5{3M7)pAB8_P2ElzUHi>hIMr^I?X*Rp%xy=pTi+1v_sGkvHcWVb=b zTV0;oi`MUU3~Yvik1i+{Ww~x77-QVEQbgpo+)D_Ucv&-97DnW^3EYflm(d+R(|yHT z^j3PKi=vFgTfOLxgo?4Tui+(IlAxNBRODC_c(wZVX92`epKKu0h{Jox=VYX;ira?T z#V-}@mq*5~)*S)O-u3Nl(~sKX5{4UTin3jOb%cqdr3TMkgVr*o>M<`j?r%%lc7UX8 zNz?ca1|)T@f>I{vT7HWI<8B!7@-_V!C4{0pawNr|DNWB#rI}rf?Mv`$SErQmN3s6V zz33esvhQMx5R+xLy1!9U{PAJvzh46YvX(jSKeQSX4 zl7BY+q*qyRx#RfhZ&yR+_N1%hw5cb06Db6CiQ%*hIa>eDagsP+oXLH>qc9q9GlJ8T z5w+^lNPn+;ZuRWNC2Y){%4_BFG?uR}CVq0@AM37(mK(u|3t?@})LT?c+`p9;WcrVI z*UA}D)7z`Apx>1z-($3Ja#BYwUqM1}5NcL+s0zI(O9d+#_{H*fw~ z(BWXnzk?Z8S5Y+jc>A$7bu)ymn%`D9zI`?!YeAYX5ZRA1ySRG)Tnrs0ucp}RR@Jce zKUlZ(M#2L0V=ufag=fEUPPNKLZoj6hEEgw?diql7MjWDgO*d5*zf5l^y>z>_RWN(% zV>hBCbc=Z=Xkvz2IzyK^SinPZ>vk{APQIBjrV+CkY3-cve9bwd6D0-JfdRQ8IC*MC zvo#xu^BNl(zB190?^jI!>{v2$_k5$w=OM8DBYaZe zk$wBD^`(U}nt8880gi8`AH|OU^XlNFlvy6PCfRMDxi+?YNOzLK@p~&Fm|L#s;L8xX zdcWQxym?gkV7%a9r}hS8re+XJ)z&rMmsfqh@wKo2Xztc5VJR$46;6*~L(~!X*hw{! z6uJ2sX*;d?4$Th#Y;Bo2f2WMjL6ZtTz5_Fx)nYAFne8c*bR+Bh_E2-Nq)b)dywq>M zobB>D3-{dQCFF340Gc!#LXR8#Q&OZxb(uCVisAZdWsIC-&nIsc|E&^z?+2aW`8)IJ z-&J+(s`%Z#ScwsP9%iBM#9s(~6!9L^2$a;NrmK#eY_oPXRz3MgCTOGLT4;RHkjlkX z!;SgTx82qveVbo?BxP8z?n^F4J{5U9d`<3Y`Pz8t^9_2M=+c1Vea`bH=;6e*2}?E| z3%C9Kt2185@_!GH{LXMFu(W4+OibKezSTM{#^uG2l&;gp4Lin<3Pj-RB-b3Xgo|9@ z-WlfU->mF?wqIg(@Z!?r?2jr^2@`Ll%v}@lbxAYqB!vjd2ZwUE;- zidv$R1qt)p?nmOh@0@)g_V3>l-7qp`^Wvijaq?r>N>g5<$^VX8x&RjniSWrM{^c5xZlu#CPW)P{~AmE0VEX_grYPQgUB?pc|_1rJ(K?tVP4i z23wnE@0Qd8hSl9;d2zp^b@Ec9lDg{5O~ivI{(cIxKuhPN)XEu&tOE{r&>btOihO=$ z!`rp}5iFw@%ehvRRYHZ9c`vOxNSCJ$W^ zG&(`h)JB!3u)=paZZMh8@ZH!0(9CMq7jh;-d)bJ*t|RNotx@Xn>_3Zk#oXehe^4Ac3bS>G~g{} zCUx>F$@Fjm0MwR~DaxJUlsIa7*x_P5jaQ-uC|nnbstoW^tt4&Mc~2OdaJ&(|;_?1Y zMajdKf~(o^cM~u2MSiXeP6{QJxru_FAKwrRs^FVk@{)&d3ie&LaQO#|1Rl(tlq`j( z^l`$}Z2ZyJ=im-qwTwz*=>M*6`Rv7w8dG6Ngz;OYH3+Jy7)@_%`|`$@cN%(1>PYZQ ztnkXJDY22}=WhkmyI;F+lyV6Z4Uj+Y*#2)*WZITnW^dGRY2c(zSrJ*}PJtx0&0v>R zuiO%|{GYMJ{SHNzS&kd&D7f3~m|VROgS4w(T#B*0e>J1W?g2ZM2>kZ0kg%z1t4L%t zD`Fj{P3%<0Hgmtena&g*uxhI~NwD1G24t%v#QwaIqHbYLoI=%SV+$7_Rfv%r`7*MpfRoy@s;ujapT z@M35|PaTRBvgxAO^{&d-q9vi{8DwpO1>u_G;^88L>LUyA+J6!OYuzEbmZj(Y^Nz}x zVEAuo=!|&-Qs@iu48iOhPm?vMXGr|e`K&*M9QorVD)f)>F-%`5Pxg0B-CMr~`d`7& zL3o#-EDs2L;HT0X4(Gn4g21PZXqF|O&Ty4;UkJb9Vbx-IB*kC13N=uv69Fh6jHb&fQPz2x?7 zCK#QkzDMSUoMB|kl6Gx@Bz2i}SZv2gZL;DUP^&92nI9*}$3Cv?aEW(7S5S~@_7&|I zPXFlbDfYVqkBu>X407326e%dM&$J&bte4(t)05?-8pjCDRr4!+wHBWUQM_Dh!J-0}|s*!xBQ$ z>rj&xzcy%QnOab%Q(>@a>H6mKY{r|m4~sI{ORlvAxn&eei?_1M=kHa3yw*Ol9?Un# zr=COJ3of+Yv}o%W?y!13A0TXpRI6(b-gPecwIIO|*l~Ao`1uxJIt^tLtW zsxJoi_ygX*zfd0NoH!ud@f-$v>j0>IIan5DUfHG5z0wrNurt>@Y9N6CXh0$ZHdC&bfu3UT^icj6vKgTVFO&av%N=7{tyZ*a7udG9pn)miroB9i7U$6C#pvWOviGD*!LW*5L;F9Z_lUh3 zGtV(>RuT4>1Faa}FifUF6FRn_2TJC>`Q8mL#?VJ z_PCp>J;9WVf2zbhV#5PVm{EY4jMuUjU`pE|)h-mR>@RQ9v3L$u{`^B~LFCC7A_8Wf zTmTH6pLN{l>WO?kizb#znFxBV&?tSs*6d-$2ukV`zngPzOSZj?GYZ!=a+nW?*zE4k zm~(pZ&3!qygIVUo@LOwWRkR_&`z+Ul7tDf_<88+ekKIml51I)q{&H|i$z=0$Bc`6g zUaAc{?L?phzK1hK{(YhU?~9uX>&p@r2~{()7IJi8s;hV8?`D$IgQI+HvlX%p0)8IZ z+F5UP=F~!d=IC*Or1mKDLUEGGrgqopu=S|JNrdZ;UWy2ih%YPp4N?Y0|7HEvFP6gb zYlmIhc__(^mJKFM?l`CJqF$5L>Js1&dEW}JR$YPDW9S_}wYt-ZFMj|)5MGK{rWx^R zWUi>KtgGkv+#c}bJzjR{^``F#!C4i}a;k6LX=vXQ;789dPz}C+Qyr=3YoJ(PBu3$7>p3J4 zc+Cq7FCh7rpIO6nspkYN4mX0qcu+uqW~BTH{~|ADspZ|32pExTd6RrS%C|lE{lp>S z=ynqd0|I!QbLLO&?zEzJx`_~l|R2@trHnE?JrugR4tuKPN5VY;*Sy~z#=>^xw~ zsXYM8)01#ztXB-RYKw6F)6Wia!hIMEYkc-c9So@cYKopGR`0_sz^4gaUc#omN_A%g z<(3IFN_UR+a2YTm{>gd14l4&9+q%mn&Q>jzMeO&y`f3A{GqM}FUQ&I;;bI&Hj0n7? zMRw1tFRuG5g&Wwk^z_+P$z{6!?wTZ^Hqbk=Z4|(R{JE)6Sh(!IllZ;}o5iLs_VQ>_ z#iu@XK=N&*tN3oy{wKeC6nQiLA@W}H0F zg}I;$zXkm5cGaL3vV9Lb`^SL=RQ&6scB<+$GXK?e_pV-}kCFiJ8s-seOPoG7t*)*X z;@0k+!1NuIT~RwVK@Ze!dEfr}tk4qoz7RX{^S7S-t5QBUX3+DzEX0By2FYV>+d290Fs3R=)sWO znq-?ot8%fBJMv+#4?Xz$=+tUP>~%KgU6|@H8*+AU%k_Z1-?jP|o4ZS*%v$8gA*JGu2%kDxp^4*=^Z?P+XhyJ>Rp6e0Sg$o| z{czuto$qD2Bm!^aOw7a$Q9s{hIC!0&evoSOi>`nEp*9-yyscmr=rM1HCjXdov{PjXUYb2mVyw%Ma%N#FO z9ixhC(*4&JU8vFTQoSe_THR?Iany+i0jSNUC>NjkuwenW)x->B0~X@?6Ps$ulDL=U zYhhUivsL#^j{}K|4trAc{f-c}k%GjX4?mBhq!B!`KeWWR;qsDAOyZQ?67)1E_91hUv?=?blYj(W~c3Dx0Y< zAtnpUEVlU>BemcLi~LZdHeGis6J3|J8}PoMcKsF*-q4d-ja=Ag7ye@gK-bB zru!b_0vdurL?kHS-q(zd=(OGauP00w;NvApDos>zu?XFkM8mi6*t9AIWnVpbzr_@Y z$(?9xdn#@O@Fy0|xL^&?dVj7Q1%`1?chHoZr}`Y6pNZc%%#k8|cw|HW7{K>S|d#?%Cx+_T%OYcZ>1K?SO3NOvi)zAe2V@&QaHvm>R=A4d_ z{g2)jE?Lk?@=#bf=OR@Q3jK!vfAsz1(5~+8%J!RY8<7Ctu`5mz+Z?R%v~D|&$$cry z4!fce>sx3nbR}Rl7{22<{J)|K@e|<@02TJF2M`-E79y{aB;6cw_}}ltg`}rLb6~ER zKp;S|RX>lt9<7@QE8FZa2Z;xztVC7%{x5wB0Dp1r@0**OtEwSKatII&aNWB3LHaLr z(?+D>j5OUmS$gQdaX=Rl;M)o`s9Re#@VRxEkqIJRBtlmfR5&u{#2kW>u`rD+b2vRY zunWoz*a_Q0s{wN>9)7~GCJ*Rp2_B-!W&U3a)+-&(p+A5_62t=|cz~b}0Xo}Is|V24 z1n5}J!<;&>wC6YYk9ho5Mxycc|DZ63D+8nZVT=R3aIRCQay-nsI1!ZpHvupE|IVyj z!9p*XH%>F_i;~Pr11+fjw6(RxZkQeTKP)hp9N@13d0v9<8Xzfas%1jug9Mz#-Ykdt zs_N%8!p1sqUHrxoBK+|V2kG?SK@nUSAzMAC|NGH@4|=nt3;&bI5m=ITy)%Rv0I}6j z1Wb_~qTRsW6h#q|SrCBi03{`ey(wjz20&uD{u@gLYzS)(LEHdtF$=kdl>-dQK)!Gb+AwfYFSAARhG#Ww^ABZp+3 zgyyB@S?;Ur1CZXt2Hi*i{yBvdcB~Z<{awKd?7q}K8QBxW_CAV405zQT<#lKrkp_z} z8y$gfpNUnV?_aWoBh=@*E)YhqS^xm7rrOM6+dH~L6}YIWHhvXF;9^Dq39qi!cPBK^ zdLE`|sAy%<-^*jKUku7c0SDOA<^P3Pg3zAD&zI;yQfdV&hlKOTq=P@us*pSzte`dI zMe@S)aKMz44waY^@53(2y{ZZs;ouyA_{&(|(Ahpq)If{=p=AR}&^Zm6WZvhY`6&nK zp~QWUJYCiINb=xEB;I$Lu^h^u5{18h(HP_0djKj|>kGunt8kt_<8AKtZQsPB#aKXj5b9aO24i0Er~S3}EY*iP=>V|Hq)Uz^Ey z-~w~;KCGf!xQ1@Fp*@tb+c5xwEom!${5Z7c6jhp$(jze2t#I;n!mj%&tRE!d}-Y=`Fm$(3vuSn_$fl zNqMsHV`Dxxq0ufwKMFd-B)us7Mo>dR>uS@9P=98p7%omgGRd0hd!zH-(&hw)-(Dk% zD|7r5An`cwVcsQ1B9>~T<=_CzL52zR$9uSp9GnLp48s>yrko`Xfgf~=&op`Ol4#QQ z&g8I-gYEl?tk3JEv9PA#`Rz|4OP5#xUiNUBf7xQ8Fmaf>2Yo2Qiy^E|eevVPL*crd zIOl;k70@afUo159Oo5JL)`9gp1031GI1j@xLciV#LV{@VHqBDmT6>}_Fs!=*eUblG zb=ZVg87!$Y%&5?BqX~_``$n7XeT+x-g;`u8B{PEl_Ti+8MX$D~#M+`)#Aw8lCk{H8 zsTfiZl;h$^(NKy8HI!x~9{Toh9S0bpxodEy<^pyk@%qARB7~u(qKKk3C&D8B^)ek%d+qQgcv;P;ST=|buI}AP$J~aqI{^_sn-@}3s-)a z##72_jARIDyT@T=4>p{xq`@N3$&WW7~h~WEf@Wn_hD>A2Dn=xJWcRO{crCJ;C5;gMY>`9-2 zu9vH3)_2vlYciamy1XJyUQb+8Ez~WZ#=TBRYPn@sk)-;gt*z}bypC>IUYxzHs;TDK zduhwG<`3j;t#QZeTjKTf2ygobu*^g8+QO3$d$=QW-59rd==Ke#BZ9XxjTaE0%JhYZ z0?S-q;p(Iq3I-vv`6O5nNZ_V(f{-TqBf)LpR?2W<8}q&39_XFBXFl7yK(gKJsA?-5 zuYF~)&t{JAE4QTqc8be1+v|U-5K^O=*0NqUXysdR$EINkj3<^+s>JBms0>z&W_ttX zQvlgSJEg#aba2>Z zx+^FJGnxty-nw!D^NS0}aed0iF8}5KC~icJT?6>yiZ;y2{>Z^QNSWR{4Z{OjSP!Apnwh^{qf0BXK<}%V;-P-7z8ZD#8eQZDYJLUxiKPsF);}g{pr{47X{dtBnjy>P z&{OMfR?$sLx&Q1;`|+hRVuA(L>B)c!3v>`SZez?klE}uW)vn;Wo*bhcDFjIXc6zzn zBmE`_#Q21dW93CYu{8lfo}OjQ(8+byOKF-}Mo7gEmJ_C%t_u@qC~8_n2}k$#eTYzf zM#b$EGc53UsyiTds0puG=C{ZH`3E=|)P&Bet7?*i^m>I;^ms5!9oS!|BZNqx=Zzf7 z?h^)$v1k=}>sCp@_+>lT!8adx95NLZW0ZEF;vgv1hhaJ<-p8_#4M3hLlG*|GPjMz+ zf=bfb)f;{H7*LCEKR29+z!KboUt=#XWvxBjQ-n8)MOy8yQ~Mw+aQ)RAAk%%L^>Ijn z1?rCO!T^J0M(#!8FxKcP>Ao#`Kw*Ry{Jin2V@pIA!D*TxSsEOsYlQorkD}EBIT|$r zig~mRGX5_;1eVISa(l9WdmoXVY3n$&6)FtC!vl%7`srnvJ`wX&&!$ZzYR&vo7(Er^)xrqjVs zBu+s+0*N(^F-ul~x!8mQEme9CVxMb6C)OMFLn1k+LO zrT-6&MZ>X>^Kw^#9Yfd0uv`A80xRDCN7Yz6cmCio3^o@sCVAXtOD@E^5W{cr+!?r} zNDE5hy(f2jj~z#%?=8dxpOo1c7fW#_hA+V);nd1RTHqG@D^c}J-XrHK#65R+BZr}l z5wVo`gkgj4O>FPi&nPc0SamIK$Xd&~q!M3N*Y z_IsB~cIEV*JRU~bb*}psJC>@=MwsiR$*>>64_}}O(TxqS8{Q$OS87&v;23t;=u&y_ z$oLPc=mFf@vCS?GExxgVkIzCFoD;2eY&k+B#g8O?vM9*v{uTT~7Vv30#{?6Kt^hxo zET12b)Dc}{c5yVZ(bA|3@R@WPZq?Trz8 zmcI|3`PV999>XidVR7vY{z7WzLi~I=sL&1+S?p}7xEgev!Fx^{x1j}$6j}Nl5l+Un zp~_DO*1lbV9e)$P*oRTd!N%<)heOv?bd;?dvjjrfnozfG6YkqFxF>d2P(DpW&j%C) zbKx!HzpKnY!Fu5++D@@RQdw5exIZKcWIVZ1*f z%>_oDSpO;93eguA*JL=wH}crtr;NYwl?7K#2Vix6GH^r4z1<%RN=|N>7h)Fw_&}9* z>acfbPrX!#B{{CgHyNR7EiG~4N$J5+CNR%o)xh! z=JQ9A^;Q}>)?VGRKZ)r7_haeM{T3Kw1?>H^(u+g1Q@p3NUVZap^syK;JTD*6D#8pN z)xx@38PR`Mwvyqq@Q*XHFNvAFDlffd8_v6(yd z^gfrip?(Pq6Jco39ntS{ZRk|I9^SvkuqKEHiSED06QA?u6)`^ghXB&)Be!r07{6H) zhUO2R>b8_YNnLzfd=gP{2YxR?IyG}XKV73bY;gLaYRp@X%5cgR`7T;Z>8u44W6W1( z{OE-9BNT%Su)@1axR;oq;zaOLnDP8E4QtRDg(byo|tT3j@hM~eXWP5kMkgI z!mlfwOk`+62VIzn;`ZwfE#GJGza_0hoAWR-3AUkPO++yh%eyP_G>#Luc8XUPB0s){ zD(b4hbP}(9Z}GiS^uQjk(`flfmDm6`hTqZCyu&=zD0!4mwfS?qT6U0V@A|TbRLWaP z)5417qCj&5IV3)BCiKn;vBGkazyR~EMZOpoH?Q;Cry#AQRAAw(y^TP?SKGX_DD&~@ zmHd>kpy#ClIT`U>Q)=x^JAHoxCh4|469!GX-(V^uC|9^ag}8s?Sh=OJ_RQqEbB#CVqyFETBL7X_H`YjNA8M5$oSq{elBWut-X%yz-df+ zcB1X$y1c5m2GQ9EotAFdot&|H*>t#06&*WGpFrV!don`bwNlMQtl}fp zLxGm;n=CK+CO%f-b6#@WFZdPHPydhB8+WN2Z%|YD4mqAkEz@5&7VL<&K2C@_r++^` zL2KX=Hf_VXUeyJ}PsEA8^_s6=!I%=9zQ2*QR&XlPoaF|AvA?b;ToZ%Jvm$Ja^c$em zY>GlqIN$kDNANzlws%VcD~2BA}1Bbq=YHP=nJC7nn8tzD$EZ#a{9_EisYjr zq)#5Aygozsr%yp|SUNa?hUdrVl)}gl#>n@_&_e@l>)o25U%Xi0^ksWX7Gid3GGDuN zb5ffGNoGe{;f>G0YB#&eZOo^0J-O7pBntvO>2d^v@6D2#lBOp*hedpK7S@+DWS(6r zXmV`W7bzZbyWJH24>5F*dUUOzO&B-m*{Z}cKnZ^Ea)MH9kA`2LAQZ5$?kcEAXd=WE zktrv5xhRIgBC>V8IFkL`Lx1P8XGED(hcwswr%v>U-$B#r@yfYbg}UyFgx#!M8&8QW znejqLM(aGGHFvIhMyx!IG0>FpvTaWKs-mY(VC{6vIqCYRp2?#Sm!D+Ohmtbt9Lpa| z*mMzFD(6!2#+tTpeifUn1BouR&tM(gQs9Y29k*N1;36mD!qtYfzs%k*$gA!VMi6j+ zC+Mn;SGTgZv~gL<{_OVfvUU8bU@+*MguhM*T1M`^-GU5i3LY-eh_bGEv(>PfmnF0y ztxbMs(cp*J|9Yip9-7=-+-a+c?5(_6xvL#6Jrt zWQ9${NlAyY;kV|po)OoL+bG6TF+UvK%zpV4n$BA+c$T`FtQw}SrZ#yxv8%?-`#)_Ho;J;PtYYQU-~?L!%(zTOPHZ?Q^t|r&l-i25FJ&WGTwmS{ zqA%FF)RQkZ8{*A_(W&w0;e($iZt~N2O4che$$u!f*;H!s>D^ID@BF|Fi!Ro;r>Z-A zhYM&^4AfbmaS%0lTlaFp-v8^W7y0({47~)Ni<|2otkp+FdZHNWCx!xD6RpisLYQ16 zKIgsJlDPD0!oIst$Lu3954u=`?K`%I6WyQ!y^p69Fgv#m=o%<5{B}^aH#nhZFsKk4 zbhh^m%k64`o^Z)a%lbd7;Ju0x%_FY2su$!xgDSvB=AN)GX`?ww@^KG@6KW5oZJOJ1 zIJVdkg;}FL-|P3QV{JtT#@lr_*BQRn{L;iFxLwVLUoRLEiXLTES!`gra)d3D$I#za;2~8MzJT2qT>L{PV7e#w1JiEsgPZ0?xUJ39Q=*K;O zA**sX#X+NEt>ytAIlkA=?bko^E}jZKl^>|q|CRR<<3lq#NV1yn3mDC{k7`G=-e}Xv zttuca@5?6QiJfRH7g8-X!h6qV^|epdm-oQA08k3>gfh~f=Nh{ zr+vXnO94d;n*gSA9qVnfNLxnIU6<{DkvBQV(z;m;^Ub`19w?>Emz^XcEi1*kdc1wn zihq+PHe=w&lLXwuqn#Tc78I&Fiu`|C6!Wzw3(#VZuq*x!c{pCrg0EGICMLTIO6j1e zBK6Xf$-||77jk3{zOQ+wigs=|3+ZMkCG8%s)xuwzzW%3NdH7COJY~_J8);lF)x!e%?Vb}ShaCAaICtb(*LM^*cmpYcE zmWHjG$s9>9SOuq&aEgnLgjk*fzUg}}&E8Wt9TTb;UCXVc6PEw6rn%tu0-RF#o5&Z=?88?*tSgFKk^dVJ>#xp3&Im4av##jO+O%|=T`{zu z=t6!wDOyfOIT7k1t2*z5Em$RM;_n}E*{Gnc%*xyxwFua{kaVh0ro_<__fYxN+sEZ& zo9cqA95c~x;!8u^+i4yS&a^etBRab=_+aRXFZNwTta@rtPiT)8n5NXu;J0+7i-Htp z9tXDA>5GKiJ{W6x7_4wntM5MJQrXaXlQM&hfh^ycKzT|7vs8OubR@|yy)SSh1O(2g zur9W7=daIlTWJff@^*FIySh3+DG0hT^DL_>YTr2~g690@{d74ymttDV0wYoG{H&zd z<7Cm^zMp+_Y5|QiUkpz_7IoTyVPX$?6?bx6!U)zKjdc@ZLzK-Gj~1sgBPslPvmb<2ors_YyTWuVM{eYz4xNilptqH@!5yvf+(~O{+CDzdlJ1-}2O_vfg~s=Ex)V$Z{sv zc3j!j^94?zH?VJ0jL)2hdD9P!*|-sc*~gw~Q{5^$2VKA3l99S-(Bt`F<8p&FT&L)D zq5?g6$(b1#TIFDl~}*%c1HjIBA_hsz&wkdf*znC^>@ zx%-FoRynW7LrEo+>?)#17*CD$haV#>3_8eo6$bs`IntjXiMKz7dFVQ`UccJDtk(Jg zVjozjO0F?w<#}&Ver#s)qz7Mv&_jqGe%!M9qN3BZc)rwt{u>gYdXVG9TuDvNP1NxH19mWvsU*1wQ}Z7ZbzUn?=tS*$*I`-2L@=f z2(9dIB0t;^y2{AU+T-vd)#v#dpK#BA0nMQv_|BGsyAHF8XS@KSEV z0=qC)Exl48y*H%7zLw_0SwtnNkLpAcHZ=G$Cmu03e0vtMS#P(`CVULOR}};<{e`7{ zY;R`S4(oC`i$J~d1iBF0JN`&$t;zrH8AE6>ebHEEl(8I#*k_5t1XY zz2Bat<`fZRRy43N>K73%*&;u;wWShRwRONt@%Jp3Yi>`DFos)gtU9kMK3XlmRQ{G3 zq-9{wj&`mu*nVt>Te;uVynKCliKpxS+Eg5t$)9>9fMdNKYR9Wma=@PCdj+?1y)+3^ zTwok^w>*x}9J9JA!PbnvFt=1B%F}i4>#zK(UW)W>=1_P*^M{|Qw%M2(5GAUN)yDJ+!u}s~#!95ufN5zr`3cg6P3N@- zvqX`;1M?n=cdXdr1^iFz1KJ93K4lw`Q5!MIhJo zWoWzFi0kiDUitkk#w*@8X=$Fokp>OCQR~zE3tE?oy5*%;*rY@JT^CT`dO42TTvK~q zKE-Fb-|MVWw3u5_MqR76vF%XTaYPGHDyyGeT^yT*l5E;bEhnY*F>ju5w^67aU{M0u z&^v?=#2~x%u(cafb3$jpeem5|;cE>w0?XX3jV%^vmPLWBHq{ri{qA^sDP^?yhnl{W z1r^$P^x58`bqS;icVc)Hl3_?5S=0Gc^ef4yaak!ZxwZ0Dzpfx+_gp(brzD;3{Iu#S z$B&^OsR1E&Fdx*)wB_Z3hQ3=}j**Lbv#jc%lM6P0quQT}LP$Py1N;Z;x|*;_a~Zpc zAbsayAoxls&ZLi0SIr|Hy2S`4DKB+K1;v6`)Za+>R3uFDQ5oP@s|%Fvjgq$*$pu#i zh0If}K=L`ajDD`IpYY0bkOR8+ZM}q3Ro3DJxnJ>@j77{>oc{Zm0ZYL_&r*CxlDQ78 zixoi0K3c`m=Q0ztAWlky#8M=!3&Yfpv=2x6mhe3&Wbs2{)wcp|lF#D-{%;zMuLJ;G zG4$6cSJJ=jI7j1?RrS&>rHq8sbX*luz69;tg76)GLjE}Wv31gAtS?NW_&L9?BU0KI zEfhbOUf9-8um9PSu2)%EVQMpqe@scmXV6rZ-v?WS2gt0VQdkGjgjCK-=5ct z$@J0uRrBsaAHMDxnSnKBKI@cz0D!DN%igx}g*B&%E|z>`#8{iJWI%S|ks~aUK_9JL zZrx2x{^Bi=*=$6XL_Y3C`OMS0deTJy34+_~j>Fa>I89d8&$cY)(hYb&$7gR~nuL@5 zuvq#=W3R# z-gg~Z>6}&$ZG2Zcd`-+?O0boaN}tTuvc>=U`a2@J|+>Fl!|$oBr>P@uZ)7`3cQ zy^Lj6Nb;mS$1ww}`xehO`OV6)_HrCPO}KF=vr3#Lr|83qtc~2{^9C{UW=Cn17q!~1 zwtSR7fqtNVlO6CMrzxxK>NmZ#ds@s3JGI|ebR*MlQHt-;<*UNSt`+{j^T=PnnXeey14Y z_Yx#M)GYf;^7o_mlZo5bc2YpHA>jkOg?LgFaLmP0jfq%M&yV$!PGxJo1~+~N%?$hJ zdcF*GzI`uOuWdS6Iwt7%?SwahIHsM9vg8$F0<}ZoM>ADn?nqA94+b zLcs_>k-uu+GJ7}%`yzfogc;8sheG6S;Qq`##FvD>o*wVhU^AEumU%?;EnoZ_W8t-# z8#D?&r71P1Cls%{Xd@Jxok%%63ZtNv7`)#{v~$a5oX^C5RWG4jzqkcps>B z=s$dhQ~6-$;K;X=08|tC!lZUI0nNgC^M4W20Q2w!j7I#C1H4bJjXAgEzzl~?)D}U& z2yM;w$0EgTdrGMFLL-2~XjJ#r#ASj_Scj$N9wRiO!-ag9ubgfG$0c%mwV=AR^o{!x zjUs~2ZA>jYCiJNeo^-KEI1h0+ru_NM2a$?B188KV?uf5Dn}3@J-k~A8{+m)Fopf;8 ziAG5(%r0PV_$7f$X;;Y5vY)eW>uD@gK2602d|NuK%R2?;iSlW{C<&zGxMC3GrIRiF z+Alau;HTUogzGvIh0!SYDM(r{l*n+kpZ%&^EC@S1u5F&a04A>@v^5kCq%7THPDj$~ z>3#aCv;k>0fm`f40fCilELcpZpQ_cxpqO+FQgN|GbV!o$)I|onN?aTSyP)RtL`9i@ zEV$MqyLGu^i91PrMh0&do58I$@RRzPXxTpp#o!7QFN7U z%Gn7)WTZP{XO57kOu~0}m=Bs*%L3M_B5~^CZml;|RyLZr_~XZqQxTk_uHaT1K($`i zv{(IL)Wf@wHgEfCK#|<35p~JUMO_Fe4A@M2t9Dug9900&UEZYh8GfxIme=%}{O)iL zhnOWo(p=SjfLA%?N^0fgk=NP>z=0eR888{^Cu|{I6Wp)xwffzOmm2Smztq?*Gq~2Z z>J;(#!Kv$Scl{Za!@V7g2MO}Fz@efvq>ft;T$3$XcSfk0rQ@D&s3LyTk0Qr>4Zt~V zC;hcbzJJe{CljDY4R!q{{+k*tT?J9$M?UJO=NqRp#R$w>114ETy(WU78nG$uvwPew zC41Y{1Zx|?DgdovmmDJc@2=oI5EC`rdQgA5!|S)@Gk=8{pEPX}0F+SsnQwb>jIR6i zj(~zA+mOJxTAD+EcbsxiXUEsdqVShCEkeL2av6=vjW5(WIw}``0`c*bDOs5NLY0vu zFdGL78+G$XqqG_{N&FDNNS@IXNa!y7m^${!;=^*1Eo`F{P2mBY%_&F{{a^7*J| zXRoLZkr{M4PLizmw0iYH8~5T}uD$E2WqR^aZf7Dq9MRl1qx8RE> zk^(!L9O5wOu7nh`Hk}>}^DN$@ZhYcPPEf_4{6reS_o<)@>U|L zn5`Cgl!M*n;^SfjA+(V0Q6VaSi;lCjdzRVDZA1yY>);>I#6m=D+G#2SBtaylUsf

#kpW&1x)vB~_tp@^#%9%C%w9*rCfF^{3TkFK_e-G9`OYe}{<>RB* z>xJ^v05PWafoPg8<+24Q&AV}F*}TCL*ke{OP>n#exP~SS7FHXV}A1w}dY1XX! zqqGimRxC+m?(-s9=&t+Ail8g9BF)uV|3*yC5vV>`W?$aD3XcBba6sH~&3A3{l`&uP zO+;zrOJJ83?$o=`7MJOMS}<70B05i!gb#D~)TdYA%=~rR3i3_*c!1WnF96lYsMgY! z;v(5@hm71Eis}C0bwda#CYvOwIv&nt?h)J;C*+^;*6-^S)8#3CLy)&beUK#Nhf2RL z^t46v6TJ14&^~bMF@srn#IizYTEfQ?{?)4nKm{3e0fHQWcwSQiY1WatJdC#l8ku3N zEa}rjRRR-j(cc0YEz%_XKYtqr82U<5&*>))omREIMRvCaK3z)h=q}v@M=^GZy{)cu zJ0hX;oze5>Q5n$BR(Hi_b-FuB)!HR%j|>@}H#zw5NYgl#{16R2XmEN#8r;>CukPy9 zMWF?H)0=Mv8O`zIdj{9eHS|Pf@QjNQ;?9v1Ym^&b33-Id?Hzoycp4cxIpvW%&?z?I z#Vm7NcR|$^xJtdK74!{k!hZD~=BQK0qJ+w-g;FlYLH9iFVOj-ejGpJ;D43_aBYb#F zo~?2ob^Vd66eBe{YbxA*dEdK&njf(ORp*DI<<`%kB!OVqI5JYlSz;_r7I~Lp(RL44 z71m4|H7+)#do=H_I56fN*XXn~p3M>`IlsX3JabwkfhncT+rJnhs<{d9Z8S=hu`OpBnD% zU%wf2cZd_>i43U+{@D8{@L9SUyp8e<@7WecXG(?luxJUy3Eh`M4iNSjKb6=#7`7cV znUKLlJQN$#JO0lGXJKcU`@!$(X7{ihHGg}>uu&+_Z+;EaEw3?^UA|rc46oW1hmXg| z!$m7Ior%o{c*3S%mF00vTzh*RBi{p3i&pcmOZMI)!A+*aRhSQlrqpwLl4rI#YM%ts z;RT*9| zFTFHlV}U)EJAI6t7fQlwk>^VqQ``2(f`(jehMVx3iJYBerA1HPP*|BWf^Ufb*WaJt acX${NZix@jUg~gHeCoK(FJ&b6oBsz)0*MF! literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-googleg.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-googleg.imageset/Contents.json new file mode 100644 index 0000000000..f6ede1b0b3 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-googleg.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "fui_ic_googleg_color_24dp 2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "fui_ic_googleg_color_24dp 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "fui_ic_googleg_color_24dp.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 1.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 1.png new file mode 100644 index 0000000000000000000000000000000000000000..c9f49bd31f578ff6c0a19338eb581b07cf5a7eaa GIT binary patch literal 14824 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..a3c7bf97cad3e34040a66dd11c7ef641304f18a8 GIT binary patch literal 7275 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..9df17f75fe88db866439c8a1d0d09a63accfb95c GIT binary patch literal 24342 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..937721e2eb58c35f02b62e0cccab8f6b0771e229 GIT binary patch literal 2507 zcmds3{XdiIAHQcaVIp)kA#>32kj$b7&v#-Wc~+h+TM9)fWoc%LQ^Y!nhVpcxjwPl% zHgx7;XPbv|jQNT>eOojS->CKV{JnSng!AL~e!Z^O{kh)P=kxx2uJ?7l?$3SG_ZUG< zWrqp?0BRmb4*LTD3@;yBkPwpE8{PxGl#`BxBm;n|mVCf~;!+F*!jk<7hk&{Py%}hN zhy}et0BFcpT_Y+&0nr|Z!N4o9xwr4n>-Om&-}x}L%P%I?bpFddKy0f*gp!|X<8~6*EdhiF9~P$)`zdpKY07yUe5^1@sFQ(ranJ1 zrBdmW@C`pv5&2q>XgEyuz}pKa7WgaII8LdH|Bf*JQI*yv-5r)i z&4%6Ow(ac6qN`t5PaoZD&t4RS2v!VYHU$dfO|n=k{`{<~P5Di%y`D+>?R9NU9??vi zs!HhZ&z#jb*?HrPG3ohXII-yrLqG3syum(2#)zhFwpc{oq?DE_@Dj|WqugGSR*9mR zxOjfMi@JzGv*O^FL}dOq4P^?;*- z8D2@;6#tNT_UV(=J}XhpEkS6M8Cw?X)rFCaE&LwYv`DyUb>{vj=(N1K0Ok88zVmy; z*jcWlMm)x)Pcr>n*g44Xk?A6bm?m~sOAC9y9xp(_r@J)B8`rWn>mCsSkA7=kX1YPt z4rd$+d(%*`wz`F#k3kOAA4FO%Eg13UqcJWqg_xJZ&V1}DiVN&07dq3i?b$>?m+8t( zw*ga(xq!K!#F>V*ze5DjHre=15Fv(RkV&V!OqUGY7>;xz5DP`YLD`Wkn8T1Bf30yF zDfT3$>rTNk8p|6H;%I~SA+BxoSp^jQzdTL;T8<_OO~SaCF4by~(5Ems*1>}1k&D|& zqobqFMYe94D0tTEG-l_d5qbRw{h70bCJX7=Wk#fX6$;+AkMMy^ZQU=wtKvTJ z$x_<4n88U*yWFJ8rA6+3eT5k{f1{SWCqYeI^P2h4p8bSnD-`+0FJ|sVO&=O2Z>%Jy zbCme`@jpkn)wr9kj>bqR6BF{ZZ;GqF;M3pU=-I%C6GkrVsXA&|!=~;-y+h&eElZ0} z0#%OG230Pw^W0W4^{#tb9<;dt%L-xQI8VL%7!lL8Ua+iug*}C%wf9#DeOwuH-Vpc@ z?`#Ol2<{B%aXW%>G^jT^a>{_uab4m?NDK$gEDHXy6 z2G+iR4+@SifnXCb#g0o$EA*9I_GUOvXlKE6OqZ0fyq$x%a_?l*rEEjqK#U5P77U@r zyn%Rh7Ay>+b2bK3Am(pSnFht!b~$sLuf&LFjzhKNLc;59VcS7996*zu$}~uq=6=V$ zvzGWul9j;VGGf;Zlx|6fo?stL**&UBVl`{^`Hy)Btq zh6qV7Hb5qT%&GmL=$Y9L1LU9OLW4}KG-{Yj^YWMEyE1MQZ)Ie`_-kLbup4G8mxwfc z`cZm?KyNE1ytz1c8++PpvXMZo6l zlG{#wdAZJe-QaSUJ`K`DY@<9pMj4-H?bahV1C;T{8gf+CA%2JJ*bjkd9k~W5u-Dc5 ze3slHS%c&t%9L{rxG~Oe4JiG4kLT#Q$>Tkaa@ry+??AJ?++okmGgy&z4;AyD;rE^2 zq9JiUyg^{lpH3_P`V)`#6`{j;h=sq=BDqlLs3SfM*o-nB>j)zMUluu`U=spYsqUAd zuao5A73gchn^eSAnwVeF+#Vhkj)}w`X6XEO)SKU|-{) zrY62)>E|(`FD6o!&1nzU{r7eU2VExBa_bW2_|*U<;Dv6x-@1ioc7!+wpaep*hCeP_ zdfo4T|FbeDHE4crv?1d&L7-iYq3{))Je_V8DH2=?$?Vk*;SHG{>m;|u#n6-O-84L-CdZCO7|nr z@$(0{()8%~qu*uRLPyH+fmSS)yx3pKa2Nlfs|x zmkP#|{-xdJn%43{)D=4Qd8K;f0s0^R%s_z-Z#Dty$Cbn^R?0m&kB8f_!*z$E>Hh=M Cy+;NB literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..273756411a41d04e01a0aff3ec3f1dc2bfb1e0d0 GIT binary patch literal 9512 zcmeHMd03KZ*S~Qi6(!N$v<$T(TgbK4%!sryv((Bda&p17$)>~_!(74^)W*~{N~5H& z-gKr?TBfu`DVVeA&a0@%hw}h$ix0kFoADQm|JASf2Jv`Ht#~n$p`y~TfuXWfiH2p)(85d zN|}8xd@xE{wssjp*NV)?n8parydSiDSvVW_{>|5;@<%209eb)=P?QmOy3i(PlU3{F zoItBphee4-x26mDIrcd$tGq&bicz9T24~OAqof-7vaUe&>&6X-O0QlY-}3zP^_<4# z;N+jbe-QYu2#72O40e1R8ghH;P$p~nQ4^6p{_NYOb=BiZ0SJX%=v`9wwY17xHL_Q8 z@9y16h4kFUMZ{dDIJ%xe4V3K?r#*ICS*YLhsgDGow+5=>`n|Ltv!MjX`-O;Lkv&~f2XqV-#H~^%#zj- zR?E^~;|lNy$%emYukl(a_BfyXYQ&WpW`M#@v1)5m_Lns7GyaY`7$$4Etf?OqR~R7y z4U!P2Htx-e{Bb6qF>7e!3FYM>OA12oKdUmcJj-HgO-mCQUISmqiqzGMj1an+bhuvB zczf9mKeN{reQ{ONj1ylcTp%G%nuTiQN!PXScg4PPEI$F0yztNq>8wT9wij$zjSy*S z=ZBBOt}TTVj-BUzx6B z--Im@Ur$vzTvQ}4_xoao=taDG=BfJFuQuV&E(j;xtqtvs-inZ8=UvU0hkK%ae=NMx zG_pdG5FTZK(C6Q5+U{OC#@t-eSFweh_16M099{ab`br^lvlWDl&Lx<2U7yQMpcFua z)sJl+B`hRJ&1_F1BzyuNCc%fN;^9%Zxi}PaWKMzfg@!CW{_Mi=H`*n?yG4JkrWrQ` z5v10Ubv+|ske=^Ej-KB&ldA}-yfEB|Luh*kD2=*4m~$^KeZOXMcKXK=$PeB6H1g)n zo9F`pc0Bx@aM^bBM z*(DivY`biPIO6oT!;V}9uJY|qHwvCOL54Ht7fEU@(-iAk;>jn) zV=PmI1SV?Lk}p|8b8+g@ka;*HaH*<%+bViQkWTZt3X#mUaJo_hLWh0uMi8uw_WebE zj#=Yg4rqq`k`N9bPcv(lXg_+F^QL-Iy}L2LrR~kBaeE#lzGK#8ddna~&L8({?%o|O zi?I%&dZ#YAI)(u=pWTr$|8^W>hmuAvYQ`asSI>p*k_*DAC0~E(%4Ls5*@Mq%WpCfS zIkL>knK!kXe4YrI-+V`#oygeHRfIkFNCgnV5e)u_nVmOq;_JorF_1@k?VIz(%+0bm zfV{~|{qYb%nySVWo^}c0*+Av`w!Figflz~}OK41xdSJr%q0tza)PiUle9vUVpVgIE z2Cs$)&1haEu8e0?b}OO~TBUpuGfAAfq;5At#nQq3-w>oDW6yDj?ozh5F?E_a^}Z9N zyq(*g$W`nmA2LRqOu4cuhEeI}P&Argh&X(CANJ7`Mz8p{iSnnyE%kM=&}kuc7CRCd zl^1N_rMal4CHldC1g@EihWCVEFuTW&=j}mlv4e6pY@4tnR&VCzM7cx=_5^v%^ck+h z28h0QK(jNR(I#`XL#X@Rxvwj^Pzbbw5M1a6=9BCU(-Ili@4{c`yP_&(-&%xHPAJ;? z`ZQ7fD$ZFuo_*}N`THtWeUfVAHbOBwyE3!V?&A-<0ZHQckKdP8NyoY-cYI(V&XP5% z5l!mq8hM7Xy+qiZqKZy^`>3l|;f+J0jl7J@iW8{>pVQ38bKcbrwLNXwq$-k*p4tGj z@VjkM`HATHY6i~Pjk@UN$Oi_?0dZdcWus)Re*B6M{IlbLAxb&!E=jM*V+Jjh0JqS# znX$-o;~DFxVN2B{<@pFMk8lu-r(zkM%LDrzdkrg<}0s;uZ zrA}aOcMKSq63=*U4+b3Pu*jtejOR14=cC|fE1wzk0@LBjJDGdWDtK`gU-2?Q3IeT-=u3SK#t`6`j89dC#L88n^6OaP$l zS&(SYLz_;&6i+c}$4t=r4%V&aQm$a;eu5MXp+jb4AJ$qcbB@^Zgg8*yDg$hVc4Cs( zbWC#EpO5!SVmy2VIS3*^Vl5`6VLIQ~1@Q4{355F7`AGaHA-Vxc z?~a2(Xa`nEv1U1Nnql2Hgy8l>@Y;*DfsGqA=Oy?pb(R@!e<+OKLnIQb-X%|X4u-a3 zhI;3#V^kwWTB_*qh<@9+@29Lu7bydVO$E^6cii4)WG&j4xinghTkJ_)^yEj)7wOn! zIWfd_7Zj$V)F%}GF5~KG-yB8il)t98BQ7Oy>bqpSQ__ZylOxwd6fdEdobM~zw$;>^ z?%T3bktNC@1k0`$6e>Qn1{d?HiK1Rfy6-jq`bS-HRZ&YiZMc-ADewADR)=PTb~&Kn zeE)W*pLC%SUn0C{a%!SFC{&JbcZ1g3y^Nn*YRkK=ifX4xvV5VQ!g;K7mU*hM8RFrz z@u7j_39Pb@ki3^S*C%vur(g3^;l+)ev}w==vuDX(n6k**k{Ii6I7zbZKxYY`U~uHC zn#{z<{y9v%Gb<)m)D*G5D4IFcn8I;V`hqDRVB`B1i%d_L% zTrDp*gwQ+v?oU*n|A9-HKh<9jCTR3>{URzM*rWPjHAF<*z)3?1|TE{ z$3@y4iov{BK;Gy@=K;f+3v}_vCo+x!FnCE8#|S_JqDtdZN-RLnnB^c?2aSEvSr*_* z2;Q4ws?D6kUE?GJA$e~s8z& z;s323q_$*zaFJZf%^+=|ha7YsZrSmgDs>(L>UDE~Pj#c7&(hU7SEg^&21vnPTZI6a zF<(cSp~jY1EY)>VakD;yC@!UY<^Uwy-H8nUD43Sr%jCISeF7gLfiV}Sf#c_@ ziAVG`Xd;S9UmUe_HU-KD2=xF$S$c%#F4T2+lPj#!*`EvZ13b}lhH3iO6kU<|TXk7- z4lzyjG-2s=$R~6%aIXWfGOV)hq}kK?Km&dvSNP_&4xik!z{nW1Lrz@E5KUWS<_s-9 zxO1@#0|yTvg~^hv*>1WpM7wNxqI$iH9Sig>lpfR^C3GNcDjIbuv~L9V{}I4_ZmsSx z)Pu`_7s>CsM%|=y0k2?Dgbt(fWPP)3e;_nktt)cbfW8DV^SBhDv9`#-u-YVkCj`d? z>&WQ1euhv6ypEOt;&i#Q1?yZ$o(g3^WcLZs;h=m;UxXARF{$-6MH}09GF=zp3L)7* zZ3>~*x+2>@6B-pR&~f5R{iwB5AuVV&prh~rK49u6DuGuURhNP?T%SU-NN6NW(+#tw zw;rSjTOQp)+eW)4Xz3LF0^ycIaL^5nJM@yqiyj zMiC3KLi-kt>ieNM2aFA1!~BD-THmSke{m_rIn|-gzWJj-13*U&kAy}ZSf}2Xu*&rI zuLI--kZ1Aiff?FHb%X@q2L0Z%qb&-^RCoMWE zw0c#~m%Kjbr8JZGOP-8Xvd(SlShAXP1|sPre6Uq(-i&FUXQZXuozO%&u%b=iAVhdL zkcoQ&V~8)M$P9(BcNOrfi3?!68}lufB1(g3bAHZOp?=umwYCj2`iI&56wbCSU4GKI zDsm*g^)%B|SmZ?RqE-2k&6N@3geZrM$Vw;F$_GIeyd^~6NzzdvlVQ*gTN}$+GQ$)q zz~BQYiz-1P1BpFI(tr(9$RM%DB(pF{62pMs2aO{v^&!%y5rR3Y{87;nko*ZF)*J_0 zWZ10`>1RRm1#~iCN}GWgDqcW~W7LdBJgK-pVR{^V!EKWX!*PDBf(AkBCtSPDK8HIYx0LeqxKptbMx_>g&^5M8906d zEF=Q}S0J>|DX{E>2NgG)1@v`{#b1@?L)qXjJQVCK z0e{=q%FEY-YX7f7qZlG4fvrC0K3MJVg-FWb*FyUQ_?e$!tzMJ^{sO^;&l5=IE*2vJ zB!SlISNR};p9DA`F-U;EaP8Ycl5_{+!hqQp!!StkVwFvTFe>tyru6xcie@$@f!Pe3 z$|@tm&kX^*I?zHWrqUS#YKB1*B%bQ=12QqhXb){`Nr2(Pb9fN;&DcE4PMA}46E=W? zh2LQ_i*CYC8NrHxnTLU-P?N8i#NkE$&j*-#BC^ADDj#c~VS9_>-Ip7(93TJ>$fx1b zA6mg?$U1((@)cUab*NfHKgqd13xe(eQlzJqOSI2e0P*dGqBnRx4MK`QyA?9=hcs$o||zMzF#qO7xtNWds16ivC!mypLM%V z1%(C1-WwK2baZqu=R6!=473<-!-Qou56AA_y4Td#41Ji&DyloitZDmd48i7SjGe>| z;FIBsy4%C#GCP}18Qcs9;J#(@H*eNHc*bW`?#^mV#he~!S*h5|O(>~@8@1vb^*nQ1 zUP7%o2n^MqjPJ#5?g6jqjl)2j^i6&#@tp&QscDCx49m9@*ZqF7-=3J)l7l+O~s)- z^Y(N~Qt>Stq^{WKd{Tc1Tn%ld)r{4T!HFmmy{bJ!E~hL%38xKhXt zO{m;QH-amP_LivJb(<;T>;5fEXG`}CWln~KVr#s;=FUrCY}}@qdrT8i`=b(KrN51G zQ9o*_>bv0Ic5S;zEEaE4)t9~NTLGe_JSWYF-|RYzpW$lOzZnnL7Hd?$@YmN`{;XWr zy7Jyg8+M<9YUZo&mD!zq4;QWi&BtLQw7jLF_-AZU(29`dmHsjN F{};?xjK=@~ literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-microsoft.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-microsoft.imageset/Contents.json new file mode 100644 index 0000000000..123e877f0a --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-microsoft.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "fui_ic_microsoft_24dp 2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "fui_ic_microsoft_24dp 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "fui_ic_microsoft_24dp.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 1.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 1.png new file mode 100644 index 0000000000000000000000000000000000000000..b43f424a5deb534ac6d2ab2fcfbb2d23e4dc9a9c GIT binary patch literal 2753 zcmeAS@N?(olHy`uVBq!ia0y~yV9EmG6b?3^$if@E{6LDcz$3Dlfk8|agc&`9R6YO& z8H#P zhB=q#eABnDe_Nb>`*zGTv)2rkw?F4NU#gUQVD-Fo=J)H2MfdtG-xSyDZ%>`arg5un z$z=wH2`X0@7#6iiF*r;KU}oqL0tQ2%6EA~;*9t}k7fw@#291Sm3<9d7ibjKAG!=}f zj6iOY1k(3oMXKDxmdKI;Vst0O686wg3PC literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..5455ead2cfef72fd8694462a5586268c4cb9cf11 GIT binary patch literal 1150 zcmeAS@N?(olHy`uVBq!ia0y~yU^E3{BMvs8$ZRS1JwS@Hz$3Dlfq`2Xgc%uT&5-~K zG8PB9J29*~C-V}>VM%xNb!1@J*w6hZkrl`l_H=O!sbGA2XK!vupn$`}%4rihCKPb; zX*3AEX}Q6Afkkw~x+4LMPgu-kbNn{R-Vlc2zZSBHx`A2K?9xcmJ5Z_#OG+l$TiKl^&2z^eW3QyH~KC1$(!TiM4y|5)Y`k-pQq zZhCauv*$5ujm@18eM(-}e?L#jk4?elN`pusbC3(KhoGr~>nMkoVeqtMTXjVGy7rdT zX9l<5PQS{RGUv=)q(}ua57cis6K4KB{d0~Tub}$x%HN;vPV4-7I_8Yk`}VH>)3bjX z2;N>_Vl#j9&)S$QCAsv?rRVzJC$0ElrTA_oqvj&EB^^=|l(HPUR*Z6J8wRM+Mk4P| bbv;A+741`n=R|=82?K+ttDnm{r-UW|nDJ-W literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..98ca3614c576c1d1768bde855ef38fa308b2d3f2 GIT binary patch literal 5102 zcmeAS@N?(olHy`uVBq!ia0y~yV4e@e(>U0GA{laOTYwa2fk$L91B0Rk2s64)GfV&q zG8PB9J29*~C-V}>VM%xNb!1@J*w6hZk(Gf#xY^UiF{Fa=?e&ehlNlvkFP=Zf%G!EU zftA^yDRaV$LmEB~Mw|wYFEliS%uaCJYw&R4U_4gQ5%a}+PVgSldGC0DMh*&KGv%tz zmF=I?cR!Z7&&ROxu*^N1zdQENZQZ$J-rJAYV|W=>1`E{esIYv`o-{jhMR3Kuxn<@I zOUyRkJSX&b##@_NcNs2NotxfRpI{60j({*QWEq|uQ3sNiA2}Hq9Q&W|Z&k8IVmhf%9d0xnN-tMdCKQc3H{d#9`v`uW5 zT-CXH_4?a8=RY$p_?nXU{Ojf2kqaI_zsbw6_WtJhy|ey0$H z%lFP4lCeK~^UuuJj0?8TJAFBh=g2i?V2(2!3?V++C>m`Mjy8u!`vRl=qtVXcXwMkW mumCW5jDpb+AP@q7^#3uPd}MlnRj1`5NU5i*pUXO@geCx$upqbq literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-phone.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-phone.imageset/Contents.json new file mode 100644 index 0000000000..14af6b8003 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-phone.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "fui_ic_phone_white_24dp 2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "fui_ic_phone_white_24dp 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "fui_ic_phone_white_24dp.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 1.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 1.png new file mode 100644 index 0000000000000000000000000000000000000000..e040bdf1a94b7fc1fe045209eaabd2f5bcd447ce GIT binary patch literal 7532 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..70579d4aa656686573d90b39e3068e3c9e8291cb GIT binary patch literal 3332 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 u4^GOLXDcSda)ci$-o literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..27a6b5438ccc5f590062dfab3a71fbf81af4873c GIT binary patch literal 12472 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 QA;z5323LnNduIIq0$!{$#{d8T literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/Contents.json new file mode 100644 index 0000000000..f9efe37c15 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "fui_ic_twitter_bird_white_24dp 2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "fui_ic_twitter_bird_white_24dp 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "fui_ic_twitter_bird_white_24dp.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 1.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 1.png new file mode 100644 index 0000000000000000000000000000000000000000..4c99510bc3bb6ced4ff13c23904b8fbc4b62ef11 GIT binary patch literal 10311 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 2.png new file mode 100644 index 0000000000000000000000000000000000000000..2546331cec12cee64d29758eea08800e77e79d47 GIT binary patch literal 4861 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..14148143179c87a2d8b2fdf19d4af5c73ee177c4 GIT binary patch literal 16207 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ⅅ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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Theme/ProviderStyle.swift b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Theme/ProviderStyle.swift new file mode 100644 index 0000000000..5d14c7c01a --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Theme/ProviderStyle.swift @@ -0,0 +1,127 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +/// Styling configuration for authentication provider buttons +public struct ProviderStyle: Sendable { + public init( + icon: Image? = nil, + backgroundColor: Color, + contentColor: Color, + iconTint: Color? = nil, + elevation: CGFloat = 2 + ) { + self.icon = icon + self.backgroundColor = backgroundColor + self.contentColor = contentColor + self.iconTint = iconTint + self.elevation = elevation + } + + public let icon: Image? + public let backgroundColor: Color + public let contentColor: Color + public var iconTint: Color? = nil + public let shape: AnyShape = AnyShape(RoundedRectangle(cornerRadius: 4, style: .continuous)) + public let elevation: CGFloat + + public static let empty = ProviderStyle( + icon: nil, + backgroundColor: .white, + contentColor: .black + ) + + // MARK: - Predefined Styles + + public static var google: ProviderStyle { + ProviderStyle( + icon: Image(.fuiIcGoogleg), + backgroundColor: Color(hex: 0xFFFFFF), + contentColor: Color(hex: 0x757575) + ) + } + + public static var facebook: ProviderStyle { + ProviderStyle( + icon: Image(.fuiIcFacebook), + backgroundColor: Color(hex: 0x3B5998), + contentColor: Color(hex: 0xFFFFFF) + ) + } + + public static var twitter: ProviderStyle { + ProviderStyle( + icon: Image(.fuiIcTwitterBird), + backgroundColor: Color(hex: 0x5BAAF4), + contentColor: Color(hex: 0xFFFFFF) + ) + } + + public static var apple: ProviderStyle { + ProviderStyle( + icon: Image(.fuiIcApple), + backgroundColor: Color(hex: 0x000000), + contentColor: Color(hex: 0xFFFFFF) + ) + } + + public static var phone: ProviderStyle { + ProviderStyle( + icon: Image(.fuiIcPhone), + backgroundColor: Color(hex: 0x43C5A5), + contentColor: Color(hex: 0xFFFFFF) + ) + } + + public static var github: ProviderStyle { + ProviderStyle( + icon: Image(.fuiIcGithub), + backgroundColor: Color(hex: 0x24292E), + contentColor: Color(hex: 0xFFFFFF) + ) + } + + public static var microsoft: ProviderStyle { + ProviderStyle( + icon: Image(.fuiIcMicrosoft), + backgroundColor: Color(hex: 0x2F2F2F), + contentColor: Color(hex: 0xFFFFFF) + ) + } + + public static var yahoo: ProviderStyle { + ProviderStyle( + icon: Image(.fuiIcYahoo), + backgroundColor: Color(hex: 0x720E9E), + contentColor: Color(hex: 0xFFFFFF) + ) + } + + public static var anonymous: ProviderStyle { + ProviderStyle( + icon: Image(.fuiIcAnonymous), + backgroundColor: Color(hex: 0xF4B400), + contentColor: Color(hex: 0xFFFFFF) + ) + } + + public static var email: ProviderStyle { + ProviderStyle( + icon: Image(.fuiIcMail), + backgroundColor: Color(hex: 0xD0021B), + contentColor: Color(hex: 0xFFFFFF) + ) + } +} diff --git a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift index 136157da0c..86f0a9056f 100644 --- a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift +++ b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift @@ -17,6 +17,7 @@ import FacebookCore import FacebookLogin import FirebaseAuth import FirebaseAuthSwiftUI +import FirebaseAuthUIComponents import FirebaseCore import SwiftUI @@ -64,27 +65,16 @@ public struct SignInWithFacebookButton { extension SignInWithFacebookButton: View { public var body: some View { VStack { - Button(action: { + AuthProviderButton( + label: authService.string.facebookLoginButtonLabel, + style: .facebook, + accessibilityId: "sign-in-with-facebook-button" + ) { Task { facebookProvider.isLimitedLogin = limitedLogin try? await authService.signIn(facebookProvider) } - }) { - HStack { - Image(systemName: "f.circle.fill") - .font(.title2) - .foregroundColor(.white) - Text(authService.string.facebookLoginButtonLabel) - .fontWeight(.semibold) - .foregroundColor(.white) - } - .frame(maxWidth: .infinity, alignment: .leading) - .padding() - .frame(maxWidth: .infinity) - .background(Color.blue) - .cornerRadius(8) } - .accessibilityIdentifier("sign-in-with-facebook-button") HStack { Text(authService.string.authorizeUserTrackingLabel) diff --git a/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift b/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift index 881b0ffbad..dffb56123d 100644 --- a/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift +++ b/FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift @@ -19,8 +19,8 @@ // Created by Russell Wheatley on 22/05/2025. // import FirebaseAuthSwiftUI +import FirebaseAuthUIComponents import FirebaseCore -import GoogleSignInSwift import SwiftUI @MainActor @@ -31,22 +31,19 @@ public struct SignInWithGoogleButton { public init(googleProvider: AuthProviderSwift) { self.googleProvider = googleProvider } - - let customViewModel = GoogleSignInButtonViewModel( - scheme: .light, - style: .wide, - state: .normal - ) } extension SignInWithGoogleButton: View { public var body: some View { - GoogleSignInButton(viewModel: customViewModel) { + AuthProviderButton( + label: "Sign in with Google", + style: .google, + accessibilityId: "sign-in-with-google-button" + ) { Task { try? await authService.signIn(googleProvider) } } - .accessibilityIdentifier("sign-in-with-google-button") } } diff --git a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/github_logo.imageset/ic_github.png b/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/github_logo.imageset/ic_github.png deleted file mode 100644 index cae7a5ddfc2f3c567e82550e95121b994e1ab032..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 800 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^> z;_2(k{+N@8L5Qs@^z>q&JhP{ZV~EA++R47&A&C-g>wivgNRud;AkdPtxS3nrP))Fo z?O%ffM@!f)4)I_7F&(?NeP;H_czjAeps{I|OGi`K44!QPQ#Srtz$3k0Y~Q?N>)&mz ze1Euh{`0!|&n*p^SXMk_^nbBrrcS^kD&JQ;rrP1Tdv3|`)i(++IG!#$TeUdujFoH%cj2rxH3_TyHFJ-gqjp{O>dG`8Vb3M2;LgvElKC(6BFyPSx30yy}d;w>wE=cS?P$ zO;&uj@Vcliibf_8C09A4|82D{%XBF}G4Y}8{$%kzbD8btelGsQYA7tGzMu8?d|(Pu zEpd$~Nl7e8wMs5Z1yT$~28Ncp29~;pMj-|UR)!W<24>nohJnHEdq@7DXvob^$xN%n zt>IL2jRR1FB*=!~{Irtt#G+IN$CUh}R0Yr6#Prml)Wnp^!jq|>WXs^`>gTe~DWM4f DsC!Je diff --git a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/github_logo.imageset/ic_github@2x.png b/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/github_logo.imageset/ic_github@2x.png deleted file mode 100644 index acd642bc19f040760b082ae7662d473af4f77931..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1789 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0RM-N%)bBt00(qQO+^Re2@C)d5|ED{-T(jv;7LS5R9M5U*V%7X*A)iv-#I?U z6UJtU&145~7z`%FDnW=qk>MpsfK;iG@*4Hus#K|!(yF2AL#q}Z0tCV<R8fU>k!= zhzBq>9-Sf!A(r%&>Y9iGd?R3OZ zd)0a~#@+Ru%N`i?N+_l*br7j^$SFrOsa7R^i-W8wuRL+t-&{2<6jCNd(U)s-T!;Od zRd^S~YSdVzR)cN6^(3V8<4*GEBNevl@Ef~Tz7zQ(Ds0zer*aoOk_rpwi1Hj%`pB2Q zuvwL8nGSLkQ-1P|Kj|?&Pmts#XPYmbw&Ojh=Yy@b!)bi2dp=RgLgh3&=8HM{j9Igi zcf18sW+f73*sH>TlwKi-=I$U;<+!hGp4%{?-;f4dRJ=7=LCRx88f;JpHv7tqepABy zC9iZ)hdm1s_d4&6a@*{%&o*Vqnv^n&M1>kLGJ5@}ORuz#9n%h~?a|?p>&8g}G&t=* zUP5}EbKSUl`+e@PdKoVb8#jX$YOPhL%&703^@CBh`fZtWK!pRI>op!ESf$lrTl0=R zW}1i8G$HkJdEp8 zWmamjrb8~u#8ggy0>O-QK}BtF#8bCpu~tWm6sJPDf==IymHG~FAJ=V+F~u% z6c{I5*Hzj$-h?RUqRVv?1%Is365C`|fpJ`q;blcXk6}H=3oNT_N;DLdSK5fl_o9bM zBhq>GS0hP^DkyDQW;y9uOi~~tWj4=2xg;mCi-_OagWrs}AhuWuU8UM0m&-w!mBr0A zkro$F)~GV4Y447?nyyk)V9vh)DeX*{hXI0~Xb{{BvcdZDN`9Qk^MRzc)D|W{~fw9~M9ZsoV zR`m5w>9CXpeDGbyOI z&S7=d`PQI`kdl@*%fgGz_2m`HRjASExRdsll<26(9wer8yXiBv#$9y7j1xYw*2kKi z_HUgYdg>>`vU%HM>onP@#cq3TR$nsBzH(EysRW(Q+pE?JO*-B5d(WJ(%0}y~_lYMu zo%Ot6d)9WJYt>}E#wFY9nDaVwgV$qMoU~50{jx@#F{8n!>a5VL*-o(=MGYvZvs*_| zA6`VtLsvY`X;E6Ab2>r0U)$@h-|1c$L&jWmuY}^B?~2qvADzzWlO~A-UN~!`57jBR z)iFaZsCGb;N-3SL=%2r0qTFEybeUd~JmaOS&U#^C_?>dwdD|Sc+A1Bo-S@Q{cBwU@ zSC6R@nkg@3mUJ-YhVyRc;z;Hq3NE2uyGlEC=yTaUPsB1(OO7yE*(C>qY4`osrTMPD z_>K15HGlBRXDS>(i~EL5tC01msF}}Sbg3ofiodwFSaZpIZUaO9EU2{0W)0eO>M^Ot zs6Q_0pfvZR?mOcfqf5O1AP8llF`Nu%LVw7H=`a!o!p~tOTnWDjLSDeRU*TZ57xK{` z&V-YpF_h)6T}V-sYubapm(}Bt_650HW5rveAM>NDF1eZ$|0Oj8E$aGS}*kIF|hnu>i>lQ0k!WM*#_aNJ^%m!C3HntbYx+4WjbSW zWnpw>05UK!IV~_bEip1wFfckXI65&nD=;uRFfb=ezdrx~03~!qSaf7zbY(hiZ)9m^ zc>ppnF*z+TIV~|VR4_0)F*rIgI4dwPIxsL+76*d>000?uMObuGZ)S9NVRB^vL1b@Y fWgtmyVP|DhWnpA_ami&o00000NkvXXu0mjfbKgm& diff --git a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/github_logo.imageset/ic_github@3x.png b/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/github_logo.imageset/ic_github@3x.png deleted file mode 100644 index ffcfd198a44b1c402573b295e7fb65c04a828bff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3106 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 diff --git a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/microsoft_logo.imageset/ic_microsoft.png b/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/microsoft_logo.imageset/ic_microsoft.png deleted file mode 100644 index 3a57a3e967a05b234b74d4450d9e0db1f8ad26bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 508 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkphQ%FPl)TcM8(ci4iNHB zk|YHEkCSLV<=k=15rP;t{(zzl|NkFm`hSQAf*98R{C}7QPJT*N>OE%9uO>_%)p?b0>X^G zdoDBr1=&kHeO=ifbMi2V3f(`~DG3yE@N{tu(Kw$x!G(d%O_L=-!c)lS%n2bKg9E3I zojZ8)C@(XQjlqG_$MqF7RCt(qE^#O*X*DyP5K4Mvp`y~Zn1w;P(aitf-Jl$xS*j(j z5hW>!C8<`)MX5lF!N|bSQrEyz*U%`$z`)AL(8|z48^|y)aN6_f3yOx^{FKbJO57TZ zA9{HJHAsSN2+mI{DNig)WpGT%PfAtr%uP&B4N6T+sVqF13W^d2Pgg&ebxsLQ0B}C1 AuK)l5 diff --git a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/microsoft_logo.imageset/ic_microsoft@2x.png b/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/microsoft_logo.imageset/ic_microsoft@2x.png deleted file mode 100644 index baf89791056fffe52994212f8936738e92d9675c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 619 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 diff --git a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/yahoo_logo.imageset/ic_yahoo@3x.png b/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Resources/Media.xcassets/yahoo_logo.imageset/ic_yahoo@3x.png deleted file mode 100644 index f3bf49ed073c6bd4c4528fe19b5fb15dd0675dc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3781 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 NgNvrRPqiIy{vS)Xhpqqs diff --git a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Services/OAuthProviderSwift+Presets.swift b/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Services/OAuthProviderSwift+Presets.swift index 080a575b50..88f51fcbc1 100644 --- a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Services/OAuthProviderSwift+Presets.swift +++ b/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Services/OAuthProviderSwift+Presets.swift @@ -13,6 +13,7 @@ // limitations under the License. import SwiftUI +import FirebaseAuthUIComponents /// Preset configurations for common OAuth providers public extension OAuthProviderSwift { @@ -25,9 +26,9 @@ public extension OAuthProviderSwift { providerId: "github.com", scopes: scopes, displayName: "Sign in with GitHub", - buttonIcon: Image("github_logo", bundle: .module), - buttonBackgroundColor: .black, - buttonForegroundColor: .white + buttonIcon: ProviderStyle.github.icon!, + buttonBackgroundColor: ProviderStyle.github.backgroundColor, + buttonForegroundColor: ProviderStyle.github.contentColor ) } @@ -41,9 +42,9 @@ public extension OAuthProviderSwift { scopes: scopes, customParameters: ["prompt": "consent"], displayName: "Sign in with Microsoft", - buttonIcon: Image("microsoft_logo", bundle: .module), - buttonBackgroundColor: Color(red: 0 / 255, green: 120 / 255, blue: 212 / 255), - buttonForegroundColor: .white + buttonIcon: ProviderStyle.microsoft.icon!, + buttonBackgroundColor: ProviderStyle.microsoft.backgroundColor, + buttonForegroundColor: ProviderStyle.microsoft.contentColor ) } @@ -57,9 +58,9 @@ public extension OAuthProviderSwift { scopes: scopes, customParameters: ["prompt": "consent"], displayName: "Sign in with Yahoo", - buttonIcon: Image("yahoo_logo", bundle: .module), - buttonBackgroundColor: Color(red: 80 / 255, green: 0 / 255, blue: 155 / 255), - buttonForegroundColor: .white + buttonIcon: ProviderStyle.yahoo.icon!, + buttonBackgroundColor: ProviderStyle.yahoo.backgroundColor, + buttonForegroundColor: ProviderStyle.yahoo.contentColor ) } } diff --git a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Views/GenericOAuthButton.swift b/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Views/GenericOAuthButton.swift index a14082b328..cb33dcf1ee 100644 --- a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Views/GenericOAuthButton.swift +++ b/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Views/GenericOAuthButton.swift @@ -13,6 +13,7 @@ // limitations under the License. import FirebaseAuthSwiftUI +import FirebaseAuthUIComponents import SwiftUI /// A generic OAuth sign-in button that adapts to any provider's configuration @@ -33,29 +34,26 @@ extension GenericOAuthButton: View { .foregroundColor(.red) ) } + + // Create custom style from provider configuration + var resolvedStyle: ProviderStyle { + ProviderStyle( + icon: oauthProvider.buttonIcon, + backgroundColor: oauthProvider.buttonBackgroundColor, + contentColor: oauthProvider.buttonForegroundColor + ) + } + return AnyView( - Button(action: { + AuthProviderButton( + label: oauthProvider.displayName, + style: resolvedStyle, + accessibilityId: "sign-in-with-\(oauthProvider.providerId)-button" + ) { Task { try await authService.signIn(provider) } - }) { - HStack { - oauthProvider.buttonIcon - .resizable() - .renderingMode(.template) - .scaledToFit() - .frame(width: 24, height: 24) - .foregroundColor(oauthProvider.buttonForegroundColor) - Text(oauthProvider.displayName) - .fontWeight(.semibold) - .foregroundColor(oauthProvider.buttonForegroundColor) - } - .frame(maxWidth: .infinity, alignment: .leading) - .padding() - .background(oauthProvider.buttonBackgroundColor) - .cornerRadius(8) } - .accessibilityIdentifier("sign-in-with-\(oauthProvider.providerId)-button") ) } } diff --git a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift index de045e736e..6884bfb5f9 100644 --- a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift +++ b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift @@ -13,6 +13,7 @@ // limitations under the License. import FirebaseAuthSwiftUI +import FirebaseAuthUIComponents import FirebaseCore import SwiftUI @@ -28,19 +29,15 @@ public struct PhoneAuthButtonView { extension PhoneAuthButtonView: View { public var body: some View { - Button(action: { + AuthProviderButton( + label: "Sign in with Phone", + style: .phone, + accessibilityId: "sign-in-with-phone-button" + ) { Task { try await authService.signIn(phoneProvider) } - }) { - Label("Sign in with Phone", systemImage: "phone.fill") - .foregroundColor(.white) - .padding() - .frame(maxWidth: .infinity, alignment: .leading) - .background(Color.green.opacity(0.8)) // Light green - .cornerRadius(8) } - .accessibilityIdentifier("sign-in-with-phone-button") } } diff --git a/FirebaseSwiftUI/FirebaseTwitterSwiftUI/Sources/Resources/Media.xcassets/twitter_logo.imageset/ic_twitter-white.png b/FirebaseSwiftUI/FirebaseTwitterSwiftUI/Sources/Resources/Media.xcassets/twitter_logo.imageset/ic_twitter-white.png deleted file mode 100644 index 2609e580066db45110ceebdb05c7913e83cc09fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103016 zcmZ6z2{@GP7eD@teP1GkY`qDINl1mr(t=VE$}%MtqEbQzPZ5bySw>__i%?4(s zXp^!{Wl+RK+2w!khrYkx@Bd!cdv(>^b1&yU%jbN~xhL9o`(|MQSpf{ggtu-n--TiP z6!<@pj|cu`>!OHf@CX0#ElwvfOlmp$pR{$?e{A?i(#c($H(?K6%YTQza2+{fGAyFk)l=dk^^Ei_(cqqzxRijWfL22S}JA#qH+?J{-&4_b!9KfR8FW@2Fw!VH1zP8Qw7DCWZ}r6@St# zO^__8#iq($PhT3%EDO(=jhZw&ozbWXGNOHM)88M$PmJxd_(-*%l1jm*&b$o16vWmF zosOHUFc&YgDJ{*(~ykW!F&SwF*q?Hl?T_dkBTrME}~!SvVN#f|&3SI$}8AHo)x~1UuJ#ifwg-d_&V%W^S$um7L68>xZbf|b; zJxd>#Z4C-26fl0Ky_T|g(%m7ne>?0X@Sb(dtP7eHMC+@cY7^h+ZX8AW4J(FMmXPvh zS`rm2RFNo#M##m)&akdqNFgfuY{RE7?qIj?`%5d=p4tIg75MYN7_Po~UDY1ose#R{ z|J?F%RK4pxZZ9t{Z}{)Rhpbki1+ma38yF+|ncCZVe7SL3stR95vq;Ika@A_2$jK@#bhPp1Eq+%+i5HK5mozvYXhn zwIhvguj-~p`u*X>*xxT!bm?4OBy^`TJ7Qb!Bh3h-AfGrRkeQ;N5!AKeVNF**-0!w% zl~eb?ihpU_7&j7gCFe99+P$dc5b3x5l%KBK&nz!t$IiKvAJOqnr*lUlgT*jw>sHG~ z-rPRY`{TKjUK{OWl&FV}DuJpv$RWLg-SK}qsvp)f;(+Ppk6zxtc<^?Lcto=~VK*rY zI%oY1RHcEXfy=@=r9UL-7iW}LedE+dS9||p@kYYCFt+$0F>{3v7nE7t0n9I#aHsy&33SbBo7 z7@y6?ro7zSsULWPhaU&7a2fCPgl`w5ohs}^(_q2ggDoFl$yHM78% zEN}?;$D~d*Uo;A@X*|=XBdwUeX{lh7L+yy~zvGD-^^m+2&=8FC(Wj%Y{YnKgBV#Hy zu*Y@D!|O?T#NjvUO3d4xkW;IHRZr$2@f`R2lU~VPA?SwRteP`MeU&och+fT{4uAO~jl&$Cl6c{GtOu|pPQZu*AGZEwUfsyRV+99A%$$d6HR2GOun zkXnIHJmPCMy7+xdWN1pwG@U2^E0f7or^Uc0uH_v^^*0kTqW2Xg1znFhqx$<}@0yJU z21mk8r|Eo8X(M${VwG=zA7k%IZ9cKqNQ#(oxF=*zhh~rI$p_TN$~+NG!~Z<>G}cN4 zHSbQLCe6Y0->P6!AjSG0OYFk@T!YjwHS}&+}6rPrk|=>3eB3rx3VFmb^-ZjnZL*=X+x@;I4Wonx`aoEhE(hYc8bDv`GgX)s(r=Q!K; zgMaIf=J2iU)39XNOykD)^Gddxu0R}+DSfKRVR>{e=ucGso96I(Idjf=-(Hp1)aN)K zm)LG2U6s}q8u0}Xe7(#<(qA82Eq`}%Vl(K*Tx(A;aY6Xp>G^>Ah=1{v$dCcWsV4+B|bZS#KVg zk!F!pm^AyTm>hkZ>d!gWNg3qe0)qPY5gyKD#c*3A9uFYO@$k~n#q0(OL@>Zw

iT zOFOul6^ACnE)+C5*l4XKz0aJys3_aPm4A5h=92~%h!dwZ@Cw!y^&u;ve1ROG$a=V#bj)xSNWxE4(%HP%FO2cxkSe`}CJl8m=hg%=M*sNO6qtmrX?sKf=v1 z>=N5*RPibZt0@H&+TmbJBZ?DdT13crG-w%1XsX0D{~8Z1P#yb}2ir#N<=Bcma;6in z`pvA3wV_bw@<4-2SHRmJ;kSOnlYkNcAsAIr?3lj%6I zir`9^CEpCyj0wdeZwqn@O=t{3z`{PIU=QgSIR*5=O=I~*wi=Q_`UpKx9tn!k-(wUc z(cYT}+aD@Q*E)Y`tsIr>%Su)p(+WP;Ug{y<3!xUiv$MX;?RwztNr4|nM%M|q)#QLZ ziimu6ZbiF0o&G#|J}$cZ$<4#8$(ow8SsMor+Cf+tIdJdP#JoRm>T4rG(893Dg48o% z3V<>Wg?0$fo=uBg1!}Q`zi$_yzrXkE4=+K37?}|JcJ;lZa{FuQy1n_RCPybCs3<}$ zuqjgGRF{)h9$;z%1A{=me$NE7+VkBbzB@qO1Mdkh$kiZ-7v$lNoXPeofgH-9uwzu| zj2p-YSrCo4(E_c8g1H7QnpJQR^5aVVnfv5dzIg z1=}|{D=0>dv^NU?2wa%j&Ili3y5N<=6;^}HdEfcr`8}Wa5_DI`=VNi;3nw;5|EMB> zF69`UkqEaBvnDSF=tM8XG_zt&rc4Q8Yr$&X0gYmbJS8B6U#@p_NO`*Zjs9Uf%^qE( z%-GKTixv0pLMTtrJF$_#U6(KIN8lT8exv8s8D+O3 z=ZpG4XB|nAat)9|)su!NFS6ldS3e~}Ry)2b$mM#DUO!w}Evq4_{Fm@Ob~EJMD*m}IX6LE+ ze!UozrQWb$QvD7v+1q<8*SW%O*q;qW^F;}n+9i&^x6z85l;>&r=-*oOJaEKQm*P*T zU_c20i7_k}LDZ%G5+-gtoNA3lCd^g%<_h@;Sh82*&U55;P4ob|SXa!)Te3Q4FwGv1SNMtM$c*sqjGW>S4MiIj| zIiFs=S$Z zY{#zom&Ah_m*k6zi2N03TgF=xz!GF@(2C*vt{RG(@^S-&_EoD6r>8nAxNq=K=W>Ht+vquyZZKv#_TB z!%0n!u>_v{3}m-2=aEUHrqWWveX*CVMXBVG(dz->rzqOdN;BL+g?2ajT(n3SquPjd zcHDqCV_5x$UJtPTDGeKkI;R+4&aq^E$Lc$=h3~e4cFmnmIDZR8Kkz4aCIxcWf1o}W zgMD*%Di#x2Mr)8%0*bX5me8B`KS>O6@R)FYk?Uz3F{aI{R^d{Tj~AhX@rmR03+mwD zS+$p2D1zVd*hyI;kt|Wo@IZ4h%>A1jJTjv|nTNNJE;e)LXq98dj4q(P)V{0I278ZO>~+n<$Q1%Pn@ZCNT0pKt8Rb0V;3NJV4v z1*LowWX1mm@MwEG(~zpD%`S$sEfsc5?1`)W7kFQB*b~Vp*~F=RZ|~P-W;x&NMi;yP zcaB~}olH`DO8BTV4Q78%pq()Ap4nl=(ixD`K)yr)hviGI{3)rzrPon*|1C%E9he}B z5P$M@0>2etUf_gsJQ=z9a*2-@n1;Pggb|N9w-%;2`-0~TgFS5!j~M>X?d5nWq9FqB zHT4;Yw%>Vy2GVJOKK#1dA*VvlC*0^-K)HwCG{DSlqaVx|=E?Y5 z9T7Z8iluO-_wYGs#3N);`wa?s=x(VXv1)*Q5U~CW%GjsEtH_zNKTWUOp79J!Non$J z)jw4Au&o=BLg0j!j3_*YJnfN0``OS3#jU{#WK&tX@s_G5qVDZ_oe;O#Z_N}M2n2>H zZb2z)f`8XHJbG%?gxEiysNZ;iR&bM8_sHXUXW+zToy?OjdJ6J}D~T{g6v@$5SOr{@3mOiUM# z+3yfuO;<^$6i^zu@^@U*9?Nt7KS`)FL7A1Xmiqh)oF^Pe)Z3&136@}0MF&fOlkiP7 zvxINTyjGFw<5${zmq^sUY+Hj%n~Q}$SY$D=9Go-la*@&_g5bz8LFd0UDNu!G@^{K1 zg5JJE`;QXvxy7tCS>$BtzdQ{;c0s9wbMmcrXDi{Py++p=8yJxF&{#aJ$7Rq)D~zYb zA+_0Xpu`93CX>83B5D9XrZ=gHJPLN24*tUD`+S;qPVpUH!ds@OPN>xVljsj{<@T)! zul<~W^L$=YQ?nb}_}{tXal|acUPK7Rur%*)_h5HpG zcr70Yz}{8o+`t2-*9+HdZ37C1F|Ij650gdQ2-y^l1rNZ2u0Z7ok2 zYh*KgtexmtSRF&aJZ4FSyAe;ZGJp}V7Pe>36w=hQ58-yJ}DFp-{$ zSc`{~uk_q%+K(_kn{|qQ@`Mixnjiru9GJ<90gFcG?Hv7izcn-we#N@XIa|{k6dy*- zdqkh>79~UkO|F=Cn$oDaS$T)xbjv$uP2SN z11h+yE=AbfR|Tl8ok$8s9w(TDMkPm7tTlRdyCY4XAi0)()F%B_Id|M(-j**H_0KER zotw`@(1_kOA0f;hVaQ&Xc@x~gQUL||n3US|;vs@a_|-<)79CnV5jk&9<_c#Dh(~b7 zr(V3~VF<>~ysaPGfMA)-{dpP0%Jh{w^9XgXfAmfRyD+iLx->$zp=~e9>FSbWA+4nU}ts z5FOOJh9-**TXB71u%5s5(bA&HlutishdFVbJxIHTak-cShLScpj=CP(6@z6oy0Ar30f~z1e#zHzhj82I&q86DNECSJAy`H0l-}gNbr?#oT`7bhH$_`JU zxzjgwV^jeNx}~M0@-lQlZaCoiSp?A-3Jp_-w~`D5G7ErEmsO*R2s&{c)kW2g1nkSu8qh^~ z5Xy3D`rhJtnh=diHUA8U^>?B@e4%W^BUQDPvtDP}RcHol7~` z(I7TQU+1Bd*SUrE$+e%j?#4m+TBi1NkzNN^%VxPT!s}$*oHiI*jeJ+1GdKG?nC0U| z7X7=TvxtI1^UjEyky+KM^8z#OI8^NES1OztIS2BX-OthblBIg5N7W6KyQAM4zfY|$ z*fh%bo)U%(nQaR3{2KEeis!BRahz>(vUF8|E6d(Qf_$r4)0MIP#sZmf`U{gsq^R1x zdolLytv+6(@S&Q(eQY_r~LIzO+LUo)b6=cDc|mh z9gUWa)M)toHDKP~`+LleXwpy${ZjT$^@_ILu*@qRTN!en`8 zR5tj@L)nI_TGN=L+vM$BOQQF>agyx^M<`iPr zCsM_`ZO;=NAnul+S3k0|pGYr#-gZj}#e$3_?4MoGo$TPknxzWUn4E(T%*7udOTsf6 zWE%)r0eL3b8jkZoZeO4{nYyC1W}_%}Gsb2gcmkbq={xmEhh|J#x6fn8^#jv+7|&KN zWj9uDj=A`2j>!Ag!Rv-(MKRUp>7}_x%m~3U)`HIM3O~xxKcMb?rH&+&#P4Vben=}( zrmPltcJ{UL4ZlAwFm``|jBiM@CPFS?1Qp!$9sbXCXW=o*nclgm|L(eOXJlf2(ve zr_5quN2-H#=N|o?HVk^nmur&DW0RM)hsOaPK549c4v`SUR5OvDjYrznnzc&xkzz0N zZK|@e6JPeW=cEK?xYA}>%C4-8cum8pO~~QORQetXhmB`n^0}lSqb%$=V=LW$dMTNz zwUxAfGW6I&?f+k#cuIbm4vH{8wnl1E&O}U8V@wD3<@P5Ae6{# zg!NazunQo#?E!7?4hqlCvtgFYy_c>)SlQ{Y(O)f;3%t}8w|Mz7K|Esz$t0-G4Zw$q zB9S@ZJNu1wR|cH>#}8Vc3$*S>EpL5zEgACL7wc+BR7Xts*p;l8MMt z+m#WrLq)Dn_$WH&Vk3=Z(WcU*T0+5YdRs2G;G1-pMt`ZlCED~z5f zeb$obsa?1JE$Pw7(lDq~I{`LQS>=__b4LCAb?)+uO4~hF*#8L$%OvJbh!sW*XAK!Zf^KQea{mtl_Vn_zwTF(k-Oplv@}kRw!W8itxuOqAG*$NYcC5 z2xW)g_Cs}6z)WM1NZVc2rbUsLho4ZBpeK=VRqvcW4Z#~o{uuRIzD+`T+$d4&;c(r+ zmt%fNciEa@SwXb@Uk;@=xLfMXhF0|wQL(0|%E2qx0i6F;f8($njJ3Lyo%X)WL!}+O zLT;(eg&l_=j@Hps2f#jUZ=kOj+qM4LW;09#>F#~pjDQPDw=|Gl#5a3j?0j=^uWjc; zljij}?(GNVg;X2QSWSxg0mh~i)_dqj7}EHRs9w8%E25~u9zxN1FA<%MPu8zvG#_Dn zb&)yTa3SH6U9`$kfJ>LPEm8qw%@|1{|7Cv`$_GbFdE{omtj}4#D`}&wycOR6ylZwK&I>DHDfW2BjE1{=7{w(Dd;A zW;r@zZvB~B9q9mB+d6QD>^xn{uP*C)ie{3kJ$96JcC^6xue6Dxhg%^c;P7oD3g0wQ zjnVnky&YI}j}kM@KR#TGGqT`lQA6@hoAWSxe6Yf(C!prRRYajDGiqqrNFCfzfG2$8 z6_;k0OVy1BfRevac5$2B^|mw;&eSH{t%S9dNuhT zM`rx+#M>hw;5ZygA3s5nA7A@ph&fby>kMLjPt}p=oZxU}(EY$|LLjNm=CeB6r-mEr z2BMtvSkj+T9n926WXjupU$!?Vg;#}dlI$Y+#RaStC{$)1B#+>373ZCQ>cLf6LdGCL z0`By0<&;uv;$G!`BAqui9?JyU8;WR|ajF@}YOx9Kpv^mtB{zzq29}kX+OUxv-)%2c zDDu8#NB!~o0aX`cu9mw0DSF1sshat6LBFvMPd`hEDbe$S?))~LTd3R2x1kp@1e<$t zlNWY|ccPA*kP`@jQFpX5xAicI;(^Fx0bBq?RGfbx^|qkd+Q!<;;?>wMe}O$v_0KAJ z%TOblZze3qNj*@yg!GrgONSJ*BR=(+Q`>(!B5=JGSB59rQ3m?$X3Q8WVg!C7a^T&q zU6(mCL2al=*DqX>HCfR;>~U_#lJG7r`byz07|C#Osl2c2wv-#C_|BceIW}C%89s{v z!bfErVlF(`@{4rc%Qtvhq6nnIbSe$|C&<7Rvh)eNPVS!|o7d$>Z1DQVfEfZyuZEaN zq{i`yC1*W=Kd`MuD(Px2RwV5=`lP{Q37P71^xL^AF2=KHl?bnfuCMB_7kuk?R9Jd{ zJVozOH3u{82;;!99@Qe}7TJsj8D|#HkP4w_~3?k|cSFlf#Dj&KM^* zFzgMBOkWy9#Jj_@ny0U`hL18*cFzb!-t3NjL|K5$@5Bqb$)6dCbaOM{ippzp4WrJ^ zTB~_(UuQdB)@AIe`Zf%JzopJ_T#E3qv3sCx$jcKPpwU4i9|cU&gi|WGj(gRz1G{-! zz6)%I5*QhG0i$N?6TFF~n)i|0r}uarK`t{ZiHE8r9x<5xPR!z^!K<=+zF7Q68!pJ! zpwf-%V0fWMVfegrRULl4WP+?pDWstQ5AMkIWxxyq+P~)u1D2`-hgjKA(+o*0FWt2< zSO6Ej1qWcAOA-%iu<1I1QDWD>e-ruZJCcknB+t1PtxZE5%lFJyv^;e4CM z($zLu_BuO@p^6e z7mpCKT)W;+oGb!|g38J^kO7^T&nT&HY@XcLb0bZ^;L_w-u{I~qIf+zzSXYA~IC;6c ziS-}ul34j1G-wB!cu-h^nU(vNS|WfOWs_n|8!mZ$x}^XvVz=+2I8N+Dt!-2#N>~T4 zKA8Mr{JtVHvOGUzt2M{iHNH)exfPDpTteMD6{@s2@xCWt;NBMY@h0SW4yvA-&C0a7 z%hF|TX%+b_C5!Y0@uhNOtfg~^)C_6c2NN?wpDZwb71I}_Q32#&3zSf)dSpSFD*X(1 zxy=}4;#=j$5bwwKEaU&s2eJFdzPe6a1h4eqkTP?4VO?f-KnOLUFiuK-Q2_uxzl$A( zkON$I2G-+5?xcVWhp?j%^u}1;dB&Z_g*K4@mC*SJh>Ip2{TESV%R^ql&kV|r z4I8Qer&oN-imL{lkVVHV|Ng@f*e5_Wa~?(m&6tdsctq@`af@oJ}=e4p2gO;RQwfkQ5aL%!M>aGW#Q z5C(0UAC%BH=z%(TpyGxrL*CTi6Emqy8^BK(G;?-nV(iON>yt_!A3-@^|MKRKhfDK0 za=zTmo8u5l;@f1o)mnVnyBDW>e$cRF12idtNq%3^%gt_U&B6b+I_2%Px_xhf5$U1TUSF&8S0R4kroHGwS@9ir`)uWG) z0?%ASifMf~N;bVn-(MbEmPLwr)7W%;2`N~TOl95tjZ*)8kQ6JLl z;bGxY!xkRKmJ3P;1-4mVja>YKNsiUy3B31AIJmBM=yK8Vqt{T{GIMT72vYeeZ|J5X zZvtJe9AZ_9$V53wmvfVYx_;R{4;orUl-6c!)6;0BIZbA$M~oo@nym9oaBm;hQHCgJWXgd)VJ3|GSIUO~|0i&Bps2lw0OvI!g{*l(|l{5#CJwT+Ej#O27;D zrt$rA^Sm?%)LS%FH^arOX%-$Z!)&{Ld7MISXo2N6Ti*^a!z>7f%hM90*dRzJDW@3Wbm!^qsJ$ilkx=x3 z)=9}KmUna|y8yB_Y;fJJG3c9gzHbypcklf2VPep3MZ}PlRajAg>RGU4oKg31E|&;KHzd5ir|4Iq8%ule=5vkW6j9}5 z$Rx&HPbG>v0VR%j{UTF7?VjhmqE!q9WTK#wB8epg%peyq_(OesaUIh9WmigW{;LR| z9N&qlQfjpq6Z<~TN08#7DF=+5$hT?YatGesrz0p6r8D(M83U$ewxsaVIs#GP zruAjEs6Ff2vdn4}MWFml60E9Ky>ZpE)xvx6>LIUJc7LxByt_$T&9z{$dPU5JLknq9ueAS{0MRT4<~Q%VBIY^_r~MLkK3wT zRN#2=8a2GB}T2_sqrhN#AT=JcE8E zmQh$@BiP-Umm$v$VOoml!TWckf2Lg)jr=FScpl9Oi_-lWEI&oEh|kefy7@6u{M|RQ zxliCb_V69X3e<$*vK^W*0-T1OxUgz4l$o0y6hqLt7uo1i%|FI!TojvfI&I+#Uzm{W z+9;uP6-{E>k?2mc~tiG>3V=A^(l{$4k{{n zw=a|kS~m}K;A!$)^!SeViXf48D^-~?ou8~W2VrpP>Dt2+AWRMJazZW}PVC^czsJIU z-y#W~>A%C{!V_C-=KBEr=qYipxGbDE0u5=c&NUMI9c5M`D~=sQ322In@qex>H6 zbC2q@24MM#c(L0&ArA}F=#$G~eCDueUGkT z^mx4aqD33PPJfu^A9EUe5QX-W>*V+iZ1EAsxpcqXZ=p?JCa!%*Pz6)jQ@F|;D__?f z@*ELJndc1MU7=`y0C*Lbrt;wJm7Nm!@fsw4gtmzX`QB|Gx6)M{(PB4c@8pey?=Q?v$8`UJzyg zX$eLCGxf4Z80S$|@ZZ(3Poj()Xo&$x_{Xm3UEdWKgc@^O5APwF_`~c)hI})Ljf$ji z$7yoEEKu~YIT{mk^F3wl?R(P!#7Z-{4-`%+wtsIh**Mo&_9}zKC>Jy3`;$2H3zphG zf(I*L32IOEY5s6sO)&&_Q~j?T%nZ4Xa}O(tau>HL2vCF?5-xsw@C!rw2EGIA)&J`B z#XQ&=p7B!F`nq}O{6mm&Lu|N_OEZwS^lT7xYg6Q{^Wgc#yEgs19OX`@-Bu%y5Wp(^ z^}p~lAqKv07IhhaTMhl#^bds39k~#N4_^1NMJj{yVEw4)$`a$LW{mBgH42vn~ghj;do5V!Wh^JVQ-X^#r>$ zu5$@jX53UGVvY)wqf#!(c~uPK9u zkmnj`a6SQrmH-qg`yz%>$>3Q{N3fmx8)%?Lk%+Ef1y{w^Z4{t5c)0CHZ9WXHdwC{$ zKE|W@g%3%Ls5K-(<1N0YANU3F$wU$U_>+pF%{_W~yXF%`RI`Y`cDQEbOW8v68kPZk z8#NzlN`6U&2H#c7N!G3oZH~P3y!rkh$bsFo`b_i=5%n47$!MhrQPqoAuBr>4uhaj7 z47j@41LAoDEd`~sj2sVP)_i%U|5_k6VGj2t@#KcbK?Of|s2|LOYQ>#i^i=&vO`Swz zNvvJ#4#cj((~AMMJm~d$PVFTkNTMF^HF>djtk zH8@CCxSd5e=P^Rg+08OEgPWdbF|=|B;lwvYA2sq5=|!jgS%mV7g@A%(PN4-COWI&n-ux7y<0u2)}xZ)qw&=~7=5j|*wa1@aSI=Y zK|*-(OC@|l*1|Ex(p>!M(6;@5k?)m>`PUaIK+%Sa-qGWiB)-1;sD3fjAo>)cEso-_ zqO`yO0Uw@K&8Jzlog1Mh+OZP)>`8+w#3SguBkU6pT^I%rC*@;=ILNMw8fw$g?&mGw zDElF1%rh9*syXmV@Q`CB0qdsWbr)GAjHS#twHBY4N{4pu+x(E*xES_S9YCq9(6(0d z?F3=w-@17ZiO~hPBpB8CejiqNFb7F;@LzRg({bbta10(2SxVYd0&EEJQ7;bF>OeZVS+0HB1mm&hlo~9pxZ!iMlussZ)bK_I z@~+@GB#7gUC-yzqh}sp3UZ*f!fH6|x+fNz6PZHWKQy|Db z_i}&#b7X1Ew1Z7w)o9ag+m(5y)KMEK#ZH$}!{|}IEANX~;ul}kMP=(q__*Qk@hj68 z5&LIr)4DRHO&`6W@~4%=SYYJ!Xnw$on>GjG)k0WBU)DzPIvBawUoi%%;p;!!PIJnv z5_Tk;1g)C}?t&3`qt7%{3JYvD3u_!2I0{3j%Kt}WU=p}E*a_#KuX*v=_z7qsKRtn9 z^J0Q+@4siIMfQ-HS~;%3`kO6`Swaw#Q4_a_wMDF3U}&>8M;qKU+=If1wY^u#YkQ)r z0{`_6M3$6Va@Sdl<3+Z)csdsbch>DOw32Ak4$L;RN@JnEikSS-PHrq4?#)t3)NJ|1 z;}DN5e{obWjYKOSDu0E7GLz=7SY(Lat9dU1fh__PIRTB_P)LobrTTK+IUgXb7?(3nnM1q#Vkw$*e1|CP+zKWB)s)1&@wd-e;Vn2D?hleyMkd{KQ? zF+d)ZSOz;VHy2;Fj36zVY1+0sINB`cpNxg74Tvm1%|=-ywRcD#yHf{JkOnDijaJbe zl4UBgjJkQ~G4rmQ`teY4sSxOn8T8v@s#cs*u@^3=SoY^^nBlZ`U0d3xi@OjGC~$f6 zR+jtXot{LgfpH4l=+*j5o%UJ*q;Fq}B!O0&M6FM4A8dwJiooe`cvhO!h+d@>ogSCO ztXoa7>~}62i4|k21VAePu8qa_g4{Y;=?72|Od{#e`G48BUOorD6(XkP7C7U3g!|IF zM^iRa0#*dQQF4XZlk*KFz#W2|!5w1ITtay^B4+=UuNm&I=Wa|J*M)-N$+sqcOBh<) zmbqVl@ChO;BLa0u?Jv@Q&rT>g{|&>zP_k8TUJ&$sCZ%lC_hfL}`nzpjOITCQp~20Ua>;33QvoUMcsP?(VUqD>q-xelg9MJaq|V;NK# z<||%YVLLFY8K;!BxdOex@k<^4E3m=r^$9HVlkC)PLvZ_+^_`eq$?K^a4R`_r0nxlC zk_}JN@LvWEUu!&&U-r;pdSc~egIWl7TV}^NS3^Sz@|!cU{EpBg%q#=IKvozv{B4Nb zmYeFt4Q_gj{v+`^Hxzc6kdON*wm?`h7s38QCY78#)MEcaSP`7RoR$>{F~F5Btn{a- zd7jczHf7>jrSn}Hsx{NffpQpI0{p;%GU2c5DTe=tPIO7@vmju4{+4JnyLsPo(k5XW0PiPUxQXoR#W%GWQPi(?^9{PqA606= zpSP`DewvPox*4Tl4O3*2;6wvWC-!}XHyJv6s2@?qo}pz96cZM_ym_(_9?qfHLk%tv zu}wr(DI~Y+mut3ko@zRe9gQjS!OD|a=|mbjhNC_U=yrzYLk7oR0GQ%l2u3$IwZ?!# zLwf;4o=1kX8^lwhG`-?-3>PpLE4z%wq0?pv#P)uN(-Ek*xV%ho=Hwa~jewN0#BqCSXmq!L& zuW5kbSfLmm0Oa`mSSTN7Z5vesI2x>jx;1A`Wlilwz;kUVBRDg@@+>ZpI#|3tn1QKj}SY-nr?skQ@YSdYa^9A&jbd~pRg3=eiaa^H~Dyhr2OK%Mb{r6k+ zj$+OF_s3~{{_na;C{@GVl6b38@$khr4N*5~NaEv3!<-O5WTB{xr&E=1s{3j=`#VGW?d1{+1Yb@ zD{50YcBStE!IN)?Y72XbE`?O?`24h&SnTtyQtKoQu&>_5{t)f*#5sST~`JP}pwcA5$20Ju&ftN7PT%d@{5~-`{H)J*@J-1eHN-dg5w3xFu*a z)+_^N1U==!UHx|NtI~AjjcxRCO}^N{(YE(|G>yLU5)clI>YgQEbfo*Z=7|jTA&mVU z#8S!XJ-xVHynrl)bc7l7^|sokwlsusn0fI2-0QL`i+ER!4N3?*nygxWvE_opiylKk z6-a%c3J!!u+lQUw=QjY6xj#tDAm(R+XJ&QG16OV=_?r@@QO|jB(yxxS$o*~aNzIK4 zl$G6o;*?cMr}Z4#=C-g@-#^xFwqR4HOJMs1D?zK9}K z*b}Nn@hdAnbuSf&ME|rtuhr?;;BxT@6Q8@tIM#i?gK}J{C+I2Q;7#J;9^)XCN^;X7 z38Ob#GdOY=!tXqV0qWvPG%cI=OqN<-g_cN22>ZV4L)R$;5IdS2GtYSl!8sq)Vll5= z%VTABKss33F;0t1&~q~l^MRN^!9b3~&!20$ubJmADuBDNkU+LTd0%wd@oU|OMf1Tr z5^BI~Ex$F+DFx22bo6OXhQB_@novVN(mZJ&NrPYi8<$)G${xFY=ub0I@v>;mOy|IO zm`YgJP6d4{`7ch4K*%5iY$CDv*5^4!FHYYSW$Sxr1AXBN`-&U-)`aMbzUx7YF|rsq z=3$@3?U9RRVo=gg`MUh~Zdn=PCo{GXKY6fF%3-vCbM8uvakBhjD5!yQ+5ttNVg|jE zf-fR=p65R5Qj@ru6?r#*?YfnmWCInxvp{cvGY1+Sh-4Qx6{*V{fza@W`0UruY;97T zJC-cLm31JJsKG<~mrrz+_4$~$Esn}<#UB%_I(m}d5b6p~hCagYgAln7Te(c#GzLGh zPF#))D4;sHN1{L_WIObYRywo9L>STJLf82=G0j+KPr)NVis3UJ5_B?5A*HFX|FkqccE(0(wUb%3vab;Hc-SQSu082^D3w=LmhTNNzFsFKBf0cq&H@ z0@_qO0=g&onfE`_??ODP{CYzWd})Uu_r|;=DVKWGI$0}*6Jf3L7Piwod)kqjNZ}HRY6rcu?YRPhS!@; zQ4%8u%?@U7nIrryp7b|qcxus`+vTKi?0RnBeHv4&Y%b1Bo;j+g|aOfoQ`_o;i(7`E>~)c(U`@G~&%vj{&%`kM4mv)Ga?g*^9<-wMG-6>)1IW>YUO+R(;L-jmV13(kFV zKZg`Oz+C)o&PZbOZj4e8HBS7@grZuvgEk-ta?-d1c4#vv42liBvoi$V*Rr3wie?k< zTSPM_1yoBK0zOV-_!4nbzQLtCBXn~c`*bk+$65mf?I{O>UKm5%CnsJ4)9HQ5rAax) zvKn5mo8OXtEoe>*yPy&=F2MqgmZ%SSr}b!eN;PZ^;uSCU>I#o0rGV9VEa;b!z>&?U z4fF4Tf~bJthS6sy;0wchQVT+#ojzkkejQSE7dkEvZG&qWZrJaVEwJkQNT~qk`f1=x z$mNlum)F72y40KBd3;UmU72i|(d>yaVgav=?Y(6GiR&RNSSm176dU|QejSvqPCOp3 z19y2&{r9BiZDWia08S+QinJBW>XwDchK9!e6F!DmvJnV$pW@d`aL6lE-pW@VOBs$o zIxt&s$?_L<%35zPTBW}1^)XJ|VeCv`hE_%+?D_Of5STyo5nzwN6Z4uHieK7$u%-`) zi_QUUjzFU1N)I<&JEs6osx(sb`#N|rHdKI)+dh+cld1F5N7=czptu$fx z6sJHkp1-qvIk7Ovp^qQ;x-(&8vajL%cj#XVo;7P5_)_UR@NpL6coGt}BGkW`iqT43 zBG&>{WIyzs9ORZ_ZmhC37NF!r8SX%@tPW{)uY&eyQA+-ii^H5jgeBMf~%t|>AL1%gT-6K$~J z6Q~G_mo^l$owNq9JI8kpyJNT;q!;qwjC30e4&xa;p>8+%q)9>uq2izF170rjn3G{h z>QB1D>tUu11SMV@N##o#m(D*XF(72Hjgd+xC$8rn)56tfU<=skyRdrTO+L>AkZ6~YS2-J*@j%-x^)JxykSS(^sIiM4YSSl3v!-VRz{D0ng#l;jk*K zc3Ewc><8A#C0K>%;fEctJImp4u9bEg?)S>^ z)9Bg5)}ir$(&S#wTBDwz15h=m*NvnNYeG@)&he|mXaA;yM})g=YLt$Cn**t1Yr>1C zdFR)|s zH4tlzD4f--yP~Ul_ z#?xu!|0!3W-)R#1$1{p9@MH7`ZvRP9kouUFoF~6Q&J$=osj&)nbHn-lMRiUiS^7`oYs@z#+~OglJ4-7uYpt$;kr#1Dw20eC;pkIE9glFuJ zVbWy>FXamMZA;!p1Zz4x*5#O?X>w@#O@dR=`2#;#F$RHZxY4zmkCGE(xWgGPQ^+p0 zprPDRn&CJ;35C(M*dT}y3tJXLV(t2_nYl`Ia#xiQ<|;TBSD5yLb8!1^U=hPV7z~Vv zv;rznY#%Rzq_j;=1&~13dcZ8{7EuWHOI?t9aKf5{Fnx%z6*@#1I>e=^5kJ|M z^v3mnxG7^^v7bXQGtVD980B!#>55mZ|M0?w%I9y*4`6LOVBSzua6xApXurQT2B_use{LLnkf^&tSckNS2o22fMDj726n*v z&h@xDVZou`s@VFpqKEy4F_ai0747kpVA$Ti7Yx5H1wR~gBQT-S2ivWN?g$%8;oF2S zJy?@z{Zwc5h1TDNmqe!4V28F#D#z}6ErF_)Y?bbUGUrfOF8OIl)iHph=*<@fKiv?% zOV<&=%z8JbHV6Ju`=KI)7Ev2Ws3YR`Q4WLze&oQzmCuP$0w6Vx5xEZ>%?gsqdw%1T zUHhNRYu1HwNYi)sk2(RNgVzEwWMB~5?1G}T-FE#U;rD3lP?jH48A$2dRGNnWyHV`L zt^#hH6AFP8C0dd04`sK08iFU~ZI*|qf|Lu!&)hNW)vl_|iP7**`wqQfJa-ym#6>vd z7r4Kh7HMoAa_}F)cQ%-rKjIZAr;F~Kf{sCo20SXqm}H0wY!N3rXg1KwTxGeBbLPMC z>7tJrT;zm;5)yVur91WVfeofIGRNYFcY*jsuJLH%0e}M|oVOJa zEihfH(Z$w3)H5Kx6iHc_y;iIE!Xv1=g+dD|>^!X}=qWb`W>UUwy$MpjqwXCxVmvq} z6i+C(DjdsRvp}~)jO$!yNKmTfW6AG)EfIoY00%ag3A{T)5dd`^w#Hg`Bi_dA6se*c7+K)z<>Bzu~88fz);%OT^1gqJBC^kAhr zM#P$uNJz?3&~-zjwWpmYdBzQ*z`oLM6!jUdn>>WTeRR{s(a+@A8>qDSu7|gQ&EUZb_7wVT=Z-9Gv@#Tj^?8+=eOSwO!^E!eQyExh5NN)! zB~(t;t-Q^7Np?=UtEOi(@T@YF;z20Y%k(=Wk;wDT(GwJU?Ejc=q6{Sxu_Fx#4We>F87hi688ZDo&(it6 z*YA3->-_Pyti9I#+{5So+`~d>A0WTnw@bnssBzVKICmNi7+Y+w0uwhhzj`~GP;W^dS1&?}vnL!YXgK6nz&A+`&J z590BNPmOaDjJ|Y$B3{&VT#+;`&4Xo^_xAe7Rs4r{dbhy31S(3(`my-p{oPwX0X5== zMwV&EazmI~BktLx3^D++OBbzrmB^Gi>re3?>uIh3%h2Js_;kK*nU|&A8m;m_i|O;b z+*p+!*MI&hd4i~OSi!(=!V#Cib7 zbLXYf1*|#kErWxDdL()?`yUutFCXE`JomRdvSDlncgiM+oLvM*ADXP@>DcZk4MfEb zx^jdJ;V+o9UiRo|xLBz!Bp!O;_seJS zmJDW`0wfj60-C>NB7n||zK|ehBt{`s$K`DOzZ#ru^Pl`=6iVGB{6@KC!THUB5PC$m_tJoIscm_AF{D@wil+P5TJ6(jb2h&&3%s?0IHYGa zmRdSR>r5cBt%G0zA8v+>X-?gg2uf^VOMvyyxk)SL*|#i5BHP~`o{YQ{DX*2&fZ?Q+ z4Hpo=NVgb{u2YDn=opO6I4(f$ZYz%3`;|7Ba%Tcz7e?%19Scb8nw1W@@WW>N;EOi@ zs~+kl)V*kEg-9Kp=jB{pVPFuq?--NYeb^g}qzd>jYo3YZ%Pjmm=k|lf`3)t$)WHPW z>PL1kDAG$#lVl0Q&xXv^Jom#-SIBeykxBa|LUs|C(aC7c41hGn^*CKMpX4N@*J$2O=havyb+a}Wo-b+VP60>q$LWBl-&&^wDiA#$gFD5Y4g(Ujr3woY3 zL+UCWx}I0|8vx^K7SZAj{xP@$9XZq-2N0>u4fzzgEC{yr#Ez>>VljSfXZ#=ES$C43 zcy91sruplU59=6q=Rwo7D6A8h9is;R;mR|kkl)x*oUhIAp^4yK9XC=0WYD2!7B44E zv~RxU#{eawW<*OtX+Mw!`lLC$8?GMFVSNXQ!|)GB5mTyqxA>uUejK@Ctmqj`ciXu)kxUW9*3)W#6wfK zq&24D28sMqVr@Z^6z%8bPs9-&-mo5x!l?1k=f@bmXh%=JC~>}R^m;MF5_lRVc&&BI zPt}fpg3Ym{`!o(yJ~h-{E!(7@^~cfL%)nE zjfj|X&_?qtHiIn|+`Ivu;6tjS?D_q}G|0$)(yvA%1zD;UJgWI$P~k^V8DP^F%?jPE zW}$k6^_T}>>tnc>7)auhDS&N-Y zed~TrmL%-1T7R?i;U5sgHx`+ttMib=ReXwuyl{N?$9u$Aj4eYuQDo4wyN{8y^*JW= zn}u~LGcNF#+gzknK!)Sj7rfspX!v+p?%}QMy(!yyNQh?j{QnUXO~P3r1nwMd>9RP>i7(a26u+#(}RC`_uML;L^zs= zw1#fqWb`j``t}Su@&i*0qC4C*bjQegU>CcciV6=bM5yGVYXU(2sVb(7qnJyIU~{5$nzctiuP1}QnN?2 z%m4B=nlTRWe0uD<5cn>@h_Dq9k3Fr!zD_Y+6SH<>vp4DfrVT)7*&h5eUl3wFx9!x1 z*FfN(f6=I1KMUYS?wn>K1BbR*xj}6+r7v3a>~G%HtLKVkv!LZWcb~852e78Nkk-A( z_eD|%H#vDUzmmC1e!e>N3v;o8>}Uqw5AfNSF0BAfIYpyq#Q?xp-!mVUVehwVN$H%v zGe%}p7iT;dM}qvkeL=3p9PW>D`%i%S`fHBsk4k_Q3l4XIWD`*P(vr0Ql3&p}J84Co z{T_*j{NfscO_zU%o>;txmnbM!e{tGra7H{#7O*-QvM!Hw2&1nJ=kECcFa|hHWZbo_L9k3q0)<=Gv0NREs+IVlQs&P*g6l?Ie-;*HQ# z-2ZVmi}Mg@gdP4iJIw3w+t6yW*Nwa!$mmSPT#h0dhCiS%rP3jZl{I|epdYBlZb!0G z?~h~fXuEM!wkCN8o;}yEy11%Uk)tRLg%Cr5JdH`NeXR_%XetKnynCiB$xkIjx+Wn? ztx^r?DJEpIFL&~GreHO5=X|J5s$N9gOsWDf37swzIg;_k#)QXZCtDQHt81697AfTHDTjvkQlF0k1R=~%_NL9mI zUPF*!38l6y;>(6%0%E7P#BGkBfy##Ym?(xB@)P8Tvk5iPYulngq}f0a(8zD(9X zrXdidID`MAxBW#~7IA*lmJUm|YYiUK$Ae%sAt`(&)6jtym+_2E0Lo zZ~RHS#q~}KA0l^cbYrnSw#)CBv)$@OA*<5)vfzCo7$Vy2 zz;|UIbRurQvM;NpkBSiOGCnmj`WETIc}{>#4Z84&!GgibAKlMxI|2ptP^_+uLtY|l z<}`_TVqFOtzP<0t9>9mmQiV8BBbA#>#{sg>F4qVh70nVvbbVoXH_kP3rQ#IwSQNnQrk&@;i5u*mX? znCk%=ajfqW3VhwM4ZUU!Ez&H^4Hpj!RNHsAABOD8l#$Tkl zsQ4gcr>=W}i_L#D({+F;e$;Qr&w??_-qN{w-!a+r$yG{OV0q*^9@&z*QQ~XZQ|U1G zp}_>L!xjmL>j0IE;a-B`)YgqqHh#v>mBi*p|C|F^j;jJ#ouK25^FYUEwQv77@aFCS z(59;s_7}qqo1>u8^pI|7^`5N2XIVSp@7KUG6fdze(QEn_U9<~?3U|lZdsD*uB1h-) zHpM^*Vsd;#fe>48n-Hmwn6s;Zl8%XIg|Y~@0XJk%pBcDmi$|5GQp$VmW&D0+so??nGn&o#ZJk+ee0-g@%{;$Gdg zrJx;kFx#rhr2FuD)K0k7AMWQv8Gr zg_iqhAnoo44q&75;uViKOl(Prh{I0N0>5(z|EJpDE`0cF91K<6#dBaG35lI-y5@7a zZ8$pHRw#T#Lpcde*1PN6x@EK2u{v6!;kbY%;a;N<>+0r0e$)>23uBYbj{l2>Q^BdNM8h zPStFa)rf$-x*4xshzF`xg)w$+WMJm6t2Y&Bm}!5DFw;F3nmMp0JybijCYeHlro~5n zadRK+I`+{oIyjN#;9Oh@q&7 z3J*stjz4R|@MgZ88|GoU880G{TUJLs`Ypaggj}t)>-3ZUQ<2#xLzwDT_f$rCRrx=D zAWdgiC`5i`?tR5%2;1m>{ssyn-5M~B0c4V14W9-F->nJcWVM$rM~f~;!cRf{MI}mS z>7nL#nG@5ea?sv##4{c#XkvY@YnDFBa9sAiK^h{~_3Hi3M4ylo&b4XLkvYluvIcAP zwQA>}mI>`ZWuIzqZ>Ix`8{dI{C$cDaqlIssz%o(KjYqI~j#%9oxCLu3be_#ie4eei zE39Dj$a+`L^j+Y&j-h*>vp&xB4y~ZQqVHAZ13s`;@TFL&DZUYjF@KX_z26sr>| zP_V(W8xs0J?abNxxlb*XuUdrd)Lduk!=l34yIW`i8RHI4o?9CwCygzK$kw~RelvTB z9Gt10)%T(dd+R5f&m(R;o)k#ao4}(5RJ)GQ=x6pOI+xmcdl@RRLI3n33h%c6e3o!j z`=9h+!7p*cKKbkQJJ8HTokxZ2wDq6YF6f8|`wK&{L!&1hrCFV8p}N-NGTRhfRfxl# z3$~lMtWuLWK3_C)FN>Rgr+vrxXeB4et4MVt!;I7FNs}A%5GaT2)>y|%lk-82N>fkn zt=h0|9gYg(HB~`cqRNuFle8&W5WbfV!`40F<-9}b?%;}6-A_vi;%Kjp?sB|dK;pJ? z8~lkYwMLgSJRCcv&Dd!ic3ZgHr!Q2tO<6Mu4s_AqAuhpj=tzG3#ci697~u+lj^H|r zo0)u;#)AN^A@~;+M!Hh=g|PL@qs(dS9aQTGK@+>e8hD)$Q~G-RnNcLEbFdDZ9dpYo+UHn%L#0A~v@sKX4QSOb-2OuRuzpzQ61Vev}Iag zo|cs)$N0=p9c_fXc?s1AGO!QEUms#`7=-SfoQg6PLmN#|ZRb+0xZrbNc*rD^9}dOs zcTlam7<%#n^t9-bpb?pLK-tJ6>DbW-FiS-YMS;m%LGH?D{vWM&b}Z*&8UJ=zY$v5Z zG-V@Mta&6Mv_6n#ZfSsr=)>qZk-wz&{_GLi)hzGLZ#|6vKh>^IZRKwLUH|q3 zpfEcVBp+8%RdT`OoR?`ICg#_QUEczCX!MfGKCs6$CJl$|H0|PAPSKb&?o$6Gf z&wWX4;hC6v3&V>KLU*CLB)uj`)cB0DQCtJ*JlqhgVQejDZc2m640`S>%eNRGnY~ZY z^YvfSH>FZppAaF9KQ9&u*p@t(xTyChPoDFTsjgnN#^b;7!I`NF2ZOd5r09h%9nhQx z8)_UoT>&`d)UNwUiGWS@I>vC`?GK=pS#{K_vd>4a{Jhrf3fynRax5a%dK~N=uE|66 z?MK)@&@ItG9qUpNXn=3G`QxPBGK>8rY1(ce6c?;zqVVAet;Y^bp>=+*2ei)b-+(3` zUvb#;r-+^RFUJ&BczOwG|z^o(-r+8-+Ls#8| zb-3sC90CoS|hb;G+Q&ADDvCy;Z~JQH2+7;#esN)pEw10B-D+fwk& ze&>xdJfEFfhN=*meSLwDJ=b_!G8*`%A{DszyiBVTMl8Q2_{ngmFnOT74&u1yI%#6|c{p;Huu(%6Jpz`S&eR(j8peV@k^o<8lI(pOYf5~+DO9wPI zB)Fvf)@yqWN9`6DK?>(o+s8PD^HEG)jGGv4q*@bfUvnRcI*wK!HOV&~)~_{P;|ty+ zNsXA_e?-HiuEd&=W)3)J;%}wlW+9kt)BbD6R?fSMiepiDQ{z2X&QIe+SfXg%GXKQ` zt&he&ja2V&}^N4mnrza`0;T)ZT*2%@+C~yRIK}UZ3+GT;}n(_e53iOO_9U7 z70swqubu8^(}=4*~PzNwzKzC3JfwZ?e6J-h9{a>BcBa2tlb zIC(8Idvk1!C~CQ8BWB;=z(8fc;L6oGa-AvK{$rWZ@|@tFmvZLYW4EQjsI`OvsN&Nx zkSdVlg@b3OujA7bW!ql2$3$`b<@fh@iE+HBNykrxF2>(hQ`4Znl&l8G>eK*Y#3 zb*5}-1oWGynbJagDlAoNK3seJ;<#+>jFaAy=L8iQ`fejy%v@!-8s&q{_t%}~O>(XJ zi*h_$kN{(+C-KjlM6oFCEsWmBQaUOgh|(ycc~{u~0#YyP&>VaJsTCrZ>h4=WjA3Jn zaacKW@0tJOU{Z5y__C(LcgpSDT%chg#!uqW!b(sI^>S8t(#TtwDzV(4M|UDKlO$*J zr{>>&9Vs|F7YfA*Iv;IS)EP0+bK`hZ+P`KPYMy3wh=}eB57+n~5+ZOb-9EVOyMDE- zF?6KOz4dC(Lm{>;rs$@lvnt|sL5-vEM$8$4+-3J6uyEJk5wxG{dVY#Yx``kQ3F8R% zuwWMT>An3D99}$1`P5XX%aGnQl=}&m1%ZyxaPw*~mKKO(aXa{1+;+}-%gOtd?Oigt zS;&{u)48!queB3A&?bc{Q_SCCw*wh=nRC?g=b=sNjEbd8vS9iQYVl3|!33G=Z8zcR zmNb)W6L}l;Y&z%Q>1~%6KJ*0!-xNH7#_0h~7zNir61rZ_rzT-UelFxs@9amj zGP+3wIS0FkhlfKb3ZTssqDD}|aAjl^`))UIswVs_R=O4igbM>E2P^@G&z3s*w&h0QlA>^y7x)oSR`h7~(z z?F8QWD`A%7TAt3hh0p)w)Lx0e88oHsRMtF~0kYF`qsrWKf>-p3@=*ABxoknUOqB!) zQL5H*FUfvlCtE#;)}@s&RPKp8(Sz!7PrId5zVCZh@(I(N$A72{je?tKmS=UB^$h!+ zr%AI~@6KL~Ic3d)4rk4>I#kIuI)pW1Bd_qO#Lg;Ro+jZ|AK&x!OmqiBMr0vwB8!^F z@kLt{(0tg{*y=Z#t8r--DKbp3MHfZBB>Dihorm#r4IxB!lAP(lti-DvofYocKbI2m zl_I6cy#`Dc>*T*tMu>j!-2d1SgwaBbpfERH-nVYM2nQ(Qr+QcLIj{p|YW+YB&pzA6|dC05W;0x=j< zPNLEFKTd+AB(a3as#N|97U|ViHSv0v$6&I)uzDw&SFQ>P z5C8FhWf>BW{t*(7UA!Lb)BIz-|4B;r3KD9eOUO!Av<5qep>g3k5;TsGyH!r;@qLqP z=EB7oWOtR$q|qiQPR}0&X*PwdR$ z*GzhSuY5~e7!kjBr3Fam%#*T(7I(!M-gx0)8Z7#T-Zps{Djjt~AHK=t1-u&TS>b<& zMBu|Qd|AQ}q|I#wR4uKT3=o5PWWXGOu8H>u9;1BDBSh&m6Y(+3(&C(l9fC7KE{s=W zIGR*%^zEcW86}RZK+V+oUuya`3A422$=!3s2bsdb+lr`DROtsM(i_J{&raTrcMAV| zXw>Qcn!`@ml6fv*pBnepIM==OMek!&{7Df9sxdIz-uk;AzSy^QTFw_0;mee(@2?1V z>BD|qC&zYO44kqz^%PoOxYxxKUoy9PGU5kE6Z8YoKe9&2qe)p)JcEam8XF4qRU4cz zOPZx6`D@ng|N0v_nI6dHLl?qV7#FCp$%5zi|KXErWCpXATOBg&Slh{_ zk$LAlU#wgluatp3E4wmz^&W*9>;~C4nc@T$8ObpA-n;-K5yOo=dACDTKdlgYGT*|s z;`ixUG*N?d>o$EnNsIUT%zd|JPRu$RGR6=UsFjMRJY~HY?`+H}_dg&ujYaC`Q%@js zbJi;`jy4xWX!E^$qs(cZ0^Q*7@X-}S&hiFtCOUj*wT}#829bnbQIo}o!6a)kOr3S$ z2Ct&CF9I?goJlX_!%qA^q)R6Az(k5XEca)FI)Ha|Fl)CIF?qOj8NgOtvfzGR>n#G~o{?t7>_+r1kdTtP>`D;Z@;sH!KStb> zt1-I+xGI0F;qy3IL2FmE+`?Ib?HQ!=$nQCgs!85?;OIHu%XTVoHKc-w&yzk&X>V*;f=6Gg zCr| z{HjHdP3coka_Q@#+UK9RWR5i99K_}*(s#y7wvuZsZ4<}hwC#}Hb-q113W}K@75A{9 zvze))jM!llBA%(&04efyH617P592t!wQ0Angs&twW7m$?yj@w}Fr zXGdL-NqC!?+H!6;44Luv;V|!4FFN$Zv}t3@j4=8QKD1%XC_;khNu9(}@x{)qs|^cK zZ|(S3hGU=pqOR31Pnaz;=fSf#b{IDsZ7Az|SV-ZGU)Sgiv>6IQyL@MU+nRKd6Bsav zHL;mihk&-1{WZXib& zESAVz+xsgK18N(lC~93Fwor*xUc9$Nn>Lsc&$IL`%{%JD7Yp8A_=qPdEzTMs-byat zhnLMWxXw@dL%$EZFh;LVACX7!;*9{ltZi^yc#h@RVWIeLIMq6aF#{qtB1Q?=%g0vTs=rmT|nEgfTIPHHXmHUy5 z`!?Otax8ilkZ)2Esv>OJS`;x^67ZcccKoX^4NMdB1-PC{Y>y{PeS;-F&~DGY7iCh>8M0;i2VwOl z?{>NT{Z6$h7LqA67k9sH4-QWa>;q@Q)|DO0;-dZ>qI;uetmb;Go?5l5$zpK1)yE}O zaBQ@UK>VrUytmTWVk+@!p`;o~E3DZE7A-4XL)(wH_*B=_ZP}N#gpTb!y{+~J4Cnly zI^lS1eR)6hc8F9>#{accbVZ0*{gsvO?(K{mcjVdU)l?Ck!Ca7dZ1g8J@oF{+YRIKeu=1>f?6|vQL&=+vRss>a!5x?xf1z2R#p%7w{g_8m)6|DXr+V z2W?*c)BpSOjQ8D_Eo+WHLEk&SQ7}K(o@h zw@$76M>XqMC4AIT=+1}u}&GSCcdDoWnGjFyc(&h36valABk&FLRq`1P|g^GFM;#n-byJ9)-iD}2ny2i_G>h2l)z zEm0xTux&y8<0TyNJU-qPty4cO<)pMY2hmy>YS-SI(1}3?91s)P&THL{YD#&%J0h#d zxxH^?F7|q?#wkrqnmV||X|5qYY4y{2o@pPv#xO08g5vi-S}|wyrlX}#kCvh-xu0oD z)+p!iH6{YLbx@;^FG1A;k%oj*cBb+agwv!b{J4T(ZIsCCr@5y;ys=wqncsExPa8!D zf+|+BQZ)-+2Kq6_`+uZ`3?+c%uf5+BI*mJpW|drQxn!Y)sKkm!v zWmBu}gQdO=`*AQG4-g1$hIrtk_KRww@Om=&UE_PUs7yh*JD3?SUoSM0I?~J zX!*46SjE41^V`Gp+Fz4ViR(-e-X^$o_J1QD8)w!YMcPkW3$@%dwwyoGi`tVZ5nsIF zI}GB?qQ`%c5cRQjW_Pa@+sJ0ViC)`lgKUJ$hMYMYvWjRgxl>rQB?0X;GAHHh_!(wb zc-F7~Q@6=)q(ud$c*fa~GkVS}Kl(c$d}3LP4Jf}+jogs2Jo2&U)V64M5^{ZADiYR- z7aKajn~}ncfOC+r|L(uzwA(?NdFjLRX8T5RMm9`4;=>z%fZ9Ynogv}6P`I+?5COVo zAX#DARGvN)AjlzG;J&%0=w>uQI!hw30@gfQf(M^uDVbR%-d$FBx8xcc0%gX~LdnJU zU>2ts3kK#s7GzlmTsZkqA@H*Z%cTqZ$dI)#J-39t4CcxiJ5`n!<*38*E+`j%bCn)i zKemKr#Z)ZQoiwm@FmJEa77RC`=T>Et3^vAMG7H*i-=L8_NzU5SUg488agN?|U}Zwj zu&+G##`7?I|Bg1B)J_P+aTq}($k_Ip)bim0+FNf;1~Rpb=o7Ta72(^#Fb)HV6z?gc&k= zIXYNFx`XM_F2BiSlH;c4T#pPZhPG;O3tAg%#)mFXZ_7u7A^OLmSL{=2M_p*sc&=O7 zc8YbF8P>wzQ$a!Z}u_TK{>CI0e_l{VEMD`dib`y%frV5priDAvr=567EN_(&$BzEJkvS>DN)% z5`+&ZR6brPTrY-}Foi(d3(^&{U+CkQ9$q)M)1#wz!Tyac)Z9`tM#CW?S z30*XuSis85bP+g=au)aIe*;opoqSOirkVU(-Z|oye*S ze?fjPFQGpFweyKE8xbT!5vWe{b)UPTXCN=ot<-k!V9kGe3%%afj$4KC^p1}ah_$q4 z%6>v!Vgel*KcDgCA56ISp+$_a7eXrg=}2))msZ)dN-6I9{nn;H*F}XqEVmyV5 z$&NGf4f&(v9u{jmCt{ZuCPynRMlWi%w{`s~&5*u0`Z#{{%zIjY(qYz78i9k%6zKoe zFs;0Z@{byRUEP>RAR$;?N3`1FHU`iB>%7Ip5|A3vH<1?X^3NCY z{IFLhmBu%N)-7pboo%`6P8>`@;=gdPyx2#!OR?G(tyM&xkLqlc#OlZ9XKrdf4d|f& zY1BpIqYSI?y5lWPUb*HGF*F4{3qjVROwUvyMS3Ez-2=audzg9F;tHdn541;OtK{Yl zRgcH(+q7cHbw!&D2~Aa#)u#ib?L1ORX_BlZ0N!_2uk!R4+;BQk;f~mv*5raX$O77$-T` z%P*^^ahF#Py7-y#1hUkTD%W~+=ABZ?8p-1X z{u-38!?v}%=RzXh^_uYp%5WXb4PCnioudBw)%*|o$1hNBalqQ%I<(wfvL^RG(!yGx z{)PJpn?<)icA~N6t!IqjCHaH9>$L8 zRIHv*bsvfD158Fzr(uDT7zsW5x?WoTihEx0U$y*1E(?TQ{I%yZ{xply4FKdly0po_ z>bF|7=tBcjs9F^r`wQ8YlIAUBYohg9 zmA93R`c_{4^6e^5{HpOZyXF#jxF+G+Eu(Hb=kc#hr|FP{Bs6f0VS61idWU@_x=p_g zy+2vM%8lo9L%Yv!Ros3q4JSp8$M4=3_WZC>`ol@2t|-Vb0^F3GHZUl(ceUY%6FrkV@X^YBgF$kXHS4kYL;Nrkn50IB3b1JDNpGvkn*$SM zQvWvr>442x-rRX<3X`Ib9;O<&L4E}xIkcZDOUAr}y~;crt9S!ExsgtnS_Yf-@a37} zdl+M%$$M-sBfmCE$7e0UrE|v_#0i}?$emHL_`#!ZIXZ1;t@K>vyJeF1c7<2D(f!~eMGjJ3zPhDp_zqk}e_fLCQj!+_gY7z5iXJiO7 z*6N*NN34JK6q`TN4(1QHkX#ZARxx&8`8IpEb67$(br642Z)|@{&B|mw%iG~iy*lSz z`it3^I^S?%N*7Pc#?ck%{HuMcvmHBVkUOHCny?cuPsr)Ivu-+xe<+t8sK9kN(KDPi zNmgZSx>KtkX0m~Uyp}2AYQ{Nc)_yg#WqF5`8;$Iy{&C?y_{Lfw+>43C1-XiXmagya zbV-8ch0GZsBjeSnpMJP$o-5|?zNfBJpg;1#ZQ|U{whSHhl9_{DZTLXnBWqwZxG(yy z#+DkcVb=H70 z#>R%vxHgsIrYI9&S4--YIVeP)iAk{zasUq>{NYc#D0&@y1+MF)H1Ox#)|NY` zA{|E9csC5%M9hy^ZFZ?3Ra-XmKqppi-xiJM^7cT`goo{k&8}>rvXOufNLYLXoAQmGxbyN({b)8Q^;epDXui>%{w!< z>;p%&I`)4pqhw(Gp;R;{OC$61yhxka;tvQdpKrla_vluuPa8VE1$aJt_v{Toy@8Bj zI}`EE>M^?FsCt<{=evsV2<3{0D)uD4GOyw9o`2!~wv1JI=fpNKb(+SFua7{{=$sa& zUE{JUp9M${qc>xtmg`=z;BdPMchSH#xAh?Uq1f}rBr#^G8k5voG5VU*ceySS-B}eQ zOd<8-ooBrVkEr)rf7<+i#TxD;iiam*ft*M3N$)c?i7YMu6n04!KEP-`s_)#I{BsiR z9sNCm&>Kj5$$Y!-%-pOYi)I04CHkIV_b$YA+Ky*YG4|A5shb(B(Jft#ItF(pjawcq*Nq3?4}t1Trg_QGcwW+KXT0)a z&tBit6({LZipKH)NKk~pMfeJ%fH9I5qyHB*CWkjie6Sc|9uEeS@+hN5Y3Np7I`8^1mI5la2sNNKn%2;4 z`|%X>`gaSf#l#SC8w+3Uu?g=#!2}r}H>zS?%(MKBXF;4bw7DoT>Jrb#3l*Qz{0P^7 zplrk@I_`>9otPjYn=xOit88_sgSH_(SLNjGQ9Rn6)H;|sJT^3gYp1zQfQBxly3lir zH2ya+oIari!BVbaEN<|0OKxgMAcE+4fXiwfbRl+k{V!~n_b;-lRQ zayN!^BHl*zmacr>nAhX%Pf3fxA^Q1t&JhX#aaV&Z=Pbyk;U5OS5;CScvjiqGKCM zqITD3WNCjzk~Oe~DwRExzfR`CsKppQ?!(tTAJ<;{!%;+hpd?5WFAbj_b2JyOeY`gR z5VjS4Fm_&ulGmLv24rp*9oU9Hni+Ao{LTFAS6as{Ml&#mfKMMV?~0FlF4~ZM=q-!8 zW6G5g1*8n!F}0B|QMO_Dn*nX=uSB+d2e4veH;0jbm{OIr4iOsdPN9gzrB)k>Xc4$s0XGe6in3ePHa}&*`!IZ%U4y zvenCpHZaaSDjQgLxVLoM{P78e@dkU6NUIrI4)&+M(`2)2cyKV74n~bTg-^rXfAtjm zdj&2R!up{-_ilBe@_?o8sC{dNFpmDQF9G8;Hu+b;6mI6f&BNVS#`{xl_4I!OxIys? zgaYRG&PQqFzSJQ*ZWLmq^aNi7AjXuYpQO;K#&7tFevNR<9C zkqGAu`)r=uO+n{4p5$oGMxaS5H#@~>H2sk8pFUHO<eG{y4KF}V7dEn2KDc_^KBRL|JE0^X~+xm%sMx2Nql zuGz|2C_XhwuuXiwBF{|x&qIkLVmV>%!FP(6MEbtFd!KL@kv&Mf`ulCZZ??&Fez>>G z`rW_xBYq2@Mg9t&ldUy;^}8!~;DwC@&n*!d*2r*F;|`lAW0O9nIsJ2aLiZ-8@SzfF z)4AeMG`rZbpn^&S*WoJvBM)RqPU6^-=5~X^$7Q~YPuM;i>#Q}UPZ4x7OIk}JN>zHR?uCM|5rj;%4_D#bb8_WsAMSZCTuheZ4NqQVBPXc26y_&9d4%I5>n=mG#?s zpfc6*=5xO*>^sT(q>DRQitV0ivs}1oZ&lRM72yHXakY?BxNzM*gg);Zka82hU-p~u zkgyqAyS#5Mn07#bv(hU24k8%gK}K|2X-&S=43u; zZIt{zxjv8RG^>qi=%Qx9nXUw1+b!Uiz3_PLmR2+F{Q#?=BNMYUB1ZEPhrYLuX>-~g zTRMH^%S6VeUl~b$qRq*BP+7d%u>~RxJVB4&AnE8Sqm;qRd}P5PD;tTDuCwV%Q;H58 ze;|o;n*^Q}#^Yz6iaFO2I*I3rk3rl_Fs)LGh2}DcGd$ZGg}*QR=uCWS%f1zd?12(w z9prONOvnO(Os^#rKP9qU~eeInAb5bnBA%v1ZS=^?=6@}e%!M> zVyUXvmDDv9@ie-1Ec|ww{lG*WH%0XOlg?!<2;5d~`#Y?8%~ZEimt}n#svgrwyi3B{ zmD;1cj#-X&)uydM)#K3T;ddA%AY}PEenrBama25^RN!~_wk5AwoBSr+f3a-_*Z-XE z^3JExEr}zWR{mD!SS+n5p0y5Mm(Ax0BMRcRIW*-}NhD4y+|ytTBI#{&dyuT_`0oQz zwxq^k>TVWD&|~P?oIm;KYO$P3XRKIYUX_V??^>y>Qd*2g7|f7x4scpMit86GUtd#c<>@qD*HK zi5uCQ=kl)q@N52sc8KC)4O9zx#0IKW(-u1NEfc2JFptFz6LgSL9R3*G*uPw6OZnLO z50$;PU|i&}3aAJ6XSxhPuaLdq+qCXEc+Zk$kE@a$dl(p<;UVEt$9%cuYi(5HpR z+CtA%XJ@K4d!QpBU)_f`egr$`%~ycsZx&>Brqsec{|c` zs#dr_{x!Xc~YldHVeff@TMSCTh!^$t&@PBC>p+}p(6hzU)X?;lvH=xu*9MW89F6z^Po_qfd= z?}YRJ^PPrss4%-cQXz9s?o&rZF^^sTecFL*Om6J(@#B`RXd5^P-9b^&qyfrwpBWU;PCSFq{!<}Yc7GaumQhEylFJu6$EKJ&M< zR=D?qMR(&_cF(6K*+^9J22~YUOH67`e@%2;Pe-it!QpedsC5qTWw0%u6}a3X^$XGj zVRDf!cJ=YY5t&X8sSZ~if_akgHfl!m%1tc`4%~a$I(g^Kz4=>NSus8BV=ju9CKfYl zuQPM3(!wnutj`Q*TVhM~m%E-hsMGG^hjVsl4we2|!s&s}sA`}2$Bp`ERerer+aF-| zpO(burueCDVd|OIpEJ916{YegnTIns3!43swsamH_G#{rF2N?ROFGNdK1&Vj9z6c7 z=i>QR{LYO22rzIr;LgsmKG%KIK~^d&T~Fget@yQl#{<1~;THm$WiW|N66V0eXH9?4 z^VYy)BjB4AsxKn8VHyyTwzEW2Rq$1(_{##_oBC}&Inn2tP2G)y5p%jld`-)xyt=n& zW++t}*s5m*$Z_YY^;Cbfpckr9t;v0CY5GMW_aS#It*OjEk$Zqc-h~-OO!*jWp@0L01%dmhep!B%2W-W6!JSSkxbrF2Zaf zE~a5Pt4xip(xw!rkBs{wt8K7h0x2y1+{`nJUcfwUj40#SPegLDxwlm6?+U`{512~> zTz8-bpnNB%sB3+%F1(ON@jG#SKIIp4%*n@h?p6P6*Mr*V7!qM%gqF#<>g;}=C+npY zxie{?9|5(e)1k5Lhdq8NOM+T$;OcaxJyOvV5pr-^X@Xrn5^MR{u@5W*kiKMDF+X;y zsLNr+<6!Q4sS!-A~6zlQKLA_AD@TfdI-^nk`=a_Xy3NQ(|{lx-pEc< z8pZ_WzPrs2l<;%Ym>27pk5o0<9xrCwNXn;aoV~5^y9VGS-d*EdA1`EY?zWgWREVe+R8AdK#w7#3^dRY7$|{G7 z@*H`hyA~P7p`*+4-3E#*n|kj<>9iJxH72(CPu2=g6J)(@5%Il@SY>G;lb%1&g_|^O z6vPo8v(#Wah`w~@4*b)a>?KW7XH7`GS>e;DIfuTB27Q;$InlKNGi3`N7Ijtgl7PqL zS59%i3{5Ra;(99lLy-|21L4%>)UF|P%zJR$QJFF1e>&Jd$_VT$4T{I?8vE&cKFO@` z(Q%AmDO*S>8VYUG9ZH}^;_!%~=G{9MoA9VuYrW{2P3~u+NJZS{Pz%U%ry^fv{y&kf zP5VsPJ9jZ2J@+Jy{5;kY8`c#3UO25JinN}GaIOpA`#|sf7oISQ<5(2_yggzt4EE!$ zaeZ8OsOVrBH|3X;H=O6~72;vVcB)Gnqhw3f(~OZH-fx}6bfz0)?`*W>SMf#_za zm?o&=k=ZrWOPazbpgq38gdQAwH9eClv16QKeL;_!{uS z5$$Jkp!T{45B2&Nj}6&^8t~*RJK(K9GE*Q=Y~K zyT_{WJZ}ASiaSV?bGni?FWDKjs2PBR^AC+lmJOCZS0bZT+rkb>A-jO;gq|6-jvbnJ6@!SSa}|r)8mI0{&xa)r07%CYX|6VY z4Y%2b_-4K!coyevObTUr5FUpV!_iXZ@S^Xj94*@2exkRlrT`C^#7BRj5Egvm=BhIQ3I2Fsbrs8dLcK8g5itI07wGSd)@RuPk4yb8 z?O=u5F$VQ!EN@ z0A9}7OT4>!&kGpBqNgzy-I~wbM0DkuQjXl_8cPIUG4BaTD69iisQ==wppW`-cHE>T zgTqUbB558WwQ^??`sbI|nByBUTm$MNyFJ1h^C}D>V>wIXbS2bB-^=@+uC61gS762J zi}5fW)I92=9gC`Z^F>py#Mm%^GGV3;Xc|T-^^D+L$h6aD(bNeqX8gbw!K-OXd`~h) zobs5IuW14GV_EpGWz8ss5}uuIzkBWaI8$ z>ZhqNNl2m+IS!F8_#;reT2NwT*J)HI#WYVPT_yY?M|G>p8cbFukQck10V(& z5M{(+s^Q`=@Xf(c^!t0Waf~65v+Pqa>CDiuw!rUn8_^&aB$JfLq@Rq+kpj2VcN-|^qp&>BtxHeR%F!l! ziBZaKIVzgM<;d+9(HP~q$S}QUgQ;NW0cm8(xJM8_HIz_6T#%D!R_IQWj*8a@F44`y zzAR`v4MphRsi->`n!&sM%YT`(ZW4cXKM%WLkE;h>yXiQi3$A`QcgI#+7>bUI`1^xn z9NsL82X;>CzxGl;>_cHCclGjPwaL7y<7$gzqK=_{lKP%|2E+eQ_v1tHHb<6oj(6^QB7ZBJe>K-^J{bTReE8#cT zrHp5{K9@P=b(!j+>-&Uhe!l7DZ}nm?U}23)S6oym$;dCwk(0AoM`nNO7V34yjRm2H z-4g$K^&m~EzTIDc7d6Jz@{6P@Y*GTH#Iy_i|#EY^K}I%ROaLj`c&Cc zdJ^9rr23wFqIG_mn*YlC3KX1PsLmTM;^TJY#Oxa~en^wKaoo5Q#F6zvThN9eaP%f| z>b~|kFpjGGB@Ghn`M<)(Y*Bs=0JdbLJodc3k=5oS-I_& zalBg3kT;9xs+K^`$F!E?n#5J~us+uN7x;|!WyMjU7*TaY_42ADz5AUp5%D#Swl{ghQG%$ zNEu@uj5m4cI!F&1pYnU|p4{O>euho*Y)+Rh`8}B!G_)21+rzE#PT(L>jqdU{OrKRGl$3n8nZjpMzl?d_zu>f0OM(qW)r0OEIPT|F_D-F> zi>88U_bYXu*;vwtI>$Ve3Q&!mx=S(N8{gA0tLqxcry+T*>UJH@#2KO`$%OLG zYmOy*1~2iy*{#ht3Cx-<`#h>FZosJs6{Oye@!qe2cg^D(fr$|nm6Kv@`2A_L%4%g~ zR5!hC-Z3M@yLF%sN>VjGbA!|wusqH=cjmaN_{&=&5!4f;K}M#H$X@;2T)hN$=wyQZ zF{8%*xV){mD^V>rCbPEZbFsJ>RDMw9EEAgqN;Xnett*-{khtk z{JC)?5Q*uM)y$=gu3bG9b0JXTi&oMJkdV@6$j|k2eqv-{=XiL`@S~pB>g&)b<)#+H z!`of`TQ+c$O#1mYDr(O3+0@yk;^31C95+>={6soakcsa1!@mZerw)FVDO}I@Uttk5 zNIYUqj=^1Fik?W|Wh(otvBH;VKn#%o6=ontDp^?$pfo#adcr-ik>Wh%n=_M>{=?L` z{h_;;92n2Gic3M{Dlfq+YCPZK+h8oX{}2-ov{b2bAA4)L&F?>9;?57p(-PTf)R!G| z9#4C=d)m5emU5M$e_XKV%0gs}SV%)(d*UQFskQqj7Pah^A`OcKxPicIGSm#&$EXs@ zK5U*`gLu?i)OC`+_s%Hk2k-Y@K?vYvQ!H&bRW(`}ZkK!E5-&|fnii?~&CM6Wi^-}` zubyhcFL4&mf&%r6ybp-}`}0iXbeji}GJovJWFc_a>W9K)xvRHRW({{gO~qoUi@SRo z#Gxzlk4JBM_)p6)KKn|DGNl|iettjSr@bp`T>?1rC$oDYPZW}c?}BC}hiTCwNnXli ziZ+wfCGtA9?(ctH_U(5H^AzqhE3tfK`805<FYO?=7W{;RsXO^Ugf4+vmW>NM3nELX7n78-;_e`s%RH&&?%9U=r zQc6jSxHn-+`#PaTLZTF--e|eET)8S~(ZY>ZhLkonvP7c=l@yw2aVyL%QKWv)Im74o z{l_2X-TQscbDrh(yq@QrLw!EIM3}EM*OKuD!E>?^t;4chCQ@;!JVI;^^3mOQr zgmh66=VPHEVkwM}I6>W1QozQJIzPc1LJMs1(pYp_u?3a<##k{oU?O+ zV#;$U*BOfys>L=f{d8;&+xr_Nao!sBlt%`+TypJan2ItXzVq%!?}3;42xw{8qX<^V zVL(3(gq5Y=YzW!Bx@-|F&7J2=4abo7Ekfv!&`V8v9%XTh5`Jj9C4N*7&fwU2cmLAi z$Dt^uFwP+75vhuF;|J|vF3J0KB_u~+JIzR|ri8BgGCFn`WV{q6_R5<`^*co-YQi58 zc1W$r_3--JZgK3q#Q!CD@Vw6@U5`C)@e4REHG^u}&}b_qN{TI07s^k4s%vs`~VK)D}94#4i_ zqiTWiZ_!g!4O%=A5t&z<=<29)VZ?*^45v zEwQb-x%y58=pV5WaXQ575BgpWdFK|=bqE*1IuObj^nzm=K&YqAz3_HOuOqk{Fx+AoXi&SSoUoXkzD;K!w;>GzBRT9tLn&gP)^D_{eNWa9D9^v9`Lu} z$&%~nZKz^Nbm#fyA5vs&s-03lB+j>~S%@&n#`mg>$D>lXsQ3%5bzHTz}?%x=d;@GSbmo97Efp2E7b(H0B&cU_;}{h#%y z!KNR-Me7kk<(w@LrOY>mE{5?wVSooFK5El9UzyGp?s#&)*yY_vLPK|$jQID8vn*6u z?6VXo+^gLzl^o;0ybQgOU|-2q8nBSxC;43 z51?ivn|)d(hmjVVVWVQ5@zP#8xU+i0iXZtj6(#*-)0ng$GT?4gJoV#Y{~gI{GtWDn z<#kyX=wUJYiQTHDdKB}HIG!<89&781!G7_`$G)b9ON8N}G0f8P{|vi+2r_JP zZ4E<9nD5<6DLcW&k}YhJDDU5~1fC2rLSdA5@WKPlGgN2na=q@w4p)$GoZ(l_d~CYg zcKv7PAdsptP1^=+(m%)Wt^<1D9EziaCltm-!g1N#lm_AWHlYlOBmCTj*d0>m%;x7V z*PqH?dq%F^7nT8MT=r<||JA9@UqL4P^kyNyq9DT-0pQnh+(VU2>#srL1k?(zaXAQB zf~fpW_uN(}5)|5$$p9b_K{N%Qk)` zB>~ZjRra&{y^%FD`4Sb@#L0fOJdYibFMsNYCl0jT);0?F!~P5o2#zCAEPgl)CJXfs zF1&-(QAJDVsY$DqkBrPnHQD+fJkmh&_Y9Y7_ib0@j3x)UT?EJ-PPku$|?9FHFDzYw5Y9=Pv7S z(ixjjcTN4`V)6ZVK`PbUD69i~3f6&ro>&JGaXZZsxqNpbx&ml~C>SzFOfWFxj$%ks z!p_h-!IQR75BtfJSC$Mu)|ZB7A_MW1g`s(7Bw+}`9%3eA#Thy7L{3NC*B$W4>kQ zk9PYBs9Bp|M)i7li;oqG28&XX3Q#ej0{ovpa>=;ag^}JDBCZ9}NF;PKpt0g8xX4JDF<&Tn z_wlD}x(14Sq%Ww5cYQal z(0^5i{XS%DOW>4Xj?H0Hy~pqr(S_ZY`H=ql@DQhigT*48W=46XBrpGVHXY~BKOSfv zq$PT6RZsa29-I+en>Y=TEx^?9CHQ9|7C8dWLa+L~!fC`u>jlEWAmxPe!3%~bL(w?< z5W!BEKZ17zPiFlnaR}iw?Wa~)Mj>Hw%F$H3b)5oHCq%TzvZG2In{TFu+MtExQ!K7F zND>{60=uhBz4ygE&s!Am{wi1OIncTiJ{NVo=jImRF~RtTo#Np?-wjJx}v-tWH*LVt~x~h;zroOBFF~v^brE* zZ37F?%{zCgpSr{{D&^6DZthzsAorJ);5XnkQTg{5HsV8^8)s(|2|O!c5J zN)QDobtYo8)35F=`ec-M&R^H*3)G5f_E6R=DOt~vw(fmRM#Y_3|3-jt8?YaTA zO)|kF=o@NhQdo!Qn>7e}))*%HM{tdsGwu6Q;y(DXz>26lov^H=EDmastn%RL@e=&-t9(=Yl zEgU&g43OHRTWMSv3G)yh>R&L_!v7=9bGgk%Q||PV_DY;+EJqbRq8r!*r`0OD97^gM zAZls6{N31JE3Cll|JUfZ*=ww;)L=koZ1v&eh>MNH&WZC7uiMAQr)d{IgyjR10M1eq z8ua>Cli@lyzw2S!eT(QxB2up`kqwrI2^zF+euQ*I=*2xK-&rnL9olAB3A2%J(aOX< zMtOuH$41OlZwa!gOQ=XgM7mbH)c`uP)bWls?6iiOU%z5ZQ?SoFkQI3WwL%g6*INOv zP6~kS{n#t;0ptfsS!@lj(+afWu;T;Yz}F@dhOnhX}O10m+dxo7D82Q z6wwIGKm-p73#g^tbh@Yn(?6-|bweDM3ZN#8aVyFP35%DEyAkq?HXvqDm>1%rJmKBL zI(Pxw6YC7BYS@P7dx)bFG2gTFDr9(v{P5@%QSc>lf0t90+hS88!#QkIHK0!>T>kMZ zc1c$hi^Y?LMjUj6^%aW6ofqD{_89y!VTLPp{C@#mLSF{5b8Z7nqjbO=dUC!{-2(9k zDEI@tdCt<|lnU0Pk86plTjHJf0Myg3!r;j=RKVToF- z@6z*#5U$KZE5+P1u;X7uu2$S6-h_z58Fc9roV^wkL{|oW=sY4x*+yagJ(@0<%k$5m zb)vGn&@;CdA>W^)am0&Nh8IhgiWX~#GL;quB4BRDE;?i>5Gh^7fXavo!d##V^4Kyf zPXp&Px}(DByBU#aD9uU1K_)~I8-JH#yu!X4DR^XI5!Hk9E=c3z(Qq-jBerRt~fk2EgYgkYF*at zD%xNqsHc@>cAFFHv*Jf~AR#V8LJX;RwCgEKG};8IKopU4xkdrrPQz*xaRR}G=RN^8 zd>{*9cEvPos<{|!FkQhEF5(j9g(xE02y%WHUalPq!QJzU6Es2uFjfpaqreZWMC>gw zmg=SLJ$z7xv8_bD27G}zF8Fq#OcCr0cjypiE9h6t&I*9$SzT>sNGe_{e~oOhw}MfJ_j?J3P$!*2VVb$bzn6bVu-jJ6{$9A&~bY{ z6#KpZ2%-cQV=FneQP=CrG%Ly3XtC2%s6qM{Nx-wf!SCclB?FGY0?IVUU-2HS;~{E;6OT1< z;~qE7?|Klkx7B_&z&jEK?L&c#A;Z_0YH7nD$TflimU(GZ$RrjlkgI6V2M?_>9}yEB zR|96vKqirf2#PQ}evqt3(2Ba?;<@>uzb6_|XpY3?Sk608=DzVP(GH0H9{~X_^n&&{ zGMt+&hcX<}Rq(Of`HAhFwBj0N>pzGM+0c5)Ztb*3W5MQc2Rx7;-XW4764~>oCRi=` z9OodZ;7#6qPFSX983i(Sz>AJ6<%9<4{n6_ZepW`_(dGSLY0yZr@MaWKj|^`z)xsDk z1|txLoo*^>CoT-cDgOSya~Ya5W2~t-6bEOq{xDj18JM;NDuQk6Iw!*%qz|d4N+nk- z71zR&N2;P_vHZQ-Df2;bVmlBUKiO5iz!NBADXo3z-fw~=B8$WOS+Co9Z27fLu-pAE zG$h0(oc>y$ix_7;9Fz#rmtpLm%ytEiG>KqG-Tkc|u<8(Bp zeE8+h+`NTO1kW}Xj5G+5@{Khpkqv*p_9bG<_%tMBLi*FO^~uhYGEUE~-bN@GnkcNY z#6ZMmt?vD5@W508vLMcKh((xNbsuuX-0D8Wt2Kv2vLC&5hY_W7s0s&b%9lCh2ETOrfc zM`3ui3cY``jpn~i$ZgHSZUDO2Nluk{)l|lf`dF@`S39kn53U;5Zo?0oYN13ZuWAkj zr077|5V(c*zQsB@=ZoLGS*#>|z@!L)?_<@`lFZ z(yVxnF=UhNPC7F%S2SCtR=i@cm#ui{o@c{e2*k=pQb@Mv)#82KEN@_~X%q_b>g9zfku4}AxO zB^mK}z*_EAjxR9ctV$@v?R&rNc^-408b4LA_edzgqYGFYf) zpakd{V#;{4219COI5I~;ZbH099g`U2!kba=xG+gWc&;8@BK3x|Hx4UBV#0i42hCbGo?vua9{ zm|2A)W9qOzRK6u7NbPG#Pr z?AB5=Ou=#-{s-WA4MR_ue*pyPL=ON@%KQcK_0av81g?C`GxXyt8GUzQ_P)&Ao*nS} zBJ4|EKVgTilPoOiq%DPVnL29SBEw@cpfikIC0HlQ4?gvXhxqkQNW;h@JEqdyLDJng zg(p;&rI-1RLlRpoR~V478N*OvfT6;^)T%%i7-R(Q=_93K-_)C*%^TBjG28|GlHJ%d zvX%i5z3d|nLJ6NI**>5XY)8A`+S-h2Q+Nh2N$^G#6n<@Wxx~!KBeo(YQ<@D25QZzW_js2-3^T(RE4cY!J$WSMoI~?xWY@S_MB! z{`yy`n8JYn<*m#MSZ0D0hIKaI1y1O?e95a+`Tq-TugiG|DV+HNsXYRzp@K_J#H7D* ztSqJ3a3M#phT$m*vm&sLTl8U*3pn6K<4a8 zoZf`YtFT!FRigii>KX>N9C;kqnMVtkUMvPb1KbpRvh6ZPrrmf?2I0A*YWAQ4;~5qh zB3$ILy6WDA)x?e0uuEc~aZ(+MxS2gW!j*}e8BE0hYUDf3z&ONUg=G8=|FWIKiaJKR zp^+q5r1)P!SDYPu>(V*Xl?a4#={Ro%YY#u;Jg(b1I6>p8 zvn)vPi{TxxtgSf1=*18LwuqW-IDk_upyCF+FkCu{eLxwe;RFxpkeGrqJPrUN4b;CJxEKteAA`+cPY1zn14zMQnuU>NRt0MUZ*h` zSSNu3!V|dCeOuS1;=b-Zct&L_0v61Kfg9n_TISYy13;5oDV3EDPFbYKUSEp$+O~Bb z!ngc8g14RV(ts@EObt%DzBtE%kH7^4mIT(Oh%=Dxz<;3nP{X^%`}P1jPU6rrhD__Z zeDT~3Hxai-)!;LaQeF!FR0Bs1v!FsXC$kOC0z%XCo@Ta0DTI2&olY$i%r_Y3J225l zW)4-mtpm>bB+#d&waxCh0u8jnGGUOf-(AO|&iPw}Mt1+my6UoND2|2h&p6l^4R5Q% zeTzhdn{KKH0sTMD6$BLJpto5VkfazLs9sVUBNO)9A1F6d+l3+uM>X9EnR@Yis|4b& zBRAn?+z16a)-~L8>xFYL;L%|aukj{VVmWBTn1^Nph?(9Q` zz3jYHGL}OfZv7#a1K;gpTSaF)o0Zv!yKHCP=nluCa1eqEw#3_Kx;`^Y8PC!Xe*)R3 z=JOBKs#~Bs*f?-f&UrX+qe91{jT#K89W=Ih#xjjjNI-a^dl`0TvYGbkWnn>zjAvH5 zE(qK%JfwPFO1k>|Jor$@FYus3ftThM6yqVZRQ#_;Tm;qUst*5su<-yI5{Wf+`QRIo z`xU(Z2qX`}VUnhiea%Q}sdhZ626kS8VH<G5emk4n@n_)8jiPwF!+oV;0FtM38>rtHmxPH%;dGmm~J_N+J+3A`t@Q=*0$MY%?vWVfr;VK0AU@-2fvoe=7 z4o6!I3jLgVSM?Y4Ds6>#Oszl)NhF572o{nlTgy%A+)Xg7-MFa69Ijdll-`UGmaI9X z)^ESUfAfDCKH&%;meW%zx(K|J5BBA}-+d}y53Z65diJHx4X}2zefyw;wOjFXW_tn_ z9Sw^v5(p+8v*IiskqJ=yt2xLEu^1pZnlS>&{KnvluZGERFI5`x#!pI_Slt$3A310; z9QzUdiuont+JOJ)US)Lg($IY%xnWG#(%7FHaPVluQ~)o~PRXkU0Rp>Eq zc@NT)I-Egpv?l4_bv<{#7!0mhD^6VODueC15x=16n&W;dI3qBrpu~Ku5W0<~aECbW zfVzff47`+X=`eKiZq17MApUGP^9tm1!4`16w>MC892l!W4{(i;^bLC@vkN zgLV#dGA9cb8{jXN=nOOtuf8hn97`kz!(MU#j*E&Bd|iy-Z)A$C1t`ae^?e!6rNG`* zagKgCykUgS%LS(0#Br6d{=@3L*c*COH!awT2!EAXfGA{gO$j9xR=Y@n8mW#J%S4L# zo{biZe1Hv~uM2a3X`tr<7##llg{O-QMT*D%vU1*#jjn%5UKBg^U09**^g|8Eft@fHZ>z%h6rGS$$k zXc^SNy$M^DA*8k#u@cchLBsi}iK^r#qg`+wiw9lsBl22A!wNmmZ|1E+J>dfJb<|XV z`acHu*e-*G7xIhVxqTBRa7l}bW;~(XsoCi0z>-0W6O*wJ!s^@$WJ8?Gc7qJi1AP8l z6d3V5Njr`IAk`snylZoGM5;*a6~uq;afGb;!^g)RxqCKJy;G3wm#b4 zg9pHv7i@r8zl@xby8kuVn?_?pFD^L|Wwjk16>>zw*Y!zN`1&An0t|$H|f3#~{2L767oP3Fp0OcUq zS1?RR5B#y9KC`ndl-OcO=V&2iVM=3tXF3@j3R}{C^&~71nYbge%t=-k%|J_FRI1}U z{?$(Ak`ZY-ZgAj(?W($n!W#;3z#~rF2^Doc&yVBhMQ;`*_lG&lskWo;MLWD!-HWjd zrhY33!?$iU%A1gzG!y&Nbe-hk$fRY)gOVW`u0U*_ewaMZnXak&HnME*Lynw97m^C5?D}xF+jeCbG zJT8b3LsWr*jp1erf|Xh4R@3rUBX0``BWD$zLpz3QI^+c$=i&6%q%Oz%5h^yF5;xze z>bXb@5eF%CpVtk?z6Bk_CuRWN+w$FZ?sv=D`7R}${&2n!`TR7V+rAqJ!orP@^v$kO z*`hc17~@2un(%RSmxOU+UWnXwB~1Jxh;8y3_yhROedv@v{MnB}2JczXk`qm5?m!bk zn@AI-6xkBN*(dOrn>)T%jFJ%-1_wtRkWwXpzPn`&XSajmvIT`=zQ5CatJE?*aO%)& z6%v}>w3@{3a!ed6&6I&=!ZJH?&}cU;x%)993_Sa#7(v06=V>-{%KNZt2}b8%JSbBRQY+`CE)a5j}V zmm+d?^&D!=KkVrKBsAky?WB`lg6ufKz|3Aqqki}l(+v8?Lgr!5!qV*5iY(th4ZWj# zR<4TOe*BM1*(GzJsZ1?_^L(+-W=i69u*aTTM5gN+s*f-`!a3$842HEz@Pf>`Wi^j& z&I`ZZ1Wn$CrrT2Wzc>*04FWNa^lcXCyRFZ;R(MbJrXsaEDTFZmR4n~G!8L_Ya74E7 z@{zbObX}Zxcxi`J7}1htukLTi0}&rYK7n5$Fsl4b@lFgUk<;n#6FI9>18}$jul&8=Y`?dik1!mp=iB$DR{j$-t;JIj%!mRlRqCb$S8bG{o~5W+i$Gc?SA@PQ$Ogu z;#^^4vwJcyIJ_H6dxC?;=&Ptr9b2bJ~6^CSn zKAGpc6WTAC`Wg1k0i3tQk7s^_vrcYyFRO;Af9hXG5ef2n_4(jZ%O`^eA=YpbFrwq^ z_bhW6G#G9pDy?$c{9esc+ixl@(3^bdP2A5lT|NWRf|T~dh6T~h7@hyp`wuq|PU0wm zgACnji#z+_UAR$;;Jpe)>13rTw*gKRVqaCO6VKD|1P=;>7Q_4mr?%9k7xC z@*>ZcbG?+zHY>I zadJ&jdb;1oq%t8+9YmRcS-V+id>fQ$rcx^2+k{>72-#T<)w zI|~)RYQYitCE_39I&zHwqiitL8Fc}KTA`<2%lMu8?f*)-=*|Yn1lHiRm~SoR`)cs* z0@2T0_t|6Hga`5QRm_|iTq%qlJBH|-EW`3?k?4Z{93UbE^Mv6G;?%4jQ|UW7)jXT5AX$bYW93z9cqy6 zi_c+hC&h>suKPRP6x3u80`K=w?7v z5>|WB6L_*x&D_)lHJV0d-bC5ahk+37W+li68GrLcu*2Di=X~>DV=ry$$s3eC%Ah8& zNmZaGk<0N%9)M1A%`a2U#Rm zWK9}k8WIhbo5OJV+wpf+tLe$kiT7*qp5r55E8enV9R&b*7IVv%LZFZ@Uh_W^Q%7UE z*y@&0ZTuaH_r6t`0T58pxCqM0;U=BcO|Dg_>?LMWZoCKVAx&hampf%#x=dMAo-GUK zvi`^j*iEt5$iAD8xt;C=JLk#=Xvwiuv0-?w1G6>9cEW6U1^$m8{j4(>;2kzv4FMn) zX^|G+%p4r?4{;SOLKR zUWZE@t=x*mYY71&+J@8AZo??kNTo(sjtK+|BOBtsDv=W5Eznb)hwes%4eD49G5W^XWt!vdd=ws?83^mg%n})O8At7 zA-Jk7IJ$H@lyr`)PPT;uEMT(E;9eJ4`fY@2fI9}D5e%P@B@pKcUmN&iL(?pT$SpHu z15B~jtj5lR*)$;Ho8IJY;Z3kEB-DAWlO&p1E+fzFOzLTzQ!v$of~m^%YcZ3S3yLHembO95m{E2acwvCuB`1XtGk*QFLQ+%Untv zcOH}@df!JHWUv6+%|x7Q@)x+5&lvS`5hgSVub%`EyI_qNekq6 z*~54)Aw_jJN5`wA$X9%fo!|fBBy0Tyd#TSj_;KXHq24e8&^2~?ciAf{L@r2&Ef1VC zY;*vX%)z0H?LWTbV(e9j6a^-ntIz<&w{ML=K!OP?z}%0WWk^QdKUx(hqnFMfyCINm z>}Y?1f2%msfpr24Ng5D&g=YQg@R{5|I8dZWP1`dDRMyga6&%R^2y+oS4tHIXh;9|g zb8bkYJp$4Y3W#nq3>ZC^=?ye@mGr_<^~WUXr7+Cr@o>QkL2gc|Z%JwJ=i4`K4!&n}y z<8`~v4#2%(B3N&4g@Na~mqPNWj%{3?)Sct$d-I>G6F~aRl`pdf| z#h}c9i|kVyq8_>Z)@xu2`~XT{wp>ji}S&XWbVj> zX=$%7k?Asge?ixJaV!@zoYIrYhZn<<1al?-6KkB`_93Ju^Kr&9Wf^rKG^1%XF{MZ^ zB|3K*M4@!~&E>8tNCmeFiXK+ujd>vv?!rXOm5`&q;&eISA!Z;lChh=jz!d97i8-G# z{$?y0mLM`ofV4rt`Ykc8km3rFs$DZVA)f~w zsQ-j`dyBRs?*h9na4e|XE+zExKL3phnOu==uU<|t*Cm{jD($19Je$*naW(II^AM1o zQ9U`)`dZgj9ij6>tWZdU`H#@vISy^Q zvEIoOPCegyOCVhD++!+t<(CDy7Y&&|R?LTWnEC~;gLw+w^$MVSwpK_rQ5f7kphhmR zh8*u_-r^MX=lYhnxk4 zW7M7EBeZ3YIehzhfpeSDtFB|5k?Ek9(|m2t+nh4iaB1e{|HsvXeJ9qyIxWYl6=dzx zm`;B`=sE`tB#Ad(y%7LE!vjVA77{%3;gcokvslzyLSG2Cm-_p#f%02#N2G+?AaY(8^_SEt_*@p^^teZF!jSsN!?)(-$!uxV4YU}0hcUTuO=9LG!Ug7!rmJT{ z{ggOdY(Be`;9GF( znBdACN}kVVB}*84Ja3YD>e2#MorM=M!oz0~ur_i8KYBYzHItzl1p6*(m76R z^X3WNWXH6pFr@k$gKty`4a11(19x|$BanXf!L95}Ohr+gdGJ`F5;byHYy3)o-Kq3x z81gNFT#9=`e-+;OZd6ET)VdRRbokD^yjWRu{^V=46&|)m0_rq?lq+jwA|r0Ii$?4C zH-9B!Lz#E2I8S5vB*Hc^g6aP{Jzg84;V!Hn?^ykrF`F>cThsh@b>3b<_C0aOd#Yau zIN!%&fT=lpILM8isv|V}&)5<>O?(rs6+@XIR@X_2V(wbGOQPT@uEfpY#EH2Q5~q{q zSE&kj??Y7m?~Bu#SpYoFHpI4(2Y^mxRvEzo^8CYCt33654;_w5{hFdnZt))WAJNlG z2CZ5S52K`f(-6RqXk5wa4sLYSFHWe_UprGfXF1!FmY6oa=CDkArT^@0I012z#qU!n z?#}bae<5f|eUGTE2kpZLXSU5ja>n1#DP!q8d@?3`c^<{z0+pU-q>*o7?ioya&t=Dn z!Lx=(_judQ4l9qFNb?LDl33D|dv956h?ZnET8cSblIXUZwmzEEq(*K@`%A7|srX3x zj2V#W&&W!+%BAbQ9<@SUBD#l1D3)F3CH zSF8~Iu8{?THpCv+v%tmlrI>zvQk{nPJ<;*~<3M&30Tt1-yeLx@FUS-~G!nc)jnnlo zDH~KPs!N1jG+HOQHc1vq4QtTZ39IQR_pB^?zv_dyWl*ext&uE|OCG1?>We|h{O^Yr z5~WKMrimI9$1Je}>3wS)dkx4nN&3Z08TRVOl!qxxIz6@mBAn)_k>%Oamtl+4GrV-Z zy1p*HL;co^jh_!2mcaAehRy}4<`O}kzyM4+!~_zx8=Y5~Yfjw3#jKmSdIwjP#%(Fu z1Jqng8aL;KSb{aKZB_0^xtgi-eI^Jj2&W8ue@M@ED<=^TLdTyhjvCSXx{Z1sR~M)6 zvWVhD3XzG!$JB!99Y->o;3ku*huk(>*4deFw?UU7icG=vN776XFOlbf{m&IHHv^oq zLa-9q!UCG?VMG7;EzjBbT3EPMUN?$gQ!@iC$d%k|sQ{Sec09}6;`nRLLt6b>-7mki z&G(gqLI-RkHYfB|07t_hly)H!jK6#2+MCT&Bg@DwlmFe%I_xBMC&hhMM^}iLphzMV zw;FE>o?0EHcrc|Yml9H(tjd4VM0Ye2-X5pnduuupkVg#$J+H! zt}So2CDKh*x<$p{W*|9mOPqw}^p;IgFGZ1#wR_!@Z*G{Z1)^iGR?WQT+ra%9f;eU-n50-+15yXoead{c=2mlkq4d1 zgOPA@bKj`;+&&d5X@E7oy%MK~V>&1mB9j>-={1CLXOqmE?t;xq&Nhq^@jc5F$vCKxcA;Gt;t|Tvo-S0U|VmG@$an2t4;L(DN>0nU=VQNyr zZYo&OOmn^TJ{yIFi5F%)MHNz@@vI{O!XtSbZv{W4rnlX${f#lXDtkEYvGW+)<939~ z$Zz@5>7~G@ZPb{!1Ey9#91;pi&X^Q__k-~T1>Cpl5uQgBQy77yIYJxBdZ?Fc+Oru#dhpZkJ^Z(oZRVS)0=?WKZ)x0Lz8{a;N5~PbNjci z61{ZfVPNHcBY%sPyx*sLEd-qLDMs`?C|vg%1fFz9ReayyiyJy}0{u0zd z^sC>7@Y}@t)M?0=%5WXGTN*Fn{zvKeCd^M$yPZ_-4wYDZhAzg)H)rMYip!JF7^A$k z8`r+c!vclVNZTcSefS3uXd5^cn%1=2vKI^31TWg*N3^pyCV~D{XoZ8M0Cj8?8>4|!4o7V?~i zo{gRN(__HID=3d!59%wq2wfO79P|Vy$(rwd1Ny6AA&*O0-u$2$coNV8^9oMRUcV7I zMT@2-%6GYCgS{DHxS*7Vsg%i_ycbB1)G=SXd; zVCHdki;c))Nxzm7xO!#X=w6tt0>tcJs6>b<3V*yfk9jVd>%p?ZFQl&sywlg*cHzeN z;Rf)?2!o{xd5fo(NmE^Tpf|V3?9T0tKX#~ zFOJG^E`MbOXx@wFs>RQJvl?w3aWNr>=Iy?F>4ww?b$HYRJ!(16w`IZv3PErhW<%3C zT4euaNOtsNZ>msxj9XrC8hR;2B|6HMSgq^J%Xtu*PYLR+p8)p7jPZ|os$@MMB~~N$>Leh%ds~b;8G;UcTw`+RQI1DQ8`EoS(?T(WX$M+}hg zaCigk*tN779}FoP_Yh_mEfCKvnweS>K9S5_@kivtwhMQm>Lyljg6#xt+k3UOS)MA}c8_UH6 zkBbDv$r;}qs^F}mYglRhJ>=W|DrVdpw-uTk&Sm?^fla`Z`VPzig6?)59Jhiy9iBHa zpq5o3GBT&Kl?sGYJ4?w|b5E{}Wc3z8md$|^jGmXd?LwwArZ zkf_yjet{@=+o42spOC^`Tc0;NC(6=tqn??6plU#57TGA!sD(v-m%@iDG8aNQA1C}r zFSNU>>SSq-r)UFgKkSl!Z)U8?ODBU7f9|jfHdZjXM*#H5VN9+#s)O z4K`Y7IT5ze4JumgmAhL-13}aYxO!uz>wEe2(1Aq)D_$G1Jz8FO{JdCu6JyOMSD@fg z^eMk%1E9$dIW}_XIl9D(kY#XzgqD>^f5}ppJ`eKhE$m9ucPk4B!9OtNa}f_4jOAQM|f)6qC^QPHf>rx@;Pj8Cdr_vgAZxygZ1 zRbD4lPep2YNx+eW{ZN~->}~Gq^GDmIkRR+`6?LE;YEf-)iOC99MS>T*F~vXnK?{|b zJAJ}R#m2I?%MJ2ul=G2G9rdK_*qj1zDeD_ukB%audR3Wc|Bo8_%`)U&h*Pa7FYcC& zI__cZI!N#JCbEwFksodITOe>uu`9uA=R8u(cdAwq5$N|rtXP|>G{`5PR(Y9xy5loZ zJ#QO0VW;SBYBH{;=xZWq!4?`no984fF3TBe7CFgxHUk68!`w;X@st#@GThHoo8T1U z*Ks@fooeJNxCp1>u83Bhep|*4loP_0=s~@?ri-WY>2TOLatj>!5WA<*i_od?O8QuLBQhK5#(!e+sk_kK>#}90jmV zQpH^oVq04(;|)q6P;6cwogsP?4jP7?XjpaL9~8LAj%NN-OjtI)23p4BMe47qc3cEP zLU3P8<-_2L8p(#b_*I{#AJ3e~LU@HX5>FJbHS`g_*%AT*#i)wCV%&DvJpR2lXUOi@ z0~^k^f#LUR$x#G6iWVwF43Zny45@%w9k|#g8U-P?$hhsCO4N)QhJ|;WIeib?UVSr% zT_{6=L(p+KVO8X(WoS)rznYLOH6K92VXT_I+P>rI1j!aZ_11bSan0J({q))Pn%%D? z#M;fn@AKa+3p~k%!0e4Dsh6r}1l=BudZm7n&!cun$n!T&D|*d-dlNQKv|wKl*sNl{ z@YiiZJpsl)3#3zO5IHoB6lc!OXzS+Qg+*k|AN@=xFN4}`I(8n|yVruVmM--2tyLa? zX|5D&xYQw8?R3IV9SF5iP3wsjWuuKC8GZnoCtn0Altp!G#hKfWNp>n679!a-JMpci9s#=60Za*wvE5oby!OomAsBLMy>f1fz-PesaO2r2t<>j3K_ zD=G%6g8JtU_G@i)3Xb>Eyu(<7veF{0%i-vLU4qkxBg(cL9%XieJZDJqfVrB@QNV3Z z#C?ZWoj?j%vqNDfqx=qV`~1x)&xK1jlbRtd_I`rXV)2ENJez^x@Ohsvh%&7I{L$zt zyKh3qGT%P{7Nr5V7^%P!b{i+p=*>tAS^O3q5W{_I!3was{JHgyY9)AHVLdOc) zq}7o60T6O-a{70c1|o2sfCq%4Tr!$l1J-#J4PSd7;GMA-oP0yGaGL!RlF<}S-1l!a z3{WKXms=WL%c=+d2Op`&I>S;mZQCgeJ$~es)|oY(^rXX-Q~hdsSLG>YmMt=X^y8Hw6J3rtm-eeT6a5Qo zW8WFQF0ja*g*=M!a@PH=|1Bl-KJ{Oe<2kg7`x|RudoRhRwF>>{KIL5)xqtLU^qV(J zjlXzLC3-zWgSr7)elg(h!krGig%dw+aqBHld6McW&&zD0kO8? zSDsdm@2|W2^{xoqeTz|r*+9~#Uh|o=3jw!;y7!5VY2$kSk4Brj|W=Mn>oy z)IAReZ7#>sT|7wpG)@bExbIb+O|RcET%>q{4tF0y8eym@|4bE-G|B2>m~>L<4f6JP_y!k0JAMFOnU0+BiZekG(8^~5-IT_#c9siK$l}p~o0;*L z_9U{t>ay-zAQHbSNTg7>qW^EO1Lj8@f^!)wMJ|o(EW9+%jrr^o9h3U;H1u7JznFu5 zQ^kJGWSILp*l42w90qPuo2qua@C^KcMJ^mbD&=4(ydLTcW`t~#Lcq?TPODatBnZ{p zv9nu09>+6>I)bsYwZ;lor`YO?vtPcekr$DjL5^lsq?RoTxAI~r)g};9D!87c%K_t# zY7U>98Satr4#93r#6M{zV^{cSIpuJ{#fIJI=L(5TI8>^D<8iT$lB9 zw26Q@$Yw-~ua*jeMrI%-5akPcxpXTXIk3}l*LVd=tATIUu-brZELHK&j6GMNwqv-( zFEdSVT6cnfQ5sZ{JzXr#OPlGP%4v$BYT)ju6Fmq+z#Yj*58MA?Rj)zLPQmU%hYiv2 z&$ztLf3GNv!E8())Sfe?!8dK;p6k?O1lpBgi_YO?1`Z8cgfy$ zaSuw9$^eQTC8c@4PFsImmRtgA2xkS&th=*#u#am1I}H*M&AO~m>SR=X`M>buO-OSmiZr`?s&gT{8%duBhhCj*{<3x`b<^9@QyA_FUTeNUN_XVzwby{d@FR+Dis9hVVf*zm>U>g^~PC+`} zeRTTGRj-k0kyRmAlk+u;rJ2hs8YfiAH*ML^XQ79`wFjDAHPc?*q7dwz_z(6(Wvpp? ztBsM|ox-h+@ie#E8}F%1#_02NFo1{EOsH}R4o1G6rZ>8E!VQR&i8}EcWnvqh<}Qa+ zkybAvpwFOmUhuOTRKo@oy9!d?Zky?|SAV3u(8VAQq4IE-p!=?7S_C-f!}CrzUpYcvVdUa7BYACiZ=VdzgKxEv|r= zp~63(w;dY1;16Dq{=FiW=B?r@P90g$UYVt|5%?&~28{j1Qgk&=C@ekRGP!D|u?jkO zU^!J6^zZw7iw6o3p6Kd5;;5?LyXK@STcB3^lNZz<5$8P{{PMyQ^q`V(7H(N)1~De5!nY(U9a03g&n90t@wmGIo(>pBt|=EE7I-s-@#rZ=y|oR zVrc3h`Zh!dr4tbz^^sZ)v$rLfl5{v?sgJ^{aJ20fW6WesyjFok8174j7IuE;7C_W^ z|NmHN-6`mPN%AwJvNJ~O+F?hj*1+MHtK&bKFuQ;D)S2c#76;Fk*3uGvN{k4R!(TcJ zS$S}V-nBqVNZQO*t#rF9ltuL=MDf>;{ofQSDOO3bCu0hiqCOIxXU1VQ_mz75ytIU-Hw!N#dWjknXCSUc3$wix# zl&iupuKGe#UXM%T3vl04JCFf(ADLDwOUieFE+JT5V8zW=Hb`^TwXL>Qv8WkpYj_eKU+*8*@ZUI?*#GkBSV-LE9Y+UwSSD^b4Uk4~Y1`)Ls$7?M_Ju9bH3 z76vvEO?7T)!rfW}JplQL&# zBtbuwI2k!}TBomUFl=%exg(=5rJUe2+`ohVU>SaM@z=&%UXn-qX<6Trp&bz&8DKjI z70NYp*jn%<{AeUSm^WZRS`VV;!Id*+$?K^-&amYI z3Lk$X{mE7L9sj|=C^WhrBWA3lKc4$51yng<=C!#bF=HYTAG2NMtJOk6UmcGnk#)yR zAUP|LT%B!^+9A;9li8d0#tDh1-IuYM3I#r6IYPg@y8=Q1npE~XuGfM+Z)V);Ly!cT z`aybQS^F5Bl#f({pFi&3^)olNedG*5K* z4SF34I5sQ9^>eVVPF0aa8z(fAc4xqFyKz2o30kGn`(4WsGn>(}gyV)QlWtiariD6vN59g$tMFz#Zjn;$q4>inabQXee4)iNKk7e8R#Vc%;X^4B+`rGyMk@~ zKRWbkS1?p_->I)hsTLce1Je`JzA@;Md!(mtA5|dEFI=`G?mX^}M}6O2uA72QE}U%# zC)C>T?NB+?t!>`yU)Gp&`H0sF>PU=qzn!9|@{{w&3#H*2%G`C*QQ5FD@!Y`=4g_;6 z`3EgWyRaxki@PM10qT8l1iQ!kBFwm%^-QP+3?l z*cxztA+t~ejv(jsVRgwGNV*KHff)kGqjmQ}i)bNBVSaG#7BoC=t-?FA@Qy4&*Y@0R zAg+qX^h&t$#(L6h&LUpIc-b4(hFj7Q@>T-z`goqVW!6>5n579a7k|Ms)wenViob2c zCQzG5RE->jm zCMLVc#E*xP<6OwLX0+ssYLW>z0GdXoyE)YlJ}ujlU zKo^H@>^@nIaNhoNt`;G)&|o{S0|(!mdyi6+>f41hf@CmSrVJnQVcH*cllO!pLchAD zT$_s#=)76f0L-b|owF&156Le4oU3Hiho~vPs{q;c?2Eir?hU!8Ov}Q+tVh*RzrfQl)OAg*zcvoGamFpo5m0W ztC#P7Huc*~?G2v$;d~jX%>}O#rrKHoE3lVkyZMfG?2Df{ocD5jw;w+0s&`<)=R_}gtk;y;yYEDEIyOba&*{*V{nvz)R>~W zk6m&qlZq2F9U~ggbS^`s#1{q*T@ljf-11jNU&pqLCyj5>^ps4qWSa@j$*8790-TF5 z&8!Q0YQlw-i>xG!2`u{lY9X1LD3IYIwM~@L5P1~qb6QP2znx|TxxETLfb5>sGKw$n zP-uz(13wd`c1ImCYDBPiMYZndEJDrW%TqKd((UG1+30%=(O4#kyo(NyfYEc;<1>WD z+^<7Ca~KYY6z#aDV+{{g3G`!R!D3$1l+ybuhwZkLOnnNm2%GD%HI+~jiSsyyTH`?K z;wLLblr`yKKjpuWf!5zgO2^O-eUDcXgqD?+FMVz)p1)sj!+4)|K1V!s3r}&&5f_Ed z+o1m^TNY~fg&9)xBoY<&M~82J`LKAj7ZG(umX#{#k#mMh56H6K*gpH_OC0YQc6-;- z8x`_Yt0altg0@7s*r`XNW;AqCnifZ6sqI)>`E-GH8r`P+?yQzhn(0r{KwEfL5FlAA zr(3?isswju0bj-_DVCrAO@@=D4CXJf#Jk_q3k0^mYTI!mgAV`#G3r6iRTplHRL?j< z0Db>FO2#9y+#NnOB!INMA$1e<7*!VGBx7N#KnS6)>8?K$s;C`6pGEFYRO+3J_xEV; z&oU7Jg?1;2TQWJ_Fa3t(perP&Etx9Tg;uen1SsR<5d4+R@;X$O=GIm#5iOD?h0&)Y z!%ZGrKZ=G$0ys#~z}Q*-nGjH0uI-arE>7k0*?i|BJ@?K#m(v&ugek-ldy;kvF$^RR z5-K`sRSu{5SAtkOGbiy(Spga3z&J-Z$E*{COS8U-6ZF;pt-+x7wg6huFVBy>V4TjZ zJFAQ71m~Aaq7#pCj(B?3cePATk*;U|EQGBU?H^V!ZfN7(A`f42Gvip<(XtFlO$$4r%d}(&+PvF>BoyI&E=M*FV!+ zw_F(x6`-m}ta{NuZ262C{OA(9u(xNq4*1j!Bw{Ym&e1kH*1~X4*6a(A;S%vLL*#Ue)0C#dcGuu2s%W}*=C%c z@Ap*&WNOT+icLhQa@S`j35FQOFp|-J`e&1iqIOzm+!Wc>CC7f+SeM+@j8_C^ zIYJb@+_cKnu;C-(m$RRQpG5If1`B#}30I35(b%^7>LOqvf^Lc!sG*f@6d~Zl&1xZ_ zB>UlDx94d0CBOoxFA33m&XH{VdwxJ1x1amfGt~lqb|hwFT;*t_bV2ny&CQDBtWNf~ zcR9$fd#T?!C?9Q>KA-!sX&t4~I*-eY=N}bHg}#*QF||lnHeB+)56fxSk~^)dxx)BP zUMlLFb#CH@$zA)`_OBz(G=wP4r>UCGP#(V^GEcFEbh5Ukulr~|jf*9=2;0bBDFW_@ z`A^Eqs>Sj(h`Q`A+I<*WI{VnkmLX-tKtU%2Q0)*unRx%jY)z$^cc|E2F9j!FR@qUN z!vhU?4-@Sv-=lF_aH9fc@DQ;pt5)sQ3Vxc%tJ;G@RpP%WNxRAS-)q#v2gbX)?iq2- zu6iZ3G;|AJ*;lolTyMA1=y6A}BO$(Rvs^x17oq15dQKEqh4ayKOM)sMe_T%`jY$~r zu&vv5-E#%*Fn)hYz_}&8PMr$gUd7>tTL9!rTCZlPYI+&%;bI1kZswu%eO^>7VyKbj zA0~$^c+=}c9zft65-|keL%8!1-*cb;Zp9=8*Dh`IX)mt1wD4S}QQ^y`!N?EHmRELT zI(>)|qvtOQzac_ps9=QCi#RpRLiE0BGo}rMaT-jH0gHU9d|{2#&Fd$GXtB4S#D3UI zHJxQ%shb@(TKtBWy>=ImP3ZXQkKapFF}#cIX^t?VGG{EO3967MKFywLDA*h+lEE52 z@j#5meD%$wkf9&1!ov{fsK0#OquM}>A`yAjvpe9NG3DZ+1r(9JwqJrJ>7tPwx2Kfx zJ2@l!*M{%hR7fx%^s{5F{&-#7J#WfvG+%%fT=Go)$0~lB;dBEYn|RoTVHe3+e7L2M zvkY1d!7FNL;Y%{DD zq(X8do!xlZ%_;*b`Zcr%H(hhy&C%h0b0A~MJtF3L$g=3>E$?db>j1%1^cd#dfS>8m zDdVW0%pCut+!<+stG+fQD_To8Wf@1s?ckz9Oo*>OenHG5C5aJRM874EMOChfmmahg zoIuAW3CLsS=L&3hkS0$%ah_%sT7pI5zMYG0=@NJD^Ik=kowsm{8)dWONP=M%PuV)) zcmof}{s@$u2|kDBVY8v@0b&S@i{^4RGdhT~nTibxJY|=~m(Xy%IN5t{Z^%(>+0~?u=!TM-Rg?OpJ0Y}>H+Oh>Krc(c-9z2xD$sw1~&4cq8YrL2JXgX=Y%4ppx zcL}a$sSmtk=hAI8*Xlp+oG|9sZC00O)KiS;lGPeFT&_H?pcLD^uPza%e(m==mx290 zNsgw6eP&?y!wWtNBEvVamosv-O(Mq1L||{0{C1pyDPQK(6nUu~ysq=fJ5|UUWCKTf^;?Q+ zqCJ^q{GB!45l%bq;BK9|^0b;27|UdMgG;o}%y1zk!a1iuN!t@6XUw@4WU(~{fwZ6UqZmP*21=jDfU5VDMQu! zXLe<;J6uG~n`Az)hjBO@5cJ9w^E=lc%rTz^vE#o{?xce>dwHAQlqlyDQTpZzbh&uz z{!phv<{mqVU*KUl5oOYwC(k!;9~(3t=3w3s?xzmhFhkj}p5KX45P;$Tey7P9;e|Od zUA!YNn|XYIOQv^`e3S8Gn(hJ@om92^F_a=+7NWBANcG^zoNS|E7jYQo;#1`F1hJF$ z!EFaJ`QeeT%GOJ?^iYbUokBKnJv$C>(l|i-cKdM#OLZC5YRaQb>4x4|9;A@r1^g=t zd{9aIo8#nk%^tAtL67XrIv-=pw}V>d)LGT)4?AXa0zlFM{9H44h}UUT+CYlCOMw zI*~B3!nzBF=D2JR52T3%o=(&|B}D0I_0{Kr(i+mM-S;4rqSG^5+KvlSuO;Ez)MpfN|MpNf4Sj0_Su>ahz_<7p59WpI7?v%Ko$lo+&gnuxtWe9iwZ@680OR?xn0>15JE}aC71WtE!6ypX{+Hzz4 z>R{Icr-oQAlqolnp+VysEtwREPsRmf0uWUUy96tehG;6K!x14%XbVp;c5pttMC*3q zC7?|*6Yy-*N1TGj6_5X%y=TrCanwj|V9cMAp(N+Mh3-%5*~G#Pj~a+lomZ2S3MP5j z&D%Trd{BK9HBE!k58_7ObP|H1M{V`rsnD=4TuYE26B{TKY#ra0M>_-Qbw9-37dGq&>U0F~8yzeSj_yH~e&uW2TNb=~c7 zMT~QHQ!3a>9xR+b`j(%a46Rll_%a-NmbdJ(2pN3H+D2SJkfnb2qyU1&)KdTc4mfnQ zeJ7lzA`k59<7K(F2up{)<1O<|9b#>#SUeFzNY_uL4a67*c>R?VlJQ9qZ3m-MNoD8T zLC>M})W&x2MBLk8d9|tg$C6+7{5FOb@A308pzKJ>Tr9ccM_zy%&3 z%rRUGdSIhV;zu6FIueM4-}2W>=_-st`toz>@IqlK2p%*f6<=LfV=m{TCeK(m4W}YJ z-+$3L1T;Y1h>G=mdjEO)%^)R~-MnLjkL#Kvl5-Xjqll6_>@!I%I%~GoM4Unq!HWbq zltKL(hmp42M+dm{bOwF~lPsr)Wus5oDMMvOBtoxiFVvLA;n&Q(F=0ewiPewYG&Dqa z+ZE%M=Vp^UByxIjYm<1ZoG{CMF_vA4#=w-v_lf{IrHB?lmIgX~oo@|&;ImH+^}A5n zzN_oUbdyCfEDo!$EcBln2mnntc0CMHv6JPDoFq&3T|2nLoq^mZ(WKPejmxu(YstCp zuvVy2FPcC?SJC*W-xFuX0&c8OM0KJODzjws;_a=5ebIL?fnggZOoc3MGgQ}T7Uz;F zND4G75C`#RBwq-31&#$_PJ;1P&4{u_+ODr=2sXkj;h5OkC424NN9AE&#$XVrKk$*` z{*Fr@paZ&N)al>2ghK}EZ19%6yCoxyc08w&s}gT6@=gp-203qI%Do3>NoYgRn1_<=%2Oxy(KO}8s`%NOwujwJH`m$xo`lvH zZzR@qw`!*OynRh5ZFza)eq7bd=F@)D4CkR0x}au0%Iynk;+$YcN!q|xE%EF)vUa9S zy|=y_?5@?Zq=Mq-p%G2oO_faP?}Lb18&Boh8B z$f;Y?x+pwQ36Tf!y<-v>w^78DCMj4MHW%iNy!x2`M6$RA(Zad%mQlPUWi70ZO)O#O zWipd2_H&c0u0F3>_&oQUedmW*oP|ABHwJ=!)0G) z_eFc-K{D7*=0Tx>jDu{ID<9QVw!&{8%qSkrlCW4?V`;PpV(=m+vHB`9KA(*+iCY~& zTEo{tnKD8#$-p(oFm^nu%XTiJ5TnCG8_A3a{Qh|An@_jJV2NUlABfVZ_Zl~%iE^L8 z5x%h^{DZQzRxh!jtqX~EymwHs6@#uezJFI}M0H+~D=io5T+@R<@_R1z&mBVFI%yKspO2Tjbu`<;=U-uex{BUd9FA5_SMYjU+`gM z9tqTlA7V(ubDj@WJ}A(cxgvbu^rkFrP|f-!h=VIMGBliZ1m>h(J@dj+RP-$rT8xD| ziQo$4EYvE}rLOQ(t+FIib$XKEFWndT`8>ib5f3eJ08&a6tDk*TV_Y7SFydkBJb$QH z&`g`O6Q|hEi5|Jz#}!#}*Rp4d1bac9M?~kj=EIO^M>!$+dH%30{}=NWH!uyd4o7@= zH`nG^K$3uO+C_L#+8VN`UcnU^lsw$>lImPo;XFfGYZKnxMUKkm_!ZI5e<4xyQKMM9 zpNx%@pwQ5PZ-)4*H`GoficRXjW_T_jh)Gw%$fd*e-vjZTxw5F7=^xX%w=r*$gk zH8FXKjWBt~*COb#*Kh3Lr+Rr^y(Nt(B@+9w6*THR?a2l#wapXQ{WDksM~-PyF(FAM zO1fFq;M`AP9g_t$PTg}(;D^6Ig2Q7w;%uzuoVbJ0sVQn0|HU#OdOPwcVVR6Wyy2O! zKyj+_2J_>_pRmkpE-F?FQ!vYmoFgRR34(l)^SGkMdSf0t>`p zYA5U9eky0US?wINfj~D9fnKE9eUQcJ*>mv>*{qP=^IRXVnK$B|R*fL%`QChKzm3wl z@wAZnP~Pml{|7Bl16Ny=3gK?;y;h(~?w;*ArL!IB&{;occf-lYAB%u^r#3t#429X8 zlm!7!+;nPZFR$Dyk|uVf1AT4E_b;FI$G7AU zdFT6aP#19T+LrO|>kn-y6ZPk2U|(L5u2UV*`PVz_CiYcNHB;ke=u^%Ct*n~Gi!-3; z##$XQ@yHkx!|e5sVuJq8(Fca3mTunbYvtex~}HEG4^xj%EFy#wDB*G*Elh5$kmi1BFX*TM5F8C zyL4@bK7`1BSWOohZaWSd2*U{JzrH$Ji~2}Gro>0>?gJOo%_L?M0!B}-_zz|%`T&!$ ze#tQ#BW@Fon)qA++Js$hg2l8K0CX_?fvm&EU8a$g6iAMz^MS^QNE><@q3BB+CkrX~ zZL)#u&Hk(*M&t@A2GA=b{z<|Il_Zk3F_koElh%_fWew>9&;Y% z+7->+d6NYBlK(WEdLiS26mGE+oni=1*WxkxBV~~u+}lVqy?%U1SE%el{d*N)SqLE+ z@%bA6=m5~^eR+8!f*$I$UEUE#+IarED-j2HkM15?CEFrpu{L2tX`?X?p(ud}gW zq9YrXj4QatHFm~s(gByZTV-c-DbknOut2}x2g(qh*r3%IjBxdk4gu2k`M@&xIkc?we*9@JLn)=}0c?Zq6=~R>j5(VZ(n7Rge2RSs?>njR z6M3qetNw6XC6!@UzzoF$)PtKDInBa~i5#^zB;yQPJ^ypblzZxuml2Avo6Y!j z#^n=Ue>+88_qi*f4=b3+Tp=ax7J&(f5a(*+^-lE$Pj)Gm!qA=_P9T}BFekIUXy}~& z_Lv~cj%XUc_s86Xz)!V3R4g%}Z25QV>2rR3rZ&pFxnwKtB7ByYvM0~gHYd%xxcxb= zZnL%iD&Sd+_gf2j{STxCCjyZ0%S^?jWF(QEaGpr6G%Qc&>S=J?@?Z6K^*t1W=6{2c z_-wFh?=&j;U{@nXcf5HK2Yn+LM)7()j;zPHMW;#6grZ^%;sZa)vF}>6k8w3s_TL*% zseKPSOX45_qAZI`wr|$n0T9E%SPVLeaSk%f76-`1zTDY^DE)!GN=>OR`@c1EF+P*C zs__4T6RcZ1p1!fBOjbNL_#2AJe3GNN-9^C!|XWI`IcoVb&L5 zB$Lv8S4~*Mby6L;Ke$=Md(R(OkAM=XWnxqY2^frR^ygFg|T=<*>+p>{JL6#}Nn zLp6XiLAJLk=!&!$*PB7#7A}<7tV!spM5+U;5C7-ES#JyFBel6lY&jUA-mxYe+}rsP zQB&g|!Wm;iOn>kiWeUV~8fa8U;vW(Jz_Y=p$+n7cwzXS(XLRV)OukO9Ek}}O66M`b zRx{A^#8J4@*Gb=lVtP01IaP}!!Y6P;>zVgC(W(pst zia-@Fg^l@XIRkAvHnGLu(Rc2*UYf6jrfLmqcU)7xAnMZ(CwQ~MOdvt6k|fStbT;Hm zv>*Trk(%gy@qV+o+#64~n_;Js|`EpMbMVlTnW#oL?rws0+_v9=Kfo3`zAHnYxn%5y8J zAU{+du#^rB7wlZ4m_^yU=p+l=f8p_s>y77ZdHPlamMqh@*~`Q^NfAIi%Bo>eOQ0hA zZp@pFl%M6~rN9NcQZRZp8!jCq540hO+1d$`zEsc$4F3YS8VJOD3_C-_RWawZL+_)Y@2#gJ*s zR;l6z#jh+n;?Y+Y;p7^ac7tVz$s|M-rM)Gy5n_S{D2KgIuc~OrwNO3DYWMTV2^|iV zvAnnhnyAWxQ6J$Y$#vzM*oE(W?Y_as`>pP{l8WB#ky9hesE7Ed8MPuz5+iyQ_87-w z{7~gc+R$rKe(u@*{UaLe!`>CbPNTdTA+UKzY$NR(n?94C6pz5isc!vb=*U{i>q`wb z(zG5bWkMTYI}YCOpVfto@>$IT5>&r3!mrMmgD>n<76G@tr@jkN=PPANrL;~|2xwW4 zGrCqJ<8-*ob()3;>z!($S!h_^t)SeI`tp>_@)6L@w)Xi zwhcV>?1E`K3#qLA84>X=l*E!_-xg(S?VvG?h^A)QB1@dL8fkWLn;MD=lp!D*|K>Od zZ#M#qeB)-o%%lfkWaZtbX{5&kv*XLKHkts&?6gDQ6JsoKbF!_6~aKa#;P zF0}!#DZTEF95PATOtn0aewn?A8%khIwYrcjs4gLF`!7Q|<69o^%k-RVAz6t=nI1iqnspLOIyvSMy4{7eKzhme~ zGxR;BxtuB(4Sf^oByoWdIapdqYrPW_$D@iPba3P!fn zj%j~Z7HKlHJ*?Mj+{dWFZ2$p z6pQ31;~(jN@`x93@s8Mu zN1b>xxVw|Xw+Z|>p6?$qdLD;=$r5hSUNg;wtPRM)7^=-(h5JTH{k)x+_0DtWI7a>J zenfmp%_3!&gs(rK4DR8Wo*rhiZ8A=IkAP){a3&Ev>X4g^YN$}^5?<@67u;}*qnTHZljx`%z!dPPDDc4NM8REpNoKBVgR&wyQg?y}rbTDz~ z;bk8sG3DkFvSLogG;uM?Dh8idIfs1HD)+3$nr_)gHgZ2XKPx=- zvw)BCHZ6t?o(JpJL5h;U-Q8!`_4=g=$kbl%(twj(m*{*)q;vTi<4Ul9vR>n8B`|q0 z^Rxk{5FYMf7e@7=)5^E)Xa#1bx0;2T0FLD+N)xvHS1TXgdWN!SMdON2T`Gjk<<=c=r*y5Ih|B|LA);mS`p{UJFsm4ISmWeveE7S z%;fZ@6UHq!7@~Wq-NfDeww(fJmE8Z(C|#rZ%8mm1wX6p$6;9l7eLv|WV zEms%c_Z=1V#hNvH)H$#@>kASSy3VJ0BkPf$UO!8)hHM&6M5zYy`kig_H-FA?TD`tP z_ke)z3g|;?Xq$xQsTdFBFa`Q4h%5#NjYA1)-gx`TpRT>2!o+H~82Qy)Df_f+XEbO} zGl-;L_C9nfo%Lw%cA}c8&El3Q=J%-m(Y{RdXbfg)*X@G$bXYP3Fa1o{k@t@dDroCI zjnMx`43d_!^J=MEod8WvNq@%SLR2#4ElmzeHJ!M_qb{z z5lKJG!#=wxI|QT%^(8eXv~THcM+J4o$bMeX9QhwsQFI0!n=UOi!N8^Te{^Bam62Y| z+cF>gE1eX^`p;_qk|u>{v-p2*VJfQMS%i$I{>(8=39PYD^x%3!9-K{tvmo@kR@xhK zv|k$XQ;a1rak+gfz>2C^)6QR3v)YOg4bzPL=$6i@7(n5kDN568fxCOoK~rT4 z2x++D*?H7#Hj(-#ONZF2xH^?8yYtKi;)D>4^i6~>SAFn*TY5WxBYq)v=O0*;4u{0xTViw(Z}6w^$u|0~ET5jX#^oS! zOSBMn$+s^ge|7)00R991zJMM`>SJ2`aB#traNdt!YAW`_;X3@y{uK<7-v7<1gcfwnA}|k|3))wi_MdMa z?nPA6@nAc1XF#X#<)0u~u2Y*4pQBQ>|61iqLlmqR9Y6pvMuE2E zo5x%E7_V0Ei(Pap0`A47g?5?7DusTrFZF^32cVHSL&i<-JYN4-4-eKar*_s}kJJ;q z>ijAAJSHZ`6RB89b)jI5hna(BO<jH8ro~UW-t0{cWPwSegReb)4QaHn zFHGUm&{Mcb4UV+?Z+W==*mTzZ?}JsS%o?t}WD$Fv7D=as8MfUPrCW6CElN2KI;}N| z3jni3Xror}yBI3V>knwbOKNOM>&q>UDIfWa(M^vWN~#G(bgKMMDSe;YqB9WxMU17U=wjHU`5y;)eqeU!2W_lLEc&^?tK6(8+6o%Zr0b}7iU<4C;`?n2%_QFrI+7cB-mbG?@ zb6b102P%G2;QMN+M+{7YX5@-2fZ?$f-BE!AilBaj$kdNvk(yy^p`~6ky4FFlin|;z z@B*SMN=+;^xliVbX=dsGrGmd5%Y9#K-|Bzr?u8hPtef@L+tlEMh!^)&;#>=xV_lvU z+*Fl~-R%9+n;hqk`agrj6o))R-BRT!RrN~b;!O^5S3kLWGH%msh9fyh7EAJ~L@+>F zWGL8u*(4Hg`t)$CBhqf4j7Bi1C$L7dT5j$D1z|>8nAij`ia>H$tA|V z>!Enj#6!G2M)E-phb+!4&@ftV%13Ar1)MQ`G zD3y|Ww3j2wjM;Eg@Xl*M;c)L#&sN}f;n(D*-$&5OKCO9Z{kHoSa6t93$D+WbYC2kJ zmsV@lgDi<>8W_Aw-+f*v?6>9$w|^q9Dybg4eO(gS#!RA%49EBmz1Rg=c;EZ_EcVXT@O@ zL{ETY%_Rwrhv~z#V#Dw^(91_T`tC(Um+3-`R0YYVahMv)o zzD;`4Q>85?v#^opKmENULRa8rpEWj@poQDz39LVS{eh6H?Zm|7Mg__WzK*dPOWD#X zlEC5=s)1=+Ua(PO?XQqn$-`~{HLpgkELTLqotMP}J@jj;sWFrOAWqjzYePK)YvL+j-8hCQ!w)QyffQ39q)aO*sldjEr^1+j@nXlY;*Gjdw=esM+_^rBG%410)X8P%VHD zS{4JsEYlG3?lA9oU*8@9^NCt&_}}@I98f~Op&T*LIVbk7Vb%t~)FX7^pRIC)Uh49@8u{$BM`fsD7ypE5 zurif8=cecZf|P{JB~GQE>g4{UFbNQe$^sX)Q!tP_aX}!95LfQh;gZ`d_?&qIcj1OJ zD=QTM;js9hghhsKaZq##ga#Q8e2>G_t!SyQUEBuiv3H7vY1lR06UI^V$u39tCPW5H zw)W2s+uFlN1STg^xWOz087 zj^}I=aOV(@Q2(igoq?qeO2qFQo#yQ(KK(kgWI1M`Ag^9~L89_Y+3z|qj{`X{(l=08 z`e)!ogk6yO$2*bzKO_Rx9`ftnef2rtTBw~a1{`x51B*lek>dF933?mzlJ1C8C7~D&hv54P?)+&dbN-Clp+68V2`PGKD&~Wk6 zJ?vb6wC1cL(kMvks@IXpv5coL;Mq*Ly!V57+!^2-TN-7Ju7Dut9SJxK;@I z)oyQr#*WN}#s=9-#S=bgnC^*E|7Baq3V0A@OQ(po5+Fd{(&N{9Q+ZO!4kz>z16&8i zADZmb3#qwwd+&sQ23a*C2KYqIZYuLv*GCQ3QkSL42XmT5-Av`ROZb)vGlEqQNuY$K zx}z=pV!Tkz-(6%?>7-d8mp~Go3rRDpLasnGxp0mp_G3El>OiHw$Fw3hoQ`#M#;ZbE zfiqaDwQbU%YFW19l9Es?saRB!gH8mkb!S-icWM&ugg7C5q7JUO?_NUPn%9$~BSOWW z<#`fsKapeoUfS6X4~J=uKNje0B!vaiWq^b@Fdwy1>$;O40x5QWvuNz5?GJ6+$NAXW zumJrGO-edcjmvXZEl1{#pZ@lc%BcPs@@mIFmk@4gmWX}f>QunHN9Zmi5l=pHcmR_3 zzyrX@B4XwUKa_tnQK{r_j5V}fx9a8SiXcbuX`(ojb~c8Co{{XFa)m8$w~w7ckR{HZ z(&be-3kg42G5Cw%+n@R45Uo&p@UxZq;o)w4RP4>|AP{qqk`e00<2$0yDc#sV{xTqd zW9k|lXW`R6mI~_sL2B__$Y>E_gplf^v8nqG%f-J4+~B-)1B%O3_ODr%)m=NWkN*D!+@xv zvk9;`iXGFxk{l_zr0rqKp+%HaH_HikN`D(GcpQ{{M({t<>Hi>z1I$B&O_i^Baz4qj zxGgZT12;h>Zo4DwXNCzu@~RxPqGP3-?--}dqFjt_@#9yZP$3F$H9IXzk-U>wk6;wvZk32i%8=_EcIN{*`#i-1u)!>`#?0aKxl8pgoaciTkiYzdhMklv~8ix;-6B{XoWkFb37W#rjw zyI9o7>qRYJd72L8F=-P53>vihxLQK#^yML#&*iv86=s?-?UO&O`K4$XX*X&XLE3<9V6EBm zUXS z8Ht2+Jg=##AppIE_spi)MSehtsvko>v=TwPeT``-T*qERh8qESqEuRBtC$=iN|%(^ z<cOq-| z<3oLF;&ub1YW)}O{s=obudEkAz$Kczb{9>G9iz_k1n~c2ekNkZ@_O5A9U_;G&!QUfoy8VXwrdD{RZ_RQN)@RV>pN-OLo*EDY$*xiuw!Dq#Ggeg zp#&4M8Vu#MBXG?DgDU$_f}#3T`je8E-PfV{?@KdE8rAuWe5KpgAaUVQ(Q%;fEb$#d z`)|)Z0C!P4HeICxHk#h}@x&^1N>L>Iu$uej^fDpt!9P9Pl?r!5b zp5lg4sN+i1(EdRUO|+Cr+rXVoWD>8L%xQqB8*{_n$HT$u^w#k0VeIyAy0Eb72sMd^ zvOx;TTd}tb%S=D+&E&UYOogfXelIc>?SW$B+;nDUtS2V3uwsWCUL=^Wv?++s?%%B%@}<@rz>d-p5l-t@N-^wK#Ck!PGYj_CdA49hutC*voW8{AS&OwB{sIO4j; z8~VJ-`r`|0<^e$T@m~AGrih2$Ff1cySC#gTw`mr)v+3zxo{BU--LtVO@N6;RYmZ2` zdslB$qyQQ&iC|V|g5#b@zH`3tUkefh&XOlS)$aulLZehuaDF)kr))XVvtkQR&1Pnqwev`8R)+Q)qtEJy%LpueS%;Fo=^K!gGU+aVYr{HC6IdiwDj^mv{Jp{ zq_ex0T|>J50P3u&BRpF2?Dv!l7bc#EF`tNKNI6!Z)1#`r>Ez(e$)=k#(~YMcW?k^6 zMJWn}O!XlkEcBP{yEBJfsr^6#)c;vqk8iK(vEeo)%_XOY*zDrRAN4SckRw6*>55l9 za~Zo%l=xop5R`boBaS4o@;*B#&Wq=IPqTCEAa&K!N|8UqB!)!RcRzu=_|%OWkf0b} z?YO5FJU?M*`tlLtwg(q++;+&3{`%yjDKFB#ay%<6Dh7}+hrFr z7&ddd*#RZ$=)z0$y6@fJB1*mVqJ-0rYd)(#hWWQ3FT0HsXbg4RB0l%#+Jgdp=TQcb z@sj&E&Cm+{u=MFAx+dbHM*j&;rgksWV}!f0?>L; zUwHM)s#y#BjUb4s1rKYd+ET-8;e1$OSIG4~tvy01xZ? zh@dH@*?$b@`Jf*w&yms7UVAX?_7^Sm_43Q@Pm7xDq4g_3Mb4!i8PY`F?M(U&pdV|A zOzQZU7F2dn_L2`rJvWlCEUWM-t=vJlP-&sI4rTbtV#$&LJH>Yqg7nN1-ac*0#-Qn+ zMF&FCmzXNCI^eVVnJdBr;nUK4&jasyVYFoExF1tP|7b^Ax@49xz0I?GApkD`kLM`(+`-YZXEq8cs`LuiILD zWb5)JuDf8KqCWGt5?+hgFr=c8z@+(y#~7g-sCBu^T1^r!CLiB}Mf^Ur3|XhKIN&&g zzpGQV}qj;?oGXQPQeOAgP#|MLEaP zT)N<2!nPGGzf&N{O_^){3|7*OAg-eyzK9hEd-J~(o3Y@^@Rq%+iru7*SzO^i=N@aK zmTCcxPu;>gfg)Sw9ajmI7;DsZQaLh|v>Uhs)&9t>iOwRVG&h8h*c@)-EnaNQ3zpvz z*6VSXM9~^FmyuMDW&SGU#*6j6T&)*KAx2pNg_t=KVt}`=_tzH?Zm9cix(4& zLJhsinvh`tOhjeEcumyQxP#Hm%?rfgdDr8A6%um5{hJHqP>~M8BuZ9hJ=d_|j9a>~ zFU&b*JyQ}77ACKJ*hd)03S*3~rGk<{4D7gdx6&UA#fi@UjAWBKkN|c5p_Q7ZKSlPu zl)=9dXk@qQ^AbFR?z$4qe%>=%EU(JbvyiVi#{t%%hKe|2Z(}$!Xz0 zmsPr!b@5y0qPu*tF5dSli6fZZTR*Yr@Wlb1%>Nq3Q*Yox9?Ne{yjJfmCjOcTgZ?p_ zXSGu%{dJBY-xQq@+1C7lCj{&(pGu1I1d_Pl?8$h)!^8Yv&B@A!E zbY3d*WJLapm<(9_y}wffP>eS?i%Al?5fQD21qYr{Qo042?)5^iIbO#IgQxK)Y-Gc1 z_3oO!97Rc11}%UHwBroCj-E?dsuMTt#4Te^2EuaWm@CEy(k3vsrRIumApXNSn9tRx zqFB@il)Z49H=KxUi)tkKY;AEAhl@uCa z@Vu+O3#(pgNx38fea0VE`WOlHL!{4h(HWIxY5(>LN>>wQq^jqJ*{>lJwHhLRXW@kA zZ;q}TzN$?hvm88@V;15Cq^kOARr-t8Lwh+~JaComOw|4=u=D};8lhA3n@zbdYHKTj zUvNW=?>EI2Vc;Mo6Z1L_uh%_kEydpPv)`f}{J}`Iy@x%xE)8f;PBe0dEQUFH{}1o> z?LG>eD#9fvk`uFLx0Pl*9D6>y*yVq1$+xyYb(#2EEzoHVP$tsF%?^lDY#$-yq4nod zz|d_GdglKjPofDK`*$ovzn@i>!Y@4U;ze<~9{x(FfVYQm^7P1w zrgrNLyzlm|{`Ru?oR$naSXaC7T6xGW`t?nEHKs-sJ1A6DG3y2l-$$4a*4HHYUUDAe>*-c5GQq+>#lpws#z6^A#vzhQdpOt@n36W7mdK9b6ih8^BW`l3qo2f)Bo9e6CKL$KWk8$UoHf z4+-@c;-E{oUu=Bu**?M5qz8r?h69M8cXVV!MArdKZFO{EYQun0t%7ZT)FX;qsJC0T zZR|t2??%l^WX1H}G2O$Wq#I1}NB7GC6ZPFxkRb99}mYBOY{d#};cT z3Nn>cKRlAQj`vTzoeJ8Zp!q{!TDeBdF>m43N>pp^y7ebubF8UqG&r%-J>7(A$(gP> z=13N^y-oZN8L83wXpR}9Kzk7!!FldWSHs_rogdi3?t^W6=)kGOjAm+B!meR{)1xs( zaew_V6ct2?ShjF>wo<4w4G~FVz3_o2gKlu^H~R7V;x#2Y`UyjhA@s#YI-sjYsx5r9 z2EHIQYEp+QWQlxn_Egh?oGp3SWKc0G4YRn3lCkfeF19$WuesxwD%+B;INNrVztpOS zcz5;8a*ku_&-5NSDx`x9rk=_c*^@?E&R_Zp$VY;+MuGL&{>h?m8J=X^O*JYdLv)I*aYR?#5@;#|eif8m z)Dx1FE9V-Fd!U9efr8dgGro*Br}&A1fP*i zF)DkBdw*Lm{i>bl*{cG`MVxexT^aywg{u+Sm>iwdw>bbhb!oxCIO$3+Zs-|z1MRR* z${GsOxuV)2N~{yiQu>F%q|SfK4%5N_zEP~?QOGg#RU$zxlFFTEFJA+kXHD)Nh-9kV zEE)3L-7c_#$C^iJn@tMMoGwX|Sm|IvnKKk<+nTmf9z2c$&rGW$Dw>1N1XKvk&9*$4 zb))RryV3oxkGE&%r9y^1EL!aPC}k_J`}+e^5Jb zN2$G}ZRC2iJ8O6{j+(&rWUC8=JyM>1UBRgOzJE?A5^f0k)2Qq6&6&Jx4e`(beUu0a zeg0^Otfr4=IL8%RCms=17w|k>A({oqGA}-G2!BH9YT*L(JGd!Zgvu4p8%fVxkdHBN z>7%fKp*B!6IlX>52y(vfi=lQFWcAn$!EjlJ00`BwS6BdQ$ zX>9-KO+}+C_lNH3_(>`<&J=6O`~Zg{e1LVTwx{oYXw zXwQCjm;~_*=Z*JvaE+v_u%AW?e|f~#>iISy%T~5NV>eGReeRp`zgk$2T4A_p1tJ$P z+A7VDV45U!q_050iS{x0pW(>_Tz7I`=9Bd|wX~w^8)UivlDi)8Fs1)V_FbTM4{h91 z5`!)$PW_1+oCuK84d||lV!Fg$kz^g>PLsd6qNNLM1yvJI8@dL_xnNsm)ubdTDb*~W z<-h;DuRkae!^0uolk}rpUc)DcCqr3>ugpHo-J&ptuh7jJT%#2j?l}4 zbOHSsJi>aWf9Zu1b`!E&(LT{tWMlDok$`#z0o`HYaSO@4wIK z(Z}olM#<`~sOMghHfpI#^qdG`=(rLXJ95X`{10_8<$!sIkyX!D;pDsOn9Z?#}w-Je_WxvQX0Y`{bmZ#p85A z`aQ+EM8_+$!bRu;h3}pcA}Wf$-M2f^oX_{YqK(&?WwkYMGfJZJz3xVhOxFz<4xKa+ zm4PWJ_N}nStTMA(n7@iYGPWGHn1nNYiW#`fKuOv+rF1Tb2gfr6or~90upMLQWhC*U{=3|7WLE%qV9`e3;yzdE*W-E7S%mVRr zG~v>`gha|-(jrnZ8HE{1x)l{!CWEn*iY!G# zBHc<1F>T5|v|$q6vUDxcH4!e;DEspJoM+tcy}$Vh#grKV_Ad$D&)P^wnf zrtiw&ppmK-uE+W8V4B(E;5sgvMt=LW26nOFx{soMSZvu``snL5Icm`kjpqyN`o6;w zk6Vps*r?eiG4yeLj32cM<`f0bX7b!{p}lR;#UuPb@Ic9R73eMQd|N)iVjy#D7Qsd!&j zAk6hXk1g|)*>@xODB-Ws#Iac_o1jmS5`!X?Q6~ObXprO501#XxwV^omxbr8=V=^9t zN3$t@Yrw-;O>pJ}gJ(vEb4Fl1k{rSCN1z8ELfN`6>lf!}^r(RqMVzht!O7w25q=P> z(Q6MNq{ETHJgs||d26vXAs2D*f+Cn94w#e}Se$Kx-wG@8SaF02Y{LULTI>J%4)|j_ z`NZKB)%(ju?J{MJ75vi1W(Vlz_abG_^=~u+V2{&`;~*Q=WTyA|FJ*5GaF4~*O7xjQ z+ICgMu_~d#RRo>BVS$Tw_a{F<#_8A`+B7H2-l#Mo9|-#y=V3jlWzo)va;S`K-lI3h zKVQEKxoDy!*$Dl_D(!IhN~6}H=G`RvQ`#H9B#tBdd6UNi%@A8msxwCl&YDoJhAK?Z zlzlL0&!YvDbdy5RAxb~UemOdAS9L@Wux?q8-VcMHaNwcr0cs9xo`=sgu!zCIF|)^W z>o90(3oVD82xYdj8kTk36YgQRt^YAQh_txfIesGVs{{)AxnQx;qHcKf# z8z>tiiw#N=bb`+hvG1HD^<$GI4fgMUL$~1lZg#CqLh%GEHpcAKO>t~%yIrl>@SF@G z#7b0sFlU*^8VGNK>mY`J&-lFp2oC5zN8KoL6n@Didglv$SPP$)0SAeX>yNH7e7NTh zPMp~XI(FZytX?dIK=k_KH}|ouL3P{2DKkp@lOdLp9XoPG&)2(g9s?!rLXn>JlxMTT8Ar6Vs0-`Uc~)-b#<^yP3lUxxkRRBIpAd)6^T2<(But z5?v}$bsv_f<@+nE%cLk0;R|r(bs?Ix{C5Ld*m!}H+=6=sfl|b1+7bm;SK5%0-$Z0S z0O5VJ#b!ts#l-GFK*t?3yEDB3S$(YR9S#)JAXKiAeu8IWrup+d28(wR=Q1vRE{uRzIt*c!&3P513UIX5n7@a zr3}+a$uq#O7;Zl`7jDI3_i^gC>?*u2d_h2kOrz0{HZ4c&*}_7!@9Z#Xx1z@i zeRrYOg;4U?Ge{AjIC_2{rQaI>@6?U|v#5LlW~=BSnGH@Is_%-eqQ5%Ejrv1_@maVp z@8lzg^C+Cbq#eeDe!}p$o^8qiRvU6L#?@Eowa@jj*;qOuN9{;5pK)Yq?t?yVmKpnP}?%N`&e&^~kx(Nd|-Jf2G6J339Q;kllt+2i` zMZlazou{u)D^WCZBv95jN<%d!xm&ejxib!Oq=S?zE!5FSt6ou|6R-iXmgkRq6sq zANLVuxRIM>ZRpKLPW}vVZ}#(Cjh-eE)}~`HNjV?dcebN&0=w2Fsx>&cwqZ{KBG_vb zqoJOav~r;)V2!O7upg?wp13eDSC)WcrY?u8rr)8h_Bg!Uik7FL6B6^7ekO0EWKpmv zK}UMOMc>D6C6$Huq6JzB`)+W=fCWcZUe;ddS85uF?CK zmb!FK=?N8~VN0s~xTIJ|xQ~;A!(A8@$P4@$r%16LQm^=GAf>D~7FHzB{-TCL?>+wh z_%@K^>z^j;_Cp2B8kqbh=!v_)t4piTea%6QP-0Djw*MUY* zy%t0#V)X@X=iFkuNNkC!#;Gi?xE|b3SM0;7Bo@M+(1Tim7iVrkVWOuH9}!>!#diae z=T;|K{t*AQ%Txfv=L#0$RJQ5kgQBch7w1w@ed?&J-AkL!DetO2nCXrly`&LWIKigc%XjOH85%&= zvyT!Gp+8}Gs@@f+8LT#){iTSh0K!h?urHb4nH{KWp>KmG_!f*M~h zNKj4*+UhSk4m$_>%Y0!i)~Re=ld?YjsZWSp+y!jOspcy$OM!PAQ`PX$8;ZddY=@$& zgI{09LLAm^4dO`R_d_`v%ViX!%XW?J&Wa1o2S5+rg*vevYWkJg0+ntTmBBO}6x9{F z+`jKjrN7Dxkl_e$5)aVnNub;m?(eJuk#yXdnvi`talNC>CV3%Jna!v17KpcdjE1GN z&?PBP&^ip3lWP3dd1vWSb}Ni6)LDmktx?aDG+ z8tK+6vsG|^DKx!uOb$6(efJjX=gNiBmltex|M>H=6iB%@^q1g}U9k@hU~j-OjOHw+ zB5}{)C{scv5nEEZf8z*Pv(ZBpIiHnCXu&ef^t2VX%7CBwmHg6O1dD99d*x$n7$bZ; zGVxZOYLAUB2b3{nI&N2Zf z>KYUnxP+~1yBAg0sRSbuUgUXzDd7+q1&9!S*0K!Im^$IRc!Cpi|Cn*R18f;I4!Y46 zU(KzG-4T1Y)L6!yyRZeSm*Tice^A1(<>gilbBo+s=Zi=iecCr}rN9X>%6|*@c~`=8O9$#j5U6el3tBupf-xlQOV?!RfUB z?$c({YD(1KH6c84NH<&r0%4T}xbliA+huxMe)U@nx6HmzvkYB6sHniwT%&rBBRmj* zSqsEssF}xJh}fn!NB;3g^zjJE%o&7FwC0Fg;>Eb!fQO7QD^4+5)ehc5 z%@?2g9MTe31rNbwqLYKs6*L>l9sG*nYF))2X!k=^X$uJXNp&%eCJcl4VhH`y%l5e; z4Hx5m<4;c|xQ0PfieuW6DF|(ESz{-nkxJ=6jWWUY0XVH-={SS*%<>~V=E-w4V{Ic{ zFJ{R4+r6fd9%k>36J$8Fdnk4m(Yj1P$Gnbj3KEnncC%`3T))LQi!*!s8}0yrdijne za?p4*tSk9yXpy*}TCP?#3oWb*r*Fn=63~RfRYVBscpAiL)wd$~Nj2j2BZzLe3g`wq z3?w}a)7x(|US-GrC1UzE6gI+B9pc6u^kkUy*32X_5FKPG{Hm?Lg&mI!T1^k=D(QSz z=<(8EVYlWfi~VfW5>hMqWwg7rd7}~!TV7_W7%gr$zCi5fuXwD5i33o>ob=`Rw0ZG{ z?ARuhioS>{Lu&mMKnO7G7b)Ifxx$=0_&XC4EDlwr>j?u^+^8eei;FA%m&8C(9<2rR z4K)95ZAIkBpq2ChIzQ%cQY_Q(e{>*jd#=W`DO}Yau(PW}g0dpD$fp4pK6ZO9L8eAA zD@j=A41bvg0XfwPRwAC(FHwyyM5&&b^@8W$zPjN9$7K>NJ9~TgHxmWzA6p~R=mBbc zkB9HLx^(q+fuCjPf1aV6Ray7Z;6+u(w};l9J!rouY5s(We{9JnTm~$Hm$cLNg;Qo$f1kKU2NH* zk-c0TJTVihbT~LjxLJCgxYV18_;Sfk*h1}~9FE7#{^Kxb@Y&cyrEQM2gbq?ZI97OC zN<*#9?%6d@qmZAW)(a#Bx)Qi@81)rTeM%RitH|`IcG>8z#)rV)Qx45CozXMVjq-ai z&(DsvH9u)J-n(VI7Nio8Zf<_n?VHlHoN67wZ^Uy>Z_&AVC|9OeuU0_#^25Uap z<1GNWVD~DJsR~UBZFpLml+de1J_D{QBa`x0- zsRDa4_!$DRV~5T8ja9g@@QzYnxAyqK46*%{eA?bcK5&u^%bK=!xf(I=VTUNVy<|Nz zdr=8dC$ePj%=FyC9TP?hEQ^cCzrrF#_fjV1YMg{lxBghw>~m^55^EMe);9VK0Y*NP ziKm(2#6^gcZvAUeu}-oTkEex$lQ}J<)j|>fWa|N=e{J|#=)V~<2NXvnXB}#4kffB~ zq3z7`Tv5Rk?i;WOPr8N2#%$BN$20sbKRq|K!RaHtD*W;pv+;-p)j@xlXF-St>|=5n z>fSg8!4}qKvw;|GxtjhnYzQUB8WCqRM_GE-=LJ-@H|~SSRKOp#n=RQN}$$7ioG9xI_wXT|n9G+Da!l^}-wS!x56C&;Tf)$K4HX z!RzLjs|ggig)10OSai+%S?%Eo)x*^ytaEkZ1^Z2NKFCj=I6Skv7zwnn$rN&2h;LlF zhWUP5vk80|OD;%BBZ6LD_&(2|8SP%7UfbJMtRzYn=e=}0Ew1QKnqxK8DsFsX2 zuDN5Utq{R-gLk#TgG@1*dpr-@vCo~SWikDW5#tv`N^JGI$Mu!|o56#26<;gz(K`&S z{@kZjG5Jfy(Fk=jF5%S~^l;d67AN( z3X0qNL_N%HK;LW3paYjDMkNW@cJn7(>Pai13SuvZthu)LDURU7R2 z+;#QQA&74#9-XlGI)wIoVRWB)kXm1@wN-%yi%u+Xt-ztv>vGFv;4=5cD#RLREr%bS%lK}*IH;gD+vNnwa&c#FH*c3%Cawr)St^xRsG&sHW2hu zgzwLxGBmnCa4BTzz-`idrHd|~{;0sB*$9EKY(6wRjK0RQ7_^v&Z@pl!+5W52d5gu5 z3@We$igJ(9{56!fw`}AAAh7+Pbu`|KTK^{oJzYb-a#N(y86K5K#CZa?@S9GvHw&6o z#(!aFzlt|N(|}g|ylgv z7}ye#`1j1m)_wNuI`L!^MjLiPO)zr2^|(bP^lwUp$F^hlS37g1lF-hrJSLtL29VxX z(fhoHi{J1ok!b!>Wtk18t!i7*!-u-?5Iad9iN-@@c52U5e5vam9AjT*_A0;LzlEf- z6D0fNhclK7a*Nn_Fzz{aK(_ti8);;zK1<)2f>+@0C0EbK6uj<|1W$aO4&C)>`+V48 z#aT>yu38t*ta%Gy3cID<@S7^AZV09Z!11?Q6PM@cHjVCpZ5MB2CXsQ%S0A{hiF&Za zOOAt~jJH@5i6gBW#5WVPRn6l6vzY^HRds`i9)8hK|7TH0X;E2JI=$(N{M0WMlXUgz zG#S1i!oosUf4-EQ;QjwV&-~0@f({ZE9NkBTcEdQqXEYAV>SDp~-HCE42SvNxf@|pN z5LgMgK2-P}S~!Lq({A>W<4eT@@moo6tI&phT^3H@vFFY)nf;qAK6N_4L|^`Ie1R>$3!z02 z{31QRXk{%$?X|O}kpYh{CnrmceO( z?CxYqE!j{BU$^WnoUzs1j@o|>EVS-pYxzP7QgTOsABNZiOmDU%Xw5zIp55rS1$oSp zI0s(%!&~!gApq?RgpChdEA}4ubHN`I#gOA7AxiAJO4)m*(+DINy zxfqAojyxC-DS@Z3efG@}HN*5xP?j8YFys!&#HN^{^MBWiEz&-qx|5n*qyu5Y@R*cHjFX)POvbir^tu}=#obe zebNkvdMj~}1_%@n55seaLc)5zvuu5`P&!fz5pxXe-+<59UrM~&HgA^rz ze54)sgtY?#R-Ss3$wYE8GHe@TwSKqIgQ6a@38nSiF?^3yxYMb%_|2wvpl2-W>&TO^ z^b$H?A)MR!)3@b=HqxTW)`eID%ox!IEvvUt}FI#|a zlvm`F@FjzG4DKY8#^oC!?DT-rdFaDZ|NI7MQBVjn3-SJ3CiAagan+3kZR05cc@iW< zp`Zw~szh|)?8l&(_*Sq%cb@doq$@mx(YrUs26Nh(g#b41|lu}T1#RximA2)|bl` zEn(N$Pcd9o1c^v1^E-H#_69RxQ1#B`FpsO8GCU&ck-GvE*Sy*jx`HmT6X&@TXi;zx zd3N2LP^{~@F?FHOum7x{ihBybhP4R6*9h87DG0ub;*I;ER>Y70C)|SLJ|+sh(>NN)?Z9JE ziA0CeS@F)r$gz-L96P979Xi{XiN_ikjYaEqv?!VnEQ!Q7rL*Z|=+nN~QIt1Ud3IZ|SY_#TIgKC?#Hx*@}UA_zuwMhRc z!We6{VBCui$oW1{dpjq-qd58DV>0Mt^9fl1QBclt>8mnFW7-RB{8K>w3ulO%XVNS$ z&bySsT$-_yMa`TxEfp}PVP+q(=~Kh(c_nR$^SEdw5Vo+vhySQiQ{_Hw*KW;7>Ft4; zW_#)isCGllJX3;jAmn$n(`%lWhh-8bzKP_wJCX4*o9+_i0I<`?u0Nb*gPu9=oZDX! zI_oei3&tEM$NYn`W;@tjOG${zpuvfGJXr@H6)R<~V_i cHgj`x1lK~M@7X;ZHtNMLn?2hKwo)Sh4?fDt+W-In diff --git a/FirebaseSwiftUI/FirebaseTwitterSwiftUI/Sources/Views/SignInWithTwitterButton.swift b/FirebaseSwiftUI/FirebaseTwitterSwiftUI/Sources/Views/SignInWithTwitterButton.swift index d85e9052e1..a874819f02 100644 --- a/FirebaseSwiftUI/FirebaseTwitterSwiftUI/Sources/Views/SignInWithTwitterButton.swift +++ b/FirebaseSwiftUI/FirebaseTwitterSwiftUI/Sources/Views/SignInWithTwitterButton.swift @@ -13,6 +13,7 @@ // limitations under the License. import FirebaseAuthSwiftUI +import FirebaseAuthUIComponents import SwiftUI /// A button for signing in with Twitter/X @@ -27,27 +28,14 @@ public struct SignInWithTwitterButton { extension SignInWithTwitterButton: View { public var body: some View { - Button(action: { + AuthProviderButton( + label: "Sign in with X", + style: .twitter, + accessibilityId: "sign-in-with-twitter-button" + ) { Task { try? await authService.signIn(provider) } - }) { - HStack { - Image("twitter_logo", bundle: .module) - .resizable() - .renderingMode(.template) - .scaledToFit() - .frame(width: 24, height: 24) - .foregroundColor(.white) - Text("Sign in with X") - .fontWeight(.semibold) - .foregroundColor(.white) - } - .frame(maxWidth: .infinity, alignment: .leading) - .padding() - .background(Color.black) - .cornerRadius(8) } - .accessibilityIdentifier("sign-in-with-twitter-button") } } diff --git a/Package.swift b/Package.swift index 3ab09585ea..14d70225e7 100644 --- a/Package.swift +++ b/Package.swift @@ -264,9 +264,18 @@ let package = Package( .headerSearchPath("../../"), ] ), + .target( + name: "FirebaseAuthUIComponents", + dependencies: [], + path: "FirebaseSwiftUI/FirebaseAuthUIComponents/Sources", + resources: [ + .process("Resources"), + ] + ), .target( name: "FirebaseAuthSwiftUI", dependencies: [ + "FirebaseAuthUIComponents", .product(name: "FirebaseAuth", package: "firebase-ios-sdk"), ], path: "FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources", @@ -283,6 +292,7 @@ let package = Package( name: "FirebaseGoogleSwiftUI", dependencies: [ "FirebaseAuthSwiftUI", + "FirebaseAuthUIComponents", .product(name: "GoogleSignIn", package: "GoogleSignIn-iOS"), .product(name: "GoogleSignInSwift", package: "GoogleSignIn-iOS"), ], @@ -297,6 +307,7 @@ let package = Package( name: "FirebaseFacebookSwiftUI", dependencies: [ "FirebaseAuthSwiftUI", + "FirebaseAuthUIComponents", .product(name: "FacebookLogin", package: "facebook-ios-sdk"), .product(name: "FacebookCore", package: "facebook-ios-sdk"), ], @@ -311,6 +322,7 @@ let package = Package( name: "FirebasePhoneAuthSwiftUI", dependencies: [ "FirebaseAuthSwiftUI", + "FirebaseAuthUIComponents", ], path: "FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources" ), @@ -323,11 +335,9 @@ let package = Package( name: "FirebaseTwitterSwiftUI", dependencies: [ "FirebaseAuthSwiftUI", + "FirebaseAuthUIComponents", ], - path: "FirebaseSwiftUI/FirebaseTwitterSwiftUI/Sources", - resources: [ - .process("Resources") - ] + path: "FirebaseSwiftUI/FirebaseTwitterSwiftUI/Sources" ), .testTarget( name: "FirebaseTwitterSwiftUITests", @@ -338,6 +348,7 @@ let package = Package( name: "FirebaseAppleSwiftUI", dependencies: [ "FirebaseAuthSwiftUI", + "FirebaseAuthUIComponents", ], path: "FirebaseSwiftUI/FirebaseAppleSwiftUI/Sources" ), @@ -350,11 +361,9 @@ let package = Package( name: "FirebaseOAuthSwiftUI", dependencies: [ "FirebaseAuthSwiftUI", + "FirebaseAuthUIComponents", ], - path: "FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources", - resources: [ - .process("Resources") - ] + path: "FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources" ), .testTarget( name: "FirebaseOAuthSwiftUITests", diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift index 3b1022a430..791e585ce8 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift @@ -62,6 +62,8 @@ struct ContentView: View { } var body: some View { - AuthPickerView().environment(authService) + NavigationStack { + AuthPickerView().environment(authService) + } } } diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift index 00a72d02a0..eed54632a8 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift @@ -79,12 +79,12 @@ struct FirebaseSwiftUIExampleApp: App { var body: some Scene { WindowGroup { - ContentViewSheetExample() -// if testRunner { -// TestView() -// } else { -// ContentView() -// } + // ContentViewSheetExample() + if testRunner { + TestView() + } else { + ContentView() + } } } } From d5745c360f39362f425f55a006c248264f606af1 Mon Sep 17 00:00:00 2001 From: Ademola Fadumo Date: Tue, 28 Oct 2025 21:31:54 +0100 Subject: [PATCH 03/38] fix: move limited login to sample app --- .../Sources/Views/AuthPickerView.swift | 164 ++++++++++-------- .../Services/FacebookProviderAuthUI.swift | 7 + .../Views/SignInWithFacebookButton.swift | 77 +------- .../FirebaseSwiftUIExample/ContentView.swift | 57 +++++- 4 files changed, 156 insertions(+), 149 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift index ba3310f6bf..063586880f 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift @@ -26,96 +26,106 @@ public struct AuthPickerView { authService .authenticationFlow == .signIn ? .signUp : .signIn } - - @ViewBuilder - private var authPickerTitleView: some View { - if authService.authView == .authPicker { - Text(authService.string.authPickerTitle) - .font(.largeTitle) - .fontWeight(.bold) - .padding() - } - } } extension AuthPickerView: View { public var body: some View { - ScrollView { - VStack { - //authPickerTitleView - if authService.authenticationState == .authenticated { - switch authService.authView { - case .mfaEnrollment: - MFAEnrolmentView() - case .mfaManagement: - MFAManagementView() - default: - SignedInView() - } - } else { - switch authService.authView { - case .passwordRecovery: - PasswordRecoveryView() - case .emailLink: - EmailLinkView() - case .mfaEnrollment: - MFAEnrolmentView() - case .mfaResolution: - MFAResolutionView() - case .authPicker: - if authService.emailSignInEnabled { -// Text( -// authService.authenticationFlow == .signIn -// ? authService.string -// .emailLoginFlowLabel -// : authService.string.emailSignUpFlowLabel -// ) - EmailAuthView() - } - VStack { - authService.renderButtons() + authMethodPicker + .safeAreaPadding() + .navigationTitle(authService.string.authPickerTitle) + .navigationBarTitleDisplayMode(.large) + .errorAlert( + error: Binding( + get: { authService.currentError }, + set: { authService.currentError = $0 } + ), + okButtonLabel: authService.string.okButtonLabel + ) + } + + @ViewBuilder + var authMethodPicker: some View { + GeometryReader { proxy in + ScrollView { + VStack(spacing: 24) { + if authService.authenticationState == .authenticated { + switch authService.authView { + case .mfaEnrollment: + MFAEnrolmentView() + case .mfaManagement: + MFAManagementView() + default: + SignedInView() } - if authService.emailSignInEnabled { - Divider() - HStack { - Text( - authService - .authenticationFlow == .signIn - ? authService.string.dontHaveAnAccountYetLabel - : authService.string.alreadyHaveAnAccountLabel - ) - Button(action: { - withAnimation { - switchFlow() - } - }) { + } else { + switch authService.authView { + case .passwordRecovery: + PasswordRecoveryView() + case .emailLink: + EmailLinkView() + case .mfaEnrollment: + MFAEnrolmentView() + case .mfaResolution: + MFAResolutionView() + case .authPicker: + if authService.emailSignInEnabled { + EmailAuthView() + } + if authService.emailSignInEnabled { + Divider() + HStack { Text( - authService.authenticationFlow == .signUp - ? authService.string - .emailLoginFlowLabel - : authService.string.emailSignUpFlowLabel + authService + .authenticationFlow == .signIn + ? authService.string.dontHaveAnAccountYetLabel + : authService.string.alreadyHaveAnAccountLabel ) - .fontWeight(.semibold) - .foregroundColor(.blue) - }.accessibilityIdentifier("switch-auth-flow") + Button(action: { + withAnimation { + switchFlow() + } + }) { + Text( + authService.authenticationFlow == .signUp + ? authService.string + .emailLoginFlowLabel + : authService.string.emailSignUpFlowLabel + ) + .fontWeight(.semibold) + .foregroundColor(.blue) + }.accessibilityIdentifier("switch-auth-flow") + } } + otherSignInOptions(proxy) + tosAndPPFooter + //PrivacyTOCsView(displayMode: .footer) + default: + // TODO: - possibly refactor this, see: https://github.com/firebase/FirebaseUI-iOS/pull/1259#discussion_r2105473437 + EmptyView() } - PrivacyTOCsView(displayMode: .footer) - default: - // TODO: - possibly refactor this, see: https://github.com/firebase/FirebaseUI-iOS/pull/1259#discussion_r2105473437 - EmptyView() } } } - .safeAreaPadding() - .navigationTitle(authService.string.authPickerTitle) } - .errorAlert( - error: Binding( - get: { authService.currentError }, - set: { authService.currentError = $0 } - ), - okButtonLabel: authService.string.okButtonLabel + } + + @ViewBuilder + func otherSignInOptions(_ proxy: GeometryProxy) -> some View { + VStack { + authService.renderButtons() + } + .padding(.horizontal, proxy.size.width * 0.18) + } + + @ViewBuilder + var tosAndPPFooter: some View { + AnnotatedString( + fullText: + "By continuing, you accept our Terms of Service and Privacy Policy.", + links: [ + ("Terms of Service", "https://example.com/terms"), + ("Privacy Policy", "https://example.com/privacy"), + ] ) } } diff --git a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift index be4194e49e..5f410f96c0 100644 --- a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift +++ b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift @@ -32,6 +32,13 @@ public class FacebookProviderSwift: AuthProviderSwift, DeleteUserSwift { self.scopes = scopes self.isLimitedLogin = isLimitedLogin } + + /// Sets whether to use Facebook Limited Login mode + /// - Parameter limitedLogin: `true` for Limited Login (privacy mode), `false` for full tracking + /// - Note: When disabling Limited Login, ensure you have requested ATT permission first + public func setLimitedLogin(_ limitedLogin: Bool) { + self.isLimitedLogin = limitedLogin + } @MainActor public func createAuthCredential() async throws -> AuthCredential { let loginType: LoginTracking = isLimitedLogin ? .limited : .enabled diff --git a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift index 86f0a9056f..a20738bf4f 100644 --- a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift +++ b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift @@ -12,94 +12,33 @@ // See the License for the specific language governing permissions and // limitations under the License. -import AppTrackingTransparency -import FacebookCore -import FacebookLogin import FirebaseAuth import FirebaseAuthSwiftUI import FirebaseAuthUIComponents import FirebaseCore import SwiftUI +/// A button for signing in with Facebook @MainActor public struct SignInWithFacebookButton { @Environment(AuthService.self) private var authService let facebookProvider: FacebookProviderSwift - @State private var showCanceledAlert = false - @State private var limitedLogin = true - @State private var showUserTrackingAlert = false - @State private var trackingAuthorizationStatus: ATTrackingManager - .AuthorizationStatus = .notDetermined public init(facebookProvider: FacebookProviderSwift) { self.facebookProvider = facebookProvider - _trackingAuthorizationStatus = State(initialValue: ATTrackingManager - .trackingAuthorizationStatus) - } - - private var limitedLoginBinding: Binding { - Binding( - get: { self.limitedLogin }, - set: { newValue in - if trackingAuthorizationStatus == .authorized { - self.limitedLogin = newValue - } else { - self.limitedLogin = true - } - } - ) - } - - func requestTrackingPermission() { - ATTrackingManager.requestTrackingAuthorization { status in - Task { @MainActor in - trackingAuthorizationStatus = status - if status != .authorized { - showUserTrackingAlert = true - } - } - } } } extension SignInWithFacebookButton: View { public var body: some View { - VStack { - AuthProviderButton( - label: authService.string.facebookLoginButtonLabel, - style: .facebook, - accessibilityId: "sign-in-with-facebook-button" - ) { - Task { - facebookProvider.isLimitedLogin = limitedLogin - try? await authService.signIn(facebookProvider) - } + AuthProviderButton( + label: authService.string.facebookLoginButtonLabel, + style: .facebook, + accessibilityId: "sign-in-with-facebook-button" + ) { + Task { + try? await authService.signIn(facebookProvider) } - - HStack { - Text(authService.string.authorizeUserTrackingLabel) - .font(.footnote) - .foregroundColor(.blue) - .underline() - .onTapGesture { - requestTrackingPermission() - } - Toggle(isOn: limitedLoginBinding) { - HStack { - Spacer() // This will push the text to the left of the toggle - Text(authService.string.facebookLimitedLoginLabel) - .foregroundColor(.blue) - } - } - .toggleStyle(SwitchToggleStyle(tint: .green)) - } - } - .alert(isPresented: $showUserTrackingAlert) { - Alert( - title: Text(authService.string.authorizeUserTrackingLabel), - message: Text(authService.string.facebookAuthorizeUserTrackingMessage), - dismissButton: .default(Text(authService.string.okButtonLabel)) - ) } } } diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift index 791e585ce8..5a4af64add 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift @@ -19,6 +19,7 @@ // Created by Russell Wheatley on 23/04/2025. // +import AppTrackingTransparency import FirebaseAuth import FirebaseAuthSwiftUI import FirebaseFacebookSwiftUI @@ -31,6 +32,9 @@ import SwiftUI struct ContentView: View { let authService: AuthService + // State for Facebook Limited Login toggle + @State private var useLimitedLogin = true + let facebookProvider: FacebookProviderSwift init() { let actionCodeSettings = ActionCodeSettings() @@ -46,6 +50,11 @@ struct ContentView: View { mfaEnabled: true ) + // Create Facebook provider with Limited Login enabled by default + let fbProvider = FacebookProviderSwift() + fbProvider.setLimitedLogin(true) + facebookProvider = fbProvider + authService = AuthService( configuration: configuration ) @@ -56,14 +65,56 @@ struct ContentView: View { .withOAuthSignIn(OAuthProviderSwift.github()) .withOAuthSignIn(OAuthProviderSwift.microsoft()) .withOAuthSignIn(OAuthProviderSwift.yahoo()) - .withFacebookSignIn() + .withFacebookSignIn(facebookProvider) .withEmailSignIn() - } var body: some View { NavigationStack { - AuthPickerView().environment(authService) + VStack { + AuthPickerView() + + // Facebook Limited Login Control (Example) + GroupBox { + VStack(alignment: .leading, spacing: 8) { + Text("Facebook Settings") + .font(.headline) + + Toggle("Use Limited Login", isOn: $useLimitedLogin) + .onChange(of: useLimitedLogin) { _, newValue in + handleLimitedLoginToggle(newValue) + } + + Text("Limited Login protects privacy by preventing Facebook tracking across apps.") + .font(.caption) + .foregroundColor(.secondary) + } + } + .padding() + } + .environment(authService) + } + } + + private func handleLimitedLoginToggle(_ limitedLogin: Bool) { + if limitedLogin { + // User wants Limited Login - enable immediately + facebookProvider.setLimitedLogin(true) + } else { + // User wants to disable Limited Login (enable tracking) + // Request ATT permission first + ATTrackingManager.requestTrackingAuthorization { status in + Task { @MainActor in + if status == .authorized { + // User authorized tracking + facebookProvider.setLimitedLogin(false) + } else { + // User denied tracking - force Limited Login back ON + useLimitedLogin = true + facebookProvider.setLimitedLogin(true) + } + } + } } } } From ef278ebbaa45b412dd063882cc55b46232cac83c Mon Sep 17 00:00:00 2001 From: Ademola Fadumo Date: Tue, 28 Oct 2025 23:42:47 +0100 Subject: [PATCH 04/38] refactor: AuthPickerView layout and styling --- .../Configuration/AuthProvider.swift | 147 ----- .../Extensions/Color+Hex.swift | 24 - .../AccentColor.colorset/Contents.json | 11 - .../AppIcon.appiconset/Contents.json | 35 -- .../Resources/Assets.xcassets/Contents.json | 6 - .../firebase-auth-logo.imageset/Contents.json | 23 - .../firebase_auth_120dp 1.png | Bin 31998 -> 0 bytes .../firebase_auth_120dp 2.png | Bin 15823 -> 0 bytes .../firebase_auth_120dp.png | Bin 35146 -> 0 bytes .../fui-ic-anonymous.imageset/Contents.json | 23 - .../fui_ic_anonymous_white_24dp 1.png | Bin 7879 -> 0 bytes .../fui_ic_anonymous_white_24dp 2.png | Bin 3635 -> 0 bytes .../fui_ic_anonymous_white_24dp.png | Bin 12883 -> 0 bytes .../fui-ic-apple.imageset/Contents.json | 23 - .../fui_ic_apple_white_24dp 1.png | Bin 9453 -> 0 bytes .../fui_ic_apple_white_24dp 2.png | Bin 4572 -> 0 bytes .../fui_ic_apple_white_24dp.png | Bin 15394 -> 0 bytes .../fui-ic-facebook.imageset/Contents.json | 23 - .../fui_ic_facebook_white_22dp 1.png | Bin 5231 -> 0 bytes .../fui_ic_facebook_white_22dp 2.png | Bin 2524 -> 0 bytes .../fui_ic_facebook_white_22dp.png | Bin 8550 -> 0 bytes .../fui-ic-github.imageset/Contents.json | 23 - .../fui_ic_github_white_24dp 1.png | Bin 13957 -> 0 bytes .../fui_ic_github_white_24dp 2.png | Bin 6636 -> 0 bytes .../fui_ic_github_white_24dp.png | Bin 22107 -> 0 bytes .../fui-ic-googleg.imageset/Contents.json | 23 - .../fui_ic_googleg_color_24dp 1.png | Bin 14824 -> 0 bytes .../fui_ic_googleg_color_24dp 2.png | Bin 7275 -> 0 bytes .../fui_ic_googleg_color_24dp.png | Bin 24342 -> 0 bytes .../fui-ic-mail.imageset/Contents.json | 23 - .../fui_ic_mail_white_24dp 1.png | Bin 5707 -> 0 bytes .../fui_ic_mail_white_24dp 2.png | Bin 2507 -> 0 bytes .../fui_ic_mail_white_24dp.png | Bin 9512 -> 0 bytes .../fui-ic-microsoft.imageset/Contents.json | 23 - .../fui_ic_microsoft_24dp 1.png | Bin 2753 -> 0 bytes .../fui_ic_microsoft_24dp 2.png | Bin 1150 -> 0 bytes .../fui_ic_microsoft_24dp.png | Bin 5102 -> 0 bytes .../fui-ic-phone.imageset/Contents.json | 23 - .../fui_ic_phone_white_24dp 1.png | Bin 7532 -> 0 bytes .../fui_ic_phone_white_24dp 2.png | Bin 3332 -> 0 bytes .../fui_ic_phone_white_24dp.png | Bin 12472 -> 0 bytes .../Contents.json | 23 - .../fui_ic_twitter_bird_white_24dp 1.png | Bin 10311 -> 0 bytes .../fui_ic_twitter_bird_white_24dp 2.png | Bin 4861 -> 0 bytes .../fui_ic_twitter_bird_white_24dp.png | Bin 16207 -> 0 bytes .../fui_ic_yahoo_24dp 1.png | Bin 8024 -> 0 bytes .../fui_ic_yahoo_24dp 2.png | Bin 3783 -> 0 bytes .../fui_ic_yahoo_24dp.png | Bin 13470 -> 0 bytes .../Theme/ProviderStyle.swift | 36 -- .../FirebaseAuthView/Theme/Theme.swift | 14 - .../Views/AuthMethodPickerListView.swift | 73 --- .../Views/Components/AnnotatedString.swift | 56 -- .../Views/Components/AuthProviderButton.swift | 83 --- .../Views/Components/AuthTextField.swift | 169 ------ .../Views/Email/EmailResetPasswordView.swift | 1 + .../Views/Email/EmailSignInView.swift | 1 + .../Views/Email/EmailSignUpView.swift | 1 + .../Views/FirebaseAuthViewInternal.swift | 46 +- .../Views/Phone/CountrySelector.swift | 77 --- .../Views/Phone/EnterPhoneNumberView.swift | 1 + .../Phone/EnterVerificationCodeView.swift | 1 + .../Phone/VerificationCodeInputField.swift | 555 ------------------ .../Sources/Strings/Localizable.xcstrings | 23 - .../Sources/Views/AuthPickerView.swift | 48 +- .../Sources/Views/EmailAuthView.swift | 54 +- .../Sources/Views/PrivacyTOCsView.swift | 6 +- .../Sources/Components/AnnotatedString.swift | 55 -- .../Contents.json | 23 - .../fui_ic_twitter_bird_white_24dp 1.png | Bin 10311 -> 0 bytes .../fui_ic_twitter_bird_white_24dp 2.png | Bin 4861 -> 0 bytes .../fui_ic_twitter_bird_white_24dp.png | Bin 16207 -> 0 bytes .../fui-ic-twitter-x.imageset}/Contents.json | 6 +- .../fui_ic_twitter_x.png | Bin 0 -> 4005 bytes .../fui_ic_twitter_x_x2.png | Bin 0 -> 11826 bytes .../fui_ic_twitter_x_x3.png | Bin 0 -> 19981 bytes .../Sources/Theme/ProviderStyle.swift | 4 +- .../{ => App}/ContentView.swift | 6 +- .../{ => App}/ContentViewSheetExample.swift | 0 .../{ => App}/FirebaseSwiftUIExampleApp.swift | 0 79 files changed, 57 insertions(+), 1735 deletions(-) delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Configuration/AuthProvider.swift delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Extensions/Color+Hex.swift delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/AccentColor.colorset/Contents.json delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/Contents.json delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/Contents.json delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 1.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 2.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-anonymous.imageset/Contents.json delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp 1.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp 2.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/Contents.json delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 1.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 2.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-facebook.imageset/Contents.json delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 1.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 2.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-github.imageset/Contents.json delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-github.imageset/fui_ic_github_white_24dp 1.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-github.imageset/fui_ic_github_white_24dp 2.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-github.imageset/fui_ic_github_white_24dp.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/Contents.json delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 1.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 2.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-mail.imageset/Contents.json delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp 1.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp 2.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/Contents.json delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 1.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 2.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/Contents.json delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 1.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 2.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/Contents.json delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 1.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 2.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-yahoo.imageset/fui_ic_yahoo_24dp 1.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-yahoo.imageset/fui_ic_yahoo_24dp 2.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-yahoo.imageset/fui_ic_yahoo_24dp.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Theme/ProviderStyle.swift delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Theme/Theme.swift delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/AuthMethodPickerListView.swift delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AnnotatedString.swift delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AuthProviderButton.swift delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AuthTextField.swift delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/CountrySelector.swift delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/VerificationCodeInputField.swift delete mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AnnotatedString.swift delete mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/Contents.json delete mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 1.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 2.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp.png rename FirebaseSwiftUI/{FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-yahoo.imageset => FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-x.imageset}/Contents.json (66%) create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-x.imageset/fui_ic_twitter_x.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-x.imageset/fui_ic_twitter_x_x2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-x.imageset/fui_ic_twitter_x_x3.png rename samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/{ => App}/ContentView.swift (100%) rename samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/{ => App}/ContentViewSheetExample.swift (100%) rename samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/{ => App}/FirebaseSwiftUIExampleApp.swift (100%) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Configuration/AuthProvider.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Configuration/AuthProvider.swift deleted file mode 100644 index c5a9c9a6c2..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Configuration/AuthProvider.swift +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI -import FirebaseAuth - -enum AuthProvider: CaseIterable { - case google - case facebook - case twitter - case github - case email - case phone - case anonymous - case microsoft - case yahoo - case apple - - var id: String { - switch self { - case .google: return GoogleAuthProvider.id - case .facebook: return FacebookAuthProvider.id - case .twitter: return TwitterAuthProvider.id - case .github: return GitHubAuthProvider.id - case .email: return EmailAuthProvider.id - case .phone: return PhoneAuthProvider.id - case .anonymous: return "anonymous" - case .microsoft: return "microsoft.com" - case .yahoo: return "yahoo.com" - case .apple: return "apple.com" - } - } - - var buttonTitle: String { - switch self { - case .google: - return "Sign in with Google" - case .facebook: - return "Sign in with Facebook" - case .twitter: - return "Sign in with Twitter" - case .github: - return "Sign in with GitHub" - case .email: - return "Sign in with Email" - case .phone: - return "Sign in with Phone" - case .anonymous: - return "Sign in Anonymously" - case .microsoft: - return "Sign in with Microsoft" - case .yahoo: - return "Sign in with Yahoo" - case .apple: - return "Sign in with Apple" - } - } - - var isSocialProvider: Bool { - switch self { - case .google, .facebook, .twitter, .github: - return true - default: - return false - } - } - - static func from(id: String) -> AuthProvider? { - Self.allCases.first { $0.id == id } - } - - var providerStyle: ProviderStyle { - switch self { - case .google: - return ProviderStyle( - icon: .fuiIcGoogleg, - backgroundColor: Color(hex: 0xFFFFFF), - contentColor: Color(hex: 0x757575) - ) - case .facebook: - return ProviderStyle( - icon: .fuiIcFacebook, - backgroundColor: Color(hex: 0x3B5998), - contentColor: Color(hex: 0xFFFFFF) - ) - case .twitter: - return ProviderStyle( - icon: .fuiIcTwitterBird, - backgroundColor: Color(hex: 0x5BAAF4), - contentColor: Color(hex: 0xFFFFFF) - ) - case .github: - return ProviderStyle( - icon: .fuiIcGithub, - backgroundColor: Color(hex: 0x24292E), - contentColor: Color(hex: 0xFFFFFF) - ) - case .email: - return ProviderStyle( - icon: .fuiIcMail, - backgroundColor: Color(hex: 0xD0021B), - contentColor: Color(hex: 0xFFFFFF) - ) - case .phone: - return ProviderStyle( - icon: .fuiIcPhone, - backgroundColor: Color(hex: 0x43C5A5), - contentColor: Color(hex: 0xFFFFFF) - ) - case .anonymous: - return ProviderStyle( - icon: .fuiIcAnonymous, - backgroundColor: Color(hex: 0xF4B400), - contentColor: Color(hex: 0xFFFFFF) - ) - case .microsoft: - return ProviderStyle( - icon: .fuiIcMicrosoft, - backgroundColor: Color(hex: 0x2F2F2F), - contentColor: Color(hex: 0xFFFFFF) - ) - case .yahoo: - return ProviderStyle( - icon: .fuiIcYahoo, - backgroundColor: Color(hex: 0x720E9E), - contentColor: Color(hex: 0xFFFFFF) - ) - case .apple: - return ProviderStyle( - icon: .fuiIcApple, - backgroundColor: Color(hex: 0x000000), - contentColor: Color(hex: 0xFFFFFF) - ) - } - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Extensions/Color+Hex.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Extensions/Color+Hex.swift deleted file mode 100644 index afcc90b692..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Extensions/Color+Hex.swift +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI - -extension Color { - init(hex: Int, opacity: Double = 1.0) { - let red = Double((hex & 0xFF0000) >> 16) / 255.0 - let green = Double((hex & 0xFF00) >> 8) / 255.0 - let blue = Double((hex & 0xFF) >> 0) / 255.0 - self.init(.sRGB, red: red, green: green, blue: blue, opacity: opacity) - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index eb87897008..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 2305880107..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "tinted" - } - ], - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596a7..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/Contents.json deleted file mode 100644 index d41340246f..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "firebase_auth_120dp 2.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "firebase_auth_120dp 1.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "firebase_auth_120dp.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 1.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 1.png deleted file mode 100644 index 6a6374e30edb3627e445045a6cfaab0ee86500b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31998 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 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 2.png deleted file mode 100644 index 351fa59fe5a0c215853266f7ae53ed06e2d2b001..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15823 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 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp 2.png deleted file mode 100644 index 5c2f2bcd903744406682ab3e8e305f551d854640..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3635 zcmbVOcT^L|)(4*iC zDxFXaDgqJ&X$dt!B_I$8HHfsA{l4#f=l%E2d-t3n03a&;cM|~Qwac1^`s2i|+ay=3DBvxeU7=EwD7T7xkM}v(PjH&pT+57qAe79*e%;Zu|@F*j;6S z62R*2-yl^PVD$ticw70UJA0WTrvrMFwfw4-SP-$0GFsb}@_Zh&xp#%{w|o0_rL#x;;~D+<8|Xnn*rHQ*1~LJ4^XvbG*ZNc=FdNDO7%s z#Il1fuY+vre7$Tv|3OhyQDwH zYD$Rny~LU2m1PrgsnVz={E0=TDz6^uW6d;$(O(DN3&(b)&AzVhD#y-t%NdHRX(#yU zdeL>vYH*%{U3KOz4hj3G4E)En8~!j6*BvQMsm8I3q)xElRV>T6eFfiHWOiG0s%~Ad z{k=w4FMZx5GABppnE}%w9>Y%N%+237vYk1g-=XA} zn3#%sD+HF~A~6nwDLa*eKg{To0l9!Q?feEKT=mTR{LYIl)+K(rhto9kD~%9|4^=1p zGCPy!N@_%=qXz?H{T@^D2~oPKio|TP|7OiGgr-gn}4 zDq7sh^=;aG+hqD`o8}7*Oy1!UX%seEh9>)Tu+&2JNG*u8AnS$*$$1ugiWcy-)yHjr z-w>#SfTx!e{j2lNB#*(lVIR+LH4023m*ZODw1DOINMb+r1zKZ7d6q1usZJ)lSDbwM z7Bd-W>f=bfU?--_ZT?z-P*T|OLa`UfuaYMC8p z-RmmQ3=y;RL=Vl@ZkciNIf zIBFg^U8-DYy^5ggCvtQE($bumzKtb8L~3HOzQmUAT`|25>E+I(a^xLfWN7R-&`?}E zDT{F+ctZ-cnS=jx&TF91+!q;(%H-qmj#lR7_{1!RbJ8$H5r(LufN~Un>I;^g?p{#o z4hdN{L*_oQC8ZRMmNz?-!~zPyhjLWA>1AEVjmwhNRk{}pJ6dB2-;H#u6kk39yH_a~ z-3jqUo{)z8?-X>PFw_r8`k&K8fD{*2JBKLvYzs#fz9+@m%|ZiuFX!Dxn{grEcsbId zmkZnQlV4w4C18Mpu5J9=#mXTsq-=}BGAGBps!cs0Tc7*QJRqAIcLrVux}3uwo7#<7 zYrSrpULIn%(L+q;@q;vRcti>nwWB|K2YSOGbZ~>&?@P4X)#4WzMB|I(1k(pNvoth^ zgppmp8C=SUmZhCk#e`I991t3|*-GT1V)TcNZV1%O*iLhsnnkJ=8N$aMqm7DGH;dH# z)O4z<9_|(KlLDl&OtEfv#pZ z{E~(~N(@0Y7qO))CucVzqI1b3L%LeV71E~dmWJcWQm#8T(RHDf)A*xH&EK(qMLn# zGUIG6KaV~7*LAhm`w7C+O@o1WG@k!hK8Owe*fY!7PrKG^AM2-6XmH`XVN>strOCU6 zTXHv*K_x>;8%)>Fzxiv*{{^bkn<)*%cSwFKS}+gC|Cxj;G(}`~KC{e~Va2PRSOYIW ze%G7XiZ=>K1_wF1@m_CW+j7VGtGC`GYVn1lz6+yY2o7 z4jMMNtZvbJ^|qKrN}Fz@hkAp=@F-EvUR-+$Px)E6A7ZkT@<1>WlI zdzP-GRC2q(f;0CdkW_wXh~O&gi@SD?plFc=TqG5tg^Gn%yBsg_&Lqk#{w7>~^!vl8 z)2Uq;+x}o_LZ77HeQ_8+jr@Nf1BxqlG%I(TobJ64D6B|Vfzj1`coG)E)gjp&?(jxC zGo8KQOAiKqTbPlIw8@AnH*KO!J&5ue^XPMM%je`3v2E?|1e-nh8Cqyemhzy^0M1J^ zt9Bz$mg~1#CW+9$JR~e=$Fmc2*n{oi7iznT=x>0xoI!MO>ha{hYvx3|<*}rw9*KiH z^N}iyv@c4j3|WDo$DO}`fv-*hZSD$y{_Iq6tFY*EM$gAcc@x@8RX~}Y+r`+Ftvu|v zIvizB;oFoCFJV=Jl%j1STn{Q{P_~|Cz8?SJf`mt}T9Q)a?fjgW*c9M7W;QZZK4j-n z82ju}+bW#<+Z<@UP<4RTLJ2GC7GHKT}z% zyX3_sti-bjD|37QSlweBoR2f>5EAO~oO*v%SdXbcW!69?mk{DqD=!5})8xKFX7){Y zYs-knr@IjW3pcR7V&$O{Z}>58CL>a0vQ44kJ2zHRHzjCyb~QvrQPM*-?H3 zD;p6Y7~&7LR@D{7}a1~RG($=$d zGXg`CLWyQI*yMeX@t*J&$5GmPmol-Z)}>MUdXc9)NBRft@THHTAQ&`3tz99B3FJAm z;tqtwNfeaPmkU4N@53`_ItIfXI@i(Xo7ce-?DZFp2ryFWu6zqQt*SSJW8Ge-?H?yN z%U+q~X~f4IyOhGlhPU(yTK?FQLizi?m| zE`tTq>a>2Rw5kBdpHmWEazEssz zs!cgyF;DI2YzTdbmv{gG(dh=m)U^&o>cB!maBMX3!6tn6u@0oMP~k*-+_lBe?1VL3 zu1uL_#rBaE&k*yfxR;a#a4v$>lRR^V?h`Mu=M{G2T)_RKC$C#;FYUP8Y!a_t!^)M3 z*UXdNOZl3`k0wP^^*&3g>+PjUEE0&oJ-P6mu!>CjOz zB9_q6SS;GId1D+p@OW*9_*Xnv+YgNZqORS~w*v9j-BntVu8*kM2@3Ap_QB6U{z0O( zHx7^0ecWsea2KhfRyiIWsZPJ;c6s!Qd0YKX5G1iC2OLCza}M6yy(mE2@N z{EDf_j!D_7<&r|4hiUO_QY`w%#VAwyo&#CeSs8;XVJd?ouWO+WB;51Wgvjg#a61Ar z0t{f+evcSUzU~lef7i+ViJ8cF2An0|V!iA#cj#5x#Ub?|nB2__I9t#4-i+v){|wAz z$-JR5tjg15O0UW1w2@xiE%+BDlc5pb12t=AXHBBZs+l7pKQiZA1X{Fns-VGl1HlNN zf3V);^b~(7Wg@2!MpnLThis{(YPHI@9Ug;{ui1v@k9l`9AcaM1u038_uGY`XVrrNq z&V7NTW*DnA7 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-anonymous.imageset/fui_ic_anonymous_white_24dp.png deleted file mode 100644 index 9d57c10f7e08c6b66f26d8c0a35659a32cc033e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12883 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 Lvy&ydr11X*2XF~} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/Contents.json deleted file mode 100644 index b8005dda54..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "fui_ic_apple_white_24dp 2.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "fui_ic_apple_white_24dp 1.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "fui_ic_apple_white_24dp.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 1.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 1.png deleted file mode 100644 index d251bbd78f51ab2afa7202ece5d658cabf887910..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9453 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 R+0bg6wluXl^~{(^{XY_^*C+r0 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-apple.imageset/fui_ic_apple_white_24dp 2.png deleted file mode 100644 index 7c239197b30a45ee2ee91a4527e4849e13a605ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4572 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 DxB6~5 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 2.png deleted file mode 100644 index 6cc6fcf3c95492e53680d03c52ed8cb34ce495b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2524 zcmc&$`BRf=68^F<96|`ftRR;=ShrI$W6#bYo9$zuTXlqa49%>QTK@@? z?T2S6-Wb+)kUZ4*F-KF~F-UCiTG4U{J^c?=Tozgq5QQMnNmt7=ZZkeuYr||t9zU`? z)G@fEY$AFqEuHE3)LQENIpj%X=+~hxv%&Sm`DEnZpi@Fjr@;H%k!1FuYf zjRk97|K{GVQE1bmF^ikmE?=um_4yKhpdlK_D5%Xr)&j|lacz#WGuAvc`@>O{ zPGZ0E$1BX)*VGMM7t9Cug5QC8K z98Zp)=yT->vnn-!sj@B@U2kuR7!Xk8?U5L3a~^C&5s~Ngr$Q0VK&f|I(teW-zFS+o^o1kVAN({j($f9L z3mZS!9jAf)V!@V2W=QKYHxp~m%^Pjh zumX0&3-!h zq>pKKD(GvAo%N5Jjf_0-F05(~uN-aSdFwkjlS7ZtvIfK2)QUCyt(eWM^4%0_kCvZX z`?vn;G9L={WZ_otam@0f*I768UGdOAgY%c?{5Kv?s-+^sOnBvo`^Q0_4}M7;Cl9tF zBKuOCmR`|^W~$gF5u3_8zj0wY$D>FA!3?Ic2`n4q{ErxE6V`;==CBUxA(;B+A|z&X z0QDllBNp!jR^>lQ^sv&gZ&gGvB_pN&O~DNg=JHt9%4Ze=Y>f=d(5o%sqyw@^M!}@VjgW@ zrHcaMLXxkn49n)mlOpCf-dNgk(Ef1hLQ-d%IFI%0B;)qM75x+1d<)c>J5d~skf7Be z_tSfduL~CVnKFs@2b#=zfx`ZzO5+d&SIxh*QX9dIqjrX05g#J+rz51nuHcWepfdst!vgnN4fBbMjA(*&iOxRoS}e zHK9e++7~5PjmVD8lq1~*3tLOw_bbLjRGfNjzH)cskQn1L4`Vj+&%Ep@u}TaSR5huU zm{NKl?>h2&W%PXW6|r^tTfOJ|C#}JfgnPveBv#sBfr(#MyAtIn|Rwx1bLR!hpG+VaubB`dX zruh)OskaG5o>))v6+rNJOp;N%s$SJm6jWlCqw(G%NX{0~F#q0*aXCj?J5`hqf$2EJ z7Ty6Y>zQ21H#Jg3jCyO!Zzs)WMlt*p5Tg^Xu8=KN&Ozt*2#K)j$<_a%+S(v047H~yr0JE6h1 zz3uM|I4z!czW70^e&Ktl(Q-Z|uP+5mamNL*yF6)^s(<(kckv%?lD}Z@|KD=Wt-fR; z>y@0Lt*($pazh7;#4EF$N%^JCX57Bih1%ZqGlu?h5qqdN0eoza(4d~~UtLV@2!=Wv%)x8!Ed zqHZlA*S)uEEXwP0tV~$zHE-J7-Km=S@m5yLct#g$2r=Zhj5ZM()iVvf%{a!k>2Siyw*Gj))&ByuN1#Fg diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp.png deleted file mode 100644 index 717ca815a1e02617dc50ddbaf19b6d05662f381b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8550 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 sbuA!s;KX!%c;Q#;t diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-github.imageset/fui_ic_github_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-github.imageset/fui_ic_github_white_24dp 2.png deleted file mode 100644 index aa84b536ca2c894f7b9953519bb5d5bdf4b158bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6636 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 acX${NZix@jUg~gHeCoK(FJ&b6oBsz)0*MF! diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/Contents.json deleted file mode 100644 index f6ede1b0b3..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "fui_ic_googleg_color_24dp 2.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "fui_ic_googleg_color_24dp 1.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "fui_ic_googleg_color_24dp.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 1.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 1.png deleted file mode 100644 index c9f49bd31f578ff6c0a19338eb581b07cf5a7eaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14824 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 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp 2.png deleted file mode 100644 index a3c7bf97cad3e34040a66dd11c7ef641304f18a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7275 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 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-googleg.imageset/fui_ic_googleg_color_24dp.png deleted file mode 100644 index 9df17f75fe88db866439c8a1d0d09a63accfb95c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24342 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 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp 2.png deleted file mode 100644 index 937721e2eb58c35f02b62e0cccab8f6b0771e229..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2507 zcmds3{XdiIAHQcaVIp)kA#>32kj$b7&v#-Wc~+h+TM9)fWoc%LQ^Y!nhVpcxjwPl% zHgx7;XPbv|jQNT>eOojS->CKV{JnSng!AL~e!Z^O{kh)P=kxx2uJ?7l?$3SG_ZUG< zWrqp?0BRmb4*LTD3@;yBkPwpE8{PxGl#`BxBm;n|mVCf~;!+F*!jk<7hk&{Py%}hN zhy}et0BFcpT_Y+&0nr|Z!N4o9xwr4n>-Om&-}x}L%P%I?bpFddKy0f*gp!|X<8~6*EdhiF9~P$)`zdpKY07yUe5^1@sFQ(ranJ1 zrBdmW@C`pv5&2q>XgEyuz}pKa7WgaII8LdH|Bf*JQI*yv-5r)i z&4%6Ow(ac6qN`t5PaoZD&t4RS2v!VYHU$dfO|n=k{`{<~P5Di%y`D+>?R9NU9??vi zs!HhZ&z#jb*?HrPG3ohXII-yrLqG3syum(2#)zhFwpc{oq?DE_@Dj|WqugGSR*9mR zxOjfMi@JzGv*O^FL}dOq4P^?;*- z8D2@;6#tNT_UV(=J}XhpEkS6M8Cw?X)rFCaE&LwYv`DyUb>{vj=(N1K0Ok88zVmy; z*jcWlMm)x)Pcr>n*g44Xk?A6bm?m~sOAC9y9xp(_r@J)B8`rWn>mCsSkA7=kX1YPt z4rd$+d(%*`wz`F#k3kOAA4FO%Eg13UqcJWqg_xJZ&V1}DiVN&07dq3i?b$>?m+8t( zw*ga(xq!K!#F>V*ze5DjHre=15Fv(RkV&V!OqUGY7>;xz5DP`YLD`Wkn8T1Bf30yF zDfT3$>rTNk8p|6H;%I~SA+BxoSp^jQzdTL;T8<_OO~SaCF4by~(5Ems*1>}1k&D|& zqobqFMYe94D0tTEG-l_d5qbRw{h70bCJX7=Wk#fX6$;+AkMMy^ZQU=wtKvTJ z$x_<4n88U*yWFJ8rA6+3eT5k{f1{SWCqYeI^P2h4p8bSnD-`+0FJ|sVO&=O2Z>%Jy zbCme`@jpkn)wr9kj>bqR6BF{ZZ;GqF;M3pU=-I%C6GkrVsXA&|!=~;-y+h&eElZ0} z0#%OG230Pw^W0W4^{#tb9<;dt%L-xQI8VL%7!lL8Ua+iug*}C%wf9#DeOwuH-Vpc@ z?`#Ol2<{B%aXW%>G^jT^a>{_uab4m?NDK$gEDHXy6 z2G+iR4+@SifnXCb#g0o$EA*9I_GUOvXlKE6OqZ0fyq$x%a_?l*rEEjqK#U5P77U@r zyn%Rh7Ay>+b2bK3Am(pSnFht!b~$sLuf&LFjzhKNLc;59VcS7996*zu$}~uq=6=V$ zvzGWul9j;VGGf;Zlx|6fo?stL**&UBVl`{^`Hy)Btq zh6qV7Hb5qT%&GmL=$Y9L1LU9OLW4}KG-{Yj^YWMEyE1MQZ)Ie`_-kLbup4G8mxwfc z`cZm?KyNE1ytz1c8++PpvXMZo6l zlG{#wdAZJe-QaSUJ`K`DY@<9pMj4-H?bahV1C;T{8gf+CA%2JJ*bjkd9k~W5u-Dc5 ze3slHS%c&t%9L{rxG~Oe4JiG4kLT#Q$>Tkaa@ry+??AJ?++okmGgy&z4;AyD;rE^2 zq9JiUyg^{lpH3_P`V)`#6`{j;h=sq=BDqlLs3SfM*o-nB>j)zMUluu`U=spYsqUAd zuao5A73gchn^eSAnwVeF+#Vhkj)}w`X6XEO)SKU|-{) zrY62)>E|(`FD6o!&1nzU{r7eU2VExBa_bW2_|*U<;Dv6x-@1ioc7!+wpaep*hCeP_ zdfo4T|FbeDHE4crv?1d&L7-iYq3{))Je_V8DH2=?$?Vk*;SHG{>m;|u#n6-O-84L-CdZCO7|nr z@$(0{()8%~qu*uRLPyH+fmSS)yx3pKa2Nlfs|x zmkP#|{-xdJn%43{)D=4Qd8K;f0s0^R%s_z-Z#Dty$Cbn^R?0m&kB8f_!*z$E>Hh=M Cy+;NB diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-mail.imageset/fui_ic_mail_white_24dp.png deleted file mode 100644 index 273756411a41d04e01a0aff3ec3f1dc2bfb1e0d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9512 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 F{};?xjK=@~ diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/Contents.json deleted file mode 100644 index 123e877f0a..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "fui_ic_microsoft_24dp 2.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "fui_ic_microsoft_24dp 1.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "fui_ic_microsoft_24dp.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 1.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 1.png deleted file mode 100644 index b43f424a5deb534ac6d2ab2fcfbb2d23e4dc9a9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2753 zcmeAS@N?(olHy`uVBq!ia0y~yV9EmG6b?3^$if@E{6LDcz$3Dlfk8|agc&`9R6YO& z8H#P zhB=q#eABnDe_Nb>`*zGTv)2rkw?F4NU#gUQVD-Fo=J)H2MfdtG-xSyDZ%>`arg5un z$z=wH2`X0@7#6iiF*r;KU}oqL0tQ2%6EA~;*9t}k7fw@#291Sm3<9d7ibjKAG!=}f zj6iOY1k(3oMXKDxmdKI;Vst0O686wg3PC diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp 2.png deleted file mode 100644 index 5455ead2cfef72fd8694462a5586268c4cb9cf11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmeAS@N?(olHy`uVBq!ia0y~yU^E3{BMvs8$ZRS1JwS@Hz$3Dlfq`2Xgc%uT&5-~K zG8PB9J29*~C-V}>VM%xNb!1@J*w6hZkrl`l_H=O!sbGA2XK!vupn$`}%4rihCKPb; zX*3AEX}Q6Afkkw~x+4LMPgu-kbNn{R-Vlc2zZSBHx`A2K?9xcmJ5Z_#OG+l$TiKl^&2z^eW3QyH~KC1$(!TiM4y|5)Y`k-pQq zZhCauv*$5ujm@18eM(-}e?L#jk4?elN`pusbC3(KhoGr~>nMkoVeqtMTXjVGy7rdT zX9l<5PQS{RGUv=)q(}ua57cis6K4KB{d0~Tub}$x%HN;vPV4-7I_8Yk`}VH>)3bjX z2;N>_Vl#j9&)S$QCAsv?rRVzJC$0ElrTA_oqvj&EB^^=|l(HPUR*Z6J8wRM+Mk4P| bbv;A+741`n=R|=82?K+ttDnm{r-UW|nDJ-W diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-microsoft.imageset/fui_ic_microsoft_24dp.png deleted file mode 100644 index 98ca3614c576c1d1768bde855ef38fa308b2d3f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5102 zcmeAS@N?(olHy`uVBq!ia0y~yV4e@e(>U0GA{laOTYwa2fk$L91B0Rk2s64)GfV&q zG8PB9J29*~C-V}>VM%xNb!1@J*w6hZk(Gf#xY^UiF{Fa=?e&ehlNlvkFP=Zf%G!EU zftA^yDRaV$LmEB~Mw|wYFEliS%uaCJYw&R4U_4gQ5%a}+PVgSldGC0DMh*&KGv%tz zmF=I?cR!Z7&&ROxu*^N1zdQENZQZ$J-rJAYV|W=>1`E{esIYv`o-{jhMR3Kuxn<@I zOUyRkJSX&b##@_NcNs2NotxfRpI{60j({*QWEq|uQ3sNiA2}Hq9Q&W|Z&k8IVmhf%9d0xnN-tMdCKQc3H{d#9`v`uW5 zT-CXH_4?a8=RY$p_?nXU{Ojf2kqaI_zsbw6_WtJhy|ey0$H z%lFP4lCeK~^UuuJj0?8TJAFBh=g2i?V2(2!3?V++C>m`Mjy8u!`vRl=qtVXcXwMkW mumCW5jDpb+AP@q7^#3uPd}MlnRj1`5NU5i*pUXO@geCx$upqbq diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/Contents.json deleted file mode 100644 index 14af6b8003..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "fui_ic_phone_white_24dp 2.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "fui_ic_phone_white_24dp 1.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "fui_ic_phone_white_24dp.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 1.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 1.png deleted file mode 100644 index e040bdf1a94b7fc1fe045209eaabd2f5bcd447ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7532 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 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp 2.png deleted file mode 100644 index 70579d4aa656686573d90b39e3068e3c9e8291cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3332 zcma)9i#yZ(``;Ya=1`<$4w*x%78)~Tl#zOrAtnvWR(wp%ArI*hO?3EHqI$4do^@cz zMw&y;r>F6=jU?weJdY5gGcu*$`u+Za?|ohO^}gS)_v`h(@B4aR*ZaEe|M++v)l}10 z1A#!A9={#-1%bdAh1)eqFJ^Vt*sWgFxy!zZ?w8f1sxT!STLFT|wnNhVzPz zN;sZ?2Z1WH)W1_zK_Cs5$6-7%3A{9(m19t?yJ@PSB5enX;)}nh7K=gY{4B-JGc92X0iG^{CXCAdh`2@7x(NyWZ2sa`_fN{IaF#Ub(HdBFBGkhlAZa zqLsSF=~v1?wz?sNQyh`}6$=rEi5ulwfOU%$erXMQTe4pk#kzU~gCb z*Kb-*_A?nj0-*xKQ1Y{5(~0?UG(;na2rSu1GA!G9WHRV- z!_Dqxk7vDSckiO`uL@XY6plN{xLOOa1Fs08A@1tbmE>nxMua_{m@%$Rx+}AK>24mo zHBf;cbO_aEbVn&QLmzIS8|v%38~$G{X;f|{#vi)C##iY8@3FW=_f~PKnA=tl7wi^u z@nOQn>a9T8RJJsRo0dz8G!-w>c7|!A&ssM1eXpI$-meVsiqL}S#9`N4ka(n+`|=1# zuuIIHkug~3km4vM!1yQb2(+W--b zjY!w=M2dZ(7Ei`qbV6ev@AU^rx5BZia1Dx$0f>}7qy)3k>ncPEgypJRL(vaQ2^fLy zgpYX_g>pY1h$f~sdSti3Ju7WQsW%*9HV*eouaPo4*(&e{edZk&sz)~8347y~-NqtR z+lbDMK(#_+!S|)0;S!3OOLp5;&pI2CQ2GnS`&Ed~`{!0b>VHpA^wo|evvSaNUoT3& ze^4|;_2U3Q%)igiZy#1|ef9eHFZ9c#7-b4=Z?Nu<8A~M!t!Y66N#7g^804iMZFNn6 zfinRtCxF83YrCUvBS)n%E2k#m4~BS(FJVvK z!GHfu_e+3;+m&@&$U1TV{#hpQ2ZdYLVg;2?1&f`a9w0G?WOpWErLmExr#HNa5=4m? zcq)5aW6w{LE?@kq$uKFR)V=TgWDC0XCS*el%u11HUg`q_tW8rm`XT8(FmV!9x?Lr*!C-R%y&i(bm@YfZeRsQ^0+|kbAR4YZ}3~_YN#ZtHm~wDv!%*Pv!9Rz zqSm;LkPOda5TZHv>d01S7O*qhb%y-M?YKQo0aw@F3s%8~?qP|;wbpmCmh_t%dZ%dZ zi;VO87Ekp{tau!-+kEGevy9IHr~e8>x?pt1wmp-p(`%SaD@M~Iu(LE|zi@6`VkNwL z!HyGIa&$GZ`;uw&V86Em%Qea?+A&=Mz)IuuQu zm}yZPm2@2xTc7$pF;k3lNb4^`UmVKv_Op!5-)2s3Ip}u4j!@kiA^#LJG^|ByjquHG zT#zANG5WtwuX5;6+o^x#jy*Ba{}=pWr(%-^aSB$uyCcO}MgL=LinD|RExj2;c&{G2?I_bG_iA;G@etp%99 zlO?I6H?j2PQ} zePsQ!*rXO^_Vd%RVLnWtU9_dI>}v^sRpu{`ZM?&xA-e8-vVPMYkJ%WOH?<^wmkTEk zUEN!bHXs$HtsK|iU%a7n*%WX0Ct-QjPu|?}9|%mKM%1U3F+U0!2pla(C>wMoF#Sza zUQ84orN^K`UjAXUl*iPxG-1D>+^8p6H=~I>|~wqqaRuc3$MS`2_uRTxLd&m{z3n!2_S_oqL~y4U%R4voJ=OVWEbS1r)~GX zI_*B5Ht4R(R=%>h_}Ag043e8Zv?{6!MaY)0(UG38s=O1mR#w49Fq;fgdN+7VdY8Pe zeg76Q;>vALCibaRZQWvUNgFFWLoWJ}bjL?0Gzu!XmJ@%k&NayWNBP+l!v#l(Y1c4P ztRJ9c89)=2gybD5e>G7MsJJm&2hhpJJs0sI{NVok$vHcnmbZm2nu?KycLy`+Lvg*O z#fY=UR6FZkuL4O&MfIn=oey0?y-|T*hYDaQT!E!(;NVNgHxs!#c1zHOu0od_~e zu0Cy6)oYr0VN9l|@vMTm&p>&oZ_sg6nD8gzidLv0o+)ujm(j+`-Lm6UsCGI*GMc2N zPCro_z}y?^d)+0Y-A|$$M(F?;BDWyKo!##>?7@@}>uL{qZnIY2HZFYWw|LIm5GF5qG^r0GvPXbv@+oqo&Q0Wfy;p7a-R6Cr4&51%}0nG z_5?%>zNV$2r}rc}l@_3>@{<--ZV7XjB40!>Jh(a0^UFJJAv6}KA>L< z!{pcc^HX$3almn=HGF0{iM?_sxH5$;T&L(}!0!{ek0y)nR+x0RW%zrY?tmseDmktHYZ~A-x2@|R?Du)vEx8tyGoAu7Qr}ijwG2$R(?8&K3f#svk zzdccpP7dKN`ELcDb(|bn3A=bu?R4&rA)*JfP22ay%yP9mudL?#gP<4m2_VFh3fbb* zPS=U`J|kzt2Fi2jP>h}nDSk{v3P|WEaKQ4{^KQ&GmQ?M9)kf)5VE$t}?NAmvU42Zg zPV(h{1}h?A_5Qr%?)(FI6Y)dSUGM5&z@s@aKk6hOI3iRg$M;6lO(7IR^MN%jQ5t@T u4^GOLXDcSda)ci$-o diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-phone.imageset/fui_ic_phone_white_24dp.png deleted file mode 100644 index 27a6b5438ccc5f590062dfab3a71fbf81af4873c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12472 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 QA;z5323LnNduIIq0$!{$#{d8T diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/Contents.json deleted file mode 100644 index f9efe37c15..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "fui_ic_twitter_bird_white_24dp 2.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "fui_ic_twitter_bird_white_24dp 1.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "fui_ic_twitter_bird_white_24dp.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 1.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 1.png deleted file mode 100644 index 4c99510bc3bb6ced4ff13c23904b8fbc4b62ef11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10311 zcmW++c|4Te7r$f1z9reWRth7^nk+-4vW%S>%aqqPwn3CMOe7UjuO%VIKE_&RtYJ#= zW?#m{kd!QiR5C*9_w@T?J~Q{6d(XMg^W1a3=X{^JgSI^@EFdcY01!TBb;bbzE<6CR zk9<6k{>rUl+Ln zP?U~zp z_x|Onv~(%CKR++E{iz!9jEz%Q`crqhZDWnNKA@)rmsO#_>YMg;vu>y*KUvc?_DX)@ z*o#_ydisyL(jvGbGt7q)Ce;MreCqq7C|G97^##7+u5mL_gz!R+zLyD_?fLy$PI1g* zYSnxlX|)}@VnhO#+sPCSpH(`Rj~tuZS*r5w%c+x}b{XMqaux{nWbpIh!O7?ve6-|P zO^$-9>y%62ZV|gX2cbifQO#;79NX5q+29#9lH90gCfB1(f%Tu^_gD4r`aIft+n5#w zgNrkPay3miou!Zzh)rgbFpa1ai__0-`&>pg>Ndf{*C7b84qTx z;;ffFw>9e;_KezI6x)5boBX5Ys^`pfpj(IUp_+Fk@t(WKElZ1ehMUtk3+^;SQuOEV zl_Rd~;*iO!Ax0@xO4k(A4feaE;Q>r!*gb>z-n}|jl?&NXanik~v~Bs~`bT0= zOny(#tlHUJt)E{rQ6UZz^ikcP20#|gDXuJjk`fgaBKE5!f3_dX6T!WD`j%jzRK?68 zeL8C~EU>-5XA(|!C_`p+dQYZw8%vI?dG6@=RX@8|5VB%o*qz#-7k()tkeEHQyZpUR zBR>ZE$WuUIS7xjz^kdaV1`o}Ny#kgVTcg)i^e9HS6#AMgA&pSN1LGzX^>cE!(* zmTfp*>ugKCqZ&JuJ+fwk?beUD<@V~1P4R|1H83Tp^Rf8mGN70SMlGbxn#r1D&vb@` zMAQsF-Bj<4j?hvLlW^hu)}Ud_g*50#T?7L2Q{0l|gQ{Qg^-rUldWsbjq=MunC~ z%J(q8P|HJ3U5NjtV$u%lPYfdKKhaPX4LXuPujCh@-&gk#h9CEuD>w9Sijd z=GD9#5x`gywha{9?V$UlR!?AMDj#e#gQQFNq`WSnx%OHHLPFWPfVg04Uf4Dyto zg2~%Y4igp8=^3GaT3D=p?hH&k=~MBG)UWX)6osn5pcL9nS-h(ooX6F+!bp&Ep@X^m z?h|p%BDGY$`1SjhOkS?&jq>i`;b4o9bUa)6B#VT~av5|tZ68dRVCi!5=5g6@_CfY& zS!Z6deUY*nzNJ$knJ89mcj@u<51PY`-+8jkG0w3!W_cDrE$iG82%2xdsxXKT4Gb;G zbu4(J<8H6Ec?~&7a8`KE&2})u{Equb-iw^9dg>zb5jnQqak?VHt^Bk4um@U=xF)KV zzpk~zVQBLOYJVBr>_~H2a8mVa`c(Yg{1&p&IJx7X&#;50rd-S0W2Gb1<1;(w>FRZB z#dX;O^FccntI2}cYKlU{?O6@gAcl*)JkIR<`&Nto$OUilslr?VJl0DpimyouTse^d zS1wAiT%a~apL{+P?jiLl@9UF4@gPmLD>z9zzh}lUN##KSvj~TZmAwX4xJYtB@>6R&lcOVSc~rYx9WM;v(4EDNvwHd z;PDbv4T7%p;qpzLoT3xAe8m1bxtbohfvTY?N`_-z$o5-ZtNF9Ho50w2d1OuRk8~Qo zs91L)aHx$hNE1Gv+@*{?%y2DeY(5_1D2Q6k3>jL6Ox35Qux@bXiyEr}JjPKq*T+08 zJt48i&L~bc!pbn6pVD63n0ksoNKWorhTme z*M)jQ@U;|r@x5UOwCBA_RiH#64&@_}O3*^RB4qwo)B+@PbDa^0K;_TVn1nMbi`)=wd!w5;8x#*D@Cg(Nm2TQac|>m_$q!FMnvm?cb7# z@+=Lw{+$RCV?1oQ!1dE^1J(Z2k$j@k?(M=IPH88bKHtKzaiRn_=Y6*PwfHGx;{<7> zYz?XOVn#c_Mn|eTjHdhW$!<}P#_py`s*$s+y;?lKqcL&|yM6MvA#pVNiz9qTZJcHS zYW_nGF7CJ#-*Sj}?fzpk{kV_b)(~Ns?xNFZyf~cwUjs|A^mxZ2Ox|G8E8Dodve}(x9&+$O=grYCYz_U2-R3%V~f@7HL}>`pIK%2#Ly6oS(<{R z29yOf+%`@n%55Y)&65vdx`d!?ELMZIloP{Nv5Bi8G;`8eUsi+bo4OmS5>Gd7r+OU0 zW~NJxWH0ut#EoA&X6W796~10>wZp<0b|TP;8rv?5JwJ>&SP$+73+od7^$!!CbyN}Y zOrs-piBp$HRIaSEW+mqi2dw22RXhvbHVB5+GXrOdlwCbY@;B`2+{Qbm;QL9&=sTbpA>(iCZFfKk8HG;NCQPHR>7}5>F2+idW zoYb>_v`=IvIoi^umGa}T(0X=<>uIa>PB<>s2HI5jU3MYLMsmdUjl3>dH;xRC9x2;s zF1w#SF3n6`qKvug2b+3k!|ESv$gYY^mUL@KjwtE=B)3{}cLSl(S zV^{>^ZA4zfCn8HnQQ57uCz&kai8(%+GJ6nr=2Pse3ef!aRH;sT8MXB;=3G0clI|ns zx;pI3;Ok98fToy??=RGJKTOfOWuZ@C)GHzw&Q^KBp_CJpEJs;SO`R0NEa~Dz3D2{%-{&bB%GIp9 z7|uH!b?^nlgX5&(!@Gb~lKmMdFsJv$F%pgCcDy3VCD(>UXu4(?X%pm7X|nlAjBbt- z6Ialh^R?*46ofm|Xw3`$2kOI3P{IrT61#Dyj3pAuCR`&8i`tm{0X!o7k5R zc}25frmMe&LdVae9R++{{VyuXfwZ85l)(515_FG!#w58Z>BNdF0cFM6knFa_b%U8X zbwGLEnTVzDW714ydQUh_f&kN#P|0B83hQ#esftZ$1vz)JRq>B5unn?(ue`Ndtf6+zh6_9UxV@&0m;Il%r$p`&OJwTvD3x=?g|7 zorXrI@_z`o3z8lMKo7DiaH|6Etb=)aH%<}voB#WXi3_1R$%l3|B~S? zbyXpp#<$giB$)X7qM*j`BAQ6n8&O2FEvQs#*UpVCy`)hty6PYn89-8p+r zVV;rQ#a=WDo1bHI<-@rdA8n``kFvxGE!_Au0im^P+_fpq3Y3y=8k_?nlXlVb5m<1fnNrksLbZ+a7aOYV7R1i-zR|5wDV`t~L^uV7RahVSLN@za8%v z3ysK9FC0y~|E|=**>#R$L2;R4@&khEL$(63m;(Xm$MPQn?qSM~>F%gsf zg59^YW`qEr4^rMr_104J}C-`vBjJ?3K=;aejJW^)kq zSSN9&F>#xA`#c{s`>sZ_qm2Z;VIRxu&EAQdIzXSA?%OAJg;KK-lg&!TaOKtWfU{%V zo7AXuw!72biSur;^0tXwjQdVwjp&_=2@TBx!Ra5)=vrQRCJbHGZ#@R|^RfJmXh-x^Iil5C&Gk)0*6PZ>kdcVDnJLq-SxsmqD}l{E zSo0=)T+*}qcCW>kA@g_zz!~S>%zeR_YM{+zsZQ1TI8Qpb#mej+NYnr%!^9e2)` zk~Vy<{Zj0Lszzm#zRH1;W6w4JTq#_shXa~&yNPQC3eUnXuN(I@w&9|H@y09bn80)i^*2Glpzs4NB4D{#G<0jOkJyFXF3GRxse=KJ z&1dqxbBc6sx`#dXj3?{;>d^Q8peo?ned}X;L<#_`g3`?qXF?r2fxQ#3{No>yaD)1& z5j(fv&EJ-9SHbtTJmvTRFgdr6DSvdrEChv2Z`l(7a4%99CcHx6VQ+W1!C3jfjfw08 zj1*vG9_w9!cr?&mTKrd(Yo`dT^ES5?oFtgN?fHo_k^nfp+W94ducG*R0+8`f96J;* zgpcO|nilK=L#h^K>o6BX+u&QvA(SwXPTBma0MS7Vw`V(^(co~+ff$P429VC+LXQ51r0X8;^8{bDInh45wC_y{dv-J?3;UL!#dmH-T= z%g+b#B6yK~fT68#RbP>t$eseA+|+8yk&Z$hS<}co2g3=-AD(a=fLx>lfN2uoIK-mI zej`YnsOMfCcY2B2KR&JfxVi_JrhG>w{6WN4w*Q4EF4H#aaD7v#5j_Y;2;m>ZzmoC)<1f<1bK2k1`dx1Wf3b(T4|(hG}KfUbIGvKmgPUr@#S`V`wM0QB*l zF`iKm3#6knoJ2JWk78;3g0J{65Lfw47M9lWVr5F5YKp9Ya zj?0}cY4od;1x}0Ms^tMhkZ5EgeULw+D($q6vT+s$)QfR! zM(#{WqYH=HZWkm57?r2hlXs>6+lMJ!rn1)ou=PDsDjc>Kg}mS`A7&mV4{Tq#-8+a*!KgVI#N?+zXSCA1F=4 zgezjmfFKl~DI$6H#1`45gH%vDFUSvW`Np#!3=|bh&VP9#1p`9o(1uUlA#h8gKfKr} z3xq7DA`uPz_*XHQ+GarNsw_{N&C7XYS7;2yI1wYt1t#9aJ2CHtg-Xyj;^>9Y_+jIs zm7f&z=?U-E7yx#f`7E{CSc~OMo&jE=IDUY`ZiNp0L6qe9T7)2pMMi>o2Vgj<8NIXG z%Vd|2JEo5j+@#fK{FWz|S&JA0{%wsK=vg&=a?tyHQBzie{&VqgK!+a{%D=i*I44!S zoD&Po+NL{(cSRS8RZ>FG?r;*;Qy_3ooLMUdsVu+r8N*PkJTGLybzg~8TXb6zl!gB^ zA6-jHwMMrkLW9CxvHY8kg;;{@K9bBy!_}Kk%to|oP=D9fHW80@m<~+bU#~dMnwl`#S z|Gd`(sh$eh+FFF{uWXGjQ0#=%iT_v2Sxq+i>1zPTugUjacu^sypHi+#5ZxNK_L8#O zg{b6>n8TG4xjk1ux-2CEQndaVw3r0_&^hmqTNPqWGGJJ?!A$KSMZx~dT18e@?xP?; z+u!M0lYr;LADW=lPPXxw4$Pc7gO-YAT5>*(RWvMZ)*`vU=Szpr`Z_T!v%P>6)YGiM z09jee3`0cF#jTFtO!xhQF?KFd5HJ;frsQn3+`v_-&}yCjrbt165h(rI{+I+^;3KMK zp8LD@bTDB24DPASyo*Va*9W*W)IbSG`zo|Cf&7ApVdXTYs!VYXK2$%yV-8_&*XI{I z7se5Eo=l@)gKC2#0*w1EmJ!SWMLG|ZgaRKZ_SL5gle(k{SOZi|xG$~89b;0uu^-?J zV`2x!$oK^I&CIc4gZf=*K+qef@$lirGr6#})${erG#EjAoMy>~KY2d^D-sk#RN~NJ z74rM_DTpB2bqK*Bl*Pd4{LJ2D~5_{PXD?4TZEpz?0@aX_0$`ge{OAD zb1Haesq~U{VLu#aqf>)QU>7)`uSpT72(EAG{+uV(dFs893cb4VqM-48secKAZd68w zYL+-bKq1(2>)mh0GBteRF*v+d$f zdGed4L3^qwj&6pY!$!=3Qo0?aywdLkCpmr^y>^iD|FQ4wRaHP%qy~yZ#3aed8C%}d z21sMe4py1?khQ!4Ff$s@;xsrDGKS3uO80f9BtI9)wBy>Jn#&Nu`OgRij{E| z4;mRGfKZhnFP|UEV)b^fpq1c0QjvkFrZ_|gXH)T_P_mMK17m2)@6Y)gKNpUdr$ZqN zaMB`s`frnU6ZWxYZY6R9`7c@7i_Zdx_e$l}|3eP*!a&>d3s}M=bg6g#s{ex}$T--` zJ(3dy6XpevINCW1sE~i4%(`+^>3nQ;uC5)X@Q~VZ?Fv)aM0WOKY9-~d6}7tEI^CNK zg!=oj`}y%Im-c7?>{UvxZWyLe#ewJj?|r*7aL{bq2hq)r7qaO7pT1!MLjq}M4Bdq% zKg{}L$Gy0LN4U+tLVkRdzTNT(VA_`X~uHdn4;rja}NQT8&X3ZaCmJVSAf|=*4(JXjT(Nu z`281{j#slyfb1elKRuaj1WCMpwQ%Qd)GBh; z02ji5C}Ru^Fy-~yJr;GPT;f-a-VD;$Aa<{}+v4t`v+hv|1dN*JekyjNID zQ$LpJw&vM)B}w*Q!TP)=-{>RqN#t%52b^Kb?|+sKf@V9ZP{rB*5IP+WmNCEnWhH`H zWl#On3_gTTs1v(rF>qHNcsx`KdG=?WKof2!E40t|^J-BF)2#1x>-kN-ATnBJ zSNdK$OkyuHr)=L$TuNMroTj&#?6^2HCu>x7*Jvdyv1PfqGs@Je1ph}M=gz*-??2Nw z50pNijw<@s@(@Bt`S_Z>TFs!xxyWX)P$T%TdTdXPopKHB)VriuOW1)lo=S?A`?1n_ z$Hy(>Equ5yt$RiT?%$QoaHIy*bu9^#-z43)EP>3F$xHutV8Baz|FW4?$wf?|wV8qD zeRwV$&cH~S$)-8lm&6<+BTMRvkz9Y*bR#H~k?OQ3a<)-ic`QAV%do#w&T)!iO$6k= zjN)QT$M1IrX%XCz$=OzCzCi0#vgJwLg<>Q`9)~%YijU^V*Vs{AMFfAza>)`JiPlGY1c@I(ubPVMiunT= z#8$!-IQfyOQqs3G+&hfX69iL)Bl{YTP_%N>NPg2i^)-42O0|3vWY4OQVX@n%4-JIC z`yn=0KFwZ^0ZV;Hg3NKjg!N5p3+6K(R{@01twUrO@8=hB+CLMZY5j`YI8a4X6b$?d zox^s>rKwjLiSx1u_A{5IVt7oCKi?ugk8u!i9wtr-CiBcjC&*&M$Hg`4H9UB^H}^7| zGvHhdvFg!lcoW%aJM^5I-0FamnJN5M)@F&3AWkho_RrDr2Km83vsm%JY5T#R8pI>0s2C4FB%9A*7#uy>k0xi5|`b$`6?Y4pF~_U%qfeP7|O) zJ~-%OOM9TwA%|50^gA?CXGkchj-iPSLgj^wrbdme^nJ3f*s=V1{N%PN;{@m~8|Oc} zpQ01&lW!Rsq`@_-9g(uGQgQ0y)dY-r@6j~*-j3sTyjlMKmwR_H1>e!o1VO)`vx zxjff75Raxs(c^jSbmo$YvL3o%f(AXWs7^-=95bGcYkd1lV=^s&N$k)9S~U$EuwVW zO3?QP%)D|YY{|2GBX__3sog!L8@Kx{r>Et@e30jRO#HK>or6R1-aEttLgd9WDoz1) zEPsJB5I_dWOGZGwf5*Ein#@aGBo~R;etvn{Lz^-*6U#gwwR*ay5KfYedLIp=u%9RM zJK*|un&U*BktCOoz3#Qe?M@bnt-{ftPjWXx#xC#$108Hq7uRqqswXlanaimv<##<} z3gm`o8sPQvMYv}#d)?Gk(f;Hej%X<@V0Ha?Kh`We0%J701R7btOMkp{(^6sAFX6EAY3W zK=VqKW++^F`DikKf3PM6o5mn8TG+~j&tRtQ6a*|5_fVGo@2Nf@gmh(hRI6(0sO2@;h#nDL0od0hqz?F zrYk3~G5o<>*@;Ro6m@YJg!ZhO4L4mUS%kzdHcZ0mK&yI4k=OV{BQg#sq9ou3y$y3wyp2~iCh@rGC)kc>&}L5}8i*3D^m_TbhY zKZ(1Xz?M9pg;YBIAMYMXnDwKo$0Vo|GGt4aR_O?g718;fp#IiWAf%-?8(Y$S-82t6 zLdr+&0UhZ#wOQHvU-G|Vb^Pp>DYN_iH9LD$vm0(8?nM4Hi9WqhmCOnK9 z5BAOE(TqyK_|mN2t1VL}3yaG5`%}p-2IIPZ_$*eu`M6LH)c71IV?!M9sb(Zs`GKaB zk($t3$P3OVNd;t9eVT5dSArbUowvbR9{~tzs1UPS?xr=fs?1Z>J$}`RkM7DavJrHC zH6K$}&1e+iq`*xdh(!A*W<9<(+mi>xiZT6^lbYmN-!ZqSa>>gdsF>_RsxN@=Wx5rr zd-67ib-C>cWxaAPvpx!!hM+p_{CtR*YgSW~T-GPZ(53h+f3L@A9!+CZT207G3^ua@ zys1qOr@!{z52s|3yZ7s=5|)p=eC#FS;rRo$5bIWI{U?%$EfCc$ zSgD;zv#>o=YlchsAG*-{WdHyG diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 2.png deleted file mode 100644 index 2546331cec12cee64d29758eea08800e77e79d47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4861 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 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp.png b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp.png deleted file mode 100644 index 14148143179c87a2d8b2fdf19d4af5c73ee177c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16207 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ⅅ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 diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Theme/ProviderStyle.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Theme/ProviderStyle.swift deleted file mode 100644 index 207d3355e8..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Theme/ProviderStyle.swift +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI - -struct ProviderStyle { - let icon: ImageResource? - let backgroundColor: Color - let contentColor: Color - var iconTint: Color? = nil - let shape: AnyShape = AnyShape(RoundedRectangle(cornerRadius: 4, style: .continuous)) - let elevation: CGFloat = 2 - - static let empty = ProviderStyle( - icon: nil, - backgroundColor: .white, - contentColor: .black - ) - - static var `default`: [String: ProviderStyle] { - Dictionary(uniqueKeysWithValues: AuthProvider.allCases.map { provider in - (provider.id, provider.providerStyle) - }) - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Theme/Theme.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Theme/Theme.swift deleted file mode 100644 index d0e8d78724..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Theme/Theme.swift +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/AuthMethodPickerListView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/AuthMethodPickerListView.swift deleted file mode 100644 index 24d5035596..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/AuthMethodPickerListView.swift +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI - -struct AuthMethodPickerListView: View { - var onProviderSelected: (AuthProvider) -> Void - - var body: some View { - GeometryReader { proxy in - ScrollView { - VStack(spacing: 16) { - AuthProviderButton( - provider: .apple, - onClick: onProviderSelected - ) - AuthProviderButton( - provider: .anonymous, - onClick: onProviderSelected - ) - AuthProviderButton( - provider: .email, - onClick: onProviderSelected - ) - AuthProviderButton( - provider: .phone, - onClick: onProviderSelected - ) - AuthProviderButton( - provider: .google, - onClick: onProviderSelected - ) - AuthProviderButton( - provider: .facebook, - onClick: onProviderSelected - ) - AuthProviderButton( - provider: .twitter, - onClick: onProviderSelected - ) - AuthProviderButton( - provider: .github, - onClick: onProviderSelected - ) - AuthProviderButton( - provider: .microsoft, - onClick: onProviderSelected - ) - AuthProviderButton( - provider: .yahoo, - onClick: onProviderSelected - ) - } - .padding(.horizontal, proxy.size.width * 0.18) - } - } - } -} - -#Preview { - AuthMethodPickerListView { selectedProvider in } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AnnotatedString.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AnnotatedString.swift deleted file mode 100644 index fdec24b9a2..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AnnotatedString.swift +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI - -struct AnnotatedString: View { - let fullText: String - let links: [(label: String, url: String)] - - init( - fullText: String, - links: [(String, String)], - ) { - self.fullText = fullText - self.links = links - } - - var body: some View { - let text = makeAttributedText() - Text(text) - .multilineTextAlignment(.center) - .tint(.accentColor) // Use theme color - .onOpenURL { url in - // Handle URL tap (optional custom handling) - UIApplication.shared.open(url) - } - } - - private func makeAttributedText() -> AttributedString { - let template = fullText - var attributed = AttributedString(template) - - for (label, urlString) in links { - guard let range = attributed.range(of: label), - let url = URL(string: urlString) - else { continue } - - attributed[range].link = url - attributed[range].foregroundColor = UIColor.tintColor - attributed[range].underlineStyle = Text.LineStyle.single - } - - return attributed - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AuthProviderButton.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AuthProviderButton.swift deleted file mode 100644 index d28601badd..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AuthProviderButton.swift +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI - -struct AuthProviderButton: View { - let provider: AuthProvider - let onClick: (AuthProvider) -> Void - var enabled: Bool = true - var style: ProviderStyle? = nil - - private var resolvedStyle: ProviderStyle { - style ?? provider.providerStyle - } - - var body: some View { - let providerStyle = resolvedStyle - Button { - onClick(provider) - } label: { - HStack(spacing: 12) { - if let iconResource = providerStyle.icon { - providerIcon(for: iconResource, tint: providerStyle.iconTint) - } - Text(provider.buttonTitle) - .lineLimit(1) - .truncationMode(.tail) - .foregroundStyle(providerStyle.contentColor) - } - } - .buttonStyle(ProviderButtonStyle(style: providerStyle)) - .disabled(!enabled) - } - - @ViewBuilder - private func providerIcon(for resource: ImageResource, tint: Color?) -> some View { - if let tint { - Image(resource) - .renderingMode(.template) - .resizable() - .scaledToFit() - .frame(width: 24, height: 24) - .foregroundStyle(tint) - } else { - Image(resource) - .renderingMode(.original) - .resizable() - .scaledToFit() - .frame(width: 24, height: 24) - } - } -} - -private struct ProviderButtonStyle: PrimitiveButtonStyle { - let style: ProviderStyle - - func makeBody(configuration: Configuration) -> some View { - Button(action: configuration.trigger) { - configuration.label - .padding(.horizontal, 8) - .frame(maxWidth: .infinity, alignment: .leading) - } - .buttonStyle(.borderedProminent) - .tint(style.backgroundColor) - .shadow( - color: Color.black.opacity(0.12), - radius: Double(style.elevation), - x: 0, - y: style.elevation > 0 ? 1 : 0 - ) - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AuthTextField.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AuthTextField.swift deleted file mode 100644 index 29b4f936d2..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Components/AuthTextField.swift +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI - -struct FieldValidation: Identifiable, Equatable { - let id = UUID() - let message: String - var valid: Bool = false -} - -struct AuthTextField: View { - //@Environment(Theme.self) private var theme - @FocusState private var isFocused: Bool - @State var invalidInput: Bool = false - @State var obscured: Bool = true - - @Binding var text: String - let localizedTitle: String - let prompt: String - var textAlignment: TextAlignment = .leading - var keyboardType: UIKeyboardType = .default - var contentType: UITextContentType? = nil - var isSecureTextField: Bool = false - var validations: [FieldValidation] = [] - var formState: ((Bool) -> Void)? = nil - var onSubmit: ((String) -> Void)? = nil - var onChange: ((String) -> Void)? = nil - private let leading: () -> Leading? - - init( - text: Binding, - localizedTitle: String, - prompt: String, - textAlignment: TextAlignment = .leading, - keyboardType: UIKeyboardType = .default, - contentType: UITextContentType? = nil, - sensitive: Bool = false, - validations: [FieldValidation] = [], - formState: ((Bool) -> Void)? = nil, - onSubmit: ((String) -> Void)? = nil, - onChange: ((String) -> Void)? = nil, - @ViewBuilder leading: @escaping () -> Leading? = { EmptyView() } - ) { - self._text = text - self.localizedTitle = localizedTitle - self.prompt = prompt - self.textAlignment = textAlignment - self.keyboardType = keyboardType - self.contentType = contentType - self.isSecureTextField = sensitive - self.validations = validations - self.formState = formState - self.onSubmit = onSubmit - self.onChange = onChange - self.leading = leading - } - - var allRequirementsMet: Bool { - validations.allSatisfy { $0.valid == true } - } - - var body: some View { - VStack(alignment: .leading) { - Text(localizedTitle) - HStack(spacing: 8) { - leading() - Group { - if isSecureTextField { - ZStack(alignment: .trailing) { - SecureField(localizedTitle, text: $text, prompt: Text(prompt)) - .opacity(obscured ? 1 : 0) - .focused($isFocused) - .frame(height: 24) - TextField(localizedTitle, text: $text, prompt: Text(prompt)) - .opacity(obscured ? 0 : 1) - .focused($isFocused) - .frame(height: 24) - if !text.isEmpty { - Button { - withAnimation(.easeInOut(duration: 0.2)) { - obscured.toggle() - } - // Reapply focus after toggling - DispatchQueue.main.async { - isFocused = true - } - } label: { - Image(systemName: obscured ? "eye" : "eye.slash") - } - .buttonStyle(.plain) - } - } - } else { - TextField( - localizedTitle, - text: $text, - prompt: Text(prompt) - ) - .frame(height: 24) - } - } - } - .frame(maxWidth: .infinity) - .keyboardType(keyboardType) - .textContentType(contentType) - .autocapitalization(.none) - .disableAutocorrection(true) - .focused($isFocused) - .onSubmit { - onSubmit?(text) - } - .onChange(of: text) { oldValue, newValue in - onChange?(newValue) - } - .multilineTextAlignment(textAlignment) - .textFieldStyle(.plain) - .padding(.vertical, 12) - .padding(.horizontal, 12) - .background { - RoundedRectangle(cornerRadius: 8) - .fill(Color.accentColor.opacity(0.05)) - .strokeBorder(lineWidth: isFocused ? 3 : 1) - .foregroundStyle(isFocused ? Color.accentColor : Color(.systemFill)) - } - .contentShape(Rectangle()) - .onTapGesture { - withAnimation { - isFocused = true - } - } - if !validations.isEmpty { - VStack(alignment: .leading, spacing: 4) { - ForEach(validations) { validation in - HStack { - Image(systemName: isSecureTextField ? "lock.open" : "x.square") - .foregroundStyle(validation.valid ? .gray : .red) - Text(validation.message) - .strikethrough(validation.valid, color: .gray) - .foregroundStyle(.gray) - .fixedSize(horizontal: false, vertical: true) - } - } - } - .onChange(of: allRequirementsMet) { oldValue, newValue in - formState?(newValue) - if !newValue { - withAnimation(.easeInOut(duration: 0.08).repeatCount(4)) { - invalidInput = true - } completion: { - invalidInput = false - } - } - } - } - } - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailResetPasswordView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailResetPasswordView.swift index b0361db1a8..8f9d94e6fa 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailResetPasswordView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailResetPasswordView.swift @@ -13,6 +13,7 @@ // limitations under the License. import SwiftUI +import FirebaseAuthUIComponents struct EmailResetPasswordView: View { let state: EmailAuthContentState diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignInView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignInView.swift index 3157d2ca5f..9ca13c839d 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignInView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignInView.swift @@ -14,6 +14,7 @@ import SwiftUI import FirebaseAuthSwiftUI +import FirebaseAuthUIComponents struct EmailSignInView: View { let authService: AuthService diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignUpView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignUpView.swift index 51e1413a09..2fed2c6350 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignUpView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignUpView.swift @@ -13,6 +13,7 @@ // limitations under the License. import SwiftUI +import FirebaseAuthUIComponents struct EmailSignUpView: View { let state: EmailAuthContentState diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthViewInternal.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthViewInternal.swift index b62d3900ab..b1c0ee153e 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthViewInternal.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthViewInternal.swift @@ -13,6 +13,7 @@ // limitations under the License. import SwiftUI +import FirebaseAuthUIComponents struct StringError: LocalizedError { let message: String @@ -71,26 +72,6 @@ enum PhoneAuthStep { case enterVerificationCode } -struct CountryData { - let name: String - let dialCode: String - let code: String - - var flag: String { - // Convert country code to flag emoji - let base: UInt32 = 127397 - var emoji = "" - for scalar in code.unicodeScalars { - if let unicodeScalar = UnicodeScalar(base + scalar.value) { - emoji.append(String(unicodeScalar)) - } - } - return emoji - } - - static let `default` = CountryData(name: "United States", dialCode: "+1", code: "US") -} - struct EmailAuthContentState { var isLoading: Bool var error: String? @@ -197,36 +178,11 @@ struct FirebaseAuthViewInternal: View { @ViewBuilder var authMethodPicker: some View { VStack { - Image(.firebaseAuthLogo) - AuthMethodPickerListView { selectedProvider in - switch selectedProvider { - case .email: - navigator.push(.emailAuth(.signIn)) - case .phone: - navigator.push(.phoneAuth(.enterPhoneNumber)) - default: - break - } - } - .padding(.vertical, 16) - tosAndPPFooter - .padding(.horizontal, 16) } .padding(.top, 24) .frame(maxWidth: .infinity, maxHeight: .infinity) } - @ViewBuilder - var tosAndPPFooter: some View { - AnnotatedString( - fullText: "By continuing, you accept our Terms of Service and Privacy Policy.", - links: [ - ("Terms of Service", "https://example.com/terms"), - ("Privacy Policy", "https://example.com/privacy") - ] - ) - } - // MARK: - State Creation private func createEmailAuthState() -> EmailAuthContentState { diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/CountrySelector.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/CountrySelector.swift deleted file mode 100644 index 77a00f5f63..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/CountrySelector.swift +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI - -struct CountrySelector: View { - @Binding var selectedCountry: CountryData - var enabled: Bool = true - var allowedCountries: Set? = nil - - // Common countries list - private let allCountries: [CountryData] = [ - CountryData(name: "United States", dialCode: "+1", code: "US"), - CountryData(name: "United Kingdom", dialCode: "+44", code: "GB"), - CountryData(name: "Canada", dialCode: "+1", code: "CA"), - CountryData(name: "Australia", dialCode: "+61", code: "AU"), - CountryData(name: "Germany", dialCode: "+49", code: "DE"), - CountryData(name: "France", dialCode: "+33", code: "FR"), - CountryData(name: "India", dialCode: "+91", code: "IN"), - CountryData(name: "Nigeria", dialCode: "+234", code: "NG"), - CountryData(name: "South Africa", dialCode: "+27", code: "ZA"), - CountryData(name: "Japan", dialCode: "+81", code: "JP"), - CountryData(name: "China", dialCode: "+86", code: "CN"), - CountryData(name: "Brazil", dialCode: "+55", code: "BR"), - CountryData(name: "Mexico", dialCode: "+52", code: "MX"), - CountryData(name: "Spain", dialCode: "+34", code: "ES"), - CountryData(name: "Italy", dialCode: "+39", code: "IT"), - ] - - private var filteredCountries: [CountryData] { - if let allowedCountries = allowedCountries { - return allCountries.filter { allowedCountries.contains($0.code) } - } - return allCountries - } - - var body: some View { - Menu { - ForEach(filteredCountries, id: \.code) { country in - Button { - selectedCountry = country - } label: { - Text("\(country.flag) \(country.name) (\(country.dialCode))") - } - } - } label: { - HStack(spacing: 4) { - Text(selectedCountry.flag) - .font(.title3) - Text(selectedCountry.dialCode) - .font(.body) - .foregroundStyle(.primary) - Image(systemName: "chevron.down") - .font(.caption2) - .foregroundStyle(.secondary) - } - } - .disabled(!enabled) - } -} - -#Preview { - CountrySelector( - selectedCountry: .constant(.default) - ) -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterPhoneNumberView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterPhoneNumberView.swift index 98a300a154..2e840e5de6 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterPhoneNumberView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterPhoneNumberView.swift @@ -13,6 +13,7 @@ // limitations under the License. import SwiftUI +import FirebaseAuthUIComponents struct EnterPhoneNumberView: View { let state: PhoneAuthContentState diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterVerificationCodeView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterVerificationCodeView.swift index 59d20290a7..9149a72efd 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterVerificationCodeView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterVerificationCodeView.swift @@ -13,6 +13,7 @@ // limitations under the License. import SwiftUI +import FirebaseAuthUIComponents struct EnterVerificationCodeView: View { let state: PhoneAuthContentState diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/VerificationCodeInputField.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/VerificationCodeInputField.swift deleted file mode 100644 index ae795e4018..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/VerificationCodeInputField.swift +++ /dev/null @@ -1,555 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI -import UIKit - -struct VerificationCodeInputField: View { - init( - code: Binding, - codeLength: Int = 6, - isError: Bool = false, - errorMessage: String? = nil, - onCodeComplete: @escaping (String) -> Void = { _ in }, - onCodeChange: @escaping (String) -> Void = { _ in } - ) { - self._code = code - self.codeLength = codeLength - self.isError = isError - self.errorMessage = errorMessage - self.onCodeComplete = onCodeComplete - self.onCodeChange = onCodeChange - self._digitFields = State(initialValue: Array(repeating: "", count: codeLength)) - } - - @Binding var code: String - let codeLength: Int - let isError: Bool - let errorMessage: String? - let onCodeComplete: (String) -> Void - let onCodeChange: (String) -> Void - - @State private var digitFields: [String] = [] - @State private var focusedIndex: Int? = nil - @State private var pendingInternalCodeUpdates = 0 - - var body: some View { - VStack(spacing: 8) { - HStack(spacing: 8) { - ForEach(0.. 0 { - pendingInternalCodeUpdates -= 1 - return - } - updateDigitFieldsFromCode(shouldUpdateFocus: true) - } - } - - private func updateDigitFieldsFromCode(shouldUpdateFocus: Bool, forceFocus: Bool = false) { - let sanitized = code.filter { $0.isNumber } - let truncated = String(sanitized.prefix(codeLength)) - var newFields = Array(repeating: "", count: codeLength) - - for (offset, character) in truncated.enumerated() { - newFields[offset] = String(character) - } - - let fieldsChanged = newFields != digitFields - if fieldsChanged { - digitFields = newFields - } - - if code != truncated { - commitCodeChange(truncated) - } - - if shouldUpdateFocus && (fieldsChanged || forceFocus) { - let newFocus = truncated.count < codeLength ? truncated.count : nil - DispatchQueue.main.async { - withAnimation(.easeInOut(duration: 0.2)) { - focusedIndex = newFocus - } - } - } - - if fieldsChanged && truncated.count == codeLength { - DispatchQueue.main.async { - onCodeComplete(truncated) - } - } - } - - private func commitCodeChange(_ newCode: String) { - if code != newCode { - pendingInternalCodeUpdates += 1 - code = newCode - } - } - - private func handleDigitChanged(at index: Int, newDigit: String) { - let sanitized = newDigit.filter { $0.isNumber } - - guard !sanitized.isEmpty else { - processSingleDigitInput(at: index, digit: "") - return - } - - let firstDigit = String(sanitized.prefix(1)) - processSingleDigitInput(at: index, digit: firstDigit) - - let remainder = String(sanitized.dropFirst()) - let availableSlots = max(codeLength - (index + 1), 0) - if availableSlots > 0 { - let trimmedRemainder = String(remainder.prefix(availableSlots)) - if !trimmedRemainder.isEmpty { - applyBulkInput(startingAt: index + 1, digits: trimmedRemainder) - } - } - } - - private func processSingleDigitInput(at index: Int, digit: String) { - if digitFields[index] != digit { - digitFields[index] = digit - } - - let newCode = digitFields.joined() - commitCodeChange(newCode) - onCodeChange(newCode) - - if !digit.isEmpty, - let nextIndex = findNextEmptyField(startingFrom: index) { - DispatchQueue.main.async { - if focusedIndex != nextIndex { - withAnimation(.easeInOut(duration: 0.2)) { - focusedIndex = nextIndex - } - } - } - } - - if newCode.count == codeLength { - DispatchQueue.main.async { - onCodeComplete(newCode) - } - } - } - - - private func handleBackspace(at index: Int) { - // If current field is empty, move to previous field and clear it - if digitFields[index].isEmpty && index > 0 { - digitFields[index - 1] = "" - DispatchQueue.main.async { - let previousIndex = index - 1 - if focusedIndex != previousIndex { - withAnimation(.easeInOut(duration: 0.2)) { - focusedIndex = previousIndex - } - } - } - } else { - // Clear current field - digitFields[index] = "" - } - - // Update the main code string - let newCode = digitFields.joined() - commitCodeChange(newCode) - onCodeChange(newCode) - } - - private func applyBulkInput(startingAt index: Int, digits: String) { - guard !digits.isEmpty, index < codeLength else { return } - - var updatedFields = digitFields - var currentIndex = index - - for digit in digits where currentIndex < codeLength { - updatedFields[currentIndex] = String(digit) - currentIndex += 1 - } - - if digitFields != updatedFields { - digitFields = updatedFields - } - - let newCode = updatedFields.joined() - commitCodeChange(newCode) - onCodeChange(newCode) - - if newCode.count == codeLength { - DispatchQueue.main.async { - onCodeComplete(newCode) - } - } else { - let clampedIndex = max(min(currentIndex - 1, codeLength - 1), 0) - if let nextIndex = findNextEmptyField(startingFrom: clampedIndex) { - DispatchQueue.main.async { - if focusedIndex != nextIndex { - withAnimation(.easeInOut(duration: 0.2)) { - focusedIndex = nextIndex - } - } - } - } - } - } - - private func findNextEmptyField(startingFrom index: Int) -> Int? { - // Look for the next empty field after the current index - for i in (index + 1).. Void - let onBackspace: () -> Void - let onFocusChanged: (Bool) -> Void - - private var borderWidth: CGFloat { - if isError { return 2 } - if isFocused || !digit.isEmpty { return 3 } - return 1 - } - - private var borderColor: Color { - if isError { return .red } - if isFocused || !digit.isEmpty { return .accentColor } - return Color(.systemFill) - } - - var body: some View { - BackspaceAwareTextField( - text: $digit, - isFirstResponder: isFocused, - onDeleteBackwardWhenEmpty: { - if digit.isEmpty { - onBackspace() - } else { - digit = "" - } - }, - onFocusChanged: { isFocused in - onFocusChanged(isFocused) - }, - maxCharacters: maxDigits, - configuration: { textField in - textField.font = .systemFont(ofSize: 24, weight: .medium) - textField.textAlignment = .center - textField.keyboardType = .numberPad - textField.textContentType = .oneTimeCode - textField.autocapitalizationType = .none - textField.autocorrectionType = .no - }, - onTextChange: { newValue in - onDigitChanged(newValue) - } - ) - .frame(width: 48, height: 48) - .background( - RoundedRectangle(cornerRadius: 8) - .fill(Color.accentColor.opacity(0.05)) - .overlay( - RoundedRectangle(cornerRadius: 8) - .stroke(borderColor, lineWidth: borderWidth) - ) - ) - .frame(maxWidth: .infinity) - .accessibilityElement(children: .ignore) - .accessibilityLabel("Digit \(position) of \(totalDigits)") - .accessibilityValue(digit.isEmpty ? "Empty" : digit) - .accessibilityHint("Enter verification code digit") - .animation(.easeInOut(duration: 0.2), value: isFocused) - .animation(.easeInOut(duration: 0.2), value: digit) - } -} - -private struct BackspaceAwareTextField: UIViewRepresentable { - @Binding var text: String - var isFirstResponder: Bool - let onDeleteBackwardWhenEmpty: () -> Void - let onFocusChanged: (Bool) -> Void - let maxCharacters: Int - let configuration: (UITextField) -> Void - let onTextChange: (String) -> Void - - func makeUIView(context: Context) -> BackspaceUITextField { - context.coordinator.parent = self - let textField = BackspaceUITextField() - textField.delegate = context.coordinator - textField.addTarget( - context.coordinator, - action: #selector(Coordinator.editingChanged(_:)), - for: .editingChanged - ) - configuration(textField) - textField.onDeleteBackward = { [weak textField] in - guard let textField else { return } - if (textField.text ?? "").isEmpty { - onDeleteBackwardWhenEmpty() - } - } - return textField - } - - func updateUIView(_ uiView: BackspaceUITextField, context: Context) { - context.coordinator.parent = self - if uiView.text != text { - uiView.text = text - } - - uiView.onDeleteBackward = { [weak uiView] in - guard let uiView else { return } - if (uiView.text ?? "").isEmpty { - onDeleteBackwardWhenEmpty() - } - } - - if isFirstResponder { - if !context.coordinator.isFirstResponder { - context.coordinator.isFirstResponder = true - DispatchQueue.main.async { [weak uiView] in - guard let uiView, !uiView.isFirstResponder else { return } - uiView.becomeFirstResponder() - } - } - } else if context.coordinator.isFirstResponder { - context.coordinator.isFirstResponder = false - } - } - - func makeCoordinator() -> Coordinator { - Coordinator(parent: self) - } - - final class Coordinator: NSObject, UITextFieldDelegate { - var parent: BackspaceAwareTextField - var isFirstResponder = false - - init(parent: BackspaceAwareTextField) { - self.parent = parent - } - - @objc func editingChanged(_ sender: UITextField) { - let updatedText = sender.text ?? "" - parent.text = updatedText - parent.onTextChange(updatedText) - } - - func textFieldDidBeginEditing(_ textField: UITextField) { - isFirstResponder = true - animateFocusChange(for: textField, focused: true) - parent.onFocusChanged(true) - } - - func textFieldDidEndEditing(_ textField: UITextField) { - isFirstResponder = false - animateFocusChange(for: textField, focused: false) - parent.onFocusChanged(false) - } - - private func animateFocusChange(for textField: UITextField, focused: Bool) { - let targetTransform: CGAffineTransform = focused ? CGAffineTransform(scaleX: 1.05, y: 1.05) : .identity - UIView.animate( - withDuration: 0.2, - delay: 0, - options: [.curveEaseInOut, .allowUserInteraction] - ) { - textField.transform = targetTransform - } - } - - func textField( - _ textField: UITextField, - shouldChangeCharactersIn range: NSRange, - replacementString string: String - ) -> Bool { - if string.isEmpty { - return true - } - - let digitsOnly = string.filter { $0.isNumber } - guard !digitsOnly.isEmpty else { - return false - } - - let currentText = textField.text ?? "" - let nsCurrent = currentText as NSString - - if digitsOnly.count > 1 || string.count > 1 { - let limit = max(parent.maxCharacters, 1) - let truncated = String(digitsOnly.prefix(limit)) - let proposed = nsCurrent.replacingCharacters(in: range, with: truncated) - parent.onTextChange(String(proposed.prefix(limit))) - return false - } - - let updated = nsCurrent.replacingCharacters(in: range, with: digitsOnly) - return updated.count <= 1 - } - } -} - -private final class BackspaceUITextField: UITextField { - var onDeleteBackward: (() -> Void)? - - override func deleteBackward() { - let wasEmpty = (text ?? "").isEmpty - super.deleteBackward() - if wasEmpty { - onDeleteBackward?() - } - } -} - -// MARK: - Preview - -#Preview("Normal State") { - @Previewable @State var code = "" - - return VStack(spacing: 32) { - Text("Enter Verification Code") - .font(.title2) - .fontWeight(.semibold) - - VerificationCodeInputField( - code: $code, - onCodeComplete: { completedCode in - print("Code completed: \(completedCode)") - }, - onCodeChange: { newCode in - print("Code changed: \(newCode)") - } - ) - - Text("Current code: \(code)") - .font(.caption) - .foregroundColor(.secondary) - } - .padding() -} - -#Preview("Error State") { - @Previewable @State var code = "12345" - - return VStack(spacing: 32) { - Text("Enter Verification Code") - .font(.title2) - .fontWeight(.semibold) - - VerificationCodeInputField( - code: $code, - isError: true, - errorMessage: "Invalid verification code", - onCodeComplete: { completedCode in - print("Code completed: \(completedCode)") - }, - onCodeChange: { newCode in - print("Code changed: \(newCode)") - } - ) - - Text("Current code: \(code)") - .font(.caption) - .foregroundColor(.secondary) - } - .padding() -} - -#Preview("Custom Length") { - @Previewable @State var code = "" - - return VStack(spacing: 32) { - Text("Enter 4-Digit Code") - .font(.title2) - .fontWeight(.semibold) - - VerificationCodeInputField( - code: $code, - codeLength: 4, - onCodeComplete: { completedCode in - print("Code completed: \(completedCode)") - }, - onCodeChange: { newCode in - print("Code changed: \(newCode)") - } - ) - - Text("Current code: \(code)") - .font(.caption) - .foregroundColor(.secondary) - } - .padding() -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings index 33388d8aff..1e5bfa38c5 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings @@ -3,16 +3,6 @@ "strings" : { "%@" : { - }, - "%@ %@ (%@)" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "%1$@ %2$@ (%3$@)" - } - } - } }, "β€’β€’β€’β€’β€’β€’%@" : { @@ -389,16 +379,6 @@ } } }, - "Digit %lld of %lld" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Digit %1$lld of %2$lld" - } - } - } - }, "Display Name" : { }, @@ -537,9 +517,6 @@ }, "Enter Verification Code" : { - }, - "Enter verification code digit" : { - }, "Enter your email address and we'll send you a link to reset your password." : { diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift index 063586880f..c379589e7c 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift @@ -14,23 +14,19 @@ import FirebaseCore import SwiftUI +import FirebaseAuthUIComponents @MainActor public struct AuthPickerView { @Environment(AuthService.self) private var authService public init() {} - - private func switchFlow() { - authService.authenticationFlow = - authService - .authenticationFlow == .signIn ? .signUp : .signIn - } } extension AuthPickerView: View { public var body: some View { authMethodPicker + .background(Color(UIColor.secondarySystemBackground)) .safeAreaPadding() .navigationTitle(authService.string.authPickerTitle) .navigationBarTitleDisplayMode(.large) @@ -71,34 +67,8 @@ extension AuthPickerView: View { if authService.emailSignInEnabled { EmailAuthView() } - if authService.emailSignInEnabled { - Divider() - HStack { - Text( - authService - .authenticationFlow == .signIn - ? authService.string.dontHaveAnAccountYetLabel - : authService.string.alreadyHaveAnAccountLabel - ) - Button(action: { - withAnimation { - switchFlow() - } - }) { - Text( - authService.authenticationFlow == .signUp - ? authService.string - .emailLoginFlowLabel - : authService.string.emailSignUpFlowLabel - ) - .fontWeight(.semibold) - .foregroundColor(.blue) - }.accessibilityIdentifier("switch-auth-flow") - } - } otherSignInOptions(proxy) - tosAndPPFooter - //PrivacyTOCsView(displayMode: .footer) + PrivacyTOCsView(displayMode: .full) default: // TODO: - possibly refactor this, see: https://github.com/firebase/FirebaseUI-iOS/pull/1259#discussion_r2105473437 EmptyView() @@ -116,18 +86,6 @@ extension AuthPickerView: View { } .padding(.horizontal, proxy.size.width * 0.18) } - - @ViewBuilder - var tosAndPPFooter: some View { - AnnotatedString( - fullText: - "By continuing, you accept our Terms of Service and Privacy Policy.", - links: [ - ("Terms of Service", "https://example.com/terms"), - ("Privacy Policy", "https://example.com/privacy"), - ] - ) - } } #Preview { diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift index a55db55e9a..bd777f2341 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift @@ -19,6 +19,7 @@ // Created by Russell Wheatley on 20/03/2025. // import FirebaseAuth +import FirebaseAuthUIComponents import FirebaseCore import SwiftUI @@ -31,15 +32,15 @@ private enum FocusableField: Hashable { @MainActor public struct EmailAuthView { @Environment(AuthService.self) private var authService - + @State private var email = "" @State private var password = "" @State private var confirmPassword = "" - + @FocusState private var focus: FocusableField? - + public init() {} - + private var isValid: Bool { return if authService.authenticationFlow == .signIn { !email.isEmpty && !password.isEmpty @@ -47,11 +48,11 @@ public struct EmailAuthView { !email.isEmpty && !password.isEmpty && password == confirmPassword } } - + private func signInWithEmailPassword() async { try? await authService.signIn(email: email, password: password) } - + private func createUserWithEmailPassword() async { try? await authService.createUser(email: email, password: password) } @@ -100,14 +101,8 @@ extension EmailAuthView: View { .frame(maxWidth: .infinity, alignment: .trailing) } .accessibilityIdentifier("password-recovery-button") - -// Button(action: { -// authService.authView = .passwordRecovery -// }) { -// Text(authService.string.passwordButtonLabel) -// }.accessibilityIdentifier("password-recovery-button") } - + if authService.authenticationFlow == .signUp { AuthTextField( text: $confirmPassword, @@ -126,7 +121,7 @@ extension EmailAuthView: View { .focused($focus, equals: .confirmPassword) .accessibilityIdentifier("confirm-password-field") } - + Button(action: { Task { if authService.authenticationFlow == .signIn { @@ -139,9 +134,9 @@ extension EmailAuthView: View { if authService.authenticationState != .authenticating { Text( authService.authenticationFlow == .signIn - ? authService.string - .signInWithEmailButtonLabel - : authService.string.signUpWithEmailButtonLabel + ? authService.string + .signInWithEmailButtonLabel + : authService.string.signUpWithEmailButtonLabel ) .padding(.vertical, 8) .frame(maxWidth: .infinity) @@ -163,6 +158,31 @@ extension EmailAuthView: View { Text(authService.string.signUpWithEmailLinkButtonLabel) }.accessibilityIdentifier("sign-in-with-email-link-button") } + Divider() + HStack { + Text( + authService + .authenticationFlow == .signIn + ? authService.string.dontHaveAnAccountYetLabel + : authService.string.alreadyHaveAnAccountLabel + ) + Button(action: { + withAnimation { + authService.authenticationFlow = + authService + .authenticationFlow == .signIn ? .signUp : .signIn + } + }) { + Text( + authService.authenticationFlow == .signUp + ? authService.string + .emailLoginFlowLabel + : authService.string.emailSignUpFlowLabel + ) + .fontWeight(.semibold) + .foregroundColor(.blue) + }.accessibilityIdentifier("switch-auth-flow") + } } } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PrivacyTOCsView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PrivacyTOCsView.swift index db7c1294bd..a33ec8e878 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PrivacyTOCsView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PrivacyTOCsView.swift @@ -66,9 +66,9 @@ extension PrivacyTOCsView: View { if let tosURL = authService.configuration.tosUrl, let privacyURL = authService.configuration.privacyPolicyUrl { Text(attributedMessage(tosURL: tosURL, privacyURL: privacyURL)) - .multilineTextAlignment(displayMode == .full ? .leading : .trailing) - .font(.footnote) - .foregroundColor(.primary) + .multilineTextAlignment(displayMode == .full ? .center : .trailing) + //.font(.footnote) + //.foregroundColor(.primary) .padding() } else { EmptyView() diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AnnotatedString.swift b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AnnotatedString.swift deleted file mode 100644 index 8979e0cc42..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AnnotatedString.swift +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI - -public struct AnnotatedString: View { - let fullText: String - let links: [(label: String, url: String)] - - public init( - fullText: String, - links: [(String, String)] - ) { - self.fullText = fullText - self.links = links - } - - public var body: some View { - let text = makeAttributedText() - Text(text) - .multilineTextAlignment(.center) - .tint(.accentColor) - .onOpenURL { url in - UIApplication.shared.open(url) - } - } - - private func makeAttributedText() -> AttributedString { - let template = fullText - var attributed = AttributedString(template) - - for (label, urlString) in links { - guard let range = attributed.range(of: label), - let url = URL(string: urlString) - else { continue } - - attributed[range].link = url - attributed[range].foregroundColor = UIColor.tintColor - attributed[range].underlineStyle = Text.LineStyle.single - } - - return attributed - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/Contents.json deleted file mode 100644 index f9efe37c15..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "fui_ic_twitter_bird_white_24dp 2.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "fui_ic_twitter_bird_white_24dp 1.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "fui_ic_twitter_bird_white_24dp.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 1.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 1.png deleted file mode 100644 index 4c99510bc3bb6ced4ff13c23904b8fbc4b62ef11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10311 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 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 2.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp 2.png deleted file mode 100644 index 2546331cec12cee64d29758eea08800e77e79d47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4861 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 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-bird.imageset/fui_ic_twitter_bird_white_24dp.png deleted file mode 100644 index 14148143179c87a2d8b2fdf19d4af5c73ee177c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16207 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ⅅ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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-x.imageset/fui_ic_twitter_x_x2.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-x.imageset/fui_ic_twitter_x_x2.png new file mode 100644 index 0000000000000000000000000000000000000000..dd26fab7baada562634d854e2fc417e7e6648ed3 GIT binary patch literal 11826 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 XC``c@8_K{DZ-@!Z!l3e!Gv@yQOVY(- literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-x.imageset/fui_ic_twitter_x_x3.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-twitter-x.imageset/fui_ic_twitter_x_x3.png new file mode 100644 index 0000000000000000000000000000000000000000..dc5ad745643e55ea2a0cd49f27ef24d3f893e1c2 GIT binary patch literal 19981 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

2T?(iSxAha;DYH?kNU9>)5nB_XfXYH3)s& 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Theme/ProviderStyle.swift b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Theme/ProviderStyle.swift index 5d14c7c01a..dcc4d95f94 100644 --- a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Theme/ProviderStyle.swift +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Theme/ProviderStyle.swift @@ -63,8 +63,8 @@ public struct ProviderStyle: Sendable { public static var twitter: ProviderStyle { ProviderStyle( - icon: Image(.fuiIcTwitterBird), - backgroundColor: Color(hex: 0x5BAAF4), + icon: Image(.fuiIcTwitterX), + backgroundColor: Color.black, contentColor: Color(hex: 0xFFFFFF) ) } diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift similarity index 100% rename from samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift rename to samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift index 5a4af64add..a5feba1be3 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentView.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift @@ -58,14 +58,14 @@ struct ContentView: View { authService = AuthService( configuration: configuration ) - .withGoogleSignIn() - .withPhoneSignIn() .withAppleSignIn() + .withPhoneSignIn() + .withGoogleSignIn() + .withFacebookSignIn(facebookProvider) .withTwitterSignIn() .withOAuthSignIn(OAuthProviderSwift.github()) .withOAuthSignIn(OAuthProviderSwift.microsoft()) .withOAuthSignIn(OAuthProviderSwift.yahoo()) - .withFacebookSignIn(facebookProvider) .withEmailSignIn() } diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentViewSheetExample.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentViewSheetExample.swift similarity index 100% rename from samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/ContentViewSheetExample.swift rename to samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentViewSheetExample.swift diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/FirebaseSwiftUIExampleApp.swift similarity index 100% rename from samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/FirebaseSwiftUIExampleApp.swift rename to samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/FirebaseSwiftUIExampleApp.swift From 94f1a36ad4cf85381ec1a13a9d844db7c8cad515 Mon Sep 17 00:00:00 2001 From: Ademola Fadumo Date: Wed, 29 Oct 2025 10:08:53 +0100 Subject: [PATCH 05/38] refactor: use sheet and navigation links --- .../Sources/Views/AuthPickerView.swift | 135 +++++++++++++----- .../Sources/Views/EmailAuthView.swift | 51 ++++--- .../Sources/Views/EmailLinkView.swift | 49 +++---- .../Sources/Views/PasswordRecoveryView.swift | 67 +++------ ...assword.swift => UpdatePasswordView.swift} | 0 .../App/ContentView.swift | 83 +++++++++-- 6 files changed, 228 insertions(+), 157 deletions(-) rename FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/{UpdatePassword.swift => UpdatePasswordView.swift} (100%) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift index c379589e7c..59eeaff6bc 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift @@ -17,19 +17,64 @@ import SwiftUI import FirebaseAuthUIComponents @MainActor -public struct AuthPickerView { +public struct AuthPickerView { + public init( + isPresented: Binding = .constant(false), + interactiveDismissDisabled: Bool = true, + @ViewBuilder content: @escaping () -> Content = { EmptyView() }, + @ViewBuilder footer: @escaping () -> Footer = { EmptyView() } + ) { + self.isPresented = isPresented + self.interactiveDismissDisabled = interactiveDismissDisabled + self.content = content + self.footer = footer + } + @Environment(AuthService.self) private var authService - - public init() {} + private var isPresented: Binding + private var interactiveDismissDisabled: Bool + private let content: () -> Content? + private let footer: () -> Footer? } extension AuthPickerView: View { public var body: some View { + content() + .sheet(isPresented: isPresented) { + NavigationStack { + authPickerViewInternal + .navigationTitle(authService.string.authPickerTitle) + .navigationBarTitleDisplayMode(.large) + .navigationDestination(for: AuthView.self) { view in + switch view { + case AuthView.passwordRecovery: + PasswordRecoveryView() + case AuthView.emailLink: + EmailLinkView() + case AuthView.updatePassword: + UpdatePasswordView() + case AuthView.mfaEnrollment: + MFAEnrolmentView() + case AuthView.mfaManagement: + MFAManagementView() + case AuthView.mfaResolution: + MFAResolutionView() + default: + EmptyView() + } + } + } + .interactiveDismissDisabled(interactiveDismissDisabled) + } + } + + @ViewBuilder + var authPickerViewInternal: some View { authMethodPicker - .background(Color(UIColor.secondarySystemBackground)) .safeAreaPadding() - .navigationTitle(authService.string.authPickerTitle) - .navigationBarTitleDisplayMode(.large) + .onChange(of: authService.authView) { oldValue, newValue in + debugPrint("Got here: \(newValue)") + } .errorAlert( error: Binding( get: { authService.currentError }, @@ -38,47 +83,63 @@ extension AuthPickerView: View { okButtonLabel: authService.string.okButtonLabel ) } - + @ViewBuilder var authMethodPicker: some View { GeometryReader { proxy in ScrollView { VStack(spacing: 24) { - if authService.authenticationState == .authenticated { - switch authService.authView { - case .mfaEnrollment: - MFAEnrolmentView() - case .mfaManagement: - MFAManagementView() - default: - SignedInView() - } - } else { - switch authService.authView { - case .passwordRecovery: - PasswordRecoveryView() - case .emailLink: - EmailLinkView() - case .mfaEnrollment: - MFAEnrolmentView() - case .mfaResolution: - MFAResolutionView() - case .authPicker: - if authService.emailSignInEnabled { - EmailAuthView() - } - otherSignInOptions(proxy) - PrivacyTOCsView(displayMode: .full) - default: - // TODO: - possibly refactor this, see: https://github.com/firebase/FirebaseUI-iOS/pull/1259#discussion_r2105473437 - EmptyView() - } + if authService.emailSignInEnabled { + EmailAuthView() } + otherSignInOptions(proxy) + PrivacyTOCsView(displayMode: .full) + footer() } } } } - + + // @ViewBuilder + // var authMethodPicker: some View { + // GeometryReader { proxy in + // ScrollView { + // VStack(spacing: 24) { + // if authService.authenticationState == .authenticated { + // switch authService.authView { + // case .mfaEnrollment: + // MFAEnrolmentView() + // case .mfaManagement: + // MFAManagementView() + // default: + // SignedInView() + // } + // } else { + // switch authService.authView { + // case .passwordRecovery: + // PasswordRecoveryView() + // case .emailLink: + // EmailLinkView() + // case .mfaEnrollment: + // MFAEnrolmentView() + // case .mfaResolution: + // MFAResolutionView() + // case .authPicker: + // if authService.emailSignInEnabled { + // EmailAuthView() + // } + // otherSignInOptions(proxy) + // PrivacyTOCsView(displayMode: .full) + // default: + // // TODO: - possibly refactor this, see: https://github.com/firebase/FirebaseUI-iOS/pull/1259#discussion_r2105473437 + // EmptyView() + // } + // } + // } + // } + // } + // } + @ViewBuilder func otherSignInOptions(_ proxy: GeometryProxy) -> some View { VStack { diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift index bd777f2341..dfbd2cec26 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift @@ -32,15 +32,15 @@ private enum FocusableField: Hashable { @MainActor public struct EmailAuthView { @Environment(AuthService.self) private var authService - + @State private var email = "" @State private var password = "" @State private var confirmPassword = "" - + @FocusState private var focus: FocusableField? - + public init() {} - + private var isValid: Bool { return if authService.authenticationFlow == .signIn { !email.isEmpty && !password.isEmpty @@ -48,11 +48,11 @@ public struct EmailAuthView { !email.isEmpty && !password.isEmpty && password == confirmPassword } } - + private func signInWithEmailPassword() async { try? await authService.signIn(email: email, password: password) } - + private func createUserWithEmailPassword() async { try? await authService.createUser(email: email, password: password) } @@ -93,16 +93,13 @@ extension EmailAuthView: View { .focused($focus, equals: .password) .accessibilityIdentifier("password-field") if authService.authenticationFlow == .signIn { - NavigationLink { - PasswordRecoveryView() - .environment(authService) - } label: { + NavigationLink(value: AuthView.passwordRecovery) { Text(authService.string.passwordButtonLabel) .frame(maxWidth: .infinity, alignment: .trailing) } .accessibilityIdentifier("password-recovery-button") } - + if authService.authenticationFlow == .signUp { AuthTextField( text: $confirmPassword, @@ -121,7 +118,7 @@ extension EmailAuthView: View { .focused($focus, equals: .confirmPassword) .accessibilityIdentifier("confirm-password-field") } - + Button(action: { Task { if authService.authenticationFlow == .signIn { @@ -134,9 +131,9 @@ extension EmailAuthView: View { if authService.authenticationState != .authenticating { Text( authService.authenticationFlow == .signIn - ? authService.string - .signInWithEmailButtonLabel - : authService.string.signUpWithEmailButtonLabel + ? authService.string + .signInWithEmailButtonLabel + : authService.string.signUpWithEmailButtonLabel ) .padding(.vertical, 8) .frame(maxWidth: .infinity) @@ -152,36 +149,36 @@ extension EmailAuthView: View { .frame(maxWidth: .infinity) .buttonStyle(.borderedProminent) .accessibilityIdentifier("sign-in-button") - Button(action: { - authService.authView = .emailLink - }) { + NavigationLink(value: AuthView.emailLink) { Text(authService.string.signUpWithEmailLinkButtonLabel) - }.accessibilityIdentifier("sign-in-with-email-link-button") + } + .accessibilityIdentifier("sign-in-with-email-link-button") } Divider() HStack { Text( authService .authenticationFlow == .signIn - ? authService.string.dontHaveAnAccountYetLabel - : authService.string.alreadyHaveAnAccountLabel + ? authService.string.dontHaveAnAccountYetLabel + : authService.string.alreadyHaveAnAccountLabel ) Button(action: { withAnimation { authService.authenticationFlow = - authService - .authenticationFlow == .signIn ? .signUp : .signIn + authService + .authenticationFlow == .signIn ? .signUp : .signIn } }) { Text( authService.authenticationFlow == .signUp - ? authService.string - .emailLoginFlowLabel - : authService.string.emailSignUpFlowLabel + ? authService.string + .emailLoginFlowLabel + : authService.string.emailSignUpFlowLabel ) .fontWeight(.semibold) .foregroundColor(.blue) - }.accessibilityIdentifier("switch-auth-flow") + } + .accessibilityIdentifier("switch-auth-flow") } } } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift index 87b761696d..d40f9cb2e4 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift @@ -15,14 +15,15 @@ import FirebaseAuth import FirebaseCore import SwiftUI +import FirebaseAuthUIComponents public struct EmailLinkView { @Environment(AuthService.self) private var authService @State private var email = "" @State private var showModal = false - + public init() {} - + private func sendEmailLink() async { do { try await authService.sendEmailSignInLink(email: email) @@ -35,37 +36,17 @@ public struct EmailLinkView { extension EmailLinkView: View { public var body: some View { - VStack { - HStack { - Button(action: { - authService.authView = .authPicker - }) { - HStack(spacing: 4) { - Image(systemName: "chevron.left") - .font(.system(size: 17, weight: .medium)) - Text(authService.string.backButtonLabel) - .font(.system(size: 17)) - } - .foregroundColor(.blue) + VStack(spacing: 24) { + AuthTextField( + text: $email, + localizedTitle: "Email", + prompt: authService.string.emailInputLabel, + keyboardType: .emailAddress, + contentType: .emailAddress, + leading: { + Image(systemName: "at") } - .accessibilityIdentifier("email-link-back-button") - - Spacer() - } - .padding(.horizontal) - .padding(.top, 8) - Text(authService.string.signInWithEmailLinkViewTitle) - .accessibilityIdentifier("email-link-title-text") - LabeledContent { - TextField(authService.string.emailInputLabel, text: $email) - .textInputAutocapitalization(.never) - .disableAutocorrection(true) - .submitLabel(.next) - } label: { - Image(systemName: "at") - }.padding(.vertical, 6) - .background(Divider(), alignment: .bottom) - .padding(.bottom, 4) + ) Button(action: { Task { await sendEmailLink() @@ -80,8 +61,10 @@ extension EmailLinkView: View { .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) .buttonStyle(.borderedProminent) - Spacer() } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + .navigationTitle(authService.string.signInWithEmailLinkViewTitle) + .safeAreaPadding() .sheet(isPresented: $showModal) { VStack { Text(authService.string.signInWithEmailLinkViewMessage) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift index b258e464f5..b8fd5f733c 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift @@ -14,15 +14,16 @@ import FirebaseCore import SwiftUI +import FirebaseAuthUIComponents public struct PasswordRecoveryView { @Environment(AuthService.self) private var authService @State private var email = "" @State private var showSuccessSheet = false @State private var sentEmail = "" - + public init() {} - + private func sendPasswordRecoveryEmail() async { do { try await authService.sendPasswordRecoveryEmail(email: email) @@ -36,45 +37,17 @@ public struct PasswordRecoveryView { extension PasswordRecoveryView: View { public var body: some View { - VStack { - HStack { - Button(action: { - authService.authView = .authPicker - }) { - HStack(spacing: 4) { - Image(systemName: "chevron.left") - .font(.system(size: 17, weight: .medium)) - Text(authService.string.backButtonLabel) - .font(.system(size: 17)) - } - .foregroundColor(.blue) + VStack(spacing: 24) { + AuthTextField( + text: $email, + localizedTitle: "Email", + prompt: authService.string.emailInputLabel, + keyboardType: .emailAddress, + contentType: .emailAddress, + leading: { + Image(systemName: "at") } - .accessibilityIdentifier("password-recovery-back-button") - - Spacer() - } - .padding(.horizontal) - .padding(.top, 8) - Text(authService.string.passwordRecoveryTitle) - .font(.largeTitle) - .fontWeight(.bold) - .padding() - .accessibilityIdentifier("password-recovery-text") - - Divider() - - LabeledContent { - TextField(authService.string.emailInputLabel, text: $email) - .textInputAutocapitalization(.never) - .disableAutocorrection(true) - .submitLabel(.next) - } label: { - Image(systemName: "at") - } - .padding(.vertical, 6) - .background(Divider(), alignment: .bottom) - .padding(.bottom, 4) - + ) Button(action: { Task { await sendPasswordRecoveryEmail() @@ -85,15 +58,17 @@ extension PasswordRecoveryView: View { .frame(maxWidth: .infinity) } .disabled(!CommonUtils.isValidEmail(email)) - .padding([.top, .bottom, .horizontal], 8) .frame(maxWidth: .infinity) .buttonStyle(.borderedProminent) } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + .navigationTitle(authService.string.passwordRecoveryTitle) + .safeAreaPadding() .sheet(isPresented: $showSuccessSheet) { successSheet } } - + @ViewBuilder @MainActor private var successSheet: some View { @@ -104,14 +79,14 @@ extension PasswordRecoveryView: View { .padding() Text(authService.string.passwordRecoveryHelperMessage) .padding() - + Divider() - + Text(String(format: authService.string.passwordRecoveryEmailSentMessage, sentEmail)) .padding() - + Divider() - + Button(authService.string.okButtonLabel) { showSuccessSheet = false email = "" diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePassword.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift similarity index 100% rename from FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePassword.swift rename to FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift index a5feba1be3..b493a6e3d5 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift @@ -31,11 +31,6 @@ import FirebaseOAuthSwiftUI import SwiftUI struct ContentView: View { - let authService: AuthService - // State for Facebook Limited Login toggle - @State private var useLimitedLogin = true - let facebookProvider: FacebookProviderSwift - init() { let actionCodeSettings = ActionCodeSettings() actionCodeSettings.handleCodeInApp = true @@ -49,12 +44,12 @@ struct ContentView: View { emailLinkSignInActionCodeSettings: actionCodeSettings, mfaEnabled: true ) - + // Create Facebook provider with Limited Login enabled by default let fbProvider = FacebookProviderSwift() fbProvider.setLimitedLogin(true) facebookProvider = fbProvider - + authService = AuthService( configuration: configuration ) @@ -68,12 +63,47 @@ struct ContentView: View { .withOAuthSignIn(OAuthProviderSwift.yahoo()) .withEmailSignIn() } - + + let authService: AuthService + let facebookProvider: FacebookProviderSwift + // State for Facebook Limited Login toggle + @State private var useLimitedLogin = true + @State private var isPresented = false + var body: some View { - NavigationStack { - VStack { - AuthPickerView() - + VStack { + AuthPickerView( + isPresented: $isPresented, + interactiveDismissDisabled: true + ) { + NavigationStack { + VStack { + if authService.authenticationState == .unauthenticated { + Text("Not Authenticated") + } else { + Text("Authenticated - \(authService.currentUser?.email ?? "")") + Button { + Task { + try? await authService.signOut() + } + } label: { + Text("Sign Out") + } + .buttonStyle(.borderedProminent) + } + } + .navigationTitle("Firebase UI Demo") + } + .onAppear { + isPresented = authService.authenticationState == .unauthenticated + } + .onChange(of: authService.authenticationState) { oldValue, newValue in + debugPrint("authService.authenticationState - \(newValue)") + if newValue != .authenticating { + isPresented = newValue == .unauthenticated + } + } + } footer: { // Facebook Limited Login Control (Example) GroupBox { VStack(alignment: .leading, spacing: 8) { @@ -85,15 +115,16 @@ struct ContentView: View { handleLimitedLoginToggle(newValue) } - Text("Limited Login protects privacy by preventing Facebook tracking across apps.") + Text("Limited Login protects privacy by preventing Facebook tracking across apps.\nNOTE: THIS IS NOT PART OF THE SDK") .font(.caption) .foregroundColor(.secondary) } + .padding() } - .padding() } .environment(authService) } + } private func handleLimitedLoginToggle(_ limitedLogin: Bool) { @@ -118,3 +149,27 @@ struct ContentView: View { } } } + +extension UIApplication { + static func topViewController( + base: UIViewController? = UIApplication.shared.connectedScenes + .compactMap { ($0 as? UIWindowScene)?.keyWindow } + .first?.rootViewController + ) -> UIViewController? { + if let nav = base as? UINavigationController { + return topViewController(base: nav.visibleViewController) + } else if let tab = base as? UITabBarController { + return topViewController(base: tab.selectedViewController) + } else if let presented = base?.presentedViewController { + return topViewController(base: presented) + } + return base + } +} + +extension View { + func hostingController() -> UIViewController { + let controller = UIHostingController(rootView: self) + return controller + } +} From 4f997f9b9d86a749f07e5cda37a65cad55d85f25 Mon Sep 17 00:00:00 2001 From: Ademola Fadumo Date: Wed, 29 Oct 2025 13:14:55 +0100 Subject: [PATCH 06/38] refactor: phone auth view and use navigation path instead --- .../Views/Email/EmailResetPasswordView.swift | 103 ------- .../Views/Email/EmailSignInView.swift | 108 ------- .../Views/Email/EmailSignUpView.swift | 104 ------- .../Views/FirebaseAuthView.swift | 45 --- .../Views/FirebaseAuthViewInternal.swift | 277 ------------------ .../Views/Phone/EnterPhoneNumberView.swift | 88 ------ .../Phone/EnterVerificationCodeView.swift | 104 ------- .../Sources/Services/AuthService.swift | 35 ++- .../Sources/Strings/Localizable.xcstrings | 51 ---- .../Sources/Utils/PhoneUtils.swift | 0 .../Sources/Utils/StringUtils.swift | 49 ++++ .../Sources/Views/AuthPickerView.swift | 11 +- .../Sources/Views/EmailAuthView.swift | 8 +- .../Sources/Views/EnterPhoneNumberView.swift | 113 +++++++ .../Views/EnterVerificationCodeView.swift | 130 ++++++++ .../Sources/Views/MFAEnrolmentView.swift | 4 +- .../Sources/Views/MFAManagementView.swift | 6 +- .../Sources/Views/MFAResolutionView.swift | 4 +- .../Sources/Views/PasswordRecoveryView.swift | 2 +- .../Sources/Views/SignedInView.swift | 74 +++-- .../Sources/Views/UpdatePasswordView.swift | 20 +- .../Services/PhoneAuthProviderAuthUI.swift | 40 +-- .../Sources/Views/PhoneAuthButtonView.swift | 6 +- .../Sources/Views/PhoneAuthView.swift | 185 ------------ .../App/ContentViewSheetExample.swift | 81 ----- 25 files changed, 407 insertions(+), 1241 deletions(-) delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailResetPasswordView.swift delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignInView.swift delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignUpView.swift delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthView.swift delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthViewInternal.swift delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterPhoneNumberView.swift delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterVerificationCodeView.swift rename FirebaseSwiftUI/{FirebasePhoneAuthSwiftUI => FirebaseAuthSwiftUI}/Sources/Utils/PhoneUtils.swift (100%) create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterPhoneNumberView.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterVerificationCodeView.swift delete mode 100644 FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthView.swift delete mode 100644 samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentViewSheetExample.swift diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailResetPasswordView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailResetPasswordView.swift deleted file mode 100644 index 8f9d94e6fa..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailResetPasswordView.swift +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI -import FirebaseAuthUIComponents - -struct EmailResetPasswordView: View { - let state: EmailAuthContentState - - var body: some View { - VStack(spacing: 32) { - VStack(spacing: 16) { - if state.resetLinkSent { - VStack(spacing: 12) { - Image(systemName: "checkmark.circle.fill") - .font(.system(size: 48)) - .foregroundStyle(.green) - - Text("Password reset link sent!") - .font(.headline) - - Text("Check your email at \(state.email.wrappedValue) for a link to reset your password.") - .font(.subheadline) - .foregroundStyle(.secondary) - .multilineTextAlignment(.center) - } - .padding() - } else { - VStack(spacing: 16) { - Text("Enter your email address and we'll send you a link to reset your password.") - .font(.subheadline) - .foregroundStyle(.secondary) - .multilineTextAlignment(.center) - - AuthTextField( - text: state.email, - localizedTitle: "Email", - prompt: "Enter your email", - keyboardType: .emailAddress, - contentType: .emailAddress - ) - - Button { - state.onSendResetLinkClick() - } label: { - if state.isLoading { - ProgressView() - .frame(height: 32) - .frame(maxWidth: .infinity) - } else { - Text("Send Reset Link") - .frame(height: 32) - .frame(maxWidth: .infinity) - } - } - .buttonStyle(.borderedProminent) - .disabled(state.isLoading) - - if let error = state.error { - Text(error) - .foregroundStyle(.red) - .font(.caption) - } - } - } - } - } - .navigationTitle("Reset Password") - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) - } -} - -#Preview { - NavigationStack { - EmailResetPasswordView(state: EmailAuthContentState( - isLoading: false, - error: nil, - email: .constant(""), - password: .constant(""), - confirmPassword: .constant(""), - displayName: .constant(""), - resetLinkSent: false, - onSignInClick: {}, - onSignUpClick: {}, - onSendResetLinkClick: {}, - onGoToSignUp: {}, - onGoToSignIn: {}, - onGoToResetPassword: {} - )) - .safeAreaPadding() - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignInView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignInView.swift deleted file mode 100644 index 9ca13c839d..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignInView.swift +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI -import FirebaseAuthSwiftUI -import FirebaseAuthUIComponents - -struct EmailSignInView: View { - let authService: AuthService - let state: EmailAuthContentState - - var body: some View { - VStack(spacing: 32) { - VStack(spacing: 16) { - Group { - AuthTextField( - text: state.email, - localizedTitle: "Email", - prompt: "Enter your email", - keyboardType: .emailAddress, - contentType: .emailAddress - ) - AuthTextField( - text: state.password, - localizedTitle: "Password", - prompt: "Enter your password", - contentType: .password, - sensitive: true - ) - } - - Button { - state.onGoToResetPassword() - } label: { - Text("Forgot password?") - .frame(maxWidth: .infinity, alignment: .trailing) - } - - Button { - state.onSignInClick() - } label: { - if state.isLoading { - ProgressView() - .frame(height: 32) - .frame(maxWidth: .infinity) - } else { - Text("Sign in") - .frame(height: 32) - .frame(maxWidth: .infinity) - } - } - .buttonStyle(.borderedProminent) - .disabled(state.isLoading) - - if let error = state.error { - Text(error) - .foregroundStyle(.red) - .font(.caption) - } - } - - Button { - state.onGoToSignUp() - } label: { - Text("Create an Account") - .frame(maxWidth: .infinity) - } - .disabled(state.isLoading) - } - .navigationTitle("Sign in with email") - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) - } -} - -#Preview { - NavigationStack { - EmailSignInView( - authService: AuthService(), - state: EmailAuthContentState( - isLoading: false, - error: nil, - email: .constant(""), - password: .constant(""), - confirmPassword: .constant(""), - displayName: .constant(""), - resetLinkSent: false, - onSignInClick: {}, - onSignUpClick: {}, - onSendResetLinkClick: {}, - onGoToSignUp: {}, - onGoToSignIn: {}, - onGoToResetPassword: {} - ) - ) - .safeAreaPadding() - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignUpView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignUpView.swift deleted file mode 100644 index 2fed2c6350..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Email/EmailSignUpView.swift +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI -import FirebaseAuthUIComponents - -struct EmailSignUpView: View { - let state: EmailAuthContentState - - var body: some View { - VStack(spacing: 32) { - VStack(spacing: 16) { - Group { - AuthTextField( - text: state.displayName, - localizedTitle: "Display Name", - prompt: "Enter your name", - contentType: .name - ) - - AuthTextField( - text: state.email, - localizedTitle: "Email", - prompt: "Enter your email", - keyboardType: .emailAddress, - contentType: .emailAddress - ) - - AuthTextField( - text: state.password, - localizedTitle: "Password", - prompt: "Enter your password", - contentType: .newPassword, - sensitive: true - ) - - AuthTextField( - text: state.confirmPassword, - localizedTitle: "Confirm Password", - prompt: "Re-enter your password", - contentType: .newPassword, - sensitive: true - ) - } - - Button { - state.onSignUpClick() - } label: { - if state.isLoading { - ProgressView() - .frame(height: 32) - .frame(maxWidth: .infinity) - } else { - Text("Create Account") - .frame(height: 32) - .frame(maxWidth: .infinity) - } - } - .buttonStyle(.borderedProminent) - .disabled(state.isLoading) - - if let error = state.error { - Text(error) - .foregroundStyle(.red) - .font(.caption) - } - } - } - .navigationTitle("Create an account") - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) - } -} - -#Preview { - NavigationStack { - EmailSignUpView(state: EmailAuthContentState( - isLoading: false, - error: nil, - email: .constant(""), - password: .constant(""), - confirmPassword: .constant(""), - displayName: .constant(""), - resetLinkSent: false, - onSignInClick: {}, - onSignUpClick: {}, - onSendResetLinkClick: {}, - onGoToSignUp: {}, - onGoToSignIn: {}, - onGoToResetPassword: {} - )) - .safeAreaPadding() - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthView.swift deleted file mode 100644 index 2c353095b2..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthView.swift +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI - -public struct FirebaseAuthView: View { - public init( - authService: AuthService, - isPresented: Binding = .constant(false), - interactiveDismissDisabled: Bool = true, - @ViewBuilder content: @escaping () -> Content = { EmptyView() } - ) { - self.authService = authService - self.isPresented = isPresented - self.interactiveDismissDisabled = interactiveDismissDisabled - self.content = content - } - - private var authService: AuthService - private var isPresented: Binding - private var interactiveDismissDisabled: Bool - private let content: () -> Content? - - - public var body: some View { - content() - .sheet(isPresented: isPresented) { - FirebaseAuthViewInternal( - authService: authService, - interactiveDismissDisabled: interactiveDismissDisabled - ) - } - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthViewInternal.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthViewInternal.swift deleted file mode 100644 index b1c0ee153e..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/FirebaseAuthViewInternal.swift +++ /dev/null @@ -1,277 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI -import FirebaseAuthUIComponents - -struct StringError: LocalizedError { - let message: String - - var errorDescription: String? { message } -} - -enum Route: Hashable { - case emailAuth(EmailAuthMode) - case phoneAuth(PhoneAuthStep) - - @ViewBuilder - @MainActor - func destination( - authService: AuthService, - emailAuthState: EmailAuthContentState, - phoneAuthState: PhoneAuthContentState - ) -> some View { - switch self { - case .emailAuth(let mode): - switch mode { - case .signIn: - EmailSignInView( - authService: authService, - state: emailAuthState - ) - .safeAreaPadding() - case .signUp: - EmailSignUpView(state: emailAuthState) - .safeAreaPadding() - case .resetPassword: - EmailResetPasswordView(state: emailAuthState) - .safeAreaPadding() - } - case .phoneAuth(let step): - switch step { - case .enterPhoneNumber: - EnterPhoneNumberView(state: phoneAuthState) - .safeAreaPadding() - case .enterVerificationCode: - EnterVerificationCodeView(state: phoneAuthState) - .safeAreaPadding() - } - } - } -} - -enum EmailAuthMode { - case signIn - case signUp - case resetPassword -} - -enum PhoneAuthStep { - case enterPhoneNumber - case enterVerificationCode -} - -struct EmailAuthContentState { - var isLoading: Bool - var error: String? - var email: Binding - var password: Binding - var confirmPassword: Binding - var displayName: Binding - var resetLinkSent: Bool - var onSignInClick: () -> Void - var onSignUpClick: () -> Void - var onSendResetLinkClick: () -> Void - var onGoToSignUp: () -> Void - var onGoToSignIn: () -> Void - var onGoToResetPassword: () -> Void -} - -struct PhoneAuthContentState { - var isLoading: Bool - var error: String? - var phoneNumber: Binding - var selectedCountry: Binding - var verificationCode: Binding - var fullPhoneNumber: String - var resendTimer: Int - var onSendCodeClick: () -> Void - var onVerifyCodeClick: () -> Void - var onResendCodeClick: () -> Void - var onChangeNumberClick: () -> Void -} - -@Observable -class Navigator { - var routes: [Route] = [] - - func push(_ route: Route) { - routes.append(route) - } - - @discardableResult - func pop() -> Route? { - routes.popLast() - } -} - -struct FirebaseAuthViewInternal: View { - init( - authService: AuthService, - interactiveDismissDisabled: Bool = true - ) { - self.authService = authService - self.interactiveDismissDisabled = interactiveDismissDisabled - } - - private var authService: AuthService - private var interactiveDismissDisabled: Bool - @State private var navigator = Navigator() - - // Email Auth State - @State private var email = "" - @State private var password = "" - @State private var confirmPassword = "" - @State private var displayName = "" - @State private var emailError: String? - @State private var resetLinkSent = false - - // Phone Auth State - @State private var phoneNumber = "" - @State private var verificationCode = "" - @State private var selectedCountry: CountryData = .default - @State private var phoneIsLoading = false - @State private var phoneError: String? - @State private var resendTimer = 0 - - @State private var isShowingErrorAlert = false - - var body: some View { - NavigationStack(path: $navigator.routes) { - authMethodPicker - .navigationTitle("Authentication") - .navigationBarTitleDisplayMode(.large) - .navigationDestination(for: Route.self) { route in - route.destination( - authService: authService, - emailAuthState: createEmailAuthState(), - phoneAuthState: createPhoneAuthState() - ) - } - } - .alert( - isPresented: $isShowingErrorAlert, - error: StringError(message: authService.currentError?.message ?? "") - ) { - Button("OK") { - isShowingErrorAlert = false - } - } - .onChange(of: authService.currentError?.message ?? "") { _, newValue in - debugPrint("onChange: \(newValue)") - isShowingErrorAlert = !newValue.isEmpty - } - .interactiveDismissDisabled(interactiveDismissDisabled) - } - - @ViewBuilder - var authMethodPicker: some View { - VStack { - } - .padding(.top, 24) - .frame(maxWidth: .infinity, maxHeight: .infinity) - } - - // MARK: - State Creation - - private func createEmailAuthState() -> EmailAuthContentState { - EmailAuthContentState( - isLoading: authService.authenticationState == .authenticating, - error: emailError, - email: $email, - password: $password, - confirmPassword: $confirmPassword, - displayName: $displayName, - resetLinkSent: resetLinkSent, - onSignInClick: handleEmailSignIn, - onSignUpClick: handleEmailSignUp, - onSendResetLinkClick: handleSendResetLink, - onGoToSignUp: { - handleEmailAuthNavigation(route: .emailAuth(.signUp)) - }, - onGoToSignIn: { - handleEmailAuthNavigation(route: .emailAuth(.signIn)) - }, - onGoToResetPassword: { - handleEmailAuthNavigation(route: .emailAuth(.resetPassword)) - } - ) - } - - private func createPhoneAuthState() -> PhoneAuthContentState { - PhoneAuthContentState( - isLoading: authService.authenticationState == .authenticating, - error: phoneError, - phoneNumber: $phoneNumber, - selectedCountry: $selectedCountry, - verificationCode: $verificationCode, - fullPhoneNumber: "\(selectedCountry.dialCode)\(phoneNumber)", - resendTimer: resendTimer, - onSendCodeClick: handleSendCode, - onVerifyCodeClick: handleVerifyCode, - onResendCodeClick: handleResendCode, - onChangeNumberClick: { - verificationCode = "" - navigator.pop() - } - ) - } - - // MARK: - Email Auth Handlers - - private func handleEmailAuthNavigation(route: Route) { - email = "" - password = "" - confirmPassword = "" - displayName = "" - navigator.push(route) - } - - private func handleEmailSignIn() { - Task { - try? await authService.signIn(email: email, password: password) - } - } - - private func handleEmailSignUp() { - Task { - try? await authService.createUser(email: email, password: password) - } - } - - private func handleSendResetLink() { - Task { - try? await authService.sendPasswordRecoveryEmail(email: email) - } - } - - // MARK: - Phone Auth Handlers - - private func handleSendCode() { - // TODO: Implement send code logic - navigator.push(.phoneAuth(.enterVerificationCode)) - } - - private func handleVerifyCode() { - // TODO: Implement verify code logic - } - - private func handleResendCode() { - // TODO: Implement resend code logic - } -} - -#Preview { - FirebaseAuthViewInternal(authService: AuthService()) -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterPhoneNumberView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterPhoneNumberView.swift deleted file mode 100644 index 2e840e5de6..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterPhoneNumberView.swift +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI -import FirebaseAuthUIComponents - -struct EnterPhoneNumberView: View { - let state: PhoneAuthContentState - - var body: some View { - VStack(spacing: 16) { - Text("Enter your phone number to get started") - .font(.subheadline) - .foregroundStyle(.secondary) - .multilineTextAlignment(.center) - .frame(maxWidth: .infinity, alignment: .leading) - - // Phone number input with country selector - AuthTextField( - text: state.phoneNumber, - localizedTitle: "Phone Number", - prompt: "Enter your phone number", - keyboardType: .phonePad, - contentType: .telephoneNumber, - onChange: { _ in } - ) { - CountrySelector( - selectedCountry: state.selectedCountry, - enabled: !state.isLoading - ) - } - - Button { - state.onSendCodeClick() - } label: { - if state.isLoading { - ProgressView() - .frame(height: 32) - .frame(maxWidth: .infinity) - } else { - Text("Send Code") - .frame(height: 32) - .frame(maxWidth: .infinity) - } - } - .buttonStyle(.borderedProminent) - .disabled(state.isLoading || state.phoneNumber.wrappedValue.isEmpty) - - if let error = state.error { - Text(error) - .foregroundStyle(.red) - .font(.caption) - } - } - .navigationTitle("Sign in with phone") - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) - } -} - -#Preview { - NavigationStack { - EnterPhoneNumberView(state: PhoneAuthContentState( - isLoading: false, - error: nil, - phoneNumber: .constant(""), - selectedCountry: .constant(.default), - verificationCode: .constant(""), - fullPhoneNumber: "+1 ", - resendTimer: 0, - onSendCodeClick: {}, - onVerifyCodeClick: {}, - onResendCodeClick: {}, - onChangeNumberClick: {} - )) - .safeAreaPadding() - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterVerificationCodeView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterVerificationCodeView.swift deleted file mode 100644 index 9149a72efd..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/FirebaseAuthView/Views/Phone/EnterVerificationCodeView.swift +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import SwiftUI -import FirebaseAuthUIComponents - -struct EnterVerificationCodeView: View { - let state: PhoneAuthContentState - - var body: some View { - VStack(spacing: 32) { - VStack(spacing: 16) { - VStack(spacing: 8) { - Text("We sent a code to \(state.fullPhoneNumber)") - .font(.subheadline) - .foregroundStyle(.secondary) - .multilineTextAlignment(.center) - .frame(maxWidth: .infinity, alignment: .leading) - Button { - state.onChangeNumberClick() - } label: { - Text("Change number") - .font(.caption) - .frame(maxWidth: .infinity, alignment: .leading) - } - } - .padding(.bottom) - .frame(maxWidth: .infinity, alignment: .leading) - - // Verification code input - VerificationCodeInputField( - code: state.verificationCode, - isError: state.error != nil, - errorMessage: state.error - ) - - Button { - state.onVerifyCodeClick() - } label: { - if state.isLoading { - ProgressView() - .frame(height: 32) - .frame(maxWidth: .infinity) - } else { - Text("Verify Code") - .frame(height: 32) - .frame(maxWidth: .infinity) - } - } - .buttonStyle(.borderedProminent) - .disabled(state.isLoading || state.verificationCode.wrappedValue.count != 6) - } - - // Resend code section - VStack(spacing: 8) { - if state.resendTimer > 0 { - Text("Resend code in \(state.resendTimer)s") - .font(.caption) - .foregroundStyle(.secondary) - } else { - Button { - state.onResendCodeClick() - } label: { - Text("Resend Code") - .font(.caption) - } - .disabled(state.isLoading) - } - } - } - .navigationTitle("Verify Phone Number") - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) - } -} - -#Preview { - NavigationStack { - EnterVerificationCodeView(state: PhoneAuthContentState( - isLoading: false, - error: nil, - phoneNumber: .constant(""), - selectedCountry: .constant(.default), - verificationCode: .constant(""), - fullPhoneNumber: "+1 5551234567", - resendTimer: 0, - onSendCodeClick: {}, - onVerifyCodeClick: {}, - onResendCodeClick: {}, - onChangeNumberClick: {} - )) - .safeAreaPadding() - } -} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift index 4c124a695c..25390b43bc 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift @@ -31,6 +31,7 @@ public protocol DeleteUserSwift { public protocol PhoneAuthProviderSwift: AuthProviderSwift { @MainActor func verifyPhoneNumber(phoneNumber: String) async throws -> String + func setVerificationCode(verificationID: String, code: String) } public enum AuthenticationState { @@ -44,14 +45,15 @@ public enum AuthenticationFlow { case signUp } -public enum AuthView { - case authPicker +public enum AuthView: Hashable { case passwordRecovery case emailLink case updatePassword case mfaEnrollment case mfaManagement case mfaResolution + case enterPhoneNumber + case enterVerificationCode(verificationID: String, fullPhoneNumber: String) } public enum SignInOutcome: @unchecked Sendable { @@ -85,6 +87,24 @@ private final class AuthListenerManager { } } +@Observable +public class Navigator { + var routes: [AuthView] = [] + + public func push(_ route: AuthView) { + routes.append(route) + } + + @discardableResult + public func pop() -> AuthView? { + routes.popLast() + } + + public func clear() { + routes.removeAll() + } +} + @MainActor @Observable public final class AuthService { @@ -98,7 +118,10 @@ public final class AuthService { @ObservationIgnored @AppStorage("email-link") public var emailLink: String? public let configuration: AuthConfiguration public let auth: Auth - public var authView: AuthView = .authPicker + public private(set) var navigator = Navigator() + public var authViewRoutes: [AuthView] { + navigator.routes + } public let string: StringUtils public var currentUser: User? public var authenticationState: AuthenticationState = .unauthenticated @@ -117,6 +140,10 @@ public final class AuthService { var emailSignInEnabled = false private var providers: [AuthProviderUI] = [] + + public var currentPhoneProvider: PhoneAuthProviderSwift? { + providers.compactMap { $0.provider as? PhoneAuthProviderSwift }.first + } public func registerProvider(providerWithButton: AuthProviderUI) { providers.append(providerWithButton) } @@ -794,7 +821,7 @@ public extension AuthService { let hints = extractMFAHints(from: resolver) currentMFARequired = MFARequired(hints: hints) currentMFAResolver = resolver - authView = .mfaResolution + navigator.push(.mfaResolution) return .mfaRequired(MFARequired(hints: hints)) } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings index 1e5bfa38c5..63c9a8352c 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings @@ -177,9 +177,6 @@ }, "as:" : { - }, - "Authentication" : { - }, "Authentication Method" : { @@ -240,9 +237,6 @@ }, "Change number" : { - }, - "Check your email at %@ for a link to reset your password." : { - }, "Choose Authentication Method" : { @@ -309,15 +303,6 @@ }, "Copied to clipboard!" : { - }, - "Create Account" : { - - }, - "Create an account" : { - - }, - "Create an Account" : { - }, "Delete" : { "comment" : "Text of Delete action button.", @@ -517,15 +502,9 @@ }, "Enter Verification Code" : { - }, - "Enter your email address and we'll send you a link to reset your password." : { - }, "Enter Your Phone Number" : { - }, - "Enter your phone number to get started" : { - }, "EnterYourEmail" : { "comment" : "Title for email entry screen, email text field placeholder. Use short/abbreviated translation for 'email' which is less than 15 chars.", @@ -586,9 +565,6 @@ } } } - }, - "Forgot password?" : { - }, "ForgotPassword" : { "comment" : "Button text for 'Forgot Password' action.", @@ -710,9 +686,6 @@ } } } - }, - "Password reset link sent!" : { - }, "PasswordRecoveryEmailSentMessage" : { "comment" : "Message displayed when the email for password recovery has been sent.", @@ -938,12 +911,6 @@ }, "Resend Code" : { - }, - "Resend code in %llds" : { - - }, - "Reset Password" : { - }, "Save" : { "comment" : "Save button title.", @@ -977,9 +944,6 @@ }, "Send Code" : { - }, - "Send Reset Link" : { - }, "SendEmailSignInLinkButtonLabel" : { "comment" : "Button label for sending email sign-in link", @@ -998,15 +962,6 @@ }, "Set up two-factor authentication to add an extra layer of security to your account." : { - }, - "Sign in" : { - - }, - "Sign in with email" : { - - }, - "Sign in with phone" : { - }, "Sign up" : { @@ -1285,9 +1240,6 @@ }, "Verification Code" : { - }, - "Verify Code" : { - }, "Verify email address?" : { "comment" : "Label for sending email verification to user.", @@ -1299,9 +1251,6 @@ } } } - }, - "Verify Phone Number" : { - }, "VerifyItsYou" : { "comment" : "Alert message title show for re-authorization.", diff --git a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Utils/PhoneUtils.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/PhoneUtils.swift similarity index 100% rename from FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Utils/PhoneUtils.swift rename to FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/PhoneUtils.swift diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/StringUtils.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/StringUtils.swift index f303855096..4a8079a689 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/StringUtils.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/StringUtils.swift @@ -323,6 +323,55 @@ public class StringUtils { return localizedString(for: "Enter phone number") } + /// Phone provider + /// found in: + /// - PhoneAuthView + public var phoneSignInTitle: String { + return localizedString(for: "Sign in with Phone") + } + + /// Phone provider + /// found in: + /// - PhoneAuthView + public var enterPhoneNumberPlaceholder: String { + return localizedString(for: "Enter phone number") + } + + /// Phone provider + /// found in: + /// - PhoneAuthView + public var sendCodeButtonLabel: String { + return localizedString(for: "Send Code") + } + + /// Phone provider + /// found in: + /// - PhoneAuthView + public var processingLabel: String { + return localizedString(for: "Processing...") + } + + /// Phone provider + /// found in: + /// - PhoneAuthView + public var enterVerificationCodeTitle: String { + return localizedString(for: "Enter Verification Code") + } + + /// Phone provider + /// found in: + /// - PhoneAuthView + public var verificationCodePlaceholder: String { + return localizedString(for: "Verification Code") + } + + /// Phone provider + /// found in: + /// - PhoneAuthView + public var verifyAndSignInButtonLabel: String { + return localizedString(for: "Verify and Sign In") + } + /// Phone provider /// found in: /// - PhoneAuthButtonView diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift index 59eeaff6bc..0b7b2b3804 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift @@ -41,7 +41,8 @@ extension AuthPickerView: View { public var body: some View { content() .sheet(isPresented: isPresented) { - NavigationStack { + @Bindable var navigator = authService.navigator + NavigationStack(path: $navigator.routes) { authPickerViewInternal .navigationTitle(authService.string.authPickerTitle) .navigationBarTitleDisplayMode(.large) @@ -59,6 +60,12 @@ extension AuthPickerView: View { MFAManagementView() case AuthView.mfaResolution: MFAResolutionView() + case AuthView.enterPhoneNumber: + if let phoneProvider = authService.currentPhoneProvider { + EnterPhoneNumberView(phoneProvider: phoneProvider) + } else { + EmptyView() + } default: EmptyView() } @@ -72,7 +79,7 @@ extension AuthPickerView: View { var authPickerViewInternal: some View { authMethodPicker .safeAreaPadding() - .onChange(of: authService.authView) { oldValue, newValue in + .onChange(of: authService.authViewRoutes) { oldValue, newValue in debugPrint("Got here: \(newValue)") } .errorAlert( diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift index dfbd2cec26..b756e059f3 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift @@ -93,7 +93,9 @@ extension EmailAuthView: View { .focused($focus, equals: .password) .accessibilityIdentifier("password-field") if authService.authenticationFlow == .signIn { - NavigationLink(value: AuthView.passwordRecovery) { + Button { + authService.navigator.push(.passwordRecovery) + } label: { Text(authService.string.passwordButtonLabel) .frame(maxWidth: .infinity, alignment: .trailing) } @@ -149,7 +151,9 @@ extension EmailAuthView: View { .frame(maxWidth: .infinity) .buttonStyle(.borderedProminent) .accessibilityIdentifier("sign-in-button") - NavigationLink(value: AuthView.emailLink) { + Button { + authService.navigator.push(.emailLink) + } label: { Text(authService.string.signUpWithEmailLinkButtonLabel) } .accessibilityIdentifier("sign-in-with-email-link-button") diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterPhoneNumberView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterPhoneNumberView.swift new file mode 100644 index 0000000000..10e9827fe5 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterPhoneNumberView.swift @@ -0,0 +1,113 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FirebaseAuth +import FirebaseAuthUIComponents +import FirebaseCore +import SwiftUI + +@MainActor +struct EnterPhoneNumberView: View { + @Environment(AuthService.self) private var authService + @State private var phoneNumber: String = "" + @State private var selectedCountry: CountryData = .default + @State private var currentError: AlertError? = nil + @State private var isProcessing: Bool = false + + let phoneProvider: PhoneAuthProviderSwift + + var body: some View { + VStack(spacing: 16) { + Text(authService.string.enterPhoneNumberPlaceholder) + .font(.subheadline) + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.top) + + AuthTextField( + text: $phoneNumber, + localizedTitle: "Phone", + prompt: authService.string.enterPhoneNumberPlaceholder, + keyboardType: .phonePad, + contentType: .telephoneNumber, + onChange: { _ in } + ) { + CountrySelector( + selectedCountry: $selectedCountry, + enabled: !isProcessing + ) + } + + Button(action: { + Task { + isProcessing = true + do { + let fullPhoneNumber = selectedCountry.dialCode + phoneNumber + let id = try await phoneProvider.verifyPhoneNumber(phoneNumber: fullPhoneNumber) + authService.navigator.push(.enterVerificationCode( + verificationID: id, + fullPhoneNumber: fullPhoneNumber + )) + currentError = nil + } catch { + currentError = AlertError(message: error.localizedDescription) + } + isProcessing = false + } + }) { + if isProcessing { + ProgressView() + .frame(height: 32) + .frame(maxWidth: .infinity) + } else { + Text(authService.string.sendCodeButtonLabel) + .frame(height: 32) + .frame(maxWidth: .infinity) + } + } + .buttonStyle(.borderedProminent) + .disabled(isProcessing || phoneNumber.isEmpty) + .padding(.top, 8) + + Spacer() + } + .navigationTitle(authService.string.phoneSignInTitle) + .padding(.horizontal) + .errorAlert(error: $currentError, okButtonLabel: authService.string.okButtonLabel) + } +} + +#Preview { + FirebaseOptions.dummyConfigurationForPreview() + + class MockPhoneProvider: PhoneAuthProviderSwift { + var id: String = "phone" + + func verifyPhoneNumber(phoneNumber: String) async throws -> String { + return "mock-verification-id" + } + + func setVerificationCode(verificationID: String, code: String) { + // Mock implementation + } + + func createAuthCredential() async throws -> AuthCredential { + fatalError("Not implemented in preview") + } + } + + return EnterPhoneNumberView(phoneProvider: MockPhoneProvider()) + .environment(AuthService()) +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterVerificationCodeView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterVerificationCodeView.swift new file mode 100644 index 0000000000..54e0c5f6eb --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterVerificationCodeView.swift @@ -0,0 +1,130 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import FirebaseAuth +import FirebaseAuthUIComponents +import FirebaseCore +import SwiftUI + +@MainActor +struct EnterVerificationCodeView: View { + @Environment(AuthService.self) private var authService + @Environment(\.dismiss) private var dismiss + @State private var verificationCode: String = "" + @State private var currentError: AlertError? = nil + @State private var isProcessing: Bool = false + + let verificationID: String + let fullPhoneNumber: String + let phoneProvider: PhoneAuthProviderSwift + let phoneNumber: String + let selectedCountry: CountryData + let onChangeNumber: () -> Void + + var body: some View { + VStack(spacing: 32) { + VStack(spacing: 16) { + VStack(spacing: 8) { + Text("We sent a code to \(fullPhoneNumber)") + .font(.subheadline) + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + .frame(maxWidth: .infinity, alignment: .leading) + + Button { + onChangeNumber() + } label: { + Text("Change number") + .font(.caption) + .frame(maxWidth: .infinity, alignment: .leading) + } + } + .padding(.bottom) + .frame(maxWidth: .infinity, alignment: .leading) + + VerificationCodeInputField( + code: $verificationCode, + isError: currentError != nil, + errorMessage: currentError?.message + ) + + Button(action: { + Task { + isProcessing = true + do { + phoneProvider.setVerificationCode(verificationID: verificationID, code: verificationCode) + let credential = try await phoneProvider.createAuthCredential() + + _ = try await authService.signIn(credentials: credential) + dismiss() + } catch { + currentError = AlertError(message: error.localizedDescription) + isProcessing = false + } + } + }) { + if isProcessing { + ProgressView() + .frame(height: 32) + .frame(maxWidth: .infinity) + } else { + Text(authService.string.verifyAndSignInButtonLabel) + .frame(height: 32) + .frame(maxWidth: .infinity) + } + } + .buttonStyle(.borderedProminent) + .disabled(isProcessing || verificationCode.count != 6) + } + + Spacer() + } + .navigationTitle(authService.string.enterVerificationCodeTitle) + .navigationBarTitleDisplayMode(.inline) + .padding(.horizontal) + .errorAlert(error: $currentError, okButtonLabel: authService.string.okButtonLabel) + } +} + +#Preview { + FirebaseOptions.dummyConfigurationForPreview() + + class MockPhoneProvider: PhoneAuthProviderSwift { + var id: String = "phone" + + func verifyPhoneNumber(phoneNumber: String) async throws -> String { + return "mock-verification-id" + } + + func setVerificationCode(verificationID: String, code: String) { + // Mock implementation + } + + func createAuthCredential() async throws -> AuthCredential { + fatalError("Not implemented in preview") + } + } + + return NavigationStack { + EnterVerificationCodeView( + verificationID: "mock-id", + fullPhoneNumber: "+1 5551234567", + phoneProvider: MockPhoneProvider(), + phoneNumber: "5551234567", + selectedCountry: .default, + onChangeNumber: {} + ) + .environment(AuthService()) + } +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift index 0f54756425..872d9cb92b 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift @@ -132,7 +132,7 @@ public struct MFAEnrolmentView { // Reset form state on success resetForm() - authService.authView = .authPicker + authService.navigator.clear() } } @@ -147,7 +147,7 @@ public struct MFAEnrolmentView { private func cancelEnrollment() { resetForm() - authService.authView = .authPicker + authService.navigator.clear() } private func copyToClipboard(_ text: String) { diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift index ab3cc74b94..f2d6f4c5c8 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift @@ -56,11 +56,11 @@ public struct MFAManagementView { } private func navigateToEnrollment() { - authService.authView = .mfaEnrollment + authService.navigator.push(.mfaEnrollment) } private func goBack() { - authService.authView = .authPicker + authService.navigator.clear() } } @@ -70,7 +70,7 @@ extension MFAManagementView: View { // Header with manual back button HStack { Button(action: { - authService.authView = .authPicker + authService.navigator.clear() }) { HStack(spacing: 4) { Image(systemName: "chevron.left") diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAResolutionView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAResolutionView.swift index 800a7c5131..a5efb32640 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAResolutionView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAResolutionView.swift @@ -90,7 +90,7 @@ public struct MFAResolutionView { ) // On success, the AuthService will update the authentication state // and we should navigate back to the main app - authService.authView = .authPicker + authService.navigator.clear() isLoading = false } catch { isLoading = false @@ -99,7 +99,7 @@ public struct MFAResolutionView { } private func cancelResolution() { - authService.authView = .authPicker + authService.navigator.clear() } } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift index b8fd5f733c..babc05086e 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift @@ -90,7 +90,7 @@ extension PasswordRecoveryView: View { Button(authService.string.okButtonLabel) { showSuccessSheet = false email = "" - authService.authView = .authPicker + authService.navigator.clear() } .padding() } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift index 68f4f90de7..184b49d224 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift @@ -27,49 +27,45 @@ extension SignedInView: View { set: { authService.passwordPrompt.isPromptingPassword = $0 } ) } - + public var body: some View { - if authService.authView == .updatePassword { - UpdatePasswordView() - } else { - VStack { - Text(authService.string.signedInTitle) - .font(.largeTitle) - .fontWeight(.bold) - .padding() - .accessibilityIdentifier("signed-in-text") - Text("as:") - Text( - "\(authService.currentUser?.email ?? authService.currentUser?.displayName ?? "Unknown")" - ) - if authService.currentUser?.isEmailVerified == false { - VerifyEmailView() - } - Divider() - Button(authService.string.updatePasswordButtonLabel) { - authService.authView = .updatePassword - } - Divider() - Button("Manage Two-Factor Authentication") { - authService.authView = .mfaManagement + VStack { + Text(authService.string.signedInTitle) + .font(.largeTitle) + .fontWeight(.bold) + .padding() + .accessibilityIdentifier("signed-in-text") + Text("as:") + Text( + "\(authService.currentUser?.email ?? authService.currentUser?.displayName ?? "Unknown")" + ) + if authService.currentUser?.isEmailVerified == false { + VerifyEmailView() + } + Divider() + Button(authService.string.updatePasswordButtonLabel) { + authService.navigator.push(.updatePassword) + } + Divider() + Button("Manage Two-Factor Authentication") { + authService.navigator.push(.mfaManagement) + } + .accessibilityIdentifier("mfa-management-button") + Divider() + Button(authService.string.signOutButtonLabel) { + Task { + try? await authService.signOut() } - .accessibilityIdentifier("mfa-management-button") - Divider() - Button(authService.string.signOutButtonLabel) { - Task { - try? await authService.signOut() - } - }.accessibilityIdentifier("sign-out-button") - Divider() - Button(authService.string.deleteAccountButtonLabel) { - Task { - try? await authService.deleteUser() - } + }.accessibilityIdentifier("sign-out-button") + Divider() + Button(authService.string.deleteAccountButtonLabel) { + Task { + try? await authService.deleteUser() } } - .sheet(isPresented: isShowingPasswordPrompt) { - PasswordPromptSheet(coordinator: authService.passwordPrompt) - } + } + .sheet(isPresented: isShowingPasswordPrompt) { + PasswordPromptSheet(coordinator: authService.passwordPrompt) } } } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift index 7eb5bd9b88..117538b759 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift @@ -32,7 +32,7 @@ public struct UpdatePasswordView { @Environment(AuthService.self) private var authService @State private var password = "" @State private var confirmPassword = "" - + @FocusState private var focus: FocusableField? private var isValid: Bool { !password.isEmpty && password == confirmPassword @@ -46,12 +46,12 @@ extension UpdatePasswordView: View { set: { authService.passwordPrompt.isPromptingPassword = $0 } ) } - + public var body: some View { VStack { HStack { Button(action: { - authService.authView = .authPicker + authService.navigator.clear() }) { HStack(spacing: 4) { Image(systemName: "chevron.left") @@ -62,7 +62,7 @@ extension UpdatePasswordView: View { .foregroundColor(.blue) } .accessibilityIdentifier("update-password-back-button") - + Spacer() } .padding(.horizontal) @@ -77,9 +77,9 @@ extension UpdatePasswordView: View { .padding(.vertical, 6) .background(Divider(), alignment: .bottom) .padding(.bottom, 8) - + Divider() - + LabeledContent { SecureField(authService.string.confirmPasswordInputLabel, text: $confirmPassword) .focused($focus, equals: .confirmPassword) @@ -90,19 +90,19 @@ extension UpdatePasswordView: View { .padding(.vertical, 6) .background(Divider(), alignment: .bottom) .padding(.bottom, 8) - + Divider() - + Button(action: { Task { try await authService.updatePassword(to: confirmPassword) - authService.authView = .authPicker + authService.navigator.clear() } }, label: { Text(authService.string.updatePasswordButtonLabel) .padding(.vertical, 8) .frame(maxWidth: .infinity) - + }) .disabled(!isValid) .padding([.top, .bottom], 8) diff --git a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Services/PhoneAuthProviderAuthUI.swift b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Services/PhoneAuthProviderAuthUI.swift index c1c3d89695..933072d16a 100644 --- a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Services/PhoneAuthProviderAuthUI.swift +++ b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Services/PhoneAuthProviderAuthUI.swift @@ -19,6 +19,9 @@ import SwiftUI public typealias VerificationID = String public class PhoneProviderSwift: PhoneAuthProviderSwift { + private var verificationID: String? + private var verificationCode: String? + public init() {} @MainActor public func verifyPhoneNumber(phoneNumber: String) async throws -> VerificationID { @@ -34,34 +37,19 @@ public class PhoneProviderSwift: PhoneAuthProviderSwift { } } - // Present phone auth UI and wait for user to complete the flow - @MainActor public func createAuthCredential() async throws -> AuthCredential { - guard let presentingViewController = await (UIApplication.shared.connectedScenes - .first as? UIWindowScene)?.windows.first?.rootViewController else { - throw AuthServiceError - .rootViewControllerNotFound( - "Root View controller is not available to present Phone auth View." - ) - } - - return try await withCheckedThrowingContinuation { continuation in - let phoneAuthView = PhoneAuthView(phoneProvider: self) { result in - switch result { - case let .success(verificationID, verificationCode): - // Create the credential here - let credential = PhoneAuthProvider.provider() - .credential(withVerificationID: verificationID, verificationCode: verificationCode) - continuation.resume(returning: credential) - case let .failure(error): - continuation.resume(throwing: error) - } - } - - let hostingController = UIHostingController(rootView: phoneAuthView) - hostingController.modalPresentationStyle = .formSheet + public func setVerificationCode(verificationID: String, code: String) { + self.verificationID = verificationID + self.verificationCode = code + } - presentingViewController.present(hostingController, animated: true) + @MainActor public func createAuthCredential() async throws -> AuthCredential { + guard let verificationID = verificationID, + let verificationCode = verificationCode else { + throw AuthServiceError.providerAuthenticationFailed("Verification ID or code not set") } + + return PhoneAuthProvider.provider() + .credential(withVerificationID: verificationID, verificationCode: verificationCode) } } diff --git a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift index 6884bfb5f9..2152536d72 100644 --- a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift +++ b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift @@ -21,7 +21,7 @@ import SwiftUI public struct PhoneAuthButtonView { @Environment(AuthService.self) private var authService let phoneProvider: PhoneAuthProviderSwift - + public init(phoneProvider: PhoneAuthProviderSwift) { self.phoneProvider = phoneProvider } @@ -34,9 +34,7 @@ extension PhoneAuthButtonView: View { style: .phone, accessibilityId: "sign-in-with-phone-button" ) { - Task { - try await authService.signIn(phoneProvider) - } + authService.navigator.push(.enterPhoneNumber) } } } diff --git a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthView.swift b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthView.swift deleted file mode 100644 index 539130415f..0000000000 --- a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthView.swift +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// -// PhoneAuthView.swift -// FirebaseUI -// -// Created by Russell Wheatley on 14/05/2025. -// - -import FirebaseAuth -import FirebaseAuthSwiftUI -import FirebaseCore -import SwiftUI - -@MainActor -public struct PhoneAuthView { - @Environment(\.dismiss) private var dismiss - @State private var currentError: AlertError? - @State private var phoneNumber = "" - @State private var showVerificationCodeInput = false - @State private var verificationCode = "" - @State private var verificationID = "" - @State private var isProcessing = false - let phoneProvider: PhoneAuthProviderSwift - let completion: (Result<(String, String), Error>) -> Void - - public init(phoneProvider: PhoneAuthProviderSwift, - completion: @escaping (Result<(String, String), Error>) -> Void) { - self.phoneProvider = phoneProvider - self.completion = completion - } -} - -extension PhoneAuthView: View { - public var body: some View { - ZStack { - VStack(spacing: 16) { - // Header with cancel button - HStack { - Spacer() - Button(action: { - completion(.failure(AuthServiceError - .signInCancelled("User cancelled sign-in for Phone"))) - dismiss() - }) { - Image(systemName: "xmark.circle.fill") - .font(.title2) - .foregroundColor(.gray) - } - } - .padding(.horizontal) - .padding(.top, 8) - - if !isProcessing { - Text("Sign in with Phone") - .font(.title2) - .bold() - - LabeledContent { - TextField("Enter phone number", text: $phoneNumber) - .textInputAutocapitalization(.never) - .disableAutocorrection(true) - .submitLabel(.next) - .keyboardType(.phonePad) - } label: { - Image(systemName: "phone.fill") - } - .padding(.vertical, 6) - .background(Divider(), alignment: .bottom) - .padding(.bottom, 4) - .padding(.horizontal) - - Button(action: { - Task { - isProcessing = true - do { - let id = try await phoneProvider.verifyPhoneNumber(phoneNumber: phoneNumber) - verificationID = id - showVerificationCodeInput = true - currentError = nil - } catch { - currentError = AlertError(message: error.localizedDescription) - } - isProcessing = false - } - }) { - Text("Send Code") - .padding(.vertical, 8) - .frame(maxWidth: .infinity) - } - .disabled(!PhoneUtils.isValidPhoneNumber(phoneNumber) || isProcessing) - .padding([.top, .bottom], 8) - .padding(.horizontal) - .buttonStyle(.borderedProminent) - - Spacer() - } else { - Spacer() - ProgressView() - .progressViewStyle(CircularProgressViewStyle()) - .padding() - Text("Processing...") - .foregroundColor(.secondary) - Spacer() - } - } - .sheet(isPresented: $showVerificationCodeInput) { - VStack(spacing: 16) { - // Header with cancel button - HStack { - Spacer() - Button(action: { - showVerificationCodeInput = false - }) { - Image(systemName: "xmark.circle.fill") - .font(.title2) - .foregroundColor(.gray) - } - } - .padding(.horizontal) - .padding(.top, 8) - - Text("Enter Verification Code") - .font(.title2) - .bold() - - TextField("Verification Code", text: $verificationCode) - .keyboardType(.numberPad) - .padding() - .background(Color(.systemGray6)) - .cornerRadius(8) - .padding(.horizontal) - - Button(action: { - Task { - isProcessing = true - // Return the verification details to createAuthCredential - completion(.success((verificationID, verificationCode))) - showVerificationCodeInput = false - dismiss() - } - }) { - Text("Verify and Sign In") - .foregroundColor(.white) - .padding() - .frame(maxWidth: .infinity) - .background(Color.green) - .cornerRadius(8) - .padding(.horizontal) - } - .disabled(verificationCode.isEmpty || isProcessing) - - Spacer() - } - .padding(.vertical) - } - } - .errorAlert(error: $currentError, okButtonLabel: "OK") - } -} - -#Preview { - FirebaseOptions.dummyConfigurationForPreview() - let phoneProvider = PhoneProviderSwift() - return PhoneAuthView(phoneProvider: phoneProvider) { result in - switch result { - case let .success(verificationID, verificationCode): - print("Preview: Got verification - ID: \(verificationID), Code: \(verificationCode)") - case let .failure(error): - print("Preview: Phone auth failed with error: \(error)") - } - } -} diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentViewSheetExample.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentViewSheetExample.swift deleted file mode 100644 index 791305d831..0000000000 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentViewSheetExample.swift +++ /dev/null @@ -1,81 +0,0 @@ -// -// ContentViewSheetExample.swift -// FirebaseUI -// -// Created by Ademola Fadumo on 20/10/2025. -// - -import SwiftUI -import FirebaseAuth -import FirebaseAuthSwiftUI -import FirebaseGoogleSwiftUI -import FirebaseFacebookSwiftUI -import FirebasePhoneAuthSwiftUI - -struct ContentViewSheetExample: View { - init() { - 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( - tosUrl: URL(string: "https://example.com/tos"), - privacyPolicyUrl: URL(string: "https://example.com/privacy"), - emailLinkSignInActionCodeSettings: actionCodeSettings, - mfaEnabled: true - ) - - authService = AuthService( - configuration: configuration - ) - .withGoogleSignIn() - .withPhoneSignIn() - .withTwitterSignIn() - .withFacebookSignIn() - .withEmailSignIn() - } - - @State private var authService: AuthService - @State private var isPresented: Bool = false - - var body: some View { - FirebaseAuthView( - authService: authService, - isPresented: $isPresented - ) { - NavigationStack { - VStack { - if authService.authenticationState == .unauthenticated { - Text("Not Authenticated") - } else { - Text("Authenticated - \(authService.currentUser?.email ?? "")") - Button { - Task { - try? await authService.signOut() - } - } label: { - Text("Sign Out") - } - .buttonStyle(.borderedProminent) - } - } - .navigationTitle("Firebase UI Demo") - } - .onAppear { - isPresented = authService.authenticationState == .unauthenticated - } - .onChange(of: authService.authenticationState) { oldValue, newValue in - debugPrint("authService.authenticationState - \(newValue)") - if newValue != .authenticating { - isPresented = newValue == .unauthenticated - } - } - } - } -} - -#Preview { - ContentViewSheetExample() -} From 2ceeb7a7f0670144d68e24f8087501b6e3acae17 Mon Sep 17 00:00:00 2001 From: Ademola Fadumo Date: Wed, 29 Oct 2025 14:49:53 +0100 Subject: [PATCH 07/38] add firebase auth logo --- .../Sources/Views/AuthPickerView.swift | 4 ++++ .../Sources/Assets.swift | 20 ++++++++++++++++++ .../firebase-auth-logo.imageset/Contents.json | 6 +++--- ...gomark_Authentication_Full_Color 1 (1).png | Bin 0 -> 6901 bytes ...gomark_Authentication_Full_Color 1 (2).png | Bin 0 -> 41987 bytes ...t_Logomark_Authentication_Full_Color 1.png | Bin 0 -> 4496 bytes .../firebase_auth_120dp 1.png | Bin 31998 -> 0 bytes .../firebase_auth_120dp 2.png | Bin 15823 -> 0 bytes .../firebase_auth_120dp.png | Bin 35146 -> 0 bytes 9 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Assets.swift create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/Product_Logomark_Authentication_Full_Color 1 (1).png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/Product_Logomark_Authentication_Full_Color 1 (2).png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/Product_Logomark_Authentication_Full_Color 1.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 1.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 2.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp.png diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift index 0b7b2b3804..e2650a0f7c 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift @@ -96,6 +96,10 @@ extension AuthPickerView: View { GeometryReader { proxy in ScrollView { VStack(spacing: 24) { + Image(Assets.firebaseAuthLogo) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 100, height: 100) if authService.emailSignInEnabled { EmailAuthView() } diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Assets.swift b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Assets.swift new file mode 100644 index 0000000000..3c55153757 --- /dev/null +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Assets.swift @@ -0,0 +1,20 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import SwiftUI + +@MainActor +public struct Assets { + public static var firebaseAuthLogo: ImageResource = .firebaseAuthLogo +} diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/Contents.json index d41340246f..ec9b5e4a36 100644 --- a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/Contents.json +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "firebase_auth_120dp 2.png", + "filename" : "Product_Logomark_Authentication_Full_Color 1.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "firebase_auth_120dp 1.png", + "filename" : "Product_Logomark_Authentication_Full_Color 1 (1).png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "firebase_auth_120dp.png", + "filename" : "Product_Logomark_Authentication_Full_Color 1 (2).png", "idiom" : "universal", "scale" : "3x" } diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/Product_Logomark_Authentication_Full_Color 1 (1).png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/Product_Logomark_Authentication_Full_Color 1 (1).png new file mode 100644 index 0000000000000000000000000000000000000000..fecbcb6dd41127a8e6d1907c7c74ec2fce7b5ee0 GIT binary patch literal 6901 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 literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/Product_Logomark_Authentication_Full_Color 1 (2).png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/Product_Logomark_Authentication_Full_Color 1 (2).png new file mode 100644 index 0000000000000000000000000000000000000000..9df93f97a38ae9dcf63d7cbb7491d53dfac9b7a7 GIT binary patch literal 41987 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 N+8=f%R@jge{tu;C#{vKV literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/Product_Logomark_Authentication_Full_Color 1.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/Product_Logomark_Authentication_Full_Color 1.png new file mode 100644 index 0000000000000000000000000000000000000000..bc9af3cc0c1a8e2af1acd798ca94bfcb5ec2651b GIT binary patch literal 4496 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 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 2.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/firebase-auth-logo.imageset/firebase_auth_120dp 2.png deleted file mode 100644 index 351fa59fe5a0c215853266f7ae53ed06e2d2b001..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15823 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 Date: Thu, 30 Oct 2025 16:03:31 +0100 Subject: [PATCH 08/38] refactor: auto resolve limited login from ATT --- .../Sources/Services/FacebookProviderAuthUI.swift | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift index 5f410f96c0..33433b9861 100644 --- a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift +++ b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift @@ -28,18 +28,11 @@ public class FacebookProviderSwift: AuthProviderSwift, DeleteUserSwift { // Needed for reauthentication var isLimitedLogin: Bool = true - public init(scopes: [String] = ["email", "public_profile"], isLimitedLogin: Bool = true) { + public init(scopes: [String] = ["email", "public_profile"]) { self.scopes = scopes - self.isLimitedLogin = isLimitedLogin + self.isLimitedLogin = ATTrackingManager.trackingAuthorizationStatus != .authorized } - /// Sets whether to use Facebook Limited Login mode - /// - Parameter limitedLogin: `true` for Limited Login (privacy mode), `false` for full tracking - /// - Note: When disabling Limited Login, ensure you have requested ATT permission first - public func setLimitedLogin(_ limitedLogin: Bool) { - self.isLimitedLogin = limitedLogin - } - @MainActor public func createAuthCredential() async throws -> AuthCredential { let loginType: LoginTracking = isLimitedLogin ? .limited : .enabled From d192d4ecb4d5c78aeca61dc4765a36e501a1eaa2 Mon Sep 17 00:00:00 2001 From: Ademola Fadumo Date: Thu, 30 Oct 2025 16:04:26 +0100 Subject: [PATCH 09/38] fix: button for email link auth --- .../Sources/Services/AuthService.swift | 14 +- .../Sources/Views/AuthPickerView.swift | 111 ++++++--------- .../Sources/Views/EmailAuthView.swift | 7 - .../Views/EnterVerificationCodeView.swift | 8 +- .../Sources/Views/PrivacyTOCsView.swift | 2 - .../App/ContentView.swift | 129 ++++-------------- 6 files changed, 84 insertions(+), 187 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift index 25390b43bc..18dd3d365d 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift @@ -14,6 +14,7 @@ @preconcurrency import FirebaseAuth import SwiftUI +import FirebaseAuthUIComponents public protocol AuthProviderSwift { @MainActor func createAuthCredential() async throws -> AuthCredential @@ -118,8 +119,12 @@ public final class AuthService { @ObservationIgnored @AppStorage("email-link") public var emailLink: String? public let configuration: AuthConfiguration public let auth: Auth + public var isPresented: Bool = false public private(set) var navigator = Navigator() - public var authViewRoutes: [AuthView] { + public var authView: AuthView? { + navigator.routes.last + } + internal var authViewRoutes: [AuthView] { navigator.routes } public let string: StringUtils @@ -151,6 +156,13 @@ public final class AuthService { public func renderButtons(spacing: CGFloat = 16) -> AnyView { AnyView( VStack(spacing: spacing) { + AuthProviderButton( + label: string.signInWithEmailLinkViewTitle, + style: .email, + accessibilityId: "sign-in-with-email-link-button" + ) { + self.navigator.push(.emailLink) + } ForEach(providers, id: \.id) { provider in provider.authButton() } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift index e2650a0f7c..be1c019a33 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift @@ -17,35 +17,30 @@ import SwiftUI import FirebaseAuthUIComponents @MainActor -public struct AuthPickerView { +public struct AuthPickerView { public init( - isPresented: Binding = .constant(false), - interactiveDismissDisabled: Bool = true, - @ViewBuilder content: @escaping () -> Content = { EmptyView() }, - @ViewBuilder footer: @escaping () -> Footer = { EmptyView() } + @ViewBuilder content: @escaping () -> Content = { EmptyView() } ) { - self.isPresented = isPresented - self.interactiveDismissDisabled = interactiveDismissDisabled self.content = content - self.footer = footer } @Environment(AuthService.self) private var authService - private var isPresented: Binding - private var interactiveDismissDisabled: Bool - private let content: () -> Content? - private let footer: () -> Footer? + private let content: () -> Content } extension AuthPickerView: View { public var body: some View { + @Bindable var authService = authService content() - .sheet(isPresented: isPresented) { + .sheet(isPresented: $authService.isPresented) { @Bindable var navigator = authService.navigator NavigationStack(path: $navigator.routes) { authPickerViewInternal .navigationTitle(authService.string.authPickerTitle) .navigationBarTitleDisplayMode(.large) + .toolbar { + toolbar + } .navigationDestination(for: AuthView.self) { view in switch view { case AuthView.passwordRecovery: @@ -66,29 +61,49 @@ extension AuthPickerView: View { } else { EmptyView() } - default: - EmptyView() + case .enterVerificationCode(let verificationID, let fullPhoneNumber): + if let phoneProvider = authService.currentPhoneProvider { + EnterVerificationCodeView(verificationID: verificationID, fullPhoneNumber: fullPhoneNumber, phoneProvider: phoneProvider) + } else { + EmptyView() + } } } } - .interactiveDismissDisabled(interactiveDismissDisabled) + .interactiveDismissDisabled(authService.configuration.interactiveDismissEnabled) } } + @ToolbarContentBuilder + var toolbar: some ToolbarContent { + ToolbarItem(placement: .topBarTrailing) { + if !authService.configuration.shouldHideCancelButton { + Button { + authService.isPresented = false + } label: { + Image(systemName: "xmark") + } + } + } + } + @ViewBuilder var authPickerViewInternal: some View { - authMethodPicker - .safeAreaPadding() - .onChange(of: authService.authViewRoutes) { oldValue, newValue in - debugPrint("Got here: \(newValue)") + VStack { + if authService.authenticationState == .unauthenticated { + authMethodPicker + .safeAreaPadding() + } else { + SignedInView() } - .errorAlert( - error: Binding( - get: { authService.currentError }, - set: { authService.currentError = $0 } - ), - okButtonLabel: authService.string.okButtonLabel - ) + } + .errorAlert( + error: Binding( + get: { authService.currentError }, + set: { authService.currentError = $0 } + ), + okButtonLabel: authService.string.okButtonLabel + ) } @ViewBuilder @@ -103,54 +118,14 @@ extension AuthPickerView: View { if authService.emailSignInEnabled { EmailAuthView() } + Divider() otherSignInOptions(proxy) PrivacyTOCsView(displayMode: .full) - footer() } } } } - // @ViewBuilder - // var authMethodPicker: some View { - // GeometryReader { proxy in - // ScrollView { - // VStack(spacing: 24) { - // if authService.authenticationState == .authenticated { - // switch authService.authView { - // case .mfaEnrollment: - // MFAEnrolmentView() - // case .mfaManagement: - // MFAManagementView() - // default: - // SignedInView() - // } - // } else { - // switch authService.authView { - // case .passwordRecovery: - // PasswordRecoveryView() - // case .emailLink: - // EmailLinkView() - // case .mfaEnrollment: - // MFAEnrolmentView() - // case .mfaResolution: - // MFAResolutionView() - // case .authPicker: - // if authService.emailSignInEnabled { - // EmailAuthView() - // } - // otherSignInOptions(proxy) - // PrivacyTOCsView(displayMode: .full) - // default: - // // TODO: - possibly refactor this, see: https://github.com/firebase/FirebaseUI-iOS/pull/1259#discussion_r2105473437 - // EmptyView() - // } - // } - // } - // } - // } - // } - @ViewBuilder func otherSignInOptions(_ proxy: GeometryProxy) -> some View { VStack { diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift index b756e059f3..e03d594484 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift @@ -151,14 +151,7 @@ extension EmailAuthView: View { .frame(maxWidth: .infinity) .buttonStyle(.borderedProminent) .accessibilityIdentifier("sign-in-button") - Button { - authService.navigator.push(.emailLink) - } label: { - Text(authService.string.signUpWithEmailLinkButtonLabel) - } - .accessibilityIdentifier("sign-in-with-email-link-button") } - Divider() HStack { Text( authService diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterVerificationCodeView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterVerificationCodeView.swift index 54e0c5f6eb..aa45d79dd7 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterVerificationCodeView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterVerificationCodeView.swift @@ -28,9 +28,6 @@ struct EnterVerificationCodeView: View { let verificationID: String let fullPhoneNumber: String let phoneProvider: PhoneAuthProviderSwift - let phoneNumber: String - let selectedCountry: CountryData - let onChangeNumber: () -> Void var body: some View { VStack(spacing: 32) { @@ -43,7 +40,7 @@ struct EnterVerificationCodeView: View { .frame(maxWidth: .infinity, alignment: .leading) Button { - onChangeNumber() + authService.navigator.pop() } label: { Text("Change number") .font(.caption) @@ -121,9 +118,6 @@ struct EnterVerificationCodeView: View { verificationID: "mock-id", fullPhoneNumber: "+1 5551234567", phoneProvider: MockPhoneProvider(), - phoneNumber: "5551234567", - selectedCountry: .default, - onChangeNumber: {} ) .environment(AuthService()) } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PrivacyTOCsView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PrivacyTOCsView.swift index a33ec8e878..d8a4da1be1 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PrivacyTOCsView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PrivacyTOCsView.swift @@ -67,8 +67,6 @@ extension PrivacyTOCsView: View { let privacyURL = authService.configuration.privacyPolicyUrl { Text(attributedMessage(tosURL: tosURL, privacyURL: privacyURL)) .multilineTextAlignment(displayMode == .full ? .center : .trailing) - //.font(.footnote) - //.foregroundColor(.primary) .padding() } else { EmptyView() diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift index b493a6e3d5..753708abcb 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift @@ -45,18 +45,13 @@ struct ContentView: View { mfaEnabled: true ) - // Create Facebook provider with Limited Login enabled by default - let fbProvider = FacebookProviderSwift() - fbProvider.setLimitedLogin(true) - facebookProvider = fbProvider - authService = AuthService( configuration: configuration ) .withAppleSignIn() .withPhoneSignIn() .withGoogleSignIn() - .withFacebookSignIn(facebookProvider) + .withFacebookSignIn(FacebookProviderSwift()) .withTwitterSignIn() .withOAuthSignIn(OAuthProviderSwift.github()) .withOAuthSignIn(OAuthProviderSwift.microsoft()) @@ -65,111 +60,41 @@ struct ContentView: View { } let authService: AuthService - let facebookProvider: FacebookProviderSwift - // State for Facebook Limited Login toggle - @State private var useLimitedLogin = true - @State private var isPresented = false var body: some View { - VStack { - AuthPickerView( - isPresented: $isPresented, - interactiveDismissDisabled: true - ) { - NavigationStack { - VStack { - if authService.authenticationState == .unauthenticated { - Text("Not Authenticated") - } else { - Text("Authenticated - \(authService.currentUser?.email ?? "")") - Button { - Task { - try? await authService.signOut() - } - } label: { - Text("Sign Out") - } - .buttonStyle(.borderedProminent) - } - } - .navigationTitle("Firebase UI Demo") - } - .onAppear { - isPresented = authService.authenticationState == .unauthenticated - } - .onChange(of: authService.authenticationState) { oldValue, newValue in - debugPrint("authService.authenticationState - \(newValue)") - if newValue != .authenticating { - isPresented = newValue == .unauthenticated - } - } - } footer: { - // Facebook Limited Login Control (Example) - GroupBox { - VStack(alignment: .leading, spacing: 8) { - Text("Facebook Settings") - .font(.headline) - - Toggle("Use Limited Login", isOn: $useLimitedLogin) - .onChange(of: useLimitedLogin) { _, newValue in - handleLimitedLoginToggle(newValue) - } - - Text("Limited Login protects privacy by preventing Facebook tracking across apps.\nNOTE: THIS IS NOT PART OF THE SDK") - .font(.caption) - .foregroundColor(.secondary) - } - .padding() - } - } - .environment(authService) + AuthPickerView { + usersApp } - + .environment(authService) } - private func handleLimitedLoginToggle(_ limitedLogin: Bool) { - if limitedLogin { - // User wants Limited Login - enable immediately - facebookProvider.setLimitedLogin(true) - } else { - // User wants to disable Limited Login (enable tracking) - // Request ATT permission first - ATTrackingManager.requestTrackingAuthorization { status in - Task { @MainActor in - if status == .authorized { - // User authorized tracking - facebookProvider.setLimitedLogin(false) - } else { - // User denied tracking - force Limited Login back ON - useLimitedLogin = true - facebookProvider.setLimitedLogin(true) + var usersApp: some View { + NavigationStack { + VStack { + if authService.authenticationState == .unauthenticated { + Text("Not Authenticated") + } else { + Text("Authenticated - \(authService.currentUser?.email ?? "")") + Button { + Task { + try? await authService.signOut() + } + } label: { + Text("Sign Out") } + .buttonStyle(.borderedProminent) } } + .navigationTitle("Firebase UI Demo") } - } -} - -extension UIApplication { - static func topViewController( - base: UIViewController? = UIApplication.shared.connectedScenes - .compactMap { ($0 as? UIWindowScene)?.keyWindow } - .first?.rootViewController - ) -> UIViewController? { - if let nav = base as? UINavigationController { - return topViewController(base: nav.visibleViewController) - } else if let tab = base as? UITabBarController { - return topViewController(base: tab.selectedViewController) - } else if let presented = base?.presentedViewController { - return topViewController(base: presented) + .onAppear { + authService.isPresented = authService.authenticationState == .unauthenticated + } + .onChange(of: authService.authenticationState) { oldValue, newValue in + debugPrint("authService.authenticationState - \(newValue)") + if newValue != .authenticating { + authService.isPresented = newValue == .unauthenticated + } } - return base - } -} - -extension View { - func hostingController() -> UIViewController { - let controller = UIHostingController(rootView: self) - return controller } } From cee457934c6b214e8c197d3faa08980338d17ced Mon Sep 17 00:00:00 2001 From: Ademola Fadumo Date: Thu, 30 Oct 2025 16:22:57 +0100 Subject: [PATCH 10/38] fix package.swift errors --- .../Services/FacebookProviderAuthUI.swift | 2 +- Package.swift | 34 ++++++++----------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift index a392433b1d..44ce7931e8 100644 --- a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift +++ b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift @@ -26,7 +26,7 @@ public class FacebookProviderSwift: AuthProviderSwift { private var rawNonce: String? private var shaNonce: String? // Needed for reauthentication - var isLimitedLogin: Bool = true + private var isLimitedLogin: Bool = true public init(scopes: [String] = ["email", "public_profile"]) { self.scopes = scopes diff --git a/Package.swift b/Package.swift index 4c27316e28..d91de108fa 100644 --- a/Package.swift +++ b/Package.swift @@ -283,7 +283,7 @@ let package = Package( .process("Strings"), ], swiftSettings: [ - .swiftLanguageVersion(.v6), + .swiftLanguageMode(.v6), ] ), .testTarget( @@ -291,7 +291,7 @@ let package = Package( dependencies: ["FirebaseAuthSwiftUI"], path: "FirebaseSwiftUI/FirebaseAuthSwiftUI/Tests/", swiftSettings: [ - .swiftLanguageVersion(.v6), + .swiftLanguageMode(.v6), ] ), .target( @@ -304,7 +304,7 @@ let package = Package( ], path: "FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources", swiftSettings: [ - .swiftLanguageVersion(.v6), + .swiftLanguageMode(.v6), ] ), .testTarget( @@ -312,7 +312,7 @@ let package = Package( dependencies: ["FirebaseGoogleSwiftUI"], path: "FirebaseSwiftUI/FirebaseGoogleSwiftUI/Tests/", swiftSettings: [ - .swiftLanguageVersion(.v6), + .swiftLanguageMode(.v6), ] ), .target( @@ -325,7 +325,7 @@ let package = Package( ], path: "FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources", swiftSettings: [ - .swiftLanguageVersion(.v6), + .swiftLanguageMode(.v6), ] ), .testTarget( @@ -333,7 +333,7 @@ let package = Package( dependencies: ["FirebaseFacebookSwiftUI"], path: "FirebaseSwiftUI/FirebaseFacebookSwiftUI/Tests/", swiftSettings: [ - .swiftLanguageVersion(.v6), + .swiftLanguageMode(.v6), ] ), .target( @@ -344,7 +344,7 @@ let package = Package( ], path: "FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources", swiftSettings: [ - .swiftLanguageVersion(.v6), + .swiftLanguageMode(.v6), ] ), .testTarget( @@ -352,7 +352,7 @@ let package = Package( dependencies: ["FirebasePhoneAuthSwiftUI"], path: "FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Tests/", swiftSettings: [ - .swiftLanguageVersion(.v6), + .swiftLanguageMode(.v6), ] ), .target( @@ -362,11 +362,8 @@ let package = Package( "FirebaseAuthUIComponents", ], path: "FirebaseSwiftUI/FirebaseTwitterSwiftUI/Sources", - resources: [ - .process("Resources") - ], swiftSettings: [ - .swiftLanguageVersion(.v6), + .swiftLanguageMode(.v6), ] ), .testTarget( @@ -374,7 +371,7 @@ let package = Package( dependencies: ["FirebaseTwitterSwiftUI"], path: "FirebaseSwiftUI/FirebaseTwitterSwiftUI/Tests/", swiftSettings: [ - .swiftLanguageVersion(.v6), + .swiftLanguageMode(.v6), ] ), .target( @@ -385,7 +382,7 @@ let package = Package( ], path: "FirebaseSwiftUI/FirebaseAppleSwiftUI/Sources", swiftSettings: [ - .swiftLanguageVersion(.v6), + .swiftLanguageMode(.v6), ] ), .testTarget( @@ -393,7 +390,7 @@ let package = Package( dependencies: ["FirebaseAppleSwiftUI"], path: "FirebaseSwiftUI/FirebaseAppleSwiftUI/Tests/", swiftSettings: [ - .swiftLanguageVersion(.v6), + .swiftLanguageMode(.v6), ] ), .target( @@ -403,11 +400,8 @@ let package = Package( "FirebaseAuthUIComponents", ], path: "FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources", - resources: [ - .process("Resources") - ], swiftSettings: [ - .swiftLanguageVersion(.v6), + .swiftLanguageMode(.v6), ] ), .testTarget( @@ -415,7 +409,7 @@ let package = Package( dependencies: ["FirebaseOAuthSwiftUI"], path: "FirebaseSwiftUI/FirebaseOAuthSwiftUI/Tests/", swiftSettings: [ - .swiftLanguageVersion(.v6), + .swiftLanguageMode(.v6), ] ), ] From 08eeaf6de83ed0213a1dbdb7d94fba6095efaa99 Mon Sep 17 00:00:00 2001 From: Ademola Fadumo <48495111+demolaf@users.noreply.github.com> Date: Fri, 31 Oct 2025 10:09:43 +0100 Subject: [PATCH 11/38] Update samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift Co-authored-by: Russell Wheatley --- .../FirebaseSwiftUIExample/App/ContentView.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift index 753708abcb..e7c099aabb 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift @@ -75,6 +75,12 @@ struct ContentView: View { Text("Not Authenticated") } else { Text("Authenticated - \(authService.currentUser?.email ?? "")") + Button { + authService.isPresented = true // Reopen the sheet + } label: { + Text("Manage Account") + } + .buttonStyle(.bordered) Button { Task { try? await authService.signOut() From 3259d7f947b1bc5ba4ea55549101fcc02c42b6c3 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 10:57:38 +0000 Subject: [PATCH 12/38] format --- .../Sources/Services/AuthService.swift | 15 +- .../Sources/Utils/StringUtils.swift | 12 +- .../FirebaseAuthSwiftUI/Sources/Version.swift | 2 +- .../Sources/Views/AuthPickerView.swift | 24 +-- .../Sources/Views/EmailAuthView.swift | 32 ++-- .../Sources/Views/EmailLinkView.swift | 6 +- .../Sources/Views/EnterPhoneNumberView.swift | 24 +-- .../Views/EnterVerificationCodeView.swift | 33 ++-- .../Sources/Views/PasswordRecoveryView.swift | 16 +- .../Sources/Views/SignedInView.swift | 2 +- .../Sources/Views/UpdatePasswordView.swift | 16 +- .../Components/AuthProviderButton.swift | 18 +-- .../Sources/Components/AuthTextField.swift | 44 +++-- .../Sources/Components/CountrySelector.swift | 26 ++- .../VerificationCodeInputField.swift | 150 +++++++++--------- .../Sources/Extensions/Color+Hex.swift | 14 +- .../Sources/Theme/ProviderStyle.swift | 40 +++-- .../Services/FacebookProviderAuthUI.swift | 4 +- .../Services/OAuthProviderSwift+Presets.swift | 2 +- .../Sources/Views/GenericOAuthButton.swift | 4 +- .../Services/PhoneAuthProviderAuthUI.swift | 6 +- .../Sources/Views/PhoneAuthButtonView.swift | 2 +- 22 files changed, 244 insertions(+), 248 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift index a536b5e5d2..1480d658d7 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift @@ -13,9 +13,9 @@ // limitations under the License. @preconcurrency import FirebaseAuth +import FirebaseAuthUIComponents import FirebaseCore import SwiftUI -import FirebaseAuthUIComponents public protocol AuthProviderSwift { @MainActor func createAuthCredential() async throws -> AuthCredential @@ -88,16 +88,16 @@ private final class AuthListenerManager { @Observable public class Navigator { var routes: [AuthView] = [] - + public func push(_ route: AuthView) { routes.append(route) } - + @discardableResult public func pop() -> AuthView? { routes.popLast() } - + public func clear() { routes.removeAll() } @@ -122,9 +122,11 @@ public final class AuthService { public var authView: AuthView? { navigator.routes.last } - internal var authViewRoutes: [AuthView] { + + var authViewRoutes: [AuthView] { navigator.routes } + public let string: StringUtils public var currentUser: User? public var authenticationState: AuthenticationState = .unauthenticated @@ -143,10 +145,11 @@ public final class AuthService { var emailSignInEnabled = false private var providers: [AuthProviderUI] = [] - + public var currentPhoneProvider: PhoneAuthProviderSwift? { providers.compactMap { $0.provider as? PhoneAuthProviderSwift }.first } + public func registerProvider(providerWithButton: AuthProviderUI) { providers.append(providerWithButton) } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/StringUtils.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/StringUtils.swift index 4a8079a689..4b1e71b7a5 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/StringUtils.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/StringUtils.swift @@ -329,42 +329,42 @@ public class StringUtils { public var phoneSignInTitle: String { return localizedString(for: "Sign in with Phone") } - + /// Phone provider /// found in: /// - PhoneAuthView public var enterPhoneNumberPlaceholder: String { return localizedString(for: "Enter phone number") } - + /// Phone provider /// found in: /// - PhoneAuthView public var sendCodeButtonLabel: String { return localizedString(for: "Send Code") } - + /// Phone provider /// found in: /// - PhoneAuthView public var processingLabel: String { return localizedString(for: "Processing...") } - + /// Phone provider /// found in: /// - PhoneAuthView public var enterVerificationCodeTitle: String { return localizedString(for: "Enter Verification Code") } - + /// Phone provider /// found in: /// - PhoneAuthView public var verificationCodePlaceholder: String { return localizedString(for: "Verification Code") } - + /// Phone provider /// found in: /// - PhoneAuthView diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Version.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Version.swift index f7da298cdb..3b7cd58954 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Version.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Version.swift @@ -16,4 +16,4 @@ public enum FirebaseAuthSwiftUIVersion { // Use the release-swift.sh script to bump this version number, commit and push a new tag. public static let version = "15.1.0" -} \ No newline at end of file +} diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift index be1c019a33..8ec80aa84a 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift @@ -12,18 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. +import FirebaseAuthUIComponents import FirebaseCore import SwiftUI -import FirebaseAuthUIComponents @MainActor public struct AuthPickerView { - public init( - @ViewBuilder content: @escaping () -> Content = { EmptyView() } - ) { + public init(@ViewBuilder content: @escaping () -> Content = { EmptyView() }) { self.content = content } - + @Environment(AuthService.self) private var authService private let content: () -> Content } @@ -61,9 +59,13 @@ extension AuthPickerView: View { } else { EmptyView() } - case .enterVerificationCode(let verificationID, let fullPhoneNumber): + case let .enterVerificationCode(verificationID, fullPhoneNumber): if let phoneProvider = authService.currentPhoneProvider { - EnterVerificationCodeView(verificationID: verificationID, fullPhoneNumber: fullPhoneNumber, phoneProvider: phoneProvider) + EnterVerificationCodeView( + verificationID: verificationID, + fullPhoneNumber: fullPhoneNumber, + phoneProvider: phoneProvider + ) } else { EmptyView() } @@ -73,7 +75,7 @@ extension AuthPickerView: View { .interactiveDismissDisabled(authService.configuration.interactiveDismissEnabled) } } - + @ToolbarContentBuilder var toolbar: some ToolbarContent { ToolbarItem(placement: .topBarTrailing) { @@ -86,7 +88,7 @@ extension AuthPickerView: View { } } } - + @ViewBuilder var authPickerViewInternal: some View { VStack { @@ -105,7 +107,7 @@ extension AuthPickerView: View { okButtonLabel: authService.string.okButtonLabel ) } - + @ViewBuilder var authMethodPicker: some View { GeometryReader { proxy in @@ -125,7 +127,7 @@ extension AuthPickerView: View { } } } - + @ViewBuilder func otherSignInOptions(_ proxy: GeometryProxy) -> some View { VStack { diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift index e03d594484..58c88e89de 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailAuthView.swift @@ -32,15 +32,15 @@ private enum FocusableField: Hashable { @MainActor public struct EmailAuthView { @Environment(AuthService.self) private var authService - + @State private var email = "" @State private var password = "" @State private var confirmPassword = "" - + @FocusState private var focus: FocusableField? - + public init() {} - + private var isValid: Bool { return if authService.authenticationFlow == .signIn { !email.isEmpty && !password.isEmpty @@ -48,11 +48,11 @@ public struct EmailAuthView { !email.isEmpty && !password.isEmpty && password == confirmPassword } } - + private func signInWithEmailPassword() async { try? await authService.signIn(email: email, password: password) } - + private func createUserWithEmailPassword() async { try? await authService.createUser(email: email, password: password) } @@ -101,7 +101,7 @@ extension EmailAuthView: View { } .accessibilityIdentifier("password-recovery-button") } - + if authService.authenticationFlow == .signUp { AuthTextField( text: $confirmPassword, @@ -120,7 +120,7 @@ extension EmailAuthView: View { .focused($focus, equals: .confirmPassword) .accessibilityIdentifier("confirm-password-field") } - + Button(action: { Task { if authService.authenticationFlow == .signIn { @@ -133,9 +133,9 @@ extension EmailAuthView: View { if authService.authenticationState != .authenticating { Text( authService.authenticationFlow == .signIn - ? authService.string + ? authService.string .signInWithEmailButtonLabel - : authService.string.signUpWithEmailButtonLabel + : authService.string.signUpWithEmailButtonLabel ) .padding(.vertical, 8) .frame(maxWidth: .infinity) @@ -156,21 +156,21 @@ extension EmailAuthView: View { Text( authService .authenticationFlow == .signIn - ? authService.string.dontHaveAnAccountYetLabel - : authService.string.alreadyHaveAnAccountLabel + ? authService.string.dontHaveAnAccountYetLabel + : authService.string.alreadyHaveAnAccountLabel ) Button(action: { withAnimation { authService.authenticationFlow = - authService - .authenticationFlow == .signIn ? .signUp : .signIn + authService + .authenticationFlow == .signIn ? .signUp : .signIn } }) { Text( authService.authenticationFlow == .signUp - ? authService.string + ? authService.string .emailLoginFlowLabel - : authService.string.emailSignUpFlowLabel + : authService.string.emailSignUpFlowLabel ) .fontWeight(.semibold) .foregroundColor(.blue) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift index d40f9cb2e4..52a11edc0e 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift @@ -13,17 +13,17 @@ // limitations under the License. import FirebaseAuth +import FirebaseAuthUIComponents import FirebaseCore import SwiftUI -import FirebaseAuthUIComponents public struct EmailLinkView { @Environment(AuthService.self) private var authService @State private var email = "" @State private var showModal = false - + public init() {} - + private func sendEmailLink() async { do { try await authService.sendEmailSignInLink(email: email) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterPhoneNumberView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterPhoneNumberView.swift index 10e9827fe5..757e588f26 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterPhoneNumberView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterPhoneNumberView.swift @@ -24,9 +24,9 @@ struct EnterPhoneNumberView: View { @State private var selectedCountry: CountryData = .default @State private var currentError: AlertError? = nil @State private var isProcessing: Bool = false - + let phoneProvider: PhoneAuthProviderSwift - + var body: some View { VStack(spacing: 16) { Text(authService.string.enterPhoneNumberPlaceholder) @@ -35,7 +35,7 @@ struct EnterPhoneNumberView: View { .multilineTextAlignment(.center) .frame(maxWidth: .infinity, alignment: .leading) .padding(.top) - + AuthTextField( text: $phoneNumber, localizedTitle: "Phone", @@ -49,7 +49,7 @@ struct EnterPhoneNumberView: View { enabled: !isProcessing ) } - + Button(action: { Task { isProcessing = true @@ -80,7 +80,7 @@ struct EnterPhoneNumberView: View { .buttonStyle(.borderedProminent) .disabled(isProcessing || phoneNumber.isEmpty) .padding(.top, 8) - + Spacer() } .navigationTitle(authService.string.phoneSignInTitle) @@ -91,23 +91,23 @@ struct EnterPhoneNumberView: View { #Preview { FirebaseOptions.dummyConfigurationForPreview() - + class MockPhoneProvider: PhoneAuthProviderSwift { var id: String = "phone" - - func verifyPhoneNumber(phoneNumber: String) async throws -> String { + + func verifyPhoneNumber(phoneNumber _: String) async throws -> String { return "mock-verification-id" } - - func setVerificationCode(verificationID: String, code: String) { + + func setVerificationCode(verificationID _: String, code _: String) { // Mock implementation } - + func createAuthCredential() async throws -> AuthCredential { fatalError("Not implemented in preview") } } - + return EnterPhoneNumberView(phoneProvider: MockPhoneProvider()) .environment(AuthService()) } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterVerificationCodeView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterVerificationCodeView.swift index aa45d79dd7..54e4f996fb 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterVerificationCodeView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EnterVerificationCodeView.swift @@ -24,11 +24,11 @@ struct EnterVerificationCodeView: View { @State private var verificationCode: String = "" @State private var currentError: AlertError? = nil @State private var isProcessing: Bool = false - + let verificationID: String let fullPhoneNumber: String let phoneProvider: PhoneAuthProviderSwift - + var body: some View { VStack(spacing: 32) { VStack(spacing: 16) { @@ -38,7 +38,7 @@ struct EnterVerificationCodeView: View { .foregroundStyle(.secondary) .multilineTextAlignment(.center) .frame(maxWidth: .infinity, alignment: .leading) - + Button { authService.navigator.pop() } label: { @@ -49,20 +49,23 @@ struct EnterVerificationCodeView: View { } .padding(.bottom) .frame(maxWidth: .infinity, alignment: .leading) - + VerificationCodeInputField( code: $verificationCode, isError: currentError != nil, errorMessage: currentError?.message ) - + Button(action: { Task { isProcessing = true do { - phoneProvider.setVerificationCode(verificationID: verificationID, code: verificationCode) + phoneProvider.setVerificationCode( + verificationID: verificationID, + code: verificationCode + ) let credential = try await phoneProvider.createAuthCredential() - + _ = try await authService.signIn(credentials: credential) dismiss() } catch { @@ -84,7 +87,7 @@ struct EnterVerificationCodeView: View { .buttonStyle(.borderedProminent) .disabled(isProcessing || verificationCode.count != 6) } - + Spacer() } .navigationTitle(authService.string.enterVerificationCodeTitle) @@ -96,23 +99,23 @@ struct EnterVerificationCodeView: View { #Preview { FirebaseOptions.dummyConfigurationForPreview() - + class MockPhoneProvider: PhoneAuthProviderSwift { var id: String = "phone" - - func verifyPhoneNumber(phoneNumber: String) async throws -> String { + + func verifyPhoneNumber(phoneNumber _: String) async throws -> String { return "mock-verification-id" } - - func setVerificationCode(verificationID: String, code: String) { + + func setVerificationCode(verificationID _: String, code _: String) { // Mock implementation } - + func createAuthCredential() async throws -> AuthCredential { fatalError("Not implemented in preview") } } - + return NavigationStack { EnterVerificationCodeView( verificationID: "mock-id", diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift index babc05086e..f168b2dcf4 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift @@ -12,18 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. +import FirebaseAuthUIComponents import FirebaseCore import SwiftUI -import FirebaseAuthUIComponents public struct PasswordRecoveryView { @Environment(AuthService.self) private var authService @State private var email = "" @State private var showSuccessSheet = false @State private var sentEmail = "" - + public init() {} - + private func sendPasswordRecoveryEmail() async { do { try await authService.sendPasswordRecoveryEmail(email: email) @@ -68,7 +68,7 @@ extension PasswordRecoveryView: View { successSheet } } - + @ViewBuilder @MainActor private var successSheet: some View { @@ -79,14 +79,14 @@ extension PasswordRecoveryView: View { .padding() Text(authService.string.passwordRecoveryHelperMessage) .padding() - + Divider() - + Text(String(format: authService.string.passwordRecoveryEmailSentMessage, sentEmail)) .padding() - + Divider() - + Button(authService.string.okButtonLabel) { showSuccessSheet = false email = "" diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift index 184b49d224..c46f43f506 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift @@ -27,7 +27,7 @@ extension SignedInView: View { set: { authService.passwordPrompt.isPromptingPassword = $0 } ) } - + public var body: some View { VStack { Text(authService.string.signedInTitle) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift index 117538b759..e370454f35 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift @@ -32,7 +32,7 @@ public struct UpdatePasswordView { @Environment(AuthService.self) private var authService @State private var password = "" @State private var confirmPassword = "" - + @FocusState private var focus: FocusableField? private var isValid: Bool { !password.isEmpty && password == confirmPassword @@ -46,7 +46,7 @@ extension UpdatePasswordView: View { set: { authService.passwordPrompt.isPromptingPassword = $0 } ) } - + public var body: some View { VStack { HStack { @@ -62,7 +62,7 @@ extension UpdatePasswordView: View { .foregroundColor(.blue) } .accessibilityIdentifier("update-password-back-button") - + Spacer() } .padding(.horizontal) @@ -77,9 +77,9 @@ extension UpdatePasswordView: View { .padding(.vertical, 6) .background(Divider(), alignment: .bottom) .padding(.bottom, 8) - + Divider() - + LabeledContent { SecureField(authService.string.confirmPasswordInputLabel, text: $confirmPassword) .focused($focus, equals: .confirmPassword) @@ -90,9 +90,9 @@ extension UpdatePasswordView: View { .padding(.vertical, 6) .background(Divider(), alignment: .bottom) .padding(.bottom, 8) - + Divider() - + Button(action: { Task { try await authService.updatePassword(to: confirmPassword) @@ -102,7 +102,7 @@ extension UpdatePasswordView: View { Text(authService.string.updatePasswordButtonLabel) .padding(.vertical, 8) .frame(maxWidth: .infinity) - + }) .disabled(!isValid) .padding([.top, .bottom], 8) diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AuthProviderButton.swift b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AuthProviderButton.swift index 549ed65680..f8df18d14d 100644 --- a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AuthProviderButton.swift +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AuthProviderButton.swift @@ -22,21 +22,19 @@ public struct AuthProviderButton: View { let action: () -> Void var enabled: Bool var accessibilityId: String? - - public init( - label: String, - style: ProviderStyle, - enabled: Bool = true, - accessibilityId: String? = nil, - action: @escaping () -> Void - ) { + + public init(label: String, + style: ProviderStyle, + enabled: Bool = true, + accessibilityId: String? = nil, + action: @escaping () -> Void) { self.label = label self.style = style self.enabled = enabled self.accessibilityId = accessibilityId self.action = action } - + public var body: some View { Button(action: action) { HStack(spacing: 12) { @@ -62,7 +60,7 @@ public struct AuthProviderButton: View { .disabled(!enabled) .accessibilityIdentifier(accessibilityId ?? "auth-provider-button") } - + @ViewBuilder private func providerIcon(for image: Image, tint: Color?) -> some View { if let tint { diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AuthTextField.swift b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AuthTextField.swift index 2d027156bc..9c3247c6c7 100644 --- a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AuthTextField.swift +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/AuthTextField.swift @@ -18,7 +18,7 @@ public struct FieldValidation: Identifiable, Equatable { public let id = UUID() public let message: String public var valid: Bool = false - + public init(message: String, valid: Bool = false) { self.message = message self.valid = valid @@ -29,7 +29,7 @@ public struct AuthTextField: View { @FocusState private var isFocused: Bool @State var invalidInput: Bool = false @State var obscured: Bool = true - + @Binding var text: String let localizedTitle: String let prompt: String @@ -42,39 +42,37 @@ public struct AuthTextField: View { var onSubmit: ((String) -> Void)? = nil var onChange: ((String) -> Void)? = nil private let leading: () -> Leading? - - public init( - text: Binding, - localizedTitle: String, - prompt: String, - textAlignment: TextAlignment = .leading, - keyboardType: UIKeyboardType = .default, - contentType: UITextContentType? = nil, - sensitive: Bool = false, - validations: [FieldValidation] = [], - formState: ((Bool) -> Void)? = nil, - onSubmit: ((String) -> Void)? = nil, - onChange: ((String) -> Void)? = nil, - @ViewBuilder leading: @escaping () -> Leading? = { EmptyView() } - ) { - self._text = text + + public init(text: Binding, + localizedTitle: String, + prompt: String, + textAlignment: TextAlignment = .leading, + keyboardType: UIKeyboardType = .default, + contentType: UITextContentType? = nil, + sensitive: Bool = false, + validations: [FieldValidation] = [], + formState: ((Bool) -> Void)? = nil, + onSubmit: ((String) -> Void)? = nil, + onChange: ((String) -> Void)? = nil, + @ViewBuilder leading: @escaping () -> Leading? = { EmptyView() }) { + _text = text self.localizedTitle = localizedTitle self.prompt = prompt self.textAlignment = textAlignment self.keyboardType = keyboardType self.contentType = contentType - self.isSecureTextField = sensitive + isSecureTextField = sensitive self.validations = validations self.formState = formState self.onSubmit = onSubmit self.onChange = onChange self.leading = leading } - + var allRequirementsMet: Bool { validations.allSatisfy { $0.valid == true } } - + public var body: some View { VStack(alignment: .leading) { Text(localizedTitle) @@ -125,7 +123,7 @@ public struct AuthTextField: View { .onSubmit { onSubmit?(text) } - .onChange(of: text) { oldValue, newValue in + .onChange(of: text) { _, newValue in onChange?(newValue) } .multilineTextAlignment(textAlignment) @@ -157,7 +155,7 @@ public struct AuthTextField: View { } } } - .onChange(of: allRequirementsMet) { oldValue, newValue in + .onChange(of: allRequirementsMet) { _, newValue in formState?(newValue) if !newValue { withAnimation(.easeInOut(duration: 0.08).repeatCount(4)) { diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/CountrySelector.swift b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/CountrySelector.swift index 55238169c3..bf1ad74c76 100644 --- a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/CountrySelector.swift +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/CountrySelector.swift @@ -18,22 +18,22 @@ public struct CountryData: Equatable { public let name: String public let dialCode: String public let code: String - + public init(name: String, dialCode: String, code: String) { self.name = name self.dialCode = dialCode self.code = code } - + public var flag: String { - let base: UInt32 = 127397 + let base: UInt32 = 127_397 var s = "" for v in code.unicodeScalars { s.unicodeScalars.append(UnicodeScalar(base + v.value)!) } return String(s) } - + @MainActor public static let `default` = CountryData( name: "United States", dialCode: "+1", @@ -45,17 +45,15 @@ public struct CountrySelector: View { @Binding var selectedCountry: CountryData var enabled: Bool = true var allowedCountries: Set? = nil - - public init( - selectedCountry: Binding, - enabled: Bool = true, - allowedCountries: Set? = nil - ) { - self._selectedCountry = selectedCountry + + public init(selectedCountry: Binding, + enabled: Bool = true, + allowedCountries: Set? = nil) { + _selectedCountry = selectedCountry self.enabled = enabled self.allowedCountries = allowedCountries } - + // Common countries list private let allCountries: [CountryData] = [ CountryData(name: "United States", dialCode: "+1", code: "US"), @@ -74,14 +72,14 @@ public struct CountrySelector: View { CountryData(name: "Spain", dialCode: "+34", code: "ES"), CountryData(name: "Italy", dialCode: "+39", code: "IT"), ] - + private var filteredCountries: [CountryData] { if let allowedCountries = allowedCountries { return allCountries.filter { allowedCountries.contains($0.code) } } return allCountries } - + public var body: some View { Menu { ForEach(filteredCountries, id: \.code) { country in diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/VerificationCodeInputField.swift b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/VerificationCodeInputField.swift index fdcf2da1cc..fc99208c02 100644 --- a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/VerificationCodeInputField.swift +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/VerificationCodeInputField.swift @@ -16,38 +16,36 @@ import SwiftUI import UIKit public struct VerificationCodeInputField: View { - public init( - code: Binding, - codeLength: Int = 6, - isError: Bool = false, - errorMessage: String? = nil, - onCodeComplete: @escaping (String) -> Void = { _ in }, - onCodeChange: @escaping (String) -> Void = { _ in } - ) { - self._code = code + public init(code: Binding, + codeLength: Int = 6, + isError: Bool = false, + errorMessage: String? = nil, + onCodeComplete: @escaping (String) -> Void = { _ in }, + onCodeChange: @escaping (String) -> Void = { _ in }) { + _code = code self.codeLength = codeLength self.isError = isError self.errorMessage = errorMessage self.onCodeComplete = onCodeComplete self.onCodeChange = onCodeChange - self._digitFields = State(initialValue: Array(repeating: "", count: codeLength)) + _digitFields = State(initialValue: Array(repeating: "", count: codeLength)) } - + @Binding var code: String let codeLength: Int let isError: Bool let errorMessage: String? let onCodeComplete: (String) -> Void let onCodeChange: (String) -> Void - + @State private var digitFields: [String] = [] @State private var focusedIndex: Int? = nil @State private var pendingInternalCodeUpdates = 0 - + public var body: some View { VStack(spacing: 8) { HStack(spacing: 8) { - ForEach(0.. 0 { @@ -161,16 +159,16 @@ public struct VerificationCodeInputField: View { } } } - + private func processSingleDigitInput(at index: Int, digit: String) { if digitFields[index] != digit { digitFields[index] = digit } - + let newCode = digitFields.joined() commitCodeChange(newCode) onCodeChange(newCode) - + if !digit.isEmpty, let nextIndex = findNextEmptyField(startingFrom: index) { DispatchQueue.main.async { @@ -181,15 +179,14 @@ public struct VerificationCodeInputField: View { } } } - + if newCode.count == codeLength { DispatchQueue.main.async { onCodeComplete(newCode) } } } - - + private func handleBackspace(at index: Int) { // If current field is empty, move to previous field and clear it if digitFields[index].isEmpty && index > 0 { @@ -206,32 +203,32 @@ public struct VerificationCodeInputField: View { // Clear current field digitFields[index] = "" } - + // Update the main code string let newCode = digitFields.joined() commitCodeChange(newCode) onCodeChange(newCode) } - + private func applyBulkInput(startingAt index: Int, digits: String) { guard !digits.isEmpty, index < codeLength else { return } - + var updatedFields = digitFields var currentIndex = index - + for digit in digits where currentIndex < codeLength { updatedFields[currentIndex] = String(digit) currentIndex += 1 } - + if digitFields != updatedFields { digitFields = updatedFields } - + let newCode = updatedFields.joined() commitCodeChange(newCode) onCodeChange(newCode) - + if newCode.count == codeLength { DispatchQueue.main.async { onCodeComplete(newCode) @@ -249,16 +246,16 @@ public struct VerificationCodeInputField: View { } } } - + private func findNextEmptyField(startingFrom index: Int) -> Int? { // Look for the next empty field after the current index - for i in (index + 1).. Void let onBackspace: () -> Void let onFocusChanged: (Bool) -> Void - + private var borderWidth: CGFloat { if isError { return 2 } if isFocused || !digit.isEmpty { return 3 } return 1 } - + private var borderColor: Color { if isError { return .red } if isFocused || !digit.isEmpty { return .accentColor } return Color(.systemFill) } - + var body: some View { BackspaceAwareTextField( text: $digit, @@ -344,7 +341,7 @@ private struct BackspaceAwareTextField: UIViewRepresentable { let maxCharacters: Int let configuration: (UITextField) -> Void let onTextChange: (String) -> Void - + func makeUIView(context: Context) -> BackspaceUITextField { context.coordinator.parent = self let textField = BackspaceUITextField() @@ -363,20 +360,20 @@ private struct BackspaceAwareTextField: UIViewRepresentable { } return textField } - + func updateUIView(_ uiView: BackspaceUITextField, context: Context) { context.coordinator.parent = self if uiView.text != text { uiView.text = text } - + uiView.onDeleteBackward = { [weak uiView] in guard let uiView else { return } if (uiView.text ?? "").isEmpty { onDeleteBackwardWhenEmpty() } } - + if isFirstResponder { if !context.coordinator.isFirstResponder { context.coordinator.isFirstResponder = true @@ -389,39 +386,40 @@ private struct BackspaceAwareTextField: UIViewRepresentable { context.coordinator.isFirstResponder = false } } - + func makeCoordinator() -> Coordinator { Coordinator(parent: self) } - + final class Coordinator: NSObject, UITextFieldDelegate { var parent: BackspaceAwareTextField var isFirstResponder = false - + init(parent: BackspaceAwareTextField) { self.parent = parent } - + @objc func editingChanged(_ sender: UITextField) { let updatedText = sender.text ?? "" parent.text = updatedText parent.onTextChange(updatedText) } - + func textFieldDidBeginEditing(_ textField: UITextField) { isFirstResponder = true animateFocusChange(for: textField, focused: true) parent.onFocusChanged(true) } - + func textFieldDidEndEditing(_ textField: UITextField) { isFirstResponder = false animateFocusChange(for: textField, focused: false) parent.onFocusChanged(false) } - + private func animateFocusChange(for textField: UITextField, focused: Bool) { - let targetTransform: CGAffineTransform = focused ? CGAffineTransform(scaleX: 1.05, y: 1.05) : .identity + let targetTransform: CGAffineTransform = focused ? CGAffineTransform(scaleX: 1.05, y: 1.05) : + .identity UIView.animate( withDuration: 0.2, delay: 0, @@ -430,24 +428,22 @@ private struct BackspaceAwareTextField: UIViewRepresentable { textField.transform = targetTransform } } - - func textField( - _ textField: UITextField, - shouldChangeCharactersIn range: NSRange, - replacementString string: String - ) -> Bool { + + func textField(_ textField: UITextField, + shouldChangeCharactersIn range: NSRange, + replacementString string: String) -> Bool { if string.isEmpty { return true } - + let digitsOnly = string.filter { $0.isNumber } guard !digitsOnly.isEmpty else { return false } - + let currentText = textField.text ?? "" let nsCurrent = currentText as NSString - + if digitsOnly.count > 1 || string.count > 1 { let limit = max(parent.maxCharacters, 1) let truncated = String(digitsOnly.prefix(limit)) @@ -455,7 +451,7 @@ private struct BackspaceAwareTextField: UIViewRepresentable { parent.onTextChange(String(proposed.prefix(limit))) return false } - + let updated = nsCurrent.replacingCharacters(in: range, with: digitsOnly) return updated.count <= 1 } @@ -464,7 +460,7 @@ private struct BackspaceAwareTextField: UIViewRepresentable { private final class BackspaceUITextField: UITextField { var onDeleteBackward: (() -> Void)? - + override func deleteBackward() { let wasEmpty = (text ?? "").isEmpty super.deleteBackward() @@ -478,12 +474,12 @@ private final class BackspaceUITextField: UITextField { #Preview("Normal State") { @Previewable @State var code = "" - + return VStack(spacing: 32) { Text("Enter Verification Code") .font(.title2) .fontWeight(.semibold) - + VerificationCodeInputField( code: $code, onCodeComplete: { completedCode in @@ -493,7 +489,7 @@ private final class BackspaceUITextField: UITextField { print("Code changed: \(newCode)") } ) - + Text("Current code: \(code)") .font(.caption) .foregroundColor(.secondary) @@ -503,12 +499,12 @@ private final class BackspaceUITextField: UITextField { #Preview("Error State") { @Previewable @State var code = "12345" - + return VStack(spacing: 32) { Text("Enter Verification Code") .font(.title2) .fontWeight(.semibold) - + VerificationCodeInputField( code: $code, isError: true, @@ -520,7 +516,7 @@ private final class BackspaceUITextField: UITextField { print("Code changed: \(newCode)") } ) - + Text("Current code: \(code)") .font(.caption) .foregroundColor(.secondary) @@ -530,12 +526,12 @@ private final class BackspaceUITextField: UITextField { #Preview("Custom Length") { @Previewable @State var code = "" - + return VStack(spacing: 32) { Text("Enter 4-Digit Code") .font(.title2) .fontWeight(.semibold) - + VerificationCodeInputField( code: $code, codeLength: 4, @@ -546,7 +542,7 @@ private final class BackspaceUITextField: UITextField { print("Code changed: \(newCode)") } ) - + Text("Current code: \(code)") .font(.caption) .foregroundColor(.secondary) diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Extensions/Color+Hex.swift b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Extensions/Color+Hex.swift index efd6751ee3..1066edba52 100644 --- a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Extensions/Color+Hex.swift +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Extensions/Color+Hex.swift @@ -15,11 +15,11 @@ import SwiftUI extension Color { - init(hex: UInt, alpha: Double = 1.0) { - let red = Double((hex >> 16) & 0xFF) / 255.0 - let green = Double((hex >> 8) & 0xFF) / 255.0 - let blue = Double(hex & 0xFF) / 255.0 - - self.init(.sRGB, red: red, green: green, blue: blue, opacity: alpha) - } + init(hex: UInt, alpha: Double = 1.0) { + let red = Double((hex >> 16) & 0xFF) / 255.0 + let green = Double((hex >> 8) & 0xFF) / 255.0 + let blue = Double(hex & 0xFF) / 255.0 + + self.init(.sRGB, red: red, green: green, blue: blue, opacity: alpha) + } } diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Theme/ProviderStyle.swift b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Theme/ProviderStyle.swift index dcc4d95f94..0ef901c62c 100644 --- a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Theme/ProviderStyle.swift +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Theme/ProviderStyle.swift @@ -16,35 +16,33 @@ import SwiftUI /// Styling configuration for authentication provider buttons public struct ProviderStyle: Sendable { - public init( - icon: Image? = nil, - backgroundColor: Color, - contentColor: Color, - iconTint: Color? = nil, - elevation: CGFloat = 2 - ) { + public init(icon: Image? = nil, + backgroundColor: Color, + contentColor: Color, + iconTint: Color? = nil, + elevation: CGFloat = 2) { self.icon = icon self.backgroundColor = backgroundColor self.contentColor = contentColor self.iconTint = iconTint self.elevation = elevation } - + public let icon: Image? public let backgroundColor: Color public let contentColor: Color public var iconTint: Color? = nil - public let shape: AnyShape = AnyShape(RoundedRectangle(cornerRadius: 4, style: .continuous)) + public let shape: AnyShape = .init(RoundedRectangle(cornerRadius: 4, style: .continuous)) public let elevation: CGFloat - + public static let empty = ProviderStyle( icon: nil, backgroundColor: .white, contentColor: .black ) - + // MARK: - Predefined Styles - + public static var google: ProviderStyle { ProviderStyle( icon: Image(.fuiIcGoogleg), @@ -52,7 +50,7 @@ public struct ProviderStyle: Sendable { contentColor: Color(hex: 0x757575) ) } - + public static var facebook: ProviderStyle { ProviderStyle( icon: Image(.fuiIcFacebook), @@ -60,7 +58,7 @@ public struct ProviderStyle: Sendable { contentColor: Color(hex: 0xFFFFFF) ) } - + public static var twitter: ProviderStyle { ProviderStyle( icon: Image(.fuiIcTwitterX), @@ -68,7 +66,7 @@ public struct ProviderStyle: Sendable { contentColor: Color(hex: 0xFFFFFF) ) } - + public static var apple: ProviderStyle { ProviderStyle( icon: Image(.fuiIcApple), @@ -76,7 +74,7 @@ public struct ProviderStyle: Sendable { contentColor: Color(hex: 0xFFFFFF) ) } - + public static var phone: ProviderStyle { ProviderStyle( icon: Image(.fuiIcPhone), @@ -84,7 +82,7 @@ public struct ProviderStyle: Sendable { contentColor: Color(hex: 0xFFFFFF) ) } - + public static var github: ProviderStyle { ProviderStyle( icon: Image(.fuiIcGithub), @@ -92,7 +90,7 @@ public struct ProviderStyle: Sendable { contentColor: Color(hex: 0xFFFFFF) ) } - + public static var microsoft: ProviderStyle { ProviderStyle( icon: Image(.fuiIcMicrosoft), @@ -100,7 +98,7 @@ public struct ProviderStyle: Sendable { contentColor: Color(hex: 0xFFFFFF) ) } - + public static var yahoo: ProviderStyle { ProviderStyle( icon: Image(.fuiIcYahoo), @@ -108,7 +106,7 @@ public struct ProviderStyle: Sendable { contentColor: Color(hex: 0xFFFFFF) ) } - + public static var anonymous: ProviderStyle { ProviderStyle( icon: Image(.fuiIcAnonymous), @@ -116,7 +114,7 @@ public struct ProviderStyle: Sendable { contentColor: Color(hex: 0xFFFFFF) ) } - + public static var email: ProviderStyle { ProviderStyle( icon: Image(.fuiIcMail), diff --git a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift index 44ce7931e8..9e69109e5f 100644 --- a/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift +++ b/FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift @@ -30,9 +30,9 @@ public class FacebookProviderSwift: AuthProviderSwift { public init(scopes: [String] = ["email", "public_profile"]) { self.scopes = scopes - self.isLimitedLogin = ATTrackingManager.trackingAuthorizationStatus != .authorized + isLimitedLogin = ATTrackingManager.trackingAuthorizationStatus != .authorized } - + @MainActor public func createAuthCredential() async throws -> AuthCredential { let loginType: LoginTracking = isLimitedLogin ? .limited : .enabled diff --git a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Services/OAuthProviderSwift+Presets.swift b/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Services/OAuthProviderSwift+Presets.swift index 88f51fcbc1..f87f3b1a34 100644 --- a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Services/OAuthProviderSwift+Presets.swift +++ b/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Services/OAuthProviderSwift+Presets.swift @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -import SwiftUI import FirebaseAuthUIComponents +import SwiftUI /// Preset configurations for common OAuth providers public extension OAuthProviderSwift { diff --git a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Views/GenericOAuthButton.swift b/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Views/GenericOAuthButton.swift index cb33dcf1ee..b7af99e5e7 100644 --- a/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Views/GenericOAuthButton.swift +++ b/FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Views/GenericOAuthButton.swift @@ -34,7 +34,7 @@ extension GenericOAuthButton: View { .foregroundColor(.red) ) } - + // Create custom style from provider configuration var resolvedStyle: ProviderStyle { ProviderStyle( @@ -43,7 +43,7 @@ extension GenericOAuthButton: View { contentColor: oauthProvider.buttonForegroundColor ) } - + return AnyView( AuthProviderButton( label: oauthProvider.displayName, diff --git a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Services/PhoneAuthProviderAuthUI.swift b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Services/PhoneAuthProviderAuthUI.swift index 1a1bac2b62..2e4e66c8f3 100644 --- a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Services/PhoneAuthProviderAuthUI.swift +++ b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Services/PhoneAuthProviderAuthUI.swift @@ -21,7 +21,7 @@ public typealias VerificationID = String public class PhoneProviderSwift: PhoneAuthProviderSwift { private var verificationID: String? private var verificationCode: String? - + public init() {} @MainActor public func verifyPhoneNumber(phoneNumber: String) async throws -> VerificationID { @@ -39,7 +39,7 @@ public class PhoneProviderSwift: PhoneAuthProviderSwift { public func setVerificationCode(verificationID: String, code: String) { self.verificationID = verificationID - self.verificationCode = code + verificationCode = code } @MainActor public func createAuthCredential() async throws -> AuthCredential { @@ -47,7 +47,7 @@ public class PhoneProviderSwift: PhoneAuthProviderSwift { let verificationCode = verificationCode else { throw AuthServiceError.providerAuthenticationFailed("Verification ID or code not set") } - + return PhoneAuthProvider.provider() .credential(withVerificationID: verificationID, verificationCode: verificationCode) } diff --git a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift index 2152536d72..8af609241e 100644 --- a/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift +++ b/FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Views/PhoneAuthButtonView.swift @@ -21,7 +21,7 @@ import SwiftUI public struct PhoneAuthButtonView { @Environment(AuthService.self) private var authService let phoneProvider: PhoneAuthProviderSwift - + public init(phoneProvider: PhoneAuthProviderSwift) { self.phoneProvider = phoneProvider } From 6846c4dcd840a3f8b047f8636a267b9a79d96f66 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 11:04:47 +0000 Subject: [PATCH 13/38] fix: remove duplicate back buttons --- .../Sources/Views/MFAEnrolmentView.swift | 23 ------------------- .../Sources/Views/MFAManagementView.swift | 23 ------------------- .../Sources/Views/UpdatePasswordView.swift | 18 --------------- 3 files changed, 64 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift index 872d9cb92b..76bcd5152b 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift @@ -145,11 +145,6 @@ public struct MFAEnrolmentView { focus = nil } - private func cancelEnrollment() { - resetForm() - authService.navigator.clear() - } - private func copyToClipboard(_ text: String) { UIPasteboard.general.string = text @@ -188,24 +183,6 @@ public struct MFAEnrolmentView { extension MFAEnrolmentView: View { public var body: some View { VStack(spacing: 16) { - // Back button - HStack { - Button(action: { - cancelEnrollment() - }) { - HStack(spacing: 4) { - Image(systemName: "chevron.left") - .font(.system(size: 17, weight: .medium)) - Text("Back") - .font(.system(size: 17)) - } - .foregroundColor(.blue) - } - .accessibilityIdentifier("mfa-back-button") - Spacer() - } - .padding(.horizontal) - // Header VStack { Text("Set Up Two-Factor Authentication") diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift index f2d6f4c5c8..b75a4c48ae 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift @@ -58,34 +58,11 @@ public struct MFAManagementView { private func navigateToEnrollment() { authService.navigator.push(.mfaEnrollment) } - - private func goBack() { - authService.navigator.clear() - } } extension MFAManagementView: View { public var body: some View { VStack(spacing: 20) { - // Header with manual back button - HStack { - Button(action: { - authService.navigator.clear() - }) { - HStack(spacing: 4) { - Image(systemName: "chevron.left") - .font(.system(size: 17, weight: .medium)) - Text(authService.string.backButtonLabel) - .font(.system(size: 17)) - } - .foregroundColor(.blue) - } - .accessibilityIdentifier("back-button") - - Spacer() - } - .padding(.horizontal) - // Title section VStack { Text("Two-Factor Authentication") diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift index e370454f35..836d87bd6f 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift @@ -49,24 +49,6 @@ extension UpdatePasswordView: View { public var body: some View { VStack { - HStack { - Button(action: { - authService.navigator.clear() - }) { - HStack(spacing: 4) { - Image(systemName: "chevron.left") - .font(.system(size: 17, weight: .medium)) - Text(authService.string.backButtonLabel) - .font(.system(size: 17)) - } - .foregroundColor(.blue) - } - .accessibilityIdentifier("update-password-back-button") - - Spacer() - } - .padding(.horizontal) - .padding(.top, 8) LabeledContent { SecureField(authService.string.passwordInputLabel, text: $password) .focused($focus, equals: .password) From ebaeb87a5a3896d9102f77001d4fae688d0170e8 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 11:10:44 +0000 Subject: [PATCH 14/38] fix: password recovery email button label --- .../FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings index 63c9a8352c..76a082c2a7 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings @@ -573,7 +573,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Forgot password?" + "value" : "Send password recovery email" } } } From 969a9daae0b97da6916ace2c5b31ee3eebb0414a Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 11:18:19 +0000 Subject: [PATCH 15/38] fix: descriptive text of what it does --- .../FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift | 2 +- .../Sources/Views/PasswordRecoveryView.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift index 52a11edc0e..1b7aebe5cf 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift @@ -39,7 +39,7 @@ extension EmailLinkView: View { VStack(spacing: 24) { AuthTextField( text: $email, - localizedTitle: "Email", + localizedTitle: "Send a sign-in link to your email", prompt: authService.string.emailInputLabel, keyboardType: .emailAddress, contentType: .emailAddress, diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift index f168b2dcf4..5c8296ed1a 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/PasswordRecoveryView.swift @@ -40,7 +40,7 @@ extension PasswordRecoveryView: View { VStack(spacing: 24) { AuthTextField( text: $email, - localizedTitle: "Email", + localizedTitle: "Send a password recovery link to your email", prompt: authService.string.emailInputLabel, keyboardType: .emailAddress, contentType: .emailAddress, From 557a005f003a0fea8fd4613c346d5ed4645b967d Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 11:33:40 +0000 Subject: [PATCH 16/38] chore: add button to open authpickerview --- .../FirebaseSwiftUIExample/App/ContentView.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift index e7c099aabb..f18cc12b63 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift @@ -73,6 +73,12 @@ struct ContentView: View { VStack { if authService.authenticationState == .unauthenticated { Text("Not Authenticated") + Button { + authService.isPresented = true + } label: { + Text("Authenticate") + } + .buttonStyle(.bordered) } else { Text("Authenticated - \(authService.currentUser?.email ?? "")") Button { From c6469d797f24efb802b4094d3090de0b15ce100c Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 12:02:49 +0000 Subject: [PATCH 17/38] chore: update SignedInView UI --- .../Sources/Views/SignedInView.swift | 44 +++++++++++++++---- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift index c46f43f506..34449f939f 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift @@ -42,28 +42,54 @@ extension SignedInView: View { if authService.currentUser?.isEmailVerified == false { VerifyEmailView() } - Divider() - Button(authService.string.updatePasswordButtonLabel) { + Button(action: { authService.navigator.push(.updatePassword) + }) { + Text(authService.string.updatePasswordButtonLabel) + .padding(.vertical, 8) + .frame(maxWidth: .infinity) } - Divider() - Button("Manage Two-Factor Authentication") { + .padding([.top, .bottom], 8) + .frame(maxWidth: .infinity) + .buttonStyle(.borderedProminent) + Button(action: { authService.navigator.push(.mfaManagement) + }) { + Text("Manage Two-Factor Authentication") + .padding(.vertical, 8) + .frame(maxWidth: .infinity) } + .padding([.top, .bottom], 8) + .frame(maxWidth: .infinity) + .buttonStyle(.borderedProminent) .accessibilityIdentifier("mfa-management-button") - Divider() - Button(authService.string.signOutButtonLabel) { + Button(action: { Task { try? await authService.signOut() } - }.accessibilityIdentifier("sign-out-button") - Divider() - Button(authService.string.deleteAccountButtonLabel) { + }) { + Text(authService.string.signOutButtonLabel) + .padding(.vertical, 8) + .frame(maxWidth: .infinity) + } + .padding([.top, .bottom], 8) + .frame(maxWidth: .infinity) + .buttonStyle(.borderedProminent) + .accessibilityIdentifier("sign-out-button") + Button(action: { Task { try? await authService.deleteUser() } + }) { + Text(authService.string.deleteAccountButtonLabel) + .padding(.vertical, 8) + .frame(maxWidth: .infinity) } + .padding([.top, .bottom], 8) + .frame(maxWidth: .infinity) + .buttonStyle(.borderedProminent) } + .safeAreaPadding() .sheet(isPresented: isShowingPasswordPrompt) { PasswordPromptSheet(coordinator: authService.passwordPrompt) } From c97bcec1bc6c4021ba4375b0b5852686fff9691a Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 12:03:03 +0000 Subject: [PATCH 18/38] chore: remove sign in title when authenticated --- .../FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift index 8ec80aa84a..b9aba6cbb8 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift @@ -34,7 +34,8 @@ extension AuthPickerView: View { @Bindable var navigator = authService.navigator NavigationStack(path: $navigator.routes) { authPickerViewInternal - .navigationTitle(authService.string.authPickerTitle) + .navigationTitle(authService.authenticationState == .unauthenticated ? authService + .string.authPickerTitle : "") .navigationBarTitleDisplayMode(.large) .toolbar { toolbar From 082580772c68689709e827cc079650d8c6eb7fad Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 12:03:54 +0000 Subject: [PATCH 19/38] chore: remove "as" --- .../FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift index 34449f939f..0472511909 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift @@ -35,7 +35,6 @@ extension SignedInView: View { .fontWeight(.bold) .padding() .accessibilityIdentifier("signed-in-text") - Text("as:") Text( "\(authService.currentUser?.email ?? authService.currentUser?.displayName ?? "Unknown")" ) From c53cfcfa39985113cdf45fe06cdf42db6e8b8637 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 14:24:36 +0000 Subject: [PATCH 20/38] fix: update password view to match UI --- .../Sources/Views/UpdatePasswordView.swift | 64 ++++++++++--------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift index 836d87bd6f..648230c7de 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift @@ -18,7 +18,7 @@ // // Created by Russell Wheatley on 24/04/2025. // - +import FirebaseAuthUIComponents import FirebaseCore import SwiftUI @@ -48,32 +48,32 @@ extension UpdatePasswordView: View { } public var body: some View { - VStack { - LabeledContent { - SecureField(authService.string.passwordInputLabel, text: $password) - .focused($focus, equals: .password) - .submitLabel(.go) - } label: { - Image(systemName: "lock") - } - .padding(.vertical, 6) - .background(Divider(), alignment: .bottom) - .padding(.bottom, 8) - - Divider() - - LabeledContent { - SecureField(authService.string.confirmPasswordInputLabel, text: $confirmPassword) - .focused($focus, equals: .confirmPassword) - .submitLabel(.go) - } label: { - Image(systemName: "lock") - } - .padding(.vertical, 6) - .background(Divider(), alignment: .bottom) - .padding(.bottom, 8) + VStack(spacing: 24) { + AuthTextField( + text: $password, + localizedTitle: "Type new password", + prompt: authService.string.passwordInputLabel, + contentType: .password, + sensitive: true, + leading: { + Image(systemName: "lock") + } + ) + .submitLabel(.go) + .focused($focus, equals: .password) - Divider() + AuthTextField( + text: $confirmPassword, + localizedTitle: "Retype new password", + prompt: authService.string.confirmPasswordInputLabel, + contentType: .password, + sensitive: true, + leading: { + Image(systemName: "lock") + } + ) + .submitLabel(.go) + .focused($focus, equals: .confirmPassword) Button(action: { Task { @@ -90,7 +90,11 @@ extension UpdatePasswordView: View { .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) .buttonStyle(.borderedProminent) - }.sheet(isPresented: isShowingPasswordPrompt) { + } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + .safeAreaPadding() + .navigationTitle(authService.string.passwordRecoveryTitle) + .sheet(isPresented: isShowingPasswordPrompt) { PasswordPromptSheet(coordinator: authService.passwordPrompt) } } @@ -98,6 +102,8 @@ extension UpdatePasswordView: View { #Preview { FirebaseOptions.dummyConfigurationForPreview() - return UpdatePasswordView() - .environment(AuthService()) + return NavigationStack { + UpdatePasswordView() + .environment(AuthService()) + } } From 4f6e0f3f8e40cb068287dd27b96629dcf19b4b96 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 14:34:31 +0000 Subject: [PATCH 21/38] fix: MFA management View UI fix --- .../Sources/Views/MFAManagementView.swift | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift index b75a4c48ae..1c5770d4fd 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift @@ -13,6 +13,7 @@ // limitations under the License. import FirebaseAuth +import FirebaseCore import SwiftUI extension MultiFactorInfo: Identifiable { @@ -96,10 +97,16 @@ extension MFAManagementView: View { .multilineTextAlignment(.center) .padding(.horizontal) - Button("Set Up Two-Factor Authentication") { + Button { navigateToEnrollment() + } label: { + Text("Set Up Two-Factor Authentication") + .padding(.vertical, 8) + .frame(maxWidth: .infinity) } .buttonStyle(.borderedProminent) + .padding([.top, .bottom], 8) + .frame(maxWidth: .infinity) .accessibilityIdentifier("setup-mfa-button") } } else { @@ -119,14 +126,17 @@ extension MFAManagementView: View { Button("Add Another Method") { navigateToEnrollment() } - .buttonStyle(.bordered) - .padding(.horizontal) + .padding([.top, .bottom], 8) + .frame(maxWidth: .infinity) + .buttonStyle(.borderedProminent) .accessibilityIdentifier("add-mfa-method-button") } } Spacer() } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + .safeAreaPadding() .onAppear { loadEnrolledFactors() } @@ -199,6 +209,9 @@ private extension DateFormatter { } #Preview { - MFAManagementView() - .environment(AuthService()) + FirebaseOptions.dummyConfigurationForPreview() + return NavigationStack { + MFAManagementView() + .environment(AuthService()) + } } From 0e532d07ba23769a46528b43b37255b32b875d42 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 15:22:22 +0000 Subject: [PATCH 22/38] fix: mfa enrolment View --- .../Sources/Views/MFAEnrolmentView.swift | 300 ++++++++++-------- .../Sources/Views/MFAManagementView.swift | 2 +- 2 files changed, 170 insertions(+), 132 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift index 76bcd5152b..61716d8605 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift @@ -13,6 +13,7 @@ // limitations under the License. import FirebaseAuth +import FirebaseAuthUIComponents import FirebaseCore import SwiftUI @@ -182,9 +183,9 @@ public struct MFAEnrolmentView { extension MFAEnrolmentView: View { public var body: some View { - VStack(spacing: 16) { + VStack(spacing: 24) { // Header - VStack { + VStack(spacing: 8) { Text("Set Up Two-Factor Authentication") .font(.largeTitle) .fontWeight(.bold) @@ -195,7 +196,6 @@ extension MFAEnrolmentView: View { .foregroundColor(.secondary) .multilineTextAlignment(.center) } - .padding() // Factor Type Selection (only if no session started) if currentSession == nil { @@ -216,7 +216,6 @@ extension MFAEnrolmentView: View { .foregroundColor(.secondary) .multilineTextAlignment(.center) } - .padding(.horizontal) .accessibilityIdentifier("mfa-disabled-message") } else if allowedFactorTypes.isEmpty { VStack(spacing: 12) { @@ -233,7 +232,6 @@ extension MFAEnrolmentView: View { .foregroundColor(.secondary) .multilineTextAlignment(.center) } - .padding(.horizontal) .accessibilityIdentifier("no-factors-message") } else { VStack(alignment: .leading, spacing: 12) { @@ -253,7 +251,6 @@ extension MFAEnrolmentView: View { .pickerStyle(.segmented) .accessibilityIdentifier("factor-type-picker") } - .padding(.horizontal) } } @@ -264,8 +261,9 @@ extension MFAEnrolmentView: View { initialContent } } - .padding(.horizontal, 16) - .padding(.vertical, 20) + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + .safeAreaPadding() + .navigationTitle("Two-Factor Authentication") .onAppear { // Initialize selected factor type to first allowed type if !allowedFactorTypes.contains(selectedFactorType), @@ -277,46 +275,45 @@ extension MFAEnrolmentView: View { @ViewBuilder private var initialContent: some View { - VStack(spacing: 12) { + VStack(spacing: 24) { // Description based on selected type - Group { - if selectedFactorType == .sms { - VStack(spacing: 8) { - Image(systemName: "message.circle") - .font(.system(size: 40)) - .foregroundColor(.blue) - - Text("SMS Authentication") - .font(.title2) - .fontWeight(.semibold) - - Text("We'll send a verification code to your phone number each time you sign in.") - .font(.body) - .foregroundColor(.secondary) - .multilineTextAlignment(.center) - } - } else { - VStack(spacing: 8) { - Image(systemName: "qrcode") - .font(.system(size: 40)) - .foregroundColor(.green) + if selectedFactorType == .sms { + VStack(spacing: 8) { + Image(systemName: "message.circle") + .font(.system(size: 40)) + .foregroundColor(.blue) - Text("Authenticator App") - .font(.title2) - .fontWeight(.semibold) + Text("SMS Authentication") + .font(.title2) + .fontWeight(.semibold) - Text( - "Use an authenticator app like Google Authenticator or Authy to generate verification codes." - ) + Text("We'll send a verification code to your phone number each time you sign in.") .font(.body) .foregroundColor(.secondary) .multilineTextAlignment(.center) - } + } + } else { + VStack(spacing: 8) { + Image(systemName: "qrcode") + .font(.system(size: 40)) + .foregroundColor(.green) + + Text("Authenticator App") + .font(.title2) + .fontWeight(.semibold) + + Text( + "Use an authenticator app like Google Authenticator or Authy to generate verification codes." + ) + .font(.body) + .foregroundColor(.secondary) + .multilineTextAlignment(.center) } } - .padding(.horizontal) - Button(action: startEnrollment) { + Button { + startEnrollment() + } label: { HStack { if isLoading { ProgressView() @@ -324,14 +321,13 @@ extension MFAEnrolmentView: View { } Text("Get Started") } + .padding(.vertical, 8) .frame(maxWidth: .infinity) - .padding() - .background(canStartEnrollment ? Color.blue : Color.gray) - .foregroundColor(.white) - .cornerRadius(8) } + .buttonStyle(.borderedProminent) .disabled(!canStartEnrollment) - .padding(.horizontal) + .padding([.top, .bottom], 8) + .frame(maxWidth: .infinity) .accessibilityIdentifier("start-enrollment-button") } } @@ -348,37 +344,51 @@ extension MFAEnrolmentView: View { @ViewBuilder private func smsEnrollmentContent(session: EnrollmentSession) -> some View { - VStack(spacing: 20) { + VStack(spacing: 24) { // SMS enrollment steps if session.status == .initiated { - VStack(spacing: 16) { - Image(systemName: "phone") - .font(.system(size: 48)) - .foregroundColor(.blue) - - Text("Enter Your Phone Number") - .font(.title2) - .fontWeight(.semibold) + VStack(spacing: 24) { + VStack(spacing: 8) { + Image(systemName: "phone") + .font(.system(size: 48)) + .foregroundColor(.blue) - Text("We'll send a verification code to this number") - .font(.body) - .foregroundColor(.secondary) - .multilineTextAlignment(.center) + Text("Enter Your Phone Number") + .font(.title2) + .fontWeight(.semibold) - TextField("Phone Number", text: $phoneNumber) - .textFieldStyle(.roundedBorder) - .keyboardType(.phonePad) - .focused($focus, equals: .phoneNumber) - .accessibilityIdentifier("phone-number-field") - .padding(.horizontal) + Text("We'll send a verification code to this number") + .font(.body) + .foregroundColor(.secondary) + .multilineTextAlignment(.center) + } - TextField("Display Name", text: $displayName) - .textFieldStyle(.roundedBorder) - .focused($focus, equals: nil) - .accessibilityIdentifier("display-name-field") - .padding(.horizontal) + AuthTextField( + text: $phoneNumber, + localizedTitle: "Phone Number", + prompt: "Enter phone number", + keyboardType: .phonePad, + contentType: .telephoneNumber, + leading: { + Image(systemName: "phone") + } + ) + .focused($focus, equals: .phoneNumber) + .accessibilityIdentifier("phone-number-field") + + AuthTextField( + text: $displayName, + localizedTitle: "Display Name", + prompt: "Enter display name for this device", + leading: { + Image(systemName: "person") + } + ) + .accessibilityIdentifier("display-name-field") - Button(action: sendSMSVerification) { + Button { + sendSMSVerification() + } label: { HStack { if isLoading { ProgressView() @@ -386,39 +396,48 @@ extension MFAEnrolmentView: View { } Text("Send Code") } + .padding(.vertical, 8) .frame(maxWidth: .infinity) - .padding() - .background(canSendSMSVerification ? Color.blue : Color.gray) - .foregroundColor(.white) - .cornerRadius(8) } + .buttonStyle(.borderedProminent) .disabled(!canSendSMSVerification) - .padding(.horizontal) + .padding([.top, .bottom], 8) + .frame(maxWidth: .infinity) .accessibilityIdentifier("send-sms-button") } } else if session.status == .verificationSent { - VStack(spacing: 16) { - Image(systemName: "checkmark.message") - .font(.system(size: 48)) - .foregroundColor(.green) + VStack(spacing: 24) { + VStack(spacing: 8) { + Image(systemName: "checkmark.message") + .font(.system(size: 48)) + .foregroundColor(.green) - Text("Enter Verification Code") - .font(.title2) - .fontWeight(.semibold) + Text("Enter Verification Code") + .font(.title2) + .fontWeight(.semibold) - Text("We sent a code to \(session.phoneNumber ?? "your phone")") - .font(.body) - .foregroundColor(.secondary) - .multilineTextAlignment(.center) + Text("We sent a code to \(session.phoneNumber ?? "your phone")") + .font(.body) + .foregroundColor(.secondary) + .multilineTextAlignment(.center) + } - TextField("Verification Code", text: $verificationCode) - .textFieldStyle(.roundedBorder) - .keyboardType(.numberPad) - .focused($focus, equals: .verificationCode) - .accessibilityIdentifier("verification-code-field") - .padding(.horizontal) + AuthTextField( + text: $verificationCode, + localizedTitle: "Verification Code", + prompt: "Enter 6-digit code", + keyboardType: .numberPad, + contentType: .oneTimeCode, + leading: { + Image(systemName: "number") + } + ) + .focused($focus, equals: .verificationCode) + .accessibilityIdentifier("verification-code-field") - Button(action: completeEnrollment) { + Button { + completeEnrollment() + } label: { HStack { if isLoading { ProgressView() @@ -426,20 +445,25 @@ extension MFAEnrolmentView: View { } Text("Complete Setup") } + .padding(.vertical, 8) .frame(maxWidth: .infinity) - .padding() - .background(canCompleteEnrollment ? Color.blue : Color.gray) - .foregroundColor(.white) - .cornerRadius(8) } + .buttonStyle(.borderedProminent) .disabled(!canCompleteEnrollment) - .padding(.horizontal) + .padding([.top, .bottom], 8) + .frame(maxWidth: .infinity) .accessibilityIdentifier("complete-enrollment-button") - Button("Resend Code") { + Button { sendSMSVerification() + } label: { + Text("Resend Code") + .padding(.vertical, 8) + .frame(maxWidth: .infinity) } - .foregroundColor(.blue) + .buttonStyle(.bordered) + .padding([.top, .bottom], 8) + .frame(maxWidth: .infinity) .accessibilityIdentifier("resend-code-button") } } @@ -448,21 +472,23 @@ extension MFAEnrolmentView: View { @ViewBuilder private func totpEnrollmentContent(session: EnrollmentSession) -> some View { - VStack(spacing: 20) { + VStack(spacing: 24) { if let totpInfo = session.totpInfo { - VStack(spacing: 16) { - Image(systemName: "qrcode") - .font(.system(size: 48)) - .foregroundColor(.green) + VStack(spacing: 24) { + VStack(spacing: 8) { + Image(systemName: "qrcode") + .font(.system(size: 48)) + .foregroundColor(.green) - Text("Scan QR Code") - .font(.title2) - .fontWeight(.semibold) + Text("Scan QR Code") + .font(.title2) + .fontWeight(.semibold) - Text("Scan with your authenticator app or tap to open directly") - .font(.body) - .foregroundColor(.secondary) - .multilineTextAlignment(.center) + Text("Scan with your authenticator app or tap to open directly") + .font(.body) + .foregroundColor(.secondary) + .multilineTextAlignment(.center) + } // QR Code generated from the otpauth:// URI if let qrURL = totpInfo.qrCodeURL, @@ -505,10 +531,10 @@ extension MFAEnrolmentView: View { ) } - Text("Manual Entry Key:") - .font(.headline) - VStack(spacing: 8) { + Text("Manual Entry Key:") + .font(.headline) + Button(action: { copyToClipboard(totpInfo.sharedSecretKey) }) { @@ -539,19 +565,32 @@ extension MFAEnrolmentView: View { } .animation(.easeInOut(duration: 0.2), value: showCopiedFeedback) - TextField("Display Name", text: $displayName) - .textFieldStyle(.roundedBorder) - .accessibilityIdentifier("display-name-field") - .padding(.horizontal) - - TextField("Enter Code from App", text: $totpCode) - .textFieldStyle(.roundedBorder) - .keyboardType(.numberPad) - .focused($focus, equals: .totpCode) - .accessibilityIdentifier("totp-code-field") - .padding(.horizontal) + AuthTextField( + text: $displayName, + localizedTitle: "Display Name", + prompt: "Enter display name for this authenticator", + leading: { + Image(systemName: "person") + } + ) + .accessibilityIdentifier("display-name-field") + + AuthTextField( + text: $totpCode, + localizedTitle: "Verification Code", + prompt: "Enter code from app", + keyboardType: .numberPad, + contentType: .oneTimeCode, + leading: { + Image(systemName: "number") + } + ) + .focused($focus, equals: .totpCode) + .accessibilityIdentifier("totp-code-field") - Button(action: completeEnrollment) { + Button { + completeEnrollment() + } label: { HStack { if isLoading { ProgressView() @@ -559,14 +598,13 @@ extension MFAEnrolmentView: View { } Text("Complete Setup") } + .padding(.vertical, 8) .frame(maxWidth: .infinity) - .padding() - .background(canCompleteEnrollment ? Color.blue : Color.gray) - .foregroundColor(.white) - .cornerRadius(8) } + .buttonStyle(.borderedProminent) .disabled(!canCompleteEnrollment) - .padding(.horizontal) + .padding([.top, .bottom], 8) + .frame(maxWidth: .infinity) .accessibilityIdentifier("complete-enrollment-button") } } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift index 1c5770d4fd..714fc4b0be 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift @@ -136,7 +136,7 @@ extension MFAManagementView: View { Spacer() } .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) - .safeAreaPadding() + .safeAreaPadding() .onAppear { loadEnrolledFactors() } From ad4a0f63fe2e400b794798ebd8c5392fa781ce5b Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 15:29:33 +0000 Subject: [PATCH 23/38] fix: mfa enrolment phone number --- .../Sources/Views/MFAEnrolmentView.swift | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift index 61716d8605..769284681d 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift @@ -29,6 +29,7 @@ public struct MFAEnrolmentView { @State private var selectedFactorType: SecondFactorType = .sms @State private var phoneNumber = "" + @State private var selectedCountry: CountryData = .default @State private var verificationCode = "" @State private var totpCode = "" @State private var currentSession: EnrollmentSession? @@ -96,9 +97,10 @@ public struct MFAEnrolmentView { isLoading = true defer { isLoading = false } + let fullPhoneNumber = selectedCountry.dialCode + phoneNumber let verificationId = try await authService.sendSmsVerificationForEnrollment( session: session, - phoneNumber: phoneNumber + phoneNumber: fullPhoneNumber ) // Update session status currentSession = EnrollmentSession( @@ -106,7 +108,7 @@ public struct MFAEnrolmentView { type: session.type, session: session.session, totpInfo: session.totpInfo, - phoneNumber: phoneNumber, + phoneNumber: fullPhoneNumber, verificationId: verificationId, status: .verificationSent, createdAt: session.createdAt, @@ -140,6 +142,7 @@ public struct MFAEnrolmentView { private func resetForm() { currentSession = nil phoneNumber = "" + selectedCountry = .default verificationCode = "" totpCode = "" displayName = "" @@ -369,10 +372,13 @@ extension MFAEnrolmentView: View { prompt: "Enter phone number", keyboardType: .phonePad, contentType: .telephoneNumber, - leading: { - Image(systemName: "phone") - } - ) + onChange: { _ in } + ) { + CountrySelector( + selectedCountry: $selectedCountry, + enabled: !isLoading + ) + } .focused($focus, equals: .phoneNumber) .accessibilityIdentifier("phone-number-field") From cf5a6cced0617b689058170e32da2fc15d5723aa Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 16:10:59 +0000 Subject: [PATCH 24/38] fix: ensure everything can fit on the page --- .../Sources/Views/MFAEnrolmentView.swift | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift index 769284681d..f53da9da72 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAEnrolmentView.swift @@ -187,17 +187,19 @@ public struct MFAEnrolmentView { extension MFAEnrolmentView: View { public var body: some View { VStack(spacing: 24) { - // Header - VStack(spacing: 8) { - Text("Set Up Two-Factor Authentication") - .font(.largeTitle) - .fontWeight(.bold) - .multilineTextAlignment(.center) + // Header (only shown when no session is active) + if currentSession == nil { + VStack(spacing: 8) { + Text("Set Up Two-Factor Authentication") + .font(.largeTitle) + .fontWeight(.bold) + .multilineTextAlignment(.center) - Text("Add an extra layer of security to your account") - .font(.subheadline) - .foregroundColor(.secondary) - .multilineTextAlignment(.center) + Text("Add an extra layer of security to your account") + .font(.subheadline) + .foregroundColor(.secondary) + .multilineTextAlignment(.center) + } } // Factor Type Selection (only if no session started) @@ -478,12 +480,12 @@ extension MFAEnrolmentView: View { @ViewBuilder private func totpEnrollmentContent(session: EnrollmentSession) -> some View { - VStack(spacing: 24) { + VStack(spacing: 16) { if let totpInfo = session.totpInfo { - VStack(spacing: 24) { - VStack(spacing: 8) { + VStack(spacing: 16) { + VStack(spacing: 6) { Image(systemName: "qrcode") - .font(.system(size: 48)) + .font(.system(size: 40)) .foregroundColor(.green) Text("Scan QR Code") @@ -494,6 +496,8 @@ extension MFAEnrolmentView: View { .font(.body) .foregroundColor(.secondary) .multilineTextAlignment(.center) + .lineLimit(nil) + .padding(.horizontal) } // QR Code generated from the otpauth:// URI @@ -502,12 +506,12 @@ extension MFAEnrolmentView: View { Button(action: { UIApplication.shared.open(qrURL) }) { - VStack(spacing: 12) { + VStack(spacing: 8) { Image(uiImage: qrImage) .interpolation(.none) .resizable() .aspectRatio(contentMode: .fit) - .frame(width: 200, height: 200) + .frame(width: 180, height: 180) .accessibilityIdentifier("qr-code-image") HStack(spacing: 6) { @@ -525,7 +529,7 @@ extension MFAEnrolmentView: View { } else { RoundedRectangle(cornerRadius: 8) .fill(Color.gray.opacity(0.3)) - .frame(width: 200, height: 200) + .frame(width: 180, height: 180) .overlay( VStack { Image(systemName: "exclamationmark.triangle") @@ -537,7 +541,7 @@ extension MFAEnrolmentView: View { ) } - VStack(spacing: 8) { + VStack(spacing: 6) { Text("Manual Entry Key:") .font(.headline) From 815d8cabc2547129ee242dc3b94cee2c6a1a1460 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 16:38:46 +0000 Subject: [PATCH 25/38] fix: delete account confirmation sheet --- .../Sources/Views/SignedInView.swift | 85 +++++++++++++++++-- 1 file changed, 78 insertions(+), 7 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift index 0472511909..9285f9ba79 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift @@ -18,6 +18,7 @@ import SwiftUI @MainActor public struct SignedInView { @Environment(AuthService.self) private var authService + @State private var showDeleteConfirmation = false } extension SignedInView: View { @@ -63,38 +64,108 @@ extension SignedInView: View { .buttonStyle(.borderedProminent) .accessibilityIdentifier("mfa-management-button") Button(action: { - Task { - try? await authService.signOut() - } + showDeleteConfirmation = true }) { - Text(authService.string.signOutButtonLabel) + Text(authService.string.deleteAccountButtonLabel) .padding(.vertical, 8) .frame(maxWidth: .infinity) } .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) .buttonStyle(.borderedProminent) - .accessibilityIdentifier("sign-out-button") + .accessibilityIdentifier("delete-account-button") Button(action: { Task { - try? await authService.deleteUser() + try? await authService.signOut() } }) { - Text(authService.string.deleteAccountButtonLabel) + Text(authService.string.signOutButtonLabel) .padding(.vertical, 8) .frame(maxWidth: .infinity) } .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) .buttonStyle(.borderedProminent) + .accessibilityIdentifier("sign-out-button") } .safeAreaPadding() + .sheet(isPresented: $showDeleteConfirmation) { + DeleteAccountConfirmationSheet( + onConfirm: { + showDeleteConfirmation = false + Task { + try? await authService.deleteUser() + } + }, + onCancel: { + showDeleteConfirmation = false + } + ) + .presentationDetents([.medium]) + } .sheet(isPresented: isShowingPasswordPrompt) { PasswordPromptSheet(coordinator: authService.passwordPrompt) } } } +private struct DeleteAccountConfirmationSheet: View { + @Environment(AuthService.self) private var authService + let onConfirm: () -> Void + let onCancel: () -> Void + + var body: some View { + VStack(spacing: 24) { + VStack(spacing: 12) { + Image(systemName: "exclamationmark.triangle.fill") + .font(.system(size: 60)) + .foregroundColor(.red) + + Text("Delete Account?") + .font(.title) + .fontWeight(.bold) + + Text( + "This action cannot be undone. All your data will be permanently deleted. You may need to reauthenticate to complete this action." + ) + .font(.body) + .foregroundColor(.secondary) + .multilineTextAlignment(.center) + .padding(.horizontal) + } + + VStack(spacing: 12) { + Button { + onConfirm() + } label: { + Text("Delete Account") + .padding(.vertical, 8) + .frame(maxWidth: .infinity) + } + .buttonStyle(.borderedProminent) + .tint(.red) + .padding([.top, .bottom], 8) + .frame(maxWidth: .infinity) + .accessibilityIdentifier("confirm-delete-button") + + Button { + onCancel() + } label: { + Text("Cancel") + .padding(.vertical, 8) + .frame(maxWidth: .infinity) + } + .buttonStyle(.bordered) + .padding([.top, .bottom], 8) + .frame(maxWidth: .infinity) + .accessibilityIdentifier("cancel-delete-button") + } + } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + .safeAreaPadding() + } +} + #Preview { FirebaseOptions.dummyConfigurationForPreview() return SignedInView() From 7285f12cce906c328d06fd00199d9a39aa87d757 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 16:52:47 +0000 Subject: [PATCH 26/38] refactor: remove signedInCredential and used persisted tokenresult to get provider --- .../Sources/Services/AuthService.swift | 49 +++++++++++++------ .../FirebaseSwiftUIExampleTests.swift | 6 --- 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift index 1480d658d7..8d2a75f75d 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift @@ -135,12 +135,10 @@ public final class AuthService { public let passwordPrompt: PasswordPromptCoordinator = .init() public var currentMFARequired: MFARequired? private var currentMFAResolver: MultiFactorResolver? - private var pendingMFACredential: AuthCredential? // MARK: - Provider APIs private var listenerManager: AuthListenerManager? - public var signedInCredential: AuthCredential? var emailSignInEnabled = false @@ -251,7 +249,6 @@ public final class AuthService { } do { let result = try await currentUser?.link(with: credentials) - signedInCredential = credentials updateAuthenticationState() return .signedIn(result) } catch let error as NSError { @@ -275,7 +272,6 @@ public final class AuthService { return try await handleAutoUpgradeAnonymousUser(credentials: credentials) } else { let result = try await auth.signIn(with: credentials) - signedInCredential = result.credential ?? credentials updateAuthenticationState() return .signedIn(result) } @@ -285,8 +281,6 @@ public final class AuthService { if error.code == AuthErrorCode.secondFactorRequired.rawValue { if let resolver = error .userInfo[AuthErrorUserInfoMultiFactorResolverKey] as? MultiFactorResolver { - // Preserve the original credential for use after MFA resolution - pendingMFACredential = credentials return handleMFARequiredError(resolver: resolver) } } else { @@ -375,7 +369,6 @@ public extension AuthService { return try await handleAutoUpgradeAnonymousUser(credentials: credential) } else { let result = try await auth.createUser(withEmail: email, password: password) - signedInCredential = result.credential updateAuthenticationState() return .signedIn(result) } @@ -752,12 +745,41 @@ public extension AuthService { } } - func reauthenticateCurrentUser(on user: User) async throws { - guard let providerId = signedInCredential?.provider else { - throw AuthServiceError - .reauthenticationRequired("Recent login required to perform this operation.") + /// Gets the provider ID that was used for the current sign-in session + private func getCurrentSignInProvider() async throws -> String { + guard let user = currentUser else { + throw AuthServiceError.noCurrentUser } + // Get the ID token result which contains the signInProvider claim + let tokenResult = try await user.getIDTokenResult(forcingRefresh: false) + + // The signInProvider property tells us which provider was used for this session + let signInProvider = tokenResult.signInProvider + + // If signInProvider is not empty, use it + if !signInProvider.isEmpty { + return signInProvider + } + + // Fallback: if signInProvider is empty, try to infer from providerData + // Prefer non-password providers as they're more specific + let providerId = user.providerData.first(where: { $0.providerID != "password" })?.providerID + ?? user.providerData.first?.providerID + + guard let providerId = providerId else { + throw AuthServiceError.reauthenticationRequired( + "Unable to determine sign-in provider for reauthentication" + ) + } + + return providerId + } + + func reauthenticateCurrentUser(on user: User) async throws { + // Get the provider from the token instead of stored credential + let providerId = try await getCurrentSignInProvider() + if providerId == EmailAuthProviderID { guard let email = user.email else { throw AuthServiceError.invalidCredentials("User does not have an email address") @@ -919,16 +941,11 @@ public extension AuthService { do { let result = try await resolver.resolveSignIn(with: assertion) - - // After MFA resolution, result.credential is nil, so restore the original credential - // that was used before MFA was triggered - signedInCredential = result.credential ?? pendingMFACredential updateAuthenticationState() // Clear MFA resolution state currentMFARequired = nil currentMFAResolver = nil - pendingMFACredential = nil } catch { throw AuthServiceError diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleTests/FirebaseSwiftUIExampleTests.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleTests/FirebaseSwiftUIExampleTests.swift index 4bf18e9345..a868271d3e 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleTests/FirebaseSwiftUIExampleTests.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleTests/FirebaseSwiftUIExampleTests.swift @@ -103,7 +103,6 @@ struct FirebaseSwiftUIExampleTests { #expect(service.authenticationState == .unauthenticated) #expect(service.authView == .authPicker) #expect(service.currentError == nil) - #expect(service.signedInCredential == nil) #expect(service.currentUser == nil) try await service.createUser(email: createEmail(), password: kPassword) @@ -139,7 +138,6 @@ struct FirebaseSwiftUIExampleTests { #expect(service.currentUser == nil) #expect(service.authView == .authPicker) #expect(service.currentError == nil) - #expect(service.signedInCredential == nil) try await service.signIn(email: email, password: kPassword) @@ -152,10 +150,6 @@ struct FirebaseSwiftUIExampleTests { service.currentUser != nil } #expect(service.currentUser != nil) - try await waitForStateChange { - service.signedInCredential != nil - } - #expect(service.signedInCredential != nil) #expect(service.authView == .authPicker) #expect(service.currentError == nil) } From ffc8436ae5a2a5efe2646c97c3314160d6048222 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 17:05:09 +0000 Subject: [PATCH 27/38] refactor: send email view to match UI and remove surplus file --- .../Sources/Utils/StringUtils.swift | 4 +- .../Sources/Views/SignedInView.swift | 71 +++++++++++++++---- .../Sources/Views/VerifyEmailView.swift | 65 ----------------- 3 files changed, 60 insertions(+), 80 deletions(-) delete mode 100644 FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/StringUtils.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/StringUtils.swift index 4b1e71b7a5..8b26f1f34c 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/StringUtils.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Utils/StringUtils.swift @@ -217,14 +217,14 @@ public class StringUtils { /// Account settings - send email verification label /// found in: - /// VerifyEmailView + /// SignedInView public var sendEmailVerificationButtonLabel: String { return localizedString(for: "Verify email address?") } /// Account settings - verify email sheet message /// found in: - /// VerifyEmailView + /// SignedInView public var verifyEmailSheetMessage: String { return localizedString(for: "Verification email sent") } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift index 9285f9ba79..50b672fe6e 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift @@ -19,6 +19,16 @@ import SwiftUI public struct SignedInView { @Environment(AuthService.self) private var authService @State private var showDeleteConfirmation = false + @State private var showEmailVerificationSent = false + + private func sendEmailVerification() async { + do { + try await authService.sendEmailVerification() + showEmailVerificationSent = true + } catch { + // Error already displayed via modal by AuthService + } + } } extension SignedInView: View { @@ -40,52 +50,68 @@ extension SignedInView: View { "\(authService.currentUser?.email ?? authService.currentUser?.displayName ?? "Unknown")" ) if authService.currentUser?.isEmailVerified == false { - VerifyEmailView() + Button { + Task { + await sendEmailVerification() + } + } label: { + Text(authService.string.sendEmailVerificationButtonLabel) + .padding(.vertical, 8) + .frame(maxWidth: .infinity) + } + .buttonStyle(.borderedProminent) + .padding([.top, .bottom], 8) + .frame(maxWidth: .infinity) + .accessibilityIdentifier("verify-email-button") } - Button(action: { + Button { authService.navigator.push(.updatePassword) - }) { + } label: { Text(authService.string.updatePasswordButtonLabel) .padding(.vertical, 8) .frame(maxWidth: .infinity) } + .buttonStyle(.borderedProminent) .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) - .buttonStyle(.borderedProminent) - Button(action: { + .accessibilityIdentifier("update-password-button") + + Button { authService.navigator.push(.mfaManagement) - }) { + } label: { Text("Manage Two-Factor Authentication") .padding(.vertical, 8) .frame(maxWidth: .infinity) } + .buttonStyle(.borderedProminent) .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) - .buttonStyle(.borderedProminent) .accessibilityIdentifier("mfa-management-button") - Button(action: { + + Button { showDeleteConfirmation = true - }) { + } label: { Text(authService.string.deleteAccountButtonLabel) .padding(.vertical, 8) .frame(maxWidth: .infinity) } + .buttonStyle(.borderedProminent) .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) - .buttonStyle(.borderedProminent) .accessibilityIdentifier("delete-account-button") - Button(action: { + + Button { Task { try? await authService.signOut() } - }) { + } label: { Text(authService.string.signOutButtonLabel) .padding(.vertical, 8) .frame(maxWidth: .infinity) } + .buttonStyle(.borderedProminent) .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) - .buttonStyle(.borderedProminent) .accessibilityIdentifier("sign-out-button") } .safeAreaPadding() @@ -106,6 +132,25 @@ extension SignedInView: View { .sheet(isPresented: isShowingPasswordPrompt) { PasswordPromptSheet(coordinator: authService.passwordPrompt) } + .sheet(isPresented: $showEmailVerificationSent) { + VStack(spacing: 24) { + Text(authService.string.verifyEmailSheetMessage) + .font(.headline) + Button { + showEmailVerificationSent = false + } label: { + Text(authService.string.okButtonLabel) + .padding(.vertical, 8) + .frame(maxWidth: .infinity) + } + .buttonStyle(.borderedProminent) + .padding([.top, .bottom], 8) + .frame(maxWidth: .infinity) + } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + .safeAreaPadding() + .presentationDetents([.medium]) + } } } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift deleted file mode 100644 index 724d1480f3..0000000000 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/VerifyEmailView.swift +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2025 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import FirebaseCore -import SwiftUI - -public struct VerifyEmailView { - @Environment(AuthService.self) private var authService - @State private var showModal = false - - private func sendEmailVerification() async { - do { - try await authService.sendEmailVerification() - showModal = true - } catch { - // Error already displayed via modal by AuthService - } - } -} - -extension VerifyEmailView: View { - public var body: some View { - VStack { - Button(action: { - Task { - await sendEmailVerification() - } - }) { - Text(authService.string.sendEmailVerificationButtonLabel) - .padding(.vertical, 8) - .frame(maxWidth: .infinity) - } - .padding([.top, .bottom, .horizontal], 8) - .frame(maxWidth: .infinity) - .buttonStyle(.borderedProminent) - }.sheet(isPresented: $showModal) { - VStack { - Text(authService.string.verifyEmailSheetMessage) - .font(.headline) - Button(authService.string.okButtonLabel) { - showModal = false - } - .padding() - } - .padding() - } - } -} - -#Preview { - FirebaseOptions.dummyConfigurationForPreview() - return VerifyEmailView() - .environment(AuthService()) -} From cd9f261433f1c4561f06ecbe1dfaaa408133673f Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 17:05:24 +0000 Subject: [PATCH 28/38] format --- .../FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift index 50b672fe6e..9631568545 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift @@ -20,7 +20,7 @@ public struct SignedInView { @Environment(AuthService.self) private var authService @State private var showDeleteConfirmation = false @State private var showEmailVerificationSent = false - + private func sendEmailVerification() async { do { try await authService.sendEmailVerification() @@ -75,7 +75,7 @@ extension SignedInView: View { .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) .accessibilityIdentifier("update-password-button") - + Button { authService.navigator.push(.mfaManagement) } label: { @@ -87,7 +87,7 @@ extension SignedInView: View { .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) .accessibilityIdentifier("mfa-management-button") - + Button { showDeleteConfirmation = true } label: { @@ -99,7 +99,7 @@ extension SignedInView: View { .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) .accessibilityIdentifier("delete-account-button") - + Button { Task { try? await authService.signOut() From 1550af053f46cb446a62a1d279031f7530dd467d Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Fri, 31 Oct 2025 17:13:42 +0000 Subject: [PATCH 29/38] refactor: improve sheet when email link sent --- .../Sources/Views/EmailLinkView.swift | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift index 1b7aebe5cf..c86c33d64f 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/EmailLinkView.swift @@ -47,34 +47,42 @@ extension EmailLinkView: View { Image(systemName: "at") } ) - Button(action: { + Button { Task { await sendEmailLink() authService.emailLink = email } - }) { + } label: { Text(authService.string.sendEmailLinkButtonLabel) .padding(.vertical, 8) .frame(maxWidth: .infinity) } + .buttonStyle(.borderedProminent) .disabled(!CommonUtils.isValidEmail(email)) .padding([.top, .bottom], 8) .frame(maxWidth: .infinity) - .buttonStyle(.borderedProminent) } .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) .navigationTitle(authService.string.signInWithEmailLinkViewTitle) .safeAreaPadding() .sheet(isPresented: $showModal) { - VStack { + VStack(spacing: 24) { Text(authService.string.signInWithEmailLinkViewMessage) - .padding() - Button(authService.string.okButtonLabel) { + .font(.headline) + Button { showModal = false + } label: { + Text(authService.string.okButtonLabel) + .padding(.vertical, 8) + .frame(maxWidth: .infinity) } - .padding() + .buttonStyle(.borderedProminent) + .padding([.top, .bottom], 8) + .frame(maxWidth: .infinity) } - .padding() + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + .safeAreaPadding() + .presentationDetents([.medium]) } .onOpenURL { url in Task { From 207f13d393119a9f0d4ef063573183b0dc96ef47 Mon Sep 17 00:00:00 2001 From: Ademola Fadumo Date: Sat, 1 Nov 2025 17:13:27 +0100 Subject: [PATCH 30/38] update facebook brand logo --- .../Sources/Strings/Localizable.xcstrings | 15 +++++++++------ .../fui-ic-facebook.imageset/Contents.json | 6 +++--- .../fui_ic_facebook_icon.png | Bin 0 -> 5150 bytes .../fui_ic_facebook_icon_x2.png | Bin 0 -> 10981 bytes .../fui_ic_facebook_icon_x3.png | Bin 0 -> 17252 bytes .../fui_ic_facebook_white_22dp 1.png | Bin 5231 -> 0 bytes .../fui_ic_facebook_white_22dp 2.png | Bin 2524 -> 0 bytes .../fui_ic_facebook_white_22dp.png | Bin 8550 -> 0 bytes .../Sources/Theme/ProviderStyle.swift | 2 +- .../project.pbxproj | 8 ++++---- .../xcschemes/FirebaseSwiftUIExample.xcscheme | 2 +- .../FirebaseSwiftUIExample/Info.plist | 4 ++-- 12 files changed, 20 insertions(+), 17 deletions(-) create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_icon.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_icon_x2.png create mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_icon_x3.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 1.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 2.png delete mode 100644 FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp.png diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings index 76a082c2a7..7d686924a6 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Strings/Localizable.xcstrings @@ -174,9 +174,6 @@ } } } - }, - "as:" : { - }, "Authentication Method" : { @@ -315,6 +312,12 @@ } } } + }, + "Delete Account" : { + + }, + "Delete Account?" : { + }, "DeleteAccountBody" : { "comment" : "Alert message body shown to confirm account deletion action.", @@ -493,9 +496,6 @@ }, "Enter 6-digit code" : { - }, - "Enter Code from App" : { - }, "Enter the 6-digit code from your authenticator app" : { @@ -1097,6 +1097,9 @@ } } } + }, + "This action cannot be undone. All your data will be permanently deleted. You may need to reauthenticate to complete this action." : { + }, "TroubleGettingEmailMessage" : { "comment" : "Alert message displayed when user having trouble getting email.", diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/Contents.json b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/Contents.json index a220841ee5..daff137156 100644 --- a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/Contents.json +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "fui_ic_facebook_white_22dp 2.png", + "filename" : "fui_ic_facebook_icon.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "fui_ic_facebook_white_22dp 1.png", + "filename" : "fui_ic_facebook_icon_x2.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "fui_ic_facebook_white_22dp.png", + "filename" : "fui_ic_facebook_icon_x3.png", "idiom" : "universal", "scale" : "3x" } diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_icon.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b8562f4939fcdcc76308c82b7f12c669938d903b GIT binary patch literal 5150 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 DAu`4x literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_icon_x2.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_icon_x2.png new file mode 100644 index 0000000000000000000000000000000000000000..deb223d3f1eff83d048624c838cbb5a732b08e03 GIT binary patch literal 10981 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 Xu>7xG8OpJ6?Lii1)(2Q7w5b0FomQ{O literal 0 HcmV?d00001 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 1.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 1.png deleted file mode 100644 index fb5d39e09bbb3bca79bdb9d0fd9a1ea83534df88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5231 zcmeHLc{tQ>*T2VD5=NznqEthh3|X^hs}RYOE&HC3!I)$w6q0x1 zBuiwFWyX@9oh;A&^}K&P*ZcnS{PX_vd*8XPx$g5lpL5QA?&X|w-*=qZSwn%%Vw(W~ z0;f;unFGL~4*x2fxFP2<<@jyb@CKZ+2?9VEi~Lci%@0gLCMw9>@FaNIyqg6-I6ZYt zbO3mj$hYFm1;BRB(|S4<1k^;YNvy+280|05$bTf^Ew^8F^QaoNzy6Wgwng;nc`rY2 z#(^6r2M*jgc4pvMM)I>7e3ch}Lh91g^WMcMP7Wm{hv-HVk>nRQ_{wCiC$!sgJBCRL zcv~ZrdG=z%0dG4>3{s%Y-72*dwRy_ zN#oq0RoJ?*w79r6{$_gElto|=by>w+BXL%%8U?7m>1>u|OT%=~4jpNin;zTLS3fPC zoeQraVmLvPLlN<;MN52XY}PX_(;ceVOKUHQluiFYgP9lB8m89$GbfE3EF$x6Wo|p6 zwJ8S;!gEE=Z_bM2HYKsx^?`o=7(gqWeLm88Kv|6>DfI-ATi@!!0~W)3*-OPfF{D`D zXV=~`NKaRm*s5XxygTF{dhPL~w`n1rk(epp&f*3%FXFkGZPtGD{ULxXHuvb`=rb(g zJqF-VHTj2#A2AZI(7@PC)+d&7B60*z5aI)A4}~nJcE`)zp0g#c&&eTp+t;-~<^8+D z-ZC5;mvI2(4tC}*1SANlV?(M?04F~5eU8V4bH9wY<*S+AEoy*<7k?)9D{d$Kl#m2N z95@-gv}nokX$x{sBYBPTCbD4nx;)Q4M-R2M{!8E^u|0aE6}L_^6QUdrxpT7<1w0CV z_}{%QQ2k^s6M(duBEgxVoD}L&PZSUcd}{lBc_7;tEj#OfG>gBeFsAo zMxzbK0Wh)fga^y93~E z#-}QkYj!MWS!*pRyo^}!zWuz^-x@zZSvB-K1v9yxS$DCPRn#8>$6jG^a+qCTcSo>! z-QV86FScwhp)jdyt!HuFv?8K!d*-!j*L8}+YL=10MD1Gj)2K{e66v=mi4+#N-rQ%o zj@g=gkBLeP!d}u;AysZpF9@7mS^nN4Qjqmv`|+rQq@QD?;kgG9VM;gWZMIw!Huyoe zh^WwrJKQo|^M@o|>_xeuQ%kL^>?+jME^#yd{9d*A9Ju&){p zw(O~u&F|HwyPoFTn+~nUp7);{_}mrWzO8)-K)tc#L(P>xhg2fitB3K;c8?EI*VT|O^ITQgJtXCe%N3#e7=E28K-EqkR$piTu=BS@y@UHoz&!&!w-vVg z@!1iPJlT@b7~?x|M&xqP_u&5W7#-^P88>qAn%yWZnpc7>deGlNPRDS+<%gQQC)SqN- zlcS??DEFe~nW8u1vX)I3XyZ^KBN_Xme*Lf1S0Uc}$sW*q#gb^QF9!&~XL{v`|A(NW z+8x?6n*B>vX+zkca@W{w7as}%Uf)P{yjriHofHe{)2hBBU0F3-wI!f3 zw_WP>wMA>xuYCk?*-T1J>5#4_oZO;I=9-Ap;c)fr?HWr?i%vuLldrtqo0Q5#4PUfr zEb-^LBBV~UFTKw-16M1k&|Vz%OPWBg3|^UA80=Y^1Jejx0%3g!vxWwLcjxm5=|MWr zIP@ZMA`=Y9KvT^@MHd<)!}dc>^ISFeQhA&sry$PSIMhj#SHkIX+9Yjdn>wur*L!^l z3uT^BUzePCE&5?B9(=zF$Idfi*S z8p>4)=R#q;&%0>o!)oB`tENX~LR^-ZzxDHOMZv7V?jo%&;4sjzS##ejQl9vkH@lbK z4P9`sxxIfu*7`c*8AqN2L#*3y3LHwCRQQ2jSdUm?>Gm$(i?K5HP2+`%0WYNq8M))7 zOW&>Qwv(3HwdCo}!_eoqJbQR4xd)9b5;d01!YBIwaAcf>R$e$%iG8+89}Qpl%2N>6 zoXU}5Fa-)j=kA$0>^$M>p4hxlxA1AM;(4|=r(i2_gy`a#BC$TErPQAD7sBuzODXlp zIqJMR)u8nwV^W*JE0I0-=C0;7ch~7s(z-}Wv6n!oH>%JYBko3QbQ?*RuG<&lwS$hP zQk1E=W6$a|#A2)`dA)=n=jVsHb-vueSN@u>gI(mQ2~3o2;hVb=bAzT)4M+ZjtPOwV zL3f{m-j#b)9anU}Cr?d=B7TF7JFO6<6u3kTVM+ykl7LMd0+m(=FjG+s*zA2?r z9>GHtGW-H+M`fzcMA~mq;^Ul%PA5G&=F$eET0GMYA@K7Pn?J$uDc1E&WJ-$A(KHOK z8EAQ!!N!aG?g}?-k^mv24Fz;QS(qfGL>n;+_NWC?w_7C90kP zm(+>lA)Rq_gHtvpQz!)&&g}S~&0FFV? z))rr=Cj_T5|Lb&(l)4FmN@dnmzj@kjhS(^nD%q(3&l=>6`@Di1x>7NjB|R4q%;hb^ zenX~PvETbJVvRK}_g|FF1ktGA8RC~yL-Mu+DQK3v>6n0@0wQ+d#3-gv3YKxRC^#~M z4FVZi2JA-+kBqDV(WKqADn&e_mvpr4f{B-w1{0wsG~mh}?-f^o8J{dCez8)`O9|nX zI9Dz~t=kPZhlZg=T<%l-jx!1{tjTgReZFrQcH2G~nQtA^MZGpprR~d|CvK)SXd~*goInZ`mRmbbhK(}^&y=&cOrwduJDSj6& z3qT+CAI>|CJsfhIR=}^Pn^r#%8FSCXW@rcKulXJaukM~}`<&SGK2{GU1a|HoPA?|b+8|0(!iz1;rHrU$|IATbYT=N#ov z3*4J2Y)7j|!&!LQmJfKqU-|?KFVs>jf#na*kt1#ZDAX_M)TtOxJwz_>DsrPDT!Nt0 zN}79hfJTS!Fai6<2T>p+$GWV6_Abr2r9Vs#0FU4AagGv7gf-Zahkw50XEQp(@jIIf z(8gz%P2`Kuy-X>7!393IG31_{iyV=5o{nqg(O(8*{_mIJ6O06^+I1%rBh&8}a)+R@@;KRx<4TmyASp$XU=sdj^A-P|4 zEdX>+oL8(Dbm4d9GVOEiza#;iM^L_SGt_b_Ns`OxY`<8z_d?{DSMU-1^{Z^=nncYLS zv#nkURLom5F)ModK?Ak_u+W1e_XthM+u?uzG0P+Pq&kz?_H_r(BG_sDvwAO2Iz|2y DxB6~5 diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 2.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp 2.png deleted file mode 100644 index 6cc6fcf3c95492e53680d03c52ed8cb34ce495b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2524 zcmc&$`BRf=68^F<96|`ftRR;=ShrI$W6#bYo9$zuTXlqa49%>QTK@@? z?T2S6-Wb+)kUZ4*F-KF~F-UCiTG4U{J^c?=Tozgq5QQMnNmt7=ZZkeuYr||t9zU`? z)G@fEY$AFqEuHE3)LQENIpj%X=+~hxv%&Sm`DEnZpi@Fjr@;H%k!1FuYf zjRk97|K{GVQE1bmF^ikmE?=um_4yKhpdlK_D5%Xr)&j|lacz#WGuAvc`@>O{ zPGZ0E$1BX)*VGMM7t9Cug5QC8K z98Zp)=yT->vnn-!sj@B@U2kuR7!Xk8?U5L3a~^C&5s~Ngr$Q0VK&f|I(teW-zFS+o^o1kVAN({j($f9L z3mZS!9jAf)V!@V2W=QKYHxp~m%^Pjh zumX0&3-!h zq>pKKD(GvAo%N5Jjf_0-F05(~uN-aSdFwkjlS7ZtvIfK2)QUCyt(eWM^4%0_kCvZX z`?vn;G9L={WZ_otam@0f*I768UGdOAgY%c?{5Kv?s-+^sOnBvo`^Q0_4}M7;Cl9tF zBKuOCmR`|^W~$gF5u3_8zj0wY$D>FA!3?Ic2`n4q{ErxE6V`;==CBUxA(;B+A|z&X z0QDllBNp!jR^>lQ^sv&gZ&gGvB_pN&O~DNg=JHt9%4Ze=Y>f=d(5o%sqyw@^M!}@VjgW@ zrHcaMLXxkn49n)mlOpCf-dNgk(Ef1hLQ-d%IFI%0B;)qM75x+1d<)c>J5d~skf7Be z_tSfduL~CVnKFs@2b#=zfx`ZzO5+d&SIxh*QX9dIqjrX05g#J+rz51nuHcWepfdst!vgnN4fBbMjA(*&iOxRoS}e zHK9e++7~5PjmVD8lq1~*3tLOw_bbLjRGfNjzH)cskQn1L4`Vj+&%Ep@u}TaSR5huU zm{NKl?>h2&W%PXW6|r^tTfOJ|C#}JfgnPveBv#sBfr(#MyAtIn|Rwx1bLR!hpG+VaubB`dX zruh)OskaG5o>))v6+rNJOp;N%s$SJm6jWlCqw(G%NX{0~F#q0*aXCj?J5`hqf$2EJ z7Ty6Y>zQ21H#Jg3jCyO!Zzs)WMlt*p5Tg^Xu8=KN&Ozt*2#K)j$<_a%+S(v047H~yr0JE6h1 zz3uM|I4z!czW70^e&Ktl(Q-Z|uP+5mamNL*yF6)^s(<(kckv%?lD}Z@|KD=Wt-fR; z>y@0Lt*($pazh7;#4EF$N%^JCX57Bih1%ZqGlu?h5qqdN0eoza(4d~~UtLV@2!=Wv%)x8!Ed zqHZlA*S)uEEXwP0tV~$zHE-J7-Km=S@m5yLct#g$2r=Zhj5ZM()iVvf%{a!k>2Siyw*Gj))&ByuN1#Fg diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp.png b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Resources/Assets.xcassets/fui-ic-facebook.imageset/fui_ic_facebook_white_22dp.png deleted file mode 100644 index 717ca815a1e02617dc50ddbaf19b6d05662f381b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8550 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 hiV(2!AN;%UVHU++UvEA 16dbbdf0cfb309034a6ad98ac2a21688 FacebookDisplayName Firebase Swift UI App + FirebaseAppDelegateProxyEnabled + LSApplicationQueriesSchemes fbapi @@ -39,7 +41,5 @@ fetch remote-notification - FirebaseAppDelegateProxyEnabled - From 54d9b33694ed0ff846340cd6096362fe6ac5132c Mon Sep 17 00:00:00 2001 From: Ademola Fadumo Date: Mon, 3 Nov 2025 09:13:23 +0100 Subject: [PATCH 31/38] add sign in with LINE example --- .../App/ContentView.swift | 9 +++++ .../ic-line-logo.imageset/Contents.json | 23 +++++++++++ .../fui-ic-line-logo-x2.png | Bin 0 -> 3092 bytes .../fui-ic-line-logo-x3.png | Bin 0 -> 4825 bytes .../fui-ic-line-logo.png | Bin 0 -> 1432 bytes .../line-button.colorset/Contents.json | 38 ++++++++++++++++++ 6 files changed, 70 insertions(+) create mode 100644 samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/Assets.xcassets/ic-line-logo.imageset/Contents.json create mode 100644 samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/Assets.xcassets/ic-line-logo.imageset/fui-ic-line-logo-x2.png create mode 100644 samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/Assets.xcassets/ic-line-logo.imageset/fui-ic-line-logo-x3.png create mode 100644 samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/Assets.xcassets/ic-line-logo.imageset/fui-ic-line-logo.png create mode 100644 samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/Assets.xcassets/line-button.colorset/Contents.json diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift index f18cc12b63..34af70a631 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift @@ -56,6 +56,15 @@ struct ContentView: View { .withOAuthSignIn(OAuthProviderSwift.github()) .withOAuthSignIn(OAuthProviderSwift.microsoft()) .withOAuthSignIn(OAuthProviderSwift.yahoo()) + .withOAuthSignIn( + OAuthProviderSwift( + providerId: "oidc.line", + displayName: "Sign in with LINE", + buttonIcon: Image(.icLineLogo), + buttonBackgroundColor: .lineButton, + buttonForegroundColor: .white + ) + ) .withEmailSignIn() } diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/Assets.xcassets/ic-line-logo.imageset/Contents.json b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/Assets.xcassets/ic-line-logo.imageset/Contents.json new file mode 100644 index 0000000000..216d35cbec --- /dev/null +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/Assets.xcassets/ic-line-logo.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "fui-ic-line-logo.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "fui-ic-line-logo-x2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "fui-ic-line-logo-x3.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/Assets.xcassets/ic-line-logo.imageset/fui-ic-line-logo-x2.png b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/Assets.xcassets/ic-line-logo.imageset/fui-ic-line-logo-x2.png new file mode 100644 index 0000000000000000000000000000000000000000..924fd4adbc54b34919ac4fde3835261e0d4239ae GIT binary patch literal 3092 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 mxr0`Cey*#lQ|^WBJ^lyYJqeJ0ENk-s0000 Date: Mon, 3 Nov 2025 09:27:02 +0100 Subject: [PATCH 32/38] use @bindable for binding observable objects --- .../Sources/Views/AuthPickerView.swift | 6 ++---- .../Sources/Views/MFAManagementView.swift | 12 +++--------- .../Sources/Views/SignedInView.swift | 10 ++-------- .../Sources/Views/UpdatePasswordView.swift | 10 ++-------- 4 files changed, 9 insertions(+), 29 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift index b9aba6cbb8..e8266cc136 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/AuthPickerView.swift @@ -92,6 +92,7 @@ extension AuthPickerView: View { @ViewBuilder var authPickerViewInternal: some View { + @Bindable var authService = authService VStack { if authService.authenticationState == .unauthenticated { authMethodPicker @@ -101,10 +102,7 @@ extension AuthPickerView: View { } } .errorAlert( - error: Binding( - get: { authService.currentError }, - set: { authService.currentError = $0 } - ), + error: $authService.currentError, okButtonLabel: authService.string.okButtonLabel ) } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift index 714fc4b0be..fcbed901a8 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/MFAManagementView.swift @@ -27,14 +27,6 @@ public struct MFAManagementView { @State private var enrolledFactors: [MultiFactorInfo] = [] @State private var isLoading = false - // Present password prompt when required for reauthentication - private var isShowingPasswordPrompt: Binding { - Binding( - get: { authService.passwordPrompt.isPromptingPassword }, - set: { authService.passwordPrompt.isPromptingPassword = $0 } - ) - } - public init() {} private func loadEnrolledFactors() { @@ -63,6 +55,7 @@ public struct MFAManagementView { extension MFAManagementView: View { public var body: some View { + @Bindable var passwordPrompt = authService.passwordPrompt VStack(spacing: 20) { // Title section VStack { @@ -140,7 +133,8 @@ extension MFAManagementView: View { .onAppear { loadEnrolledFactors() } - .sheet(isPresented: isShowingPasswordPrompt) { + // Present password prompt when required for reauthentication + .sheet(isPresented: $passwordPrompt.isPromptingPassword) { PasswordPromptSheet(coordinator: authService.passwordPrompt) } } diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift index 9631568545..2ac346b392 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/SignedInView.swift @@ -32,14 +32,8 @@ public struct SignedInView { } extension SignedInView: View { - private var isShowingPasswordPrompt: Binding { - Binding( - get: { authService.passwordPrompt.isPromptingPassword }, - set: { authService.passwordPrompt.isPromptingPassword = $0 } - ) - } - public var body: some View { + @Bindable var passwordPrompt = authService.passwordPrompt VStack { Text(authService.string.signedInTitle) .font(.largeTitle) @@ -129,7 +123,7 @@ extension SignedInView: View { ) .presentationDetents([.medium]) } - .sheet(isPresented: isShowingPasswordPrompt) { + .sheet(isPresented: $passwordPrompt.isPromptingPassword) { PasswordPromptSheet(coordinator: authService.passwordPrompt) } .sheet(isPresented: $showEmailVerificationSent) { diff --git a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift index 648230c7de..b2e7921797 100644 --- a/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift +++ b/FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Views/UpdatePasswordView.swift @@ -40,14 +40,8 @@ public struct UpdatePasswordView { } extension UpdatePasswordView: View { - private var isShowingPasswordPrompt: Binding { - Binding( - get: { authService.passwordPrompt.isPromptingPassword }, - set: { authService.passwordPrompt.isPromptingPassword = $0 } - ) - } - public var body: some View { + @Bindable var passwordPrompt = authService.passwordPrompt VStack(spacing: 24) { AuthTextField( text: $password, @@ -94,7 +88,7 @@ extension UpdatePasswordView: View { .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) .safeAreaPadding() .navigationTitle(authService.string.passwordRecoveryTitle) - .sheet(isPresented: isShowingPasswordPrompt) { + .sheet(isPresented: $passwordPrompt.isPromptingPassword) { PasswordPromptSheet(coordinator: authService.passwordPrompt) } } From 2a0dc030dd9fd88ddb9078aa388e5c19951b600f Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Mon, 3 Nov 2025 10:14:35 +0000 Subject: [PATCH 33/38] chore: update TestView --- .../FirebaseSwiftUIExample/FirebaseSwiftUIExample/TestView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/TestView.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/TestView.swift index ea1399cd02..1060bd1523 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/TestView.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/TestView.swift @@ -66,6 +66,7 @@ struct TestView: View { .withOAuthSignIn(OAuthProviderSwift.yahoo()) .withFacebookSignIn() .withEmailSignIn() + authService.isPresented = true } var body: some View { From 669360dcc8429ad5a16bc8db9f0f3a34f065801d Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Mon, 3 Nov 2025 10:16:55 +0000 Subject: [PATCH 34/38] test: fix up UI testa and format --- .../App/ContentView.swift | 16 +- .../App/FirebaseSwiftUIExampleApp.swift | 1 - .../FirebaseSwiftUIExample/TestView.swift | 4 +- .../FirebaseSwiftUIExample/UITestUtils.swift | 1 - .../FirebaseSwiftUIExampleTests.swift | 8 +- .../FirebaseSwiftUIExampleUITests.swift | 19 +- .../MFAEnrolmentUITests.swift | 126 +++++++----- .../MFAResolutionUITests.swift | 190 +++++++++--------- .../ProviderUITests.swift | 30 +-- .../TestUtils.swift | 49 +++-- 10 files changed, 242 insertions(+), 202 deletions(-) diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift index 34af70a631..899361a429 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/ContentView.swift @@ -20,14 +20,14 @@ // import AppTrackingTransparency +import FirebaseAppleSwiftUI import FirebaseAuth import FirebaseAuthSwiftUI import FirebaseFacebookSwiftUI import FirebaseGoogleSwiftUI +import FirebaseOAuthSwiftUI import FirebasePhoneAuthSwiftUI import FirebaseTwitterSwiftUI -import FirebaseAppleSwiftUI -import FirebaseOAuthSwiftUI import SwiftUI struct ContentView: View { @@ -44,7 +44,7 @@ struct ContentView: View { emailLinkSignInActionCodeSettings: actionCodeSettings, mfaEnabled: true ) - + authService = AuthService( configuration: configuration ) @@ -67,16 +67,16 @@ struct ContentView: View { ) .withEmailSignIn() } - + let authService: AuthService - + var body: some View { AuthPickerView { usersApp } .environment(authService) } - + var usersApp: some View { NavigationStack { VStack { @@ -91,7 +91,7 @@ struct ContentView: View { } else { Text("Authenticated - \(authService.currentUser?.email ?? "")") Button { - authService.isPresented = true // Reopen the sheet + authService.isPresented = true // Reopen the sheet } label: { Text("Manage Account") } @@ -111,7 +111,7 @@ struct ContentView: View { .onAppear { authService.isPresented = authService.authenticationState == .unauthenticated } - .onChange(of: authService.authenticationState) { oldValue, newValue in + .onChange(of: authService.authenticationState) { _, newValue in debugPrint("authService.authenticationState - \(newValue)") if newValue != .authenticating { authService.isPresented = newValue == .unauthenticated diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/FirebaseSwiftUIExampleApp.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/FirebaseSwiftUIExampleApp.swift index eed54632a8..735bbbb0f5 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/FirebaseSwiftUIExampleApp.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/App/FirebaseSwiftUIExampleApp.swift @@ -79,7 +79,6 @@ struct FirebaseSwiftUIExampleApp: App { var body: some Scene { WindowGroup { - // ContentViewSheetExample() if testRunner { TestView() } else { diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/TestView.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/TestView.swift index 1060bd1523..db40aa810c 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/TestView.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/TestView.swift @@ -19,14 +19,14 @@ // Created by Russell Wheatley on 23/04/2025. // +import FirebaseAppleSwiftUI import FirebaseAuth import FirebaseAuthSwiftUI import FirebaseFacebookSwiftUI import FirebaseGoogleSwiftUI +import FirebaseOAuthSwiftUI import FirebasePhoneAuthSwiftUI -import FirebaseAppleSwiftUI import FirebaseTwitterSwiftUI -import FirebaseOAuthSwiftUI import SwiftUI struct TestView: View { diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/UITestUtils.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/UITestUtils.swift index 6d9586d248..0f2f3713ee 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/UITestUtils.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/UITestUtils.swift @@ -13,4 +13,3 @@ public let testRunner = CommandLine.arguments.contains("--test-view-enabled") func signOut() throws { try Auth.auth().signOut() } - diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleTests/FirebaseSwiftUIExampleTests.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleTests/FirebaseSwiftUIExampleTests.swift index a868271d3e..408576e12a 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleTests/FirebaseSwiftUIExampleTests.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleTests/FirebaseSwiftUIExampleTests.swift @@ -101,7 +101,7 @@ struct FirebaseSwiftUIExampleTests { let service = try await prepareFreshAuthService() #expect(service.authenticationState == .unauthenticated) - #expect(service.authView == .authPicker) + #expect(service.authView == nil) #expect(service.currentError == nil) #expect(service.currentUser == nil) try await service.createUser(email: createEmail(), password: kPassword) @@ -115,7 +115,7 @@ struct FirebaseSwiftUIExampleTests { service.currentUser != nil } #expect(service.currentUser != nil) - #expect(service.authView == .authPicker) + #expect(service.authView == nil) #expect(service.currentError == nil) } @@ -136,7 +136,7 @@ struct FirebaseSwiftUIExampleTests { service.currentUser == nil } #expect(service.currentUser == nil) - #expect(service.authView == .authPicker) + #expect(service.authView == nil) #expect(service.currentError == nil) try await service.signIn(email: email, password: kPassword) @@ -150,7 +150,7 @@ struct FirebaseSwiftUIExampleTests { service.currentUser != nil } #expect(service.currentUser != nil) - #expect(service.authView == .authPicker) + #expect(service.authView == nil) #expect(service.currentError == nil) } } diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/FirebaseSwiftUIExampleUITests.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/FirebaseSwiftUIExampleUITests.swift index b134e5fb34..b824d7d1bc 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/FirebaseSwiftUIExampleUITests.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/FirebaseSwiftUIExampleUITests.swift @@ -47,11 +47,11 @@ final class FirebaseSwiftUIExampleUITests: XCTestCase { func testSignInDisplaysSignedInView() async throws { let email = createEmail() let password = "123456" - + // Create user in test runner BEFORE launching app // User will exist in emulator, but app starts unauthenticated try await createTestUser(email: email, password: password) - + // Now launch the app - it connects to emulator but isn't signed in let app = createTestApp() app.launch() @@ -94,13 +94,14 @@ final class FirebaseSwiftUIExampleUITests: XCTestCase { let passwordRecoveryButton = app.buttons["password-recovery-button"] XCTAssertTrue(passwordRecoveryButton.exists, "Password recovery button should exist") passwordRecoveryButton.tap() - let passwordRecoveryText = app.staticTexts["password-recovery-text"] + let passwordRecoveryText = app.staticTexts["Send a password recovery link to your email"] + .firstMatch XCTAssertTrue( passwordRecoveryText.waitForExistence(timeout: 10), "Password recovery text should exist after routing to PasswordRecoveryView" ) - let passwordRecoveryBackButton = app.buttons["password-recovery-back-button"] + let passwordRecoveryBackButton = app.navigationBars.buttons.element(boundBy: 0) XCTAssertTrue(passwordRecoveryBackButton.exists, "Password back button should exist") passwordRecoveryBackButton.tap() @@ -114,14 +115,14 @@ final class FirebaseSwiftUIExampleUITests: XCTestCase { XCTAssertTrue(emailLinkSignInButton.exists, "Email link sign-in button should exist") emailLinkSignInButton.tap() - let emailLinkText = app.staticTexts["email-link-title-text"] + let emailLinkText = app.staticTexts["Send a sign-in link to your email"].firstMatch XCTAssertTrue( emailLinkText.waitForExistence(timeout: 10), "Email link text should exist after pressing email link button in AuthPickerView" ) - let emailLinkBackButton = app.buttons["email-link-back-button"] + let emailLinkBackButton = app.navigationBars.buttons.element(boundBy: 0) XCTAssertTrue(emailLinkBackButton.exists, "Email link back button should exist") emailLinkBackButton.tap() @@ -176,10 +177,12 @@ final class FirebaseSwiftUIExampleUITests: XCTestCase { // Wait for the auth screen to disappear (email field should no longer exist) let emailFieldDisappeared = NSPredicate(format: "exists == false") - let expectation = XCTNSPredicateExpectation(predicate: emailFieldDisappeared, object: emailField) + let expectation = XCTNSPredicateExpectation( + predicate: emailFieldDisappeared, + object: emailField + ) let result = XCTWaiter().wait(for: [expectation], timeout: 10.0) XCTAssertEqual(result, .completed, "Email field should disappear after sign-up") - // Wait for user creation and signed-in view to appear let signedInText = app.staticTexts["signed-in-text"] diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAEnrolmentUITests.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAEnrolmentUITests.swift index 931ace293e..b3ea649757 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAEnrolmentUITests.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAEnrolmentUITests.swift @@ -31,10 +31,10 @@ final class MFAEnrollmentUITests: XCTestCase { @MainActor func testMFAManagementButtonExistsAndIsTappable() async throws { let email = createEmail() - + // Create user in test runner before launching app try await createTestUser(email: email) - + let app = createTestApp(mfaEnabled: true) app.launch() @@ -63,10 +63,10 @@ final class MFAEnrollmentUITests: XCTestCase { @MainActor func testMFAEnrollmentNavigationFromManagement() async throws { let email = createEmail() - + // Create user in test runner before launching app try await createTestUser(email: email) - + let app = createTestApp(mfaEnabled: true) app.launch() @@ -98,10 +98,10 @@ final class MFAEnrollmentUITests: XCTestCase { @MainActor func testFactorTypePickerExistsAndWorks() async throws { let email = createEmail() - + // Create user in test runner before launching app try await createTestUser(email: email) - + let app = createTestApp(mfaEnabled: true) app.launch() @@ -127,10 +127,10 @@ final class MFAEnrollmentUITests: XCTestCase { @MainActor func testStartEnrollmentButtonExistsAndWorks() async throws { let email = createEmail() - + // Create user in test runner before launching app try await createTestUser(email: email) - + let app = createTestApp(mfaEnabled: true) app.launch() @@ -167,7 +167,7 @@ final class MFAEnrollmentUITests: XCTestCase { // 1) Create user in test runner before launching app (with email verification) let email = createEmail() try await createTestUser(email: email, verifyEmail: true) - + let app = createTestApp(mfaEnabled: true) app.launch() @@ -225,7 +225,7 @@ final class MFAEnrollmentUITests: XCTestCase { verificationCodeField.tap() verificationCodeField.press(forDuration: 1.2) app.menuItems["Paste"].tap() - + // Test resend code button exists let resendButton = app.buttons["resend-code-button"] XCTAssertTrue(resendButton.exists, "Resend code button should exist") @@ -247,7 +247,10 @@ final class MFAEnrollmentUITests: XCTestCase { XCTAssertTrue(enrolledMethodsHeader.waitForExistence(timeout: 10)) // Find a "Remove" button for any enrolled factor (identifier starts with "remove-factor-") - let removeButton = app.buttons.matching(NSPredicate(format: "identifier BEGINSWITH %@", "remove-factor-")).firstMatch + let removeButton = app.buttons.matching(NSPredicate( + format: "identifier BEGINSWITH %@", + "remove-factor-" + )).firstMatch XCTAssertTrue(removeButton.waitForExistence(timeout: 10)) // 10) Remove the enrolled SMS factor and verify we're back to setup state @@ -257,16 +260,15 @@ final class MFAEnrollmentUITests: XCTestCase { XCTAssertTrue(setupButton.waitForExistence(timeout: 15)) } - // MARK: - TOTP Enrollment Flow Tests @MainActor func testTOTPEnrollmentFlowUI() async throws { let email = createEmail() - + // Create user in test runner before launching app (with email verification) try await createTestUser(email: email, verifyEmail: true) - + let app = createTestApp(mfaEnabled: true) app.launch() @@ -322,10 +324,10 @@ final class MFAEnrollmentUITests: XCTestCase { @MainActor func testErrorMessageDisplay() async throws { let email = createEmail() - + // Create user in test runner before launching app try await createTestUser(email: email) - + let app = createTestApp(mfaEnabled: true) app.launch() @@ -342,10 +344,10 @@ final class MFAEnrollmentUITests: XCTestCase { @MainActor func testBackButtonNavigation() async throws { let email = createEmail() - + // Create user in test runner before launching app try await createTestUser(email: email) - + let app = createTestApp(mfaEnabled: true) app.launch() @@ -372,10 +374,10 @@ final class MFAEnrollmentUITests: XCTestCase { @MainActor func testBackButtonFromMFAManagement() async throws { let email = createEmail() - + // Create user in test runner before launching app try await createTestUser(email: email) - + let app = createTestApp(mfaEnabled: true) app.launch() @@ -400,6 +402,7 @@ final class MFAEnrollmentUITests: XCTestCase { } // MARK: - Helper Methods + @MainActor private func signInToApp(app: XCUIApplication, email: String) throws { let password = "123456" @@ -431,11 +434,15 @@ final class MFAEnrollmentUITests: XCTestCase { } // Wait for signed-in state - // Wait for signed-in state + // Wait for signed-in state let signedInText = app.staticTexts["signed-in-text"] - XCTAssertTrue(signedInText.waitForExistence(timeout: 30), "SignedInView should be visible after login") + XCTAssertTrue( + signedInText.waitForExistence(timeout: 30), + "SignedInView should be visible after login" + ) XCTAssertTrue(signedInText.exists, "SignedInView should be visible after login") } + @MainActor private func navigateToMFAEnrollment(app: XCUIApplication) throws { // Navigate to MFA management @@ -458,12 +465,12 @@ final class MFAEnrollmentUITests: XCTestCase { } struct VerificationCodesResponse: Codable { - let verificationCodes: [VerificationCode]? + let verificationCodes: [VerificationCode]? } struct VerificationCode: Codable { - let phoneNumber: String - let code: String + let phoneNumber: String + let code: String } /// Retrieves the last SMS verification code from Firebase Auth Emulator @@ -471,37 +478,64 @@ struct VerificationCode: Codable { /// - Returns: The verification code as a String /// - Throws: Error if unable to retrieve codes private func getLastSmsCode(specificPhone: String? = nil) async throws -> String { - let getSmsCodesUrl = "http://127.0.0.1:9099/emulator/v1/projects/flutterfire-e2e-tests/verificationCodes" + let getSmsCodesUrl = + "http://127.0.0.1:9099/emulator/v1/projects/flutterfire-e2e-tests/verificationCodes" guard let url = URL(string: getSmsCodesUrl) else { - throw NSError(domain: "getLastSmsCode", code: -1, userInfo: [NSLocalizedDescriptionKey: "Failed to create URL for SMS codes endpoint"]) + throw NSError( + domain: "getLastSmsCode", + code: -1, + userInfo: [NSLocalizedDescriptionKey: "Failed to create URL for SMS codes endpoint"] + ) } do { - let (data, _) = try await URLSession.shared.data(from: url) + let (data, _) = try await URLSession.shared.data(from: url) - let decoder = JSONDecoder() - let codesResponse = try decoder.decode(VerificationCodesResponse.self, from: data) + let decoder = JSONDecoder() + let codesResponse = try decoder.decode(VerificationCodesResponse.self, from: data) - guard let codes = codesResponse.verificationCodes, !codes.isEmpty else { - throw NSError(domain: "getLastSmsCode", code: -1, userInfo: [NSLocalizedDescriptionKey: "No SMS verification codes found in emulator"]) - } + guard let codes = codesResponse.verificationCodes, !codes.isEmpty else { + throw NSError( + domain: "getLastSmsCode", + code: -1, + userInfo: [NSLocalizedDescriptionKey: "No SMS verification codes found in emulator"] + ) + } - if let specificPhone = specificPhone { - // Search backwards through codes for the specific phone number - for code in codes.reversed() { - if code.phoneNumber == specificPhone { - return code.code - } - } - throw NSError(domain: "getLastSmsCode", code: -1, userInfo: [NSLocalizedDescriptionKey: "No SMS verification code found for phone number: \(specificPhone)"]) - } else { - // Return the last code in the array - return codes.last!.code + if let specificPhone = specificPhone { + // Search backwards through codes for the specific phone number + for code in codes.reversed() { + if code.phoneNumber == specificPhone { + return code.code + } } + throw NSError( + domain: "getLastSmsCode", + code: -1, + userInfo: [ + NSLocalizedDescriptionKey: "No SMS verification code found for phone number: \(specificPhone)", + ] + ) + } else { + // Return the last code in the array + return codes.last!.code + } } catch let error as DecodingError { - throw NSError(domain: "getLastSmsCode", code: -1, userInfo: [NSLocalizedDescriptionKey: "Failed to parse SMS codes response: \(error.localizedDescription)"]) + throw NSError( + domain: "getLastSmsCode", + code: -1, + userInfo: [ + NSLocalizedDescriptionKey: "Failed to parse SMS codes response: \(error.localizedDescription)", + ] + ) } catch { - throw NSError(domain: "getLastSmsCode", code: -1, userInfo: [NSLocalizedDescriptionKey: "Network request failed: \(error.localizedDescription)"]) + throw NSError( + domain: "getLastSmsCode", + code: -1, + userInfo: [ + NSLocalizedDescriptionKey: "Network request failed: \(error.localizedDescription)", + ] + ) } } diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAResolutionUITests.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAResolutionUITests.swift index 93eff325ee..a48669a4b1 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAResolutionUITests.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAResolutionUITests.swift @@ -38,81 +38,82 @@ final class MFAResolutionUITests: XCTestCase { let email = createEmail() let password = "12345678" let phoneNumber = "+15551234567" - + // Sign up the user try await signUpUser(email: email, password: password) - + // Get ID token and enable MFA via API guard let idToken = await getIDTokenFromEmulator(email: email, password: password) else { XCTFail("Failed to get ID token from emulator") return } - + try await verifyEmailInEmulator(email: email, idToken: idToken) - + let mfaEnabled = await enableSMSMFAViaEmulator( idToken: idToken, phoneNumber: phoneNumber, displayName: "Test Phone" ) - + XCTAssertTrue(mfaEnabled, "MFA should be enabled successfully via API") - // Wait for sign out to complete let emailField = app.textFields["email-field"] XCTAssertTrue(emailField.waitForExistence(timeout: 10), "Should return to auth picker") - + try signInUser(app: app, email: email, password: password) - - + let mfaResolutionTitle = app.staticTexts["mfa-resolution-title"] XCTAssertTrue( mfaResolutionTitle.waitForExistence(timeout: 10), "MFA resolution view should appear" ) - + let smsButton = app.buttons["sms-method-button"] if smsButton.exists && smsButton.isEnabled { smsButton.tap() } dismissAlert(app: app) - // Wait for SMS to be sent try await Task.sleep(nanoseconds: 2_000_000_000) - + let sendSMSButton = app.buttons["send-sms-button"] - + sendSMSButton.tap() - + try await Task.sleep(nanoseconds: 3_000_000_000) - - guard let verificationCode = await getSMSVerificationCode(for: phoneNumber, codeType: "verification") else { + + guard let verificationCode = await getSMSVerificationCode( + for: phoneNumber, + codeType: "verification" + ) else { XCTFail("Failed to retrieve SMS verification code from emulator") return } - + let codeField = app.textFields["sms-verification-code-field"] XCTAssertTrue(codeField.waitForExistence(timeout: 10), "Code field should exist") codeField.tap() codeField.typeText(verificationCode) - + let completeButton = app.buttons["complete-resolution-button"] XCTAssertTrue(completeButton.exists, "Complete button should exist") completeButton.tap() - + // Wait for sign-in to complete - // Resolution always fails due to ERROR_MULTI_FACTOR_INFO_NOT_FOUND exception. See below issue for more information. + // Resolution always fails due to ERROR_MULTI_FACTOR_INFO_NOT_FOUND exception. See below issue + // for more information. // TODO(russellwheatley): uncomment below when this firebase-ios-sdk issue has been resolved: https://github.com/firebase/firebase-ios-sdk/issues/11079 - + // let signedInText = app.staticTexts["signed-in-text"] // XCTAssertTrue( // signedInText.waitForExistence(timeout: 10), // "User should be signed in after MFA resolution" // ) } - + // MARK: - Helper Methods /// Programmatically enables SMS MFA for a user via the Auth emulator REST API @@ -122,53 +123,51 @@ final class MFAResolutionUITests: XCTestCase { /// - displayName: Optional display name for the MFA factor /// - Returns: True if MFA was successfully enabled, false otherwise @MainActor - private func enableSMSMFAViaEmulator( - idToken: String, - phoneNumber: String, - displayName: String = "Test Phone" - ) async -> Bool { - let emulatorUrl = "http://127.0.0.1:9099/identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:start?key=fake-api-key" - + private func enableSMSMFAViaEmulator(idToken: String, + phoneNumber: String, + displayName: String = "Test Phone") async -> Bool { + let emulatorUrl = + "http://127.0.0.1:9099/identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:start?key=fake-api-key" + guard let url = URL(string: emulatorUrl) else { XCTFail("Invalid emulator URL") return false } - + var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") - + let requestBody: [String: Any] = [ "idToken": idToken, "phoneEnrollmentInfo": [ "phoneNumber": phoneNumber, - "recaptchaToken": "fake-recaptcha-token" - ] + "recaptchaToken": "fake-recaptcha-token", + ], ] - + guard let httpBody = try? JSONSerialization.data(withJSONObject: requestBody) else { XCTFail("Failed to serialize request body") return false } - + request.httpBody = httpBody - + // Step 1: Start MFA enrollment do { let (data, _) = try await URLSession.shared.data(for: request) - - + // Step 1: Parse JSON guard let jsonObject = try? JSONSerialization.jsonObject(with: data) else { print("❌ Failed to parse JSON from response data") return false } - + guard let json = jsonObject as? [String: Any] else { print("❌ JSON is not a dictionary. Type: \(type(of: jsonObject))") return false } - + // Step 2: Extract phoneSessionInfo guard let info = json["phoneSessionInfo"] as? [String: Any] else { print("❌ Failed to extract 'phoneSessionInfo' from JSON") @@ -178,7 +177,7 @@ final class MFAResolutionUITests: XCTestCase { } return false } - + // Step 3: Extract sessionInfo guard let sessionInfo = info["sessionInfo"] as? String else { print("❌ Failed to extract 'sessionInfo' from phoneSessionInfo") @@ -188,70 +187,71 @@ final class MFAResolutionUITests: XCTestCase { } return false } - + // Step 2: Get verification code from emulator try await Task.sleep(nanoseconds: 1_000_000_000) // 1 second guard let verificationCode = await getSMSVerificationCode(for: phoneNumber) else { XCTFail("Failed to retrieve SMS verification code") return false } - + // Step 3: Finalize MFA enrollment - let finalizeUrl = "http://127.0.0.1:9099/identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:finalize?key=fake-api-key" + let finalizeUrl = + "http://127.0.0.1:9099/identitytoolkit.googleapis.com/v2/accounts/mfaEnrollment:finalize?key=fake-api-key" guard let finalizeURL = URL(string: finalizeUrl) else { return false } - + var finalizeRequest = URLRequest(url: finalizeURL) finalizeRequest.httpMethod = "POST" finalizeRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") - + let finalizeBody: [String: Any] = [ "idToken": idToken, "phoneVerificationInfo": [ "sessionInfo": sessionInfo, - "code": verificationCode + "code": verificationCode, ], - "displayName": displayName + "displayName": displayName, ] - + guard let finalizeHttpBody = try? JSONSerialization.data(withJSONObject: finalizeBody) else { return false } - + finalizeRequest.httpBody = finalizeHttpBody - + let (finalizeData, finalizeResponse) = try await URLSession.shared.data(for: finalizeRequest) - + // Check HTTP status if let httpResponse = finalizeResponse as? HTTPURLResponse { print("πŸ“‘ Finalize HTTP Status: \(httpResponse.statusCode)") } - - - guard let json = try? JSONSerialization.jsonObject(with: finalizeData) as? [String: Any] else { + + guard let json = try? JSONSerialization.jsonObject(with: finalizeData) as? [String: Any] + else { print("❌ Failed to parse finalize response as JSON") return false } - + // Check if we have the new idToken and MFA info guard let newIdToken = json["idToken"] as? String else { print("❌ Missing 'idToken' in finalize response") return false } - + // Check if refreshToken is present if let refreshToken = json["refreshToken"] as? String { print("βœ… Got refreshToken: \(refreshToken.prefix(20))...") } - + // Check for MFA info in response if let mfaInfo = json["mfaInfo"] { print("βœ… MFA info in response: \(mfaInfo)") } - + return true - + } catch { print("Failed to enable MFA: \(error.localizedDescription)") return false @@ -261,37 +261,39 @@ final class MFAResolutionUITests: XCTestCase { /// Retrieves SMS verification codes from the Firebase Auth emulator /// - Parameters: /// - phoneNumber: The phone number to retrieve the code for - /// - codeType: The type of code - "enrollment" for MFA enrollment, "verification" for phone verification during resolution + /// - codeType: The type of code - "enrollment" for MFA enrollment, "verification" for phone + /// verification during resolution @MainActor - private func getSMSVerificationCode(for phoneNumber: String, codeType: String = "enrollment") async -> String? { - let emulatorUrl = "http://127.0.0.1:9099/emulator/v1/projects/flutterfire-e2e-tests/verificationCodes" - + private func getSMSVerificationCode(for phoneNumber: String, + codeType: String = "enrollment") async -> String? { + let emulatorUrl = + "http://127.0.0.1:9099/emulator/v1/projects/flutterfire-e2e-tests/verificationCodes" + guard let url = URL(string: emulatorUrl) else { return nil } - + do { let (data, _) = try await URLSession.shared.data(from: url) - - + guard let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any], let codes = json["verificationCodes"] as? [[String: Any]] else { print("❌ Failed to parse verification codes") return nil } - + // Filter codes by phone number and type, then get the most recent one let matchingCodes = codes.filter { codeInfo in guard let phone = codeInfo["phoneNumber"] as? String else { print("❌ Code missing phoneNumber field") return false } - + // The key difference between enrollment and verification codes: // - Enrollment codes have full phone numbers (e.g., "+15551234567") // - Verification codes have masked phone numbers (e.g., "+*******4567") let isMasked = phone.contains("*") - + // Match phone number let phoneMatches: Bool if isMasked { @@ -303,7 +305,7 @@ final class MFAResolutionUITests: XCTestCase { // Full phone number match phoneMatches = phone == phoneNumber } - + guard phoneMatches else { return false } @@ -316,16 +318,16 @@ final class MFAResolutionUITests: XCTestCase { return isMasked } } - + // Get the last matching code (most recent) if let lastCode = matchingCodes.last, let code = lastCode["code"] as? String { return code } - + print("❌ No matching code found") return nil - + } catch { print("Failed to fetch verification codes: \(error.localizedDescription)") return nil @@ -340,42 +342,43 @@ final class MFAResolutionUITests: XCTestCase { /// - Returns: The user's ID token, or nil if the sign-in failed @MainActor private func getIDTokenFromEmulator(email: String, password: String = "123456") async -> String? { - let signInUrl = "http://127.0.0.1:9099/identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=fake-api-key" - + let signInUrl = + "http://127.0.0.1:9099/identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=fake-api-key" + guard let url = URL(string: signInUrl) else { print("Invalid emulator URL") return nil } - + var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") - + let requestBody: [String: Any] = [ "email": email, "password": password, - "returnSecureToken": true + "returnSecureToken": true, ] - + guard let httpBody = try? JSONSerialization.data(withJSONObject: requestBody) else { print("Failed to serialize sign-in request body") return nil } - + request.httpBody = httpBody - + do { let (data, _) = try await URLSession.shared.data(for: request) - + guard let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any], let idToken = json["idToken"] as? String else { print("Failed to parse sign-in response") return nil } - + print("Successfully got ID token from emulator: \(idToken.prefix(20))...") return idToken - + } catch { print("Failed to get ID token from emulator: \(error.localizedDescription)") return nil @@ -385,26 +388,29 @@ final class MFAResolutionUITests: XCTestCase { @MainActor private func signUpUser(email: String, password: String = "12345678") async throws { // Create user via Auth Emulator REST API - let url = URL(string: "http://127.0.0.1:9099/identitytoolkit.googleapis.com/v1/accounts:signUp?key=fake-api-key")! + let url = + URL( + string: "http://127.0.0.1:9099/identitytoolkit.googleapis.com/v1/accounts:signUp?key=fake-api-key" + )! var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") - + let body: [String: Any] = [ "email": email, "password": password, - "returnSecureToken": true + "returnSecureToken": true, ] request.httpBody = try JSONSerialization.data(withJSONObject: body) - + let (data, response) = try await URLSession.shared.data(for: request) - + guard let httpResponse = response as? HTTPURLResponse else { XCTFail("Invalid response") return } - - guard (200...299).contains(httpResponse.statusCode) else { + + guard (200 ... 299).contains(httpResponse.statusCode) else { let errorMessage = String(data: data, encoding: .utf8) ?? "Unknown error" XCTFail("Failed to create user. Status: \(httpResponse.statusCode), Error: \(errorMessage)") return diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/ProviderUITests.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/ProviderUITests.swift index 8ae3b6ace3..cda57f0c29 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/ProviderUITests.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/ProviderUITests.swift @@ -32,9 +32,9 @@ final class ProviderUITests: XCTestCase { func testProviderButtons() throws { let app = createTestApp() app.launch() - + // MARK: - Check existence of provider buttons - + // Check for Twitter/X sign-in button let twitterButton = app.buttons["sign-in-with-twitter-button"] XCTAssertTrue( @@ -55,35 +55,35 @@ final class ProviderUITests: XCTestCase { githubButton.waitForExistence(timeout: 5), "Github sign-in button should exist" ) - + // Check for Microsoft sign-in button let microsoftButton = app.buttons["sign-in-with-microsoft.com-button"] XCTAssertTrue( microsoftButton.waitForExistence(timeout: 5), "Microsoft sign-in button should exist" ) - + // Check for Yahoo sign-in button let yahooButton = app.buttons["sign-in-with-yahoo.com-button"] XCTAssertTrue( yahooButton.waitForExistence(timeout: 5), "Yahoo sign-in button should exist" ) - + // Check for Google sign-in button let googleButton = app.buttons["sign-in-with-google-button"] XCTAssertTrue( googleButton.waitForExistence(timeout: 5), "Google sign-in button should exist" ) - + // Check for Facebook sign-in button let facebookButton = app.buttons["sign-in-with-facebook-button"] XCTAssertTrue( facebookButton.waitForExistence(timeout: 5), "Facebook sign-in button should exist" ) - + // Check for Phone sign-in button let phoneButton = app.buttons["sign-in-with-phone-button"] XCTAssertTrue( @@ -96,7 +96,8 @@ final class ProviderUITests: XCTestCase { func testErrorModal() throws { let app = createTestApp() app.launch() - // Just test email + external provider for error modal on failure to ensure provider button sign-in flow fails along with failures within AuthPickerView + // Just test email + external provider for error modal on failure to ensure provider button + // sign-in flow fails along with failures within AuthPickerView let emailField = app.textFields["email-field"] XCTAssertTrue(emailField.waitForExistence(timeout: 6), "Email field should exist") emailField.tap() @@ -110,26 +111,25 @@ final class ProviderUITests: XCTestCase { let signInButton = app.buttons["sign-in-button"] XCTAssertTrue(signInButton.exists, "Sign-In button should exist") signInButton.tap() - + // Wait for the alert to appear let alert1 = app.alerts.firstMatch XCTAssertTrue( alert1.waitForExistence(timeout: 5), "Alert should appear after canceling Facebook sign-in" ) - + alert1.buttons["OK"].firstMatch.tap() - - + let facebookButton = app.buttons["sign-in-with-facebook-button"] XCTAssertTrue( facebookButton.waitForExistence(timeout: 5), "Facebook sign-in button should exist" ) - + facebookButton.tap() - // Wait for Facebook modal to appear and tap Cancel + // Wait for Facebook modal to appear and tap Cancel // The Facebook SDK modal is presented by the system/Safari let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard") @@ -140,7 +140,7 @@ final class ProviderUITests: XCTestCase { "Cancel button should appear in Springboard authentication modal" ) cancelButton.tap() - + // Wait for the alert to appear let alert2 = app.alerts.firstMatch XCTAssertTrue( diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/TestUtils.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/TestUtils.swift index 7625f25623..2bf6899605 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/TestUtils.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/TestUtils.swift @@ -32,36 +32,38 @@ func dismissAlert(app: XCUIApplication) { // MARK: - User Creation /// Helper to create a test user in the emulator via REST API (avoids keychain issues) -func createTestUser(email: String, password: String = "123456", verifyEmail: Bool = false) async throws { +func createTestUser(email: String, password: String = "123456", + verifyEmail: Bool = false) async throws { // Use Firebase Auth emulator REST API directly to avoid keychain access issues in UI tests - let signUpUrl = "http://127.0.0.1:9099/identitytoolkit.googleapis.com/v1/accounts:signUp?key=fake-api-key" - + let signUpUrl = + "http://127.0.0.1:9099/identitytoolkit.googleapis.com/v1/accounts:signUp?key=fake-api-key" + guard let url = URL(string: signUpUrl) else { throw NSError(domain: "TestError", code: 1, - userInfo: [NSLocalizedDescriptionKey: "Invalid emulator URL"]) + userInfo: [NSLocalizedDescriptionKey: "Invalid emulator URL"]) } - + var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") - + let body: [String: Any] = [ "email": email, "password": password, - "returnSecureToken": true + "returnSecureToken": true, ] - + request.httpBody = try JSONSerialization.data(withJSONObject: body) - + let (data, response) = try await URLSession.shared.data(for: request) - + guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else { let errorBody = String(data: data, encoding: .utf8) ?? "Unknown error" throw NSError(domain: "TestError", code: 2, - userInfo: [NSLocalizedDescriptionKey: "Failed to create user: \(errorBody)"]) + userInfo: [NSLocalizedDescriptionKey: "Failed to create user: \(errorBody)"]) } - + // If email verification is requested, verify the email if verifyEmail { // Parse the response to get the idToken @@ -81,26 +83,25 @@ func verifyEmailInEmulator(email: String, emulatorHost: String = "127.0.0.1:9099") async throws { let base = "http://\(emulatorHost)" - // Step 1: Trigger email verification (creates OOB code in emulator) var sendReq = URLRequest( - url: URL(string: "\(base)/identitytoolkit.googleapis.com/v1/accounts:sendOobCode?key=fake-api-key")! + url: URL( + string: "\(base)/identitytoolkit.googleapis.com/v1/accounts:sendOobCode?key=fake-api-key" + )! ) sendReq.httpMethod = "POST" sendReq.setValue("application/json", forHTTPHeaderField: "Content-Type") sendReq.httpBody = try JSONSerialization.data(withJSONObject: [ "requestType": "VERIFY_EMAIL", - "idToken": idToken + "idToken": idToken, ]) - let (_, sendResp) = try await URLSession.shared.data(for: sendReq) guard let http = sendResp as? HTTPURLResponse, http.statusCode == 200 else { throw NSError(domain: "EmulatorError", code: 1, userInfo: [NSLocalizedDescriptionKey: "Failed to send verification email"]) } - // Step 2: Fetch OOB codes from emulator let oobURL = URL(string: "\(base)/emulator/v1/projects/\(projectID)/oobCodes")! let (oobData, oobResp) = try await URLSession.shared.data(from: oobURL) @@ -109,7 +110,6 @@ func verifyEmailInEmulator(email: String, userInfo: [NSLocalizedDescriptionKey: "Failed to fetch OOB codes"]) } - struct OobEnvelope: Decodable { let oobCodes: [OobItem] } struct OobItem: Decodable { let oobCode: String @@ -118,10 +118,8 @@ func verifyEmailInEmulator(email: String, let creationTime: String? } - let envelope = try JSONDecoder().decode(OobEnvelope.self, from: oobData) - // Step 3: Find most recent VERIFY_EMAIL code for this email let iso = ISO8601DateFormatter() let codeItem = envelope.oobCodes @@ -135,18 +133,19 @@ func verifyEmailInEmulator(email: String, } .first - guard let oobCode = codeItem?.oobCode else { throw NSError(domain: "EmulatorError", code: 3, - userInfo: [NSLocalizedDescriptionKey: "No VERIFY_EMAIL OOB code found for \(email)"]) + userInfo: [ + NSLocalizedDescriptionKey: "No VERIFY_EMAIL OOB code found for \(email)", + ]) } - // Step 4: Apply the OOB code (simulate clicking verification link) - let verifyURL = URL(string: "\(base)/emulator/action?mode=verifyEmail&oobCode=\(oobCode)&apiKey=fake-api-key")! + let verifyURL = + URL(string: "\(base)/emulator/action?mode=verifyEmail&oobCode=\(oobCode)&apiKey=fake-api-key")! let (_, verifyResp) = try await URLSession.shared.data(from: verifyURL) guard (verifyResp as? HTTPURLResponse)?.statusCode == 200 else { throw NSError(domain: "EmulatorError", code: 4, userInfo: [NSLocalizedDescriptionKey: "Failed to apply OOB code"]) } -} \ No newline at end of file +} From eb6291af87292e2711265448a8272e1e40c2c4b8 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Mon, 3 Nov 2025 12:25:52 +0000 Subject: [PATCH 35/38] test: UI runner updates --- .../FirebaseSwiftUIExample/TestView.swift | 5 ++++- .../FirebaseSwiftUIExampleUITests/TestUtils.swift | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/TestView.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/TestView.swift index db40aa810c..80dca53853 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/TestView.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/TestView.swift @@ -70,6 +70,9 @@ struct TestView: View { } var body: some View { - AuthPickerView().environment(authService) + AuthPickerView(){ + Text("Hello, world!") + } + .environment(authService) } } diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/TestUtils.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/TestUtils.swift index 2bf6899605..52bd7ca5e0 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/TestUtils.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/TestUtils.swift @@ -12,7 +12,7 @@ func createEmail() -> String { // MARK: - App Configuration /// Creates and configures an XCUIApplication with default test launch arguments -func createTestApp(mfaEnabled: Bool = false) -> XCUIApplication { +@MainActor func createTestApp(mfaEnabled: Bool = false) -> XCUIApplication { let app = XCUIApplication() app.launchArguments.append("--test-view-enabled") if mfaEnabled { @@ -23,7 +23,7 @@ func createTestApp(mfaEnabled: Bool = false) -> XCUIApplication { // MARK: - Alert Handling -func dismissAlert(app: XCUIApplication) { +@MainActor func dismissAlert(app: XCUIApplication) { if app.scrollViews.otherElements.buttons["Not Now"].waitForExistence(timeout: 2) { app.scrollViews.otherElements.buttons["Not Now"].tap() } From dfdbf44afac2a5162cfcf9bbdf8809780ead0653 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Mon, 3 Nov 2025 13:08:24 +0000 Subject: [PATCH 36/38] test: fix more tests after UI refactor --- .../Sources/Components/CountrySelector.swift | 2 + .../MFAEnrolmentUITests.swift | 64 +++++++------------ .../MFAResolutionUITests.swift | 4 +- 3 files changed, 28 insertions(+), 42 deletions(-) diff --git a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/CountrySelector.swift b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/CountrySelector.swift index bf1ad74c76..49d94e9fe1 100644 --- a/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/CountrySelector.swift +++ b/FirebaseSwiftUI/FirebaseAuthUIComponents/Sources/Components/CountrySelector.swift @@ -88,6 +88,7 @@ public struct CountrySelector: View { } label: { Text("\(country.flag) \(country.name) (\(country.dialCode))") } + .accessibilityIdentifier("country-option-\(country.code)") } } label: { HStack(spacing: 4) { @@ -101,6 +102,7 @@ public struct CountrySelector: View { .foregroundStyle(.secondary) } } + .accessibilityIdentifier("country-selector") .disabled(!enabled) } } diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAEnrolmentUITests.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAEnrolmentUITests.swift index b3ea649757..e55e2a0137 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAEnrolmentUITests.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAEnrolmentUITests.swift @@ -193,11 +193,24 @@ final class MFAEnrollmentUITests: XCTestCase { XCTAssertTrue(startButton.waitForExistence(timeout: 10)) startButton.tap() - // 6) Enter phone number and display name, then press "Send Code" + // 6) Select UK country code and enter phone number (without dial code) + // Find and tap the country selector - try multiple approaches since it's embedded in the TextField + let countrySelector = app.buttons["πŸ‡ΊπŸ‡Έ +1"] + XCTAssertTrue(countrySelector.waitForExistence(timeout: 5)) + + countrySelector.tap() + + // Select United Kingdom (+44) - try multiple element types + let ukOption = app.buttons["country-option-GB"] + XCTAssertTrue(ukOption.waitForExistence(timeout: 5)) + + ukOption.tap() + + // Enter phone number (without dial code) let phoneField = app.textFields["phone-number-field"] XCTAssertTrue(phoneField.waitForExistence(timeout: 10)) - let phoneNumber = "+447444555666" - UIPasteboard.general.string = phoneNumber + let phoneNumberWithoutDialCode = "7444555666" + UIPasteboard.general.string = phoneNumberWithoutDialCode phoneField.tap() phoneField.press(forDuration: 1.2) app.menuItems["Paste"].tap() @@ -219,7 +232,9 @@ final class MFAEnrollmentUITests: XCTestCase { XCTAssertTrue(verificationCodeField.waitForExistence(timeout: 15)) // Fetch the latest SMS verification code generated by the emulator for this phone number - let code = try await getLastSmsCode(specificPhone: phoneNumber) + // The emulator stores the full phone number with dial code + let fullPhoneNumber = "+44\(phoneNumberWithoutDialCode)" + let code = try await getLastSmsCode(specificPhone: fullPhoneNumber) UIPasteboard.general.string = code verificationCodeField.tap() @@ -356,48 +371,17 @@ final class MFAEnrollmentUITests: XCTestCase { try navigateToMFAEnrollment(app: app) // Test back button exists - let cancelButton = app.buttons["mfa-back-button"] - XCTAssertTrue(cancelButton.exists, "Back button should exist") - XCTAssertTrue(cancelButton.isEnabled, "Back button should be enabled") + let backButton = app.navigationBars.buttons.element(boundBy: 0) + XCTAssertTrue(backButton.exists, "Back button should exist") // Tap cancel button - cancelButton.tap() - - // Should navigate back to signed in view - let signedInText = app.staticTexts["signed-in-text"] - XCTAssertTrue( - signedInText.waitForExistence(timeout: 5), - "Should navigate back to signed in view" - ) - } - - @MainActor - func testBackButtonFromMFAManagement() async throws { - let email = createEmail() - - // Create user in test runner before launching app - try await createTestUser(email: email) - - let app = createTestApp(mfaEnabled: true) - app.launch() - - // Sign in and navigate to MFA management - try signInToApp(app: app, email: email) - app.buttons["mfa-management-button"].tap() - - // Test back button exists - let backButton = app.buttons["back-button"] - XCTAssertTrue(backButton.waitForExistence(timeout: 5), "Back button should exist") - XCTAssertTrue(backButton.isEnabled, "Back button should be enabled") - - // Tap back button backButton.tap() - // Should navigate back to signed in view - let signedInText = app.staticTexts["signed-in-text"] + // Should navigate back to manage MFA View + let signedInText = app.buttons["setup-mfa-button"] XCTAssertTrue( signedInText.waitForExistence(timeout: 5), - "Should navigate back to signed in view" + "Should navigate back to setup MFA view" ) } diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAResolutionUITests.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAResolutionUITests.swift index a48669a4b1..fe4a87af42 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAResolutionUITests.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAResolutionUITests.swift @@ -417,7 +417,7 @@ final class MFAResolutionUITests: XCTestCase { } } - private func signInUser(app: XCUIApplication, email: String, password: String = "123456") throws { + @MainActor private func signInUser(app: XCUIApplication, email: String, password: String = "123456") throws { // Ensure we're in sign in flow let switchFlowButton = app.buttons["switch-auth-flow"] if switchFlowButton.exists && switchFlowButton.label.contains("Sign In") { @@ -440,7 +440,7 @@ final class MFAResolutionUITests: XCTestCase { signInButton.tap() } - private func enrollSMSMFA(app: XCUIApplication) throws { + @MainActor private func enrollSMSMFA(app: XCUIApplication) throws { // Navigate to MFA management let mfaManagementButton = app.buttons["mfa-management-button"] XCTAssertTrue(mfaManagementButton.waitForExistence(timeout: 5)) From ec837557032b674f205b4d59315c77f8d1449a1d Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Mon, 3 Nov 2025 13:08:39 +0000 Subject: [PATCH 37/38] format --- .../FirebaseSwiftUIExample/TestView.swift | 2 +- .../MFAEnrolmentUITests.swift | 11 ++++++----- .../MFAResolutionUITests.swift | 3 ++- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/TestView.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/TestView.swift index 80dca53853..f531419301 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/TestView.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExample/TestView.swift @@ -70,7 +70,7 @@ struct TestView: View { } var body: some View { - AuthPickerView(){ + AuthPickerView { Text("Hello, world!") } .environment(authService) diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAEnrolmentUITests.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAEnrolmentUITests.swift index e55e2a0137..1b8c981f03 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAEnrolmentUITests.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAEnrolmentUITests.swift @@ -194,18 +194,19 @@ final class MFAEnrollmentUITests: XCTestCase { startButton.tap() // 6) Select UK country code and enter phone number (without dial code) - // Find and tap the country selector - try multiple approaches since it's embedded in the TextField + // Find and tap the country selector - try multiple approaches since it's embedded in the + // TextField let countrySelector = app.buttons["πŸ‡ΊπŸ‡Έ +1"] XCTAssertTrue(countrySelector.waitForExistence(timeout: 5)) - + countrySelector.tap() - + // Select United Kingdom (+44) - try multiple element types let ukOption = app.buttons["country-option-GB"] XCTAssertTrue(ukOption.waitForExistence(timeout: 5)) - + ukOption.tap() - + // Enter phone number (without dial code) let phoneField = app.textFields["phone-number-field"] XCTAssertTrue(phoneField.waitForExistence(timeout: 10)) diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAResolutionUITests.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAResolutionUITests.swift index fe4a87af42..e1026b2663 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAResolutionUITests.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/MFAResolutionUITests.swift @@ -417,7 +417,8 @@ final class MFAResolutionUITests: XCTestCase { } } - @MainActor private func signInUser(app: XCUIApplication, email: String, password: String = "123456") throws { + @MainActor private func signInUser(app: XCUIApplication, email: String, + password: String = "123456") throws { // Ensure we're in sign in flow let switchFlowButton = app.buttons["switch-auth-flow"] if switchFlowButton.exists && switchFlowButton.label.contains("Sign In") { From fd4d28b7607b2faf730d97478bf141d449efefc0 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Mon, 3 Nov 2025 13:11:07 +0000 Subject: [PATCH 38/38] test: mainactor annotations --- .../FirebaseSwiftUIExampleUITests/TestUtils.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/TestUtils.swift b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/TestUtils.swift index 52bd7ca5e0..bc5bc0313f 100644 --- a/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/TestUtils.swift +++ b/samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleUITests/TestUtils.swift @@ -32,7 +32,7 @@ func createEmail() -> String { // MARK: - User Creation /// Helper to create a test user in the emulator via REST API (avoids keychain issues) -func createTestUser(email: String, password: String = "123456", +@MainActor func createTestUser(email: String, password: String = "123456", verifyEmail: Bool = false) async throws { // Use Firebase Auth emulator REST API directly to avoid keychain access issues in UI tests let signUpUrl = @@ -77,7 +77,7 @@ func createTestUser(email: String, password: String = "123456", // MARK: - Email Verification /// Verifies an email address in the emulator using the OOB code mechanism -func verifyEmailInEmulator(email: String, +@MainActor func verifyEmailInEmulator(email: String, idToken: String, projectID: String = "flutterfire-e2e-tests", emulatorHost: String = "127.0.0.1:9099") async throws {