mirror of
https://github.com/maxgoedjen/secretive.git
synced 2026-03-29 13:27:25 +02:00
Add option to rename secrets
This commit is contained in:
@@ -42,7 +42,6 @@ extension Preview {
|
||||
}
|
||||
|
||||
class StoreModifiable: Store, SecretStoreModifiable {
|
||||
|
||||
override var name: String { "Modifiable Preview Store" }
|
||||
|
||||
func create(name: String, requiresAuthentication: Bool) throws {
|
||||
@@ -50,8 +49,10 @@ extension Preview {
|
||||
|
||||
func delete(secret: Preview.Secret) throws {
|
||||
}
|
||||
}
|
||||
|
||||
func update(secret: Preview.Secret, name: String) throws {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension Preview {
|
||||
|
||||
55
Secretive/Views/RenameSecretView.swift
Normal file
55
Secretive/Views/RenameSecretView.swift
Normal file
@@ -0,0 +1,55 @@
|
||||
//
|
||||
// RenameSecretView.swift
|
||||
// Secretive
|
||||
//
|
||||
// Created by Diesal11 on 26/4/21.
|
||||
// Copyright © 2021 Max Goedjen. All rights reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import SecretKit
|
||||
|
||||
struct RenameSecretView<StoreType: SecretStoreModifiable>: View {
|
||||
|
||||
@ObservedObject var store: StoreType
|
||||
let secret: StoreType.SecretType
|
||||
var dismissalBlock: (_ renamed: Bool) -> ()
|
||||
|
||||
@State private var newName = ""
|
||||
|
||||
var body: some View {
|
||||
VStack {
|
||||
HStack {
|
||||
Image(nsImage: NSApp.applicationIconImage)
|
||||
.resizable()
|
||||
.frame(width: 64, height: 64)
|
||||
.padding()
|
||||
VStack {
|
||||
HStack {
|
||||
Text("Type your new name for \"\(secret.name)\" below.")
|
||||
Spacer()
|
||||
}
|
||||
HStack {
|
||||
TextField(secret.name, text: $newName).focusable()
|
||||
}
|
||||
}
|
||||
}
|
||||
HStack {
|
||||
Spacer()
|
||||
Button("Save", action: rename)
|
||||
.disabled(newName.count == 0)
|
||||
.keyboardShortcut(.return)
|
||||
Button("Cancel") {
|
||||
dismissalBlock(false)
|
||||
}.keyboardShortcut(.cancelAction)
|
||||
}
|
||||
}
|
||||
.padding()
|
||||
.frame(minWidth: 400)
|
||||
}
|
||||
|
||||
func rename() {
|
||||
try? store.update(secret: secret, name: newName)
|
||||
dismissalBlock(true)
|
||||
}
|
||||
}
|
||||
@@ -6,8 +6,12 @@ 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
|
||||
@@ -15,17 +19,29 @@ struct SecretListView: View {
|
||||
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)) {
|
||||
.popover(isPresented: .constant(deletingSecret == secret || renamingSecret == secret)) {
|
||||
if let modifiable = store as? AnySecretStoreModifiable {
|
||||
DeleteSecretView(store: modifiable, secret: secret) { deleted in
|
||||
deletingSecret = nil
|
||||
if deleted {
|
||||
deletedSecret(AnySecret(secret))
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -34,8 +50,11 @@ struct SecretListView: View {
|
||||
}
|
||||
}
|
||||
|
||||
func rename<SecretType: Secret>(secret: SecretType) {
|
||||
renamingSecret = AnySecret(secret)
|
||||
}
|
||||
|
||||
func delete<SecretType: Secret>(secret: SecretType) {
|
||||
deletingSecret = AnySecret(secret)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -7,10 +7,19 @@ struct StoreListView: View {
|
||||
|
||||
@State private var activeSecret: AnySecret.ID?
|
||||
@State private var deletingSecret: AnySecret?
|
||||
@State private var renamingSecret: AnySecret?
|
||||
|
||||
@EnvironmentObject private var storeList: SecretStoreList
|
||||
|
||||
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
|
||||
@@ -19,9 +28,14 @@ struct StoreListView: View {
|
||||
if store.secrets.isEmpty {
|
||||
EmptyStoreView(store: store, activeSecret: $activeSecret)
|
||||
} else {
|
||||
SecretListView(store: store, activeSecret: $activeSecret, deletingSecret: $deletingSecret, deletedSecret: { _ in
|
||||
activeSecret = nextDefaultSecret
|
||||
})
|
||||
SecretListView(
|
||||
store: store,
|
||||
activeSecret: $activeSecret,
|
||||
deletingSecret: $deletingSecret,
|
||||
renamingSecret: $renamingSecret,
|
||||
deletedSecret: secretDeleted,
|
||||
renamedSecret: secretRenamed
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user