a native ios client for gitbay

client ios swift

https://gitbay.org

gitbay/Issues/MilestoneListViewModel.swift

main
gitbay-ios/gitbay/Issues/MilestoneListViewModel.swift history · blame · raw

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}