taler-ios

iOS apps for GNU Taler (wallet)
Log | Files | Refs | README | LICENSE

commit b55636052a215c175e6a9f1bd341fa5827e85321
parent 0160e38ff3b9f8b59481c28156722e27afaf006e
Author: Marc Stibane <marc@taler.net>
Date:   Wed, 23 Jul 2025 19:42:59 +0200

output tx

Diffstat:
MTalerWallet1/Views/Actions/Banking/ManualWithdrawDone.swift | 4++--
MTalerWallet1/Views/Actions/Peer2peer/P2PReadyV.swift | 4+++-
MTalerWallet1/Views/OIM/OIMp2pReadyView.swift | 21+++++++++++++++++++--
MTalerWallet1/Views/Sheets/Payment/PaymentDone.swift | 4++--
MTalerWallet1/Views/Sheets/Refund/RefundURIView.swift | 4++--
MTalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptDone.swift | 13++++++-------
MTalerWallet1/Views/Transactions/TransactionSummaryV.swift | 38+++++++++++++++++---------------------
MTalerWallet1/Views/Transactions/TransactionsListView.swift | 4++--
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,