a native ios client for gitbay

client ios swift

https://gitbay.org

gitbay/MRs/MRListViewModel.swift

ui-smoke
gitbay-ios/gitbay/MRs/MRListViewModel.swift history · blame · raw

44 lines · 1183 bytes

 1import Foundation
 2import Observation
 3
 4/// `mr list <repo> --state <s>`, paginated.
 5@Observable
 6@MainActor
 7final class MRListViewModel {
 8
 9    enum StateFilter: String, CaseIterable, Identifiable, Sendable {
10        case open, merged, closed, all
11        var id: String { rawValue }
12    }
13
14    let list: PagedListModel<MergeRequest>
15    let repoPath: String
16    var filter: StateFilter = .open {
17        didSet {
18            guard filter != oldValue else { return }
19            configureList()
20            Task { await list.reload() }
21        }
22    }
23
24    init(client: GitbayClient, repoPath: String) {
25        self.repoPath = repoPath
26        list = PagedListModel(
27            client: client,
28            argv: ["mr", "list", repoPath, "--state", StateFilter.open.rawValue],
29            emptyMessage: "No open merge requests."
30        )
31    }
32
33    var state: LoadState<[MergeRequest]> { list.state }
34
35    func load() async {
36        await list.reload()
37    }
38
39    private func configureList() {
40        list.argv = ["mr", "list", repoPath, "--state", filter.rawValue]
41        list.emptyMessage =
42            "No \(filter == .all ? "" : filter.rawValue + " ")merge requests."
43    }
44}