- Menu bar app with global hotkey (⌃⌥⌘O) to capture notes - Notes saved as Markdown with YAML frontmatter - File naming: yyyy-MM-dd_HH-mm-ss.md - Settings view for Obsidian vault folder selection - Carbon API for global keyboard shortcut registration - Security-scoped bookmarks for persistent folder access
47 lines
1.2 KiB
Swift
47 lines
1.2 KiB
Swift
import Foundation
|
|
import SwiftUI
|
|
|
|
class NoteViewModel: ObservableObject {
|
|
@Published var noteContent: String = ""
|
|
@Published var errorMessage: String?
|
|
@Published var showError: Bool = false
|
|
|
|
private let fileService = NoteFileService.shared
|
|
let settingsManager = SettingsManager.shared
|
|
|
|
func saveNote() -> Bool {
|
|
let trimmedContent = noteContent.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
|
|
guard !trimmedContent.isEmpty else {
|
|
showErrorMessage("Cannot save an empty note.")
|
|
return false
|
|
}
|
|
|
|
let note = Note(content: trimmedContent)
|
|
|
|
do {
|
|
let savedURL = try fileService.save(note: note)
|
|
print("Note saved to: \(savedURL.path)")
|
|
clearNote()
|
|
return true
|
|
} catch {
|
|
showErrorMessage(error.localizedDescription)
|
|
return false
|
|
}
|
|
}
|
|
|
|
func clearNote() {
|
|
noteContent = ""
|
|
errorMessage = nil
|
|
showError = false
|
|
}
|
|
|
|
private func showErrorMessage(_ message: String) {
|
|
errorMessage = message
|
|
showError = true
|
|
}
|
|
|
|
var canSave: Bool {
|
|
settingsManager.hasValidVaultPath
|
|
}
|
|
}
|