taler-ios

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

commit a19ca1c95f2159f541e75ffbf734038a62caf07d
parent d3027cd58be6af2568db6116ecae25520684269a
Author: Marc Stibane <marc@taler.net>
Date:   Sun, 27 Sep 2026 17:59:46 +0200

improve debugging

Diffstat:
MTalerCommon/Helper/Controller+playSound.swift | 4+++-
MTalerCommon/HelperViews/AmountV.swift | 1+
MTalerCommon/HelperViews/LaunchAnimationView.swift | 4+++-
MTalerWallet1/Backend/WalletCore.swift | 17+++++++++--------
MTalerWallet1/Controllers/Controller.swift | 15+++++++++++----
MTalerWallet1/Model/Model+Balances.swift | 10+++++-----
MTalerWallet1/Model/Model+Deposit.swift | 20++++++++++----------
MTalerWallet1/Model/Model+Exchange.swift | 8++++----
MTalerWallet1/Model/Model+P2P.swift | 18+++++++++---------
MTalerWallet1/Model/Model+Payment.swift | 12++++++------
MTalerWallet1/Model/Model+Pending.swift | 2+-
MTalerWallet1/Model/Model+Refund.swift | 2+-
MTalerWallet1/Model/Model+Settings.swift | 2+-
MTalerWallet1/Model/Model+Transactions.swift | 2+-
MTalerWallet1/Model/Model+Withdraw.swift | 14+++++++-------
MTalerWallet1/Model/WalletModel.swift | 31+++++++++++++++++--------------
MTalerWallet1/Views/HelperViews/LoadingView.swift | 1+
MTalerWallet1/Views/Main/WalletEmptyView.swift | 4+++-
MTalerWallet1/Views/Settings/AboutView.swift | 1+
MTalerWallet1/Views/Sheets/Payment/PaymentScan.swift | 2+-
MTalerWallet1/Views/Transactions/TransactionRowView.swift | 1+
MTalerWallet1/Views/Transactions/TransactionSummaryList.swift | 1+
MTalerWallet1/Views/Transactions/TransactionTypeDetail.swift | 10+++++++---
23 files changed, 104 insertions(+), 78 deletions(-)

diff --git a/TalerCommon/Helper/Controller+playSound.swift b/TalerCommon/Helper/Controller+playSound.swift @@ -38,7 +38,7 @@ extension Controller { } /// 0 = failure, 1 = received, 2 = sent - @MainActor func playSound(_ number: Int) { + @MainActor func playSound(_ number: Int, useSystem: Bool = false) { let sysVolume = AVAudioSession.sharedInstance().outputVolume let volume = sysVolume < 0.16 ? 2.5 // too bad we cannot make it louder : sysVolume < 0.21 ? 1.5 // nope, doesn't work @@ -83,6 +83,8 @@ extension Controller { } else { AudioServicesPlaySystemSound(soundID); } + } else if useSystem { + AudioServicesPlaySystemSound(soundID); } hapticNotification(number == 0 ? .error : .success) } diff --git a/TalerCommon/HelperViews/AmountV.swift b/TalerCommon/HelperViews/AmountV.swift @@ -32,6 +32,7 @@ struct AmountV: View { private func currencyTickerChanged() async { if let scope { +// print("currencyTickerChanged: \(amount.readableDescription)") currencyInfo = controller.info(for: scope) // might be nil! } } diff --git a/TalerCommon/HelperViews/LaunchAnimationView.swift b/TalerCommon/HelperViews/LaunchAnimationView.swift @@ -15,6 +15,7 @@ struct LaunchAnimationView: View { RotatingTaler(size: (350 < UIScreen.screenWidth) ? 200 : 250, progress: true, once: true, + background: nil, rotationEnabled: $rotationEnabled) .accessibilityLabel(Text("Progress indicator", comment: "a11y")) } @@ -25,6 +26,7 @@ struct RotatingTaler: View { let size: CGFloat let progress: Bool let once: Bool + let background: Color? @Binding var rotationEnabled: Bool @State private var rotationDirection = false @@ -66,7 +68,7 @@ struct RotatingTaler: View { image .background { Capsule() - .fill(Color(.systemGray6).opacity(0.7)) + .fill((background ?? Color(.systemGray6)).opacity(0.3)) } // } } diff --git a/TalerWallet1/Backend/WalletCore.swift b/TalerWallet1/Backend/WalletCore.swift @@ -160,9 +160,9 @@ extension WalletCore { if let walletError = decoded.error { // wallet-core sent an error message do { let jsonData = try JSONEncoder().encode(walletError) - let responseCode = walletError.code - logger.error("wallet-core sent back error \(walletError.code, privacy: .public), \(responseCode, privacy: .public) for request \(requestId, privacy: .public)") - symLog.log("id:\(requestId) \(walletError)") +#if !DEBUG + logger.error("wallet-core sent back error \(walletError.code, privacy: .public) for request \(requestId, privacy: .public)") +#endif completion(requestId, timeSent, message, jsonData, walletError) } catch { // JSON encoding of response.result failed / should never happen symLog.log(decoded) @@ -580,25 +580,26 @@ extension WalletCore { private func encodeAndSend(_ request: WalletBackendRequest, completionHandler: @escaping (UInt, Date, String?, Data?, TalerErrorDetail?) -> Void) { // Encode the request and send it to the backend. + let operation = request.operation queue.async { let requestId = self.reserveRequestId() let sendTime = Date.now do { - let full = FullRequest(operation: request.operation, id: requestId, args: request.args) + let full = FullRequest(operation: operation, id: requestId, args: request.args) // symLog.log(full) let encoded = try JSONEncoder().encode(full) guard let jsonString = String(data: encoded, encoding: .utf8) else { throw WalletBackendError.serializationError } let args = try JSONEncoder().encode(request.args) if let jsonArgs = String(data: args, encoding: .utf8) { - if request.operation == "getTransactionsV2" { + if operation == "getTransactionsV2" { if self.logTransactions { - self.logger.trace("🔴\"id\":\(requestId, privacy: .public) \(request.operation, privacy: .public)\(jsonArgs, privacy: .auto)") + self.logger.trace("🔴\"id\":\(requestId, privacy: .public) \(operation, privacy: .public)\(jsonArgs, privacy: .auto)") } } else { - self.logger.log("🔴\"id\":\(requestId, privacy: .public) \(request.operation, privacy: .public)\(jsonArgs, privacy: .auto)") + self.logger.log("🔴\"id\":\(requestId, privacy: .public) \(operation, privacy: .public)\(jsonArgs, privacy: .auto)") } } else { // should NEVER happen since the whole request was already successfully encoded and stringified - self.logger.log("🔴\"id\":\(requestId, privacy: .public) \(request.operation, privacy: .public) 🔴 Error: jsonArgs") + self.logger.log("🔴\"id\":\(requestId, privacy: .public) \(operation, privacy: .public) 🔴 Error: jsonArgs") } // register only after everything which can throw did succeed, but before // sending - the answer may arrive before sendMessage() even returns diff --git a/TalerWallet1/Controllers/Controller.swift b/TalerWallet1/Controllers/Controller.swift @@ -167,6 +167,7 @@ class Controller: ObservableObject { var messageForSheet: String? = nil var isLoadingChoices: String? = nil + var lastNewBalances: UInt = 0 var lastProgressError: RequestProgressError? = nil var lastProgressPhase: RequestProgressPhase? = nil var progressOperation: String? = nil @@ -352,17 +353,22 @@ class Controller: ObservableObject { @discardableResult func loadBalances(_ stack: CallStack) async -> Int? { let model = WalletModel.shared - if let response = try? await model.getBalances(stack.push()) { + if let (response, id) = try? await model.getBalances(stack.push()) { let reloaded = response.balances if reloaded != balances { for balance in reloaded { let scope = balance.scopeInfo checkInfo(for: scope) } - self.logger.log("••Got new balances, will redraw") +#if DEBUG + self.logger.log("\(id) ••Got new balances, will redraw") +#endif + lastNewBalances = id balances = reloaded // redraw } else { - self.logger.log("••Same balances, no redraw") +#if DEBUG + self.logger.log("\(id) ••Same balances as \(self.lastNewBalances), no redraw") +#endif } haveProdBalance = response.haveProdBalance return reloaded.count @@ -586,6 +592,7 @@ class Controller: ObservableObject { let walletCore = WalletCore.shared let model = WalletModel.shared let response = try await model.initWalletCore(setTesting: setTesting) +// throw WalletBackendError.initializationError // check how the app behaves if initWalletCore throws walletCore.versionInfo = response.versionInfo walletCore.nativeDB = (response.databaseBackend == "sqlite") if developerMode { @@ -633,7 +640,7 @@ class Controller: ObservableObject { } catch { // rethrows self.logger.error("\(error.localizedDescription)") backendState = .error(error.toEquatableError()) // ❗️Yikes app cannot continue - throw error +// throw error // will not be catched by MainView.task anyway } } else { self.logger.fault("Yikes❗️ wallet-core already initialized") diff --git a/TalerWallet1/Model/Model+Balances.swift b/TalerWallet1/Model/Model+Balances.swift @@ -167,15 +167,15 @@ struct DeleteSubscription: WalletBackendFormattedRequest { // MARK: - extension WalletModel { /// fetch Balances from Wallet-Core. No networking involved - nonisolated func getBalances(_ stack: CallStack, viewHandles: Bool = false) async throws -> BalancesResponse { + nonisolated func getBalances(_ stack: CallStack, viewHandles: Bool = false) async throws -> (BalancesResponse, UInt) { let request = Balances() - let response = try await sendRequest(request, viewHandles: viewHandles) - return response + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) + return (response, id) } /// fetch Discounts from Wallet-Core. No networking involved nonisolated func listDiscounts(_ stack: CallStack, viewHandles: Bool = false) async throws -> DiscountsResponse { let request = ListDiscounts() - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } /// delete a discount. No networking involved @@ -187,7 +187,7 @@ extension WalletModel { /// fetch Subscriptions from Wallet-Core. No networking involved nonisolated func listSubscriptions(_ stack: CallStack, viewHandles: Bool = false) async throws -> SubscriptionsResponse { let request = ListSubscriptions() - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } /// delete a subscription. No networking involved diff --git a/TalerWallet1/Model/Model+Deposit.swift b/TalerWallet1/Model/Model+Deposit.swift @@ -38,7 +38,7 @@ extension WalletModel { nonisolated func validateIban(_ iban: String, viewHandles: Bool = false) async throws -> Bool { let request = ValidateIban(iban: iban) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response.valid } } @@ -93,13 +93,13 @@ extension WalletModel { nonisolated func convertIbanAccountFieldToPayto(_ value: String, currency: String, viewHandles: Bool = false) async throws -> IbanAccountFieldToPaytoResponse { let request = IbanAccountFieldToPayto(value: value, currency: currency) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } nonisolated func convertIbanPaytoToAccountField(_ paytoUri: String, viewHandles: Bool = false) async throws -> IbanPaytoToAccountFieldResponse { let request = IbanPaytoToAccountField(paytoUri: paytoUri) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } } @@ -135,7 +135,7 @@ extension WalletModel { nonisolated func depositWireTypes(_ currency: String?, scopeInfo: ScopeInfo? = nil, viewHandles: Bool = false) async throws -> [WireTypeDetails] { let request = DepositWireTypes(currency: currency, scopeInfo: scopeInfo) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response.wireTypeDetails } } @@ -161,7 +161,7 @@ extension WalletModel { nonisolated func getMaxDepositAmount(_ scope: ScopeInfo, viewHandles: Bool = false) async throws -> Amount { let request = GetMaxDepositAmount(scope: scope) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response.rawAmount } } // getMaxDepositAmount @@ -202,7 +202,7 @@ extension WalletModel { let controller = Controller.shared controller.progressOperation = request.operation controller.progressToken = depositPaytoUri - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } } @@ -237,7 +237,7 @@ extension WalletModel { let controller = Controller.shared controller.progressOperation = request.operation controller.progressToken = depositPaytoUri - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } } @@ -280,7 +280,7 @@ extension WalletModel { nonisolated func listBankAccounts(_ currency: String? = nil, viewHandles: Bool = false) async throws -> [BankAccountsInfo] { let request = ListBankAccounts(currency: currency) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response.accounts } } @@ -300,7 +300,7 @@ extension WalletModel { nonisolated func getBankAccountById(_ bankAccountId: String, viewHandles: Bool = false) async throws -> BankAccountsInfo { let request = GetBankAccountById(bankAccountId: bankAccountId) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } } @@ -332,7 +332,7 @@ extension WalletModel { viewHandles: Bool = false) async throws -> String { let request = AddBankAccount(uri: uri, label: label, replace: replace) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response.bankAccountId } } diff --git a/TalerWallet1/Model/Model+Exchange.swift b/TalerWallet1/Model/Model+Exchange.swift @@ -349,7 +349,7 @@ extension WalletModel { let request = ListExchanges(scope: scope, filterByType: filterByType, // .demo, .prod filterByStatus: filterByStatus) // .used, .preset - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response.exchanges } catch { return [] // empty, but not nil @@ -361,7 +361,7 @@ extension WalletModel { async -> [DefaultExchange] { // M for MainActor do { let request = DefaultExchanges() - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response.candidates } catch { return [] // empty, but not nil @@ -373,7 +373,7 @@ extension WalletModel { async throws -> Exchange { let request = GetExchangeByUrl(exchangeBaseUrl: url) // logger.info("query for exchange: \(url, privacy: .public)") - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } @@ -423,7 +423,7 @@ extension WalletModel { nonisolated func getCurrencyInfo(scope: ScopeInfo, viewHandles: Bool = false) async throws -> CurrencyInfo { let request = GetCurrencySpecification(scope: scope) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return CurrencyInfo(specs: response.currencySpecification, formatter: CurrencyFormatter.formatter(currency: scope.currency, specs: response.currencySpecification)) diff --git a/TalerWallet1/Model/Model+P2P.swift b/TalerWallet1/Model/Model+P2P.swift @@ -41,7 +41,7 @@ extension WalletModel { viewHandles: Bool = false) async throws -> Amount { let request = GetMaxPeerPushDebitAmount(scope: scope) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response.rawAmount } } // getMaxPeerPushAmount @@ -77,7 +77,7 @@ extension WalletModel { // let controller = Controller.shared // controller.progressOperation = request.operation // controller.progressToken = request.operation - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } } // checkPeerPushDebit @@ -109,7 +109,7 @@ extension WalletModel { viewHandles: Bool = false) async throws -> InitiatePeerPushDebitResponse { let request = InitiatePeerPushDebit(scope: scope, terms: terms) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } } // initiatePeerPushDebit @@ -147,7 +147,7 @@ extension WalletModel { let controller = Controller.shared controller.progressOperation = request.operation controller.progressToken = request.operation - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } } // checkPeerPullCredit @@ -176,7 +176,7 @@ extension WalletModel { async throws -> InitiatePeerPullCreditResponse { let request = InitiatePeerPullCredit(exchangeBaseUrl: baseURL, partialContractTerms: terms) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } } // initiatePeerPullCredit @@ -208,7 +208,7 @@ extension WalletModel { viewHandles: Bool = false) async throws -> PreparePeerPushCreditResponse { let request = PreparePeerPushCredit(talerUri: talerUri) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } } // preparePeerPushCredit @@ -229,7 +229,7 @@ extension WalletModel { viewHandles: Bool = false) async throws -> Decodable { let request = AcceptPeerPushCredit(transactionId: transactionId) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } } // acceptPeerPushCredit @@ -260,7 +260,7 @@ extension WalletModel { viewHandles: Bool = false) async throws -> PreparePeerPullDebitResponse { let request = PreparePeerPullDebit(talerUri: talerUri) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } } // preparePeerPullDebit @@ -281,7 +281,7 @@ extension WalletModel { viewHandles: Bool = false) async throws -> Decodable { let request = ConfirmPeerPullDebit(transactionId: transactionId) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } } // confirmPeerPullDebit diff --git a/TalerWallet1/Model/Model+Payment.swift b/TalerWallet1/Model/Model+Payment.swift @@ -673,7 +673,7 @@ extension WalletModel { let controller = Controller.shared controller.progressOperation = request.operation controller.progressToken = talerPayTemplateUri - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } @@ -684,21 +684,21 @@ extension WalletModel { let controller = Controller.shared controller.progressOperation = request.operation controller.progressToken = talerPayTemplateUri - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } nonisolated func getChoicesForPayment(_ transactionId: String, viewHandles: Bool = false) async throws -> ChoicesForPayment { let request = GetChoicesForPayment(transactionId: transactionId, forcedCoinSel: nil) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } nonisolated func preparePayForUri(_ talerPayUri: String, viewHandles: Bool = false) async throws -> PreparePayResult2 { let request = PreparePayForUri(talerPayUri: talerPayUri) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } @@ -709,7 +709,7 @@ extension WalletModel { let controller = Controller.shared controller.progressOperation = request.operation controller.progressToken = transactionId - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } @@ -719,7 +719,7 @@ extension WalletModel { let controller = Controller.shared controller.progressOperation = request.operation controller.progressToken = transactionId - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response.talerPayUri } } diff --git a/TalerWallet1/Model/Model+Pending.swift b/TalerWallet1/Model/Model+Pending.swift @@ -47,7 +47,7 @@ extension WalletModel { nonisolated func getPendingOperations4711(viewHandles: Bool = false) async throws -> [PendingOperation] { // M for MainActor let request = GetPendingOperations() - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response.pendingOperations } } diff --git a/TalerWallet1/Model/Model+Refund.swift b/TalerWallet1/Model/Model+Refund.swift @@ -44,7 +44,7 @@ struct StartRefundQueryRequest: WalletBackendFormattedRequest { extension WalletModel { nonisolated func startRefundForUri(url: String, viewHandles: Bool = false) async throws -> String { let request = StartRefundURIRequest(talerRefundUri: url) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response.transactionId } diff --git a/TalerWallet1/Model/Model+Settings.swift b/TalerWallet1/Model/Model+Settings.swift @@ -42,7 +42,7 @@ extension WalletModel { : test == 1 ? TESTBANK : DEMOBANK, exchangeBaseUrl: test == 2 ? HEADEXCHANGE : test == 1 ? TESTEXCHANGE : DEMOEXCHANGE) - let response = try await sendRequest(request, viewHandles: viewHandles) + _ = try await sendRequest(request, viewHandles: viewHandles) } } // loadTestKudos // MARK: - diff --git a/TalerWallet1/Model/Model+Transactions.swift b/TalerWallet1/Model/Model+Transactions.swift @@ -163,7 +163,7 @@ extension WalletModel { limit: limit, offset: offset, includeRefreshes: includeRefreshes) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response.transactions } // MARK: - diff --git a/TalerWallet1/Model/Model+Withdraw.swift b/TalerWallet1/Model/Model+Withdraw.swift @@ -264,7 +264,7 @@ extension WalletModel { let controller = Controller.shared controller.progressOperation = request.operation controller.progressToken = talerUri - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } @@ -276,7 +276,7 @@ extension WalletModel { let controller = Controller.shared controller.progressOperation = request.operation controller.progressToken = talerUri - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } @@ -289,7 +289,7 @@ extension WalletModel { let controller = Controller.shared controller.progressOperation = request.operation controller.progressToken = baseUrl - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } @@ -304,7 +304,7 @@ extension WalletModel { let controller = Controller.shared controller.progressOperation = request.operation controller.progressToken = baseUrl - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } @@ -312,7 +312,7 @@ extension WalletModel { viewHandles: Bool = false) async throws -> Decodable { let request = SetExchangeTOSAccepted(baseUrl: baseUrl) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } @@ -327,7 +327,7 @@ extension WalletModel { let controller = Controller.shared controller.progressOperation = request.operation controller.progressToken = withdrawURL - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } @@ -337,7 +337,7 @@ extension WalletModel { viewHandles: Bool = false) async throws -> AcceptManualWithdrawalResult? { let request = AcceptManualWithdrawal(amount: amount, baseUrl: baseUrl, restrictAge: restrictAge) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } } diff --git a/TalerWallet1/Model/WalletModel.swift b/TalerWallet1/Model/WalletModel.swift @@ -187,7 +187,7 @@ final class WalletModel: ObservableObject, Sendable { } func sendRequest<T: WalletBackendFormattedRequest> (_ request: T, viewHandles: Bool = false, asJSON: Bool = false) - async throws -> T.Response { // T for any Thread + async throws -> (T.Response, UInt) { // T for any Thread #if !DEBUG logger.log("sending: \(request.operation, privacy: .public)") #endif @@ -198,7 +198,7 @@ final class WalletModel: ObservableObject, Sendable { let timeUsed = Date.now - sendTime logger.log("received: \(request.operation, privacy: .public) (\(id, privacy: .public)) after \(timeUsed.milliseconds, privacy: .public) ms") #endif - return response + return (response, id) } catch { // rethrows let timeUsed = Date.now - sendTime logger.error("\(request.operation, privacy: .public) failed after \(timeUsed.milliseconds, privacy: .public) ms\n\(error, privacy: .public)") @@ -245,7 +245,8 @@ extension WalletModel { func hintApplicationResumedT() async throws -> DbStatus { // T for any Thread let request = ApplicationResumedRequest() - return try await sendRequest(request) + let (response, id) = try await sendRequest(request) + return response } } // MARK: - @@ -336,8 +337,8 @@ extension WalletModel { let controller = Controller.shared controller.progressOperation = request.operation controller.progressToken = txId - let result = try await sendRequest(request) - return result + let (response, id) = try await sendRequest(request) + return response } nonisolated func cancelProgressToken(_ op: String, token: String) async throws { @@ -353,12 +354,14 @@ extension WalletModel { nonisolated func getTransactionById(_ transactionId: String, includeContractTerms: Bool? = nil, viewHandles: Bool = false) async throws -> TalerTransaction { let request = GetTransactionById(txId: transactionId, inclTerms: includeContractTerms) - return try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) + return response } nonisolated func jsonTransactionById(_ transactionId: String, includeContractTerms: Bool? = nil, viewHandles: Bool = false) async throws -> String { let request = JSONTransactionById(transactionId: transactionId, includeContractTerms: includeContractTerms) - return try await sendRequest(request, viewHandles: viewHandles, asJSON: true) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles, asJSON: true) + return response } } // MARK: - @@ -433,7 +436,7 @@ extension WalletModel { @discardableResult nonisolated func setConfig(setTesting: Bool) async throws -> VersionInfo { let request = ConfigRequest(setTesting: setTesting) - let response = try await sendRequest(request) + let (response, id) = try await sendRequest(request) return response.versionInfo } } @@ -485,7 +488,7 @@ extension WalletModel { let request = InitRequest(persistentPath: dbPath, temporaryPath: tmpURL?.path(withSlash: true), setTesting: setTesting) - let response = try await sendRequest(request, viewHandles: viewHandles) // no Delay + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response } @@ -582,8 +585,8 @@ extension WalletModel { let controller = Controller.shared controller.progressOperation = request.operation controller.progressToken = request.operation - let result = try await sendRequest(request, viewHandles: viewHandles) - return result + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) + return response } } // MARK: - @@ -654,7 +657,7 @@ extension WalletModel { let dbPath = docDirUrl.path(withSlash: false) let request = ExportDbToFile(directory: dbPath, stem: stem, asJSON: asJSON) print(dbPath, stem) - let response = try await sendRequest(request, viewHandles: viewHandles) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles) return response.path } else { return nil @@ -668,13 +671,13 @@ extension WalletModel { nonisolated func getDiagnostics(viewHandles: Bool = false) async throws -> String { let request = GetDiagnostics() - let response = try await sendRequest(request, viewHandles: viewHandles, asJSON: true) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles, asJSON: true) return response } nonisolated func getPerformanceStats(viewHandles: Bool = false) async throws -> String { let request = GetPerformanceStats() - let response = try await sendRequest(request, viewHandles: viewHandles, asJSON: true) + let (response, id) = try await sendRequest(request, viewHandles: viewHandles, asJSON: true) return response } } diff --git a/TalerWallet1/Views/HelperViews/LoadingView.swift b/TalerWallet1/Views/HelperViews/LoadingView.swift @@ -147,6 +147,7 @@ struct LoadingView: View { RotatingTaler(size: 100, progress: true, // VoiceOver "In progress" once: false, + background: developerMode ? .blue : nil, rotationEnabled: $rotationEnabled) .onTapGesture(count: 1) { rotationEnabled.toggle() diff --git a/TalerWallet1/Views/Main/WalletEmptyView.swift b/TalerWallet1/Views/Main/WalletEmptyView.swift @@ -275,7 +275,9 @@ struct WalletEmptyView: View { list } if withDrawStarted { - RotatingTaler(size: 150, progress: true, once: false, rotationEnabled: $withDrawStarted) + RotatingTaler(size: 150, progress: true, once: false, + background: nil, + rotationEnabled: $withDrawStarted) } } .onAppear() { diff --git a/TalerWallet1/Views/Settings/AboutView.swift b/TalerWallet1/Views/Settings/AboutView.swift @@ -41,6 +41,7 @@ struct AboutView: View { let rotatingTaler = RotatingTaler(size: size, progress: false, once: true, + background: nil, rotationEnabled: $rotationEnabled) .accessibilityHidden(true) // has its own accessibilityLabel .frame(maxWidth: .infinity, alignment: .center) diff --git a/TalerWallet1/Views/Sheets/Payment/PaymentScan.swift b/TalerWallet1/Views/Sheets/Payment/PaymentScan.swift @@ -85,7 +85,7 @@ struct PaymentScan: View, Sendable { } } if let txId { - try? await model.waitTransactionState(txId, token: txId) + _ = try? await model.waitTransactionState(txId, token: txId) } } diff --git a/TalerWallet1/Views/Transactions/TransactionRowView.swift b/TalerWallet1/Views/Transactions/TransactionRowView.swift @@ -277,6 +277,7 @@ struct TransactionRowView: View { row if isWorking { RotatingTaler(size: 80, progress: true, once: false, + background: developerMode ? .green : nil, rotationEnabled: Binding.constant(true)) } } diff --git a/TalerWallet1/Views/Transactions/TransactionSummaryList.swift b/TalerWallet1/Views/Transactions/TransactionSummaryList.swift @@ -290,6 +290,7 @@ struct TransactionSummaryList: View { }.overlay { if common.isWorking { RotatingTaler(size: 80, progress: true, once: false, + background: developerMode ? .red : nil, rotationEnabled: Binding.constant(true)) } } diff --git a/TalerWallet1/Views/Transactions/TransactionTypeDetail.swift b/TalerWallet1/Views/Transactions/TransactionTypeDetail.swift @@ -83,9 +83,13 @@ struct TransactionTypeDetail: View { let title = EMPTYSTRING Text(title) .talerFont(.body) - RotatingTaler(size: 100, progress: true, once: false, rotationEnabled: $rotationEnabled) - .frame(maxWidth: .infinity, alignment: .center) - // has its own accessibilityLabel + if common.isWorking { + RotatingTaler(size: 100, progress: true, once: false, + background: developerMode ? .orange : nil, + rotationEnabled: $rotationEnabled) + .frame(maxWidth: .infinity, alignment: .center) + // has its own accessibilityLabel + } } case .withdrawal(let withdrawalTransaction): Group { let details = withdrawalTransaction.details