mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-24 07:05:35 +00:00
[WIP] Topics
This commit is contained in:
@@ -90,3 +90,70 @@ func managedChatListHoles(network: Network, postbox: Postbox, accountPeerId: Pee
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private final class ManagedForumTopicListHolesState {
|
||||
private var currentHoles: [ForumTopicListHolesEntry: Disposable] = [:]
|
||||
|
||||
func clearDisposables() -> [Disposable] {
|
||||
let disposables = Array(self.currentHoles.values)
|
||||
self.currentHoles.removeAll()
|
||||
return disposables
|
||||
}
|
||||
|
||||
func update(entries: [ForumTopicListHolesEntry]) -> (removed: [Disposable], added: [ForumTopicListHolesEntry: MetaDisposable]) {
|
||||
var removed: [Disposable] = []
|
||||
var added: [ForumTopicListHolesEntry: MetaDisposable] = [:]
|
||||
|
||||
for entry in entries {
|
||||
if self.currentHoles[entry] == nil {
|
||||
let disposable = MetaDisposable()
|
||||
added[entry] = disposable
|
||||
self.currentHoles[entry] = disposable
|
||||
}
|
||||
}
|
||||
|
||||
var removedKeys: [ForumTopicListHolesEntry] = []
|
||||
for (entry, disposable) in self.currentHoles {
|
||||
if !entries.contains(entry) {
|
||||
removed.append(disposable)
|
||||
removedKeys.append(entry)
|
||||
}
|
||||
}
|
||||
for key in removedKeys {
|
||||
self.currentHoles.removeValue(forKey: key)
|
||||
}
|
||||
|
||||
return (removed, added)
|
||||
}
|
||||
}
|
||||
|
||||
func managedForumTopicListHoles(network: Network, postbox: Postbox, accountPeerId: PeerId) -> Signal<Void, NoError> {
|
||||
return Signal { _ in
|
||||
let state = Atomic(value: ManagedForumTopicListHolesState())
|
||||
|
||||
let disposable = postbox.forumTopicListHolesView().start(next: { view in
|
||||
let entries = Array(view.entries)
|
||||
|
||||
let (removed, added) = state.with { state in
|
||||
return state.update(entries: entries)
|
||||
}
|
||||
|
||||
for disposable in removed {
|
||||
disposable.dispose()
|
||||
}
|
||||
|
||||
for (entry, disposable) in added {
|
||||
disposable.set(_internal_loadMessageHistoryThreads(accountPeerId: accountPeerId, postbox: postbox, network: network, peerId: entry.peerId, offsetIndex: entry.index, limit: 100).start())
|
||||
}
|
||||
})
|
||||
|
||||
return ActionDisposable {
|
||||
disposable.dispose()
|
||||
for disposable in state.with({ state -> [Disposable] in
|
||||
state.clearDisposables()
|
||||
}) {
|
||||
disposable.dispose()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ func managedServiceViews(accountPeerId: PeerId, network: Network, postbox: Postb
|
||||
let disposable = DisposableSet()
|
||||
disposable.add(managedMessageHistoryHoles(accountPeerId: accountPeerId, network: network, postbox: postbox).start())
|
||||
disposable.add(managedChatListHoles(network: network, postbox: postbox, accountPeerId: accountPeerId).start())
|
||||
disposable.add(managedForumTopicListHoles(network: network, postbox: postbox, accountPeerId: accountPeerId).start())
|
||||
disposable.add(managedSynchronizePeerReadStates(network: network, postbox: postbox, stateManager: stateManager).start())
|
||||
disposable.add(managedSynchronizeGroupMessageStats(network: network, postbox: postbox, stateManager: stateManager).start())
|
||||
|
||||
|
||||
Reference in New Issue
Block a user