gnunet-svn
[Top][All Lists]
Advanced

[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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]