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? private var dataTask: Task? 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) } } } }