commit 9ff0fd3aa5cb7dedb3c421688555d2b16c615fea
parent 563902ee110ac7722c2a785ebbd5f188af050835
Author: Marc Stibane <marc@taler.net>
Date: Wed, 26 Jul 2023 11:08:03 +0200
TransactionDetailView
Diffstat:
6 files changed, 109 insertions(+), 93 deletions(-)
diff --git a/TalerWallet1/Views/Exchange/ManualWithdrawDone.swift b/TalerWallet1/Views/Exchange/ManualWithdrawDone.swift
@@ -16,8 +16,8 @@ struct ManualWithdrawDone: View {
@EnvironmentObject private var model: WalletModel
- @State var acceptManualWithdrawalResult: AcceptManualWithdrawalResult?
- @State var transactionId: String?
+ @State private var acceptManualWithdrawalResult: AcceptManualWithdrawalResult?
+ @State private var transactionId: String?
func reloadOneAction(_ transactionId: String) async throws -> Transaction {
return try await model.getTransactionByIdT(transactionId)
@@ -28,14 +28,20 @@ struct ManualWithdrawDone: View {
let _ = Self._printChanges()
let _ = symLog.vlog() // just to get the # to compare it with .onAppear & onDisappear
#endif
- VStack {
+ Group {
if let transactionId {
TransactionDetailView(transactionId: transactionId,
reloadAction: reloadOneAction,
- doneAction: ViewState.shared.popToRootView)
+ navTitle: navTitle,
+ doneAction: ViewState.shared.popToRootView,
+ abortAction: nil,
+ deleteAction: nil,
+ failAction: nil,
+ suspendAction: nil,
+ resumeAction: nil)
.navigationBarBackButtonHidden(true)
.interactiveDismissDisabled() // can only use "Done" button to dismiss
- .navigationTitle(navTitle)
+// .navigationTitle(navTitle)
} else {
WithdrawProgressView(message: exchange.exchangeBaseUrl.trimURL())
.navigationTitle("Loading " + navTitle)
diff --git a/TalerWallet1/Views/Peer2peer/SendDone.swift b/TalerWallet1/Views/Peer2peer/SendDone.swift
@@ -23,41 +23,40 @@ struct SendDone: View {
@EnvironmentObject private var model: WalletModel
- @State var talerURI: String = ""
+ @State private var transactionId: String?
+
+ func reloadOneAction(_ transactionId: String) async throws -> Transaction {
+ return try await model.getTransactionByIdT(transactionId)
+ }
var body: some View {
- List {
- let incoming = (amountToSend == nil)
- QRCodeDetailView(talerURI: talerURI,
- incoming: incoming,
- amount: incoming ? amountToReceive : amountToSend)
- Text("QR code and link can also be scanned or copied / shared from Transactions later.")
- .multilineTextAlignment(.leading)
- .font(.subheadline)
- .padding(.top)
- }
- .listStyle(myListStyle.style).anyView
- .safeAreaInset(edge: .bottom) {
- Button("Done") {
- withAnimation() { ViewState.shared.popToRootView() }
- }
- .buttonStyle(TalerButtonStyle(type: .prominent))
- .padding(.horizontal)
- }
- .overlay {
- if talerURI.isEmpty {
- LoadingView(backButtonHidden: true)
+#if DEBUG
+ let _ = Self._printChanges()
+ let _ = symLog.vlog() // just to get the # to compare it with .onAppear & onDisappear
+#endif
+ VStack {
+ if let transactionId {
+ TransactionDetailView(transactionId: transactionId,
+ reloadAction: reloadOneAction,
+ navTitle: navTitle,
+ doneAction: ViewState.shared.popToRootView,
+ abortAction: nil,
+ deleteAction: nil,
+ failAction: nil,
+ suspendAction: nil,
+ resumeAction: nil)
+ .navigationBarBackButtonHidden(true)
+ .interactiveDismissDisabled() // can only use "Done" button to dismiss
+ .navigationTitle(navTitle)
+ } else {
+ WithdrawProgressView(message: "Loading...")
+ .navigationTitle(navTitle)
}
}
- .interactiveDismissDisabled() // can only use "Done" button to dismiss
- .navigationBarBackButtonHidden(true)
- .navigationTitle(navTitle)
-// .navigationBarHidden(true) // no back button, no title
- .background(WalletColors().backgroundColor.edgesIgnoringSafeArea(.all))
+// .background(WalletColors().backgroundColor.edgesIgnoringSafeArea(.all))
.task {
symLog.log(".task")
do {
- // generate talerURI
let timestamp = developerMode ? Timestamp.inSomeMinutes(expireDays > 20 ? (24*60)
: expireDays > 5 ? 60 : 3)
: Timestamp.inSomeDays(expireDays)
@@ -67,18 +66,17 @@ struct SendDone: View {
purse_expiration: timestamp)
// TODO: user might choose baseURL
let response = try await model.initiatePeerPushDebitM(nil, terms: terms)
- talerURI = response.talerUri
+ transactionId = response.transactionId
} else if let amountToReceive {
let terms = PeerContractTerms(amount: amountToReceive,
summary: summary,
purse_expiration: timestamp)
// TODO: user might choose baseURL
let response = try await model.initiatePeerPullCreditM(nil, terms: terms)
- talerURI = response.talerUri
- } else { talerURI = "" }
+ transactionId = response.transactionId
+ } else { fatalError() }
} catch { // TODO: error
symLog.log(error.localizedDescription)
- talerURI = ""
}
} // task
}
@@ -90,8 +88,7 @@ struct SendNow_Previews: PreviewProvider {
SendDone(amountToSend: try! Amount(fromString: LONGCURRENCY + ":4.8"),
amountToReceive: nil,
summary: "some purpose",
- expireDays: 0,
- talerURI: "taler://pay-push/exchange.demo.taler.net/95ZG4D1AGFGZQ7CNQ1V49D3FT18HXKA6HQT4X3XME9YSJQVFQ520")
+ expireDays: 0)
}
}
}
diff --git a/TalerWallet1/Views/Sheets/P2P_Sheets/P2pAcceptDone.swift b/TalerWallet1/Views/Sheets/P2P_Sheets/P2pAcceptDone.swift
@@ -30,7 +30,13 @@ struct P2pAcceptDone: View {
: String(localized: "Paid P2P", comment: "Title, short")
TransactionDetailView(transactionId: transactionId,
reloadAction: reloadOneAction,
- doneAction: { dismissTop() })
+ navTitle: navTitle,
+ doneAction: { dismissTop() },
+ abortAction: nil,
+ deleteAction: nil,
+ failAction: nil,
+ suspendAction: nil,
+ resumeAction: nil)
.navigationBarBackButtonHidden(true)
.interactiveDismissDisabled() // can only use "Done" button to dismiss
.navigationTitle(navTitle)
diff --git a/TalerWallet1/Views/Transactions/TransactionDetailView.swift b/TalerWallet1/Views/Transactions/TransactionDetailView.swift
@@ -30,18 +30,20 @@ struct TransactionDetailView: View {
@AppStorage("developerMode") var developerMode: Bool = false
#endif
- var transactionId: String
+ let transactionId: String
+ let reloadAction: ((_ transactionId: String) async throws -> Transaction)
+
+ let navTitle: String?
+ let doneAction: (() -> Void)?
+ let abortAction: ((_ transactionId: String) async throws -> Void)?
+ let deleteAction: ((_ transactionId: String) async throws -> Void)?
+ let failAction: ((_ transactionId: String) async throws -> Void)?
+ let suspendAction: ((_ transactionId: String) async throws -> Void)?
+ let resumeAction: ((_ transactionId: String) async throws -> Void)?
+
@State var transaction: Transaction = Transaction(dummyCurrency: DEMOCURRENCY)
@State var viewId = UUID()
- var reloadAction: ((_ transactionId: String) async throws -> Transaction)
- var abortAction: ((_ transactionId: String) async throws -> Void)?
- var deleteAction: ((_ transactionId: String) async throws -> Void)?
- var failAction: ((_ transactionId: String) async throws -> Void)?
- var doneAction: (() -> Void)?
- var suspendAction: ((_ transactionId: String) async throws -> Void)?
- var resumeAction: ((_ transactionId: String) async throws -> Void)?
-
var body: some View {
#if DEBUG
let _ = Self._printChanges()
@@ -51,7 +53,7 @@ struct TransactionDetailView: View {
let pending = transaction.isPending
let dateString = TalerDater.dateString(from: common.timestamp)
let localizedType = transaction.localizedType
- let navTitle = pending ? String(localized: "Pending")
+ let navTitle2 = pending ? String(localized: "Pending")
: localizedType
Group {
List {
@@ -77,7 +79,7 @@ struct TransactionDetailView: View {
Text("Status: \(common.txState.major.localizedState)")
.font(.title2)
} .listRowSeparator(.automatic)
- SwitchCase(transaction: $transaction)
+ SwitchCase(transaction: $transaction, hasDone: doneAction != nil)
if transaction.isAbortable { if let abortAction {
TransactionButton(transactionId: common.transactionId,
@@ -144,7 +146,7 @@ struct TransactionDetailView: View {
symLog.log(notification.userInfo as Any)
}
}
- .navigationTitle(navTitle)
+ .navigationTitle(navTitle ?? navTitle2)
.task {
do {
symLog.log("task - load transaction")
@@ -168,6 +170,7 @@ struct TransactionDetailView: View {
//extension TransactionDetail {
struct SwitchCase: View {
@Binding var transaction: Transaction
+ let hasDone: Bool
var body: some View {
let common = transaction.common
@@ -238,6 +241,12 @@ struct TransactionDetailView: View {
// TODO: isSendCoins should show QR only while not expired
if pending {
QRCodeDetails(transaction: transaction)
+ if hasDone {
+ Text("QR code and link can also be scanned or copied / shared from Transactions later.")
+ .multilineTextAlignment(.leading)
+ .font(.subheadline)
+ .padding(.top)
+ }
}
ThreeAmountsSheet(common: common, topTitle: transaction.localizedType,
baseURL: details.exchangeBaseUrl, large: false)
diff --git a/TalerWallet1/Views/Transactions/TransactionsListView.swift b/TalerWallet1/Views/Transactions/TransactionsListView.swift
@@ -75,49 +75,41 @@ struct TransactionsListView: View {
}
}
// MARK: -
-//extension TransactionsListView {
- struct TransactionsRowsView: View {
- let symLog: SymLogV?
- let currency: String
- let transactions: [Transaction]
-// let reloadAllAction: () async -> ()
- let reloadOneAction: ((_ transactionId: String) async throws -> Transaction)
+struct TransactionsRowsView: View {
+ let symLog: SymLogV?
+ let currency: String
+ let transactions: [Transaction]
+// let reloadAllAction: () async -> ()
+ let reloadOneAction: ((_ transactionId: String) async throws -> Transaction)
- @EnvironmentObject private var model: WalletModel
- var body: some View {
+ @EnvironmentObject private var model: WalletModel
+ var body: some View {
#if DEBUG
- let _ = Self._printChanges()
- let _ = symLog?.vlog() // just to get the # to compare it with .onAppear & onDisappear
+ let _ = Self._printChanges()
+ let _ = symLog?.vlog() // just to get the # to compare it with .onAppear & onDisappear
#endif
- let abortAction = model.abortTransaction
- let deleteAction = model.deleteTransaction
- let failAction = model.failTransaction
- let suspendAction = model.suspendTransaction
- let resumeAction = model.resumeTransaction
- ForEach(Array(zip(transactions.indices, transactions)), id: \.1) { index, transaction in
- NavigationLink { LazyView { // whole row like in a tableView
- TransactionDetailView(transactionId: transaction.id,
- reloadAction: reloadOneAction,
- abortAction: abortAction,
- deleteAction: deleteAction,
- failAction: failAction,
- suspendAction: suspendAction,
- resumeAction: resumeAction)
- }} label: {
- TransactionRowView(transaction: transaction)
- }
- .id(Int(index))
+ let abortAction = model.abortTransaction
+ let deleteAction = model.deleteTransaction
+ let failAction = model.failTransaction
+ let suspendAction = model.suspendTransaction
+ let resumeAction = model.resumeTransaction
+ ForEach(Array(zip(transactions.indices, transactions)), id: \.1) { index, transaction in
+ NavigationLink {
+ LazyView {
+ TransactionDetailView(transactionId: transaction.id,
+ reloadAction: reloadOneAction,
+ navTitle: nil,
+ doneAction: nil,
+ abortAction: abortAction,
+ deleteAction: deleteAction,
+ failAction: failAction,
+ suspendAction: suspendAction,
+ resumeAction: resumeAction)
}
- // pending may not be deleted, but only aborted
-// .onDelete(perform: removeItems) // delete this row from the list
+ } label: {
+ TransactionRowView(transaction: transaction)
+ }
+ .id(Int(index))
}
}
-//}
-// MARK: -
-#if DEBUG
-//struct TransactionsView_Previews: PreviewProvider {
-// static var previews: some View {
-// TransactionsView()
-// }
-//}
-#endif
+}
diff --git a/TalerWallet1/Views/WithdrawBankIntegrated/WithdrawAcceptDone.swift b/TalerWallet1/Views/WithdrawBankIntegrated/WithdrawAcceptDone.swift
@@ -32,7 +32,13 @@ struct WithdrawAcceptDone: View {
if let transactionId {
TransactionDetailView(transactionId: transactionId,
reloadAction: reloadOneAction,
- doneAction: { dismissTop() })
+ navTitle: navTitle,
+ doneAction: { dismissTop() },
+ abortAction: nil,
+ deleteAction: nil,
+ failAction: nil,
+ suspendAction: nil,
+ resumeAction: nil)
.navigationBarBackButtonHidden(true)
.interactiveDismissDisabled() // can only use "Done" button to dismiss
.navigationTitle(navTitle)