Last active
August 5, 2023 03:24
-
-
Save yimajo/8f7946cb273f58493a5cfaaecd770f3b to your computer and use it in GitHub Desktop.
Monitor FirebaseAuth login status with TCA
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import ComposableArchitecture | |
import FirebaseCore | |
import FirebaseAuth | |
import GoogleSignIn | |
struct FirebaseAuthClient { | |
var observeSignInState: () async -> AsyncStream<Bool> | |
} | |
extension FirebaseAuthClient { | |
static let liveValue = Self.live() | |
static func live() -> Self { | |
// To remove monitoring if called more than once. | |
var stateChangeListener: AuthStateDidChangeListenerHandle? | |
return Self(observeSignInState: { | |
if let stateChangeListener { | |
Auth.auth().removeStateDidChangeListener(stateChangeListener) | |
} | |
return AsyncStream(Bool.self) { continuation in | |
stateChangeListener = Auth.auth().addStateDidChangeListener { auth, _ in | |
continuation.yield(auth.currentUser != nil) | |
} | |
} | |
} | |
} | |
} | |
extension FirebaseAuthClient { | |
public static let noop = Self( | |
observeSignInState: { AsyncStream(Bool.self) { $0.finish() } } | |
) | |
} | |
// MARK: - For Dependencies | |
enum FirebaseAuthClientKey: DependencyKey { | |
static let liveValue = FirebaseAuthClient.liveValue | |
static let previewValue = FirebaseAuthClient.noop | |
} | |
extension DependencyValues { | |
var firebaseAuthClient: FirebaseAuthClient { | |
get { self[FirebaseAuthClientKey.self] } | |
set { self[FirebaseAuthClientKey.self] = newValue } | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
That's perfect! Thanks also for the reference.
Just to be helpful at line
27
it's missing a the closing parentheses)
.