From 1d6bab8a3e18ffaca228e6b7b97fa5b924378f6c Mon Sep 17 00:00:00 2001 From: Marc Stibane Date: Thu, 18 Apr 2024 22:26:25 +0200 Subject: error handling, debugging --- TalerWallet1/Backend/WalletCore.swift | 18 +++++++--------- TalerWallet1/Model/WalletModel.swift | 25 ++++++++++------------ TalerWallet1/Quickjs/QuickDataTask.swift | 16 +++++++------- TalerWallet1/Views/Main/MainView.swift | 10 ++++----- .../Views/Sheets/Payment/PayTemplateV.swift | 2 ++ .../Views/Sheets/Payment/PaymentView.swift | 4 +++- TalerWallet1/Views/Sheets/QRSheet.swift | 4 ++-- TalerWallet1/Views/Sheets/Sheet.swift | 7 +++--- .../WithdrawAcceptDone.swift | 1 + 9 files changed, 44 insertions(+), 43 deletions(-) diff --git a/TalerWallet1/Backend/WalletCore.swift b/TalerWallet1/Backend/WalletCore.swift index 7b7b9c0..cec27c2 100644 --- a/TalerWallet1/Backend/WalletCore.swift +++ b/TalerWallet1/Backend/WalletCore.swift @@ -112,7 +112,8 @@ extension WalletCore { if let walletError = decoded.error { // wallet-core sent an error message do { let jsonData = try JSONEncoder().encode(walletError) - logger.error("wallet-core sent back an error for request \(requestId, privacy: .public)") + let responseCode = walletError.errorResponse?.code ?? 0 + logger.error("wallet-core sent back error \(walletError.code, privacy: .public), \(responseCode, privacy: .public) for request \(requestId, privacy: .public)") symLog.log("id:\(requestId) \(walletError)") completion(requestId, timeSent, jsonData, walletError) } catch { // JSON encoding of response.result failed / should never happen @@ -375,7 +376,6 @@ print("\n❗️ WalletCore.swift:251 Notification: ", anyPayload, "\n") / let decoded = try JSONDecoder().decode(ResponseOrNotification.self, from: messageData) switch decoded.type { case "error": - symLog.log(decoded) // TODO: .error try handleError(decoded) case "response": try handleResponse(decoded) @@ -404,7 +404,7 @@ print("\n❗️ WalletCore.swift:251 Notification: ", anyPayload, "\n") / } } - private func sendRequest(request: WalletBackendRequest, completionHandler: @escaping (UInt, Date, Data?, WalletBackendResponseError?) -> Void) { + private func encodeAndSend(_ request: WalletBackendRequest, completionHandler: @escaping (UInt, Date, Data?, WalletBackendResponseError?) -> Void) { // Encode the request and send it to the backend. queue.async { self.semaphore.wait() // guard access to requestsMade @@ -436,7 +436,7 @@ extension WalletCore { let reqData = WalletBackendRequest(operation: request.operation(), args: AnyEncodable(request.args())) return try await withCheckedThrowingContinuation { continuation in - sendRequest(request: reqData) { requestId, timeSent, result, error in + encodeAndSend(reqData) { requestId, timeSent, result, error in let timeUsed = Date.now - timeSent let millisecs = timeUsed.milliseconds if let error { @@ -469,14 +469,12 @@ extension WalletCore { } err = error // this will be thrown in continuation.resume(throwing:), otherwise keep nil } - } else { + } else if let error { // TODO: WALLET_CORE_REQUEST_CANCELLED - if let error { - self.lastError = FullError(type: "error", operation: request.operation(), id: requestId, error: error) - } else { - self.lastError = nil - } + self.lastError = FullError(type: "error", operation: request.operation(), id: requestId, error: error) err = WalletBackendError.walletCoreError(error) + } else { // both result and error are nil + self.lastError = nil } continuation.resume(throwing: err ?? TransactionDecodingError.invalidStringValue) } diff --git a/TalerWallet1/Model/WalletModel.swift b/TalerWallet1/Model/WalletModel.swift index 5463f76..9e48f44 100644 --- a/TalerWallet1/Model/WalletModel.swift +++ b/TalerWallet1/Model/WalletModel.swift @@ -28,8 +28,16 @@ class WalletModel: ObservableObject { var cachedBalances: [Balance]? = nil @Published var showError: Bool = false - @Published var error: ErrorData? = nil { - didSet { showError = error != nil } + @Published var error2: ErrorData? = nil + + @MainActor func setError(_ theError: Error?) { + if let theError { + self.error2 = .error(theError) + self.showError = true + } else { + self.error2 = nil + self.showError = false + } } func sendRequest (_ request: T, _ delay: UInt = 0, viewHandles: Bool = false) @@ -54,7 +62,7 @@ class WalletModel: ObservableObject { logger.error("\(request.operation(), privacy: .public) failed after \(timeUsed.milliseconds, privacy: .public) ms\n\(error, privacy: .public)") if !viewHandles { // TODO: symlog + controller sound - self.error = .error(error) + await setError(error) } throw error } @@ -271,14 +279,3 @@ extension WalletModel { } } -extension WalletModel { - @MainActor - func showError(_ error: ErrorData) { - self.error = error - } - - @MainActor - func cleanError() { - self.error = nil - } -} diff --git a/TalerWallet1/Quickjs/QuickDataTask.swift b/TalerWallet1/Quickjs/QuickDataTask.swift index e4afe88..4334e88 100644 --- a/TalerWallet1/Quickjs/QuickDataTask.swift +++ b/TalerWallet1/Quickjs/QuickDataTask.swift @@ -134,17 +134,17 @@ class QuickDataTask: NSObject { let responseInfoPtr = UnsafeMutablePointer(&responseInfo) responseCb(responseCbCls, responseInfoPtr) } - } else { + } else { // TODO: pass error to walletCore var errmsg = "No http response from \(url)" - logger.error("⁉️\(self.requestID, privacy: .public) \(method, privacy: .public) \(errmsg, privacy: .public)") + logger.error("⁉️ \(self.requestID, privacy: .public) \(method, privacy: .public) \(errmsg, privacy: .public)") var errmsg_p0 = UnsafeMutablePointer(mutating: errmsg.cString(using: .utf8)) var responseInfo = JSHttpResponseInfo(request_id: self.requestID, - status: 0, - errmsg: errmsg_p0, - response_headers: nil, - num_response_headers: 0, - body: nil, - body_len: 0) + status: 0, + errmsg: errmsg_p0, + response_headers: nil, + num_response_headers: 0, + body: nil, + body_len: 0) let responseInfoPtr = UnsafeMutablePointer(&responseInfo) responseCb(responseCbCls, responseInfoPtr) } diff --git a/TalerWallet1/Views/Main/MainView.swift b/TalerWallet1/Views/Main/MainView.swift index 9d7effe..f5e17d0 100644 --- a/TalerWallet1/Views/Main/MainView.swift +++ b/TalerWallet1/Views/Main/MainView.swift @@ -82,11 +82,11 @@ struct MainView: View { Sheet(sheetView: sheet) } .sheet(isPresented: $model.showError) { - model.cleanError() + model.setError(nil) } content: { - if let error = model.error { - ErrorSheet(data: error, devMode: developerMode) { - model.cleanError() + if let error2 = model.error2 { + ErrorSheet(data: error2, devMode: developerMode) { + model.setError(nil) }.interactiveDismissDisabled() } } @@ -262,7 +262,7 @@ extension MainView { } .onNotification(.Error) { notification in if let error = notification.userInfo?[NOTIFICATIONERROR] as? Error { - model.showError(.error(error)) + model.setError(error) controller.playSound(0) } } diff --git a/TalerWallet1/Views/Sheets/Payment/PayTemplateV.swift b/TalerWallet1/Views/Sheets/Payment/PayTemplateV.swift index e993dd0..6eaa555 100644 --- a/TalerWallet1/Views/Sheets/Payment/PayTemplateV.swift +++ b/TalerWallet1/Views/Sheets/Payment/PayTemplateV.swift @@ -101,6 +101,8 @@ struct PayTemplateV: View { let amountVoiceOver = amount.string(currencyInfo) announce(this: "\(amountVoiceOver), \(feeLabel)") preparePayResult = ppCheck + } else { + symLog.log("preparePayForTemplateM failed") } } diff --git a/TalerWallet1/Views/Sheets/Payment/PaymentView.swift b/TalerWallet1/Views/Sheets/Payment/PaymentView.swift index 7cb4903..7cd0ae3 100644 --- a/TalerWallet1/Views/Sheets/Payment/PaymentView.swift +++ b/TalerWallet1/Views/Sheets/Payment/PaymentView.swift @@ -88,7 +88,9 @@ struct PaymentView: View { .buttonStyle(TalerButtonStyle(type: .prominent)) .padding(.horizontal) } else { - Button("Cancel", action: { dismissTop() }) + Button("Cancel", action: { + dismissTop() + }) .buttonStyle(TalerButtonStyle(type: .bordered)) .padding(.horizontal) } diff --git a/TalerWallet1/Views/Sheets/QRSheet.swift b/TalerWallet1/Views/Sheets/QRSheet.swift index 33aab47..d775deb 100644 --- a/TalerWallet1/Views/Sheets/QRSheet.swift +++ b/TalerWallet1/Views/Sheets/QRSheet.swift @@ -22,7 +22,7 @@ struct QRSheet: View { if scheme?.lowercased() == "taler" { URLSheet(stack: stack.push(), urlToOpen: scannedURL) } else { -// let _ = print(scannedURL) // TODO: logging +// let _ = print(scannedURL) // TODO: error logging ErrorView(errortext: scannedURL.absoluteString) } } else { @@ -35,10 +35,10 @@ struct QRSheet: View { symLog.log("Found code: \(result.string)") scannedCode = result.string case .failure(let error): + // TODO: errorAlert ErrorView(errortext: error.localizedDescription) } } - // TODO: errorAlert } } } diff --git a/TalerWallet1/Views/Sheets/Sheet.swift b/TalerWallet1/Views/Sheets/Sheet.swift index a0f2da6..6aa796e 100644 --- a/TalerWallet1/Views/Sheets/Sheet.swift +++ b/TalerWallet1/Views/Sheets/Sheet.swift @@ -35,8 +35,9 @@ struct Sheet: View { : "" // show nothing if 0 NavigationView { Group { - if let error = model.error { - ErrorSheet(data: error, devMode: developerMode) { + if let error2 = model.error2 { + ErrorSheet(data: error2, devMode: developerMode) { + logger.log("ErrorSheet dismissTop") dismissTop() } } else { @@ -61,7 +62,7 @@ struct Sheet: View { .accessibilityValue(idString) } .onDisappear { - model.cleanError() + symLog.log("❗️❗️Sheet onDisappear") } } } diff --git a/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptDone.swift b/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptDone.swift index dfa6a0e..d6f3563 100644 --- a/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptDone.swift +++ b/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptDone.swift @@ -23,6 +23,7 @@ struct WithdrawAcceptDone: View { return try await model.getTransactionByIdT(transactionId, viewHandles: viewHandles) } func dismissTopAnimated(_ stack: CallStack) { + symLog.log("ErrorSheet dismissTop") dismissTop() } -- cgit v1.2.3