OTP/OTP/Views/PreferencesView.swift

80 lines
2.7 KiB
Swift

//
// 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()
}
}