summaryrefslogtreecommitdiff
path: root/Rune/Views/Settings/WalletTransactionsView.swift
diff options
context:
space:
mode:
Diffstat (limited to 'Rune/Views/Settings/WalletTransactionsView.swift')
-rw-r--r--Rune/Views/Settings/WalletTransactionsView.swift75
1 files changed, 75 insertions, 0 deletions
diff --git a/Rune/Views/Settings/WalletTransactionsView.swift b/Rune/Views/Settings/WalletTransactionsView.swift
new file mode 100644
index 0000000..f0106de
--- /dev/null
+++ b/Rune/Views/Settings/WalletTransactionsView.swift
@@ -0,0 +1,75 @@
+import SwiftUI
+
+struct WalletTransactionsView: View {
+ @ObservedObject var viewModel: WalletViewModel
+ let client: NjallaClient
+
+ var body: some View {
+ List {
+ if let errorMessage = viewModel.transactionsErrorMessage {
+ Section {
+ InlineErrorView(message: errorMessage, retryTitle: "Retry Transactions") {
+ Task {
+ await viewModel.loadTransactions(client: client)
+ }
+ }
+ .listRowInsets(EdgeInsets(top: 8, leading: 16, bottom: 8, trailing: 16))
+ }
+ }
+
+ if viewModel.isLoadingTransactions && viewModel.transactions.isEmpty {
+ Section {
+ HStack {
+ Spacer()
+ ProgressView("Loading Transactions")
+ Spacer()
+ }
+ }
+ } else if viewModel.transactions.isEmpty {
+ Section {
+ ContentUnavailableView(
+ "No Transactions",
+ systemImage: "eurosign.circle",
+ description: Text("No wallet transactions were returned for this account.")
+ )
+ }
+ } else {
+ ForEach(viewModel.transactions) { transaction in
+ NavigationLink {
+ WalletPaymentDetailView(transactionID: transaction.id, viewModel: viewModel, client: client)
+ } label: {
+ VStack(alignment: .leading, spacing: 4) {
+ Text(transaction.type ?? "Transaction")
+ .font(.headline)
+ Text(transactionDateText(transaction))
+ .font(.subheadline)
+ .foregroundStyle(.secondary)
+ if let amount = transaction.amount {
+ Text("Amount: €\(amount)")
+ .font(.subheadline)
+ .foregroundStyle(.secondary)
+ }
+ }
+ .padding(.vertical, 4)
+ }
+ }
+ }
+ }
+ .listStyle(.insetGrouped)
+ .navigationTitle("Transactions")
+ .navigationBarTitleDisplayMode(.inline)
+ .task {
+ await viewModel.loadTransactions(client: client)
+ }
+ .refreshable {
+ await viewModel.loadTransactions(client: client)
+ }
+ }
+
+ private func transactionDateText(_ transaction: WalletTransaction) -> String {
+ if let date = transaction.date, !date.isEmpty {
+ return date
+ }
+ return "ID: \(transaction.id)"
+ }
+}