// // SettingsView.swift // Multiplatform iOS // // Created by Stuart Breckenridge on 30/6/20. // Copyright © 2020 Ranchero Software. All rights reserved. // import SwiftUI import Account import UniformTypeIdentifiers struct SettingsView: View { @Environment(\.presentationMode) var presentationMode @Environment(\.exportFiles) var exportAction @Environment(\.importFiles) var importAction @StateObject private var viewModel = SettingsModel() @StateObject private var feedsSettingsModel = FeedsSettingsModel() @StateObject private var settings = AppDefaults.shared var body: some View { NavigationView { List { systemSettings accounts importExport timeline articles appearance help } .listStyle(InsetGroupedListStyle()) .navigationBarTitle("Settings", displayMode: .inline) .navigationBarItems(leading: HStack { Button("Done") { presentationMode.wrappedValue.dismiss() } } ) } .sheet(isPresented: $viewModel.presentSheet, content: { SafariView(url: viewModel.selectedWebsite.url!) }) } var systemSettings: some View { Section(header: Text("Notifications, Badge, Data, & More"), content: { Button(action: { UIApplication.shared.open(URL(string: "\(UIApplication.openSettingsURLString)")!) }, label: { Text("Open System Settings").foregroundColor(.primary) }) }) } var accounts: some View { Section(header: Text("Accounts"), content: { ForEach(0.. 1 { NavigationLink("Import Subscriptions", destination: importOptions) } else { Button(action:{ if feedsSettingsModel.checkForActiveAccount() { importOPML(account: viewModel.activeAccounts.first) } }) { Text("Import Subscriptions") .foregroundColor(.primary) } } if viewModel.accounts.count > 1 { NavigationLink("Export Subscriptions", destination: exportOptions) } else { Button(action:{ exportOPML(account: viewModel.accounts.first) }) { Text("Export Subscriptions") .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 })) } } var importOptions: some View { List { Section(header: Text("Choose an account to receive the imported feeds and folders"), content: { ForEach(0.. String { let dict = NSDictionary(contentsOf: Bundle.main.url(forResource: "Info", withExtension: "plist")!) let version = dict?.object(forKey: "CFBundleShortVersionString") as? String ?? "" let build = dict?.object(forKey: "CFBundleVersion") as? String ?? "" return "NetNewsWire \(version) (Build \(build))" } private func exportOPML(account: Account?) { guard let account = account, let url = feedsSettingsModel.generateExportURL(for: account) else { return } exportAction(moving: url) { _ in } } private func importOPML(account: Account?) { let types = [UTType(filenameExtension: "opml"), UTType("public.xml")].compactMap { $0 } importAction(multipleOfType: types) { (result: Result<[URL], Error>?) in if let urls = try? result?.get() { feedsSettingsModel.processImportedFiles(urls, account) } } } } struct SettingsView_Previews: PreviewProvider { static var previews: some View { SettingsView() } }