[WIP] Stories

This commit is contained in:
Ali 2023-05-24 00:17:15 +04:00
parent 969724de40
commit a5e8db4f2b
4 changed files with 32 additions and 5 deletions

View File

@ -2137,12 +2137,12 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController
for (_, info) in resources.sorted(by: { $0.value.priority < $1.value.priority }) { for (_, info) in resources.sorted(by: { $0.value.priority < $1.value.priority }) {
let resource = info.resource let resource = info.resource
validIds.append(resource.resource.id) validIds.append(resource.resource.id)
if preloadStoryResourceDisposables[resource.resource.id] == nil { if self.preloadStoryResourceDisposables[resource.resource.id] == nil {
var fetchRange: (Range<Int64>, MediaBoxFetchPriority)? var fetchRange: (Range<Int64>, MediaBoxFetchPriority)?
if let size = info.size { if let size = info.size {
fetchRange = (0 ..< Int64(size), .default) fetchRange = (0 ..< Int64(size), .default)
} }
preloadStoryResourceDisposables[resource.resource.id] = fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, userLocation: .other, userContentType: .other, reference: resource, range: fetchRange).start() self.preloadStoryResourceDisposables[resource.resource.id] = fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, userLocation: .other, userContentType: .other, reference: resource, range: fetchRange).start()
} }
} }

View File

@ -347,16 +347,20 @@ public enum Stories {
private enum CodingKeys: CodingKey { private enum CodingKeys: CodingKey {
case opaqueState case opaqueState
case hasMore case hasMore
case refreshId
} }
public let opaqueState: String public let opaqueState: String
public let refreshId: UInt64
public let hasMore: Bool public let hasMore: Bool
public init( public init(
opaqueState: String, opaqueState: String,
refreshId: UInt64,
hasMore: Bool hasMore: Bool
) { ) {
self.opaqueState = opaqueState self.opaqueState = opaqueState
self.refreshId = refreshId
self.hasMore = hasMore self.hasMore = hasMore
} }
@ -364,6 +368,7 @@ public enum Stories {
let container = try decoder.container(keyedBy: CodingKeys.self) let container = try decoder.container(keyedBy: CodingKeys.self)
self.opaqueState = try container.decode(String.self, forKey: .opaqueState) self.opaqueState = try container.decode(String.self, forKey: .opaqueState)
self.refreshId = UInt64(bitPattern: (try container.decodeIfPresent(Int64.self, forKey: .refreshId)) ?? 0)
self.hasMore = try container.decode(Bool.self, forKey: .hasMore) self.hasMore = try container.decode(Bool.self, forKey: .hasMore)
} }
@ -371,6 +376,7 @@ public enum Stories {
var container = encoder.container(keyedBy: CodingKeys.self) var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.opaqueState, forKey: .opaqueState) try container.encode(self.opaqueState, forKey: .opaqueState)
try container.encode(Int64(bitPattern: self.refreshId), forKey: .refreshId)
try container.encode(self.hasMore, forKey: .hasMore) try container.encode(self.hasMore, forKey: .hasMore)
} }
@ -378,6 +384,9 @@ public enum Stories {
if lhs.opaqueState != rhs.opaqueState { if lhs.opaqueState != rhs.opaqueState {
return false return false
} }
if lhs.refreshId != rhs.refreshId {
return false
}
if lhs.hasMore != rhs.hasMore { if lhs.hasMore != rhs.hasMore {
return false return false
} }

View File

@ -33,6 +33,7 @@ public final class StorySubscriptionsContext {
private var loadedStateMark: OpaqueStateMark? private var loadedStateMark: OpaqueStateMark?
private var stateDisposable: Disposable? private var stateDisposable: Disposable?
private let loadMoreDisposable = MetaDisposable() private let loadMoreDisposable = MetaDisposable()
private let refreshTimerDisposable = MetaDisposable()
init(queue: Queue, accountPeerId: PeerId, postbox: Postbox, network: Network) { init(queue: Queue, accountPeerId: PeerId, postbox: Postbox, network: Network) {
self.accountPeerId = accountPeerId self.accountPeerId = accountPeerId
@ -48,6 +49,7 @@ public final class StorySubscriptionsContext {
deinit { deinit {
self.stateDisposable?.dispose() self.stateDisposable?.dispose()
self.loadMoreDisposable.dispose() self.loadMoreDisposable.dispose()
self.refreshTimerDisposable.dispose()
} }
func loadMore() { func loadMore() {
@ -151,7 +153,11 @@ public final class StorySubscriptionsContext {
hasMore = currentState.hasMore hasMore = currentState.hasMore
} }
transaction.setSubscriptionsStoriesState(state: CodableEntry(Stories.SubscriptionsState(opaqueState: state, hasMore: hasMore))) transaction.setSubscriptionsStoriesState(state: CodableEntry(Stories.SubscriptionsState(
opaqueState: state,
refreshId: currentState?.refreshId ?? UInt64.random(in: 0 ... UInt64.max),
hasMore: hasMore
)))
case let .allStories(flags, state, userStories, users): case let .allStories(flags, state, userStories, users):
var peers: [Peer] = [] var peers: [Peer] = []
var peerPresences: [PeerId: Api.User] = [:] var peerPresences: [PeerId: Api.User] = [:]
@ -209,7 +215,11 @@ public final class StorySubscriptionsContext {
} }
} }
transaction.replaceAllStorySubscriptions(state: CodableEntry(Stories.SubscriptionsState(opaqueState: state, hasMore: hasMore)), peerIds: peerEntries) transaction.replaceAllStorySubscriptions(state: CodableEntry(Stories.SubscriptionsState(
opaqueState: state,
refreshId: UInt64.random(in: 0 ... UInt64.max),
hasMore: hasMore
)), peerIds: peerEntries)
} }
} }
|> deliverOn(self.queue)).start(completed: { [weak self] in |> deliverOn(self.queue)).start(completed: { [weak self] in
@ -220,6 +230,14 @@ public final class StorySubscriptionsContext {
self.isLoading = false self.isLoading = false
if isRefresh { if isRefresh {
self.taskState.isRefreshScheduled = false self.taskState.isRefreshScheduled = false
self.refreshTimerDisposable.set((Signal<Never, NoError>.complete()
|> suspendAwareDelay(60.0, queue: self.queue)).start(completed: { [weak self] in
guard let `self` = self else {
return
}
self.taskState.isRefreshScheduled = true
self.updateTasks()
}))
} else { } else {
self.taskState.isLoadMoreScheduled = false self.taskState.isLoadMoreScheduled = false
} }

View File

@ -628,7 +628,7 @@ public extension TelegramEngine {
var hasMoreToken: String? var hasMoreToken: String?
if let subscriptionsState = storiesStateView.value?.get(Stories.SubscriptionsState.self) { if let subscriptionsState = storiesStateView.value?.get(Stories.SubscriptionsState.self) {
if subscriptionsState.hasMore { if subscriptionsState.hasMore {
hasMoreToken = subscriptionsState.opaqueState hasMoreToken = subscriptionsState.opaqueState + "_\(subscriptionsState.refreshId)"
} else { } else {
hasMoreToken = nil hasMoreToken = nil
} }