mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
5580a22dad
Summary: changelog: [internal] `parentNodes` may be nil in case `DiffClampAnimatedNode` was not setup correctly. In this case, let's just noop and warn rather than throw redbox. This is not necessary but makes the code safer in world where native animated is invoked by new and old architecture at the same time (pre-bridgeless). Reviewed By: yungsters Differential Revision: D40381724 fbshipit-source-id: 6252f05951079649b810902559bfec9dd4f957d9
65 lines
1.5 KiB
Objective-C
65 lines
1.5 KiB
Objective-C
/*
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#import <React/RCTDiffClampAnimatedNode.h>
|
|
|
|
#import <React/RCTLog.h>
|
|
|
|
@implementation RCTDiffClampAnimatedNode {
|
|
NSNumber *_inputNodeTag;
|
|
CGFloat _min;
|
|
CGFloat _max;
|
|
CGFloat _lastValue;
|
|
}
|
|
|
|
- (instancetype)initWithTag:(NSNumber *)tag config:(NSDictionary<NSString *, id> *)config
|
|
{
|
|
if (self = [super initWithTag:tag config:config]) {
|
|
_inputNodeTag = config[@"input"];
|
|
_min = [config[@"min"] floatValue];
|
|
_max = [config[@"max"] floatValue];
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)onAttachedToNode:(RCTAnimatedNode *)parent
|
|
{
|
|
[super onAttachedToNode:parent];
|
|
|
|
self.value = _lastValue = [self inputNodeValue];
|
|
}
|
|
|
|
- (void)performUpdate
|
|
{
|
|
[super performUpdate];
|
|
|
|
CGFloat value = [self inputNodeValue];
|
|
|
|
CGFloat diff = value - _lastValue;
|
|
_lastValue = value;
|
|
self.value = MIN(MAX(self.value + diff, _min), _max);
|
|
}
|
|
|
|
- (CGFloat)inputNodeValue
|
|
{
|
|
if (self.parentNodes == nil) {
|
|
RCTLogWarn(@"Animated.DiffClamp node has not been fully initialised.");
|
|
return 0;
|
|
}
|
|
|
|
RCTValueAnimatedNode *inputNode = (RCTValueAnimatedNode *)[self.parentNodes objectForKey:_inputNodeTag];
|
|
if (![inputNode isKindOfClass:[RCTValueAnimatedNode class]]) {
|
|
RCTLogError(@"Illegal node ID set as an input for Animated.DiffClamp node");
|
|
return 0;
|
|
}
|
|
|
|
return inputNode.value;
|
|
}
|
|
|
|
@end
|