77 lines
1.6 KiB
Swift
77 lines
1.6 KiB
Swift
import Foundation
|
|
import Combine
|
|
|
|
class Item: ChangeObservingItem, Identifiable {
|
|
|
|
/// A dummy property to force views to update when properties change
|
|
@Published
|
|
private var changeToggle = false
|
|
|
|
/// A session-id for the item for identification
|
|
let id = UUID()
|
|
|
|
/// The unique, persistent identifier of the item
|
|
///
|
|
/// This identifier is not used for `Identifiable`, since it may be changed through the UI.
|
|
@Published
|
|
var identifier: String
|
|
|
|
init(content: Content, id: String) {
|
|
self.identifier = id
|
|
super.init(content: content)
|
|
|
|
observeChanges()
|
|
}
|
|
|
|
// MARK: Paths
|
|
|
|
func makeCleanAbsolutePath(_ path: String) -> String {
|
|
"/" + makeCleanRelativePath(path)
|
|
}
|
|
|
|
func makeCleanRelativePath(_ path: String) -> String {
|
|
path.components(separatedBy: "/").filter { !$0.isEmpty }.joined(separator: "/")
|
|
}
|
|
|
|
func title(in language: ContentLanguage) -> String {
|
|
fatalError()
|
|
}
|
|
|
|
func absoluteUrl(in language: ContentLanguage) -> String {
|
|
fatalError()
|
|
}
|
|
|
|
var itemType: ItemType {
|
|
fatalError()
|
|
}
|
|
|
|
var itemReference: ItemReference {
|
|
fatalError()
|
|
}
|
|
|
|
var itemId: ItemId {
|
|
.init(type: itemType, id: identifier)
|
|
}
|
|
}
|
|
|
|
extension Item: Equatable {
|
|
|
|
static func == (lhs: Item, rhs: Item) -> Bool {
|
|
lhs.id == rhs.id
|
|
}
|
|
}
|
|
|
|
extension Item: Hashable {
|
|
|
|
func hash(into hasher: inout Hasher) {
|
|
hasher.combine(id)
|
|
}
|
|
}
|
|
|
|
extension Item: Comparable {
|
|
|
|
static func < (lhs: Item, rhs: Item) -> Bool {
|
|
lhs.identifier < rhs.identifier && lhs.itemType < rhs.itemType
|
|
}
|
|
}
|