gitbay/Issues/MilestoneListViewModel.swift
43 lines · 1185 bytes
1import Foundation
2import Observation
3
4/// `milestone list <repo> --state <s>` — milestones with their progress.
5@Observable
6@MainActor
7final class MilestoneListViewModel {
8
9 enum StateFilter: String, CaseIterable, Identifiable, Sendable {
10 case open, closed, all
11 var id: String { rawValue }
12 }
13
14 private(set) var state: LoadState<[Milestone]> = .loading
15 var filter: StateFilter = .open {
16 didSet {
17 guard filter != oldValue else { return }
18 Task { await load() }
19 }
20 }
21
22 private let client: GitbayClient
23 let repoPath: String
24
25 init(client: GitbayClient, repoPath: String) {
26 self.client = client
27 self.repoPath = repoPath
28 }
29
30 func load() async {
31 state = .loading
32 do {
33 let milestones = try await client.readList(
34 ["milestone", "list", repoPath, "--state", filter.rawValue], of: Milestone.self
35 )
36 state = milestones.isEmpty
37 ? .empty("No \(filter == .all ? "" : filter.rawValue + " ")milestones.")
38 : .loaded(milestones)
39 } catch {
40 state = .from(error)
41 }
42 }
43}