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
package/lib/reanimated2/Hooks.js
DELETED
|
@@ -1,732 +0,0 @@
|
|
|
1
|
-
/* global _frameTimestamp */
|
|
2
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
3
|
-
// @ts-nocheck
|
|
4
|
-
import { useEffect, useRef, useCallback } from 'react';
|
|
5
|
-
import WorkletEventHandler from './WorkletEventHandler';
|
|
6
|
-
import { startMapper, stopMapper, makeMutable, makeRemote, requestFrame, getTimestamp, } from './core';
|
|
7
|
-
import updateProps, { updatePropsJestWrapper, colorProps } from './UpdateProps';
|
|
8
|
-
import { initialUpdaterRun, cancelAnimation } from './animations';
|
|
9
|
-
import { getTag } from './NativeMethods';
|
|
10
|
-
import NativeReanimated from './NativeReanimated';
|
|
11
|
-
import { Platform } from 'react-native';
|
|
12
|
-
import { processColor } from './Colors';
|
|
13
|
-
export function useSharedValue(init) {
|
|
14
|
-
const ref = useRef(null);
|
|
15
|
-
if (ref.current === null) {
|
|
16
|
-
ref.current = makeMutable(init);
|
|
17
|
-
}
|
|
18
|
-
useEffect(() => {
|
|
19
|
-
return () => {
|
|
20
|
-
cancelAnimation(ref.current);
|
|
21
|
-
};
|
|
22
|
-
}, []);
|
|
23
|
-
return ref.current;
|
|
24
|
-
}
|
|
25
|
-
export function useEvent(handler, eventNames = [], rebuild = false) {
|
|
26
|
-
const initRef = useRef(null);
|
|
27
|
-
if (initRef.current === null) {
|
|
28
|
-
initRef.current = new WorkletEventHandler(handler, eventNames);
|
|
29
|
-
}
|
|
30
|
-
else if (rebuild) {
|
|
31
|
-
initRef.current.updateWorklet(handler);
|
|
32
|
-
}
|
|
33
|
-
useEffect(() => {
|
|
34
|
-
return () => {
|
|
35
|
-
initRef.current = null;
|
|
36
|
-
};
|
|
37
|
-
}, []);
|
|
38
|
-
return initRef;
|
|
39
|
-
}
|
|
40
|
-
function prepareAnimation(animatedProp, lastAnimation, lastValue) {
|
|
41
|
-
'worklet';
|
|
42
|
-
if (Array.isArray(animatedProp)) {
|
|
43
|
-
animatedProp.forEach((prop, index) => prepareAnimation(prop, lastAnimation && lastAnimation[index], lastValue && lastValue[index]));
|
|
44
|
-
return animatedProp;
|
|
45
|
-
}
|
|
46
|
-
if (typeof animatedProp === 'object' && animatedProp.onFrame) {
|
|
47
|
-
const animation = animatedProp;
|
|
48
|
-
let value = animation.current;
|
|
49
|
-
if (lastValue !== undefined) {
|
|
50
|
-
if (typeof lastValue === 'object') {
|
|
51
|
-
if (lastValue.value !== undefined) {
|
|
52
|
-
// previously it was a shared value
|
|
53
|
-
value = lastValue.value;
|
|
54
|
-
}
|
|
55
|
-
else if (lastValue.onFrame !== undefined) {
|
|
56
|
-
if ((lastAnimation === null || lastAnimation === void 0 ? void 0 : lastAnimation.current) !== undefined) {
|
|
57
|
-
// it was an animation before, copy its state
|
|
58
|
-
value = lastAnimation.current;
|
|
59
|
-
}
|
|
60
|
-
else if ((lastValue === null || lastValue === void 0 ? void 0 : lastValue.current) !== undefined) {
|
|
61
|
-
// it was initialized
|
|
62
|
-
value = lastValue.current;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
// previously it was a plain value, just set it as starting point
|
|
68
|
-
value = lastValue;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
animation.callStart = (timestamp) => {
|
|
72
|
-
animation.onStart(animation, value, timestamp, lastAnimation);
|
|
73
|
-
};
|
|
74
|
-
animation.callStart(getTimestamp());
|
|
75
|
-
animation.callStart = null;
|
|
76
|
-
}
|
|
77
|
-
else if (typeof animatedProp === 'object') {
|
|
78
|
-
// it is an object
|
|
79
|
-
Object.keys(animatedProp).forEach((key) => prepareAnimation(animatedProp[key], lastAnimation && lastAnimation[key], lastValue && lastValue[key]));
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
function runAnimations(animation, timestamp, key, result, animationsActive) {
|
|
83
|
-
'worklet';
|
|
84
|
-
if (!animationsActive.value) {
|
|
85
|
-
return true;
|
|
86
|
-
}
|
|
87
|
-
if (Array.isArray(animation)) {
|
|
88
|
-
result[key] = [];
|
|
89
|
-
let allFinished = true;
|
|
90
|
-
animation.forEach((entry, index) => {
|
|
91
|
-
if (!runAnimations(entry, timestamp, index, result[key], animationsActive)) {
|
|
92
|
-
allFinished = false;
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
return allFinished;
|
|
96
|
-
}
|
|
97
|
-
else if (typeof animation === 'object' && animation.onFrame) {
|
|
98
|
-
let finished = true;
|
|
99
|
-
if (!animation.finished) {
|
|
100
|
-
if (animation.callStart) {
|
|
101
|
-
animation.callStart(timestamp);
|
|
102
|
-
animation.callStart = null;
|
|
103
|
-
}
|
|
104
|
-
finished = animation.onFrame(animation, timestamp);
|
|
105
|
-
animation.timestamp = timestamp;
|
|
106
|
-
if (finished) {
|
|
107
|
-
animation.finished = true;
|
|
108
|
-
animation.callback && animation.callback(true /* finished */);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
result[key] = animation.current;
|
|
112
|
-
return finished;
|
|
113
|
-
}
|
|
114
|
-
else if (typeof animation === 'object') {
|
|
115
|
-
result[key] = {};
|
|
116
|
-
let allFinished = true;
|
|
117
|
-
Object.keys(animation).forEach((k) => {
|
|
118
|
-
if (!runAnimations(animation[k], timestamp, k, result[key], animationsActive)) {
|
|
119
|
-
allFinished = false;
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
return allFinished;
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
result[key] = animation;
|
|
126
|
-
return true;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
function isAnimated(prop) {
|
|
130
|
-
'worklet';
|
|
131
|
-
if (Array.isArray(prop)) {
|
|
132
|
-
for (const item of prop) {
|
|
133
|
-
for (const key in item) {
|
|
134
|
-
if (item[key].onFrame !== undefined) {
|
|
135
|
-
return true;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
return false;
|
|
140
|
-
}
|
|
141
|
-
return (prop === null || prop === void 0 ? void 0 : prop.onFrame) !== undefined;
|
|
142
|
-
}
|
|
143
|
-
function styleDiff(oldStyle, newStyle) {
|
|
144
|
-
'worklet';
|
|
145
|
-
const diff = {};
|
|
146
|
-
Object.keys(oldStyle).forEach((key) => {
|
|
147
|
-
if (newStyle[key] === undefined) {
|
|
148
|
-
diff[key] = null;
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
Object.keys(newStyle).forEach((key) => {
|
|
152
|
-
const value = newStyle[key];
|
|
153
|
-
const oldValue = oldStyle[key];
|
|
154
|
-
if (isAnimated(value)) {
|
|
155
|
-
// do nothing
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
if (oldValue !== value &&
|
|
159
|
-
JSON.stringify(oldValue) !== JSON.stringify(value)) {
|
|
160
|
-
// I'd use deep equal here but that'd take additional work and this was easier
|
|
161
|
-
diff[key] = value;
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
return diff;
|
|
165
|
-
}
|
|
166
|
-
function getStyleWithoutAnimations(newStyle) {
|
|
167
|
-
'worklet';
|
|
168
|
-
const diff = {};
|
|
169
|
-
for (const key in newStyle) {
|
|
170
|
-
const value = newStyle[key];
|
|
171
|
-
if (isAnimated(value)) {
|
|
172
|
-
continue;
|
|
173
|
-
}
|
|
174
|
-
diff[key] = value;
|
|
175
|
-
}
|
|
176
|
-
return diff;
|
|
177
|
-
}
|
|
178
|
-
const validateAnimatedStyles = (styles) => {
|
|
179
|
-
'worklet';
|
|
180
|
-
if (typeof styles !== 'object') {
|
|
181
|
-
throw new Error(`useAnimatedStyle has to return an object, found ${typeof styles} instead`);
|
|
182
|
-
}
|
|
183
|
-
else if (Array.isArray(styles)) {
|
|
184
|
-
throw new Error('useAnimatedStyle has to return an object and cannot return static styles combined with dynamic ones. Please do merging where a component receives props.');
|
|
185
|
-
}
|
|
186
|
-
};
|
|
187
|
-
function styleUpdater(viewDescriptor, updater, state, maybeViewRef, animationsActive) {
|
|
188
|
-
'worklet';
|
|
189
|
-
const animations = state.animations || {};
|
|
190
|
-
const newValues = updater() || {};
|
|
191
|
-
const oldValues = state.last;
|
|
192
|
-
let hasAnimations = false;
|
|
193
|
-
for (const key in newValues) {
|
|
194
|
-
const value = newValues[key];
|
|
195
|
-
if (isAnimated(value)) {
|
|
196
|
-
prepareAnimation(value, animations[key], oldValues[key]);
|
|
197
|
-
animations[key] = value;
|
|
198
|
-
hasAnimations = true;
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
delete animations[key];
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
if (hasAnimations) {
|
|
205
|
-
const frame = (timestamp) => {
|
|
206
|
-
const { animations, last, isAnimationCancelled } = state;
|
|
207
|
-
if (isAnimationCancelled) {
|
|
208
|
-
state.isAnimationRunning = false;
|
|
209
|
-
return;
|
|
210
|
-
}
|
|
211
|
-
const updates = {};
|
|
212
|
-
let allFinished = true;
|
|
213
|
-
for (const propName in animations) {
|
|
214
|
-
const finished = runAnimations(animations[propName], timestamp, propName, updates, animationsActive);
|
|
215
|
-
if (finished) {
|
|
216
|
-
last[propName] = updates[propName];
|
|
217
|
-
delete animations[propName];
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
220
|
-
allFinished = false;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
if (updates) {
|
|
224
|
-
updateProps(viewDescriptor, updates, maybeViewRef);
|
|
225
|
-
}
|
|
226
|
-
if (!allFinished) {
|
|
227
|
-
requestFrame(frame);
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
state.isAnimationRunning = false;
|
|
231
|
-
}
|
|
232
|
-
};
|
|
233
|
-
state.animations = animations;
|
|
234
|
-
if (!state.isAnimationRunning) {
|
|
235
|
-
state.isAnimationCancelled = false;
|
|
236
|
-
state.isAnimationRunning = true;
|
|
237
|
-
if (_frameTimestamp) {
|
|
238
|
-
frame(_frameTimestamp);
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
requestFrame(frame);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
state.last = Object.assign({}, oldValues, newValues);
|
|
245
|
-
const style = getStyleWithoutAnimations(oldValues, newValues);
|
|
246
|
-
if (style) {
|
|
247
|
-
updateProps(viewDescriptor, style, maybeViewRef);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
else {
|
|
251
|
-
state.isAnimationCancelled = true;
|
|
252
|
-
state.animations = {};
|
|
253
|
-
updateProps(viewDescriptor, newValues, maybeViewRef);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
function jestStyleUpdater(viewDescriptor, updater, state, maybeViewRef, animationsActive, animatedStyle, adapters = []) {
|
|
257
|
-
'worklet';
|
|
258
|
-
const animations = state.animations || {};
|
|
259
|
-
const newValues = updater() || {};
|
|
260
|
-
const oldValues = state.last;
|
|
261
|
-
// extract animated props
|
|
262
|
-
let hasAnimations = false;
|
|
263
|
-
Object.keys(animations).forEach((key) => {
|
|
264
|
-
const value = newValues[key];
|
|
265
|
-
if (!isAnimated(value)) {
|
|
266
|
-
delete animations[key];
|
|
267
|
-
}
|
|
268
|
-
});
|
|
269
|
-
Object.keys(newValues).forEach((key) => {
|
|
270
|
-
const value = newValues[key];
|
|
271
|
-
if (isAnimated(value)) {
|
|
272
|
-
prepareAnimation(value, animations[key], oldValues[key]);
|
|
273
|
-
animations[key] = value;
|
|
274
|
-
hasAnimations = true;
|
|
275
|
-
}
|
|
276
|
-
});
|
|
277
|
-
function frame(timestamp) {
|
|
278
|
-
const { animations, last, isAnimationCancelled } = state;
|
|
279
|
-
if (isAnimationCancelled) {
|
|
280
|
-
state.isAnimationRunning = false;
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
const updates = {};
|
|
284
|
-
let allFinished = true;
|
|
285
|
-
Object.keys(animations).forEach((propName) => {
|
|
286
|
-
const finished = runAnimations(animations[propName], timestamp, propName, updates, animationsActive);
|
|
287
|
-
if (finished) {
|
|
288
|
-
last[propName] = updates[propName];
|
|
289
|
-
delete animations[propName];
|
|
290
|
-
}
|
|
291
|
-
else {
|
|
292
|
-
allFinished = false;
|
|
293
|
-
}
|
|
294
|
-
});
|
|
295
|
-
if (Object.keys(updates).length) {
|
|
296
|
-
updatePropsJestWrapper(viewDescriptor, updates, maybeViewRef, animatedStyle, adapters);
|
|
297
|
-
}
|
|
298
|
-
if (!allFinished) {
|
|
299
|
-
requestFrame(frame);
|
|
300
|
-
}
|
|
301
|
-
else {
|
|
302
|
-
state.isAnimationRunning = false;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
if (hasAnimations) {
|
|
306
|
-
state.animations = animations;
|
|
307
|
-
if (!state.isAnimationRunning) {
|
|
308
|
-
state.isAnimationCancelled = false;
|
|
309
|
-
state.isAnimationRunning = true;
|
|
310
|
-
if (_frameTimestamp) {
|
|
311
|
-
frame(_frameTimestamp);
|
|
312
|
-
}
|
|
313
|
-
else {
|
|
314
|
-
requestFrame(frame);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
else {
|
|
319
|
-
state.isAnimationCancelled = true;
|
|
320
|
-
state.animations = {};
|
|
321
|
-
}
|
|
322
|
-
// calculate diff
|
|
323
|
-
const diff = styleDiff(oldValues, newValues);
|
|
324
|
-
state.last = Object.assign({}, oldValues, newValues);
|
|
325
|
-
if (Object.keys(diff).length !== 0) {
|
|
326
|
-
updatePropsJestWrapper(viewDescriptor, diff, maybeViewRef, animatedStyle, adapters);
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
const colorPropsSet = new Set(colorProps);
|
|
330
|
-
const hasColorProps = (updates) => {
|
|
331
|
-
for (const key in updates) {
|
|
332
|
-
if (colorPropsSet.has(key)) {
|
|
333
|
-
return true;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
return false;
|
|
337
|
-
};
|
|
338
|
-
const parseColors = (updates) => {
|
|
339
|
-
'worklet';
|
|
340
|
-
for (const key in updates) {
|
|
341
|
-
if (colorProps.indexOf(key) !== -1) {
|
|
342
|
-
updates[key] = processColor(updates[key]);
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
};
|
|
346
|
-
const canApplyOptimalisation = (upadterFn) => {
|
|
347
|
-
const FUNCTIONLESS_FLAG = 0b00000001;
|
|
348
|
-
const STATEMENTLESS_FLAG = 0b00000010;
|
|
349
|
-
const optimalization = upadterFn.__optimalization;
|
|
350
|
-
return (optimalization & FUNCTIONLESS_FLAG && optimalization & STATEMENTLESS_FLAG);
|
|
351
|
-
};
|
|
352
|
-
export function useAnimatedStyle(updater, dependencies, adapters) {
|
|
353
|
-
const viewDescriptor = useSharedValue({ tag: -1, name: null }, false);
|
|
354
|
-
const initRef = useRef(null);
|
|
355
|
-
const inputs = Object.values(updater._closure);
|
|
356
|
-
const viewRef = useRef(null);
|
|
357
|
-
adapters = !adapters || Array.isArray(adapters) ? adapters : [adapters];
|
|
358
|
-
const adaptersHash = adapters ? buildWorkletsHash(adapters) : null;
|
|
359
|
-
const animationsActive = useSharedValue(true);
|
|
360
|
-
let animatedStyle;
|
|
361
|
-
if (process.env.JEST_WORKER_ID) {
|
|
362
|
-
animatedStyle = useRef({});
|
|
363
|
-
}
|
|
364
|
-
// build dependencies
|
|
365
|
-
if (!dependencies) {
|
|
366
|
-
dependencies = [...inputs, updater.__workletHash];
|
|
367
|
-
}
|
|
368
|
-
else {
|
|
369
|
-
dependencies.push(updater.__workletHash);
|
|
370
|
-
}
|
|
371
|
-
adaptersHash && dependencies.push(adaptersHash);
|
|
372
|
-
if (initRef.current === null) {
|
|
373
|
-
const initial = initialUpdaterRun(updater);
|
|
374
|
-
validateAnimatedStyles(initial);
|
|
375
|
-
initRef.current = {
|
|
376
|
-
initial,
|
|
377
|
-
remoteState: makeRemote({ last: initial }),
|
|
378
|
-
};
|
|
379
|
-
}
|
|
380
|
-
const { remoteState, initial } = initRef.current;
|
|
381
|
-
const maybeViewRef = NativeReanimated.native ? undefined : viewRef;
|
|
382
|
-
useEffect(() => {
|
|
383
|
-
let fun;
|
|
384
|
-
let upadterFn = updater;
|
|
385
|
-
let optimalization = updater.__optimalization;
|
|
386
|
-
if (adapters) {
|
|
387
|
-
upadterFn = () => {
|
|
388
|
-
'worklet';
|
|
389
|
-
const newValues = updater();
|
|
390
|
-
adapters.forEach((adapter) => {
|
|
391
|
-
adapter(newValues);
|
|
392
|
-
});
|
|
393
|
-
return newValues;
|
|
394
|
-
};
|
|
395
|
-
}
|
|
396
|
-
if (canApplyOptimalisation(upadterFn) && Platform.OS !== 'web') {
|
|
397
|
-
if (hasColorProps(upadterFn())) {
|
|
398
|
-
upadterFn = () => {
|
|
399
|
-
'worklet';
|
|
400
|
-
const style = upadterFn();
|
|
401
|
-
parseColors(style);
|
|
402
|
-
return style;
|
|
403
|
-
};
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
else if (Platform.OS !== 'web') {
|
|
407
|
-
optimalization = 0;
|
|
408
|
-
upadterFn = () => {
|
|
409
|
-
'worklet';
|
|
410
|
-
const style = upadterFn();
|
|
411
|
-
parseColors(style);
|
|
412
|
-
return style;
|
|
413
|
-
};
|
|
414
|
-
}
|
|
415
|
-
if (typeof updater.__optimalization !== undefined) {
|
|
416
|
-
upadterFn.__optimalization = optimalization;
|
|
417
|
-
}
|
|
418
|
-
if (process.env.JEST_WORKER_ID) {
|
|
419
|
-
fun = () => {
|
|
420
|
-
'worklet';
|
|
421
|
-
jestStyleUpdater(viewDescriptor, updater, remoteState, maybeViewRef, animationsActive, animatedStyle, adapters);
|
|
422
|
-
};
|
|
423
|
-
}
|
|
424
|
-
else {
|
|
425
|
-
fun = () => {
|
|
426
|
-
'worklet';
|
|
427
|
-
styleUpdater(viewDescriptor, upadterFn, remoteState, maybeViewRef, animationsActive);
|
|
428
|
-
};
|
|
429
|
-
}
|
|
430
|
-
const mapperId = startMapper(fun, inputs, [], upadterFn, viewDescriptor.value.tag, viewDescriptor.value.name || 'RCTView');
|
|
431
|
-
return () => {
|
|
432
|
-
stopMapper(mapperId);
|
|
433
|
-
};
|
|
434
|
-
}, dependencies);
|
|
435
|
-
useEffect(() => {
|
|
436
|
-
animationsActive.value = true;
|
|
437
|
-
return () => {
|
|
438
|
-
initRef.current = null;
|
|
439
|
-
viewRef.current = null;
|
|
440
|
-
animationsActive.value = false;
|
|
441
|
-
};
|
|
442
|
-
}, []);
|
|
443
|
-
// check for invalid usage of shared values in returned object
|
|
444
|
-
let wrongKey;
|
|
445
|
-
const isObjectValid = (element, key) => {
|
|
446
|
-
const result = typeof element === 'object' && element.value !== undefined;
|
|
447
|
-
if (result) {
|
|
448
|
-
wrongKey = key;
|
|
449
|
-
}
|
|
450
|
-
return !result;
|
|
451
|
-
};
|
|
452
|
-
const isError = Object.keys(initial).some((key) => {
|
|
453
|
-
const element = initial[key];
|
|
454
|
-
let result = false;
|
|
455
|
-
// a case for transform that has a format of an array of objects
|
|
456
|
-
if (Array.isArray(element)) {
|
|
457
|
-
for (const elementArrayItem of element) {
|
|
458
|
-
// this means unhandled format and it doesn't match the transform format
|
|
459
|
-
if (typeof elementArrayItem !== 'object') {
|
|
460
|
-
break;
|
|
461
|
-
}
|
|
462
|
-
const objectValue = Object.values(elementArrayItem)[0];
|
|
463
|
-
result = isObjectValid(objectValue, key);
|
|
464
|
-
if (!result) {
|
|
465
|
-
break;
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
else {
|
|
470
|
-
result = isObjectValid(element, key);
|
|
471
|
-
}
|
|
472
|
-
return !result;
|
|
473
|
-
});
|
|
474
|
-
if (isError && wrongKey !== undefined) {
|
|
475
|
-
throw new Error(`invalid value passed to \`${wrongKey}\`, maybe you forgot to use \`.value\`?`);
|
|
476
|
-
}
|
|
477
|
-
if (process.env.JEST_WORKER_ID) {
|
|
478
|
-
return { viewDescriptor, initial, viewRef, animatedStyle };
|
|
479
|
-
}
|
|
480
|
-
else {
|
|
481
|
-
return { viewDescriptor, initial, viewRef };
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
// TODO: we should make sure that when useAP is used we are not assigning styles
|
|
485
|
-
// when you need styles to animated you should always use useAS
|
|
486
|
-
export const useAnimatedProps = useAnimatedStyle;
|
|
487
|
-
export function useDerivedValue(processor, dependencies) {
|
|
488
|
-
const initRef = useRef(null);
|
|
489
|
-
const inputs = Object.values(processor._closure);
|
|
490
|
-
// build dependencies
|
|
491
|
-
if (dependencies === undefined) {
|
|
492
|
-
dependencies = [...inputs, processor.__workletHash];
|
|
493
|
-
}
|
|
494
|
-
else {
|
|
495
|
-
dependencies.push(processor.__workletHash);
|
|
496
|
-
}
|
|
497
|
-
if (initRef.current === null) {
|
|
498
|
-
initRef.current = makeMutable(initialUpdaterRun(processor));
|
|
499
|
-
}
|
|
500
|
-
const sharedValue = initRef.current;
|
|
501
|
-
useEffect(() => {
|
|
502
|
-
const fun = () => {
|
|
503
|
-
'worklet';
|
|
504
|
-
sharedValue.value = processor();
|
|
505
|
-
};
|
|
506
|
-
const mapperId = startMapper(fun, inputs, [sharedValue]);
|
|
507
|
-
return () => {
|
|
508
|
-
stopMapper(mapperId);
|
|
509
|
-
};
|
|
510
|
-
}, dependencies);
|
|
511
|
-
useEffect(() => {
|
|
512
|
-
return () => {
|
|
513
|
-
initRef.current = null;
|
|
514
|
-
};
|
|
515
|
-
}, []);
|
|
516
|
-
return sharedValue;
|
|
517
|
-
}
|
|
518
|
-
// builds one big hash from multiple worklets' hashes
|
|
519
|
-
function buildWorkletsHash(handlers) {
|
|
520
|
-
return Object.keys(handlers).reduce((previousValue, key) => previousValue === null
|
|
521
|
-
? handlers[key].__workletHash
|
|
522
|
-
: previousValue.toString() + handlers[key].__workletHash.toString(), null);
|
|
523
|
-
}
|
|
524
|
-
// builds dependencies array for gesture handlers
|
|
525
|
-
function buildDependencies(dependencies, handlers) {
|
|
526
|
-
if (!dependencies) {
|
|
527
|
-
dependencies = Object.keys(handlers).map((handlerKey) => {
|
|
528
|
-
const handler = handlers[handlerKey];
|
|
529
|
-
return {
|
|
530
|
-
workletHash: handler.__workletHash,
|
|
531
|
-
closure: handler._closure,
|
|
532
|
-
};
|
|
533
|
-
});
|
|
534
|
-
}
|
|
535
|
-
else {
|
|
536
|
-
dependencies.push(buildWorkletsHash(handlers));
|
|
537
|
-
}
|
|
538
|
-
return dependencies;
|
|
539
|
-
}
|
|
540
|
-
// this is supposed to work as useEffect comparison
|
|
541
|
-
function areDependenciesEqual(nextDeps, prevDeps) {
|
|
542
|
-
function is(x, y) {
|
|
543
|
-
/* eslint-disable no-self-compare */
|
|
544
|
-
return (x === y && (x !== 0 || 1 / x === 1 / y)) || (x !== x && y !== y);
|
|
545
|
-
/* eslint-enable no-self-compare */
|
|
546
|
-
}
|
|
547
|
-
const objectIs = typeof Object.is === 'function' ? Object.is : is;
|
|
548
|
-
function areHookInputsEqual(nextDeps, prevDeps) {
|
|
549
|
-
if (!nextDeps || !prevDeps || prevDeps.length !== nextDeps.length) {
|
|
550
|
-
return false;
|
|
551
|
-
}
|
|
552
|
-
for (let i = 0; i < prevDeps.length; ++i) {
|
|
553
|
-
if (!objectIs(nextDeps[i], prevDeps[i])) {
|
|
554
|
-
return false;
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
return true;
|
|
558
|
-
}
|
|
559
|
-
return areHookInputsEqual(nextDeps, prevDeps);
|
|
560
|
-
}
|
|
561
|
-
export function useAnimatedGestureHandler(handlers, dependencies) {
|
|
562
|
-
const initRef = useRef(null);
|
|
563
|
-
if (initRef.current === null) {
|
|
564
|
-
initRef.current = {
|
|
565
|
-
context: makeRemote({}),
|
|
566
|
-
savedDependencies: [],
|
|
567
|
-
};
|
|
568
|
-
}
|
|
569
|
-
useEffect(() => {
|
|
570
|
-
return () => {
|
|
571
|
-
initRef.current = null;
|
|
572
|
-
};
|
|
573
|
-
}, []);
|
|
574
|
-
const { context, savedDependencies } = initRef.current;
|
|
575
|
-
dependencies = buildDependencies(dependencies, handlers);
|
|
576
|
-
const dependenciesDiffer = !areDependenciesEqual(dependencies, savedDependencies);
|
|
577
|
-
initRef.current.savedDependencies = dependencies;
|
|
578
|
-
const handler = (event) => {
|
|
579
|
-
'worklet';
|
|
580
|
-
event = Platform.OS === 'web' ? event.nativeEvent : event;
|
|
581
|
-
const FAILED = 1;
|
|
582
|
-
const BEGAN = 2;
|
|
583
|
-
const CANCELLED = 3;
|
|
584
|
-
const ACTIVE = 4;
|
|
585
|
-
const END = 5;
|
|
586
|
-
if (event.state === BEGAN && handlers.onStart) {
|
|
587
|
-
handlers.onStart(event, context);
|
|
588
|
-
}
|
|
589
|
-
if (event.state === ACTIVE && handlers.onActive) {
|
|
590
|
-
handlers.onActive(event, context);
|
|
591
|
-
}
|
|
592
|
-
if (event.oldState === ACTIVE && event.state === END && handlers.onEnd) {
|
|
593
|
-
handlers.onEnd(event, context);
|
|
594
|
-
}
|
|
595
|
-
if (event.oldState === BEGAN && event.state === FAILED && handlers.onFail) {
|
|
596
|
-
handlers.onFail(event, context);
|
|
597
|
-
}
|
|
598
|
-
if (event.oldState === ACTIVE &&
|
|
599
|
-
event.state === CANCELLED &&
|
|
600
|
-
handlers.onCancel) {
|
|
601
|
-
handlers.onCancel(event, context);
|
|
602
|
-
}
|
|
603
|
-
if ((event.oldState === BEGAN || event.oldState === ACTIVE) &&
|
|
604
|
-
event.state !== BEGAN &&
|
|
605
|
-
event.state !== ACTIVE &&
|
|
606
|
-
handlers.onFinish) {
|
|
607
|
-
handlers.onFinish(event, context, event.state === CANCELLED || event.state === FAILED);
|
|
608
|
-
}
|
|
609
|
-
};
|
|
610
|
-
if (Platform.OS === 'web') {
|
|
611
|
-
return handler;
|
|
612
|
-
}
|
|
613
|
-
return useEvent(handler, ['onGestureHandlerStateChange', 'onGestureHandlerEvent'], dependenciesDiffer);
|
|
614
|
-
}
|
|
615
|
-
export function useAnimatedScrollHandler(handlers, dependencies) {
|
|
616
|
-
const initRef = useRef(null);
|
|
617
|
-
if (initRef.current === null) {
|
|
618
|
-
initRef.current = {
|
|
619
|
-
context: makeRemote({}),
|
|
620
|
-
savedDependencies: [],
|
|
621
|
-
};
|
|
622
|
-
}
|
|
623
|
-
useEffect(() => {
|
|
624
|
-
return () => {
|
|
625
|
-
initRef.current = null;
|
|
626
|
-
};
|
|
627
|
-
}, []);
|
|
628
|
-
const { context, savedDependencies } = initRef.current;
|
|
629
|
-
dependencies = buildDependencies(dependencies, handlers);
|
|
630
|
-
const dependenciesDiffer = !areDependenciesEqual(dependencies, savedDependencies);
|
|
631
|
-
initRef.current.savedDependencies = dependencies;
|
|
632
|
-
// build event subscription array
|
|
633
|
-
const subscribeForEvents = ['onScroll'];
|
|
634
|
-
if (handlers.onBeginDrag !== undefined) {
|
|
635
|
-
subscribeForEvents.push('onScrollBeginDrag');
|
|
636
|
-
}
|
|
637
|
-
if (handlers.onEndDrag !== undefined) {
|
|
638
|
-
subscribeForEvents.push('onScrollEndDrag');
|
|
639
|
-
}
|
|
640
|
-
if (handlers.onMomentumBegin !== undefined) {
|
|
641
|
-
subscribeForEvents.push('onMomentumScrollBegin');
|
|
642
|
-
}
|
|
643
|
-
if (handlers.onMomentumEnd !== undefined) {
|
|
644
|
-
subscribeForEvents.push('onMomentumScrollEnd');
|
|
645
|
-
}
|
|
646
|
-
return useEvent((event) => {
|
|
647
|
-
'worklet';
|
|
648
|
-
const { onScroll, onBeginDrag, onEndDrag, onMomentumBegin, onMomentumEnd, } = handlers;
|
|
649
|
-
if (event.eventName.endsWith('onScroll')) {
|
|
650
|
-
if (onScroll) {
|
|
651
|
-
onScroll(event, context);
|
|
652
|
-
}
|
|
653
|
-
else if (typeof handlers === 'function') {
|
|
654
|
-
handlers(event, context);
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
else if (onBeginDrag && event.eventName.endsWith('onScrollBeginDrag')) {
|
|
658
|
-
onBeginDrag(event, context);
|
|
659
|
-
}
|
|
660
|
-
else if (onEndDrag && event.eventName.endsWith('onScrollEndDrag')) {
|
|
661
|
-
onEndDrag(event, context);
|
|
662
|
-
}
|
|
663
|
-
else if (onMomentumBegin &&
|
|
664
|
-
event.eventName.endsWith('onMomentumScrollBegin')) {
|
|
665
|
-
onMomentumBegin(event, context);
|
|
666
|
-
}
|
|
667
|
-
else if (onMomentumEnd &&
|
|
668
|
-
event.eventName.endsWith('onMomentumScrollEnd')) {
|
|
669
|
-
onMomentumEnd(event, context);
|
|
670
|
-
}
|
|
671
|
-
}, subscribeForEvents, dependenciesDiffer);
|
|
672
|
-
}
|
|
673
|
-
export function useAnimatedRef() {
|
|
674
|
-
const tag = useSharedValue(-1);
|
|
675
|
-
const ref = useRef(null);
|
|
676
|
-
if (!ref.current) {
|
|
677
|
-
const fun = function (component) {
|
|
678
|
-
'worklet';
|
|
679
|
-
// enters when ref is set by attaching to a component
|
|
680
|
-
if (component) {
|
|
681
|
-
tag.value = getTag(component);
|
|
682
|
-
fun.current = component;
|
|
683
|
-
}
|
|
684
|
-
return tag.value;
|
|
685
|
-
};
|
|
686
|
-
Object.defineProperty(fun, 'current', {
|
|
687
|
-
value: null,
|
|
688
|
-
writable: true,
|
|
689
|
-
enumerable: false,
|
|
690
|
-
});
|
|
691
|
-
ref.current = fun;
|
|
692
|
-
}
|
|
693
|
-
return ref.current;
|
|
694
|
-
}
|
|
695
|
-
/**
|
|
696
|
-
* @param prepare - worklet used for data preparation for the second parameter
|
|
697
|
-
* @param react - worklet which takes data prepared by the one in the first parameter and performs certain actions
|
|
698
|
-
* the first worklet defines the inputs, in other words on which shared values change will it be called.
|
|
699
|
-
* the second one can modify any shared values but those which are mentioned in the first worklet. Beware of that, because this may result in endless loop and high cpu usage.
|
|
700
|
-
*/
|
|
701
|
-
export function useAnimatedReaction(prepare, react, dependencies) {
|
|
702
|
-
const previous = useSharedValue(null);
|
|
703
|
-
if (dependencies === undefined) {
|
|
704
|
-
dependencies = [
|
|
705
|
-
Object.values(prepare._closure),
|
|
706
|
-
Object.values(react._closure),
|
|
707
|
-
prepare.__workletHash,
|
|
708
|
-
react.__workletHash,
|
|
709
|
-
];
|
|
710
|
-
}
|
|
711
|
-
else {
|
|
712
|
-
dependencies.push(prepare.__workletHash, react.__workletHash);
|
|
713
|
-
}
|
|
714
|
-
useEffect(() => {
|
|
715
|
-
const fun = () => {
|
|
716
|
-
'worklet';
|
|
717
|
-
const input = prepare();
|
|
718
|
-
react(input, previous.value);
|
|
719
|
-
previous.value = input;
|
|
720
|
-
};
|
|
721
|
-
const mapperId = startMapper(fun, Object.values(prepare._closure), []);
|
|
722
|
-
return () => {
|
|
723
|
-
stopMapper(mapperId);
|
|
724
|
-
};
|
|
725
|
-
}, dependencies);
|
|
726
|
-
}
|
|
727
|
-
export function useWorkletCallback(fun, deps) {
|
|
728
|
-
return useCallback(fun, deps);
|
|
729
|
-
}
|
|
730
|
-
export function createWorklet(fun) {
|
|
731
|
-
return fun;
|
|
732
|
-
}
|