// // EntryEditView.swift // MyPass // import SwiftUI import MyPassCore struct EntryEditView: View { @ObservedObject var vm: EntryEditViewModel @Environment(\.dismiss) private var dismiss var body: some View { NavigationStack { Form { Section("Credentials") { TextField("Title", text: $vm.title) TextField("Username", text: $vm.username) .textContentType(.username) .autocorrectionDisabled() SecureField("Password", text: $vm.password) .textContentType(.password) TextField("URL", text: $vm.url) .textContentType(.URL) #if os(iOS) .keyboardType(.URL) #endif .autocorrectionDisabled() } Section("Notes") { TextEditor(text: $vm.notes) .frame(minHeight: 80) } Section { ForEach($vm.customFields) { $field in HStack { TextField("Key", text: $field.key) Divider() TextField("Value", text: Binding( get: { field.value.reveal() }, set: { field.value = ProtectedString($0, isProtected: field.value.isProtected) } )) } } .onDelete(perform: vm.removeCustomField) Button("Add Field", action: vm.addCustomField) } header: { Text("Custom Fields") } if let msg = vm.errorMessage { Section { Text(msg).foregroundStyle(.red) } } } .navigationTitle(vm.isEditing ? "Edit Entry" : "New Entry") #if os(iOS) .navigationBarTitleDisplayMode(.inline) #endif .toolbar { ToolbarItem(placement: .cancellationAction) { Button("Cancel") { dismiss() } } ToolbarItem(placement: .confirmationAction) { Button("Save") { vm.save { dismiss() } } .disabled(vm.title.isEmpty || vm.isSaving) } } } } }