summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Stibane <marc@taler.net>2024-04-18 22:26:25 +0200
committerMarc Stibane <marc@taler.net>2024-04-18 22:26:25 +0200
commit1d6bab8a3e18ffaca228e6b7b97fa5b924378f6c (patch)
tree4cd5285536552612447e6fbf233166d8bed11277
parent40b33973e228ccd3f71b7d5e7083a9856a56856f (diff)
downloadtaler-ios-master.tar.gz
taler-ios-master.tar.bz2
taler-ios-master.zip
error handling, debuggingHEADmaster
-rw-r--r--TalerWallet1/Backend/WalletCore.swift18
-rw-r--r--TalerWallet1/Model/WalletModel.swift25
-rw-r--r--TalerWallet1/Quickjs/QuickDataTask.swift16
-rw-r--r--TalerWallet1/Views/Main/MainView.swift10
-rw-r--r--TalerWallet1/Views/Sheets/Payment/PayTemplateV.swift2
-rw-r--r--TalerWallet1/Views/Sheets/Payment/PaymentView.swift4
-rw-r--r--TalerWallet1/Views/Sheets/QRSheet.swift4
-rw-r--r--TalerWallet1/Views/Sheets/Sheet.swift7
-rw-r--r--TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptDone.swift1
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<T: WalletBackendFormattedRequest> (_ 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<JSHttpResponseInfo>(&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<CChar>(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<JSHttpResponseInfo>(&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()
}