Rework storage structs, link preview

This commit is contained in:
Christoph Hagen
2025-01-08 14:59:04 +01:00
parent b99c064d10
commit a7197b9628
75 changed files with 1365 additions and 1454 deletions

View File

@@ -39,12 +39,20 @@ class Item: ObservableObject, Identifiable {
var itemType: ItemType {
fatalError()
}
var itemReference: ItemReference {
fatalError()
}
var itemId: ItemId {
.init(type: itemType, id: id)
}
}
extension Item: Equatable {
static func == (lhs: Item, rhs: Item) -> Bool {
lhs.id == rhs.id
lhs.id == rhs.id && lhs.itemType == rhs.itemType
}
}
@@ -52,12 +60,13 @@ extension Item: Hashable {
func hash(into hasher: inout Hasher) {
hasher.combine(id)
hasher.combine(itemType)
}
}
extension Item: Comparable {
static func < (lhs: Item, rhs: Item) -> Bool {
lhs.id < rhs.id
lhs.id < rhs.id && lhs.itemType < rhs.itemType
}
}

View File

@@ -1,33 +1,11 @@
struct ItemId {
let language: ContentLanguage
let type: ItemType
let itemType: ItemType
let id: String?
}
extension ItemId: Equatable {
static func == (lhs: ItemId, rhs: ItemId) -> Bool {
lhs.language == rhs.language &&
lhs.itemType == rhs.itemType
}
}
extension ItemId: Hashable {
func hash(into hasher: inout Hasher) {
hasher.combine(language)
hasher.combine(itemType.id)
}
}
extension ItemId: Comparable {
extension ItemId: Codable {
static func < (lhs: ItemId, rhs: ItemId) -> Bool {
guard lhs.itemType == rhs.itemType else {
return lhs.itemType < rhs.itemType
}
return lhs.language < rhs.language
}
}

View File

@@ -0,0 +1,68 @@
enum ItemReference {
case general
case post(Post)
case feed
case page(Page)
case tagPage(Tag)
case tagOverview
}
extension ItemReference: Equatable {
}
extension ItemReference: Hashable {
}
extension ItemReference: Identifiable {
var id: String {
switch self {
case .general:
return "0-general"
case .feed:
return "1-feed"
case .post(let post):
return "2-post-\(post.id)"
case .page(let page):
return "3-page-\(page.id)"
case .tagPage(let tag):
return "5-tag-\(tag.id)"
case .tagOverview:
return "4-tag-overview"
}
}
init?(context: LoadingContext, rawValue: String) {
if rawValue == "0-general" {
self = .general
} else if rawValue == "1-feed" {
self = .feed
} else if rawValue == "4-tag-overview" {
self = .tagOverview
} else if let id = rawValue.removingPrefix("3-page-"), let page = context.page(id) {
self = .page(page)
} else if let id = rawValue.removingPrefix("2-post-"), let post = context.post(id) {
self = .post(post)
} else if let id = rawValue.removingPrefix("5-tag-"), let tag = context.tag(id) {
self = .tagPage(tag)
} else {
return nil
}
}
}
extension ItemReference: Comparable {
static func < (lhs: ItemReference, rhs: ItemReference) -> Bool {
lhs.id < rhs.id
}
}

View File

@@ -1,76 +1,21 @@
enum ItemType {
enum ItemType: String, Equatable, Hashable {
case general
case post = "post"
case post(Post)
case page = "page"
case feed
case tag = "tag"
case page(Page)
case tagPage(Tag)
case tagOverview
}
extension ItemType: Equatable {
}
extension ItemType: Hashable {
}
extension ItemType: Identifiable {
var id: String {
switch self {
case .general:
return "0-general"
case .feed:
return "1-feed"
case .post(let post):
return "2-post-\(post.id)"
case .page(let page):
return "3-page-\(page.id)"
case .tagPage(let tag):
return "5-tag-\(tag.id)"
case .tagOverview:
return "4-tag-overview"
}
}
init?(rawValue: String, posts: [String : Post], pages: [String : Page], tags: [String : Tag]) {
if rawValue == "0-general" {
self = .general
} else if rawValue == "1-feed" {
self = .feed
} else if rawValue == "4-tag-overview" {
self = .tagOverview
} else if let id = rawValue.removingPrefix("3-page-"), let page = pages[id] {
self = .page(page)
} else if let id = rawValue.removingPrefix("2-post-"), let post = posts[id] {
self = .post(post)
} else if let id = rawValue.removingPrefix("5-tag-"), let tag = tags[id] {
self = .tagPage(tag)
} else {
return nil
}
}
case tagOverview = "tag-overview"
}
extension ItemType: Comparable {
static func < (lhs: ItemType, rhs: ItemType) -> Bool {
lhs.id < rhs.id
public static func < (lhs: ItemType, rhs: ItemType) -> Bool {
lhs.rawValue < rhs.rawValue
}
}
extension String {
func removingPrefix(_ prefix: String) -> String? {
guard self.hasPrefix(prefix) else { return nil }
return String(self.dropFirst(prefix.count))
}
extension ItemType: Codable {
}

View File

@@ -1,18 +0,0 @@
protocol LinkPreviewItem: AnyObject {
var linkPreviewImage: FileResource? { get set }
var linkPreviewTitle: String? { get }
var linkPreviewDescription: String? { get }
}
extension LinkPreviewItem {
func remove(linkPreviewImage file: FileResource) {
if linkPreviewImage == file {
linkPreviewImage = nil
}
}
}

View File

@@ -0,0 +1,33 @@
struct LocalizedItemId {
let language: ContentLanguage
let itemType: ItemReference
}
extension LocalizedItemId: Equatable {
static func == (lhs: LocalizedItemId, rhs: LocalizedItemId) -> Bool {
lhs.language == rhs.language &&
lhs.itemType == rhs.itemType
}
}
extension LocalizedItemId: Hashable {
func hash(into hasher: inout Hasher) {
hasher.combine(language)
hasher.combine(itemType.id)
}
}
extension LocalizedItemId: Comparable {
static func < (lhs: LocalizedItemId, rhs: LocalizedItemId) -> Bool {
guard lhs.itemType == rhs.itemType else {
return lhs.itemType < rhs.itemType
}
return lhs.language < rhs.language
}
}

View File

@@ -1,5 +1,5 @@
import Foundation
/*
final class TagOverviewPage: Item {
static let id = "all-tags"
@@ -105,3 +105,4 @@ final class LocalizedTagOverviewPage: ObservableObject {
!content.containsTag(withUrlComponent: urlComponent)
}
}
*/