Add deletion confirmation screen (fixes #19)

This commit is contained in:
Max Goedjen
2020-03-07 00:13:56 -08:00
parent 7e5fc3cb24
commit afa29c6a4e
5 changed files with 88 additions and 18 deletions

View File

@@ -33,7 +33,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
@IBAction func add(sender: AnyObject?) {
var addWindow: NSWindow!
let addView = CreateSecureEnclaveSecretView(store: secureEnclave) {
let addView = CreateSecretView(store: secureEnclave) {
self.window.endSheet(addWindow)
}
addWindow = NSWindow(

View File

@@ -1,11 +1,14 @@
import SwiftUI
import SecretKit
struct ContentView<StoreType: SecretStore>: View {
@ObservedObject var store: StoreType
@State var active: StoreType.SecretType?
struct ContentView: View {
@ObservedObject var store: SecureEnclave.Store
@State var active: SecureEnclave.Secret?
@State var showingDeletion = false
@State var deletingSecret: SecureEnclave.Secret?
var body: some View {
NavigationView {
List {
@@ -27,15 +30,20 @@ struct ContentView<StoreType: SecretStore>: View {
.frame(minWidth: 100, idealWidth: 240)
}
.navigationViewStyle(DoubleColumnNavigationViewStyle())
.sheet(isPresented: $showingDeletion) {
DeleteSecretView(secret: self.deletingSecret!, store: self.store) {
self.showingDeletion = false
}
}
}
func delete(secret: StoreType.SecretType) {
// TODO: Add "type the name of the key to delete" dialogue
try! store.delete(secret: secret)
func delete(secret: SecureEnclave.Secret) {
deletingSecret = secret
showingDeletion = true
}
}
//
//struct ContentView_Previews: PreviewProvider {

View File

@@ -1,7 +1,7 @@
import SwiftUI
import SecretKit
struct CreateSecureEnclaveSecretView: View {
struct CreateSecretView: View {
@ObservedObject var store: SecureEnclave.Store

View File

@@ -0,0 +1,58 @@
import SwiftUI
import SecretKit
struct DeleteSecretView: View {
let secret: SecureEnclave.Secret
@ObservedObject var store: SecureEnclave.Store
@State var confirm = ""
fileprivate var dismissalBlock: () -> ()
init(secret: SecureEnclave.Secret, store: SecureEnclave.Store, dismissalBlock: @escaping () -> ()) {
self.secret = secret
self.store = store
self.dismissalBlock = dismissalBlock
}
var body: some View {
VStack {
HStack {
Image(nsImage: NSApp.applicationIconImage)
.resizable()
.frame(width: 64, height: 64)
.padding()
VStack {
HStack {
Text("Delete \(secret.name)?").bold()
Spacer()
}
HStack {
Text("If you delete \(secret.name), you will not be able to recover it. Type \"\(secret.name)\" to confirm.")
Spacer()
}
HStack {
Text("Confirm Name:")
TextField(secret.name, text: $confirm)
}
}
.onExitCommand(perform: dismissalBlock)
}
HStack {
Spacer()
Button(action: delete) {
Text("Delete")
}.disabled(confirm != secret.name)
Button(action: dismissalBlock) {
Text("Don't Delete")
}
}
}.padding()
}
func delete() {
try! store.delete(secret: secret)
dismissalBlock()
}
}