NetNewsWire/Multiplatform/iOS/Settings/FeedsSettingsModel.swift

108 lines
2.9 KiB
Swift

//
// FeedsSettingsModel.swift
// Multiplatform iOS
//
// Created by Rizwan on 04/07/20.
// Copyright © 2020 Ranchero Software. All rights reserved.
//
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 {
action(AccountManager.shared.accounts.first)
}
else {
showingExportActionSheet = true
}
}
func onTapImportOPML(action: ((Account?) -> Void)) {
switch AccountManager.shared.activeAccounts.count {
case 0:
feedsSettingsError = .noActiveAccount
return
case 1:
action(AccountManager.shared.activeAccounts.first)
default:
showingImportActionSheet = true
}
}
func generateExportURL(for account: Account) -> URL? {
let accountName = account.nameForDisplay.replacingOccurrences(of: " ", with: "").trimmingCharacters(in: .whitespaces)
let filename = "Subscriptions-\(accountName).opml"
let tempFile = FileManager.default.temporaryDirectory.appendingPathComponent(filename)
let opmlString = OPMLExporter.OPMLString(with: account, title: filename)
do {
try opmlString.write(to: tempFile, atomically: true, encoding: String.Encoding.utf8)
} catch {
feedsSettingsError = .exportFailed(reason: error.localizedDescription)
return nil
}
return tempFile
}
func processImportedFiles(_ urls: [URL],_ account: Account?) {
urls.forEach{
account?.importOPML($0, completion: { [weak self] result in
switch result {
case .success:
break
case .failure:
self?.feedsSettingsError = .importFailed
break
}
})
}
}
}