Rework storage structs, link preview
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
}
|
||||
}
|
||||
|
68
CHDataManagement/Model/Item/ItemReference.swift
Normal file
68
CHDataManagement/Model/Item/ItemReference.swift
Normal 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
|
||||
}
|
||||
}
|
@@ -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 {
|
||||
|
||||
}
|
||||
|
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
33
CHDataManagement/Model/Item/LocalizedItemId.swift
Normal file
33
CHDataManagement/Model/Item/LocalizedItemId.swift
Normal 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
|
||||
}
|
||||
}
|
@@ -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)
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
Reference in New Issue
Block a user