// // PreferencesView.swift // OTP // // Created by Shadowfacts on 8/23/21. // import SwiftUI struct PreferencesView: View { @ObservedObject private var store = KeyStore.shared @Environment(\.dismiss) private var dismiss @State private var clearBeforeImport = false @State private var isPresentingExport = false @State private var isPresentingImportMode = false @State private var isPresentingImport = false @State private var isPresentingImportFailedAlert = false @State private var importFailedError: Error? = nil var body: some View { List { Section("Backup") { Button("Export to File...") { isPresentingExport = true } Menu("Import from File...") { Button("Keep Existing Keys") { clearBeforeImport = false isPresentingImport = true } Button("Replace Existing Keys", role: .destructive) { clearBeforeImport = true isPresentingImport = true } } } } .navigationTitle("Preferences") .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button("Done") { dismiss() } } } .fileExporter(isPresented: $isPresentingExport, document: BackupDocument(data: store.data), contentType: .propertyList, defaultFilename: "OTPBackup") { (_) in } .fileImporter(isPresented: $isPresentingImport, allowedContentTypes: [.propertyList], allowsMultipleSelection: false) { (result) in switch result { case let .failure(error): self.importFailedError = error self.isPresentingImportFailedAlert = true case let .success(urls): do { let backup = try BackupDocument(url: urls.first!) store.updateFromStore(backup.data, replaceExisting: clearBeforeImport) dismiss() } catch { self.importFailedError = error self.isPresentingImportFailedAlert = true } } } .alert("Import Failed", isPresented: $isPresentingImportFailedAlert) { Button("OK", role: .cancel) {} } message: { if let error = importFailedError { Text(error.localizedDescription) } } } } struct PreferencesView_Previews: PreviewProvider { static var previews: some View { PreferencesView() } }