Add images to posts, saving

This commit is contained in:
Christoph Hagen
2024-11-20 23:46:54 +01:00
parent cb22ae34f2
commit a35c2d669e
21 changed files with 415 additions and 149 deletions

View File

@ -17,7 +17,7 @@ final class Content: ObservableObject {
var images: [ImageResource] = []
@Published
var files: [FileResources] = []
var files: [FileResource] = []
@AppStorage("contentPath")
private var storedContentPath: String = ""
@ -37,7 +37,7 @@ final class Content: ObservableObject {
pages: [Page] = [],
tags: [Tag] = [],
images: [ImageResource] = [],
files: [FileResources] = [],
files: [FileResource] = [],
storedContentPath: String) {
self.posts = posts
self.pages = pages
@ -209,13 +209,13 @@ final class Content: ObservableObject {
dict[file] = ImageResource(uniqueId: file, altText: .init(en: "", de: ""), fileUrl: url)
}
let files: [FileResources] = filesData.compactMap { file, url in
let files: [FileResource] = filesData.compactMap { file, url in
let ext = file.components(separatedBy: ".").last!.lowercased()
let type = FileType(fileExtension: ext)
guard type == .file else {
return nil
}
return FileResources(uniqueId: file, description: "")
return FileResource(uniqueId: file, description: "")
}
let posts = postsData.map { postId, post in
@ -293,6 +293,27 @@ final class Content: ObservableObject {
}
}
// MARK: Saving
func saveToDisk() {
print("Starting save")
for page in pages {
storage.save(pageMetadata: page.pageFile, for: page.id)
}
for post in posts {
storage.save(post: post.postFile, for: post.id)
}
for tag in tags {
storage.save(tagMetadata: tag.tagFile, for: tag.id)
}
// TODO: Remove all files that are no longer in use (they belong to deleted items)
print("Finished save")
}
// MARK: Folder access
static func accessFolderFromBookmark(key: String, operation: (URL) -> Void) {
guard let bookmarkData = UserDefaults.standard.data(forKey: key) else {
print("No bookmark data to access folder")

View File

@ -1,6 +1,6 @@
import Foundation
final class FileResources: ObservableObject {
final class FileResource: ObservableObject {
/// Globally unique id
@Published

View File

@ -50,6 +50,13 @@ extension ImageResource: Equatable {
}
}
extension ImageResource: Hashable {
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
}
extension ImageResource {
var imageToDisplay: Image {

View File

@ -25,10 +25,6 @@ final class LocalizedPost: ObservableObject {
self.images = images
}
var displayImages: [Image] {
images.map { $0.imageToDisplay }
}
@MainActor
func editableTitle() -> Binding<String> {
Binding(

View File

@ -0,0 +1,26 @@
import Foundation
extension Post {
var postFile: PostFile {
.init(
isDraft: isDraft,
createdDate: createdDate,
startDate: startDate,
endDate: hasEndDate ? endDate : nil,
tags: tags.map { $0.id },
german: german.postFile,
english: english.postFile,
linkedPageId: linkedPage?.id)
}
}
extension LocalizedPost {
var postFile: LocalizedPostFile {
.init(images: images.map { $0.id },
title: title.nonEmpty,
content: content,
lastModifiedDate: lastModified)
}
}

View File

@ -0,0 +1,22 @@
import Foundation
extension Tag {
var tagFile: TagFile {
.init(id: id,
german: german.tagFile,
english: english.tagFile)
}
}
extension LocalizedTag {
var tagFile: LocalizedTagFile {
.init(urlComponent: urlComponent,
name: name,
subtitle: subtitle,
description: description,
thumbnail: thumbnail,
originalURL: originalUrl)
}
}