116 lines
2.4 KiB
Swift
116 lines
2.4 KiB
Swift
import Foundation
|
|
import SwiftUI
|
|
import Combine
|
|
|
|
final class Content: ObservableObject {
|
|
|
|
@ObservedObject
|
|
var storage: Storage
|
|
|
|
@Published
|
|
var settings: Settings
|
|
|
|
@Published
|
|
var posts: [Post]
|
|
|
|
@Published
|
|
var pages: [Page]
|
|
|
|
@Published
|
|
var tags: [Tag]
|
|
|
|
@Published
|
|
var files: [FileResource]
|
|
|
|
@Published
|
|
var tagOverview: TagOverviewPage?
|
|
|
|
@Published
|
|
var results: GenerationResults
|
|
|
|
@Published
|
|
var generationStatus: String = "Ready to generate"
|
|
|
|
@Published
|
|
private(set) var isGeneratingWebsite = false
|
|
|
|
@Published
|
|
private(set) var shouldGenerateWebsite = false
|
|
|
|
init(settings: Settings,
|
|
posts: [Post],
|
|
pages: [Page],
|
|
tags: [Tag],
|
|
files: [FileResource],
|
|
tagOverview: TagOverviewPage?) {
|
|
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
|
|
}
|
|
|
|
init() {
|
|
let settings = Settings.default
|
|
self.settings = settings
|
|
self.posts = []
|
|
self.pages = []
|
|
self.tags = []
|
|
self.files = []
|
|
self.tagOverview = nil
|
|
self.results = .init()
|
|
|
|
let storage = Storage()
|
|
self.storage = storage
|
|
}
|
|
|
|
private func clear() {
|
|
self.settings = .default
|
|
self.posts = []
|
|
self.pages = []
|
|
self.tags = []
|
|
self.files = []
|
|
self.tagOverview = nil
|
|
self.results = .init()
|
|
}
|
|
|
|
var images: [FileResource] {
|
|
files.filter { $0.type.isImage }
|
|
}
|
|
|
|
func set(isGenerating: Bool) {
|
|
self.isGeneratingWebsite = isGenerating
|
|
}
|
|
|
|
func set(shouldGenerate: Bool) {
|
|
self.shouldGenerateWebsite = shouldGenerate
|
|
}
|
|
|
|
func add(_ file: FileResource) {
|
|
// TODO: Insert at correct index?
|
|
files.insert(file, at: 0)
|
|
}
|
|
|
|
func add(_ page: Page) {
|
|
// TODO: Insert at correct index?
|
|
pages.insert(page, at: 0)
|
|
}
|
|
|
|
func update(contentPath: URL) {
|
|
guard storage.save(contentPath: contentPath) else {
|
|
return
|
|
}
|
|
clear()
|
|
do {
|
|
try loadFromDisk()
|
|
} catch {
|
|
print("Failed to reload content: \(error)")
|
|
}
|
|
}
|
|
}
|