react-native-reanimated 2.3.0-alpha.1 → 2.3.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Common/cpp/LayoutAnimations/LayoutAnimationsProxy.cpp +15 -8
- package/Common/cpp/NativeModules/NativeReanimatedModule.cpp +170 -166
- package/Common/cpp/NativeModules/NativeReanimatedModuleSpec.cpp +36 -34
- package/Common/cpp/Registries/EventHandlerRegistry.cpp +13 -6
- package/Common/cpp/Registries/MapperRegistry.cpp +19 -15
- package/Common/cpp/Registries/WorkletsCache.cpp +19 -9
- package/Common/cpp/SharedItems/FrozenObject.cpp +19 -8
- package/Common/cpp/SharedItems/MutableValue.cpp +38 -25
- package/Common/cpp/SharedItems/MutableValueSetterProxy.cpp +11 -7
- package/Common/cpp/SharedItems/RemoteObject.cpp +9 -5
- package/Common/cpp/SharedItems/ShareableValue.cpp +216 -143
- package/Common/cpp/Tools/JSIStoreValueUser.cpp +36 -24
- package/Common/cpp/Tools/Mapper.cpp +41 -29
- package/Common/cpp/Tools/RuntimeDecorator.cpp +103 -84
- package/Common/cpp/Tools/Scheduler.cpp +14 -6
- package/Common/cpp/Tools/WorkletEventHandler.cpp +1 -1
- package/Common/cpp/headers/LayoutAnimations/LayoutAnimationsProxy.h +12 -11
- package/Common/cpp/headers/NativeModules/NativeReanimatedModule.h +45 -34
- package/Common/cpp/headers/NativeModules/NativeReanimatedModuleSpec.h +28 -16
- package/Common/cpp/headers/Registries/EventHandlerRegistry.h +14 -8
- package/Common/cpp/headers/Registries/MapperRegistry.h +4 -4
- package/Common/cpp/headers/Registries/WorkletsCache.h +9 -7
- package/Common/cpp/headers/SharedItems/FrozenObject.h +15 -11
- package/Common/cpp/headers/SharedItems/HostFunctionHandler.h +6 -4
- package/Common/cpp/headers/SharedItems/MutableValue.h +21 -12
- package/Common/cpp/headers/SharedItems/MutableValueSetterProxy.h +10 -7
- package/Common/cpp/headers/SharedItems/RemoteObject.h +16 -8
- package/Common/cpp/headers/SharedItems/RuntimeManager.h +39 -21
- package/Common/cpp/headers/SharedItems/ShareableValue.h +31 -27
- package/Common/cpp/headers/SharedItems/SharedParent.h +7 -4
- package/Common/cpp/headers/SharedItems/ValueWrapper.h +80 -61
- package/Common/cpp/headers/SpecTools/ErrorHandler.h +17 -19
- package/Common/cpp/headers/Tools/JSIStoreValueUser.h +18 -13
- package/Common/cpp/headers/Tools/Mapper.h +24 -18
- package/Common/cpp/headers/Tools/PlatformDepMethodsHolder.h +12 -7
- package/Common/cpp/headers/Tools/ReanimatedHiddenHeaders.h +7 -7
- package/Common/cpp/headers/Tools/RuntimeDecorator.h +29 -23
- package/Common/cpp/headers/Tools/Scheduler.h +28 -33
- package/Common/cpp/headers/Tools/WorkletEventHandler.h +9 -7
- package/Common/cpp/hidden_headers/Logger.h +14 -14
- package/Common/cpp/hidden_headers/LoggerInterface.h +8 -9
- package/Common/cpp/hidden_headers/SpeedChecker.h +7 -8
- package/README.md +1 -1
- package/RNReanimated.podspec +4 -4
- package/android/build.gradle +80 -3
- package/android/react-native-reanimated-63-hermes.aar +0 -0
- package/android/react-native-reanimated-63-jsc.aar +0 -0
- package/android/react-native-reanimated-64-hermes.aar +0 -0
- package/android/react-native-reanimated-64-jsc.aar +0 -0
- package/android/react-native-reanimated-65-hermes.aar +0 -0
- package/android/react-native-reanimated-65-jsc.aar +0 -0
- package/android/react-native-reanimated-66-hermes.aar +0 -0
- package/android/react-native-reanimated-66-jsc.aar +0 -0
- package/ios/LayoutReanimation/REAAnimationsManager.h +19 -10
- package/ios/LayoutReanimation/REAAnimationsManager.m +195 -200
- package/ios/LayoutReanimation/REASnapshot.h +13 -0
- package/ios/LayoutReanimation/REASnapshot.m +29 -0
- package/ios/LayoutReanimation/REAUIManager.h +16 -0
- package/ios/LayoutReanimation/REAUIManager.mm +348 -0
- package/ios/Nodes/REAAlwaysNode.m +14 -15
- package/ios/Nodes/REABezierNode.m +8 -7
- package/ios/Nodes/REABlockNode.m +1 -1
- package/ios/Nodes/REACallFuncNode.h +0 -1
- package/ios/Nodes/REACallFuncNode.m +10 -8
- package/ios/Nodes/REAClockNodes.m +22 -20
- package/ios/Nodes/REAConcatNode.h +0 -1
- package/ios/Nodes/REAConcatNode.m +2 -2
- package/ios/Nodes/REACondNode.m +7 -5
- package/ios/Nodes/READebugNode.m +5 -4
- package/ios/Nodes/REAEventNode.m +1 -1
- package/ios/Nodes/REAFunctionNode.h +0 -1
- package/ios/Nodes/REAFunctionNode.m +2 -2
- package/ios/Nodes/REAJSCallNode.m +4 -5
- package/ios/Nodes/REANode.h +3 -4
- package/ios/Nodes/REANode.m +9 -11
- package/ios/Nodes/REAOperatorNode.m +68 -67
- package/ios/Nodes/REAParamNode.h +1 -3
- package/ios/Nodes/REAParamNode.m +15 -17
- package/ios/Nodes/REAPropsNode.h +1 -3
- package/ios/Nodes/REAPropsNode.m +19 -22
- package/ios/Nodes/REASetNode.h +0 -1
- package/ios/Nodes/REASetNode.m +7 -5
- package/ios/Nodes/REAStyleNode.h +0 -1
- package/ios/Nodes/REAStyleNode.m +2 -4
- package/ios/Nodes/REATransformNode.h +0 -1
- package/ios/Nodes/REATransformNode.m +3 -5
- package/ios/Nodes/REAValueNode.m +5 -7
- package/ios/REAEventDispatcher.m +3 -3
- package/ios/REAModule.h +0 -2
- package/ios/REAModule.m +29 -40
- package/ios/REANodesManager.h +11 -19
- package/ios/REANodesManager.m +105 -130
- package/ios/REAUtils.h +5 -3
- package/ios/Transitioning/RCTConvert+REATransition.m +45 -29
- package/ios/Transitioning/REAAllTransitions.h +2 -2
- package/ios/Transitioning/REAAllTransitions.m +14 -25
- package/ios/Transitioning/REATransition.h +8 -7
- package/ios/Transitioning/REATransition.m +19 -16
- package/ios/Transitioning/REATransitionAnimation.h +1 -1
- package/ios/Transitioning/REATransitionAnimation.m +2 -3
- package/ios/Transitioning/REATransitionManager.m +3 -3
- package/ios/native/NativeMethods.h +15 -5
- package/ios/native/NativeProxy.h +4 -3
- package/ios/native/NativeProxy.mm +19 -5
- package/ios/native/REAIOSErrorHandler.h +13 -10
- package/ios/native/REAIOSLogger.h +8 -8
- package/ios/native/REAIOSScheduler.h +5 -5
- package/ios/native/REAIOSScheduler.mm +7 -5
- package/ios/native/REAInitializer.h +37 -0
- package/ios/native/REAInitializer.mm +63 -0
- package/ios/native/UIResponder+Reanimated.mm +9 -48
- package/lib/ConfigHelper.js +1 -0
- package/lib/ReanimatedModule.native.js +10 -2
- package/lib/createAnimatedComponent.js +64 -30
- package/lib/reanimated1/core/AnimatedAlways.js +1 -1
- package/lib/reanimated1/core/AnimatedBezier.js +1 -1
- package/lib/reanimated1/core/AnimatedBlock.js +1 -1
- package/lib/reanimated1/core/AnimatedCall.js +1 -1
- package/lib/reanimated1/core/AnimatedCallFunc.js +1 -1
- package/lib/reanimated1/core/AnimatedConcat.js +1 -1
- package/lib/reanimated1/core/AnimatedCond.js +1 -1
- package/lib/reanimated1/core/AnimatedDebug.js +1 -1
- package/lib/reanimated1/core/AnimatedEvent.js +1 -1
- package/lib/reanimated1/core/AnimatedFunction.js +1 -1
- package/lib/reanimated1/core/AnimatedOperator.js +1 -1
- package/lib/reanimated1/core/AnimatedParam.js +1 -1
- package/lib/reanimated1/core/AnimatedProps.js +2 -2
- package/lib/reanimated1/core/AnimatedSet.js +1 -1
- package/lib/reanimated1/core/AnimatedStartClock.js +1 -1
- package/lib/reanimated1/core/AnimatedStopClock.js +1 -1
- package/lib/reanimated1/core/AnimatedStyle.js +1 -1
- package/lib/reanimated1/core/AnimatedTransform.js +1 -1
- package/lib/reanimated1/core/Core.test.js +30 -0
- package/lib/reanimated1/core/InternalAnimatedValue.js +1 -1
- package/lib/reanimated1/core/__mocks__/AnimatedProps.js +1 -1
- package/lib/reanimated1/derived/interpolate.js +1 -1
- package/lib/reanimated2/Colors.js +16 -12
- package/lib/reanimated2/NativeMethods.js +3 -14
- package/lib/reanimated2/{NativeReanimated.native.js → NativeReanimated/NativeReanimated.js} +19 -24
- package/lib/reanimated2/NativeReanimated/index.js +15 -0
- package/lib/reanimated2/PlatformChecker.js +16 -0
- package/lib/reanimated2/PropAdapters.js +14 -4
- package/lib/reanimated2/UpdateProps.js +14 -11
- package/lib/reanimated2/ViewDescriptorsSet.js +73 -0
- package/lib/reanimated2/WorkletEventHandler.js +15 -13
- package/lib/reanimated2/animation/commonTypes.js +1 -0
- package/lib/reanimated2/animation/decay.js +71 -0
- package/lib/reanimated2/animation/delay.js +64 -0
- package/lib/reanimated2/animation/index.js +8 -0
- package/lib/reanimated2/animation/repeat.js +69 -0
- package/lib/reanimated2/animation/sequence.js +72 -0
- package/lib/reanimated2/animation/spring.js +101 -0
- package/lib/reanimated2/animation/styleAnimation.js +166 -0
- package/lib/reanimated2/animation/timing.js +64 -0
- package/lib/reanimated2/animation/util.js +157 -0
- package/lib/reanimated2/commonTypes.js +1 -0
- package/lib/reanimated2/core.js +35 -39
- package/lib/reanimated2/globals.d.ts +47 -1
- package/lib/reanimated2/hook/Hooks.js +9 -0
- package/lib/reanimated2/hook/commonTypes.js +1 -0
- package/lib/reanimated2/hook/index.js +8 -0
- package/lib/reanimated2/hook/useAnimatedGestureHandler.js +50 -0
- package/lib/reanimated2/hook/useAnimatedReaction.js +37 -0
- package/lib/reanimated2/hook/useAnimatedRef.js +25 -0
- package/lib/reanimated2/hook/useAnimatedScrollHandler.js +41 -0
- package/lib/reanimated2/hook/useAnimatedStyle.js +376 -0
- package/lib/reanimated2/hook/useDerivedValue.js +36 -0
- package/lib/reanimated2/hook/useSharedValue.js +17 -0
- package/lib/reanimated2/hook/utils.js +175 -0
- package/lib/reanimated2/index.js +3 -2
- package/lib/reanimated2/interpolation.js +95 -86
- package/lib/reanimated2/jestUtils.js +0 -12
- package/lib/reanimated2/js-reanimated/JSReanimated.js +9 -10
- package/lib/reanimated2/js-reanimated/index.js +57 -1
- package/lib/reanimated2/layoutReanimation/LayoutAnimationRepository.js +58 -0
- package/lib/reanimated2/layoutReanimation/animationBuilder/BaseAnimationBuilder.js +69 -0
- package/lib/reanimated2/layoutReanimation/animationBuilder/ComplexAnimationBuilder.js +125 -0
- package/lib/reanimated2/layoutReanimation/animationBuilder/Keyframe.js +193 -0
- package/lib/reanimated2/layoutReanimation/animationBuilder/commonTypes.js +1 -0
- package/lib/reanimated2/layoutReanimation/animationBuilder/index.js +3 -0
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Bounce.js +325 -207
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Default.js +36 -0
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Fade.js +235 -187
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Flip.js +327 -269
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Lightspeed.js +146 -0
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Pinwheel.js +85 -0
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Roll.js +119 -0
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Rotate.js +289 -0
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Slide.js +159 -121
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Stretch.js +83 -65
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Zoom.js +371 -277
- package/lib/reanimated2/layoutReanimation/defaultAnimations/index.js +4 -0
- package/lib/reanimated2/layoutReanimation/defaultTransitions/CurvedTransition.js +78 -0
- package/lib/reanimated2/layoutReanimation/defaultTransitions/EntryExitTransition.js +128 -0
- package/lib/reanimated2/layoutReanimation/defaultTransitions/FadingTransition.js +37 -0
- package/lib/reanimated2/layoutReanimation/defaultTransitions/JumpingTransition.js +41 -0
- package/lib/reanimated2/layoutReanimation/defaultTransitions/LinearTransition.js +34 -0
- package/lib/reanimated2/layoutReanimation/defaultTransitions/SequencedTransition.js +46 -0
- package/lib/reanimated2/layoutReanimation/defaultTransitions/index.js +6 -0
- package/lib/reanimated2/layoutReanimation/index.js +3 -2
- package/lib/reanimated2/platform-specific/RNRenderer.web.js +2 -0
- package/lib/reanimated2/utils.js +9 -0
- package/libSo/fbjni/jni/arm64-v8a/libfbjni.so +0 -0
- package/libSo/fbjni/jni/armeabi-v7a/libfbjni.so +0 -0
- package/libSo/fbjni/jni/x86/libfbjni.so +0 -0
- package/libSo/fbjni/jni/x86_64/libfbjni.so +0 -0
- package/package.json +21 -10
- package/plugin.js +244 -85
- package/react-native-reanimated.d.ts +531 -453
- package/src/ConfigHelper.js +1 -0
- package/src/ReanimatedModule.native.js +10 -2
- package/src/createAnimatedComponent.js +64 -30
- package/src/reanimated1/core/AnimatedAlways.js +1 -1
- package/src/reanimated1/core/AnimatedBezier.js +1 -1
- package/src/reanimated1/core/AnimatedBlock.js +1 -1
- package/src/reanimated1/core/AnimatedCall.js +1 -1
- package/src/reanimated1/core/AnimatedCallFunc.js +1 -1
- package/src/reanimated1/core/AnimatedConcat.js +1 -1
- package/src/reanimated1/core/AnimatedCond.js +1 -1
- package/src/reanimated1/core/AnimatedDebug.js +1 -1
- package/src/reanimated1/core/AnimatedEvent.js +1 -1
- package/src/reanimated1/core/AnimatedFunction.js +1 -1
- package/src/reanimated1/core/AnimatedOperator.js +1 -1
- package/src/reanimated1/core/AnimatedParam.js +1 -1
- package/src/reanimated1/core/AnimatedProps.js +2 -2
- package/src/reanimated1/core/AnimatedSet.js +1 -1
- package/src/reanimated1/core/AnimatedStartClock.js +1 -1
- package/src/reanimated1/core/AnimatedStopClock.js +1 -1
- package/src/reanimated1/core/AnimatedStyle.js +1 -1
- package/src/reanimated1/core/AnimatedTransform.js +1 -1
- package/src/reanimated1/core/Core.test.js +30 -0
- package/src/reanimated1/core/InternalAnimatedValue.js +1 -1
- package/src/reanimated1/core/__mocks__/AnimatedProps.js +1 -1
- package/src/reanimated1/derived/interpolate.js +1 -1
- package/src/reanimated2/Colors.ts +30 -27
- package/src/reanimated2/Easing.ts +3 -1
- package/src/reanimated2/NativeMethods.ts +26 -16
- package/src/reanimated2/NativeReanimated/NativeReanimated.ts +78 -0
- package/src/reanimated2/NativeReanimated/index.ts +18 -0
- package/src/reanimated2/PlatformChecker.ts +21 -0
- package/src/reanimated2/PropAdapters.ts +52 -34
- package/src/reanimated2/UpdateProps.ts +40 -20
- package/src/reanimated2/ViewDescriptorsSet.ts +108 -0
- package/src/reanimated2/WorkletEventHandler.ts +41 -23
- package/src/reanimated2/animation/commonTypes.ts +48 -0
- package/src/reanimated2/animation/decay.ts +141 -0
- package/src/reanimated2/animation/delay.ts +103 -0
- package/src/reanimated2/animation/index.ts +16 -0
- package/src/reanimated2/animation/repeat.ts +128 -0
- package/src/reanimated2/animation/sequence.ts +110 -0
- package/src/reanimated2/animation/spring.ts +165 -0
- package/src/reanimated2/animation/styleAnimation.ts +253 -0
- package/src/reanimated2/animation/timing.ts +109 -0
- package/src/reanimated2/animation/util.ts +242 -0
- package/src/reanimated2/commonTypes.ts +81 -0
- package/src/reanimated2/core.ts +128 -82
- package/src/reanimated2/globals.d.ts +47 -1
- package/src/reanimated2/hook/Hooks.ts +16 -0
- package/src/reanimated2/hook/commonTypes.ts +12 -0
- package/src/reanimated2/hook/index.ts +25 -0
- package/src/reanimated2/hook/useAnimatedGestureHandler.ts +110 -0
- package/src/reanimated2/hook/useAnimatedReaction.ts +49 -0
- package/src/reanimated2/hook/useAnimatedRef.ts +34 -0
- package/src/reanimated2/hook/useAnimatedScrollHandler.ts +83 -0
- package/src/reanimated2/hook/useAnimatedStyle.ts +538 -0
- package/src/reanimated2/hook/useDerivedValue.ts +48 -0
- package/src/reanimated2/hook/useSharedValue.ts +22 -0
- package/src/reanimated2/hook/utils.ts +259 -0
- package/src/reanimated2/index.ts +3 -2
- package/src/reanimated2/interpolation.ts +170 -101
- package/src/reanimated2/jestUtils.ts +0 -12
- package/src/reanimated2/js-reanimated/JSReanimated.ts +47 -22
- package/src/reanimated2/js-reanimated/Mapper.ts +1 -1
- package/src/reanimated2/js-reanimated/index.ts +71 -0
- package/src/reanimated2/layoutReanimation/LayoutAnimationRepository.tsx +62 -0
- package/src/reanimated2/layoutReanimation/animationBuilder/BaseAnimationBuilder.ts +91 -0
- package/src/reanimated2/layoutReanimation/animationBuilder/ComplexAnimationBuilder.ts +169 -0
- package/src/reanimated2/layoutReanimation/animationBuilder/Keyframe.ts +263 -0
- package/src/reanimated2/layoutReanimation/animationBuilder/commonTypes.ts +78 -0
- package/src/reanimated2/layoutReanimation/animationBuilder/index.ts +16 -0
- package/src/reanimated2/layoutReanimation/defaultAnimations/Bounce.ts +243 -121
- package/src/reanimated2/layoutReanimation/defaultAnimations/Default.ts +43 -0
- package/src/reanimated2/layoutReanimation/defaultAnimations/Fade.ts +95 -53
- package/src/reanimated2/layoutReanimation/defaultAnimations/Flip.ts +114 -64
- package/src/reanimated2/layoutReanimation/defaultAnimations/Lightspeed.ts +179 -0
- package/src/reanimated2/layoutReanimation/defaultAnimations/Pinwheel.ts +93 -0
- package/src/reanimated2/layoutReanimation/defaultAnimations/Roll.ts +132 -0
- package/src/reanimated2/layoutReanimation/defaultAnimations/Rotate.ts +333 -0
- package/src/reanimated2/layoutReanimation/defaultAnimations/Slide.ts +84 -50
- package/src/reanimated2/layoutReanimation/defaultAnimations/Stretch.ts +41 -23
- package/src/reanimated2/layoutReanimation/defaultAnimations/Zoom.ts +234 -154
- package/src/reanimated2/layoutReanimation/defaultAnimations/index.ts +4 -0
- package/src/reanimated2/layoutReanimation/defaultTransitions/CurvedTransition.ts +104 -0
- package/src/reanimated2/layoutReanimation/defaultTransitions/EntryExitTransition.ts +213 -0
- package/src/reanimated2/layoutReanimation/defaultTransitions/FadingTransition.ts +60 -0
- package/src/reanimated2/layoutReanimation/defaultTransitions/JumpingTransition.ts +58 -0
- package/src/reanimated2/layoutReanimation/defaultTransitions/LinearTransition.ts +41 -0
- package/src/reanimated2/layoutReanimation/defaultTransitions/SequencedTransition.ts +78 -0
- package/src/reanimated2/layoutReanimation/defaultTransitions/index.ts +6 -0
- package/src/reanimated2/layoutReanimation/index.ts +3 -2
- package/src/reanimated2/platform-specific/RNRenderer.web.ts +2 -0
- package/src/reanimated2/utils.ts +21 -0
- package/android/react-native-reanimated-62-hermes.aar +0 -0
- package/android/react-native-reanimated-62-jsc.aar +0 -0
- package/ios/LayoutReanimation/REAAnimationRootView.h +0 -12
- package/ios/LayoutReanimation/REAAnimationRootView.m +0 -16
- package/ios/LayoutReanimation/REAAnimationRootViewManager.h +0 -9
- package/ios/LayoutReanimation/REAAnimationRootViewManager.m +0 -49
- package/ios/LayoutReanimation/REAReactBatchObserver.h +0 -20
- package/ios/LayoutReanimation/REAReactBatchObserver.m +0 -125
- package/ios/LayoutReanimation/REASnapshooter.h +0 -19
- package/ios/LayoutReanimation/REASnapshooter.m +0 -64
- package/ios/LayoutReanimation/REAViewTraverser.h +0 -13
- package/ios/LayoutReanimation/REAViewTraverser.m +0 -40
- package/lib/reanimated2/Hooks.js +0 -732
- package/lib/reanimated2/NativeReanimated.js +0 -4
- package/lib/reanimated2/animations.js +0 -713
- package/lib/reanimated2/js-reanimated/index.web.js +0 -20
- package/lib/reanimated2/layoutReanimation/AnimatedRoot.js +0 -55
- package/lib/reanimated2/layoutReanimation/defaultAnimationsBuilder.js +0 -374
- package/src/reanimated2/Hooks.ts +0 -918
- package/src/reanimated2/NativeReanimated.native.ts +0 -61
- package/src/reanimated2/NativeReanimated.ts +0 -5
- package/src/reanimated2/animations.ts +0 -868
- package/src/reanimated2/js-reanimated/index.js +0 -0
- package/src/reanimated2/js-reanimated/index.web.ts +0 -29
- package/src/reanimated2/layoutReanimation/AnimatedRoot.tsx +0 -68
- package/src/reanimated2/layoutReanimation/defaultAnimationsBuilder.ts +0 -440
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { MutableRefObject, useEffect, useRef } from 'react';
|
|
2
|
+
import { AnimationObject } from '../animation';
|
|
3
|
+
import { processColor } from '../Colors';
|
|
4
|
+
import {
|
|
5
|
+
AnimatedStyle,
|
|
6
|
+
NativeEvent,
|
|
7
|
+
NestedObjectValues,
|
|
8
|
+
StyleProps,
|
|
9
|
+
WorkletFunction,
|
|
10
|
+
} from '../commonTypes';
|
|
11
|
+
import { makeRemote } from '../core';
|
|
12
|
+
import { isWeb } from '../PlatformChecker';
|
|
13
|
+
import { colorProps } from '../UpdateProps';
|
|
14
|
+
import WorkletEventHandler from '../WorkletEventHandler';
|
|
15
|
+
import {
|
|
16
|
+
Context,
|
|
17
|
+
ContextWithDependencies,
|
|
18
|
+
DependencyList,
|
|
19
|
+
} from './commonTypes';
|
|
20
|
+
|
|
21
|
+
interface Handler<T, TContext extends Context> extends WorkletFunction {
|
|
22
|
+
(event: T, context: TContext): void;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface Handlers<T, TContext extends Context> {
|
|
26
|
+
[key: string]: Handler<T, TContext> | undefined;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface UseHandlerContext<TContext extends Context> {
|
|
30
|
+
context: TContext;
|
|
31
|
+
doDependenciesDiffer: boolean;
|
|
32
|
+
useWeb: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function useEvent<T extends NativeEvent<T>>(
|
|
36
|
+
handler: (event: T) => void,
|
|
37
|
+
eventNames: string[] = [],
|
|
38
|
+
rebuild = false
|
|
39
|
+
): MutableRefObject<WorkletEventHandler<T> | null> {
|
|
40
|
+
const initRef = useRef<WorkletEventHandler<T> | null>(null);
|
|
41
|
+
if (initRef.current === null) {
|
|
42
|
+
initRef.current = new WorkletEventHandler(handler, eventNames);
|
|
43
|
+
} else if (rebuild) {
|
|
44
|
+
initRef.current.updateWorklet(handler);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
return () => {
|
|
49
|
+
initRef.current = null;
|
|
50
|
+
};
|
|
51
|
+
}, []);
|
|
52
|
+
|
|
53
|
+
return initRef;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function useHandler<T, TContext extends Context>(
|
|
57
|
+
handlers: Handlers<T, TContext>,
|
|
58
|
+
dependencies?: DependencyList
|
|
59
|
+
): UseHandlerContext<TContext> {
|
|
60
|
+
const initRef = useRef<ContextWithDependencies<TContext> | null>(null);
|
|
61
|
+
if (initRef.current === null) {
|
|
62
|
+
initRef.current = {
|
|
63
|
+
context: makeRemote({}),
|
|
64
|
+
savedDependencies: [],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
return () => {
|
|
70
|
+
initRef.current = null;
|
|
71
|
+
};
|
|
72
|
+
}, []);
|
|
73
|
+
|
|
74
|
+
const { context, savedDependencies } = initRef.current;
|
|
75
|
+
|
|
76
|
+
dependencies = buildDependencies(dependencies, handlers);
|
|
77
|
+
|
|
78
|
+
const doDependenciesDiffer = !areDependenciesEqual(
|
|
79
|
+
dependencies,
|
|
80
|
+
savedDependencies
|
|
81
|
+
);
|
|
82
|
+
initRef.current.savedDependencies = dependencies;
|
|
83
|
+
const useWeb = isWeb();
|
|
84
|
+
|
|
85
|
+
return { context, doDependenciesDiffer, useWeb };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// builds one big hash from multiple worklets' hashes
|
|
89
|
+
export function buildWorkletsHash(
|
|
90
|
+
handlers: Record<string, WorkletFunction> | Array<WorkletFunction>
|
|
91
|
+
): string {
|
|
92
|
+
return Object.values(handlers).reduce(
|
|
93
|
+
(acc: string, worklet: WorkletFunction) =>
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
95
|
+
acc + worklet.__workletHash!.toString(),
|
|
96
|
+
''
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// builds dependencies array for gesture handlers
|
|
101
|
+
export function buildDependencies(
|
|
102
|
+
dependencies: DependencyList,
|
|
103
|
+
handlers: Record<string, WorkletFunction | undefined>
|
|
104
|
+
): Array<unknown> {
|
|
105
|
+
const handlersList: WorkletFunction[] = Object.values(handlers).filter(
|
|
106
|
+
(handler) => handler !== undefined
|
|
107
|
+
) as WorkletFunction[];
|
|
108
|
+
if (!dependencies) {
|
|
109
|
+
dependencies = handlersList.map((handler) => {
|
|
110
|
+
return {
|
|
111
|
+
workletHash: handler.__workletHash,
|
|
112
|
+
closure: handler._closure,
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
} else {
|
|
116
|
+
dependencies.push(buildWorkletsHash(handlersList));
|
|
117
|
+
}
|
|
118
|
+
return dependencies;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// this is supposed to work as useEffect comparison
|
|
122
|
+
export function areDependenciesEqual(
|
|
123
|
+
nextDeps: DependencyList,
|
|
124
|
+
prevDeps: DependencyList
|
|
125
|
+
): boolean {
|
|
126
|
+
function is(x: number, y: number) {
|
|
127
|
+
/* eslint-disable no-self-compare */
|
|
128
|
+
return (x === y && (x !== 0 || 1 / x === 1 / y)) || (x !== x && y !== y);
|
|
129
|
+
/* eslint-enable no-self-compare */
|
|
130
|
+
}
|
|
131
|
+
const objectIs: (nextDeps: unknown, prevDeps: unknown) => boolean =
|
|
132
|
+
typeof Object.is === 'function' ? Object.is : is;
|
|
133
|
+
|
|
134
|
+
function areHookInputsEqual(
|
|
135
|
+
nextDeps: DependencyList,
|
|
136
|
+
prevDeps: DependencyList
|
|
137
|
+
): boolean {
|
|
138
|
+
if (!nextDeps || !prevDeps || prevDeps.length !== nextDeps.length) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
for (let i = 0; i < prevDeps.length; ++i) {
|
|
142
|
+
if (!objectIs(nextDeps[i], prevDeps[i])) {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return areHookInputsEqual(nextDeps, prevDeps);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export function hasColorProps(updates: AnimatedStyle): boolean {
|
|
153
|
+
const colorPropsSet = new Set(colorProps);
|
|
154
|
+
for (const key in updates) {
|
|
155
|
+
if (colorPropsSet.has(key)) {
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export function parseColors(updates: AnimatedStyle): void {
|
|
163
|
+
'worklet';
|
|
164
|
+
for (const key in updates) {
|
|
165
|
+
if (colorProps.indexOf(key) !== -1) {
|
|
166
|
+
updates[key] = processColor(updates[key]);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export function canApplyOptimalisation(upadterFn: WorkletFunction): number {
|
|
172
|
+
const FUNCTIONLESS_FLAG = 0b00000001;
|
|
173
|
+
const STATEMENTLESS_FLAG = 0b00000010;
|
|
174
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
175
|
+
const optimalization = upadterFn.__optimalization!;
|
|
176
|
+
return (
|
|
177
|
+
optimalization & FUNCTIONLESS_FLAG && optimalization & STATEMENTLESS_FLAG
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export function isAnimated(prop: NestedObjectValues<AnimationObject>): boolean {
|
|
182
|
+
'worklet';
|
|
183
|
+
const propsToCheck: NestedObjectValues<AnimationObject>[] = [prop];
|
|
184
|
+
while (propsToCheck.length > 0) {
|
|
185
|
+
const currentProp: NestedObjectValues<AnimationObject> = propsToCheck.pop() as NestedObjectValues<AnimationObject>;
|
|
186
|
+
if (Array.isArray(currentProp)) {
|
|
187
|
+
for (const item of currentProp) {
|
|
188
|
+
propsToCheck.push(item);
|
|
189
|
+
}
|
|
190
|
+
} else if (currentProp?.onFrame !== undefined) {
|
|
191
|
+
return true;
|
|
192
|
+
} else if (typeof currentProp === 'object') {
|
|
193
|
+
for (const item of Object.values(currentProp)) {
|
|
194
|
+
propsToCheck.push(item);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// if none of the above, it's not the animated prop, check next one
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// when none of the props were animated return false
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export function styleDiff(
|
|
205
|
+
oldStyle: AnimatedStyle,
|
|
206
|
+
newStyle: AnimatedStyle
|
|
207
|
+
): AnimatedStyle {
|
|
208
|
+
'worklet';
|
|
209
|
+
const diff: AnimatedStyle = {};
|
|
210
|
+
Object.keys(oldStyle).forEach((key) => {
|
|
211
|
+
if (newStyle[key] === undefined) {
|
|
212
|
+
diff[key] = null;
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
Object.keys(newStyle).forEach((key) => {
|
|
216
|
+
const value = newStyle[key];
|
|
217
|
+
const oldValue = oldStyle[key];
|
|
218
|
+
|
|
219
|
+
if (isAnimated(value)) {
|
|
220
|
+
// do nothing
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
if (
|
|
224
|
+
oldValue !== value &&
|
|
225
|
+
JSON.stringify(oldValue) !== JSON.stringify(value)
|
|
226
|
+
) {
|
|
227
|
+
// I'd use deep equal here but that'd take additional work and this was easier
|
|
228
|
+
diff[key] = value;
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
return diff;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export function getStyleWithoutAnimations(newStyle: AnimatedStyle): StyleProps {
|
|
235
|
+
'worklet';
|
|
236
|
+
const diff: StyleProps = {};
|
|
237
|
+
|
|
238
|
+
for (const key in newStyle) {
|
|
239
|
+
const value = newStyle[key];
|
|
240
|
+
if (isAnimated(value)) {
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
diff[key] = value;
|
|
244
|
+
}
|
|
245
|
+
return diff;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export const validateAnimatedStyles = (styles: AnimatedStyle): void => {
|
|
249
|
+
'worklet';
|
|
250
|
+
if (typeof styles !== 'object') {
|
|
251
|
+
throw new Error(
|
|
252
|
+
`useAnimatedStyle has to return an object, found ${typeof styles} instead`
|
|
253
|
+
);
|
|
254
|
+
} else if (Array.isArray(styles)) {
|
|
255
|
+
throw new Error(
|
|
256
|
+
'useAnimatedStyle has to return an object and cannot return static styles combined with dynamic ones. Please do merging where a component receives props.'
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
};
|
package/src/reanimated2/index.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
export * from './core';
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './
|
|
2
|
+
export * from './hook';
|
|
3
|
+
export * from './animation';
|
|
4
4
|
export * from './interpolation';
|
|
5
5
|
export * from './Easing';
|
|
6
6
|
export * from './NativeMethods';
|
|
7
7
|
export * from './Colors';
|
|
8
8
|
export * from './PropAdapters';
|
|
9
9
|
export * from './layoutReanimation';
|
|
10
|
+
export * from './utils';
|
|
@@ -1,147 +1,216 @@
|
|
|
1
|
-
//
|
|
2
|
-
|
|
3
|
-
import interpolateNode, {
|
|
4
|
-
Extrapolate,
|
|
5
|
-
} from '../reanimated1/derived/interpolate';
|
|
1
|
+
// @ts-ignore JS file
|
|
2
|
+
import interpolateNode from '../reanimated1/derived/interpolate';
|
|
6
3
|
|
|
7
|
-
|
|
4
|
+
export enum Extrapolation {
|
|
5
|
+
IDENTITY = 'identity',
|
|
6
|
+
CLAMP = 'clamp',
|
|
7
|
+
EXTEND = 'extend',
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface InterpolatedNode {
|
|
11
|
+
__nodeId: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
interface InterpolationNarrowedInput {
|
|
15
|
+
leftEdgeInput: number;
|
|
16
|
+
rightEdgeInput: number;
|
|
17
|
+
leftEdgeOutput: number;
|
|
18
|
+
rightEdgeOutput: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface ExtrapolationConfig {
|
|
22
|
+
extrapolateLeft?: Extrapolation | string;
|
|
23
|
+
extrapolateRight?: Extrapolation | string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface RequiredExtrapolationConfig {
|
|
27
|
+
extrapolateLeft: Extrapolation;
|
|
28
|
+
extrapolateRight: Extrapolation;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export type ExtrapolationType =
|
|
32
|
+
| ExtrapolationConfig
|
|
33
|
+
| Extrapolation
|
|
34
|
+
| string
|
|
35
|
+
| undefined;
|
|
36
|
+
|
|
37
|
+
function isNode(x: number | InterpolatedNode): x is InterpolatedNode {
|
|
8
38
|
'worklet';
|
|
39
|
+
return (x as InterpolatedNode).__nodeId !== undefined;
|
|
40
|
+
}
|
|
9
41
|
|
|
10
|
-
|
|
42
|
+
function getVal(
|
|
43
|
+
type: Extrapolation,
|
|
44
|
+
coef: number,
|
|
45
|
+
val: number,
|
|
46
|
+
leftEdgeOutput: number,
|
|
47
|
+
rightEdgeOutput: number,
|
|
48
|
+
x: number
|
|
49
|
+
): number {
|
|
50
|
+
'worklet';
|
|
11
51
|
|
|
12
52
|
switch (type) {
|
|
13
|
-
case
|
|
53
|
+
case Extrapolation.IDENTITY:
|
|
14
54
|
return x;
|
|
15
|
-
case
|
|
16
|
-
if (coef * val < coef *
|
|
17
|
-
return
|
|
55
|
+
case Extrapolation.CLAMP:
|
|
56
|
+
if (coef * val < coef * leftEdgeOutput) {
|
|
57
|
+
return leftEdgeOutput;
|
|
18
58
|
}
|
|
19
|
-
return
|
|
20
|
-
case
|
|
59
|
+
return rightEdgeOutput;
|
|
60
|
+
case Extrapolation.EXTEND:
|
|
21
61
|
default:
|
|
22
62
|
return val;
|
|
23
63
|
}
|
|
24
64
|
}
|
|
25
65
|
|
|
26
|
-
function isExtrapolate(value) {
|
|
66
|
+
function isExtrapolate(value: string): value is Extrapolation {
|
|
27
67
|
'worklet';
|
|
28
68
|
|
|
29
69
|
return (
|
|
30
|
-
value ===
|
|
31
|
-
value ===
|
|
32
|
-
value ===
|
|
70
|
+
value === Extrapolation.EXTEND ||
|
|
71
|
+
value === Extrapolation.CLAMP ||
|
|
72
|
+
value === Extrapolation.IDENTITY
|
|
33
73
|
);
|
|
34
74
|
}
|
|
35
75
|
|
|
36
|
-
|
|
76
|
+
// validates extrapolations type
|
|
77
|
+
// if type is correct, converts it to ExtrapolationConfig
|
|
78
|
+
function validateType(type: ExtrapolationType): RequiredExtrapolationConfig {
|
|
37
79
|
'worklet';
|
|
38
|
-
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
extrapolate
|
|
47
|
-
) => `Reanimated: not supported value for "${extrapolate}" \nSupported values: ["extend", "clamp", "identity"]\n Valid example:
|
|
48
|
-
interpolate(value, [inputRange], [outputRange], {
|
|
49
|
-
${extrapolate}: 'clamp',
|
|
50
|
-
})`;
|
|
51
|
-
|
|
52
|
-
type = type ?? 'extend';
|
|
53
|
-
|
|
54
|
-
// eslint-disable-next-line no-prototype-builtins
|
|
55
|
-
const hasExtrapolateLeft = type.hasOwnProperty('extrapolateLeft');
|
|
56
|
-
// eslint-disable-next-line no-prototype-builtins
|
|
57
|
-
const hasExtrapolateRight = type.hasOwnProperty('extrapolateRight');
|
|
58
|
-
|
|
59
|
-
if (
|
|
60
|
-
typeof type === 'object' &&
|
|
61
|
-
((Object.keys(type).length === 2 &&
|
|
62
|
-
!(hasExtrapolateLeft && hasExtrapolateRight)) ||
|
|
63
|
-
(Object.keys(type).length === 1 &&
|
|
64
|
-
!(hasExtrapolateLeft || hasExtrapolateRight)) ||
|
|
65
|
-
Object.keys(type).length > 2)
|
|
66
|
-
) {
|
|
67
|
-
throw new Error(EXTRAPOLATE_ERROR_MSG);
|
|
80
|
+
// initialize extrapolationConfig with default extrapolation
|
|
81
|
+
const extrapolationConfig: RequiredExtrapolationConfig = {
|
|
82
|
+
extrapolateLeft: Extrapolation.EXTEND,
|
|
83
|
+
extrapolateRight: Extrapolation.EXTEND,
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
if (!type) {
|
|
87
|
+
return extrapolationConfig;
|
|
68
88
|
}
|
|
69
89
|
|
|
70
|
-
if (typeof type === '
|
|
71
|
-
if (
|
|
72
|
-
throw new Error(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
throw new Error(EXTRAPOLATE_ERROR('extrapolateRight'));
|
|
90
|
+
if (typeof type === 'string') {
|
|
91
|
+
if (!isExtrapolate(type)) {
|
|
92
|
+
throw new Error(
|
|
93
|
+
`Reanimated: not supported value for "interpolate" \nSupported values: ["extend", "clamp", "identity", Extrapolatation.CLAMP, Extrapolatation.EXTEND, Extrapolatation.IDENTITY]\n Valid example:
|
|
94
|
+
interpolate(value, [inputRange], [outputRange], "clamp")`
|
|
95
|
+
);
|
|
77
96
|
}
|
|
97
|
+
extrapolationConfig.extrapolateLeft = type;
|
|
98
|
+
extrapolationConfig.extrapolateRight = type;
|
|
99
|
+
return extrapolationConfig;
|
|
78
100
|
}
|
|
79
101
|
|
|
80
|
-
|
|
102
|
+
// otherwise type is extrapolation config object
|
|
103
|
+
if (
|
|
104
|
+
(type.extrapolateLeft && !isExtrapolate(type.extrapolateLeft)) ||
|
|
105
|
+
(type.extrapolateRight && !isExtrapolate(type.extrapolateRight))
|
|
106
|
+
) {
|
|
81
107
|
throw new Error(
|
|
82
|
-
`Reanimated: not supported value for "interpolate" \nSupported values: ["extend", "clamp", "identity"]\n Valid example:
|
|
83
|
-
|
|
108
|
+
`Reanimated: not supported value for "interpolate" \nSupported values: ["extend", "clamp", "identity", Extrapolatation.CLAMP, Extrapolatation.EXTEND, Extrapolatation.IDENTITY]\n Valid example:
|
|
109
|
+
interpolate(value, [inputRange], [outputRange], {
|
|
110
|
+
extrapolateLeft: Extrapolation.CLAMP,
|
|
111
|
+
extrapolateRight: Extrapolation.IDENTITY
|
|
112
|
+
}})`
|
|
84
113
|
);
|
|
85
114
|
}
|
|
115
|
+
|
|
116
|
+
Object.assign(extrapolationConfig, type);
|
|
117
|
+
return extrapolationConfig;
|
|
86
118
|
}
|
|
87
119
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
120
|
+
function internalInterpolate(
|
|
121
|
+
x: number,
|
|
122
|
+
narrowedInput: InterpolationNarrowedInput,
|
|
123
|
+
extrapolationConfig: RequiredExtrapolationConfig
|
|
124
|
+
) {
|
|
91
125
|
'worklet';
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
126
|
+
const {
|
|
127
|
+
leftEdgeInput,
|
|
128
|
+
rightEdgeInput,
|
|
129
|
+
leftEdgeOutput,
|
|
130
|
+
rightEdgeOutput,
|
|
131
|
+
} = narrowedInput;
|
|
132
|
+
if (rightEdgeInput - leftEdgeInput === 0) return leftEdgeOutput;
|
|
133
|
+
const progress = (x - leftEdgeInput) / (rightEdgeInput - leftEdgeInput);
|
|
134
|
+
const val = leftEdgeOutput + progress * (rightEdgeOutput - leftEdgeOutput);
|
|
135
|
+
const coef = rightEdgeOutput >= leftEdgeOutput ? 1 : -1;
|
|
136
|
+
|
|
137
|
+
if (coef * val < coef * leftEdgeOutput) {
|
|
138
|
+
return getVal(
|
|
139
|
+
extrapolationConfig.extrapolateLeft,
|
|
140
|
+
coef,
|
|
141
|
+
val,
|
|
142
|
+
leftEdgeOutput,
|
|
143
|
+
rightEdgeOutput,
|
|
144
|
+
x
|
|
145
|
+
);
|
|
146
|
+
} else if (coef * val > coef * rightEdgeOutput) {
|
|
147
|
+
return getVal(
|
|
148
|
+
extrapolationConfig.extrapolateRight,
|
|
149
|
+
coef,
|
|
150
|
+
val,
|
|
151
|
+
leftEdgeOutput,
|
|
152
|
+
rightEdgeOutput,
|
|
153
|
+
x
|
|
154
|
+
);
|
|
111
155
|
}
|
|
112
156
|
|
|
113
157
|
return val;
|
|
114
158
|
}
|
|
115
159
|
|
|
116
|
-
|
|
160
|
+
// TODO: support default values in worklets:
|
|
161
|
+
// e.g. function interpolate(x, input, output, type = Extrapolatation.CLAMP)
|
|
162
|
+
export function interpolate(
|
|
163
|
+
x: number | InterpolatedNode,
|
|
164
|
+
input: readonly number[],
|
|
165
|
+
output: readonly number[],
|
|
166
|
+
type?: ExtrapolationType
|
|
167
|
+
): number {
|
|
117
168
|
'worklet';
|
|
118
|
-
if (
|
|
169
|
+
if (input.length < 2 || output.length < 2) {
|
|
170
|
+
throw Error(
|
|
171
|
+
'Interpolation input and output should contain at least two values.'
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const extrapolationConfig = validateType(type);
|
|
176
|
+
|
|
177
|
+
if (isNode(x)) {
|
|
119
178
|
console.warn(
|
|
120
179
|
`interpolate() was renamed to interpolateNode() in Reanimated 2. Please use interpolateNode() instead`
|
|
121
180
|
);
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
181
|
+
return interpolateNode(x, {
|
|
182
|
+
inputRange: input,
|
|
183
|
+
outputRange: output,
|
|
184
|
+
extrapolateLeft: extrapolationConfig.extrapolateLeft,
|
|
185
|
+
extrapolateRight: extrapolationConfig.extrapolateRight,
|
|
186
|
+
});
|
|
125
187
|
}
|
|
126
188
|
|
|
127
189
|
const length = input.length;
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
190
|
+
const narrowedInput: InterpolationNarrowedInput = {
|
|
191
|
+
leftEdgeInput: input[0],
|
|
192
|
+
rightEdgeInput: input[1],
|
|
193
|
+
leftEdgeOutput: output[0],
|
|
194
|
+
rightEdgeOutput: output[1],
|
|
195
|
+
};
|
|
196
|
+
if (length > 2) {
|
|
197
|
+
if (x > input[length - 1]) {
|
|
198
|
+
narrowedInput.leftEdgeInput = input[length - 2];
|
|
199
|
+
narrowedInput.rightEdgeInput = input[length - 1];
|
|
200
|
+
narrowedInput.leftEdgeOutput = output[length - 2];
|
|
201
|
+
narrowedInput.rightEdgeOutput = output[length - 1];
|
|
202
|
+
} else {
|
|
203
|
+
for (let i = 1; i < length; ++i) {
|
|
204
|
+
if (x <= input[i]) {
|
|
205
|
+
narrowedInput.leftEdgeInput = input[i - 1];
|
|
206
|
+
narrowedInput.rightEdgeInput = input[i];
|
|
207
|
+
narrowedInput.leftEdgeOutput = output[i - 1];
|
|
208
|
+
narrowedInput.rightEdgeOutput = output[i];
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
143
211
|
}
|
|
144
212
|
}
|
|
145
213
|
}
|
|
146
|
-
|
|
214
|
+
|
|
215
|
+
return internalInterpolate(x, narrowedInput, extrapolationConfig);
|
|
147
216
|
}
|
|
@@ -186,18 +186,6 @@ export const setUpTests = (userConfig = {}) => {
|
|
|
186
186
|
return compareStyle(received, expectedStyle, config);
|
|
187
187
|
},
|
|
188
188
|
});
|
|
189
|
-
|
|
190
|
-
jest.mock('./js-reanimated', () => require('./js-reanimated/index.web'));
|
|
191
|
-
jest.mock('../ReanimatedModule', () => require('../ReanimatedModuleCompat'));
|
|
192
|
-
jest.mock('./NativeReanimated', () => {
|
|
193
|
-
let module;
|
|
194
|
-
try {
|
|
195
|
-
module = require('./NativeReanimated.js');
|
|
196
|
-
} catch {
|
|
197
|
-
module = require('./NativeReanimated.ts');
|
|
198
|
-
}
|
|
199
|
-
return module.default;
|
|
200
|
-
});
|
|
201
189
|
};
|
|
202
190
|
|
|
203
191
|
export const getAnimatedStyle = (received) => {
|