diff options
author | Iván Ávalos <avalos@disroot.org> | 2024-03-11 09:11:54 -0600 |
---|---|---|
committer | Iván Ávalos <avalos@disroot.org> | 2024-04-11 10:26:04 -0600 |
commit | 9befd2cb8f043347ffd66901daf94d06be9d3d12 (patch) | |
tree | 19e20e33e3fd3de9102db6cc52e365c2b3be80f8 | |
parent | db06fc9130deb1dfebeef69e33deb0299e73418d (diff) | |
download | taler-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.swift | 20 | ||||
-rw-r--r-- | TalerWallet1/Model/WalletModel.swift | 28 | ||||
-rw-r--r-- | TalerWallet1/Views/Main/MainView.swift | 11 | ||||
-rw-r--r-- | 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 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) } } } |