summaryrefslogtreecommitdiff
path: root/Rune/ViewModels/WalletViewModel.swift
blob: cbe0538ed05e949ecf77a006f6b21c542815dcd5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import Combine
import Foundation

@MainActor
final class WalletViewModel: ObservableObject {
    @Published private(set) var transactions: [WalletTransaction] = []
    @Published private(set) var selectedPayment: WalletPayment?
    @Published private(set) var isLoadingTransactions = false
    @Published private(set) var isLoadingPayment = false
    @Published var transactionsErrorMessage: String?
    @Published var paymentErrorMessage: String?

    func reset() {
        transactions = []
        selectedPayment = nil
        isLoadingTransactions = false
        isLoadingPayment = false
        transactionsErrorMessage = nil
        paymentErrorMessage = nil
    }

    func loadTransactions(client: NjallaClient) async {
        guard !isLoadingTransactions else { return }

        isLoadingTransactions = true
        defer {
            isLoadingTransactions = false
        }

        do {
            transactions = try await client.listTransactions().sorted {
                ($0.date ?? "", $0.id) > ($1.date ?? "", $1.id)
            }
            transactionsErrorMessage = nil
        } catch is CancellationError {
            return
        } catch {
            if (error as? URLError)?.code == .cancelled {
                return
            }
            transactionsErrorMessage = error.userFacingMessage
        }
    }

    func loadPayment(id: String, client: NjallaClient) async {
        guard !isLoadingPayment else { return }

        isLoadingPayment = true
        defer {
            isLoadingPayment = false
        }

        do {
            selectedPayment = try await client.getPayment(id: id)
            paymentErrorMessage = nil
        } catch is CancellationError {
            return
        } catch {
            if (error as? URLError)?.code == .cancelled {
                return
            }
            paymentErrorMessage = error.userFacingMessage
        }
    }
}