Improve content saving, label editing

This commit is contained in:
Christoph Hagen
2025-05-02 22:11:43 +02:00
parent fea06a93b7
commit 1f4f32c9af
15 changed files with 274 additions and 150 deletions

View File

@ -184,7 +184,9 @@ final class Content: ObservableObject {
private(set) var lastModification: Date = .now
func update(saveState: SaveState) {
self.saveState = saveState
DispatchQueue.main.async {
self.saveState = saveState
}
}
func setModificationTimestamp() {

View File

@ -1,17 +1,10 @@
import Foundation
final class ContentLabel: ObservableObject {
struct ContentLabel {
@Published
var icon: PageIcon
@Published
var value: String
init(icon: PageIcon, value: String) {
self.icon = icon
self.value = value
}
}
extension ContentLabel: Equatable {
@ -34,7 +27,7 @@ extension ContentLabel {
.init(icon: icon.rawValue, value: value)
}
convenience init?(context: LoadingContext, data: Data) {
init?(context: LoadingContext, data: Data) {
guard let icon = PageIcon(rawValue: data.icon) else {
context.error("Unknown label icon '\(data.icon)'")
return nil

View File

@ -0,0 +1,27 @@
import Foundation
import Combine
class ChangeObservingItem: ObservableContentItem {
unowned let content: Content
/// A dummy property to force views to update when properties change
@Published
private var changeToggle = false
var cancellables = Set<AnyCancellable>()
init(content: Content) {
self.content = content
observeChanges()
}
// MARK: Change observation
func didChange() {
DispatchQueue.main.async {
self.changeToggle.toggle()
}
}
}

View File

@ -1,9 +1,7 @@
import Foundation
import Combine
class Item: ObservableContentItem, Identifiable {
unowned let content: Content
class Item: ChangeObservingItem, Identifiable {
/// A dummy property to force views to update when properties change
@Published
@ -12,23 +10,13 @@ class Item: ObservableContentItem, Identifiable {
@Published
var id: String
var cancellables = Set<AnyCancellable>()
init(content: Content, id: String) {
self.content = content
self.id = id
super.init(content: content)
observeChanges()
}
// MARK: Change observation
func didChange() {
DispatchQueue.main.async {
self.changeToggle.toggle()
}
}
// MARK: Paths
func makeCleanAbsolutePath(_ path: String) -> String {

View File

@ -6,9 +6,7 @@ import SwiftUI
including the title, url path and required resources
*/
final class LocalizedPage: ObservableObject {
unowned let content: Content
final class LocalizedPage: ChangeObservingItem {
/**
The string to use when creating the url for the page.
@ -50,13 +48,13 @@ final class LocalizedPage: ObservableObject {
originalUrl: String? = nil,
linkPreview: LinkPreview = .init(),
hideTitle: Bool = false) {
self.content = content
self.urlString = urlString
self.title = title
self.lastModified = lastModified
self.originalUrl = originalUrl
self.linkPreview = linkPreview
self.hideTitle = hideTitle
super.init(content: content)
}
func isValid(urlComponent: String) -> Bool {

View File

@ -1,9 +1,7 @@
import Foundation
import SwiftUI
final class LocalizedPost: ObservableObject {
unowned let content: Content
final class LocalizedPost: ChangeObservingItem {
@Published
var title: String?
@ -36,7 +34,6 @@ final class LocalizedPost: ObservableObject {
labels: [ContentLabel] = [],
pageLinkText: String? = nil,
linkPreview: LinkPreview = .init()) {
self.content = content
self.title = title
self.text = text
self.lastModified = lastModified
@ -44,6 +41,7 @@ final class LocalizedPost: ObservableObject {
self.labels = labels
self.pageLinkText = pageLinkText
self.linkPreview = linkPreview
super.init(content: content)
}
func contains(_ string: String) -> Bool {

View File

@ -1,8 +1,6 @@
import Foundation
final class LocalizedTag: ObservableObject {
unowned let content: Content
final class LocalizedTag: ChangeObservingItem {
@Published
var urlComponent: String
@ -22,11 +20,11 @@ final class LocalizedTag: ObservableObject {
name: String,
linkPreview: LinkPreview = .init(),
originalUrl: String? = nil) {
self.content = content
self.urlComponent = urlComponent
self.name = name
self.linkPreview = linkPreview
self.originalUrl = originalUrl
super.init(content: content)
}
func isValid(urlComponent: String) -> Bool {