import SwiftUI struct NoteEditorView: View { @EnvironmentObject var client: WebDAVClient let note: DenoteNote @Environment(\.dismiss) private var dismiss @State private var editedContent: String @State private var isSaving = false @State private var saveError: String? @State private var themeManager = ThemeManager.shared init(note: DenoteNote) { self.note = note _editedContent = State(initialValue: note.content ?? "") } var body: some View { NavigationStack { TextEditor(text: $editedContent) .font(.system(.body, design: .monospaced)) .scrollContentBackground(.hidden) .background(themeManager.current.background) .padding(4) .navigationTitle(note.displayTitle) .navigationBarTitleDisplayMode(.inline) .toolbarBackground(themeManager.current.secondaryBackground, for: .navigationBar) .toolbar { ToolbarItem(placement: .cancellationAction) { Button("Cancel") { dismiss() } } ToolbarItem(placement: .confirmationAction) { if isSaving { ProgressView() } else { Button("Save") { Task { await save() } } } } } .alert("Save failed", isPresented: Binding( get: { saveError != nil }, set: { if !$0 { saveError = nil } } )) { Button("OK") { saveError = nil } } message: { Text(saveError ?? "") } } .preferredColorScheme(themeManager.current.colorScheme) .tint(themeManager.current.accent) } private func save() async { isSaving = true do { try await client.saveContent(editedContent, for: note) dismiss() } catch { saveError = error.localizedDescription } isSaving = false } }