mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
100 lines
3.2 KiB
Swift
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
|
|
}
|
|
}
|