mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Stories
This commit is contained in:
parent
dbb6fe27b8
commit
34e8c54bb0
@ -31,7 +31,7 @@ public final class OpenChatMessageParams {
|
|||||||
public let modal: Bool
|
public let modal: Bool
|
||||||
public let dismissInput: () -> Void
|
public let dismissInput: () -> Void
|
||||||
public let present: (ViewController, Any?) -> Void
|
public let present: (ViewController, Any?) -> Void
|
||||||
public let transitionNode: (MessageId, Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
public let transitionNode: (MessageId, Media, Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
||||||
public let addToTransitionSurface: (UIView) -> Void
|
public let addToTransitionSurface: (UIView) -> Void
|
||||||
public let openUrl: (String) -> Void
|
public let openUrl: (String) -> Void
|
||||||
public let openPeer: (Peer, ChatControllerInteractionNavigateToPeer) -> Void
|
public let openPeer: (Peer, ChatControllerInteractionNavigateToPeer) -> Void
|
||||||
@ -60,7 +60,7 @@ public final class OpenChatMessageParams {
|
|||||||
modal: Bool = false,
|
modal: Bool = false,
|
||||||
dismissInput: @escaping () -> Void,
|
dismissInput: @escaping () -> Void,
|
||||||
present: @escaping (ViewController, Any?) -> Void,
|
present: @escaping (ViewController, Any?) -> Void,
|
||||||
transitionNode: @escaping (MessageId, Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?,
|
transitionNode: @escaping (MessageId, Media, Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?,
|
||||||
addToTransitionSurface: @escaping (UIView) -> Void,
|
addToTransitionSurface: @escaping (UIView) -> Void,
|
||||||
openUrl: @escaping (String) -> Void,
|
openUrl: @escaping (String) -> Void,
|
||||||
openPeer: @escaping (Peer, ChatControllerInteractionNavigateToPeer) -> Void,
|
openPeer: @escaping (Peer, ChatControllerInteractionNavigateToPeer) -> Void,
|
||||||
|
@ -2069,7 +2069,7 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode {
|
|||||||
interaction.dismissInput()
|
interaction.dismissInput()
|
||||||
}, present: { c, a in
|
}, present: { c, a in
|
||||||
interaction.present(c, a)
|
interaction.present(c, a)
|
||||||
}, transitionNode: { messageId, media in
|
}, transitionNode: { messageId, media, _ in
|
||||||
return transitionNodeImpl?(messageId, EngineMedia(media))
|
return transitionNodeImpl?(messageId, EngineMedia(media))
|
||||||
}, addToTransitionSurface: { view in
|
}, addToTransitionSurface: { view in
|
||||||
addToTransitionSurfaceImpl?(view)
|
addToTransitionSurfaceImpl?(view)
|
||||||
@ -2204,12 +2204,12 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode {
|
|||||||
interaction.dismissInput()
|
interaction.dismissInput()
|
||||||
}, present: { c, a in
|
}, present: { c, a in
|
||||||
interaction.present(c, a)
|
interaction.present(c, a)
|
||||||
}, transitionNode: { messageId, media in
|
}, transitionNode: { messageId, media, _ in
|
||||||
var transitionNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
var transitionNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
strongSelf.listNode.forEachItemNode { itemNode in
|
strongSelf.listNode.forEachItemNode { itemNode in
|
||||||
if let itemNode = itemNode as? ListMessageNode {
|
if let itemNode = itemNode as? ListMessageNode {
|
||||||
if let result = itemNode.transitionNode(id: messageId, media: media) {
|
if let result = itemNode.transitionNode(id: messageId, media: media, adjustRect: false) {
|
||||||
transitionNode = result
|
transitionNode = result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3031,7 +3031,7 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode {
|
|||||||
var transitionNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
var transitionNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
||||||
self.listNode.forEachItemNode { itemNode in
|
self.listNode.forEachItemNode { itemNode in
|
||||||
if let itemNode = itemNode as? ListMessageNode {
|
if let itemNode = itemNode as? ListMessageNode {
|
||||||
if let result = itemNode.transitionNode(id: messageId, media: media._asMedia()) {
|
if let result = itemNode.transitionNode(id: messageId, media: media._asMedia(), adjustRect: false) {
|
||||||
transitionNode = result
|
transitionNode = result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1398,7 +1398,7 @@ public final class ListMessageFileItemNode: ListMessageNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override public func transitionNode(id: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
override public func transitionNode(id: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
if let item = self.item, let message = item.message, message.id == id, self.iconImageNode.supernode != nil {
|
if let item = self.item, let message = item.message, message.id == id, self.iconImageNode.supernode != nil {
|
||||||
let iconImageNode = self.iconImageNode
|
let iconImageNode = self.iconImageNode
|
||||||
return (self.iconImageNode, self.iconImageNode.bounds, { [weak iconImageNode] in
|
return (self.iconImageNode, self.iconImageNode.bounds, { [weak iconImageNode] in
|
||||||
|
@ -28,7 +28,7 @@ public class ListMessageNode: ListViewItemNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func transitionNode(id: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
public func transitionNode(id: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -775,7 +775,7 @@ public final class ListMessageSnippetItemNode: ListMessageNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override public func transitionNode(id: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
override public func transitionNode(id: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
if let item = self.item, item.message?.id == id, self.iconImageNode.supernode != nil {
|
if let item = self.item, item.message?.id == id, self.iconImageNode.supernode != nil {
|
||||||
let iconImageNode = self.iconImageNode
|
let iconImageNode = self.iconImageNode
|
||||||
return (self.iconImageNode, self.iconImageNode.bounds, { [weak iconImageNode] in
|
return (self.iconImageNode, self.iconImageNode.bounds, { [weak iconImageNode] in
|
||||||
|
@ -33,7 +33,7 @@ private func presentLiveLocationController(context: AccountContext, peerId: Peer
|
|||||||
controller?.view.endEditing(true)
|
controller?.view.endEditing(true)
|
||||||
}, present: { c, a in
|
}, present: { c, a in
|
||||||
controller?.present(c, in: .window(.root), with: a, blockInteraction: true)
|
controller?.present(c, in: .window(.root), with: a, blockInteraction: true)
|
||||||
}, transitionNode: { _, _ in
|
}, transitionNode: { _, _, _ in
|
||||||
return nil
|
return nil
|
||||||
}, addToTransitionSurface: { _ in
|
}, addToTransitionSurface: { _ in
|
||||||
}, openUrl: { _ in
|
}, openUrl: { _ in
|
||||||
|
@ -2722,7 +2722,7 @@ final class StorageUsageScreenComponent: Component {
|
|||||||
}
|
}
|
||||||
self.controller?()?.present(c, in: .window(.root), with: a, blockInteraction: true)
|
self.controller?()?.present(c, in: .window(.root), with: a, blockInteraction: true)
|
||||||
},
|
},
|
||||||
transitionNode: { [weak self] messageId, media in
|
transitionNode: { [weak self] messageId, media, _ in
|
||||||
guard let self else {
|
guard let self else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -61,6 +61,7 @@ swift_library(
|
|||||||
"//submodules/PresentationDataUtils",
|
"//submodules/PresentationDataUtils",
|
||||||
"//submodules/UrlEscaping",
|
"//submodules/UrlEscaping",
|
||||||
"//submodules/OverlayStatusController",
|
"//submodules/OverlayStatusController",
|
||||||
|
"//submodules/Utils/VolumeButtons",
|
||||||
],
|
],
|
||||||
visibility = [
|
visibility = [
|
||||||
"//visibility:public",
|
"//visibility:public",
|
||||||
|
@ -16,6 +16,7 @@ import EntityKeyboard
|
|||||||
import AsyncDisplayKit
|
import AsyncDisplayKit
|
||||||
import AttachmentUI
|
import AttachmentUI
|
||||||
import simd
|
import simd
|
||||||
|
import VolumeButtons
|
||||||
|
|
||||||
func hasFirstResponder(_ view: UIView) -> Bool {
|
func hasFirstResponder(_ view: UIView) -> Bool {
|
||||||
if view.isFirstResponder {
|
if view.isFirstResponder {
|
||||||
@ -173,6 +174,9 @@ private final class StoryContainerScreenComponent: Component {
|
|||||||
|
|
||||||
private var transitionCloneMasterView: UIView
|
private var transitionCloneMasterView: UIView
|
||||||
|
|
||||||
|
private var volumeButtonsListener: VolumeButtonsListener?
|
||||||
|
private let volumeButtonsListenerShouldBeActvie = ValuePromise<Bool>(false, ignoreRepeated: true)
|
||||||
|
|
||||||
private var isAnimatingOut: Bool = false
|
private var isAnimatingOut: Bool = false
|
||||||
private var didAnimateOut: Bool = false
|
private var didAnimateOut: Bool = false
|
||||||
|
|
||||||
@ -570,6 +574,24 @@ private final class StoryContainerScreenComponent: Component {
|
|||||||
self.didAnimateOut = true
|
self.didAnimateOut = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func updateVolumeButtonMonitoring() {
|
||||||
|
if self.volumeButtonsListener == nil {
|
||||||
|
self.volumeButtonsListener = VolumeButtonsListener(shouldBeActive: self.volumeButtonsListenerShouldBeActvie.get(), valueChanged: { [weak self] in
|
||||||
|
guard let self, self.storyItemSharedState.useAmbientMode else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
self.storyItemSharedState.useAmbientMode = false
|
||||||
|
self.volumeButtonsListenerShouldBeActvie.set(false)
|
||||||
|
|
||||||
|
for (_, itemSetView) in self.visibleItemSetViews {
|
||||||
|
if let componentView = itemSetView.view.view as? StoryItemSetContainerComponent.View {
|
||||||
|
componentView.leaveAmbientMode()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func update(component: StoryContainerScreenComponent, availableSize: CGSize, state: EmptyComponentState, environment: Environment<ViewControllerComponentContainer.Environment>, transition: Transition) -> CGSize {
|
func update(component: StoryContainerScreenComponent, availableSize: CGSize, state: EmptyComponentState, environment: Environment<ViewControllerComponentContainer.Environment>, transition: Transition) -> CGSize {
|
||||||
if self.didAnimateOut {
|
if self.didAnimateOut {
|
||||||
return availableSize
|
return availableSize
|
||||||
@ -588,11 +610,22 @@ private final class StoryContainerScreenComponent: Component {
|
|||||||
}
|
}
|
||||||
if update {
|
if update {
|
||||||
var focusedItemId: StoryId?
|
var focusedItemId: StoryId?
|
||||||
|
var isVideo = false
|
||||||
if let slice = component.content.stateValue?.slice {
|
if let slice = component.content.stateValue?.slice {
|
||||||
focusedItemId = StoryId(peerId: slice.peer.id, id: slice.item.storyItem.id)
|
focusedItemId = StoryId(peerId: slice.peer.id, id: slice.item.storyItem.id)
|
||||||
|
if case .file = slice.item.storyItem.media {
|
||||||
|
isVideo = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
self.focusedItem.set(focusedItemId)
|
self.focusedItem.set(focusedItemId)
|
||||||
|
|
||||||
|
if self.storyItemSharedState.useAmbientMode {
|
||||||
|
self.volumeButtonsListenerShouldBeActvie.set(isVideo)
|
||||||
|
if isVideo {
|
||||||
|
self.updateVolumeButtonMonitoring()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if component.content.stateValue?.slice == nil {
|
if component.content.stateValue?.slice == nil {
|
||||||
self.environment?.controller()?.dismiss()
|
self.environment?.controller()?.dismiss()
|
||||||
} else {
|
} else {
|
||||||
|
@ -25,6 +25,9 @@ public final class StoryContentItem {
|
|||||||
|
|
||||||
open func rewind() {
|
open func rewind() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open func leaveAmbientMode() {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class Environment: Equatable {
|
public final class Environment: Equatable {
|
||||||
|
@ -468,6 +468,18 @@ public final class StoryItemSetContainerComponent: Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func leaveAmbientMode() {
|
||||||
|
guard let component = self.component else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
guard let visibleItem = self.visibleItems[component.slice.item.id] else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if let itemView = visibleItem.view.view as? StoryContentItem.View {
|
||||||
|
itemView.leaveAmbientMode()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@objc public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
|
@objc public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
|
||||||
if otherGestureRecognizer is UIPanGestureRecognizer {
|
if otherGestureRecognizer is UIPanGestureRecognizer {
|
||||||
return true
|
return true
|
||||||
@ -1439,8 +1451,13 @@ public final class StoryItemSetContainerComponent: Component {
|
|||||||
})))
|
})))
|
||||||
items.append(.action(ContextMenuActionItem(text: "Share", icon: { theme in
|
items.append(.action(ContextMenuActionItem(text: "Share", icon: { theme in
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Forward"), color: theme.contextMenu.primaryColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Forward"), color: theme.contextMenu.primaryColor)
|
||||||
}, action: { _, a in
|
}, action: { [weak self] _, a in
|
||||||
a(.default)
|
a(.default)
|
||||||
|
|
||||||
|
guard let self else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
self.sendMessageContext.performShareAction(view: self)
|
||||||
})))
|
})))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,7 +23,6 @@ swift_library(
|
|||||||
"//submodules/TelegramUniversalVideoContent",
|
"//submodules/TelegramUniversalVideoContent",
|
||||||
"//submodules/AvatarNode",
|
"//submodules/AvatarNode",
|
||||||
"//submodules/Components/HierarchyTrackingLayer",
|
"//submodules/Components/HierarchyTrackingLayer",
|
||||||
"//submodules/Utils/VolumeButtons",
|
|
||||||
],
|
],
|
||||||
visibility = [
|
visibility = [
|
||||||
"//visibility:public",
|
"//visibility:public",
|
||||||
|
@ -12,7 +12,6 @@ import UniversalMediaPlayer
|
|||||||
import TelegramUniversalVideoContent
|
import TelegramUniversalVideoContent
|
||||||
import StoryContainerScreen
|
import StoryContainerScreen
|
||||||
import HierarchyTrackingLayer
|
import HierarchyTrackingLayer
|
||||||
import VolumeButtons
|
|
||||||
|
|
||||||
final class StoryItemContentComponent: Component {
|
final class StoryItemContentComponent: Component {
|
||||||
typealias EnvironmentType = StoryContentItem.Environment
|
typealias EnvironmentType = StoryContentItem.Environment
|
||||||
@ -94,8 +93,6 @@ final class StoryItemContentComponent: Component {
|
|||||||
private let imageNode: TransformImageNode
|
private let imageNode: TransformImageNode
|
||||||
private var videoNode: UniversalVideoNode?
|
private var videoNode: UniversalVideoNode?
|
||||||
|
|
||||||
private var volumeButtonsListener: VolumeButtonsListener?
|
|
||||||
|
|
||||||
private var currentMessageMedia: EngineMedia?
|
private var currentMessageMedia: EngineMedia?
|
||||||
private var fetchDisposable: Disposable?
|
private var fetchDisposable: Disposable?
|
||||||
|
|
||||||
@ -197,19 +194,6 @@ final class StoryItemContentComponent: Component {
|
|||||||
if update {
|
if update {
|
||||||
self.state?.updated(transition: .immediate)
|
self.state?.updated(transition: .immediate)
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.volumeButtonsListener == nil, let sharedState = self.environment?.sharedState, sharedState.useAmbientMode {
|
|
||||||
self.volumeButtonsListener = VolumeButtonsListener(shouldBeActive: .single(true), valueChanged: { [weak self] in
|
|
||||||
guard let self, let sharedState = self.environment?.sharedState, sharedState.useAmbientMode else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
sharedState.useAmbientMode = false
|
|
||||||
if let videoNode = self.videoNode {
|
|
||||||
videoNode.continueWithOverridingAmbientMode()
|
|
||||||
}
|
|
||||||
self.volumeButtonsListener = nil
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -230,6 +214,12 @@ final class StoryItemContentComponent: Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override func leaveAmbientMode() {
|
||||||
|
if let videoNode = self.videoNode {
|
||||||
|
videoNode.continueWithOverridingAmbientMode()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func updateIsProgressPaused() {
|
private func updateIsProgressPaused() {
|
||||||
if let videoNode = self.videoNode {
|
if let videoNode = self.videoNode {
|
||||||
var canPlay = !self.isProgressPaused && self.contentLoaded && self.hierarchyTrackingLayer.isInHierarchy
|
var canPlay = !self.isProgressPaused && self.contentLoaded && self.hierarchyTrackingLayer.isInHierarchy
|
||||||
|
@ -947,7 +947,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
var selectedNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
var selectedNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
||||||
strongSelf.chatDisplayNode.historyNode.forEachItemNode { itemNode in
|
strongSelf.chatDisplayNode.historyNode.forEachItemNode { itemNode in
|
||||||
if let itemNode = itemNode as? ChatMessageItemView {
|
if let itemNode = itemNode as? ChatMessageItemView {
|
||||||
if let result = itemNode.transitionNode(id: message.id, media: image) {
|
if let result = itemNode.transitionNode(id: message.id, media: image, adjustRect: false) {
|
||||||
selectedNode = result
|
selectedNode = result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1001,12 +1001,12 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
self?.chatDisplayNode.dismissInput()
|
self?.chatDisplayNode.dismissInput()
|
||||||
}, present: { c, a in
|
}, present: { c, a in
|
||||||
self?.present(c, in: .window(.root), with: a, blockInteraction: true)
|
self?.present(c, in: .window(.root), with: a, blockInteraction: true)
|
||||||
}, transitionNode: { messageId, media in
|
}, transitionNode: { messageId, media, adjustRect in
|
||||||
var selectedNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
var selectedNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
strongSelf.chatDisplayNode.historyNode.forEachItemNode { itemNode in
|
strongSelf.chatDisplayNode.historyNode.forEachItemNode { itemNode in
|
||||||
if let itemNode = itemNode as? ChatMessageItemView {
|
if let itemNode = itemNode as? ChatMessageItemView {
|
||||||
if let result = itemNode.transitionNode(id: messageId, media: media) {
|
if let result = itemNode.transitionNode(id: messageId, media: media, adjustRect: adjustRect) {
|
||||||
selectedNode = result
|
selectedNode = result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -18243,7 +18243,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
var selectedNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
var selectedNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
||||||
self.chatDisplayNode.historyNode.forEachItemNode { itemNode in
|
self.chatDisplayNode.historyNode.forEachItemNode { itemNode in
|
||||||
if let itemNode = itemNode as? ChatMessageItemView {
|
if let itemNode = itemNode as? ChatMessageItemView {
|
||||||
if let result = itemNode.transitionNode(id: messageId, media: media) {
|
if let result = itemNode.transitionNode(id: messageId, media: media, adjustRect: false) {
|
||||||
selectedNode = result
|
selectedNode = result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -362,15 +362,15 @@ final class ChatHistorySearchContainerNode: SearchDisplayControllerContentNode {
|
|||||||
var transitionNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
var transitionNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
||||||
self.listNode.forEachItemNode { itemNode in
|
self.listNode.forEachItemNode { itemNode in
|
||||||
if let itemNode = itemNode as? ChatMessageItemView {
|
if let itemNode = itemNode as? ChatMessageItemView {
|
||||||
if let result = itemNode.transitionNode(id: messageId, media: media) {
|
if let result = itemNode.transitionNode(id: messageId, media: media, adjustRect: false) {
|
||||||
transitionNode = result
|
transitionNode = result
|
||||||
}
|
}
|
||||||
} else if let itemNode = itemNode as? ListMessageNode {
|
} else if let itemNode = itemNode as? ListMessageNode {
|
||||||
if let result = itemNode.transitionNode(id: messageId, media: media) {
|
if let result = itemNode.transitionNode(id: messageId, media: media, adjustRect: false) {
|
||||||
transitionNode = result
|
transitionNode = result
|
||||||
}
|
}
|
||||||
} else if let itemNode = itemNode as? GridMessageItemNode {
|
} else if let itemNode = itemNode as? GridMessageItemNode {
|
||||||
if let result = itemNode.transitionNode(id: messageId, media: media) {
|
if let result = itemNode.transitionNode(id: messageId, media: media, adjustRect: false) {
|
||||||
transitionNode = result
|
transitionNode = result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -89,7 +89,7 @@ class ChatMessageActionBubbleContentNode: ChatMessageBubbleContentNode {
|
|||||||
super.didLoad()
|
super.didLoad()
|
||||||
}
|
}
|
||||||
|
|
||||||
override func transitionNode(messageId: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
override func transitionNode(messageId: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
if let imageNode = self.imageNode, self.item?.message.id == messageId {
|
if let imageNode = self.imageNode, self.item?.message.id == messageId {
|
||||||
return (imageNode, imageNode.bounds, { [weak self] in
|
return (imageNode, imageNode.bounds, { [weak self] in
|
||||||
guard let strongSelf = self, let imageNode = strongSelf.imageNode else {
|
guard let strongSelf = self, let imageNode = strongSelf.imageNode else {
|
||||||
|
@ -199,7 +199,7 @@ class ChatMessageBubbleContentNode: ASDisplayNode {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func transitionNode(messageId: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
func transitionNode(messageId: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4028,9 +4028,9 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
|
|||||||
return super.hitTest(point, with: event)
|
return super.hitTest(point, with: event)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func transitionNode(id: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
override func transitionNode(id: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
for contentNode in self.contentNodes {
|
for contentNode in self.contentNodes {
|
||||||
if let result = contentNode.transitionNode(messageId: id, media: media) {
|
if let result = contentNode.transitionNode(messageId: id, media: media, adjustRect: adjustRect) {
|
||||||
if self.contentNodes.count == 1 && self.contentNodes.first is ChatMessageMediaBubbleContentNode && self.nameNode == nil && self.adminBadgeNode == nil && self.forwardInfoNode == nil && self.replyInfoNode == nil {
|
if self.contentNodes.count == 1 && self.contentNodes.first is ChatMessageMediaBubbleContentNode && self.nameNode == nil && self.adminBadgeNode == nil && self.forwardInfoNode == nil && self.replyInfoNode == nil {
|
||||||
return (result.0, result.1, { [weak self] in
|
return (result.0, result.1, { [weak self] in
|
||||||
guard let strongSelf = self, let resultView = result.2().0 else {
|
guard let strongSelf = self, let resultView = result.2().0 else {
|
||||||
|
@ -104,7 +104,7 @@ final class ChatMessageEventLogPreviousDescriptionContentNode: ChatMessageBubble
|
|||||||
return self.contentNode.updateHiddenMedia(media)
|
return self.contentNode.updateHiddenMedia(media)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func transitionNode(messageId: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
override func transitionNode(messageId: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
if self.item?.message.id != messageId {
|
if self.item?.message.id != messageId {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -99,7 +99,7 @@ final class ChatMessageEventLogPreviousLinkContentNode: ChatMessageBubbleContent
|
|||||||
return self.contentNode.updateHiddenMedia(media)
|
return self.contentNode.updateHiddenMedia(media)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func transitionNode(messageId: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
override func transitionNode(messageId: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
if self.item?.message.id != messageId {
|
if self.item?.message.id != messageId {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -106,7 +106,7 @@ final class ChatMessageEventLogPreviousMessageContentNode: ChatMessageBubbleCont
|
|||||||
return self.contentNode.updateHiddenMedia(media)
|
return self.contentNode.updateHiddenMedia(media)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func transitionNode(messageId: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
override func transitionNode(messageId: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
if self.item?.message.id != messageId {
|
if self.item?.message.id != messageId {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -183,7 +183,7 @@ class ChatMessageFileBubbleContentNode: ChatMessageBubbleContentNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func transitionNode(messageId: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
override func transitionNode(messageId: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
if self.item?.message.id == messageId {
|
if self.item?.message.id == messageId {
|
||||||
return self.interactiveFileNode.transitionNode(media: media)
|
return self.interactiveFileNode.transitionNode(media: media)
|
||||||
} else {
|
} else {
|
||||||
|
@ -133,7 +133,7 @@ final class ChatMessageGameBubbleContentNode: ChatMessageBubbleContentNode {
|
|||||||
return self.contentNode.updateHiddenMedia(media)
|
return self.contentNode.updateHiddenMedia(media)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func transitionNode(messageId: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
override func transitionNode(messageId: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
if self.item?.message.id != messageId {
|
if self.item?.message.id != messageId {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -364,7 +364,7 @@ class ChatMessageInstantVideoBubbleContentNode: ChatMessageBubbleContentNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func transitionNode(messageId: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
override func transitionNode(messageId: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2208,14 +2208,18 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func transitionNode() -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
func transitionNode(adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
let bounds: CGRect
|
var bounds: CGRect
|
||||||
if let currentImageArguments = self.currentImageArguments {
|
if let currentImageArguments = self.currentImageArguments {
|
||||||
|
if adjustRect {
|
||||||
|
bounds = currentImageArguments.drawingRect
|
||||||
|
} else {
|
||||||
bounds = currentImageArguments.imageRect
|
bounds = currentImageArguments.imageRect
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
bounds = self.bounds
|
bounds = self.bounds
|
||||||
}
|
}
|
||||||
return (self, bounds, { [weak self] in
|
return (adjustRect ? self.imageNode : self, bounds, { [weak self] in
|
||||||
var badgeNodeHidden: Bool?
|
var badgeNodeHidden: Bool?
|
||||||
if let badgeNode = self?.badgeNode {
|
if let badgeNode = self?.badgeNode {
|
||||||
badgeNodeHidden = badgeNode.isHidden
|
badgeNodeHidden = badgeNode.isHidden
|
||||||
|
@ -129,7 +129,7 @@ final class ChatMessageInvoiceBubbleContentNode: ChatMessageBubbleContentNode {
|
|||||||
return self.contentNode.updateHiddenMedia(media)
|
return self.contentNode.updateHiddenMedia(media)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func transitionNode(messageId: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
override func transitionNode(messageId: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
if self.item?.message.id != messageId {
|
if self.item?.message.id != messageId {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -782,7 +782,7 @@ public class ChatMessageItemView: ListViewItemNode, ChatMessageItemNodeProtocol
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func transitionNode(id: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
func transitionNode(id: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -476,7 +476,7 @@ class ChatMessageMapBubbleContentNode: ChatMessageBubbleContentNode {
|
|||||||
self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false)
|
self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func transitionNode(messageId: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
override func transitionNode(messageId: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
if self.item?.message.id == messageId, let currentMedia = self.media, currentMedia.isEqual(to: media) {
|
if self.item?.message.id == messageId, let currentMedia = self.media, currentMedia.isEqual(to: media) {
|
||||||
let imageNode = self.imageNode
|
let imageNode = self.imageNode
|
||||||
return (self.imageNode, self.imageNode.bounds, { [weak imageNode] in
|
return (self.imageNode, self.imageNode.bounds, { [weak imageNode] in
|
||||||
|
@ -398,13 +398,13 @@ class ChatMessageMediaBubbleContentNode: ChatMessageBubbleContentNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func transitionNode(messageId: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
override func transitionNode(messageId: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
if self.item?.message.id == messageId, var currentMedia = self.media {
|
if self.item?.message.id == messageId, var currentMedia = self.media {
|
||||||
if let invoice = currentMedia as? TelegramMediaInvoice, let extendedMedia = invoice.extendedMedia, case let .full(fullMedia) = extendedMedia {
|
if let invoice = currentMedia as? TelegramMediaInvoice, let extendedMedia = invoice.extendedMedia, case let .full(fullMedia) = extendedMedia {
|
||||||
currentMedia = fullMedia
|
currentMedia = fullMedia
|
||||||
}
|
}
|
||||||
if currentMedia.isSemanticallyEqual(to: media) {
|
if currentMedia.isSemanticallyEqual(to: media) {
|
||||||
return self.interactiveImageNode.transitionNode()
|
return self.interactiveImageNode.transitionNode(adjustRect: adjustRect)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -92,7 +92,7 @@ class ChatMessageProfilePhotoSuggestionContentNode: ChatMessageBubbleContentNode
|
|||||||
self.fetchDisposable.dispose()
|
self.fetchDisposable.dispose()
|
||||||
}
|
}
|
||||||
|
|
||||||
override func transitionNode(messageId: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
override func transitionNode(messageId: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
if self.item?.message.id == messageId {
|
if self.item?.message.id == messageId {
|
||||||
return (self.imageNode, self.imageNode.bounds, { [weak self] in
|
return (self.imageNode, self.imageNode.bounds, { [weak self] in
|
||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
|
@ -130,7 +130,7 @@ class ChatMessageWallpaperBubbleContentNode: ChatMessageBubbleContentNode {
|
|||||||
item.context.account.pendingPeerMediaUploadManager.cancel(peerId: item.message.id.peerId)
|
item.context.account.pendingPeerMediaUploadManager.cancel(peerId: item.message.id.peerId)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func transitionNode(messageId: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
override func transitionNode(messageId: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
if self.item?.message.id == messageId {
|
if self.item?.message.id == messageId {
|
||||||
return (self.imageNode, self.imageNode.bounds, { [weak self] in
|
return (self.imageNode, self.imageNode.bounds, { [weak self] in
|
||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
|
@ -523,7 +523,7 @@ final class ChatMessageWebpageBubbleContentNode: ChatMessageBubbleContentNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func transitionNode(messageId: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
override func transitionNode(messageId: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
if self.item?.message.id != messageId {
|
if self.item?.message.id != messageId {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -212,12 +212,12 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
|
|||||||
//self?.chatDisplayNode.dismissInput()
|
//self?.chatDisplayNode.dismissInput()
|
||||||
}, present: { c, a in
|
}, present: { c, a in
|
||||||
self?.presentController(c, .window(.root), a)
|
self?.presentController(c, .window(.root), a)
|
||||||
}, transitionNode: { messageId, media in
|
}, transitionNode: { messageId, media, adjustRect in
|
||||||
var selectedNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
var selectedNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
strongSelf.listNode.forEachItemNode { itemNode in
|
strongSelf.listNode.forEachItemNode { itemNode in
|
||||||
if let itemNode = itemNode as? ChatMessageItemView {
|
if let itemNode = itemNode as? ChatMessageItemView {
|
||||||
if let result = itemNode.transitionNode(id: messageId, media: media) {
|
if let result = itemNode.transitionNode(id: messageId, media: media, adjustRect: adjustRect) {
|
||||||
selectedNode = result
|
selectedNode = result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -380,7 +380,7 @@ final class GridMessageItemNode: GridItemNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func transitionNode(id: MessageId, media: Media) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
func transitionNode(id: MessageId, media: Media, adjustRect: Bool) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
||||||
if self.messageId == id {
|
if self.messageId == id {
|
||||||
let imageNode = self.imageNode
|
let imageNode = self.imageNode
|
||||||
return (self.imageNode, self.imageNode.bounds, { [weak self, weak imageNode] in
|
return (self.imageNode, self.imageNode.bounds, { [weak self, weak imageNode] in
|
||||||
|
@ -45,7 +45,7 @@ func openChatMessageImpl(_ params: OpenChatMessageParams) -> Bool {
|
|||||||
var transitionIn: StoryContainerScreen.TransitionIn? = nil
|
var transitionIn: StoryContainerScreen.TransitionIn? = nil
|
||||||
|
|
||||||
var selectedTransitionNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
var selectedTransitionNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
||||||
selectedTransitionNode = params.transitionNode(params.message.id, story)
|
selectedTransitionNode = params.transitionNode(params.message.id, story, true)
|
||||||
|
|
||||||
if let selectedTransitionNode {
|
if let selectedTransitionNode {
|
||||||
transitionIn = StoryContainerScreen.TransitionIn(
|
transitionIn = StoryContainerScreen.TransitionIn(
|
||||||
@ -66,7 +66,7 @@ func openChatMessageImpl(_ params: OpenChatMessageParams) -> Bool {
|
|||||||
var transitionOut: StoryContainerScreen.TransitionOut? = nil
|
var transitionOut: StoryContainerScreen.TransitionOut? = nil
|
||||||
|
|
||||||
var selectedTransitionNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
var selectedTransitionNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
||||||
selectedTransitionNode = params.transitionNode(params.message.id, story)
|
selectedTransitionNode = params.transitionNode(params.message.id, story, true)
|
||||||
if let selectedTransitionNode {
|
if let selectedTransitionNode {
|
||||||
transitionOut = StoryContainerScreen.TransitionOut(
|
transitionOut = StoryContainerScreen.TransitionOut(
|
||||||
destinationView: selectedTransitionNode.0.view,
|
destinationView: selectedTransitionNode.0.view,
|
||||||
@ -92,9 +92,9 @@ func openChatMessageImpl(_ params: OpenChatMessageParams) -> Bool {
|
|||||||
let scale = toScale.interpolate(to: fromScale, amount: state.progress)
|
let scale = toScale.interpolate(to: fromScale, amount: state.progress)
|
||||||
transition.setTransform(view: view, transform: CATransform3DMakeScale(scale, scale, 1.0))
|
transition.setTransform(view: view, transform: CATransform3DMakeScale(scale, scale, 1.0))
|
||||||
},
|
},
|
||||||
insertCloneTransitionView: { view in
|
insertCloneTransitionView: nil/*{ view in
|
||||||
params.addToTransitionSurface(view)
|
params.addToTransitionSurface(view)
|
||||||
}
|
}*/
|
||||||
),
|
),
|
||||||
destinationRect: selectedTransitionNode.1,
|
destinationRect: selectedTransitionNode.1,
|
||||||
destinationCornerRadius: 0.0,
|
destinationCornerRadius: 0.0,
|
||||||
@ -145,7 +145,7 @@ func openChatMessageImpl(_ params: OpenChatMessageParams) -> Bool {
|
|||||||
params.present(gallery, InstantPageGalleryControllerPresentationArguments(transitionArguments: { entry in
|
params.present(gallery, InstantPageGalleryControllerPresentationArguments(transitionArguments: { entry in
|
||||||
var selectedTransitionNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
var selectedTransitionNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
||||||
if entry.index == centralIndex {
|
if entry.index == centralIndex {
|
||||||
selectedTransitionNode = params.transitionNode(params.message.id, galleryMedia)
|
selectedTransitionNode = params.transitionNode(params.message.id, galleryMedia, false)
|
||||||
}
|
}
|
||||||
if let selectedTransitionNode = selectedTransitionNode {
|
if let selectedTransitionNode = selectedTransitionNode {
|
||||||
return GalleryTransitionArguments(transitionNode: selectedTransitionNode, addToTransitionSurface: params.addToTransitionSurface)
|
return GalleryTransitionArguments(transitionNode: selectedTransitionNode, addToTransitionSurface: params.addToTransitionSurface)
|
||||||
@ -277,7 +277,7 @@ func openChatMessageImpl(_ params: OpenChatMessageParams) -> Bool {
|
|||||||
params.centralItemUpdated?(messageId)
|
params.centralItemUpdated?(messageId)
|
||||||
}
|
}
|
||||||
params.present(gallery, GalleryControllerPresentationArguments(transitionArguments: { messageId, media in
|
params.present(gallery, GalleryControllerPresentationArguments(transitionArguments: { messageId, media in
|
||||||
let selectedTransitionNode = params.transitionNode(messageId, media)
|
let selectedTransitionNode = params.transitionNode(messageId, media, false)
|
||||||
if let selectedTransitionNode = selectedTransitionNode {
|
if let selectedTransitionNode = selectedTransitionNode {
|
||||||
return GalleryTransitionArguments(transitionNode: selectedTransitionNode, addToTransitionSurface: params.addToTransitionSurface)
|
return GalleryTransitionArguments(transitionNode: selectedTransitionNode, addToTransitionSurface: params.addToTransitionSurface)
|
||||||
}
|
}
|
||||||
@ -288,7 +288,7 @@ func openChatMessageImpl(_ params: OpenChatMessageParams) -> Bool {
|
|||||||
case let .secretGallery(gallery):
|
case let .secretGallery(gallery):
|
||||||
params.dismissInput()
|
params.dismissInput()
|
||||||
params.present(gallery, GalleryControllerPresentationArguments(transitionArguments: { messageId, media in
|
params.present(gallery, GalleryControllerPresentationArguments(transitionArguments: { messageId, media in
|
||||||
let selectedTransitionNode = params.transitionNode(messageId, media)
|
let selectedTransitionNode = params.transitionNode(messageId, media, false)
|
||||||
if let selectedTransitionNode = selectedTransitionNode {
|
if let selectedTransitionNode = selectedTransitionNode {
|
||||||
return GalleryTransitionArguments(transitionNode: selectedTransitionNode, addToTransitionSurface: params.addToTransitionSurface)
|
return GalleryTransitionArguments(transitionNode: selectedTransitionNode, addToTransitionSurface: params.addToTransitionSurface)
|
||||||
}
|
}
|
||||||
@ -332,7 +332,7 @@ func openChatMessageImpl(_ params: OpenChatMessageParams) -> Bool {
|
|||||||
}, media)
|
}, media)
|
||||||
|
|
||||||
params.present(controller, AvatarGalleryControllerPresentationArguments(transitionArguments: { entry in
|
params.present(controller, AvatarGalleryControllerPresentationArguments(transitionArguments: { entry in
|
||||||
if let selectedTransitionNode = params.transitionNode(params.message.id, media) {
|
if let selectedTransitionNode = params.transitionNode(params.message.id, media, false) {
|
||||||
return GalleryTransitionArguments(transitionNode: selectedTransitionNode, addToTransitionSurface: params.addToTransitionSurface)
|
return GalleryTransitionArguments(transitionNode: selectedTransitionNode, addToTransitionSurface: params.addToTransitionSurface)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -296,7 +296,7 @@ final class OverlayAudioPlayerControllerNode: ViewControllerTracingNode, UIGestu
|
|||||||
if let location = strongSelf.playlistLocation as? PeerMessagesPlaylistLocation, case let .custom(messages, _, loadMore) = location {
|
if let location = strongSelf.playlistLocation as? PeerMessagesPlaylistLocation, case let .custom(messages, _, loadMore) = location {
|
||||||
playlistLocation = .custom(messages: messages, at: id, loadMore: loadMore)
|
playlistLocation = .custom(messages: messages, at: id, loadMore: loadMore)
|
||||||
}
|
}
|
||||||
return strongSelf.context.sharedContext.openChatMessage(OpenChatMessageParams(context: strongSelf.context, chatLocation: nil, chatLocationContextHolder: nil, message: message, standalone: false, reverseMessageGalleryOrder: false, navigationController: nil, dismissInput: { }, present: { _, _ in }, transitionNode: { _, _ in return nil }, addToTransitionSurface: { _ in }, openUrl: { _ in }, openPeer: { _, _ in }, callPeer: { _, _ in }, enqueueMessage: { _ in }, sendSticker: nil, sendEmoji: nil, setupTemporaryHiddenMedia: { _, _, _ in }, chatAvatarHiddenMedia: { _, _ in }, playlistLocation: playlistLocation))
|
return strongSelf.context.sharedContext.openChatMessage(OpenChatMessageParams(context: strongSelf.context, chatLocation: nil, chatLocationContextHolder: nil, message: message, standalone: false, reverseMessageGalleryOrder: false, navigationController: nil, dismissInput: { }, present: { _, _ in }, transitionNode: { _, _, _ in return nil }, addToTransitionSurface: { _ in }, openUrl: { _ in }, openPeer: { _, _ in }, callPeer: { _, _ in }, enqueueMessage: { _ in }, sendSticker: nil, sendEmoji: nil, setupTemporaryHiddenMedia: { _, _, _ in }, chatAvatarHiddenMedia: { _, _ in }, playlistLocation: playlistLocation))
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -502,7 +502,7 @@ final class PeerInfoListPaneNode: ASDisplayNode, PeerInfoPaneNode {
|
|||||||
var transitionNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
var transitionNode: (ASDisplayNode, CGRect, () -> (UIView?, UIView?))?
|
||||||
self.listNode.forEachItemNode { itemNode in
|
self.listNode.forEachItemNode { itemNode in
|
||||||
if let itemNode = itemNode as? ListMessageNode {
|
if let itemNode = itemNode as? ListMessageNode {
|
||||||
if let result = itemNode.transitionNode(id: messageId, media: media) {
|
if let result = itemNode.transitionNode(id: messageId, media: media, adjustRect: false) {
|
||||||
transitionNode = result
|
transitionNode = result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4174,7 +4174,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
|||||||
self?.view.endEditing(true)
|
self?.view.endEditing(true)
|
||||||
}, present: { [weak self] c, a in
|
}, present: { [weak self] c, a in
|
||||||
self?.controller?.present(c, in: .window(.root), with: a, blockInteraction: true)
|
self?.controller?.present(c, in: .window(.root), with: a, blockInteraction: true)
|
||||||
}, transitionNode: { [weak self] messageId, media in
|
}, transitionNode: { [weak self] messageId, media, _ in
|
||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user