From cbac7a85cbb9c20724236e2c59ae69241146c62b Mon Sep 17 00:00:00 2001 From: Rizwan Mohamed Ibrahim Date: Mon, 6 Jul 2020 22:43:20 +0530 Subject: [PATCH] Add feeds settings import/export errors --- .../iOS/Settings/FeedsSettingsModel.swift | 47 +++++++++++++++++-- Multiplatform/iOS/Settings/SettingsView.swift | 8 ++++ 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/Multiplatform/iOS/Settings/FeedsSettingsModel.swift b/Multiplatform/iOS/Settings/FeedsSettingsModel.swift index b32c17c71..40746557c 100644 --- a/Multiplatform/iOS/Settings/FeedsSettingsModel.swift +++ b/Multiplatform/iOS/Settings/FeedsSettingsModel.swift @@ -10,10 +10,49 @@ import Foundation import SwiftUI import Account +enum FeedsSettingsError: LocalizedError, Equatable { + case none, noActiveAccount, exportFailed(reason: String?), importFailed + + var errorDescription: String? { + switch self { + case .noActiveAccount: + return NSLocalizedString("You must have at least one active account.", comment: "Missing active account") + case .exportFailed(let reason): + return reason + case .importFailed: + return NSLocalizedString( + "We were unable to process the selected file. Please ensure that it is a properly formatted OPML file.", + comment: "Import Failed Message" + ) + default: + return nil + } + } + + var title: String? { + switch self { + case .noActiveAccount: + return NSLocalizedString("Error", comment: "Error Title") + case .exportFailed: + return NSLocalizedString("OPML Export Error", comment: "Export Failed") + case .importFailed: + return NSLocalizedString("Import Failed", comment: "Import Failed") + default: + return nil + } + } +} + class FeedsSettingsModel: ObservableObject { @Published var showingImportActionSheet = false @Published var showingExportActionSheet = false @Published var exportingFilePath = "" + @Published var feedsSettingsError: FeedsSettingsError? { + didSet { + feedsSettingsError != FeedsSettingsError.none ? (showError = true) : (showError = false) + } + } + @Published var showError: Bool = false func onTapExportOPML(action: ((Account?) -> Void)) { if AccountManager.shared.accounts.count == 1 { @@ -27,7 +66,7 @@ class FeedsSettingsModel: ObservableObject { func onTapImportOPML(action: ((Account?) -> Void)) { switch AccountManager.shared.activeAccounts.count { case 0: - //TODO:- show error + feedsSettingsError = .noActiveAccount return case 1: action(AccountManager.shared.activeAccounts.first) @@ -44,7 +83,7 @@ class FeedsSettingsModel: ObservableObject { do { try opmlString.write(to: tempFile, atomically: true, encoding: String.Encoding.utf8) } catch { - //TODO:- show error + feedsSettingsError = .exportFailed(reason: error.localizedDescription) return nil } @@ -53,12 +92,12 @@ class FeedsSettingsModel: ObservableObject { func processImportedFiles(_ urls: [URL],_ account: Account?) { urls.forEach{ - account?.importOPML($0, completion: { result in + account?.importOPML($0, completion: { [weak self] result in switch result { case .success: break case .failure: - //TODO:- show error + self?.feedsSettingsError = .importFailed break } }) diff --git a/Multiplatform/iOS/Settings/SettingsView.swift b/Multiplatform/iOS/Settings/SettingsView.swift index 2862afa75..0fe2cdeb9 100644 --- a/Multiplatform/iOS/Settings/SettingsView.swift +++ b/Multiplatform/iOS/Settings/SettingsView.swift @@ -91,6 +91,14 @@ struct SettingsView: View { .foregroundColor(.primary) } }) + .alert(isPresented: $feedsSettingsModel.showError) { + Alert( + title: Text(feedsSettingsModel.feedsSettingsError!.title ?? "Oops"), + message: Text(feedsSettingsModel.feedsSettingsError!.localizedDescription), + dismissButton: Alert.Button.cancel({ + feedsSettingsModel.feedsSettingsError = FeedsSettingsError.none + })) + } }