krz/rune

an ios client for njalla

clone: git clone https://gitbay.org/krz/rune.git

v1.2.0: Rune/ViewModels/WalletViewModel.swift · raw

 1import Combine
 2import Foundation
 3
 4@MainActor
 5final class WalletViewModel: ObservableObject {
 6    @Published private(set) var transactions: [WalletTransaction] = []
 7    @Published private(set) var selectedPayment: WalletPayment?
 8    @Published private(set) var isLoadingTransactions = false
 9    @Published private(set) var isLoadingPayment = false
10    @Published var transactionsErrorMessage: String?
11    @Published var paymentErrorMessage: String?
12
13    func reset() {
14        transactions = []
15        selectedPayment = nil
16        isLoadingTransactions = false
17        isLoadingPayment = false
18        transactionsErrorMessage = nil
19        paymentErrorMessage = nil
20    }
21
22    func loadTransactions(client: NjallaClient) async {
23        guard !isLoadingTransactions else { return }
24
25        isLoadingTransactions = true
26        defer {
27            isLoadingTransactions = false
28        }
29
30        do {
31            transactions = try await client.listTransactions().sorted {
32                ($0.date ?? "", $0.id) > ($1.date ?? "", $1.id)
33            }
34            transactionsErrorMessage = nil
35        } catch is CancellationError {
36            return
37        } catch {
38            if (error as? URLError)?.code == .cancelled {
39                return
40            }
41            transactionsErrorMessage = error.userFacingMessage
42        }
43    }
44
45    func loadPayment(id: String, client: NjallaClient) async {
46        guard !isLoadingPayment else { return }
47
48        isLoadingPayment = true
49        defer {
50            isLoadingPayment = false
51        }
52
53        do {
54            selectedPayment = try await client.getPayment(id: id)
55            paymentErrorMessage = nil
56        } catch is CancellationError {
57            return
58        } catch {
59            if (error as? URLError)?.code == .cancelled {
60                return
61            }
62            paymentErrorMessage = error.userFacingMessage
63        }
64    }
65}