feat: 计划页对齐 android 并新增提交页
This commit is contained in:
66
IosClientKit/Sources/FeaturePlan/PlanViewModel.swift
Normal file
66
IosClientKit/Sources/FeaturePlan/PlanViewModel.swift
Normal file
@@ -0,0 +1,66 @@
|
||||
import CoreDomain
|
||||
import CoreModel
|
||||
import Observation
|
||||
|
||||
@MainActor
|
||||
@Observable
|
||||
public final class PlanViewModel {
|
||||
public private(set) var uiState: PlanUiState = .loading
|
||||
public var selectedType: PlanType = .weekly
|
||||
|
||||
private let planUseCase: PlanUseCase
|
||||
private let sessionUseCase: SessionUseCase
|
||||
private var loadTask: Task<Void, Never>?
|
||||
private var dataTask: Task<Void, Never>?
|
||||
|
||||
public init(planUseCase: PlanUseCase, sessionUseCase: SessionUseCase) {
|
||||
self.planUseCase = planUseCase
|
||||
self.sessionUseCase = sessionUseCase
|
||||
}
|
||||
|
||||
public func load() {
|
||||
loadTask?.cancel()
|
||||
loadTask = Task { [weak self] in
|
||||
guard let self else { return }
|
||||
do {
|
||||
for try await isLoggedIn in self.sessionUseCase.observeIsLoggedIn() {
|
||||
self.handleLoginState(isLoggedIn)
|
||||
}
|
||||
} catch is CancellationError {
|
||||
} catch {
|
||||
self.uiState = .error(error.localizedDescription)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public func selectType(_ type: PlanType) {
|
||||
guard type != selectedType else { return }
|
||||
selectedType = type
|
||||
reloadData()
|
||||
}
|
||||
|
||||
private func handleLoginState(_ isLoggedIn: Bool) {
|
||||
dataTask?.cancel()
|
||||
guard isLoggedIn else {
|
||||
uiState = .loggedOut
|
||||
return
|
||||
}
|
||||
reloadData()
|
||||
}
|
||||
|
||||
private func reloadData() {
|
||||
dataTask?.cancel()
|
||||
uiState = .loading
|
||||
dataTask = Task { [weak self] in
|
||||
guard let self else { return }
|
||||
do {
|
||||
for try await record in self.planUseCase.observePlan(type: self.selectedType) {
|
||||
self.uiState = .success(record)
|
||||
}
|
||||
} catch is CancellationError {
|
||||
} catch {
|
||||
self.uiState = .error(error.localizedDescription)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user