feat: 首页改为落地页并接入登录态
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user