taler-ios

iOS apps for GNU Taler (wallet)
Log | Files | Refs | README | LICENSE

commit fa746337d19502f678b9425a0be025745e1c2ba5
parent f7c55f50bb77ff701ddbd942808231ca71478d65
Author: Iván Ávalos <avalos@disroot.org>
Date:   Fri, 22 Mar 2024 09:15:24 -0600

Improvements to error dialog

Diffstat:
MTalerWallet1/Backend/WalletBackendError.swift | 1+
MTalerWallet1/Backend/WalletCore.swift | 4++++
MTalerWallet1/Helper/Encodable+toJSON.swift | 3+++
MTalerWallet1/Views/Main/MainView.swift | 6+++++-
MTalerWallet1/Views/Sheets/ErrorSheet.swift | 89++++++++++++++++++++++++++++++++++++++++++-------------------------------------
MTalerWallet1/Views/Sheets/Payment/PayTemplateV.swift | 2++
MTalerWallet1/Views/Sheets/Sheet.swift | 2+-
7 files changed, 63 insertions(+), 44 deletions(-)

diff --git a/TalerWallet1/Backend/WalletBackendError.swift b/TalerWallet1/Backend/WalletBackendError.swift @@ -4,6 +4,7 @@ */ /** * @author Marc Stibane + * @author Iván Ávalos */ import Foundation diff --git a/TalerWallet1/Backend/WalletCore.swift b/TalerWallet1/Backend/WalletCore.swift @@ -2,6 +2,10 @@ * This file is part of GNU Taler, ©2022-23 Taler Systems S.A. * See LICENSE.md */ +/** + * @author Marc Stibane + * @author Iván Ávalos + */ import SwiftUI // FOUNDATION has no AppStorage import AnyCodable import FTalerWalletcore diff --git a/TalerWallet1/Helper/Encodable+toJSON.swift b/TalerWallet1/Helper/Encodable+toJSON.swift @@ -2,6 +2,9 @@ * This file is part of GNU Taler, ©2022-23 Taler Systems S.A. * See LICENSE.md */ +/** + * @author Iván Ávalos + */ import Foundation extension Encodable { diff --git a/TalerWallet1/Views/Main/MainView.swift b/TalerWallet1/Views/Main/MainView.swift @@ -2,6 +2,10 @@ * This file is part of GNU Taler, ©2022-23 Taler Systems S.A. * See LICENSE.md */ +/** + * @author Marc Stibane + * @author Iván Ávalos + */ import SwiftUI import os.log import SymLog @@ -83,7 +87,7 @@ struct MainView: View { if let error = model.error { ErrorSheet(data: error, devMode: developerMode) { model.cleanError() - } + }.interactiveDismissDisabled() } } } // body diff --git a/TalerWallet1/Views/Sheets/ErrorSheet.swift b/TalerWallet1/Views/Sheets/ErrorSheet.swift @@ -2,20 +2,25 @@ * This file is part of GNU Taler, ©2022-23 Taler Systems S.A. * See LICENSE.md */ +/** + * @author Iván Ávalos + */ import SwiftUI enum ErrorData { -case message(String) +case message(title: String, message: String) case error(Error) } struct ErrorSheet: View { - var message: String + var title: String + var message: String? = nil var copyable: Bool var onDismiss: () -> Void - init(message: String, copyable: Bool, onDismiss: @escaping () -> Void) { + init(title: String, message: String? = nil, copyable: Bool, onDismiss: @escaping () -> Void) { + self.title = title self.message = message self.copyable = copyable self.onDismiss = onDismiss @@ -26,27 +31,30 @@ struct ErrorSheet: View { let initializationError = String(localized: "Initialization error") let serializationError = String(localized: "Serialization error") let deserializationError = String(localized: "Deserialization error") + let unknownError = String(localized: "Unknown error") switch error { case let walletError as WalletBackendError: switch walletError { case .walletCoreError(let error): if let json = error?.toJSON(), devMode { - self.init(message: json, copyable: true, onDismiss: onDismiss) + self.init(title: walletCoreError, message: json, copyable: true, onDismiss: onDismiss) + } else if let hint = error?.hint { + self.init(title: walletCoreError, message: hint, copyable: false, onDismiss: onDismiss) } else if let message = error?.message { - self.init(message: message, copyable: false, onDismiss: onDismiss) + self.init(title: walletCoreError, message: message, copyable: false, onDismiss: onDismiss) } else { - self.init(message: walletCoreError, copyable: false, onDismiss: onDismiss) + self.init(title: walletCoreError, copyable: false, onDismiss: onDismiss) } case .initializationError: - self.init(message: initializationError, copyable: false, onDismiss: onDismiss) + self.init(title: initializationError, copyable: false, onDismiss: onDismiss) case .serializationError: - self.init(message: serializationError, copyable: false, onDismiss: onDismiss) + self.init(title: serializationError, copyable: false, onDismiss: onDismiss) case .deserializationError: - self.init(message: deserializationError, copyable: false, onDismiss: onDismiss) + self.init(title: deserializationError, copyable: false, onDismiss: onDismiss) } default: - self.init(message: error.localizedDescription, copyable: false, onDismiss: onDismiss) + self.init(title: unknownError, message: error.localizedDescription, copyable: false, onDismiss: onDismiss) } } @@ -54,54 +62,51 @@ struct ErrorSheet: View { let unknownError = String(localized: "Unknown error") switch data { - case .message(let message): - self.init(message: message, copyable: false, onDismiss: onDismiss) + case .message(let title, let message): + self.init(title: title, message: message, copyable: false, onDismiss: onDismiss) return case .error(let error): self.init(error: error, devMode: devMode, onDismiss: onDismiss) return } - self.init(message: unknownError, copyable: false, onDismiss: onDismiss) + self.init(title: unknownError, copyable: false, onDismiss: onDismiss) } var body: some View { - NavigationView { - GeometryReader { geometry in - ScrollView(.vertical) { - VStack { - Image(systemName: "exclamationmark.circle.fill") - .resizable() - .frame(width: 100, height: 100) - .aspectRatio(contentMode: .fit) - .foregroundStyle(.red) - .padding(.bottom) - - Text("There was an error!") - .talerFont(.title) - .padding(.bottom) + ScrollView { + VStack { + Image(systemName: "exclamationmark.circle") + .resizable() + .frame(width: 50, height: 50) + .aspectRatio(contentMode: .fit) + .foregroundStyle(.red) + .padding() - if copyable { - if #available(iOS 16.4, *) { - Text(message).monospaced() - } else { - Text(message).font(.system(.body, design: .monospaced)) - } + Text(title) + .talerFont(.title) + .padding(.bottom) - CopyButton(textToCopy: message, vertical: false) - .accessibilityLabel("Copy the error JSON") - .padding(.top) + if let message { + if copyable { + if #available(iOS 16.4, *) { + Text(message).monospaced() } else { - Text(message) - .multilineTextAlignment(.center) + Text(message).font(.system(.body, design: .monospaced)) } + + CopyButton(textToCopy: message, vertical: false) + .accessibilityLabel("Copy the error JSON") + .padding() + } else { + Text(message) + .multilineTextAlignment(.center) } - .padding() - .frame(width: geometry.size.width) - .frame(minHeight: geometry.size.height) } } - }.safeAreaInset(edge: .bottom) { + } + .padding() + .safeAreaInset(edge: .bottom) { Button("Close", role: .cancel) { onDismiss() } diff --git a/TalerWallet1/Views/Sheets/Payment/PayTemplateV.swift b/TalerWallet1/Views/Sheets/Payment/PayTemplateV.swift @@ -109,6 +109,8 @@ struct PayTemplateV: View { preparePayResult = ppCheck } catch { // TODO: error symLog.log(error.localizedDescription) + model.showError(.error(error)) + controller.playSound(0) } } diff --git a/TalerWallet1/Views/Sheets/Sheet.swift b/TalerWallet1/Views/Sheets/Sheet.swift @@ -41,9 +41,9 @@ struct Sheet: View { } } else { sheetView + .navigationBarItems(leading: cancelButton) } } - .navigationBarItems(leading: cancelButton) .navigationBarTitleDisplayMode(.automatic) .background(WalletColors().backgroundColor.edgesIgnoringSafeArea(.all)) }