react-native-reanimated 2.9.1 → 2.10.0

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.
Files changed (195) hide show
  1. package/Common/cpp/AnimatedSensor/AnimatedSensorModule.cpp +4 -4
  2. package/Common/cpp/NativeModules/NativeReanimatedModule.cpp +38 -0
  3. package/Common/cpp/NativeModules/NativeReanimatedModuleSpec.cpp +23 -0
  4. package/Common/cpp/headers/NativeModules/NativeReanimatedModule.h +8 -0
  5. package/Common/cpp/headers/NativeModules/NativeReanimatedModuleSpec.h +8 -0
  6. package/Common/cpp/headers/Tools/PlatformDepMethodsHolder.h +5 -0
  7. package/RNReanimated.podspec +22 -3
  8. package/android/.gradle/7.2/dependencies-accessors/dependencies-accessors.lock +0 -0
  9. package/android/.gradle/7.2/executionHistory/executionHistory.bin +0 -0
  10. package/android/.gradle/7.2/executionHistory/executionHistory.lock +0 -0
  11. package/android/.gradle/7.2/fileHashes/fileHashes.bin +0 -0
  12. package/android/.gradle/7.2/fileHashes/fileHashes.lock +0 -0
  13. package/android/.gradle/7.2/fileHashes/resourceHashesCache.bin +0 -0
  14. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  15. package/android/.gradle/buildOutputCleanup/cache.properties +1 -1
  16. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  17. package/android/.gradle/checksums/checksums.lock +0 -0
  18. package/android/.gradle/checksums/md5-checksums.bin +0 -0
  19. package/android/.gradle/checksums/sha1-checksums.bin +0 -0
  20. package/android/CMakeLists.txt +214 -95
  21. package/android/build.gradle +247 -236
  22. package/android/react-native-reanimated-66-hermes.aar +0 -0
  23. package/android/react-native-reanimated-66-jsc.aar +0 -0
  24. package/android/react-native-reanimated-67-hermes.aar +0 -0
  25. package/android/react-native-reanimated-67-jsc.aar +0 -0
  26. package/android/react-native-reanimated-68-hermes.aar +0 -0
  27. package/android/react-native-reanimated-68-jsc.aar +0 -0
  28. package/android/react-native-reanimated-69-hermes.aar +0 -0
  29. package/android/react-native-reanimated-69-jsc.aar +0 -0
  30. package/android/react-native-reanimated-70-hermes.aar +0 -0
  31. package/android/react-native-reanimated-70-jsc.aar +0 -0
  32. package/{lib/types/lib/reanimated2/platform-specific/RNRenderer.web.d.ts → android/rnVersionPatch/70/.gitkeep} +0 -0
  33. package/android/src/main/cpp/NativeProxy.cpp +54 -20
  34. package/android/src/main/cpp/OnLoad.cpp +1 -0
  35. package/android/src/main/cpp/headers/NativeProxy.h +29 -0
  36. package/android/src/main/java/com/swmansion/reanimated/NativeProxy.java +25 -0
  37. package/android/src/main/java/com/swmansion/reanimated/NodesManager.java +3 -1
  38. package/android/src/main/java/com/swmansion/reanimated/keyboardObserver/ReanimatedKeyboardEventListener.java +165 -0
  39. package/android/src/main/java/com/swmansion/reanimated/layoutReanimation/AnimationsManager.java +19 -16
  40. package/android/src/main/java/com/swmansion/reanimated/sensor/ReanimatedSensor.java +5 -1
  41. package/android/src/main/java/com/swmansion/reanimated/sensor/ReanimatedSensorType.java +1 -1
  42. package/ios/REANodesManager.m +31 -8
  43. package/ios/keyboardObserver/REAKeyboardEventObserver.h +17 -0
  44. package/ios/keyboardObserver/REAKeyboardEventObserver.m +198 -0
  45. package/ios/native/NativeProxy.mm +20 -1
  46. package/ios/native/REAInitializer.mm +8 -12
  47. package/ios/sensor/ReanimatedSensor.m +26 -17
  48. package/lib/index.js +11 -3
  49. package/lib/index.web.js +4 -0
  50. package/lib/reanimated2/Colors.js +1 -1
  51. package/lib/reanimated2/NativeMethods.js +3 -0
  52. package/lib/reanimated2/NativeReanimated/NativeReanimated.js +6 -0
  53. package/lib/reanimated2/animation/util.js +4 -1
  54. package/lib/reanimated2/commonTypes.js +8 -1
  55. package/lib/reanimated2/component/FlatList.js +5 -5
  56. package/lib/reanimated2/core.js +5 -4
  57. package/lib/reanimated2/frameCallback/FrameCallbackRegistryJS.js +32 -0
  58. package/lib/reanimated2/frameCallback/FrameCallbackRegistryUI.js +47 -0
  59. package/lib/reanimated2/globals.d.ts +3 -0
  60. package/lib/reanimated2/hook/index.js +2 -0
  61. package/lib/reanimated2/hook/useAnimatedKeyboard.js +31 -0
  62. package/lib/reanimated2/hook/useAnimatedSensor.js +3 -3
  63. package/lib/reanimated2/hook/useFrameCallback.js +23 -0
  64. package/lib/reanimated2/jestUtils.js +11 -3
  65. package/lib/reanimated2/js-reanimated/JSReanimated.js +7 -0
  66. package/lib/reanimated2/js-reanimated/global.js +33 -22
  67. package/lib/reanimated2/layoutReanimation/LayoutAnimationRepository.js +1 -1
  68. package/lib/types/{lib/Animated.d.ts → Animated.d.ts} +0 -0
  69. package/lib/types/{lib/ConfigHelper.d.ts → ConfigHelper.d.ts} +0 -0
  70. package/lib/types/{lib/ReanimatedEventEmitter.d.ts → ReanimatedEventEmitter.d.ts} +0 -0
  71. package/lib/types/{lib/ReanimatedModule.d.ts → ReanimatedModule.d.ts} +0 -0
  72. package/lib/types/{lib/ReanimatedModule.macos.d.ts → ReanimatedModule.macos.d.ts} +0 -0
  73. package/lib/types/{lib/ReanimatedModule.native.d.ts → ReanimatedModule.native.d.ts} +0 -0
  74. package/lib/types/{lib/ReanimatedModule.windows.d.ts → ReanimatedModule.windows.d.ts} +0 -0
  75. package/lib/types/{lib/ReanimatedModuleCompat.d.ts → ReanimatedModuleCompat.d.ts} +0 -0
  76. package/lib/types/{lib/createAnimatedComponent.d.ts → createAnimatedComponent.d.ts} +0 -0
  77. package/lib/types/index.d.ts +4 -0
  78. package/lib/types/{lib/index.d.ts → index.web.d.ts} +0 -1
  79. package/lib/types/{lib/reanimated2 → reanimated2}/Bezier.d.ts +0 -0
  80. package/lib/types/{lib/reanimated2 → reanimated2}/Colors.d.ts +0 -0
  81. package/lib/types/{lib/reanimated2 → reanimated2}/Easing.d.ts +0 -0
  82. package/lib/types/{lib/reanimated2 → reanimated2}/NativeMethods.d.ts +0 -0
  83. package/lib/types/{lib/reanimated2 → reanimated2}/NativeReanimated/NativeReanimated.d.ts +3 -1
  84. package/lib/types/{lib/reanimated2 → reanimated2}/NativeReanimated/index.d.ts +0 -0
  85. package/lib/types/{lib/reanimated2 → reanimated2}/PlatformChecker.d.ts +0 -0
  86. package/lib/types/{lib/reanimated2 → reanimated2}/PropAdapters.d.ts +0 -0
  87. package/lib/types/{lib/reanimated2 → reanimated2}/UpdateProps.d.ts +0 -0
  88. package/lib/types/{lib/reanimated2 → reanimated2}/ViewDescriptorsSet.d.ts +0 -0
  89. package/lib/types/{lib/reanimated2 → reanimated2}/WorkletEventHandler.d.ts +0 -0
  90. package/lib/types/{lib/reanimated2 → reanimated2}/__mocks__/MutableValue.d.ts +0 -0
  91. package/lib/types/{lib/reanimated2 → reanimated2}/__mocks__/NativeReanimated.d.ts +0 -0
  92. package/lib/types/{lib/reanimated2 → reanimated2}/__mocks__/NativeReanimated.native.d.ts +0 -0
  93. package/lib/types/{lib/reanimated2 → reanimated2}/animation/commonTypes.d.ts +0 -0
  94. package/lib/types/{lib/reanimated2 → reanimated2}/animation/decay.d.ts +0 -0
  95. package/lib/types/{lib/reanimated2 → reanimated2}/animation/delay.d.ts +0 -0
  96. package/lib/types/{lib/reanimated2 → reanimated2}/animation/index.d.ts +0 -0
  97. package/lib/types/{lib/reanimated2 → reanimated2}/animation/repeat.d.ts +0 -0
  98. package/lib/types/{lib/reanimated2 → reanimated2}/animation/sequence.d.ts +0 -0
  99. package/lib/types/{lib/reanimated2 → reanimated2}/animation/spring.d.ts +0 -0
  100. package/lib/types/{lib/reanimated2 → reanimated2}/animation/styleAnimation.d.ts +0 -0
  101. package/lib/types/{lib/reanimated2 → reanimated2}/animation/timing.d.ts +0 -0
  102. package/lib/types/{lib/reanimated2 → reanimated2}/animation/util.d.ts +0 -0
  103. package/lib/types/{lib/reanimated2 → reanimated2}/commonTypes.d.ts +12 -0
  104. package/lib/types/{lib/reanimated2 → reanimated2}/component/FlatList.d.ts +2 -2
  105. package/lib/types/{lib/reanimated2 → reanimated2}/component/Image.d.ts +0 -0
  106. package/lib/types/{lib/reanimated2 → reanimated2}/component/ScrollView.d.ts +0 -0
  107. package/lib/types/{lib/reanimated2 → reanimated2}/component/Text.d.ts +0 -0
  108. package/lib/types/{lib/reanimated2 → reanimated2}/component/View.d.ts +0 -0
  109. package/lib/types/{lib/reanimated2 → reanimated2}/core.d.ts +0 -0
  110. package/lib/types/reanimated2/frameCallback/FrameCallbackRegistryJS.d.ts +7 -0
  111. package/lib/types/reanimated2/frameCallback/FrameCallbackRegistryUI.d.ts +10 -0
  112. package/lib/types/{lib/reanimated2 → reanimated2}/hook/Hooks.d.ts +0 -0
  113. package/lib/types/{lib/reanimated2 → reanimated2}/hook/commonTypes.d.ts +0 -0
  114. package/lib/types/{lib/reanimated2 → reanimated2}/hook/index.d.ts +3 -0
  115. package/lib/types/{lib/reanimated2 → reanimated2}/hook/useAnimatedGestureHandler.d.ts +0 -0
  116. package/lib/types/reanimated2/hook/useAnimatedKeyboard.d.ts +2 -0
  117. package/lib/types/{lib/reanimated2 → reanimated2}/hook/useAnimatedReaction.d.ts +0 -0
  118. package/lib/types/{lib/reanimated2 → reanimated2}/hook/useAnimatedRef.d.ts +0 -0
  119. package/lib/types/{lib/reanimated2 → reanimated2}/hook/useAnimatedScrollHandler.d.ts +0 -0
  120. package/lib/types/{lib/reanimated2 → reanimated2}/hook/useAnimatedSensor.d.ts +1 -1
  121. package/lib/types/{lib/reanimated2 → reanimated2}/hook/useAnimatedStyle.d.ts +0 -0
  122. package/lib/types/{lib/reanimated2 → reanimated2}/hook/useDerivedValue.d.ts +0 -0
  123. package/lib/types/reanimated2/hook/useFrameCallback.d.ts +6 -0
  124. package/lib/types/{lib/reanimated2 → reanimated2}/hook/useSharedValue.d.ts +0 -0
  125. package/lib/types/{lib/reanimated2 → reanimated2}/hook/utils.d.ts +0 -0
  126. package/lib/types/{lib/reanimated2 → reanimated2}/index.d.ts +0 -0
  127. package/lib/types/{lib/reanimated2 → reanimated2}/interpolateColor.d.ts +0 -0
  128. package/lib/types/{lib/reanimated2 → reanimated2}/interpolation.d.ts +0 -0
  129. package/lib/types/{lib/reanimated2 → reanimated2}/jestUtils.d.ts +1 -1
  130. package/lib/types/{lib/reanimated2 → reanimated2}/js-reanimated/JSReanimated.d.ts +3 -1
  131. package/lib/types/{lib/reanimated2 → reanimated2}/js-reanimated/Mapper.d.ts +0 -0
  132. package/lib/types/{lib/reanimated2 → reanimated2}/js-reanimated/MapperRegistry.d.ts +0 -0
  133. package/lib/types/{lib/reanimated2 → reanimated2}/js-reanimated/MutableValue.d.ts +0 -0
  134. package/lib/types/{lib/reanimated2 → reanimated2}/js-reanimated/commonTypes.d.ts +0 -0
  135. package/lib/types/reanimated2/js-reanimated/global.d.ts +2 -0
  136. package/lib/types/{lib/reanimated2 → reanimated2}/js-reanimated/index.d.ts +0 -0
  137. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/LayoutAnimationRepository.d.ts +0 -0
  138. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/animationBuilder/BaseAnimationBuilder.d.ts +0 -0
  139. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/animationBuilder/ComplexAnimationBuilder.d.ts +0 -0
  140. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/animationBuilder/Keyframe.d.ts +0 -0
  141. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/animationBuilder/commonTypes.d.ts +0 -0
  142. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/animationBuilder/index.d.ts +0 -0
  143. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultAnimations/Bounce.d.ts +0 -0
  144. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultAnimations/Default.d.ts +0 -0
  145. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultAnimations/Fade.d.ts +0 -0
  146. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultAnimations/Flip.d.ts +0 -0
  147. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultAnimations/Lightspeed.d.ts +0 -0
  148. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultAnimations/Pinwheel.d.ts +0 -0
  149. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultAnimations/Roll.d.ts +0 -0
  150. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultAnimations/Rotate.d.ts +0 -0
  151. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultAnimations/Slide.d.ts +0 -0
  152. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultAnimations/Stretch.d.ts +0 -0
  153. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultAnimations/Zoom.d.ts +0 -0
  154. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultAnimations/index.d.ts +0 -0
  155. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultTransitions/CurvedTransition.d.ts +0 -0
  156. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultTransitions/EntryExitTransition.d.ts +0 -0
  157. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultTransitions/FadingTransition.d.ts +0 -0
  158. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultTransitions/JumpingTransition.d.ts +0 -0
  159. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultTransitions/LinearTransition.d.ts +0 -0
  160. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultTransitions/SequencedTransition.d.ts +0 -0
  161. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/defaultTransitions/index.d.ts +0 -0
  162. package/lib/types/{lib/reanimated2 → reanimated2}/layoutReanimation/index.d.ts +0 -0
  163. package/lib/types/{lib/reanimated2 → reanimated2}/mock.d.ts +0 -0
  164. package/lib/types/{lib/reanimated2 → reanimated2}/platform-specific/RNRenderer.d.ts +0 -0
  165. package/lib/types/reanimated2/platform-specific/RNRenderer.web.d.ts +0 -0
  166. package/lib/types/{lib/reanimated2 → reanimated2}/utils.d.ts +0 -0
  167. package/lib/types/{lib/setAndForwardRef.d.ts → setAndForwardRef.d.ts} +0 -0
  168. package/mock.js +1 -0
  169. package/package.json +5 -6
  170. package/plugin.js +7 -16
  171. package/react-native-reanimated.d.ts +55 -4
  172. package/src/index.ts +11 -3
  173. package/src/index.web.ts +5 -0
  174. package/src/reanimated2/Colors.ts +1 -1
  175. package/src/reanimated2/NativeMethods.ts +5 -0
  176. package/src/reanimated2/NativeReanimated/NativeReanimated.ts +9 -0
  177. package/src/reanimated2/animation/util.ts +8 -1
  178. package/src/reanimated2/commonTypes.ts +15 -0
  179. package/src/reanimated2/component/FlatList.tsx +29 -19
  180. package/src/reanimated2/core.ts +8 -8
  181. package/src/reanimated2/frameCallback/FrameCallbackRegistryJS.ts +43 -0
  182. package/src/reanimated2/frameCallback/FrameCallbackRegistryUI.ts +64 -0
  183. package/src/reanimated2/globals.d.ts +3 -0
  184. package/src/reanimated2/hook/index.ts +3 -0
  185. package/src/reanimated2/hook/useAnimatedKeyboard.ts +35 -0
  186. package/src/reanimated2/hook/useAnimatedSensor.ts +5 -5
  187. package/src/reanimated2/hook/useFrameCallback.ts +39 -0
  188. package/src/reanimated2/jestUtils.ts +11 -3
  189. package/src/reanimated2/js-reanimated/JSReanimated.ts +16 -1
  190. package/src/reanimated2/js-reanimated/global.ts +41 -29
  191. package/src/reanimated2/layoutReanimation/LayoutAnimationRepository.ts +1 -1
  192. package/android/react-native-reanimated-65-hermes.aar +0 -0
  193. package/android/react-native-reanimated-65-jsc.aar +0 -0
  194. package/lib/types/lib/reanimated2/js-reanimated/global.d.ts +0 -1
  195. package/lib/types/react-native-reanimated-tests.d.ts +0 -1
@@ -495,20 +495,71 @@ declare module 'react-native-reanimated' {
495
495
  }
496
496
 
497
497
  export type SensorConfig = {
498
- interval: number;
498
+ interval: number | 'auto';
499
499
  };
500
500
 
501
- export type AnimatedSensor = {
502
- sensor: SensorValue3D | SensorValueRotation | null;
501
+ export type Value3D = {
502
+ x: number;
503
+ y: number;
504
+ z: number;
505
+ };
506
+
507
+ export type SensorValue3D = SharedValue<Value3D>;
508
+
509
+ export type ValueRotation = {
510
+ qw: number;
511
+ qx: number;
512
+ qy: number;
513
+ qz: number;
514
+ yaw: number;
515
+ pitch: number;
516
+ roll: number;
517
+ };
518
+
519
+ export type SensorValueRotation = SharedValue<ValueRotation>;
520
+
521
+ export type AnimatedSensor<SensorValueType> = {
522
+ sensor: SensorValueType;
503
523
  unregister: () => void;
504
524
  isAvailable: boolean;
505
525
  config: SensorConfig;
506
526
  };
507
527
 
528
+ export function useAnimatedSensor(
529
+ sensorType: SensorType.ROTATION,
530
+ userConfig?: SensorConfig
531
+ ): AnimatedSensor<SensorValueRotation>;
532
+ export function useAnimatedSensor(
533
+ sensorType: Exclude<SensorType, SensorType.ROTATION>,
534
+ userConfig?: SensorConfig
535
+ ): AnimatedSensor<SensorValue3D>;
508
536
  export function useAnimatedSensor(
509
537
  sensorType: SensorType,
510
538
  userConfig?: SensorConfig
511
- ): AnimatedSensor;
539
+ ): AnimatedSensor<any>;
540
+
541
+ export type FrameCallback = {
542
+ setActive: (isActive: boolean) => void;
543
+ isActive: boolean;
544
+ callbackId: number;
545
+ };
546
+ export function useFrameCallback(
547
+ callback: () => void,
548
+ autostart?: boolean
549
+ ): FrameCallback;
550
+
551
+ export enum KeyboardState {
552
+ UNKNOWN = 0,
553
+ OPENING = 1,
554
+ OPEN = 2,
555
+ CLOSING = 3,
556
+ CLOSED = 4,
557
+ }
558
+ export type AnimatedKeyboardInfo = {
559
+ height: SharedValue<number>;
560
+ state: SharedValue<KeyboardState>;
561
+ };
562
+ export function useAnimatedKeyboard(): AnimatedKeyboardInfo;
512
563
 
513
564
  export interface ExitAnimationsValues {
514
565
  currentOriginX: number;
package/src/index.ts CHANGED
@@ -1,7 +1,15 @@
1
- // tree-shaken side effects
2
- import './reanimated2/js-reanimated/global';
1
+ import * as Animated from './Animated';
2
+ import webGlobalIsInitialized from './reanimated2/js-reanimated/global';
3
+ if (!webGlobalIsInitialized) {
4
+ /*
5
+ `webGlobalIsInitialized` should always be `true`,
6
+ but we need to use `webGlobalIsInitialized` somewhere to ensure function execution,
7
+ in another way, the bundler can remove unused variables.
8
+ */
9
+ console.error('[Reanimated] Unable to initialize global objects for web.');
10
+ }
3
11
 
4
12
  // @ts-ignore backward compatibility with treeshaking
5
13
  export * from './reanimated1';
6
14
  export * from './reanimated2';
7
- export * as default from './Animated';
15
+ export default Animated;
@@ -0,0 +1,5 @@
1
+ // tree-shaken side effects
2
+ import './reanimated2/js-reanimated/global';
3
+
4
+ export * from './reanimated2';
5
+ export * as default from './Animated'; // If this line fails, you probably forgot some installation steps. Check out the installation guide here: https://docs.swmansion.com/react-native-reanimated/docs/fundamentals/installation/ 1) Make sure reanimated's babel plugin is installed in your babel.config.js (you should have 'react-native-reanimated/plugin' listed there - also see the above link for details) 2) Make sure you reset build cache after updating the config, run: yarn start --reset-cache
@@ -23,7 +23,7 @@ interface HSV {
23
23
  }
24
24
 
25
25
  // var INTEGER = '[-+]?\\d+';
26
- const NUMBER = '[-+]?\\d*\\.?\\d+';
26
+ const NUMBER = '[-+]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)';
27
27
  const PERCENTAGE = NUMBER + '%';
28
28
 
29
29
  function call(...args: unknown[]): string {
@@ -45,6 +45,11 @@ export function measure(
45
45
  if (result.x === -1234567) {
46
46
  throw new Error(`The view with tag ${viewTag} could not be measured`);
47
47
  }
48
+ if (isNaN(result.x)) {
49
+ console.warn(
50
+ 'Trying to measure a component which gets view-flattened on Android. To disable view-flattening, set `collapsable={false}` on this component.'
51
+ );
52
+ }
48
53
  return result;
49
54
  }
50
55
 
@@ -3,6 +3,7 @@ import {
3
3
  SharedValue,
4
4
  SensorValue3D,
5
5
  SensorValueRotation,
6
+ AnimatedKeyboardInfo,
6
7
  } from '../commonTypes';
7
8
  import { Descriptor } from '../hook/commonTypes';
8
9
 
@@ -97,4 +98,12 @@ export class NativeReanimated {
97
98
  configureProps(uiProps: string[], nativeProps: string[]): void {
98
99
  this.InnerNativeModule.configureProps(uiProps, nativeProps);
99
100
  }
101
+
102
+ subscribeForKeyboardEvents(keyboardEventData: AnimatedKeyboardInfo): number {
103
+ return this.InnerNativeModule.subscribeForKeyboardEvents(keyboardEventData);
104
+ }
105
+
106
+ unsubscribeFromKeyboardEvents(listenerId: number): void {
107
+ this.InnerNativeModule.unsubscribeFromKeyboardEvents(listenerId);
108
+ }
100
109
  }
@@ -87,7 +87,14 @@ function decorateAnimation<T extends AnimationObject | StyleLayoutAnimation>(
87
87
  animation.startValue = strippedValue;
88
88
  animation.toValue = strippedToValue;
89
89
  if (previousAnimation && previousAnimation !== animation) {
90
- previousAnimation.current = previousAnimation.strippedCurrent;
90
+ const {
91
+ prefix: paPrefix,
92
+ suffix: paSuffix,
93
+ strippedValue: paStrippedValue,
94
+ } = recognizePrefixSuffix(previousAnimation.current as string | number);
95
+ previousAnimation.current = paStrippedValue;
96
+ previousAnimation.__prefix = paPrefix;
97
+ previousAnimation.__suffix = paSuffix;
91
98
  }
92
99
 
93
100
  baseOnStart(animation, strippedValue, timestamp, previousAnimation);
@@ -145,3 +145,18 @@ export type ValueRotation = {
145
145
  };
146
146
 
147
147
  export type SensorValueRotation = SharedValue<ValueRotation>;
148
+
149
+ export type ShadowNodeWrapper = object;
150
+
151
+ export enum KeyboardState {
152
+ UNKNOWN = 0,
153
+ OPENING = 1,
154
+ OPEN = 2,
155
+ CLOSING = 3,
156
+ CLOSED = 4,
157
+ }
158
+
159
+ export type AnimatedKeyboardInfo = {
160
+ height: SharedValue<number>;
161
+ state: SharedValue<KeyboardState>;
162
+ };
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { ForwardedRef, forwardRef } from 'react';
2
2
  import { FlatList, FlatListProps, LayoutChangeEvent } from 'react-native';
3
3
  import ReanimatedView from './View';
4
4
  import createAnimatedComponent from '../../createAnimatedComponent';
@@ -6,10 +6,14 @@ import { ILayoutAnimationBuilder } from '../layoutReanimation/animationBuilder/c
6
6
 
7
7
  const AnimatedFlatList = createAnimatedComponent(FlatList as any) as any;
8
8
 
9
+ interface AnimatedFlatListProps {
10
+ onLayout: (event: LayoutChangeEvent) => void;
11
+ // implicit `children` prop has been removed in @types/react^18.0.0
12
+ children: React.ReactNode;
13
+ }
14
+
9
15
  const createCellRenderer = (itemLayoutAnimation?: ILayoutAnimationBuilder) => {
10
- const cellRenderer: React.FC<{
11
- onLayout: (event: LayoutChangeEvent) => void;
12
- }> = (props) => {
16
+ const cellRenderer = (props: AnimatedFlatListProps) => {
13
17
  return (
14
18
  <ReanimatedView layout={itemLayoutAnimation} onLayout={props.onLayout}>
15
19
  {props.children}
@@ -20,23 +24,29 @@ const createCellRenderer = (itemLayoutAnimation?: ILayoutAnimationBuilder) => {
20
24
  return cellRenderer;
21
25
  };
22
26
 
23
- export interface ReanimatedFlatlistProps<ItemT> extends FlatListProps<ItemT> {
27
+ export interface ReanimatedFlatListProps<ItemT> extends FlatListProps<ItemT> {
24
28
  itemLayoutAnimation?: ILayoutAnimationBuilder;
25
29
  }
26
30
 
27
- type ReanimatedFlatListFC<T = any> = React.FC<ReanimatedFlatlistProps<T>>;
28
-
29
- const ReanimatedFlatlist: ReanimatedFlatListFC = ({
30
- itemLayoutAnimation,
31
- ...restProps
32
- }) => {
33
- const cellRenderer = React.useMemo(
34
- () => createCellRenderer(itemLayoutAnimation),
35
- []
36
- );
37
- return (
38
- <AnimatedFlatList {...restProps} CellRendererComponent={cellRenderer} />
39
- );
40
- };
31
+ type ReanimatedFlatListFC<T = any> = React.FC<ReanimatedFlatListProps<T>>;
32
+
33
+ const ReanimatedFlatlist: ReanimatedFlatListFC = forwardRef(
34
+ (props: ReanimatedFlatListProps<any>, ref: ForwardedRef<FlatList>) => {
35
+ const { itemLayoutAnimation, ...restProps } = props;
36
+
37
+ const cellRenderer = React.useMemo(
38
+ () => createCellRenderer(itemLayoutAnimation),
39
+ []
40
+ );
41
+
42
+ return (
43
+ <AnimatedFlatList
44
+ ref={ref}
45
+ {...restProps}
46
+ CellRendererComponent={cellRenderer}
47
+ />
48
+ );
49
+ }
50
+ );
41
51
 
42
52
  export default ReanimatedFlatlist;
@@ -41,14 +41,18 @@ const testWorklet: BasicWorkletFunction<void> = () => {
41
41
  'worklet';
42
42
  };
43
43
 
44
+ const throwUninitializedReanimatedException = () => {
45
+ throw new Error(
46
+ "Failed to initialize react-native-reanimated library, make sure you followed installation steps here: https://docs.swmansion.com/react-native-reanimated/docs/fundamentals/installation/ \n1) Make sure reanimated's babel plugin is installed in your babel.config.js (you should have 'react-native-reanimated/plugin' listed there - also see the above link for details) \n2) Make sure you reset build cache after updating the config, run: yarn start --reset-cache"
47
+ );
48
+ };
49
+
44
50
  export const checkPluginState: (throwError: boolean) => boolean = (
45
51
  throwError = true
46
52
  ) => {
47
53
  if (!testWorklet.__workletHash && !shouldBeUseWeb()) {
48
54
  if (throwError) {
49
- throw new Error(
50
- "Reanimated 2 failed to create a worklet, maybe you forgot to add Reanimated's babel plugin?"
51
- );
55
+ throwUninitializedReanimatedException();
52
56
  }
53
57
  return false;
54
58
  }
@@ -62,11 +66,7 @@ export const isConfigured: (throwError?: boolean) => boolean = (
62
66
  };
63
67
 
64
68
  export const isConfiguredCheck: () => void = () => {
65
- if (!isConfigured(true)) {
66
- throw new Error(
67
- 'If you want to use Reanimated 2 then go through our installation steps https://docs.swmansion.com/react-native-reanimated/docs/fundamentals/installation'
68
- );
69
- }
69
+ checkPluginState(true);
70
70
  };
71
71
 
72
72
  function pushFrame(frame: (timestamp: Timestamp) => void): void {
@@ -0,0 +1,43 @@
1
+ import { runOnUI } from '../core';
2
+ import { prepareUIRegistry } from './FrameCallbackRegistryUI';
3
+
4
+ export default class FrameCallbackRegistryJS {
5
+ private nextCallbackId = 0;
6
+
7
+ constructor() {
8
+ prepareUIRegistry();
9
+ }
10
+
11
+ registerFrameCallback(callback: () => void): number {
12
+ if (!callback) {
13
+ return -1;
14
+ }
15
+
16
+ const callbackId = this.nextCallbackId;
17
+ this.nextCallbackId++;
18
+
19
+ runOnUI(() => {
20
+ 'worklet';
21
+ global._frameCallbackRegistry.registerFrameCallback(callback, callbackId);
22
+ })();
23
+
24
+ return callbackId;
25
+ }
26
+
27
+ unregisterFrameCallback(frameCallbackId: number): void {
28
+ runOnUI(() => {
29
+ 'worklet';
30
+ global._frameCallbackRegistry.unregisterFrameCallback(frameCallbackId);
31
+ })();
32
+ }
33
+
34
+ manageStateFrameCallback(frameCallbackId: number, state: boolean): void {
35
+ runOnUI(() => {
36
+ 'worklet';
37
+ global._frameCallbackRegistry.manageStateFrameCallback(
38
+ frameCallbackId,
39
+ state
40
+ );
41
+ })();
42
+ }
43
+ }
@@ -0,0 +1,64 @@
1
+ import { runOnUI } from '../core';
2
+
3
+ export default interface FrameCallbackRegistryUI {
4
+ frameCallbackRegistry: Map<number, () => void>;
5
+ frameCallbackActive: Set<number>;
6
+ isFrameCallbackRunning: boolean;
7
+ runCallbacks: () => void;
8
+ registerFrameCallback: (callback: () => void, callbackId: number) => void;
9
+ unregisterFrameCallback: (frameCallbackId: number) => void;
10
+ manageStateFrameCallback: (frameCallbackId: number, state: boolean) => void;
11
+ }
12
+
13
+ export const prepareUIRegistry = runOnUI(() => {
14
+ 'worklet';
15
+
16
+ const frameCallbackRegistry: FrameCallbackRegistryUI = {
17
+ frameCallbackRegistry: new Map<number, () => void>(),
18
+ frameCallbackActive: new Set<number>(),
19
+ isFrameCallbackRunning: false,
20
+
21
+ runCallbacks() {
22
+ const loop = () => {
23
+ this.frameCallbackActive.forEach((key: number) => {
24
+ const callback = this.frameCallbackRegistry.get(key);
25
+ callback!();
26
+ });
27
+
28
+ if (this.frameCallbackActive.size > 0) {
29
+ requestAnimationFrame(loop);
30
+ } else {
31
+ this.isFrameCallbackRunning = false;
32
+ }
33
+ };
34
+
35
+ if (!this.isFrameCallbackRunning) {
36
+ requestAnimationFrame(loop);
37
+ this.isFrameCallbackRunning = true;
38
+ }
39
+ },
40
+
41
+ registerFrameCallback(callback: () => void, callbackId: number) {
42
+ this.frameCallbackRegistry.set(callbackId, callback);
43
+ },
44
+
45
+ unregisterFrameCallback(frameCallbackId: number) {
46
+ this.manageStateFrameCallback(frameCallbackId, false);
47
+ this.frameCallbackRegistry.delete(frameCallbackId);
48
+ },
49
+
50
+ manageStateFrameCallback(frameCallbackId: number, state: boolean) {
51
+ if (frameCallbackId === -1) {
52
+ return;
53
+ }
54
+ if (state) {
55
+ this.frameCallbackActive.add(frameCallbackId);
56
+ this.runCallbacks();
57
+ } else {
58
+ this.frameCallbackActive.delete(frameCallbackId);
59
+ }
60
+ },
61
+ };
62
+
63
+ global._frameCallbackRegistry = frameCallbackRegistry;
64
+ });
@@ -1,5 +1,6 @@
1
1
  import { AnimatedStyle, StyleProps } from './commonTypes';
2
2
  import { ReanimatedConsole } from './core';
3
+ import FrameCallbackRegistryUI from './frameCallback/FrameCallbackRegistryUI';
3
4
  import { MeasuredDimensions } from './NativeMethods';
4
5
  import { NativeReanimated } from './NativeReanimated/NativeReanimated';
5
6
  declare global {
@@ -30,6 +31,7 @@ declare global {
30
31
  const ReanimatedDataMock: {
31
32
  now: () => number;
32
33
  };
34
+ const _frameCallbackRegistry: FrameCallbackRegistryUI;
33
35
  namespace NodeJS {
34
36
  interface Global {
35
37
  _setGlobalConsole: (console?: ReanimatedConsole) => void;
@@ -55,6 +57,7 @@ declare global {
55
57
  ReanimatedDataMock: {
56
58
  now: () => number;
57
59
  };
60
+ _frameCallbackRegistry: FrameCallbackRegistryUI;
58
61
  }
59
62
  }
60
63
  }
@@ -24,3 +24,6 @@ export {
24
24
  } from './useAnimatedScrollHandler';
25
25
  export { useDerivedValue, DerivedValue } from './useDerivedValue';
26
26
  export { useAnimatedSensor, SensorType } from './useAnimatedSensor';
27
+ export { useFrameCallback } from './useFrameCallback';
28
+ export type { FrameCallback } from './useFrameCallback';
29
+ export { useAnimatedKeyboard } from './useAnimatedKeyboard';
@@ -0,0 +1,35 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import NativeReanimated from '../NativeReanimated';
3
+ import { makeMutable } from '../core';
4
+ import { AnimatedKeyboardInfo, KeyboardState } from '../commonTypes';
5
+
6
+ export function useAnimatedKeyboard(): AnimatedKeyboardInfo {
7
+ const ref = useRef<AnimatedKeyboardInfo | null>(null);
8
+ const listenerId = useRef<number>(-1);
9
+ const isSubscribed = useRef<boolean>(false);
10
+
11
+ if (ref.current === null) {
12
+ const keyboardEventData: AnimatedKeyboardInfo = {
13
+ state: makeMutable(KeyboardState.UNKNOWN),
14
+ height: makeMutable(0),
15
+ };
16
+ listenerId.current =
17
+ NativeReanimated.subscribeForKeyboardEvents(keyboardEventData);
18
+ ref.current = keyboardEventData;
19
+ isSubscribed.current = true;
20
+ }
21
+ useEffect(() => {
22
+ if (isSubscribed.current === false && ref.current !== null) {
23
+ // subscribe again after Fast Refresh
24
+ listenerId.current = NativeReanimated.subscribeForKeyboardEvents(
25
+ ref.current
26
+ );
27
+ isSubscribed.current = true;
28
+ }
29
+ return () => {
30
+ NativeReanimated.unsubscribeFromKeyboardEvents(listenerId.current);
31
+ isSubscribed.current = false;
32
+ };
33
+ }, []);
34
+ return ref.current;
35
+ }
@@ -12,7 +12,7 @@ export enum SensorType {
12
12
  }
13
13
 
14
14
  export type SensorConfig = {
15
- interval: number;
15
+ interval: number | 'auto';
16
16
  };
17
17
 
18
18
  export type AnimatedSensor = {
@@ -26,7 +26,7 @@ export function useAnimatedSensor(
26
26
  sensorType: SensorType,
27
27
  userConfig?: SensorConfig
28
28
  ): AnimatedSensor {
29
- const ref = useRef({
29
+ const ref = useRef<AnimatedSensor>({
30
30
  sensor: null,
31
31
  unregister: () => {
32
32
  // NOOP
@@ -38,7 +38,7 @@ export function useAnimatedSensor(
38
38
  });
39
39
 
40
40
  if (ref.current.sensor === null) {
41
- ref.current.config = { interval: 10, ...userConfig };
41
+ ref.current.config = { interval: 'auto', ...userConfig };
42
42
  let sensorData;
43
43
  if (sensorType === SensorType.ROTATION) {
44
44
  sensorData = {
@@ -61,10 +61,10 @@ export function useAnimatedSensor(
61
61
  }
62
62
 
63
63
  useEffect(() => {
64
- ref.current.config = { interval: 10, ...userConfig };
64
+ ref.current.config = { interval: 'auto', ...userConfig };
65
65
  const id = NativeReanimated.registerSensor(
66
66
  sensorType,
67
- ref.current.config.interval,
67
+ ref.current.config.interval === 'auto' ? -1 : ref.current.config.interval,
68
68
  ref.current.sensor as any
69
69
  );
70
70
 
@@ -0,0 +1,39 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import FrameCallbackRegistryJS from '../frameCallback/FrameCallbackRegistryJS';
3
+
4
+ export type FrameCallback = {
5
+ setActive: (isActive: boolean) => void;
6
+ isActive: boolean;
7
+ callbackId: number;
8
+ };
9
+ const frameCallbackRegistry = new FrameCallbackRegistryJS();
10
+
11
+ export function useFrameCallback(
12
+ callback: () => void,
13
+ autostart = true
14
+ ): FrameCallback {
15
+ const ref = useRef<FrameCallback>({
16
+ setActive: (isActive: boolean) => {
17
+ frameCallbackRegistry.manageStateFrameCallback(
18
+ ref.current.callbackId,
19
+ isActive
20
+ );
21
+ ref.current.isActive = isActive;
22
+ },
23
+ isActive: autostart,
24
+ callbackId: -1,
25
+ });
26
+
27
+ useEffect(() => {
28
+ ref.current.callbackId =
29
+ frameCallbackRegistry.registerFrameCallback(callback);
30
+ ref.current.setActive(ref.current.isActive);
31
+
32
+ return () => {
33
+ frameCallbackRegistry.unregisterFrameCallback(ref.current.callbackId);
34
+ ref.current.callbackId = -1;
35
+ };
36
+ }, [callback, autostart]);
37
+
38
+ return ref.current;
39
+ }
@@ -167,9 +167,9 @@ const tickTravel = () => {
167
167
  jest.advanceTimersByTime(frameTime);
168
168
  };
169
169
 
170
- export const withReanimatedTimer = (animatonTest) => {
170
+ export const withReanimatedTimer = (animationTest) => {
171
171
  beforeTest();
172
- animatonTest();
172
+ animationTest();
173
173
  afterTest();
174
174
  };
175
175
 
@@ -188,7 +188,15 @@ export const advanceAnimationByFrame = (count) => {
188
188
  };
189
189
 
190
190
  export const setUpTests = (userConfig = {}) => {
191
- const expect = require('expect');
191
+ let expect;
192
+ try {
193
+ expect = require('expect');
194
+ } catch (_) {
195
+ // for Jest in version 28+
196
+ const { expect: expectModule } = require('@jest/globals');
197
+ expect = expectModule;
198
+ }
199
+
192
200
  require('setimmediate');
193
201
  frameTime = Math.round(1000 / config.fps);
194
202
 
@@ -2,7 +2,11 @@ import MapperRegistry from './MapperRegistry';
2
2
  import Mapper from './Mapper';
3
3
  import MutableValue from './MutableValue';
4
4
  import { NativeReanimated } from '../NativeReanimated/NativeReanimated';
5
- import { Timestamp, NestedObjectValues } from '../commonTypes';
5
+ import {
6
+ Timestamp,
7
+ NestedObjectValues,
8
+ AnimatedKeyboardInfo,
9
+ } from '../commonTypes';
6
10
  import { isJest } from '../PlatformChecker';
7
11
 
8
12
  export default class JSReanimated extends NativeReanimated {
@@ -126,4 +130,15 @@ export default class JSReanimated extends NativeReanimated {
126
130
  throw Error('This method can be only use in Jest testing.');
127
131
  }
128
132
  }
133
+
134
+ subscribeForKeyboardEvents(_: AnimatedKeyboardInfo): number {
135
+ console.warn(
136
+ '[Reanimated] useAnimatedKeyboard is not available on web yet.'
137
+ );
138
+ return -1;
139
+ }
140
+
141
+ unsubscribeFromKeyboardEvents(_: number): void {
142
+ // noop
143
+ }
129
144
  }
@@ -1,33 +1,45 @@
1
1
  // In order to keep bundle size down, we treat this file as a polyfill for Web.
2
2
 
3
3
  import { shouldBeUseWeb } from '../PlatformChecker';
4
-
5
- if (shouldBeUseWeb()) {
6
- global._frameTimestamp = null;
7
- global._setGlobalConsole = (_val) => {
8
- // noop
9
- };
10
- global._measure = () => {
11
- console.warn(
12
- "[Reanimated] You can't use `measure` with Chrome Debugger or with web version"
13
- );
14
- return {
15
- x: 0,
16
- y: 0,
17
- width: 0,
18
- height: 0,
19
- pageX: 0,
20
- pageY: 0,
4
+ const initializeGlobalsForWeb = () => {
5
+ if (shouldBeUseWeb()) {
6
+ global._frameTimestamp = null;
7
+ global._setGlobalConsole = (_val) => {
8
+ // noop
9
+ };
10
+ global._measure = () => {
11
+ console.warn(
12
+ "[Reanimated] You can't use `measure` with Chrome Debugger or with web version"
13
+ );
14
+ return {
15
+ x: 0,
16
+ y: 0,
17
+ width: 0,
18
+ height: 0,
19
+ pageX: 0,
20
+ pageY: 0,
21
+ };
22
+ };
23
+ global._scrollTo = () => {
24
+ console.warn(
25
+ "[Reanimated] You can't use `scrollTo` with Chrome Debugger or with web version"
26
+ );
21
27
  };
22
- };
23
- global._scrollTo = () => {
24
- console.warn(
25
- "[Reanimated] You can't use `scrollTo` with Chrome Debugger or with web version"
26
- );
27
- };
28
- global._setGestureState = () => {
29
- console.warn(
30
- "[Reanimated] You can't use `setGestureState` with Chrome Debugger or with web version"
31
- );
32
- };
33
- }
28
+ global._setGestureState = () => {
29
+ console.warn(
30
+ "[Reanimated] You can't use `setGestureState` with Chrome Debugger or with web version"
31
+ );
32
+ };
33
+ }
34
+ return true;
35
+ };
36
+
37
+ /*
38
+ If a file doesn't export anything, tree shaking doesn't pack
39
+ it into the JS bundle. In effect, the code inside of this file
40
+ will never execute. That is why we wrapped initialization code
41
+ into a function, and we call this one during creating
42
+ the module export object.
43
+ */
44
+
45
+ export default initializeGlobalsForWeb();