From bf540c77273f31c7bee26c42e329e1e461f83df4 Mon Sep 17 00:00:00 2001 From: Dylan Lundy Date: Fri, 30 Apr 2021 00:31:47 +0930 Subject: [PATCH] Address PR comments --- SecretKit/Common/Erasers/AnySecretStore.swift | 6 +- Secretive.xcodeproj/project.pbxproj | 8 +-- Secretive/Views/DeleteSecretView.swift | 6 +- Secretive/Views/RenameSecretView.swift | 13 ++-- Secretive/Views/SecretListItemView.swift | 54 +++++++++++++++++ Secretive/Views/SecretListView.swift | 60 ------------------- Secretive/Views/StoreListView.swift | 37 ++++++------ 7 files changed, 85 insertions(+), 99 deletions(-) create mode 100644 Secretive/Views/SecretListItemView.swift delete mode 100644 Secretive/Views/SecretListView.swift diff --git a/SecretKit/Common/Erasers/AnySecretStore.swift b/SecretKit/Common/Erasers/AnySecretStore.swift index 1c09875..8f35e4d 100644 --- a/SecretKit/Common/Erasers/AnySecretStore.swift +++ b/SecretKit/Common/Erasers/AnySecretStore.swift @@ -49,12 +49,12 @@ public class AnySecretStoreModifiable: AnySecretStore, SecretStoreModifiable { private let _create: (String, Bool) throws -> Void private let _delete: (AnySecret) throws -> Void - private let _updateName: (AnySecret, String) throws -> Void + private let _update: (AnySecret, String) throws -> Void public init(modifiable secretStore: SecretStoreType) where SecretStoreType: SecretStoreModifiable { _create = { try secretStore.create(name: $0, requiresAuthentication: $1) } _delete = { try secretStore.delete(secret: $0.base as! SecretStoreType.SecretType) } - _updateName = { try secretStore.update(secret: $0.base as! SecretStoreType.SecretType, name: $1) } + _update = { try secretStore.update(secret: $0.base as! SecretStoreType.SecretType, name: $1) } super.init(secretStore) } @@ -67,6 +67,6 @@ public class AnySecretStoreModifiable: AnySecretStore, SecretStoreModifiable { } public func update(secret: AnySecret, name: String) throws { - try _updateName(secret, name) + try _update(secret, name) } } diff --git a/Secretive.xcodeproj/project.pbxproj b/Secretive.xcodeproj/project.pbxproj index ebdccc4..c458f90 100644 --- a/Secretive.xcodeproj/project.pbxproj +++ b/Secretive.xcodeproj/project.pbxproj @@ -10,7 +10,7 @@ 2C4A9D2F2636FFD3008CC8E2 /* RenameSecretView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C4A9D2E2636FFD3008CC8E2 /* RenameSecretView.swift */; }; 50020BB024064869003D4025 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50020BAF24064869003D4025 /* AppDelegate.swift */; }; 50153E20250AFCB200525160 /* UpdateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50153E1F250AFCB200525160 /* UpdateView.swift */; }; - 50153E22250DECA300525160 /* SecretListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50153E21250DECA300525160 /* SecretListView.swift */; }; + 50153E22250DECA300525160 /* SecretListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50153E21250DECA300525160 /* SecretListItemView.swift */; }; 5018F54F24064786002EB505 /* Notifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5018F54E24064786002EB505 /* Notifier.swift */; }; 501B7AE1251C56F700776EC7 /* SigningRequestProvenance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 507CE4F32420A8C10029F750 /* SigningRequestProvenance.swift */; }; 50524B442420969E008DBD97 /* OpenSSHWriterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50524B432420969D008DBD97 /* OpenSSHWriterTests.swift */; }; @@ -226,7 +226,7 @@ 2C4A9D2E2636FFD3008CC8E2 /* RenameSecretView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RenameSecretView.swift; sourceTree = ""; }; 50020BAF24064869003D4025 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 50153E1F250AFCB200525160 /* UpdateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateView.swift; sourceTree = ""; }; - 50153E21250DECA300525160 /* SecretListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretListView.swift; sourceTree = ""; }; + 50153E21250DECA300525160 /* SecretListItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretListItemView.swift; sourceTree = ""; }; 5018F54E24064786002EB505 /* Notifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notifier.swift; sourceTree = ""; }; 50524B432420969D008DBD97 /* OpenSSHWriterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenSSHWriterTests.swift; sourceTree = ""; }; 50571E0224393C2600F76F6C /* JustUpdatedChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JustUpdatedChecker.swift; sourceTree = ""; }; @@ -543,7 +543,7 @@ children = ( 50617D8423FCE48E0099B055 /* ContentView.swift */, 5079BA0E250F29BF00EA86F4 /* StoreListView.swift */, - 50153E21250DECA300525160 /* SecretListView.swift */, + 50153E21250DECA300525160 /* SecretListItemView.swift */, 50C385A42407A76D00AF2719 /* SecretDetailView.swift */, 5099A02323FD2AAA0062B6F2 /* CreateSecretView.swift */, 50B8550C24138C4F009958AC /* DeleteSecretView.swift */, @@ -1026,7 +1026,7 @@ 50BB046B2418AAAE00D6E079 /* EmptyStoreView.swift in Sources */, 50617D8323FCE48E0099B055 /* App.swift in Sources */, 506772C92425BB8500034DED /* NoStoresView.swift in Sources */, - 50153E22250DECA300525160 /* SecretListView.swift in Sources */, + 50153E22250DECA300525160 /* SecretListItemView.swift in Sources */, 508A58B5241ED48F0069DC07 /* PreviewAgentStatusChecker.swift in Sources */, 508A58AA241E06B40069DC07 /* PreviewUpdater.swift in Sources */, ); diff --git a/Secretive/Views/DeleteSecretView.swift b/Secretive/Views/DeleteSecretView.swift index 7810c3e..d9610d8 100644 --- a/Secretive/Views/DeleteSecretView.swift +++ b/Secretive/Views/DeleteSecretView.swift @@ -30,9 +30,6 @@ struct DeleteSecretView: View { TextField(secret.name, text: $confirm) } } - .onExitCommand { - dismissalBlock(false) - } } HStack { Spacer() @@ -47,6 +44,9 @@ struct DeleteSecretView: View { } .padding() .frame(minWidth: 400) + .onExitCommand { + dismissalBlock(false) + } } func delete() { diff --git a/Secretive/Views/RenameSecretView.swift b/Secretive/Views/RenameSecretView.swift index 2720405..92977ec 100644 --- a/Secretive/Views/RenameSecretView.swift +++ b/Secretive/Views/RenameSecretView.swift @@ -1,11 +1,3 @@ -// -// RenameSecretView.swift -// Secretive -// -// Created by Diesal11 on 26/4/21. -// Copyright © 2021 Max Goedjen. All rights reserved. -// - import SwiftUI import SecretKit @@ -36,7 +28,7 @@ struct RenameSecretView: View { } HStack { Spacer() - Button("Save", action: rename) + Button("Rename", action: rename) .disabled(newName.count == 0) .keyboardShortcut(.return) Button("Cancel") { @@ -46,6 +38,9 @@ struct RenameSecretView: View { } .padding() .frame(minWidth: 400) + .onExitCommand { + dismissalBlock(false) + } } func rename() { diff --git a/Secretive/Views/SecretListItemView.swift b/Secretive/Views/SecretListItemView.swift new file mode 100644 index 0000000..22c1f99 --- /dev/null +++ b/Secretive/Views/SecretListItemView.swift @@ -0,0 +1,54 @@ +import SwiftUI +import SecretKit + +struct SecretListItemView: View { + + @ObservedObject var store: AnySecretStore + var secret: AnySecret + @Binding var activeSecret: AnySecret.ID? + + @State var isDeleting: Bool = false + @State var isRenaming: Bool = false + + var deletedSecret: (AnySecret) -> Void + var renamedSecret: (AnySecret) -> Void + + var body: some View { + let showingPopupWrapped = Binding( + get: { isDeleting || isRenaming }, + set: { if $0 == false { isDeleting = false; isRenaming = false } } + ) + + return NavigationLink(destination: SecretDetailView(secret: secret), tag: secret.id, selection: $activeSecret) { + Text(secret.name) + }.contextMenu { + if store is AnySecretStoreModifiable { + Button(action: { isRenaming = true }) { + Text("Rename") + } + Button(action: { isDeleting = true }) { + Text("Delete") + } + } + } + .popover(isPresented: showingPopupWrapped) { + if let modifiable = store as? AnySecretStoreModifiable { + if isDeleting { + DeleteSecretView(store: modifiable, secret: secret) { deleted in + isDeleting = false + if deleted { + deletedSecret(secret) + } + } + } else if isRenaming { + RenameSecretView(store: modifiable, secret: secret) { renamed in + isRenaming = false + if renamed { + renamedSecret(secret) + } + } + } + } + } + } +} diff --git a/Secretive/Views/SecretListView.swift b/Secretive/Views/SecretListView.swift deleted file mode 100644 index db8c568..0000000 --- a/Secretive/Views/SecretListView.swift +++ /dev/null @@ -1,60 +0,0 @@ -import SwiftUI -import SecretKit - -struct SecretListView: View { - - @ObservedObject var store: AnySecretStore - @Binding var activeSecret: AnySecret.ID? - @Binding var deletingSecret: AnySecret? - @Binding var renamingSecret: AnySecret? - - @State var renamingText: String = "" - - var deletedSecret: (AnySecret) -> Void - var renamedSecret: (AnySecret) -> Void - - var body: some View { - ForEach(store.secrets) { secret in - NavigationLink(destination: SecretDetailView(secret: secret), tag: secret.id, selection: $activeSecret) { - Text(secret.name) - }.contextMenu { - if store is AnySecretStoreModifiable { - Button(action: { rename(secret: secret) }) { - Text("Rename") - } - Button(action: { delete(secret: secret) }) { - Text("Delete") - } - } - } - .popover(isPresented: .constant(deletingSecret == secret || renamingSecret == secret)) { - if let modifiable = store as? AnySecretStoreModifiable { - if deletingSecret == secret { - DeleteSecretView(store: modifiable, secret: secret) { deleted in - deletingSecret = nil - if deleted { - deletedSecret(secret) - } - } - } else if renamingSecret == secret { - RenameSecretView(store: modifiable, secret: secret) { renamed in - renamingSecret = nil - if renamed { - renamedSecret(secret) - } - } - } - } - } - - } - } - - func rename(secret: SecretType) { - renamingSecret = AnySecret(secret) - } - - func delete(secret: SecretType) { - deletingSecret = AnySecret(secret) - } -} diff --git a/Secretive/Views/StoreListView.swift b/Secretive/Views/StoreListView.swift index d148614..84d3afc 100644 --- a/Secretive/Views/StoreListView.swift +++ b/Secretive/Views/StoreListView.swift @@ -6,20 +6,18 @@ struct StoreListView: View { @Binding var showingCreation: Bool @State private var activeSecret: AnySecret.ID? - @State private var deletingSecret: AnySecret? - @State private var renamingSecret: AnySecret? @EnvironmentObject private var storeList: SecretStoreList + private func secretDeleted(secret: AnySecret) { + activeSecret = nextDefaultSecret + } + + private func secretRenamed(secret: AnySecret) { + activeSecret = nextDefaultSecret + } + var body: some View { - let secretDeleted = { (secret: AnySecret) in - activeSecret = nextDefaultSecret - } - - let secretRenamed = { (secret: AnySecret) in - activeSecret = nextDefaultSecret - } - NavigationView { List(selection: $activeSecret) { ForEach(storeList.stores) { store in @@ -28,14 +26,15 @@ struct StoreListView: View { if store.secrets.isEmpty { EmptyStoreView(store: store, activeSecret: $activeSecret) } else { - SecretListView( - store: store, - activeSecret: $activeSecret, - deletingSecret: $deletingSecret, - renamingSecret: $renamingSecret, - deletedSecret: secretDeleted, - renamedSecret: secretRenamed - ) + ForEach(store.secrets) { secret in + SecretListItemView( + store: store, + secret: secret, + activeSecret: $activeSecret, + deletedSecret: self.secretDeleted, + renamedSecret: self.secretRenamed + ) + } } } } @@ -47,9 +46,7 @@ struct StoreListView: View { } .frame(minWidth: 100, idealWidth: 240) } - } - } extension StoreListView {