commit b55636052a215c175e6a9f1bd341fa5827e85321
parent 0160e38ff3b9f8b59481c28156722e27afaf006e
Author: Marc Stibane <marc@taler.net>
Date: Wed, 23 Jul 2025 19:42:59 +0200
output tx
Diffstat:
8 files changed, 53 insertions(+), 39 deletions(-)
diff --git a/TalerWallet1/Views/Actions/Banking/ManualWithdrawDone.swift b/TalerWallet1/Views/Actions/Banking/ManualWithdrawDone.swift
@@ -22,7 +22,7 @@ struct ManualWithdrawDone: View {
@State private var acceptManualWithdrawalResult: AcceptManualWithdrawalResult?
@State private var transactionId: String?
- @State private var noTransaction: TalerTransaction? = nil
+ @State private var talerTX: TalerTransaction = TalerTransaction(dummyCurrency: DEMOCURRENCY)
let navTitle = String(localized: "Wire Transfer")
@@ -46,7 +46,7 @@ struct ManualWithdrawDone: View {
TransactionSummaryV(stack: stack.push(),
// scope: scope, // TODO: use data from tx itself
transactionId: transactionId,
- outTransaction: $noTransaction,
+ talerTX: $talerTX,
navTitle: navTitle,
hasDone: true,
abortAction: nil,
diff --git a/TalerWallet1/Views/Actions/Peer2peer/P2PReadyV.swift b/TalerWallet1/Views/Actions/Peer2peer/P2PReadyV.swift
@@ -33,6 +33,7 @@ struct P2PReadyV: View {
let navTitle = String(localized: "Ready")
@State private var transactionId: String? = nil
@State private var noTransaction: TalerTransaction? = nil
+ @State private var talerTX = TalerTransaction(dummyCurrency: DEMOCURRENCY)
@Namespace var namespace
@MainActor
@@ -81,7 +82,7 @@ struct P2PReadyV: View {
TransactionSummaryV(stack: stack.push(),
// scope: scope,
transactionId: transactionId,
- outTransaction: $noTransaction,
+ talerTX: $talerTX,
navTitle: navTitle,
hasDone: true,
abortAction: nil,
@@ -119,6 +120,7 @@ struct P2PReadyV: View {
if controller.oimModeActive {
OIMp2pReadyView(stack: stack.push(),
transactionId: $transactionId,
+ talerTX: talerTX,
scope: scope,
action: doneAction)
.environmentObject(NamespaceWrapper(namespace)) // keep OIMviews apart
diff --git a/TalerWallet1/Views/OIM/OIMp2pReadyView.swift b/TalerWallet1/Views/OIM/OIMp2pReadyView.swift
@@ -13,6 +13,7 @@ import taler_swift
struct OIMp2pReadyView: View {
let stack: CallStack
@Binding var transactionId: String?
+ let talerTX: TalerTransaction
let scope: ScopeInfo
let action: () -> Void
@@ -21,14 +22,30 @@ struct OIMp2pReadyView: View {
@State private var sending = false // user tapped on Send
@State private var appeared = false
-
var body: some View {
// let _ = Self._printChanges()
OIMbackground() {
VStack {
if let transactionId {
- Text(verbatim: "transaction sent")
+ if talerTX.isPendingReady {
+ let details = talerTX.detailsToShow()
+ let keys = details.keys
+ if keys.contains(TALERURI) {
+ if let talerURI = details[TALERURI] {
+ if talerURI.count > 10 {
+ Group {
+ Spacer()
+ let size = 240.0
+ QRGeneratorView(text: talerURI, size: size)
+ .frame(maxWidth: .infinity, alignment: .center)
+ .accessibilityLabel(Text("QR Code", comment: "a11y"))
+ Spacer()
+ }
+ }
+ }
+ }
+ }
} else {
LoadingView(stack: stack.push(),
scopeInfo: scope,
diff --git a/TalerWallet1/Views/Sheets/Payment/PaymentDone.swift b/TalerWallet1/Views/Sheets/Payment/PaymentDone.swift
@@ -18,7 +18,7 @@ struct PaymentDone: View {
@EnvironmentObject private var model: WalletModel
@State private var paymentDone: Bool = false
- @State private var noTransaction: TalerTransaction? = nil
+ @State private var talerTX: TalerTransaction = TalerTransaction(dummyCurrency: DEMOCURRENCY)
@MainActor
private func viewDidLoad() async {
@@ -41,7 +41,7 @@ struct PaymentDone: View {
TransactionSummaryV(stack: stack.push(),
// scope: scope,
transactionId: transactionId,
- outTransaction: $noTransaction,
+ talerTX: $talerTX,
navTitle: navTitle,
hasDone: true,
abortAction: nil,
diff --git a/TalerWallet1/Views/Sheets/Refund/RefundURIView.swift b/TalerWallet1/Views/Sheets/Refund/RefundURIView.swift
@@ -22,7 +22,7 @@ struct RefundURIView: View {
@State var refundTransactionId: String? = nil
// @State var transaction: Transaction?
// @State private var currencyInfo: CurrencyInfo = CurrencyInfo.zero(UNKNOWN)
- @State private var noTransaction: TalerTransaction? = nil
+ @State private var talerTX: TalerTransaction = TalerTransaction(dummyCurrency: DEMOCURRENCY)
@MainActor
private func viewDidLoad() async {
@@ -43,7 +43,7 @@ struct RefundURIView: View {
TransactionSummaryV(stack: stack.push(),
// scope: scope,
transactionId: refundTransactionId,
- outTransaction: $noTransaction,
+ talerTX: $talerTX,
navTitle: nil, // navTitle,
hasDone: true,
abortAction: model.abortTransaction,
diff --git a/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptDone.swift b/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptDone.swift
@@ -21,7 +21,7 @@ struct WithdrawAcceptDone: View {
@EnvironmentObject private var model: WalletModel
@State private var transactionId: String? = nil
- @State private var transaction: TalerTransaction? = TalerTransaction(dummyCurrency: DEMOCURRENCY)
+ @State private var talerTX: TalerTransaction = TalerTransaction(dummyCurrency: DEMOCURRENCY)
let navTitle = String(localized: "Authorize at Bank", comment: "Nav title")
@@ -54,7 +54,7 @@ struct WithdrawAcceptDone: View {
TransactionSummaryV(stack: stack.push(),
// scope: scope,
transactionId: transactionId,
- outTransaction: $transaction,
+ talerTX: $talerTX,
navTitle: navTitle,
hasDone: true,
abortAction: nil,
@@ -66,17 +66,16 @@ struct WithdrawAcceptDone: View {
.interactiveDismissDisabled() // can only use "Done" button to dismiss
.navigationTitle(navTitle)
.safeAreaInset(edge: .bottom) {
- if let transaction { // will always succed
- if transaction.common.type != .dummy {
- Button(transaction.shouldConfirm ? "Authorize later" : "Done") { dismissTop(stack.push()) }
- .buttonStyle(TalerButtonStyle(type: transaction.shouldConfirm ? .bordered : .prominent))
+ let shouldConfirm = talerTX.shouldConfirm
+ if talerTX.common.type != .dummy {
+ Button(shouldConfirm ? "Authorize later" : "Done") { dismissTop(stack.push()) }
+ .buttonStyle(TalerButtonStyle(type: shouldConfirm ? .bordered : .prominent))
.padding(.horizontal)
} else {
Button("Cancel") { dismissTop(stack.push()) }
.buttonStyle(TalerButtonStyle(type: .bordered))
.padding(.horizontal)
}
- }
}
.onAppear() {
symLog.log("onAppear")
diff --git a/TalerWallet1/Views/Transactions/TransactionSummaryV.swift b/TalerWallet1/Views/Transactions/TransactionSummaryV.swift
@@ -30,7 +30,7 @@ struct TransactionSummaryV: View {
let stack: CallStack
// let scope: ScopeInfo?
let transactionId: String
- @Binding var outTransaction: TalerTransaction?
+ @Binding var talerTX: TalerTransaction
let navTitle: String?
let hasDone: Bool
let abortAction: ((_ transactionId: String, _ viewHandles: Bool) async throws -> Void)?
@@ -54,7 +54,6 @@ struct TransactionSummaryV: View {
@State private var ignoreThis: Bool = false
@State private var didDelete: Bool = false
- @State var transaction = TalerTransaction(dummyCurrency: DEMOCURRENCY)
@State var jsonTransaction: String = ""
@State var viewId = UUID()
@Namespace var topID
@@ -63,10 +62,7 @@ struct TransactionSummaryV: View {
if let reloadedTransaction = try? await model.getTransactionById(transactionId,
withTerms: true, viewHandles: false) {
symLog.log("reloaded transaction: \(reloadedTransaction.common.txState.major)")
- withAnimation { transaction = reloadedTransaction; viewId = UUID() } // redraw
- if outTransaction != nil {
- outTransaction = reloadedTransaction
- }
+ withAnimation { talerTX = reloadedTransaction; viewId = UUID() } // redraw
if developerMode {
if let json = try? await model.jsonTransactionById(transactionId,
withTerms: true, viewHandles: false) {
@@ -76,7 +72,7 @@ struct TransactionSummaryV: View {
}
}
} else {
- withAnimation{ transaction = TalerTransaction(dummyCurrency: DEMOCURRENCY); viewId = UUID() }
+ withAnimation{ talerTX = TalerTransaction(dummyCurrency: DEMOCURRENCY); viewId = UUID() }
jsonTransaction = ""
}
}
@@ -86,7 +82,7 @@ struct TransactionSummaryV: View {
func checkDismiss(_ notification: Notification, _ logStr: String = EMPTYSTRING) -> Bool {
if hasDone {
if let transition = notification.userInfo?[TRANSACTIONTRANSITION] as? TransactionTransition {
- if transition.transactionId == transaction.common.transactionId { // is the transition for THIS transaction?
+ if transition.transactionId == talerTX.common.transactionId { // is the transition for THIS transaction?
symLog.log(logStr)
dismissTop(stack.push()) // if this view is in a sheet then dissmiss the sheet
return true
@@ -113,7 +109,7 @@ struct TransactionSummaryV: View {
let newMajor = transition.newTxState.major
Task { // runs on MainActor
// flush the screen first, then reload
- withAnimation { transaction = TalerTransaction(dummyCurrency: DEMOCURRENCY); viewId = UUID() }
+ withAnimation { talerTX = TalerTransaction(dummyCurrency: DEMOCURRENCY); viewId = UUID() }
symLog.log("newState: \(newMajor), reloading transaction")
if newMajor != .none { // don't reload after delete
await loadTransaction()
@@ -131,18 +127,18 @@ struct TransactionSummaryV: View {
let _ = Self._printChanges()
let _ = symLog.vlog() // just to get the # to compare it with .onAppear & onDisappear
#endif
- let common = transaction.common
+ let common = talerTX.common
if common.type != .dummy {
let scope = common.scopes.first // might be nil if scopes == []
// let pending = transaction.isPending
let locale = TalerDater.shared.locale
let (dateString, date) = TalerDater.dateString(common.timestamp, minimalistic)
let a11yDate = TalerDater.accessibilityDate(date) ?? dateString
- let navTitle2 = transaction.isDone ? transaction.localizedTypePast
- : transaction.localizedType
+ let navTitle2 = talerTX.isDone ? talerTX.localizedTypePast
+ : talerTX.localizedType
List {
if developerMode {
- if transaction.isSuspendable { if let suspendAction {
+ if talerTX.isSuspendable { if let suspendAction {
TransactionButton(transactionId: common.transactionId,
command: .suspend,
warning: nil,
@@ -150,7 +146,7 @@ struct TransactionSummaryV: View {
action: suspendAction)
.listRowSeparator(.hidden)
} }
- if transaction.isResumable { if let resumeAction {
+ if talerTX.isResumable { if let resumeAction {
TransactionButton(transactionId: common.transactionId,
command: .resume,
warning: nil,
@@ -167,8 +163,8 @@ struct TransactionSummaryV: View {
.id(topID)
let majorState = common.txState.major.localizedState
let minorState = common.txState.minor?.localizedState ?? nil
- let state = developerMode ? transaction.isPending ? minorState ?? majorState
- : majorState
+ let state = developerMode ? talerTX.isPending ? minorState ?? majorState
+ : majorState
: majorState
let statusT = Text(state)
.multilineTextAlignment(.trailing)
@@ -208,29 +204,29 @@ struct TransactionSummaryV: View {
TypeDetail(stack: stack.push(),
scope: scope,
- transaction: $transaction,
+ transaction: $talerTX,
hasDone: hasDone)
// TODO: Retry Countdown, Retry Now button
-// if transaction.isRetryable, let retryAction {
+// if talerTX.isRetryable, let retryAction {
// TransactionButton(transactionId: common.transactionId, command: .retry,
// warning: nil, action: abortAction)
// } // Retry button
- if transaction.isAbortable, let abortAction {
+ if talerTX.isAbortable, let abortAction {
TransactionButton(transactionId: common.transactionId,
command: .abort,
warning: String(localized: "Are you sure you want to abort this transaction?"),
didExecute: $ignoreThis,
action: abortAction)
} // Abort button
- if transaction.isFailable, let failAction {
+ if talerTX.isFailable, let failAction {
TransactionButton(transactionId: common.transactionId,
command: .fail,
warning: String(localized: "Are you sure you want to abandon this transaction?"),
didExecute: $ignoreThis,
action: failAction)
} // Fail button
- if transaction.isDeleteable, let deleteAction {
+ if talerTX.isDeleteable, let deleteAction {
TransactionButton(transactionId: common.transactionId,
command: .delete,
warning: String(localized: "Are you sure you want to delete this transaction?"),
diff --git a/TalerWallet1/Views/Transactions/TransactionsListView.swift b/TalerWallet1/Views/Transactions/TransactionsListView.swift
@@ -140,7 +140,7 @@ struct TransactionsArraySliceV: View {
let reloadAllAction: (_ stack: CallStack) async -> ()
@EnvironmentObject private var model: WalletModel
- @State private var noTransaction: TalerTransaction? = nil
+ @State private var talerTX: TalerTransaction = TalerTransaction(dummyCurrency: DEMOCURRENCY)
var body: some View {
#if PRINT_CHANGES
@@ -157,7 +157,7 @@ struct TransactionsArraySliceV: View {
let destination = TransactionSummaryV(stack: stack.push(),
// scope: scope,
transactionId: transaction.id,
- outTransaction: $noTransaction,
+ talerTX: $talerTX,
navTitle: nil,
hasDone: false,
abortAction: abortAction,