Swiftly/src/AppState.swift

91 lines
2.1 KiB
Swift

import Foundation
import Combine
class AppState: ObservableObject {
@Published var documentText: String = "" {
didSet {
if documentText != oldValue {
modified = true
bridge.setText(currentNoteID, text: documentText)
}
}
}
@Published var evalResults: [Int: String] = [:]
@Published var noteList: [NoteInfo] = []
@Published var currentNoteID: UUID
@Published var modified: Bool = false
private let bridge = RustBridge.shared
init() {
let id = bridge.newDocument()
self.currentNoteID = id
refreshNoteList()
}
func newNote() {
saveCurrentIfNeeded()
let id = bridge.newDocument()
currentNoteID = id
documentText = ""
evalResults = [:]
modified = false
refreshNoteList()
}
func loadNote(_ id: UUID) {
saveCurrentIfNeeded()
if bridge.cacheLoad(id) {
currentNoteID = id
documentText = bridge.getText(id)
modified = false
evaluate()
}
}
func saveNote() {
bridge.setText(currentNoteID, text: documentText)
let _ = bridge.cacheSave(currentNoteID)
modified = false
refreshNoteList()
}
func saveNoteToFile(_ url: URL) {
let _ = bridge.saveNote(currentNoteID, path: url.path)
modified = false
}
func loadNoteFromFile(_ url: URL) {
if let (id, text) = bridge.loadNote(path: url.path) {
currentNoteID = id
documentText = text
modified = false
let _ = bridge.cacheSave(id)
evaluate()
refreshNoteList()
}
}
func deleteNote(_ id: UUID) {
bridge.deleteNote(id)
if id == currentNoteID {
newNote()
}
refreshNoteList()
}
func evaluate() {
evalResults = bridge.evaluate(currentNoteID)
}
func refreshNoteList() {
noteList = bridge.listNotes()
}
private func saveCurrentIfNeeded() {
if modified {
saveNote()
}
}
}