Skip to content

Commit 4cea62c

Browse files
committed
feat: CurrentValueSubject를 통해 FirebaseAuth의 세션이 상시 반영되도록 추가
1 parent ad9c547 commit 4cea62c

3 files changed

Lines changed: 43 additions & 8 deletions

File tree

DevLog/Data/Repository/AuthSessionRepositoryImpl.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,25 @@
66
//
77

88
import Combine
9+
import Foundation
910

1011
final class AuthSessionRepositoryImpl: AuthSessionRepository {
1112
private let authService: AuthService
1213
private let userDefaultsStore: UserDefaultsStore
14+
private var cancellables = Set<AnyCancellable>()
1315

1416
init(authService: AuthService, userDefaultsStore: UserDefaultsStore) {
1517
self.authService = authService
1618
self.userDefaultsStore = userDefaultsStore
1719
self.signIn = authService.uid != nil
20+
21+
authService.signedInPublisher
22+
.removeDuplicates()
23+
.receive(on: DispatchQueue.main)
24+
.sink { [weak self] signIn in
25+
self?.setSession(signIn)
26+
}
27+
.store(in: &cancellables)
1828
}
1929

2030
@Published private var signIn: Bool = false

DevLog/Data/Repository/AuthenticationRepositoryImpl.swift

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,21 @@ final class AuthenticationRepositoryImpl: AuthenticationRepository {
4444
let providerID = try await authService.getProviderID(),
4545
let provider = AuthProvider(rawValue: providerID)
4646
else {
47-
throw AuthError.notAuthenticated
47+
try await authService.clearCurrentSession()
48+
return
4849
}
4950

50-
switch provider {
51-
case .apple:
52-
try await appleAuthService.signOut(uid)
53-
case .github:
54-
try await githubAuthService.signOut(uid)
55-
case .google:
56-
try await googleAuthService.signOut(uid)
51+
do {
52+
switch provider {
53+
case .apple:
54+
try await appleAuthService.signOut(uid)
55+
case .github:
56+
try await githubAuthService.signOut(uid)
57+
case .google:
58+
try await googleAuthService.signOut(uid)
59+
}
60+
} catch AuthError.notAuthenticated {
61+
try await authService.clearCurrentSession()
5762
}
5863
}
5964

DevLog/Infra/Service/AuthService.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// Created by 최윤진 on 11/29/25.
66
//
77

8+
import Combine
89
import FirebaseAuth
910
import FirebaseFirestore
1011
import FirebaseMessaging
@@ -13,15 +14,34 @@ final class AuthService {
1314
private let store = Firestore.firestore()
1415
private let messaging = Messaging.messaging()
1516
private let logger = Logger(category: "AuthService")
17+
private let subject = CurrentValueSubject<Bool, Never>(Auth.auth().currentUser != nil)
18+
private var handler: AuthStateDidChangeListenerHandle?
1619

1720
var uid: String? {
1821
Auth.auth().currentUser?.uid
1922
}
2023

24+
var signedInPublisher: AnyPublisher<Bool, Never> {
25+
subject.eraseToAnyPublisher()
26+
}
27+
2128
var providerIDs: [String] {
2229
Auth.auth().currentUser?.providerData.map { $0.providerID } ?? []
2330
}
2431

32+
init() {
33+
handler = Auth.auth().addStateDidChangeListener { [weak self] _, user in
34+
let signedIn = user != nil
35+
self?.logger.info("Firebase auth state changed. signedIn: \(signedIn)")
36+
self?.subject.send(signedIn)
37+
}
38+
}
39+
40+
deinit {
41+
guard let handler else { return }
42+
Auth.auth().removeStateDidChangeListener(handler)
43+
}
44+
2545
func getProviderID() async throws -> String? {
2646
logger.info("Fetching current provider ID")
2747

0 commit comments

Comments
 (0)