From d476aa27e8dbfa609fadb74c96a05fc6d225bfc1 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Sat, 16 Dec 2023 17:39:47 +0400 Subject: [PATCH] Various fixes --- .../Messages/EngineStoryViewListContext.swift | 6 +-- .../Sources/MediaEditorScreen.swift | 3 ++ .../Sources/PeerListItemComponent.swift | 7 ++- .../Sources/StoryChatContent.swift | 1 + .../StoryItemSetContainerComponent.swift | 14 +++-- .../StoryItemSetViewListComponent.swift | 51 ++++++++++++++++++- 6 files changed, 73 insertions(+), 9 deletions(-) diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/EngineStoryViewListContext.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/EngineStoryViewListContext.swift index 4544cf6bd2..1764f9fb4f 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/EngineStoryViewListContext.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/EngineStoryViewListContext.swift @@ -178,9 +178,9 @@ public final class EngineStoryViewListContext { } public struct ItemHash: Hashable { - var peerId: EnginePeer.Id - var storyId: Int32? - var messageId: EngineMessage.Id? + public var peerId: EnginePeer.Id + public var storyId: Int32? + public var messageId: EngineMessage.Id? } public var uniqueId: ItemHash { diff --git a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift index f1ad47073e..b946c9d4a7 100644 --- a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift +++ b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift @@ -2669,6 +2669,9 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate return false } } + if self.stickerScreen != nil { + return false + } return true } else { return true diff --git a/submodules/TelegramUI/Components/Stories/PeerListItemComponent/Sources/PeerListItemComponent.swift b/submodules/TelegramUI/Components/Stories/PeerListItemComponent/Sources/PeerListItemComponent.swift index 3deab23b96..8e1b923c9a 100644 --- a/submodules/TelegramUI/Components/Stories/PeerListItemComponent/Sources/PeerListItemComponent.swift +++ b/submodules/TelegramUI/Components/Stories/PeerListItemComponent/Sources/PeerListItemComponent.swift @@ -253,7 +253,7 @@ public final class PeerListItemComponent: Component { private var fileDisposable: Disposable? private var imageButtonView: HighlightTrackingButton? - private var imageNode: TransformImageNode? + public private(set) var imageNode: TransformImageNode? private var component: PeerListItemComponent? private weak var state: EmptyComponentState? @@ -410,6 +410,10 @@ public final class PeerListItemComponent: Component { } } + public func updateIsPreviewing(isPreviewing: Bool) { + self.imageNode?.isHidden = isPreviewing + } + func update(component: PeerListItemComponent, availableSize: CGSize, state: EmptyComponentState, environment: Environment, transition: Transition) -> CGSize { let previousComponent = self.component @@ -910,6 +914,7 @@ public final class PeerListItemComponent: Component { imageButtonView = HighlightTrackingButton() imageButtonView.addTarget(self, action: #selector(self.imageButtonPressed), for: .touchUpInside) + imageButtonView.isEnabled = component.message == nil self.imageButtonView = imageButtonView self.containerButton.addSubview(imageNode.view) diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryChatContent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryChatContent.swift index 63846d12b7..f023035b61 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryChatContent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryChatContent.swift @@ -2454,6 +2454,7 @@ public final class RepostStoriesContentContextImpl: StoryContentContext { readGlobally: Bool ) { self.context = context + self.focusedItem = (focusedStoryId.peerId, focusedStoryId.id) self.viewListContext = viewListContext self.readGlobally = readGlobally diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift index 685c9bd8b1..54a1789cbc 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift @@ -5199,7 +5199,7 @@ public final class StoryItemSetContainerComponent: Component { let storyContent = RepostStoriesContentContextImpl(context: context, focusedStoryId: StoryId(peerId: peer.id, id: id), viewListContext: viewListContext, readGlobally: false) let _ = (storyContent.state |> take(1) - |> deliverOnMainQueue).startStandalone(next: { [weak controller, weak sourceView] _ in + |> deliverOnMainQueue).startStandalone(next: { [weak controller, weak viewListView, weak sourceView] _ in guard let controller, let sourceView else { return } @@ -5214,9 +5214,14 @@ public final class StoryItemSetContainerComponent: Component { context: context, content: storyContent, transitionIn: transitionIn, - transitionOut: { [weak sourceView] peerId, storyIdValue in - if let sourceView { - let destinationView = sourceView + transitionOut: { [weak sourceView, weak viewListView] peerId, storyIdValue in + var destinationView: UIView? + if let view = viewListView?.sourceView(storyId: StoryId(peerId: peerId, id: storyIdValue as? Int32 ?? 0)) { + destinationView = view + } else { + destinationView = sourceView + } + if let destinationView { return StoryContainerScreen.TransitionOut( destinationView: destinationView, transitionView: StoryContainerScreen.TransitionView( @@ -5252,6 +5257,7 @@ public final class StoryItemSetContainerComponent: Component { } } ) + viewListView?.setPreviewedItem(signal: storyContainerScreen.focusedItem) controller.push(storyContainerScreen) }) } diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetViewListComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetViewListComponent.swift index fb0d45a2ed..d9e9d1c5c2 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetViewListComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetViewListComponent.swift @@ -293,6 +293,9 @@ final class StoryItemSetViewListComponent: Component { var viewListState: EngineStoryViewListContext.State? var requestedLoadMoreToken: EngineStoryViewListContext.LoadMoreToken? + private var previewedItemDisposable: Disposable? + private var previewedItemId: StoryId? + var eventCycleState: EventCycleState? var totalCount: Int? { @@ -339,6 +342,42 @@ final class StoryItemSetViewListComponent: Component { deinit { self.viewListDisposable?.dispose() + self.previewedItemDisposable?.dispose() + } + + func setPreviewedItem(signal: Signal) { + self.previewedItemDisposable?.dispose() + self.previewedItemDisposable = (signal |> distinctUntilChanged |> deliverOnMainQueue).start(next: { [weak self] previewedItemId in + guard let self else { + return + } + self.previewedItemId = previewedItemId + + for (itemId, visibleItem) in self.visibleItems { + if let itemView = visibleItem.view as? PeerListItemComponent.View { + let isPreviewing = itemId.peerId == previewedItemId?.peerId && itemId.storyId == previewedItemId?.id + itemView.updateIsPreviewing(isPreviewing: isPreviewing) + + if isPreviewing { + let itemFrame = itemView.frame.offsetBy(dx: 0.0, dy: self.scrollView.bounds.minY) + if !self.scrollView.bounds.intersects(itemFrame.insetBy(dx: 0.0, dy: 20.0)) { + self.scrollView.scrollRectToVisible(itemFrame.insetBy(dx: 0.0, dy: -40.0), animated: false) + } + } + } + } + }) + } + + func sourceView(storyId: StoryId) -> UIView? { + for (itemId, visibleItem) in self.visibleItems { + if let itemView = visibleItem.view as? PeerListItemComponent.View { + if itemId.peerId == storyId.peerId && itemId.storyId == storyId.id { + return itemView.imageNode?.view + } + } + } + return nil } func scrollViewDidScroll(_ scrollView: UIScrollView) { @@ -577,7 +616,7 @@ final class StoryItemSetViewListComponent: Component { environment: {}, containerSize: itemFrame.size ) - if let itemView = visibleItem.view { + if let itemView = visibleItem.view as? PeerListItemComponent.View { var animateIn = false if itemView.superview == nil { animateIn = true @@ -585,6 +624,8 @@ final class StoryItemSetViewListComponent: Component { } itemTransition.setFrame(view: itemView, frame: itemFrame) + itemView.updateIsPreviewing(isPreviewing: self.previewedItemId?.peerId == item.peer.id && self.previewedItemId?.id == item.story?.id) + if animateIn, synchronousLoad { itemView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) } @@ -1310,6 +1351,14 @@ final class StoryItemSetViewListComponent: Component { return super.hitTest(point, with: event) } + public func setPreviewedItem(signal: Signal) { + self.currentContentView?.setPreviewedItem(signal: signal) + } + + public func sourceView(storyId: StoryId) -> UIView? { + self.currentContentView?.sourceView(storyId: storyId) + } + func animateIn(transition: Transition) { let offset = self.bounds.height - self.navigationBarBackground.frame.minY Transition.immediate.setBoundsOrigin(view: self, origin: CGPoint(x: 0.0, y: -offset))