aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIván Ávalos <avalos@disroot.org>2024-03-11 09:11:54 -0600
committerIván Ávalos <avalos@disroot.org>2024-04-11 10:26:04 -0600
commit9befd2cb8f043347ffd66901daf94d06be9d3d12 (patch)
tree19e20e33e3fd3de9102db6cc52e365c2b3be80f8
parentdb06fc9130deb1dfebeef69e33deb0299e73418d (diff)
downloadtaler-ios-9befd2cb8f043347ffd66901daf94d06be9d3d12.tar.gz
taler-ios-9befd2cb8f043347ffd66901daf94d06be9d3d12.tar.bz2
taler-ios-9befd2cb8f043347ffd66901daf94d06be9d3d12.zip
Improve errors and move them to WalletModel
-rw-r--r--TalerWallet1/Controllers/Controller.swift20
-rw-r--r--TalerWallet1/Model/WalletModel.swift28
-rw-r--r--TalerWallet1/Views/Main/MainView.swift11
-rw-r--r--TalerWallet1/Views/Sheets/ErrorSheet.swift91
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 9c57e90..7adda3a 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)
}
}
}