taler-ios

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

commit 4da82257177c54b1fb834529007fc60bf21125b7
parent 2bafce290abf0804206cf557bea6733c9cb4ecd2
Author: Marc Stibane <marc@taler.net>
Date:   Sat, 10 Oct 2026 21:15:41 +0200

AI: cache invalidation

Diffstat:
MTalerWallet1/Controllers/Controller.swift | 13+++++++++----
MTalerWallet1/Views/Transactions/TransactionsEmptyView.swift | 10++++++++--
2 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/TalerWallet1/Controllers/Controller.swift b/TalerWallet1/Controllers/Controller.swift @@ -508,10 +508,15 @@ class Controller: ObservableObject { func updateExchange(for baseUrl: String, state: ExchangeState) { Task { if let exchange = await exchange(for: baseUrl) { - if exchange.tosStatus != state.tosStatus { - logger.log(" ❗️updating exchange: \(baseUrl)") - let model = WalletModel.shared - if let exchange2 = try? await model.getExchangeByUrl(url: baseUrl) { + // The notification only carries tosStatus - a detected, confirmed or reverted + // master-key change ("update-from-response", "key-change-confirmed") leaves it + // unchanged, so always re-fetch and compare what the views depend on. + let model = WalletModel.shared + if let exchange2 = try? await model.getExchangeByUrl(url: baseUrl, viewHandles: true) { + if exchange.tosStatus != exchange2.tosStatus || + exchange.masterPub != exchange2.masterPub || + exchange.unconfirmedKeyChange != exchange2.unconfirmedKeyChange { + logger.log(" ❗️updating exchange: \(baseUrl)") if let index = exchanges.firstIndex(where: {$0.exchangeBaseUrl == baseUrl}) { exchanges[index] = exchange2 } else { diff --git a/TalerWallet1/Views/Transactions/TransactionsEmptyView.swift b/TalerWallet1/Views/Transactions/TransactionsEmptyView.swift @@ -60,7 +60,7 @@ struct UnconfirmedKeyChangeView: View { } func acceptAction() { - if let exchange, let masterPub = exchange.masterPub { + if let exchange, let masterPub = exchange.unconfirmedKeyChange?.currentMasterPub ?? exchange.masterPub { Task { try? await model.confirmExchangeKeyChange(exchangeBaseUrl: baseURL, currentMasterPub: masterPub) @@ -110,7 +110,13 @@ struct UnconfirmedKeyChangeView: View { @MainActor private func viewDidLoad() async { - exchange = await controller.exchange(for: baseURL) + // confirm and purge must send the master key wallet-core uses *now* + // (not the controller's cached entry) or they fail with KEY_CHANGE_MISMATCH / BAD_REQUEST + if let fresh = try? await model.getExchangeByUrl(url: baseURL, viewHandles: true) { + exchange = fresh + } else { + exchange = await controller.exchange(for: baseURL) + } } var body: some View {