Reaction improvements

This commit is contained in:
Ali 2021-12-23 01:17:23 +04:00
parent af01ec906f
commit 01b3798ea3
4 changed files with 54 additions and 21 deletions

View File

@ -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

View File

@ -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 {

View File

@ -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() {

View File

@ -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)
}