[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-taler-ios] 08/17: Improve errors and move them to WalletModel
From: |
gnunet |
Subject: |
[taler-taler-ios] 08/17: Improve errors and move them to WalletModel |
Date: |
Thu, 11 Apr 2024 23:13:40 +0200 |
This is an automated email from the git hooks/post-receive script.
marc-stibane pushed a commit to branch master
in repository taler-ios.
commit 6cb8d57a9931401bfc89461b45a4b12882507cf1
Author: Iván Ávalos <avalos@disroot.org>
AuthorDate: Mon Mar 11 09:11:54 2024 -0600
Improve errors and move them to WalletModel
---
TalerWallet1/Controllers/Controller.swift | 20 -------
TalerWallet1/Model/WalletModel.swift | 28 +++++++++
TalerWallet1/Views/Main/MainView.swift | 11 ++--
TalerWallet1/Views/Sheets/ErrorSheet.swift | 91 +++++++++++++++++++-----------
4 files changed, 93 insertions(+), 57 deletions(-)
diff --git a/TalerWallet1/Controllers/Controller.swift
b/TalerWallet1/Controllers/Controller.swift
index d0941f8..03c6997 100644
--- a/TalerWallet1/Controllers/Controller.swift
+++ b/TalerWallet1/Controllers/Controller.swift
@@ -48,13 +48,6 @@ class Controller: ObservableObject {
var messageForSheet: String? = nil
- @Published var showError: Bool = false
- @Published var error: WalletBackendResponseError? = nil {
- didSet {
- self.showError = error != nil
- }
- }
-
init() {
// for family in UIFont.familyNames {
// print(family)
@@ -225,16 +218,3 @@ extension Controller {
return .unknown
}
}
-
-// MARK: -
-extension Controller {
- @MainActor
- func showError(error: WalletBackendResponseError) {
- self.error = error
- }
-
- @MainActor
- func cleanError() {
- self.error = nil
- }
-}
diff --git a/TalerWallet1/Model/WalletModel.swift
b/TalerWallet1/Model/WalletModel.swift
index d52f3f4..2e8d24d 100644
--- a/TalerWallet1/Model/WalletModel.swift
+++ b/TalerWallet1/Model/WalletModel.swift
@@ -27,6 +27,17 @@ class WalletModel: ObservableObject {
let semaphore = AsyncSemaphore(value: 1)
var cachedBalances: [Balance]? = nil
+#if DEBUG
+ @AppStorage("developerMode") var developerMode: Bool = true
+#else
+ @AppStorage("developerMode") var developerMode: Bool = false
+#endif
+
+ @Published var showError: Bool = false
+ @Published var error: ErrorData? = nil {
+ didSet { showError = error != nil }
+ }
+
func sendRequest<T: WalletBackendFormattedRequest> (_ request: T, _ delay:
UInt = 0)
async throws -> T.Response { // T for any Thread
#if !DEBUG
@@ -261,3 +272,20 @@ extension WalletModel {
_ = try await sendRequest(request, 0)
}
}
+
+extension WalletModel {
+ @MainActor
+ func showError(error: ErrorData) {
+ // Do not show dev errors to users
+ if case .developer(_) = error, !developerMode {
+ return
+ }
+
+ self.error = error
+ }
+
+ @MainActor
+ func cleanError() {
+ self.error = nil
+ }
+}
diff --git a/TalerWallet1/Views/Main/MainView.swift
b/TalerWallet1/Views/Main/MainView.swift
index 6c9100c..f73e7eb 100644
--- a/TalerWallet1/Views/Main/MainView.swift
+++ b/TalerWallet1/Views/Main/MainView.swift
@@ -21,6 +21,7 @@ struct MainView: View {
@Binding var soundPlayed: Bool
@EnvironmentObject private var controller: Controller
+ @EnvironmentObject private var model: WalletModel
@AppStorage("talerFontIndex") var talerFontIndex: Int = 0 //
extension mustn't define this, so it must be here
@AppStorage("playSoundsI") var playSoundsI: Int = 1 //
extension mustn't define this, so it must be here
@AppStorage("playSoundsB") var playSoundsB: Bool = false
@@ -255,12 +256,12 @@ extension MainView {
}
}
}
- .sheet(isPresented: $controller.showError) {
- controller.cleanError()
+ .sheet(isPresented: $model.showError) {
+ model.cleanError()
} content: {
- if let error = controller.error {
- ErrorSheet(error: error, developerMode: developerMode) {
- controller.cleanError()
+ if let error = model.error {
+ ErrorSheet(data: error, developerMode: developerMode) {
+ model.cleanError()
}
}
}
diff --git a/TalerWallet1/Views/Sheets/ErrorSheet.swift
b/TalerWallet1/Views/Sheets/ErrorSheet.swift
index 5b64cf3..fd352bd 100644
--- a/TalerWallet1/Views/Sheets/ErrorSheet.swift
+++ b/TalerWallet1/Views/Sheets/ErrorSheet.swift
@@ -8,6 +8,12 @@
import SwiftUI
+enum ErrorData {
+case user(String)
+case developer(String)
+case taler(WalletBackendResponseError)
+}
+
struct ErrorSheet: View {
var message: String
var copyable: Bool
@@ -15,6 +21,7 @@ struct ErrorSheet: View {
var onDismiss: () -> Void
let navTitle = String(localized: "Error")
+ let unknownError = String(localized: "Unknown error")
init(message: String, copyable: Bool, onDismiss: @escaping () -> Void) {
self.message = message
@@ -30,47 +37,67 @@ struct ErrorSheet: View {
}
}
+ init(data: ErrorData, developerMode: Bool, onDismiss: @escaping () ->
Void) {
+ switch data {
+ case .user(let message):
+ self.init(message: message, copyable: false, onDismiss: onDismiss)
+ return
+ case .developer(let message):
+ self.init(message: message, copyable: true, onDismiss: onDismiss)
+ return
+ case .taler(let error):
+ self.init(error: error, developerMode: developerMode, onDismiss:
onDismiss)
+ return
+ }
+
+ self.init(message: unknownError, copyable: false, onDismiss: onDismiss)
+ }
+
var body: some View {
NavigationView {
- VStack {
- Image(systemName: "exclamationmark.circle.fill")
- .resizable()
- .frame(width: 100, height: 100)
- .aspectRatio(contentMode: .fit)
- .foregroundStyle(.red)
- .padding(.bottom)
-
- if copyable {
- if #available(iOS 16.4, *) {
- Text(message)
+ GeometryReader { geometry in
+ ScrollView(.vertical) {
+ VStack {
+ Image(systemName: "exclamationmark.circle.fill")
+ .resizable()
+ .frame(width: 100, height: 100)
+ .aspectRatio(contentMode: .fit)
.foregroundStyle(.red)
- .monospaced()
- } else {
- Text(message)
- .foregroundStyle(.red)
- .font(.system(.body, design: .monospaced))
- }
+ .padding(.bottom)
+
+ Text("There was an error!")
+ .talerFont(.title)
+ .padding(.bottom)
+
+ if copyable {
+ if #available(iOS 16.4, *) {
+ Text(message).monospaced()
+ } else {
+ Text(message).font(.system(.body, design:
.monospaced))
+ }
- CopyButton(textToCopy: message, vertical: false)
- .accessibilityLabel("Copy the error JSON")
- .padding(.top)
- } else {
- Text(message)
- .multilineTextAlignment(.center)
+ CopyButton(textToCopy: message, vertical: false)
+ .accessibilityLabel("Copy the error JSON")
+ .padding(.top)
+ } else {
+ Text(message)
+ .multilineTextAlignment(.center)
+ }
+ }
+ .padding()
+ .frame(width: geometry.size.width)
+ .frame(minHeight: geometry.size.height)
}
}
.navigationTitle(navTitle)
.navigationBarTitleDisplayMode(.inline)
- .toolbar {
- ToolbarItem {
- Button {
- onDismiss()
- } label: {
- Label("Close", systemImage: "xmark.circle")
- }
- }
+ }.safeAreaInset(edge: .bottom) {
+ Button("Cancel", role: .cancel) {
+ onDismiss()
}
- .padding()
+ .buttonStyle(TalerButtonStyle(type: .bordered))
+ .padding(.bottom)
+ .padding(.horizontal)
}
}
}
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [taler-taler-ios] 02/17: Bump version to 0.9.6 (1), (continued)
- [taler-taler-ios] 02/17: Bump version to 0.9.6 (1), gnunet, 2024/04/11
- [taler-taler-ios] 03/17: updateExchangeEntry (temporarily) back to exchangeBaseUrl (instead of scopeInfo), gnunet, 2024/04/11
- [taler-taler-ios] 06/17: clientCancellationId, gnunet, 2024/04/11
- [taler-taler-ios] 07/17: Laying the foundations of improved error handling, gnunet, 2024/04/11
- [taler-taler-ios] 04/17: emitObservabilityEvents, gnunet, 2024/04/11
- [taler-taler-ios] 05/17: symLog after quickjs.sendMessage returned, gnunet, 2024/04/11
- [taler-taler-ios] 01/17: rename setConfig, gnunet, 2024/04/11
- [taler-taler-ios] 11/17: Prepare notification error handling, gnunet, 2024/04/11
- [taler-taler-ios] 13/17: Fixes for error handling rebase, gnunet, 2024/04/11
- [taler-taler-ios] 09/17: Implement error handling all around (+refactoring), gnunet, 2024/04/11
- [taler-taler-ios] 08/17: Improve errors and move them to WalletModel,
gnunet <=
- [taler-taler-ios] 15/17: cleanup, gnunet, 2024/04/11
- [taler-taler-ios] 14/17: catch WalletBackendError.walletCoreError, gnunet, 2024/04/11
- [taler-taler-ios] 16/17: error handling, logging, gnunet, 2024/04/11
- [taler-taler-ios] 17/17: Bump version to 0.9.7 (1), gnunet, 2024/04/11
- [taler-taler-ios] 12/17: Centralize all error handling in the model, gnunet, 2024/04/11
- [taler-taler-ios] 10/17: Improvements to error dialog, gnunet, 2024/04/11