krz/rune

an ios client for njalla

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

main: Rune/Views/Settings/WalletPaymentDetailView.swift · raw

 1import SwiftUI
 2
 3struct WalletPaymentDetailView: View {
 4    let transactionID: String
 5    @ObservedObject var viewModel: WalletViewModel
 6    let client: NjallaClient
 7
 8    var body: some View {
 9        Group {
10            if viewModel.isLoadingPayment && viewModel.selectedPayment == nil {
11                ProgressView("Loading Payment")
12            } else if let payment = viewModel.selectedPayment {
13                List {
14                    Section("Payment") {
15                        detailRow(label: "ID", value: payment.id ?? transactionID)
16                        detailRow(label: "Status", value: payment.status ?? "Not available")
17                        detailRow(label: "Amount", value: payment.amount.map { "\($0)" } ?? "Not available")
18                        detailRow(label: "Address", value: payment.address ?? "Not available")
19                        detailRow(label: "URL", value: payment.url ?? "Not available")
20                    }
21                }
22                .listStyle(.insetGrouped)
23            } else if let errorMessage = viewModel.paymentErrorMessage {
24                ContentUnavailableView("Payment Unavailable", systemImage: "exclamationmark.triangle", description: Text(errorMessage))
25            } else {
26                ContentUnavailableView("Payment Unavailable", systemImage: "creditcard", description: Text("No payment details were returned for this transaction."))
27            }
28        }
29        .navigationTitle("Payment")
30        .navigationBarTitleDisplayMode(.inline)
31        .task {
32            await viewModel.loadPayment(id: transactionID, client: client)
33        }
34    }
35
36    private func detailRow(label: String, value: String) -> some View {
37        HStack {
38            Text(label)
39            Spacer()
40            Text(value)
41                .foregroundStyle(.secondary)
42                .multilineTextAlignment(.trailing)
43        }
44    }
45}