Save automatically, improve mocks

This commit is contained in:
Christoph Hagen
2025-02-05 12:24:33 +01:00
parent d41c54d174
commit 5abe6e1a9f
55 changed files with 701 additions and 381 deletions

View File

@@ -11,7 +11,7 @@ final class Content: ObservableObject {
var storage: Storage
@Published
var settings: Settings
var settings: Settings!
@Published
var posts: [Post]
@@ -31,6 +31,9 @@ final class Content: ObservableObject {
@Published
var results: GenerationResults
@Published
var storageErrors: [StorageError] = []
@Published
var generationStatus: String = "Ready to generate"
@@ -40,28 +43,12 @@ final class Content: ObservableObject {
@Published
private(set) var shouldGenerateWebsite = false
@Published
private(set) var saveState: SaveState = .isSaved
let imageGenerator: ImageGenerator
init(settings: Settings,
posts: [Post],
pages: [Page],
tags: [Tag],
files: [FileResource],
tagOverview: Tag?) {
self.settings = settings
self.posts = posts
self.pages = pages
self.tags = tags
self.files = files
self.tagOverview = tagOverview
self.results = .init()
let storage = Storage()
self.storage = storage
self.imageGenerator = ImageGenerator(
storage: storage,
settings: settings)
}
var errorCallback: ((StorageError) -> Void)?
init() {
let settings = Settings.default
@@ -78,6 +65,10 @@ final class Content: ObservableObject {
self.imageGenerator = ImageGenerator(
storage: storage,
settings: settings)
storage.errorNotification = { [weak self] error in
self?.storageErrors.append(error)
}
settings.content = self
}
private func clear() {
@@ -112,7 +103,7 @@ final class Content: ObservableObject {
pages.insert(page, at: 0)
}
func update(contentPath: URL, callback: @escaping ([String]) -> ()) {
func update(contentPath: URL, callback: @escaping () -> ()) {
guard storage.save(contentPath: contentPath) else {
return
}
@@ -139,19 +130,15 @@ final class Content: ObservableObject {
files.first { $0.absoluteUrl == withOutputPath }
}
private let errorPrinter = ErrorPrinter()
func loadFromDisk(callback: @escaping (_ errors: [String]) -> ()) {
defer {
storage.contentScope?.delegate = errorPrinter
}
func loadFromDisk(callback: @escaping () -> ()) {
DispatchQueue.global().async {
let loader = ModelLoader(content: self, storage: self.storage)
let result = loader.load()
guard result.errors.isEmpty else {
DispatchQueue.main.async {
self.didLoadContent = false
callback(result.errors.sorted())
self.storageErrors.append(contentsOf: result.errors)
callback()
}
return
}
@@ -164,7 +151,7 @@ final class Content: ObservableObject {
self.settings = result.settings
self.tagOverview = result.tagOverview
self.didLoadContent = true
callback([])
callback()
self.generateMissingVideoThumbnails()
}
}
@@ -183,4 +170,22 @@ final class Content: ObservableObject {
}
}
}
// MARK: Saving
private(set) var lastSave: Date = .now
private(set) var lastModification: Date = .now
func update(saveState: SaveState) {
self.saveState = saveState
}
func setModificationTimestamp() {
self.lastModification = .now
}
func setLastSaveTimestamp() {
self.lastSave = .now
}
}