80 lines
2.7 KiB
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()
|
||
|
}
|
||
|
}
|