mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-10-09 03:20:48 +00:00
Reaction improvements
This commit is contained in:
parent
af01ec906f
commit
01b3798ea3
@ -50,6 +50,7 @@ public final class ReactionContextNode: ASDisplayNode, UIScrollViewDelegate {
|
||||
private let contentContainer: ASDisplayNode
|
||||
private let contentContainerMask: UIImageView
|
||||
private let scrollNode: ASScrollNode
|
||||
private let previewingItemContainer: ASDisplayNode
|
||||
private var visibleItemNodes: [Int: ReactionNode] = [:]
|
||||
|
||||
private var isExpanded: Bool = true
|
||||
@ -85,6 +86,9 @@ public final class ReactionContextNode: ASDisplayNode, UIScrollViewDelegate {
|
||||
self.scrollNode.view.contentInsetAdjustmentBehavior = .never
|
||||
}
|
||||
|
||||
self.previewingItemContainer = ASDisplayNode()
|
||||
self.previewingItemContainer.isUserInteractionEnabled = false
|
||||
|
||||
self.contentContainer = ASDisplayNode()
|
||||
self.contentContainer.clipsToBounds = true
|
||||
self.contentContainer.addSubnode(self.scrollNode)
|
||||
@ -121,6 +125,7 @@ public final class ReactionContextNode: ASDisplayNode, UIScrollViewDelegate {
|
||||
self.scrollNode.view.delegate = self
|
||||
|
||||
self.addSubnode(self.contentContainer)
|
||||
self.addSubnode(self.previewingItemContainer)
|
||||
}
|
||||
|
||||
override public func didLoad() {
|
||||
@ -186,6 +191,7 @@ public final class ReactionContextNode: ASDisplayNode, UIScrollViewDelegate {
|
||||
let rowHeight: CGFloat = 30.0
|
||||
|
||||
let visibleBounds = self.scrollNode.view.bounds
|
||||
self.previewingItemContainer.bounds = visibleBounds
|
||||
|
||||
var validIndices = Set<Int>()
|
||||
for i in 0 ..< self.items.count {
|
||||
@ -199,10 +205,10 @@ public final class ReactionContextNode: ASDisplayNode, UIScrollViewDelegate {
|
||||
validIndices.insert(i)
|
||||
|
||||
var itemFrame = baseItemFrame
|
||||
var isPreviewing = false
|
||||
let isPreviewing = false
|
||||
if self.highlightedReaction == self.items[i].reaction {
|
||||
itemFrame = itemFrame.insetBy(dx: -6.0, dy: -6.0)
|
||||
isPreviewing = true
|
||||
itemFrame = itemFrame.insetBy(dx: -4.0, dy: -4.0).offsetBy(dx: 0.0, dy: 0.0)
|
||||
//isPreviewing = true
|
||||
}
|
||||
|
||||
var animateIn = false
|
||||
@ -219,6 +225,16 @@ public final class ReactionContextNode: ASDisplayNode, UIScrollViewDelegate {
|
||||
}
|
||||
|
||||
if !itemNode.isExtracted {
|
||||
if isPreviewing {
|
||||
/*if itemNode.supernode !== self.previewingItemContainer {
|
||||
self.previewingItemContainer.addSubnode(itemNode)
|
||||
}*/
|
||||
} else {
|
||||
/*if itemNode.supernode !== self.scrollNode {
|
||||
self.scrollNode.addSubnode(itemNode)
|
||||
}*/
|
||||
}
|
||||
|
||||
transition.updateFrame(node: itemNode, frame: itemFrame, beginWithCurrentState: true)
|
||||
itemNode.updateLayout(size: itemFrame.size, isExpanded: false, isPreviewing: isPreviewing, transition: transition)
|
||||
|
||||
@ -269,6 +285,7 @@ public final class ReactionContextNode: ASDisplayNode, UIScrollViewDelegate {
|
||||
transition.updateFrame(node: self.contentContainer, frame: backgroundFrame)
|
||||
transition.updateFrame(view: self.contentContainerMask, frame: CGRect(origin: CGPoint(), size: backgroundFrame.size))
|
||||
transition.updateFrame(node: self.scrollNode, frame: CGRect(origin: CGPoint(), size: backgroundFrame.size))
|
||||
transition.updateFrame(node: self.previewingItemContainer, frame: backgroundFrame)
|
||||
self.scrollNode.view.contentSize = CGSize(width: completeContentWidth, height: backgroundFrame.size.height)
|
||||
|
||||
self.updateScrolling(transition: transition)
|
||||
@ -532,6 +549,9 @@ public final class ReactionContextNode: ASDisplayNode, UIScrollViewDelegate {
|
||||
for i in 0 ..< 2 {
|
||||
let touchInset: CGFloat = i == 0 ? 0.0 : 8.0
|
||||
for (_, itemNode) in self.visibleItemNodes {
|
||||
if itemNode.supernode === self.scrollNode && !self.scrollNode.bounds.intersects(itemNode.frame) {
|
||||
continue
|
||||
}
|
||||
let itemPoint = self.view.convert(point, to: itemNode.view)
|
||||
if itemNode.bounds.insetBy(dx: -touchInset, dy: -touchInset).contains(itemPoint) {
|
||||
return itemNode.item
|
||||
|
@ -44,6 +44,8 @@ final class ReactionNode: ASDisplayNode {
|
||||
private var stillAnimationNode: AnimatedStickerNode?
|
||||
private var animationNode: AnimatedStickerNode?
|
||||
|
||||
private var dismissedStillAnimationNodes: [AnimatedStickerNode] = []
|
||||
|
||||
private var fetchStickerDisposable: Disposable?
|
||||
private var fetchFullAnimationDisposable: Disposable?
|
||||
|
||||
@ -81,14 +83,6 @@ final class ReactionNode: ASDisplayNode {
|
||||
strongSelf.animateInAnimationNode = nil
|
||||
}
|
||||
|
||||
/*self.stillAnimationNode.started = { [weak self] in
|
||||
guard let strongSelf = self else {
|
||||
return
|
||||
}
|
||||
strongSelf.animateInAnimationNode.isHidden = true
|
||||
strongSelf.animateInAnimationNode.visibility = false
|
||||
}*/
|
||||
|
||||
self.fetchStickerDisposable = fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: .standalone(resource: item.appearAnimation.resource)).start()
|
||||
self.fetchStickerDisposable = fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: .standalone(resource: item.stillAnimation.resource)).start()
|
||||
self.fetchStickerDisposable = fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: .standalone(resource: item.listAnimation.resource)).start()
|
||||
@ -185,13 +179,13 @@ final class ReactionNode: ASDisplayNode {
|
||||
self.validSize = size
|
||||
}
|
||||
|
||||
/*if isPreviewing {
|
||||
if isPreviewing {
|
||||
if self.stillAnimationNode == nil {
|
||||
let stillAnimationNode = AnimatedStickerNode()
|
||||
self.stillAnimationNode = stillAnimationNode
|
||||
self.addSubnode(stillAnimationNode)
|
||||
|
||||
stillAnimationNode.setup(source: AnimatedStickerResourceSource(account: self.context.account, resource: self.item.stillAnimation.resource), width: Int(animationDisplaySize.width * 2.0), height: Int(animationDisplaySize.height * 2.0), playbackMode: .once, mode: .direct(cachePathPrefix: self.context.account.postbox.mediaBox.shortLivedResourceCachePathPrefix(self.item.stillAnimation.resource.id)))
|
||||
stillAnimationNode.setup(source: AnimatedStickerResourceSource(account: self.context.account, resource: self.item.stillAnimation.resource), width: Int(animationDisplaySize.width * 2.0), height: Int(animationDisplaySize.height * 2.0), playbackMode: .loop, mode: .direct(cachePathPrefix: self.context.account.postbox.mediaBox.shortLivedResourceCachePathPrefix(self.item.stillAnimation.resource.id)))
|
||||
stillAnimationNode.position = animationFrame.center
|
||||
stillAnimationNode.bounds = CGRect(origin: CGPoint(), size: animationFrame.size)
|
||||
stillAnimationNode.updateLayout(size: animationFrame.size)
|
||||
@ -199,9 +193,12 @@ final class ReactionNode: ASDisplayNode {
|
||||
guard let strongSelf = self else {
|
||||
return
|
||||
}
|
||||
let _ = strongSelf
|
||||
strongSelf.staticAnimationNode.alpha = 0.0
|
||||
}
|
||||
stillAnimationNode.visibility = true
|
||||
|
||||
transition.animateTransformScale(node: stillAnimationNode, from: self.staticAnimationNode.bounds.width / animationFrame.width)
|
||||
transition.animatePositionAdditive(node: stillAnimationNode, offset: CGPoint(x: self.staticAnimationNode.frame.midX - animationFrame.midX, y: self.staticAnimationNode.frame.midY - animationFrame.midY))
|
||||
} else {
|
||||
if let stillAnimationNode = self.stillAnimationNode {
|
||||
transition.updatePosition(node: stillAnimationNode, position: animationFrame.center, beginWithCurrentState: true)
|
||||
@ -210,8 +207,24 @@ final class ReactionNode: ASDisplayNode {
|
||||
}
|
||||
} else if let stillAnimationNode = self.stillAnimationNode {
|
||||
self.stillAnimationNode = nil
|
||||
stillAnimationNode.removeFromSupernode()
|
||||
}*/
|
||||
self.dismissedStillAnimationNodes.append(stillAnimationNode)
|
||||
|
||||
transition.updatePosition(node: stillAnimationNode, position: animationFrame.center, beginWithCurrentState: true)
|
||||
transition.updateTransformScale(node: stillAnimationNode, scale: animationFrame.size.width / stillAnimationNode.bounds.width, beginWithCurrentState: true)
|
||||
|
||||
stillAnimationNode.alpha = 0.0
|
||||
stillAnimationNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.14, completion: { [weak self, weak stillAnimationNode] _ in
|
||||
guard let strongSelf = self, let stillAnimationNode = stillAnimationNode else {
|
||||
return
|
||||
}
|
||||
stillAnimationNode.removeFromSupernode()
|
||||
strongSelf.dismissedStillAnimationNodes.removeAll(where: { $0 === stillAnimationNode })
|
||||
})
|
||||
|
||||
let previousAlpha = CGFloat(self.staticAnimationNode.layer.presentation()?.opacity ?? self.staticAnimationNode.layer.opacity)
|
||||
self.staticAnimationNode.alpha = 1.0
|
||||
self.staticAnimationNode.layer.animateAlpha(from: previousAlpha, to: 1.0, duration: 0.08)
|
||||
}
|
||||
|
||||
if !self.didSetupStillAnimation {
|
||||
if self.animationNode == nil {
|
||||
|
@ -4592,11 +4592,11 @@ public extension Api {
|
||||
})
|
||||
}
|
||||
|
||||
public static func setDefaultReaction(emoji: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Bool>) {
|
||||
public static func setDefaultReaction(reaction: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Bool>) {
|
||||
let buffer = Buffer()
|
||||
buffer.appendInt32(1474910882)
|
||||
serializeString(emoji, buffer: buffer, boxed: false)
|
||||
return (FunctionDescription(name: "messages.setDefaultReaction", parameters: [("emoji", emoji)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in
|
||||
buffer.appendInt32(-647969580)
|
||||
serializeString(reaction, buffer: buffer, boxed: false)
|
||||
return (FunctionDescription(name: "messages.setDefaultReaction", parameters: [("reaction", reaction)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in
|
||||
let reader = BufferReader(buffer)
|
||||
var result: Api.Bool?
|
||||
if let signature = reader.readInt32() {
|
||||
|
@ -501,7 +501,7 @@ func _internal_updatePeerAllowedReactions(account: Account, peerId: PeerId, allo
|
||||
}
|
||||
|
||||
func _internal_updateDefaultReaction(account: Account, reaction: String) -> Signal<Never, NoError> {
|
||||
return account.network.request(Api.functions.messages.setDefaultReaction(emoji: reaction))
|
||||
return account.network.request(Api.functions.messages.setDefaultReaction(reaction: reaction))
|
||||
|> `catch` { _ -> Signal<Api.Bool, NoError> in
|
||||
return .single(.boolFalse)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user