mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-10-09 03:20:48 +00:00
[WIP] Stories
This commit is contained in:
parent
969724de40
commit
a5e8db4f2b
@ -2137,12 +2137,12 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController
|
||||
for (_, info) in resources.sorted(by: { $0.value.priority < $1.value.priority }) {
|
||||
let resource = info.resource
|
||||
validIds.append(resource.resource.id)
|
||||
if preloadStoryResourceDisposables[resource.resource.id] == nil {
|
||||
if self.preloadStoryResourceDisposables[resource.resource.id] == nil {
|
||||
var fetchRange: (Range<Int64>, MediaBoxFetchPriority)?
|
||||
if let size = info.size {
|
||||
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()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -347,16 +347,20 @@ public enum Stories {
|
||||
private enum CodingKeys: CodingKey {
|
||||
case opaqueState
|
||||
case hasMore
|
||||
case refreshId
|
||||
}
|
||||
|
||||
public let opaqueState: String
|
||||
public let refreshId: UInt64
|
||||
public let hasMore: Bool
|
||||
|
||||
public init(
|
||||
opaqueState: String,
|
||||
refreshId: UInt64,
|
||||
hasMore: Bool
|
||||
) {
|
||||
self.opaqueState = opaqueState
|
||||
self.refreshId = refreshId
|
||||
self.hasMore = hasMore
|
||||
}
|
||||
|
||||
@ -364,6 +368,7 @@ public enum Stories {
|
||||
let container = try decoder.container(keyedBy: CodingKeys.self)
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
@ -371,6 +376,7 @@ public enum Stories {
|
||||
var container = encoder.container(keyedBy: CodingKeys.self)
|
||||
|
||||
try container.encode(self.opaqueState, forKey: .opaqueState)
|
||||
try container.encode(Int64(bitPattern: self.refreshId), forKey: .refreshId)
|
||||
try container.encode(self.hasMore, forKey: .hasMore)
|
||||
}
|
||||
|
||||
@ -378,6 +384,9 @@ public enum Stories {
|
||||
if lhs.opaqueState != rhs.opaqueState {
|
||||
return false
|
||||
}
|
||||
if lhs.refreshId != rhs.refreshId {
|
||||
return false
|
||||
}
|
||||
if lhs.hasMore != rhs.hasMore {
|
||||
return false
|
||||
}
|
||||
|
@ -33,6 +33,7 @@ public final class StorySubscriptionsContext {
|
||||
private var loadedStateMark: OpaqueStateMark?
|
||||
private var stateDisposable: Disposable?
|
||||
private let loadMoreDisposable = MetaDisposable()
|
||||
private let refreshTimerDisposable = MetaDisposable()
|
||||
|
||||
init(queue: Queue, accountPeerId: PeerId, postbox: Postbox, network: Network) {
|
||||
self.accountPeerId = accountPeerId
|
||||
@ -48,6 +49,7 @@ public final class StorySubscriptionsContext {
|
||||
deinit {
|
||||
self.stateDisposable?.dispose()
|
||||
self.loadMoreDisposable.dispose()
|
||||
self.refreshTimerDisposable.dispose()
|
||||
}
|
||||
|
||||
func loadMore() {
|
||||
@ -151,7 +153,11 @@ public final class StorySubscriptionsContext {
|
||||
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):
|
||||
var peers: [Peer] = []
|
||||
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
|
||||
@ -220,6 +230,14 @@ public final class StorySubscriptionsContext {
|
||||
self.isLoading = false
|
||||
if isRefresh {
|
||||
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 {
|
||||
self.taskState.isLoadMoreScheduled = false
|
||||
}
|
||||
|
@ -628,7 +628,7 @@ public extension TelegramEngine {
|
||||
var hasMoreToken: String?
|
||||
if let subscriptionsState = storiesStateView.value?.get(Stories.SubscriptionsState.self) {
|
||||
if subscriptionsState.hasMore {
|
||||
hasMoreToken = subscriptionsState.opaqueState
|
||||
hasMoreToken = subscriptionsState.opaqueState + "_\(subscriptionsState.refreshId)"
|
||||
} else {
|
||||
hasMoreToken = nil
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user