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 }) {
|
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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user