feat: 首页改为落地页并接入登录态

This commit is contained in:
AndyChen1024
2026-09-15 14:35:52 +08:00
parent 542f08c0a8
commit 2986340ad8
3 changed files with 178 additions and 47 deletions

View File

@@ -8,24 +8,47 @@ public final class HomeViewModel {
public private(set) var uiState: HomeUiState = .loading
private let homeUseCase: HomeUseCase
private let sessionUseCase: SessionUseCase
private var loadTask: Task<Void, Never>?
private var dataTask: Task<Void, Never>?
public init(homeUseCase: HomeUseCase) {
public init(homeUseCase: HomeUseCase, sessionUseCase: SessionUseCase) {
self.homeUseCase = homeUseCase
self.sessionUseCase = sessionUseCase
}
public func load() {
// flatMapLatest 的等价:新 load 前先取消旧的观察。
// flatMapLatest 的等价:登录态变化时重新订阅对应数据源。
loadTask?.cancel()
loadTask = Task { [weak self] in
guard let self else { return }
self.uiState = .loading
do {
for try await data in self.homeUseCase.observeHome() {
self.uiState = data.habits.isEmpty ? .empty : .success(data)
for try await isLoggedIn in self.sessionUseCase.observeIsLoggedIn() {
self.reload(isLoggedIn: isLoggedIn)
}
} catch is CancellationError {
} catch {
self.uiState = .error(error.localizedDescription)
}
}
}
private func reload(isLoggedIn: Bool) {
dataTask?.cancel()
uiState = .loading
dataTask = Task { [weak self] in
guard let self else { return }
do {
if isLoggedIn {
for try await data in self.homeUseCase.observeHome() {
self.uiState = .success(data, isGuest: false)
}
} else {
for try await data in self.homeUseCase.observeGuestHome() {
self.uiState = .success(data, isGuest: true)
}
}
} catch is CancellationError {
// 被更新的 load() 取代,保持当前状态即可。
} catch {
self.uiState = .error(error.localizedDescription)
}