Swiftgram/submodules/Postbox/Sources/StoryStatesView.swift
2023-07-07 02:03:11 +04:00

100 lines
3.2 KiB
Swift

import Foundation
public enum PostboxStoryStatesKey: Hashable {
case local
case subscriptions(PostboxStorySubscriptionsKey)
case peer(PeerId)
}
final class MutableStoryStatesView: MutablePostboxView {
let key: PostboxStoryStatesKey
var value: CodableEntry?
init(postbox: PostboxImpl, key: PostboxStoryStatesKey) {
self.key = key
let _ = self.refreshDueToExternalTransaction(postbox: postbox)
}
func replay(postbox: PostboxImpl, transaction: PostboxTransaction) -> Bool {
var updated = false
switch self.key {
case .local, .subscriptions:
let storyGeneralKey: StoryGeneralStatesTable.Key
switch self.key {
case .local:
storyGeneralKey = .local
case let .subscriptions(value):
storyGeneralKey = .subscriptions(value)
case .peer:
assertionFailure()
return false
}
if !transaction.storyGeneralStatesEvents.isEmpty {
loop: for event in transaction.storyGeneralStatesEvents {
switch event {
case .set(storyGeneralKey):
let value = postbox.storyGeneralStatesTable.get(key: storyGeneralKey)
if value != self.value {
self.value = value
updated = true
}
break loop
default:
break
}
}
}
case let .peer(peerId):
let storyPeerKey: StoryPeerStatesTable.Key = .peer(peerId)
if !transaction.storyPeerStatesEvents.isEmpty {
loop: for event in transaction.storyPeerStatesEvents {
switch event {
case .set(storyPeerKey):
let value = postbox.storyPeerStatesTable.get(key: storyPeerKey)?.entry
if value != self.value {
self.value = value
updated = true
}
break loop
default:
break
}
}
}
}
return updated
}
func refreshDueToExternalTransaction(postbox: PostboxImpl) -> Bool {
let value: CodableEntry?
switch self.key {
case .local:
value = postbox.storyGeneralStatesTable.get(key: .local)
case let .subscriptions(valueKey):
value = postbox.storyGeneralStatesTable.get(key: .subscriptions(valueKey))
case let .peer(peerId):
value = postbox.storyPeerStatesTable.get(key: .peer(peerId))?.entry
}
if value != self.value {
self.value = value
return true
}
return false
}
func immutableView() -> PostboxView {
return StoryStatesView(self)
}
}
public final class StoryStatesView: PostboxView {
public let value: CodableEntry?
init(_ view: MutableStoryStatesView) {
self.value = view.value
}
}