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}