diff --git a/submodules/ChatListUI/Sources/ChatListController.swift b/submodules/ChatListUI/Sources/ChatListController.swift index bb4dbbabe1..b27ec858db 100644 --- a/submodules/ChatListUI/Sources/ChatListController.swift +++ b/submodules/ChatListUI/Sources/ChatListController.swift @@ -1253,7 +1253,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController return } - let storyContent = StoryContentContextImpl(context: self.context, includeHidden: false, focusedPeerId: peerId, singlePeer: false) + let storyContent = StoryContentContextImpl(context: self.context, isHidden: false, focusedPeerId: peerId, singlePeer: false) let _ = (storyContent.state |> filter { $0.slice != nil } |> take(1) @@ -1744,7 +1744,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController |> distinctUntilChanged self.preloadStorySubscriptionsDisposable = (combineLatest(queue: .mainQueue(), - self.context.engine.messages.preloadStorySubscriptions(includeHidden: false), + self.context.engine.messages.preloadStorySubscriptions(isHidden: false), self.context.sharedContext.automaticMediaDownloadSettings, automaticDownloadNetworkType ) @@ -1790,7 +1790,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController self.preloadStoryResourceDisposables.removeValue(forKey: id) } }) - self.storySubscriptionsDisposable = (self.context.engine.messages.storySubscriptions(includeHidden: false) + self.storySubscriptionsDisposable = (self.context.engine.messages.storySubscriptions(isHidden: false) |> deliverOnMainQueue).start(next: { [weak self] storySubscriptions in guard let self else { return @@ -2391,7 +2391,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController return } - let storyContent = StoryContentContextImpl(context: self.context, includeHidden: false, focusedPeerId: peer?.id, singlePeer: false) + let storyContent = StoryContentContextImpl(context: self.context, isHidden: false, focusedPeerId: peer?.id, singlePeer: false) let _ = (storyContent.state |> take(1) |> deliverOnMainQueue).start(next: { [weak self] storyContentState in diff --git a/submodules/ContactListUI/Sources/ContactsController.swift b/submodules/ContactListUI/Sources/ContactsController.swift index 1518c0b3e2..ca38aea4f9 100644 --- a/submodules/ContactListUI/Sources/ContactsController.swift +++ b/submodules/ContactListUI/Sources/ContactsController.swift @@ -515,7 +515,7 @@ public class ContactsController: ViewController { return } - let storyContent = StoryContentContextImpl(context: self.context, includeHidden: true, focusedPeerId: peer?.id, singlePeer: false) + let storyContent = StoryContentContextImpl(context: self.context, isHidden: true, focusedPeerId: peer?.id, singlePeer: false) let _ = (storyContent.state |> take(1) |> deliverOnMainQueue).start(next: { [weak self] storyContentState in diff --git a/submodules/ContactListUI/Sources/ContactsControllerNode.swift b/submodules/ContactListUI/Sources/ContactsControllerNode.swift index 7274455207..5185863a3d 100644 --- a/submodules/ContactListUI/Sources/ContactsControllerNode.swift +++ b/submodules/ContactListUI/Sources/ContactsControllerNode.swift @@ -227,7 +227,7 @@ final class ContactsControllerNode: ASDisplayNode { return self.contentScrollingEnded(listView: listView) } - self.storySubscriptionsDisposable = (self.context.engine.messages.storySubscriptions(includeHidden: true) + self.storySubscriptionsDisposable = (self.context.engine.messages.storySubscriptions(isHidden: true) |> deliverOnMainQueue).start(next: { [weak self] storySubscriptions in guard let self else { return diff --git a/submodules/Postbox/Sources/StorySubscriptionsView.swift b/submodules/Postbox/Sources/StorySubscriptionsView.swift index b6c0b59a7f..deddb53237 100644 --- a/submodules/Postbox/Sources/StorySubscriptionsView.swift +++ b/submodules/Postbox/Sources/StorySubscriptionsView.swift @@ -1,7 +1,7 @@ import Foundation public enum PostboxStorySubscriptionsKey: Int32 { - case all = 0 + case hidden = 0 case filtered = 1 } diff --git a/submodules/TelegramCore/Sources/Account/Account.swift b/submodules/TelegramCore/Sources/Account/Account.swift index 0c906f1779..f5bd08671c 100644 --- a/submodules/TelegramCore/Sources/Account/Account.swift +++ b/submodules/TelegramCore/Sources/Account/Account.swift @@ -975,7 +975,7 @@ public class Account { let networkStatsContext: NetworkStatsContext public let filteredStorySubscriptionsContext: StorySubscriptionsContext? - public let allStorySubscriptionsContext: StorySubscriptionsContext? + public let hiddenStorySubscriptionsContext: StorySubscriptionsContext? public init(accountManager: AccountManager, id: AccountRecordId, basePath: String, testingEnvironment: Bool, postbox: Postbox, network: Network, networkArguments: NetworkInitializationArguments, peerId: PeerId, auxiliaryMethods: AccountAuxiliaryMethods, supplementary: Bool) { self.accountManager = accountManager @@ -995,11 +995,11 @@ public class Account { self.peerInputActivityManager = PeerInputActivityManager() if !supplementary { - self.filteredStorySubscriptionsContext = StorySubscriptionsContext(accountPeerId: peerId, postbox: postbox, network: network, includesHidden: false) - self.allStorySubscriptionsContext = StorySubscriptionsContext(accountPeerId: peerId, postbox: postbox, network: network, includesHidden: true) + self.filteredStorySubscriptionsContext = StorySubscriptionsContext(accountPeerId: peerId, postbox: postbox, network: network, isHidden: false) + self.hiddenStorySubscriptionsContext = StorySubscriptionsContext(accountPeerId: peerId, postbox: postbox, network: network, isHidden: true) } else { self.filteredStorySubscriptionsContext = nil - self.allStorySubscriptionsContext = nil + self.hiddenStorySubscriptionsContext = nil } self.callSessionManager = CallSessionManager(postbox: postbox, network: network, maxLayer: networkArguments.voipMaxLayer, versions: networkArguments.voipVersions, addUpdates: { [weak self] updates in diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift index f95de0c04e..e6ed812973 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift @@ -144,7 +144,7 @@ public final class StorySubscriptionsContext { private let queue: Queue private let postbox: Postbox private let network: Network - private let includesHidden: Bool + private let isHidden: Bool private var taskState = TaskState() @@ -155,12 +155,12 @@ public final class StorySubscriptionsContext { private let loadMoreDisposable = MetaDisposable() private let refreshTimerDisposable = MetaDisposable() - init(queue: Queue, accountPeerId: PeerId, postbox: Postbox, network: Network, includesHidden: Bool) { + init(queue: Queue, accountPeerId: PeerId, postbox: Postbox, network: Network, isHidden: Bool) { self.accountPeerId = accountPeerId self.queue = queue self.postbox = postbox self.network = network - self.includesHidden = includesHidden + self.isHidden = isHidden self.taskState.isRefreshScheduled = true @@ -183,7 +183,7 @@ public final class StorySubscriptionsContext { return } - let subscriptionsKey: PostboxStorySubscriptionsKey = self.includesHidden ? .all : .filtered + let subscriptionsKey: PostboxStorySubscriptionsKey = self.isHidden ? .hidden : .filtered if self.taskState.isRefreshScheduled { self.isLoading = true @@ -244,7 +244,7 @@ public final class StorySubscriptionsContext { private func loadImpl(isRefresh: Bool, stateMark: OpaqueStateMark) { var flags: Int32 = 0 - if self.includesHidden { + if self.isHidden { flags |= 1 << 2 } @@ -270,8 +270,8 @@ public final class StorySubscriptionsContext { let accountPeerId = self.accountPeerId - let includesHidden = self.includesHidden - let subscriptionsKey: PostboxStorySubscriptionsKey = self.includesHidden ? .all : .filtered + let isHidden = self.isHidden + let subscriptionsKey: PostboxStorySubscriptionsKey = self.isHidden ? .hidden : .filtered self.loadMoreDisposable.set((self.network.request(Api.functions.stories.getAllStories(flags: flags, state: state)) |> deliverOn(self.queue)).start(next: { [weak self] result in @@ -343,7 +343,7 @@ public final class StorySubscriptionsContext { } if isRefresh { - if !includesHidden { + if !isHidden { if !peerEntries.contains(where: { $0 == accountPeerId }) { transaction.setStoryItems(peerId: accountPeerId, items: []) } @@ -396,10 +396,10 @@ public final class StorySubscriptionsContext { private let queue = Queue(name: "StorySubscriptionsContext") private let impl: QueueLocalObject - init(accountPeerId: PeerId, postbox: Postbox, network: Network, includesHidden: Bool) { + init(accountPeerId: PeerId, postbox: Postbox, network: Network, isHidden: Bool) { let queue = self.queue self.impl = QueueLocalObject(queue: queue, generate: { - Impl(queue: queue, accountPeerId: accountPeerId, postbox: postbox, network: network, includesHidden: includesHidden) + Impl(queue: queue, accountPeerId: accountPeerId, postbox: postbox, network: network, isHidden: isHidden) }) } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift index 141f9c9e52..136d75faf3 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift @@ -592,7 +592,7 @@ public extension TelegramEngine { }).start() } - public func storySubscriptions(includeHidden: Bool) -> Signal { + public func storySubscriptions(isHidden: Bool) -> Signal { let debugTimerSignal: Signal #if DEBUG && false debugTimerSignal = Signal.single(true) @@ -609,7 +609,7 @@ public extension TelegramEngine { debugTimerSignal = .single(true) #endif - let subscriptionsKey: PostboxStorySubscriptionsKey = includeHidden ? .all : .filtered + let subscriptionsKey: PostboxStorySubscriptionsKey = isHidden ? .hidden : .filtered let basicPeerKey = PostboxViewKey.basicPeer(self.account.peerId) let storySubscriptionsKey = PostboxViewKey.storySubscriptions(key: subscriptionsKey) @@ -759,9 +759,9 @@ public extension TelegramEngine { } } - public func preloadStorySubscriptions(includeHidden: Bool) -> Signal<[EngineMediaResource.Id: StoryPreloadInfo], NoError> { + public func preloadStorySubscriptions(isHidden: Bool) -> Signal<[EngineMediaResource.Id: StoryPreloadInfo], NoError> { let basicPeerKey = PostboxViewKey.basicPeer(self.account.peerId) - let subscriptionsKey: PostboxStorySubscriptionsKey = includeHidden ? .all : .filtered + let subscriptionsKey: PostboxStorySubscriptionsKey = isHidden ? .hidden : .filtered let storySubscriptionsKey = PostboxViewKey.storySubscriptions(key: subscriptionsKey) return self.account.postbox.combinedView(keys: [ basicPeerKey, diff --git a/submodules/TelegramCore/Sources/UpdatePeers.swift b/submodules/TelegramCore/Sources/UpdatePeers.swift index c5059b4000..c5d36188e9 100644 --- a/submodules/TelegramCore/Sources/UpdatePeers.swift +++ b/submodules/TelegramCore/Sources/UpdatePeers.swift @@ -60,12 +60,25 @@ public func updatePeers(transaction: Transaction, peers: [Peer], update: (Peer?, peerIds.removeAll(where: { $0 == updated.id }) transaction.replaceAllStorySubscriptions(key: .filtered, state: state, peerIds: peerIds) } + if transaction.storySubscriptionsContains(key: .hidden, peerId: updated.id) { + var (state, peerIds) = transaction.getAllStorySubscriptions(key: .filtered) + if !peerIds.contains(updated.id) { + peerIds.append(updated.id) + transaction.replaceAllStorySubscriptions(key: .hidden, state: state, peerIds: peerIds) + } + } } else { - if transaction.storySubscriptionsContains(key: .all, peerId: updated.id) && !transaction.storySubscriptionsContains(key: .filtered, peerId: updated.id) { - var (state, peerIds) = transaction.getAllStorySubscriptions(key: .all) + if transaction.storySubscriptionsContains(key: .hidden, peerId: updated.id) { + var (state, peerIds) = transaction.getAllStorySubscriptions(key: .filtered) peerIds.removeAll(where: { $0 == updated.id }) - peerIds.append(updated.id) - transaction.replaceAllStorySubscriptions(key: .filtered, state: state, peerIds: peerIds) + transaction.replaceAllStorySubscriptions(key: .hidden, state: state, peerIds: peerIds) + } + if transaction.storySubscriptionsContains(key: .filtered, peerId: updated.id) { + var (state, peerIds) = transaction.getAllStorySubscriptions(key: .filtered) + if !peerIds.contains(updated.id) { + peerIds.append(updated.id) + transaction.replaceAllStorySubscriptions(key: .filtered, state: state, peerIds: peerIds) + } } } } diff --git a/submodules/TelegramUI/Components/ChatListHeaderComponent/Sources/ChatListHeaderComponent.swift b/submodules/TelegramUI/Components/ChatListHeaderComponent/Sources/ChatListHeaderComponent.swift index 43479b6fa9..18f5afa686 100644 --- a/submodules/TelegramUI/Components/ChatListHeaderComponent/Sources/ChatListHeaderComponent.swift +++ b/submodules/TelegramUI/Components/ChatListHeaderComponent/Sources/ChatListHeaderComponent.swift @@ -829,7 +829,7 @@ public final class ChatListHeaderComponent: Component { theme: component.theme, strings: component.strings, sideInset: component.sideInset, - includesHidden: component.storiesIncludeHidden, + useHiddenList: component.storiesIncludeHidden, storySubscriptions: storySubscriptions, collapseFraction: 1.0 - component.storiesFraction, unlockedFraction: 1.0 - component.storiesUnlockedFraction, diff --git a/submodules/TelegramUI/Components/Stories/StoryContentComponent/Sources/StoryChatContent.swift b/submodules/TelegramUI/Components/Stories/StoryContentComponent/Sources/StoryChatContent.swift index acbcf89799..744ff0e840 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContentComponent/Sources/StoryChatContent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContentComponent/Sources/StoryChatContent.swift @@ -358,7 +358,7 @@ public final class StoryContentContextImpl: StoryContentContext { } private let context: AccountContext - private let includeHidden: Bool + private let isHidden: Bool public private(set) var stateValue: StoryContentContextState? public var state: Signal { @@ -394,12 +394,12 @@ public final class StoryContentContextImpl: StoryContentContext { public init( context: AccountContext, - includeHidden: Bool, + isHidden: Bool, focusedPeerId: EnginePeer.Id?, singlePeer: Bool ) { self.context = context - self.includeHidden = includeHidden + self.isHidden = isHidden if let focusedPeerId { self.focusedItem = (focusedPeerId, nil) } @@ -493,7 +493,7 @@ public final class StoryContentContextImpl: StoryContentContext { self.updatePeerContexts() }) } else { - self.storySubscriptionsDisposable = (context.engine.messages.storySubscriptions(includeHidden: includeHidden) + self.storySubscriptionsDisposable = (context.engine.messages.storySubscriptions(isHidden: isHidden) |> deliverOnMainQueue).start(next: { [weak self] storySubscriptions in guard let self else { return diff --git a/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift b/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift index 2e2c42c4fa..70cbcec0ad 100644 --- a/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift @@ -24,7 +24,7 @@ public final class StoryPeerListComponent: Component { public let theme: PresentationTheme public let strings: PresentationStrings public let sideInset: CGFloat - public let includesHidden: Bool + public let useHiddenList: Bool public let storySubscriptions: EngineStorySubscriptions? public let collapseFraction: CGFloat public let unlockedFraction: CGFloat @@ -38,7 +38,7 @@ public final class StoryPeerListComponent: Component { theme: PresentationTheme, strings: PresentationStrings, sideInset: CGFloat, - includesHidden: Bool, + useHiddenList: Bool, storySubscriptions: EngineStorySubscriptions?, collapseFraction: CGFloat, unlockedFraction: CGFloat, @@ -51,7 +51,7 @@ public final class StoryPeerListComponent: Component { self.theme = theme self.strings = strings self.sideInset = sideInset - self.includesHidden = includesHidden + self.useHiddenList = useHiddenList self.storySubscriptions = storySubscriptions self.collapseFraction = collapseFraction self.unlockedFraction = unlockedFraction @@ -73,7 +73,7 @@ public final class StoryPeerListComponent: Component { if lhs.sideInset != rhs.sideInset { return false } - if lhs.includesHidden != rhs.includesHidden { + if lhs.useHiddenList != rhs.useHiddenList { return false } if lhs.storySubscriptions != rhs.storySubscriptions { @@ -269,7 +269,7 @@ public final class StoryPeerListComponent: Component { } let _ = hasStories - let collapseStartIndex = component.includesHidden ? 0 : 1 + let collapseStartIndex = component.useHiddenList ? 0 : 1 let collapsedItemWidth: CGFloat = 24.0 let collapsedItemDistance: CGFloat = 14.0 @@ -510,8 +510,8 @@ public final class StoryPeerListComponent: Component { if self.requestedLoadMoreToken != hasMoreToken { self.requestedLoadMoreToken = hasMoreToken - if component.includesHidden { - if let storySubscriptionsContext = component.context.account.allStorySubscriptionsContext { + if component.useHiddenList { + if let storySubscriptionsContext = component.context.account.hiddenStorySubscriptionsContext { storySubscriptionsContext.loadMore() } } else { @@ -526,7 +526,7 @@ public final class StoryPeerListComponent: Component { self.sortedItems.removeAll(keepingCapacity: true) if let storySubscriptions = component.storySubscriptions { - if !component.includesHidden, let accountItem = storySubscriptions.accountItem { + if !component.useHiddenList, let accountItem = storySubscriptions.accountItem { self.sortedItems.append(accountItem) } diff --git a/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift index f3091fffbb..6d683c4aee 100644 --- a/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift @@ -1686,6 +1686,8 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio } } + var isStory: Bool = false + var game: TelegramMediaGame? var webpage: TelegramMediaWebpage? var invoice: TelegramMediaInvoice? @@ -1696,6 +1698,9 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio invoice = media } else if let media = media as? TelegramMediaGame { game = media + } else if let _ = media as? TelegramMediaStory { + isStory = true + automaticPlayback = false } } @@ -1717,6 +1722,8 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio } else if let file = content.file, file.isVideo, !file.isAnimated && !file.isVideoSticker { progressRequired = true } + } else if isStory { + progressRequired = true } case .Remote, .Fetching, .Paused: if let webpage = webpage, let automaticDownload = self.automaticDownload, case .full = automaticDownload, case let .Loaded(content) = webpage.content { @@ -1953,7 +1960,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio state = .customIcon(secretProgressIcon) } else if let file = media as? TelegramMediaFile, !file.isVideoSticker { let isInlinePlayableVideo = file.isVideo && !isSecretMedia && (self.automaticPlayback ?? false) - if !isInlinePlayableVideo && file.isVideo { + if (!isInlinePlayableVideo || isStory) && file.isVideo { state = .play(messageTheme.mediaOverlayControlColors.foregroundColor) } else { state = .none diff --git a/submodules/TelegramUI/Sources/ChatMessageWebpageBubbleContentNode.swift b/submodules/TelegramUI/Sources/ChatMessageWebpageBubbleContentNode.swift index 7a047d172f..0bc21dd1da 100644 --- a/submodules/TelegramUI/Sources/ChatMessageWebpageBubbleContentNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageWebpageBubbleContentNode.swift @@ -326,7 +326,7 @@ final class ChatMessageWebpageBubbleContentNode: ChatMessageBubbleContentNode { case "telegram_chatlist": actionTitle = item.presentationData.strings.Conversation_OpenChatFolder case "telegram_story": - actionTitle = "Open Story" + actionTitle = "OPEN STORY" default: break } diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift index 2df8c2e585..976d384592 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift @@ -4094,7 +4094,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro private func openStories(fromAvatar: Bool) { if let expiringStoryList = self.expiringStoryList, let expiringStoryListState = self.expiringStoryListState, !expiringStoryListState.items.isEmpty { let _ = expiringStoryList - let storyContent = StoryContentContextImpl(context: self.context, includeHidden: false, focusedPeerId: self.peerId, singlePeer: true) + let storyContent = StoryContentContextImpl(context: self.context, isHidden: false, focusedPeerId: self.peerId, singlePeer: true) let _ = (storyContent.state |> take(1) |> deliverOnMainQueue).start(next: { [weak self] storyContentState in