krz/rune
an ios client for njalla
clone: git clone https://gitbay.org/krz/rune.git
main: 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}