taler-ios

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

commit f33cb02637f69161a40ccb24abd2ef648f6b574f
parent 28a47758125a242a416a5d8884d2f130ef2e2d9f
Author: Marc Stibane <marc@taler.net>
Date:   Wed,  4 Nov 2026 10:54:09 +0100

localizedState, Repurchase handling

Diffstat:
MTalerWallet1/Model/Transaction.swift | 6++++++
MTalerWallet1/Views/Transactions/TransactionSummaryList.swift | 44++++++++++++++++++++++++--------------------
2 files changed, 30 insertions(+), 20 deletions(-)

diff --git a/TalerWallet1/Model/Transaction.swift b/TalerWallet1/Model/Transaction.swift @@ -78,6 +78,7 @@ enum TransactionMinorState: String, Codable { case .proposed: return self.rawValue // TODO: discuss case .ready: return String(localized: "MinorState.ready", defaultValue: "Ready", comment: "TxMinorState heading") case .rebindSession: return String(localized: "MinorState.rebindSession", defaultValue: "Restoring access", comment: "TxMinorState heading") + case .repurchase: return String(localized: "MinorState.repurchase", defaultValue: "Repurchase", comment: "TxMinorState heading") // case .track: return self.rawValue default: return nil } @@ -806,6 +807,11 @@ enum TalerTransaction: Decodable, Hashable, Identifiable, Sendable { } } + var paymentTransaction: PaymentTransaction? { + if case .payment(let paymentTransaction) = self { return paymentTransaction } + return nil + } + func amount() -> Amount { switch self { case .refresh(let refreshTransaction): diff --git a/TalerWallet1/Views/Transactions/TransactionSummaryList.swift b/TalerWallet1/Views/Transactions/TransactionSummaryList.swift @@ -136,6 +136,10 @@ struct TransactionSummaryList: View { } else { // no sheet but the details view -> reload checkReload(stack.push("checkDismiss2"), notification, logStr) } + } else if let paymentTransaction = talerTX.paymentTransaction, // is it a payment? + transition.transactionId == paymentTransaction.details.repurchaseTransactionId { + // repurchase detected: reload + doReload(stack.push("checkDismiss3"), transition: transition) } } return false @@ -150,6 +154,19 @@ struct TransactionSummaryList: View { } } + func doReload(_ stack: CallStack, transition: TransactionTransition) { + Task { // runs on MainActor + let newMajor = transition.newTxState.major + // flush the screen first, then reload + withAnimation { talerTX = TalerTransaction(dummyCurrency: DEMOCURRENCY); viewId = UUID() } + if newMajor != .none { // don't reload after delete + let message = stack.peek()?.message ?? "?" + symLog.log("newState: \(newMajor), reloading transaction, for: \(message)") + await loadTransaction() + } + } + } + func checkReload(_ stack: CallStack, _ notification: Notification, _ logStr: String = EMPTYSTRING) { if let transition: TransactionTransition = notification.userInfo?[TRANSACTIONTRANSITION] as? TransactionTransition { if transition.transactionId == transactionId { // is the transition for THIS transaction? @@ -163,18 +180,7 @@ struct TransactionSummaryList: View { hint: "Transaction has been deleted") model.setError(WalletBackendError.walletCoreError(error)) } else { - Task { // runs on MainActor - // flush the screen first, then reload - withAnimation { - talerTX = TalerTransaction(dummyCurrency: DEMOCURRENCY); - isWorking = false - viewId = UUID() - } - if newMajor != .none { // don't reload after delete - symLog.log("newState: \(newMajor), reloading transaction, for: \(message)") - await loadTransaction() - } - } + doReload(stack, transition: transition) } } } else { // Yikes - should never happen @@ -185,14 +191,12 @@ struct TransactionSummaryList: View { func localizedState(_ txState: TransactionState) -> String { let major = txState.major - if major != .failed { - if let minorState = txState.minor { - if developerMode { return minorState.localizedDbgState } -// if talerTX.isPayment { -// return String(localized: "Payment", comment: "TxMajorState heading") -// } - return minorState.localizedState ?? major.localizedState - } + if let minor = txState.minor { + if developerMode { return minor.localizedDbgState } +// if talerTX.isPayment { +// return String(localized: "Payment", comment: "TxMajorState heading") +// } + return minor.localizedState ?? major.localizedState } return major.localizedState }