Reaction experiments

This commit is contained in:
Isaac
2024-06-28 19:36:15 +02:00
parent ad1ddf65c0
commit 8af8de7096
44 changed files with 2281 additions and 98 deletions

View File

@@ -241,6 +241,7 @@ final class ContextControllerExtractedPresentationNode: ASDisplayNode, ContextCo
private let scrollNode: ASDisplayNode
private var reactionContextNode: ReactionContextNode?
private var reactionPreviewView: ReactionPreviewView?
private var reactionContextNodeIsAnimatingOut: Bool = false
private var itemContentNode: ItemContentNode?
@@ -637,6 +638,7 @@ final class ContextControllerExtractedPresentationNode: ASDisplayNode, ContextCo
var animateReactionsIn = false
var contentTopInset: CGFloat = topInset
var removedReactionContextNode: ReactionContextNode?
if let reactionItems = self.actionsStackNode.topReactionItems, !reactionItems.reactionItems.isEmpty {
let reactionContextNode: ReactionContextNode
if let current = self.reactionContextNode {
@@ -733,6 +735,25 @@ final class ContextControllerExtractedPresentationNode: ASDisplayNode, ContextCo
removedReactionContextNode = reactionContextNode
}
let reactionPreviewSize = CGSize(width: 100.0, height: 100.0)
let reactionPreviewInset: CGFloat = 7.0
var removedReactionPreviewView: ReactionPreviewView?
if self.reactionContextNode == nil, let previewReaction = self.actionsStackNode.topPreviewReaction {
let reactionPreviewView: ReactionPreviewView
if let current = self.reactionPreviewView {
reactionPreviewView = current
} else {
reactionPreviewView = ReactionPreviewView(context: previewReaction.context, file: previewReaction.file)
self.reactionPreviewView = reactionPreviewView
self.view.addSubview(reactionPreviewView)
}
contentTopInset += reactionPreviewSize.height + reactionPreviewInset
} else {
removedReactionPreviewView = self.reactionPreviewView
self.reactionPreviewView = nil
}
if let contentNode = itemContentNode {
switch stateTransition {
case .animateIn, .animateOut:
@@ -963,6 +984,14 @@ final class ContextControllerExtractedPresentationNode: ASDisplayNode, ContextCo
self.proposedReactionsPositionLock = nil
}
if let reactionPreviewView = self.reactionPreviewView {
let anchorRect = contentRect.offsetBy(dx: contentParentGlobalFrame.minX, dy: 0.0)
let reactionPreviewFrame = CGRect(origin: CGPoint(x: floor((anchorRect.midX - reactionPreviewSize.width * 0.5)), y: anchorRect.minY - reactionPreviewInset - reactionPreviewSize.height), size: reactionPreviewSize)
transition.updateFrame(view: reactionPreviewView, frame: reactionPreviewFrame)
reactionPreviewView.update(size: reactionPreviewFrame.size)
}
if let _ = self.currentReactionsPositionLock {
transition.updateAlpha(node: self.actionsStackNode, alpha: 0.0)
} else {
@@ -976,6 +1005,12 @@ final class ContextControllerExtractedPresentationNode: ASDisplayNode, ContextCo
})
}
if let removedReactionPreviewView {
transition.updateAlpha(layer: removedReactionPreviewView.layer, alpha: 0.0, completion: { [weak removedReactionPreviewView] _ in
removedReactionPreviewView?.removeFromSuperview()
})
}
transition.updateFrame(node: self.contentRectDebugNode, frame: contentRect, beginWithCurrentState: true)
var actionsFrame: CGRect
@@ -1205,6 +1240,29 @@ final class ContextControllerExtractedPresentationNode: ASDisplayNode, ContextCo
damping: springDamping,
additive: true
)
if let reactionPreviewView = self.reactionPreviewView {
reactionPreviewView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
reactionPreviewView.layer.animateSpring(
from: -animationInContentYDistance as NSNumber, to: 0.0 as NSNumber,
keyPath: "position.y",
duration: duration,
delay: 0.0,
initialVelocity: 0.0,
damping: springDamping,
additive: true
)
reactionPreviewView.layer.animateSpring(
from: 0.01 as NSNumber,
to: 1.0 as NSNumber,
keyPath: "transform.scale",
duration: duration,
delay: 0.0,
initialVelocity: 0.0,
damping: springDamping,
additive: false
)
}
} else if let contentNode = controllerContentNode {
if case let .controller(source) = self.source, let transitionInfo = source.transitionInfo(), let (sourceView, sourceRect) = transitionInfo.sourceNode() {
let sourcePoint = sourceView.convert(sourceRect.center, to: self.view)
@@ -1493,6 +1551,32 @@ final class ContextControllerExtractedPresentationNode: ASDisplayNode, ContextCo
})
}
)
if let reactionPreviewView = self.reactionPreviewView {
reactionPreviewView.layer.animate(
from: 0.0 as NSNumber,
to: -animationInContentYDistance as NSNumber,
keyPath: "position.y",
timingFunction: timingFunction,
duration: duration,
delay: 0.0,
removeOnCompletion: true,
additive: true,
completion: { _ in
}
)
reactionPreviewView.layer.animate(
from: 1.0 as NSNumber,
to: 0.01 as NSNumber,
keyPath: "transform.scale",
timingFunction: timingFunction,
duration: duration,
delay: 0.0,
removeOnCompletion: false,
additive: false
)
reactionPreviewView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { _ in })
}
}
if let contentNode = controllerContentNode {
if case let .controller(source) = self.source, let transitionInfo = source.transitionInfo(), let (sourceView, sourceRect) = transitionInfo.sourceNode() {