commit f33cb02637f69161a40ccb24abd2ef648f6b574f
parent 28a47758125a242a416a5d8884d2f130ef2e2d9f
Author: Marc Stibane <marc@taler.net>
Date: Wed, 4 Nov 2026 10:54:09 +0100
localizedState, Repurchase handling
Diffstat:
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
}