krz/rune

an ios client for njalla

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

v1.2.0: Rune/Views/Settings/WalletTransactionsView.swift · raw

 1import SwiftUI
 2
 3struct WalletTransactionsView: View {
 4    @ObservedObject var viewModel: WalletViewModel
 5    let client: NjallaClient
 6
 7    var body: some View {
 8        List {
 9            if let errorMessage = viewModel.transactionsErrorMessage {
10                Section {
11                    InlineErrorView(message: errorMessage, retryTitle: "Retry Transactions") {
12                        Task {
13                            await viewModel.loadTransactions(client: client)
14                        }
15                    }
16                    .listRowInsets(EdgeInsets(top: 8, leading: 16, bottom: 8, trailing: 16))
17                }
18            }
19
20            if viewModel.isLoadingTransactions && viewModel.transactions.isEmpty {
21                Section {
22                    HStack {
23                        Spacer()
24                        ProgressView("Loading Transactions")
25                        Spacer()
26                    }
27                }
28            } else if viewModel.transactions.isEmpty {
29                Section {
30                    ContentUnavailableView(
31                        "No Transactions",
32                        systemImage: "eurosign.circle",
33                        description: Text("No wallet transactions were returned for this account.")
34                    )
35                }
36            } else {
37                ForEach(viewModel.transactions) { transaction in
38                    NavigationLink {
39                        WalletPaymentDetailView(transactionID: transaction.id, viewModel: viewModel, client: client)
40                    } label: {
41                        VStack(alignment: .leading, spacing: 4) {
42                            Text(transaction.type ?? "Transaction")
43                                .font(.headline)
44                            Text(transactionDateText(transaction))
45                                .font(.subheadline)
46                                .foregroundStyle(.secondary)
47                            if let amount = transaction.amount {
48                                Text("Amount: €\(amount)")
49                                    .font(.subheadline)
50                                    .foregroundStyle(.secondary)
51                            }
52                        }
53                        .padding(.vertical, 4)
54                    }
55                }
56            }
57        }
58        .listStyle(.insetGrouped)
59        .navigationTitle("Transactions")
60        .navigationBarTitleDisplayMode(.inline)
61        .task {
62            await viewModel.loadTransactions(client: client)
63        }
64        .refreshable {
65            await viewModel.loadTransactions(client: client)
66        }
67    }
68
69    private func transactionDateText(_ transaction: WalletTransaction) -> String {
70        if let date = transaction.date, !date.isEmpty {
71            return date
72        }
73        return "ID: \(transaction.id)"
74    }
75}