react-native-reanimated 3.0.0-rc.2 → 3.0.0-rc.3

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 (127) hide show
  1. package/Common/cpp/AnimatedSensor/AnimatedSensorModule.cpp +3 -0
  2. package/Common/cpp/{headers/AnimatedSensor → AnimatedSensor}/AnimatedSensorModule.h +0 -0
  3. package/Common/cpp/Fabric/FabricUtils.cpp +1 -1
  4. package/Common/cpp/{headers/Fabric → Fabric}/FabricUtils.h +0 -0
  5. package/Common/cpp/Fabric/ReanimatedUIManagerBinding.cpp +2 -0
  6. package/Common/cpp/{headers/Fabric → Fabric}/ReanimatedUIManagerBinding.h +0 -0
  7. package/Common/cpp/{headers/Fabric → Fabric}/ShadowTreeCloner.h +1 -1
  8. package/Common/cpp/LayoutAnimations/LayoutAnimationsProxy.cpp +2 -0
  9. package/Common/cpp/{headers/LayoutAnimations → LayoutAnimations}/LayoutAnimationsProxy.h +0 -0
  10. package/Common/cpp/NativeModules/NativeReanimatedModule.cpp +1 -0
  11. package/Common/cpp/{headers/NativeModules → NativeModules}/NativeReanimatedModule.h +5 -0
  12. package/Common/cpp/NativeModules/NativeReanimatedModuleSpec.cpp +2 -0
  13. package/Common/cpp/{headers/NativeModules → NativeModules}/NativeReanimatedModuleSpec.h +1 -1
  14. package/Common/cpp/ReanimatedRuntime/ReanimatedHermesRuntime.cpp +93 -0
  15. package/Common/cpp/ReanimatedRuntime/ReanimatedHermesRuntime.h +125 -0
  16. package/Common/cpp/ReanimatedRuntime/ReanimatedRuntime.cpp +50 -0
  17. package/Common/cpp/ReanimatedRuntime/ReanimatedRuntime.h +27 -0
  18. package/Common/cpp/ReanimatedRuntime/RuntimeInitialization.md +194 -0
  19. package/Common/cpp/{headers/Registries → Registries}/EventHandlerRegistry.h +0 -0
  20. package/Common/cpp/Registries/MapperRegistry.cpp +3 -1
  21. package/Common/cpp/{headers/Registries → Registries}/MapperRegistry.h +0 -0
  22. package/Common/cpp/{headers/Registries → Registries}/NewestShadowNodesRegistry.h +0 -0
  23. package/Common/cpp/Registries/WorkletsCache.cpp +8 -1
  24. package/Common/cpp/{headers/Registries → Registries}/WorkletsCache.h +0 -0
  25. package/Common/cpp/{headers/SharedItems → SharedItems}/FrozenObject.h +0 -0
  26. package/Common/cpp/{headers/SharedItems → SharedItems}/HostFunctionHandler.h +0 -0
  27. package/Common/cpp/SharedItems/MutableValue.cpp +2 -0
  28. package/Common/cpp/{headers/SharedItems → SharedItems}/MutableValue.h +0 -0
  29. package/Common/cpp/{headers/SharedItems → SharedItems}/MutableValueSetterProxy.h +0 -0
  30. package/Common/cpp/{headers/SharedItems → SharedItems}/RemoteObject.h +0 -0
  31. package/Common/cpp/{headers/SharedItems → SharedItems}/RuntimeManager.h +0 -0
  32. package/Common/cpp/SharedItems/ShareableValue.cpp +6 -0
  33. package/Common/cpp/{headers/SharedItems → SharedItems}/ShareableValue.h +0 -0
  34. package/Common/cpp/{headers/SharedItems → SharedItems}/SharedParent.h +0 -0
  35. package/Common/cpp/{headers/SharedItems → SharedItems}/ValueWrapper.h +0 -0
  36. package/Common/cpp/{headers/SpecTools → SpecTools}/ErrorHandler.h +0 -0
  37. package/Common/cpp/{headers/Tools → Tools}/FeaturesConfig.h +0 -0
  38. package/Common/cpp/Tools/JSIStoreValueUser.cpp +2 -2
  39. package/Common/cpp/{headers/Tools → Tools}/JSIStoreValueUser.h +0 -0
  40. package/Common/cpp/{headers/Tools → Tools}/Mapper.h +0 -0
  41. package/Common/cpp/{headers/Tools → Tools}/PlatformDepMethodsHolder.h +0 -0
  42. package/Common/cpp/{headers/Tools → Tools}/ReanimatedHiddenHeaders.h +1 -1
  43. package/Common/cpp/{headers/Tools → Tools}/RuntimeDecorator.h +0 -0
  44. package/Common/cpp/{headers/Tools → Tools}/Scheduler.h +0 -0
  45. package/Common/cpp/Tools/SingleInstanceChecker.h +58 -0
  46. package/Common/cpp/{headers/Tools → Tools}/WorkletEventHandler.h +0 -0
  47. package/RNReanimated.podspec +25 -23
  48. package/android/CMakeLists.txt +41 -38
  49. package/android/build.gradle +91 -72
  50. package/android/src/fabric/java/com/swmansion/reanimated/NativeProxy.java +10 -8
  51. package/android/src/main/cpp/{headers/AndroidErrorHandler.h → AndroidErrorHandler.h} +0 -0
  52. package/android/src/main/cpp/AndroidLogger.cpp +4 -1
  53. package/android/src/main/cpp/{headers/AndroidLogger.h → AndroidLogger.h} +0 -0
  54. package/android/src/main/cpp/{headers/AndroidScheduler.h → AndroidScheduler.h} +0 -0
  55. package/android/src/main/cpp/{headers/JNIHelper.h → JNIHelper.h} +0 -0
  56. package/android/src/main/cpp/{headers/LayoutAnimations.h → LayoutAnimations.h} +0 -0
  57. package/android/src/main/cpp/NativeProxy.cpp +12 -28
  58. package/android/src/main/cpp/{headers/NativeProxy.h → NativeProxy.h} +3 -1
  59. package/android/src/main/cpp/{headers/TurboModule.h → TurboModule.h} +0 -0
  60. package/android/src/main/java/com/swmansion/reanimated/ReanimatedMessageQueueThread.java +77 -0
  61. package/android/src/main/java/com/swmansion/reanimated/keyboardObserver/ReanimatedKeyboardEventListener.java +2 -1
  62. package/android/src/paper/java/com/swmansion/reanimated/NativeProxy.java +7 -7
  63. package/ios/REAModule.mm +10 -0
  64. package/ios/native/NativeProxy.mm +12 -19
  65. package/ios/native/REAInitializer.h +2 -2
  66. package/ios/native/REAInitializer.mm +2 -2
  67. package/ios/native/REAMessageThread.h +22 -0
  68. package/ios/native/REAMessageThread.mm +38 -0
  69. package/ios/native/UIResponder+Reanimated.mm +1 -1
  70. package/lib/commonjs/reanimated2/NativeMethods.js +20 -24
  71. package/lib/commonjs/reanimated2/NativeMethods.js.map +1 -1
  72. package/lib/commonjs/reanimated2/animation/delay.js +0 -12
  73. package/lib/commonjs/reanimated2/animation/delay.js.map +1 -1
  74. package/lib/commonjs/reanimated2/animation/repeat.js +0 -24
  75. package/lib/commonjs/reanimated2/animation/repeat.js.map +1 -1
  76. package/lib/commonjs/reanimated2/animation/sequence.js +0 -12
  77. package/lib/commonjs/reanimated2/animation/sequence.js.map +1 -1
  78. package/lib/commonjs/reanimated2/commonTypes.js.map +1 -1
  79. package/lib/commonjs/reanimated2/frameCallback/FrameCallbackRegistryJS.js +4 -4
  80. package/lib/commonjs/reanimated2/frameCallback/FrameCallbackRegistryJS.js.map +1 -1
  81. package/lib/commonjs/reanimated2/frameCallback/FrameCallbackRegistryUI.js +51 -19
  82. package/lib/commonjs/reanimated2/frameCallback/FrameCallbackRegistryUI.js.map +1 -1
  83. package/lib/commonjs/reanimated2/hook/index.js +8 -0
  84. package/lib/commonjs/reanimated2/hook/index.js.map +1 -1
  85. package/lib/commonjs/reanimated2/hook/useAnimatedScrollHandler.js.map +1 -1
  86. package/lib/commonjs/reanimated2/hook/useFrameCallback.js.map +1 -1
  87. package/lib/commonjs/reanimated2/hook/useScrollViewOffset.js +31 -0
  88. package/lib/commonjs/reanimated2/hook/useScrollViewOffset.js.map +1 -0
  89. package/lib/commonjs/reanimated2/utils.js +12 -3
  90. package/lib/commonjs/reanimated2/utils.js.map +1 -1
  91. package/lib/module/reanimated2/NativeMethods.js +20 -24
  92. package/lib/module/reanimated2/NativeMethods.js.map +1 -1
  93. package/lib/module/reanimated2/animation/delay.js +0 -10
  94. package/lib/module/reanimated2/animation/delay.js.map +1 -1
  95. package/lib/module/reanimated2/animation/repeat.js +0 -20
  96. package/lib/module/reanimated2/animation/repeat.js.map +1 -1
  97. package/lib/module/reanimated2/animation/sequence.js +0 -10
  98. package/lib/module/reanimated2/animation/sequence.js.map +1 -1
  99. package/lib/module/reanimated2/commonTypes.js.map +1 -1
  100. package/lib/module/reanimated2/frameCallback/FrameCallbackRegistryJS.js +4 -4
  101. package/lib/module/reanimated2/frameCallback/FrameCallbackRegistryJS.js.map +1 -1
  102. package/lib/module/reanimated2/frameCallback/FrameCallbackRegistryUI.js +51 -19
  103. package/lib/module/reanimated2/frameCallback/FrameCallbackRegistryUI.js.map +1 -1
  104. package/lib/module/reanimated2/hook/index.js +1 -0
  105. package/lib/module/reanimated2/hook/index.js.map +1 -1
  106. package/lib/module/reanimated2/hook/useAnimatedScrollHandler.js.map +1 -1
  107. package/lib/module/reanimated2/hook/useFrameCallback.js.map +1 -1
  108. package/lib/module/reanimated2/hook/useScrollViewOffset.js +20 -0
  109. package/lib/module/reanimated2/hook/useScrollViewOffset.js.map +1 -0
  110. package/lib/module/reanimated2/utils.js +13 -3
  111. package/lib/module/reanimated2/utils.js.map +1 -1
  112. package/package.json +6 -4
  113. package/plugin.js +105 -47
  114. package/react-native-reanimated.d.ts +13 -9
  115. package/src/reanimated2/NativeMethods.ts +28 -33
  116. package/src/reanimated2/animation/delay.ts +0 -12
  117. package/src/reanimated2/animation/repeat.ts +0 -25
  118. package/src/reanimated2/animation/sequence.ts +0 -13
  119. package/src/reanimated2/commonTypes.ts +9 -0
  120. package/src/reanimated2/frameCallback/FrameCallbackRegistryJS.ts +6 -9
  121. package/src/reanimated2/frameCallback/FrameCallbackRegistryUI.ts +78 -27
  122. package/src/reanimated2/hook/index.ts +1 -0
  123. package/src/reanimated2/hook/useAnimatedScrollHandler.ts +3 -1
  124. package/src/reanimated2/hook/useFrameCallback.ts +2 -1
  125. package/src/reanimated2/hook/useScrollViewOffset.ts +36 -0
  126. package/src/reanimated2/utils.ts +12 -5
  127. package/android/src/main/java/com/swmansion/reanimated/ReanimatedJSIModulePackage.java +0 -29
@@ -4,48 +4,80 @@ export const prepareUIRegistry = runOnUI(() => {
4
4
 
5
5
  const frameCallbackRegistry = {
6
6
  frameCallbackRegistry: new Map(),
7
- frameCallbackActive: new Set(),
8
- isFrameCallbackRunning: false,
7
+ activeFrameCallbacks: new Set(),
8
+ previousFrameTimestamp: null,
9
9
 
10
10
  runCallbacks() {
11
- const loop = () => {
12
- this.frameCallbackActive.forEach(key => {
13
- const callback = this.frameCallbackRegistry.get(key);
14
- callback();
11
+ const loop = timestamp => {
12
+ if (this.previousFrameTimestamp === null) {
13
+ this.previousFrameTimestamp = timestamp;
14
+ }
15
+
16
+ const delta = timestamp - this.previousFrameTimestamp;
17
+ this.activeFrameCallbacks.forEach(callbackId => {
18
+ const callbackDetails = this.frameCallbackRegistry.get(callbackId);
19
+ const {
20
+ startTime
21
+ } = callbackDetails;
22
+
23
+ if (startTime === null) {
24
+ // First frame
25
+ callbackDetails.startTime = timestamp;
26
+ callbackDetails.callback({
27
+ timestamp,
28
+ timeSincePreviousFrame: null,
29
+ timeSinceFirstFrame: 0
30
+ });
31
+ } else {
32
+ // Next frame
33
+ callbackDetails.callback({
34
+ timestamp,
35
+ timeSincePreviousFrame: delta,
36
+ timeSinceFirstFrame: timestamp - startTime
37
+ });
38
+ }
15
39
  });
16
40
 
17
- if (this.frameCallbackActive.size > 0) {
41
+ if (this.activeFrameCallbacks.size > 0) {
42
+ this.previousFrameTimestamp = timestamp;
18
43
  requestAnimationFrame(loop);
19
44
  } else {
20
- this.isFrameCallbackRunning = false;
45
+ this.previousFrameTimestamp = null;
21
46
  }
22
- };
47
+ }; // runCallback() should only be called after registering a callback,
48
+ // so if there is only one active callback, then it means that there were
49
+ // zero previously and the loop isn't running yet.
50
+
23
51
 
24
- if (!this.isFrameCallbackRunning) {
52
+ if (this.activeFrameCallbacks.size === 1) {
25
53
  requestAnimationFrame(loop);
26
- this.isFrameCallbackRunning = true;
27
54
  }
28
55
  },
29
56
 
30
57
  registerFrameCallback(callback, callbackId) {
31
- this.frameCallbackRegistry.set(callbackId, callback);
58
+ this.frameCallbackRegistry.set(callbackId, {
59
+ callback: callback,
60
+ startTime: null
61
+ });
32
62
  },
33
63
 
34
- unregisterFrameCallback(frameCallbackId) {
35
- this.manageStateFrameCallback(frameCallbackId, false);
36
- this.frameCallbackRegistry.delete(frameCallbackId);
64
+ unregisterFrameCallback(callbackId) {
65
+ this.manageStateFrameCallback(callbackId, false);
66
+ this.frameCallbackRegistry.delete(callbackId);
37
67
  },
38
68
 
39
- manageStateFrameCallback(frameCallbackId, state) {
40
- if (frameCallbackId === -1) {
69
+ manageStateFrameCallback(callbackId, state) {
70
+ if (callbackId === -1) {
41
71
  return;
42
72
  }
43
73
 
44
74
  if (state) {
45
- this.frameCallbackActive.add(frameCallbackId);
75
+ this.activeFrameCallbacks.add(callbackId);
46
76
  this.runCallbacks();
47
77
  } else {
48
- this.frameCallbackActive.delete(frameCallbackId);
78
+ const callback = this.frameCallbackRegistry.get(callbackId);
79
+ callback.startTime = null;
80
+ this.activeFrameCallbacks.delete(callbackId);
49
81
  }
50
82
  }
51
83
 
@@ -1 +1 @@
1
- {"version":3,"names":["runOnUI","prepareUIRegistry","frameCallbackRegistry","Map","frameCallbackActive","Set","isFrameCallbackRunning","runCallbacks","loop","forEach","key","callback","get","size","requestAnimationFrame","registerFrameCallback","callbackId","set","unregisterFrameCallback","frameCallbackId","manageStateFrameCallback","delete","state","add","global","_frameCallbackRegistry"],"sources":["FrameCallbackRegistryUI.ts"],"sourcesContent":["import { runOnUI } from '../core';\n\nexport default interface FrameCallbackRegistryUI {\n frameCallbackRegistry: Map<number, () => void>;\n frameCallbackActive: Set<number>;\n isFrameCallbackRunning: boolean;\n runCallbacks: () => void;\n registerFrameCallback: (callback: () => void, callbackId: number) => void;\n unregisterFrameCallback: (frameCallbackId: number) => void;\n manageStateFrameCallback: (frameCallbackId: number, state: boolean) => void;\n}\n\nexport const prepareUIRegistry = runOnUI(() => {\n 'worklet';\n\n const frameCallbackRegistry: FrameCallbackRegistryUI = {\n frameCallbackRegistry: new Map<number, () => void>(),\n frameCallbackActive: new Set<number>(),\n isFrameCallbackRunning: false,\n\n runCallbacks() {\n const loop = () => {\n this.frameCallbackActive.forEach((key: number) => {\n const callback = this.frameCallbackRegistry.get(key);\n callback!();\n });\n\n if (this.frameCallbackActive.size > 0) {\n requestAnimationFrame(loop);\n } else {\n this.isFrameCallbackRunning = false;\n }\n };\n\n if (!this.isFrameCallbackRunning) {\n requestAnimationFrame(loop);\n this.isFrameCallbackRunning = true;\n }\n },\n\n registerFrameCallback(callback: () => void, callbackId: number) {\n this.frameCallbackRegistry.set(callbackId, callback);\n },\n\n unregisterFrameCallback(frameCallbackId: number) {\n this.manageStateFrameCallback(frameCallbackId, false);\n this.frameCallbackRegistry.delete(frameCallbackId);\n },\n\n manageStateFrameCallback(frameCallbackId: number, state: boolean) {\n if (frameCallbackId === -1) {\n return;\n }\n if (state) {\n this.frameCallbackActive.add(frameCallbackId);\n this.runCallbacks();\n } else {\n this.frameCallbackActive.delete(frameCallbackId);\n }\n },\n };\n\n global._frameCallbackRegistry = frameCallbackRegistry;\n});\n"],"mappings":"AAAA,SAASA,OAAT,QAAwB,SAAxB;AAYA,OAAO,MAAMC,iBAAiB,GAAGD,OAAO,CAAC,MAAM;EAC7C;;EAEA,MAAME,qBAA8C,GAAG;IACrDA,qBAAqB,EAAE,IAAIC,GAAJ,EAD8B;IAErDC,mBAAmB,EAAE,IAAIC,GAAJ,EAFgC;IAGrDC,sBAAsB,EAAE,KAH6B;;IAKrDC,YAAY,GAAG;MACb,MAAMC,IAAI,GAAG,MAAM;QACjB,KAAKJ,mBAAL,CAAyBK,OAAzB,CAAkCC,GAAD,IAAiB;UAChD,MAAMC,QAAQ,GAAG,KAAKT,qBAAL,CAA2BU,GAA3B,CAA+BF,GAA/B,CAAjB;UACAC,QAAQ;QACT,CAHD;;QAKA,IAAI,KAAKP,mBAAL,CAAyBS,IAAzB,GAAgC,CAApC,EAAuC;UACrCC,qBAAqB,CAACN,IAAD,CAArB;QACD,CAFD,MAEO;UACL,KAAKF,sBAAL,GAA8B,KAA9B;QACD;MACF,CAXD;;MAaA,IAAI,CAAC,KAAKA,sBAAV,EAAkC;QAChCQ,qBAAqB,CAACN,IAAD,CAArB;QACA,KAAKF,sBAAL,GAA8B,IAA9B;MACD;IACF,CAvBoD;;IAyBrDS,qBAAqB,CAACJ,QAAD,EAAuBK,UAAvB,EAA2C;MAC9D,KAAKd,qBAAL,CAA2Be,GAA3B,CAA+BD,UAA/B,EAA2CL,QAA3C;IACD,CA3BoD;;IA6BrDO,uBAAuB,CAACC,eAAD,EAA0B;MAC/C,KAAKC,wBAAL,CAA8BD,eAA9B,EAA+C,KAA/C;MACA,KAAKjB,qBAAL,CAA2BmB,MAA3B,CAAkCF,eAAlC;IACD,CAhCoD;;IAkCrDC,wBAAwB,CAACD,eAAD,EAA0BG,KAA1B,EAA0C;MAChE,IAAIH,eAAe,KAAK,CAAC,CAAzB,EAA4B;QAC1B;MACD;;MACD,IAAIG,KAAJ,EAAW;QACT,KAAKlB,mBAAL,CAAyBmB,GAAzB,CAA6BJ,eAA7B;QACA,KAAKZ,YAAL;MACD,CAHD,MAGO;QACL,KAAKH,mBAAL,CAAyBiB,MAAzB,CAAgCF,eAAhC;MACD;IACF;;EA5CoD,CAAvD;EA+CAK,MAAM,CAACC,sBAAP,GAAgCvB,qBAAhC;AACD,CAnDuC,CAAjC"}
1
+ {"version":3,"names":["runOnUI","prepareUIRegistry","frameCallbackRegistry","Map","activeFrameCallbacks","Set","previousFrameTimestamp","runCallbacks","loop","timestamp","delta","forEach","callbackId","callbackDetails","get","startTime","callback","timeSincePreviousFrame","timeSinceFirstFrame","size","requestAnimationFrame","registerFrameCallback","set","unregisterFrameCallback","manageStateFrameCallback","delete","state","add","global","_frameCallbackRegistry"],"sources":["FrameCallbackRegistryUI.ts"],"sourcesContent":["import { runOnUI } from '../core';\n\ntype CallbackDetails = {\n callback: (frameInfo: FrameInfo) => void;\n startTime: number | null;\n};\n\nexport type FrameInfo = {\n timestamp: number;\n timeSincePreviousFrame: number | null;\n timeSinceFirstFrame: number;\n};\n\ninterface FrameCallbackRegistryUI {\n frameCallbackRegistry: Map<number, CallbackDetails>;\n activeFrameCallbacks: Set<number>;\n previousFrameTimestamp: number | null;\n runCallbacks: () => void;\n registerFrameCallback: (\n callback: (frameInfo: FrameInfo) => void,\n callbackId: number\n ) => void;\n unregisterFrameCallback: (callbackId: number) => void;\n manageStateFrameCallback: (callbackId: number, state: boolean) => void;\n}\n\nexport const prepareUIRegistry = runOnUI(() => {\n 'worklet';\n\n const frameCallbackRegistry: FrameCallbackRegistryUI = {\n frameCallbackRegistry: new Map<number, CallbackDetails>(),\n activeFrameCallbacks: new Set<number>(),\n previousFrameTimestamp: null,\n\n runCallbacks() {\n const loop = (timestamp: number) => {\n if (this.previousFrameTimestamp === null) {\n this.previousFrameTimestamp = timestamp;\n }\n\n const delta = timestamp - this.previousFrameTimestamp;\n\n this.activeFrameCallbacks.forEach((callbackId: number) => {\n const callbackDetails = this.frameCallbackRegistry.get(callbackId)!;\n\n const { startTime } = callbackDetails;\n\n if (startTime === null) {\n // First frame\n callbackDetails.startTime = timestamp;\n\n callbackDetails.callback({\n timestamp,\n timeSincePreviousFrame: null,\n timeSinceFirstFrame: 0,\n });\n } else {\n // Next frame\n callbackDetails.callback({\n timestamp,\n timeSincePreviousFrame: delta,\n timeSinceFirstFrame: timestamp - startTime,\n });\n }\n });\n\n if (this.activeFrameCallbacks.size > 0) {\n this.previousFrameTimestamp = timestamp;\n requestAnimationFrame(loop);\n } else {\n this.previousFrameTimestamp = null;\n }\n };\n\n // runCallback() should only be called after registering a callback,\n // so if there is only one active callback, then it means that there were\n // zero previously and the loop isn't running yet.\n if (this.activeFrameCallbacks.size === 1) {\n requestAnimationFrame(loop);\n }\n },\n\n registerFrameCallback(\n callback: (frameInfo: FrameInfo) => void,\n callbackId: number\n ) {\n this.frameCallbackRegistry.set(callbackId, {\n callback: callback,\n startTime: null,\n });\n },\n\n unregisterFrameCallback(callbackId: number) {\n this.manageStateFrameCallback(callbackId, false);\n this.frameCallbackRegistry.delete(callbackId);\n },\n\n manageStateFrameCallback(callbackId: number, state: boolean) {\n if (callbackId === -1) {\n return;\n }\n if (state) {\n this.activeFrameCallbacks.add(callbackId);\n this.runCallbacks();\n } else {\n const callback = this.frameCallbackRegistry.get(callbackId)!;\n callback.startTime = null;\n\n this.activeFrameCallbacks.delete(callbackId);\n }\n },\n };\n\n global._frameCallbackRegistry = frameCallbackRegistry;\n});\n"],"mappings":"AAAA,SAASA,OAAT,QAAwB,SAAxB;AA0BA,OAAO,MAAMC,iBAAiB,GAAGD,OAAO,CAAC,MAAM;EAC7C;;EAEA,MAAME,qBAA8C,GAAG;IACrDA,qBAAqB,EAAE,IAAIC,GAAJ,EAD8B;IAErDC,oBAAoB,EAAE,IAAIC,GAAJ,EAF+B;IAGrDC,sBAAsB,EAAE,IAH6B;;IAKrDC,YAAY,GAAG;MACb,MAAMC,IAAI,GAAIC,SAAD,IAAuB;QAClC,IAAI,KAAKH,sBAAL,KAAgC,IAApC,EAA0C;UACxC,KAAKA,sBAAL,GAA8BG,SAA9B;QACD;;QAED,MAAMC,KAAK,GAAGD,SAAS,GAAG,KAAKH,sBAA/B;QAEA,KAAKF,oBAAL,CAA0BO,OAA1B,CAAmCC,UAAD,IAAwB;UACxD,MAAMC,eAAe,GAAG,KAAKX,qBAAL,CAA2BY,GAA3B,CAA+BF,UAA/B,CAAxB;UAEA,MAAM;YAAEG;UAAF,IAAgBF,eAAtB;;UAEA,IAAIE,SAAS,KAAK,IAAlB,EAAwB;YACtB;YACAF,eAAe,CAACE,SAAhB,GAA4BN,SAA5B;YAEAI,eAAe,CAACG,QAAhB,CAAyB;cACvBP,SADuB;cAEvBQ,sBAAsB,EAAE,IAFD;cAGvBC,mBAAmB,EAAE;YAHE,CAAzB;UAKD,CATD,MASO;YACL;YACAL,eAAe,CAACG,QAAhB,CAAyB;cACvBP,SADuB;cAEvBQ,sBAAsB,EAAEP,KAFD;cAGvBQ,mBAAmB,EAAET,SAAS,GAAGM;YAHV,CAAzB;UAKD;QACF,CAtBD;;QAwBA,IAAI,KAAKX,oBAAL,CAA0Be,IAA1B,GAAiC,CAArC,EAAwC;UACtC,KAAKb,sBAAL,GAA8BG,SAA9B;UACAW,qBAAqB,CAACZ,IAAD,CAArB;QACD,CAHD,MAGO;UACL,KAAKF,sBAAL,GAA8B,IAA9B;QACD;MACF,CArCD,CADa,CAwCb;MACA;MACA;;;MACA,IAAI,KAAKF,oBAAL,CAA0Be,IAA1B,KAAmC,CAAvC,EAA0C;QACxCC,qBAAqB,CAACZ,IAAD,CAArB;MACD;IACF,CAnDoD;;IAqDrDa,qBAAqB,CACnBL,QADmB,EAEnBJ,UAFmB,EAGnB;MACA,KAAKV,qBAAL,CAA2BoB,GAA3B,CAA+BV,UAA/B,EAA2C;QACzCI,QAAQ,EAAEA,QAD+B;QAEzCD,SAAS,EAAE;MAF8B,CAA3C;IAID,CA7DoD;;IA+DrDQ,uBAAuB,CAACX,UAAD,EAAqB;MAC1C,KAAKY,wBAAL,CAA8BZ,UAA9B,EAA0C,KAA1C;MACA,KAAKV,qBAAL,CAA2BuB,MAA3B,CAAkCb,UAAlC;IACD,CAlEoD;;IAoErDY,wBAAwB,CAACZ,UAAD,EAAqBc,KAArB,EAAqC;MAC3D,IAAId,UAAU,KAAK,CAAC,CAApB,EAAuB;QACrB;MACD;;MACD,IAAIc,KAAJ,EAAW;QACT,KAAKtB,oBAAL,CAA0BuB,GAA1B,CAA8Bf,UAA9B;QACA,KAAKL,YAAL;MACD,CAHD,MAGO;QACL,MAAMS,QAAQ,GAAG,KAAKd,qBAAL,CAA2BY,GAA3B,CAA+BF,UAA/B,CAAjB;QACAI,QAAQ,CAACD,SAAT,GAAqB,IAArB;QAEA,KAAKX,oBAAL,CAA0BqB,MAA1B,CAAiCb,UAAjC;MACD;IACF;;EAjFoD,CAAvD;EAoFAgB,MAAM,CAACC,sBAAP,GAAgC3B,qBAAhC;AACD,CAxFuC,CAAjC"}
@@ -9,4 +9,5 @@ export { useDerivedValue } from './useDerivedValue';
9
9
  export { useAnimatedSensor, SensorType } from './useAnimatedSensor';
10
10
  export { useFrameCallback } from './useFrameCallback';
11
11
  export { useAnimatedKeyboard } from './useAnimatedKeyboard';
12
+ export { useScrollViewOffset } from './useScrollViewOffset';
12
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useAnimatedProps","useEvent","useHandler","useWorkletCallback","useSharedValue","useAnimatedStyle","useAnimatedGestureHandler","useAnimatedReaction","useAnimatedRef","useAnimatedScrollHandler","useDerivedValue","useAnimatedSensor","SensorType","useFrameCallback","useAnimatedKeyboard"],"sources":["index.ts"],"sourcesContent":["export type { DependencyList } from './commonTypes';\nexport {\n useAnimatedProps,\n useEvent,\n useHandler,\n useWorkletCallback,\n} from './Hooks';\nexport { useSharedValue } from './useSharedValue';\nexport { useAnimatedStyle } from './useAnimatedStyle';\nexport type { AnimatedStyleResult } from './useAnimatedStyle';\nexport { useAnimatedGestureHandler } from './useAnimatedGestureHandler';\nexport type {\n GestureHandlerEvent,\n GestureHandlers,\n} from './useAnimatedGestureHandler';\nexport { useAnimatedReaction } from './useAnimatedReaction';\nexport type { AnimatedReactionWorkletFunction } from './useAnimatedReaction';\nexport { useAnimatedRef } from './useAnimatedRef';\nexport { useAnimatedScrollHandler } from './useAnimatedScrollHandler';\nexport type { ScrollHandler, ScrollHandlers } from './useAnimatedScrollHandler';\nexport { useDerivedValue } from './useDerivedValue';\nexport type { DerivedValue } from './useDerivedValue';\nexport { useAnimatedSensor, SensorType } from './useAnimatedSensor';\nexport { useFrameCallback } from './useFrameCallback';\nexport type { FrameCallback } from './useFrameCallback';\nexport { useAnimatedKeyboard } from './useAnimatedKeyboard';\n"],"mappings":"AACA,SACEA,gBADF,EAEEC,QAFF,EAGEC,UAHF,EAIEC,kBAJF,QAKO,SALP;AAMA,SAASC,cAAT,QAA+B,kBAA/B;AACA,SAASC,gBAAT,QAAiC,oBAAjC;AAEA,SAASC,yBAAT,QAA0C,6BAA1C;AAKA,SAASC,mBAAT,QAAoC,uBAApC;AAEA,SAASC,cAAT,QAA+B,kBAA/B;AACA,SAASC,wBAAT,QAAyC,4BAAzC;AAEA,SAASC,eAAT,QAAgC,mBAAhC;AAEA,SAASC,iBAAT,EAA4BC,UAA5B,QAA8C,qBAA9C;AACA,SAASC,gBAAT,QAAiC,oBAAjC;AAEA,SAASC,mBAAT,QAAoC,uBAApC"}
1
+ {"version":3,"names":["useAnimatedProps","useEvent","useHandler","useWorkletCallback","useSharedValue","useAnimatedStyle","useAnimatedGestureHandler","useAnimatedReaction","useAnimatedRef","useAnimatedScrollHandler","useDerivedValue","useAnimatedSensor","SensorType","useFrameCallback","useAnimatedKeyboard","useScrollViewOffset"],"sources":["index.ts"],"sourcesContent":["export type { DependencyList } from './commonTypes';\nexport {\n useAnimatedProps,\n useEvent,\n useHandler,\n useWorkletCallback,\n} from './Hooks';\nexport { useSharedValue } from './useSharedValue';\nexport { useAnimatedStyle } from './useAnimatedStyle';\nexport type { AnimatedStyleResult } from './useAnimatedStyle';\nexport { useAnimatedGestureHandler } from './useAnimatedGestureHandler';\nexport type {\n GestureHandlerEvent,\n GestureHandlers,\n} from './useAnimatedGestureHandler';\nexport { useAnimatedReaction } from './useAnimatedReaction';\nexport type { AnimatedReactionWorkletFunction } from './useAnimatedReaction';\nexport { useAnimatedRef } from './useAnimatedRef';\nexport { useAnimatedScrollHandler } from './useAnimatedScrollHandler';\nexport type { ScrollHandler, ScrollHandlers } from './useAnimatedScrollHandler';\nexport { useDerivedValue } from './useDerivedValue';\nexport type { DerivedValue } from './useDerivedValue';\nexport { useAnimatedSensor, SensorType } from './useAnimatedSensor';\nexport { useFrameCallback } from './useFrameCallback';\nexport type { FrameCallback } from './useFrameCallback';\nexport { useAnimatedKeyboard } from './useAnimatedKeyboard';\nexport { useScrollViewOffset } from './useScrollViewOffset';\n"],"mappings":"AACA,SACEA,gBADF,EAEEC,QAFF,EAGEC,UAHF,EAIEC,kBAJF,QAKO,SALP;AAMA,SAASC,cAAT,QAA+B,kBAA/B;AACA,SAASC,gBAAT,QAAiC,oBAAjC;AAEA,SAASC,yBAAT,QAA0C,6BAA1C;AAKA,SAASC,mBAAT,QAAoC,uBAApC;AAEA,SAASC,cAAT,QAA+B,kBAA/B;AACA,SAASC,wBAAT,QAAyC,4BAAzC;AAEA,SAASC,eAAT,QAAgC,mBAAhC;AAEA,SAASC,iBAAT,EAA4BC,UAA5B,QAA8C,qBAA9C;AACA,SAASC,gBAAT,QAAiC,oBAAjC;AAEA,SAASC,mBAAT,QAAoC,uBAApC;AACA,SAASC,mBAAT,QAAoC,uBAApC"}
@@ -1 +1 @@
1
- {"version":3,"names":["useEvent","useHandler","useAnimatedScrollHandler","handlers","dependencies","scrollHandlers","onScroll","context","doDependenciesDiffer","subscribeForEvents","onBeginDrag","undefined","push","onEndDrag","onMomentumBegin","onMomentumEnd","event","eventName","endsWith"],"sources":["useAnimatedScrollHandler.ts"],"sourcesContent":["import { RefObject } from 'react';\nimport { NativeScrollEvent } from 'react-native';\nimport { Context, NativeEvent, WorkletFunction } from '../commonTypes';\nimport WorkletEventHandler from '../WorkletEventHandler';\nimport { DependencyList } from './commonTypes';\nimport { useEvent, useHandler } from './Hooks';\n\nexport interface ScrollHandler<TContext extends Context>\n extends WorkletFunction {\n (event: NativeScrollEvent, context?: TContext): void;\n}\n\ninterface ScrollEvent extends NativeScrollEvent, NativeEvent<ScrollEvent> {\n eventName: string;\n}\nexport interface ScrollHandlers<TContext extends Context> {\n [key: string]: ScrollHandler<TContext> | undefined;\n onScroll?: ScrollHandler<TContext>;\n onBeginDrag?: ScrollHandler<TContext>;\n onEndDrag?: ScrollHandler<TContext>;\n onMomentumBegin?: ScrollHandler<TContext>;\n onMomentumEnd?: ScrollHandler<TContext>;\n}\n\nexport function useAnimatedScrollHandler<TContext extends Context>(\n handlers: ScrollHandlers<TContext> | ScrollHandler<TContext>,\n dependencies?: DependencyList\n): RefObject<WorkletEventHandler<ScrollEvent>> {\n // case when handlers is a function\n const scrollHandlers: ScrollHandlers<TContext> =\n typeof handlers === 'function' ? { onScroll: handlers } : handlers;\n const { context, doDependenciesDiffer } = useHandler<ScrollEvent, TContext>(\n scrollHandlers,\n dependencies\n );\n\n // build event subscription array\n const subscribeForEvents = ['onScroll'];\n if (scrollHandlers.onBeginDrag !== undefined) {\n subscribeForEvents.push('onScrollBeginDrag');\n }\n if (scrollHandlers.onEndDrag !== undefined) {\n subscribeForEvents.push('onScrollEndDrag');\n }\n if (scrollHandlers.onMomentumBegin !== undefined) {\n subscribeForEvents.push('onMomentumScrollBegin');\n }\n if (scrollHandlers.onMomentumEnd !== undefined) {\n subscribeForEvents.push('onMomentumScrollEnd');\n }\n\n return useEvent<ScrollEvent>(\n (event: ScrollEvent) => {\n 'worklet';\n const {\n onScroll,\n onBeginDrag,\n onEndDrag,\n onMomentumBegin,\n onMomentumEnd,\n } = scrollHandlers;\n if (onScroll && event.eventName.endsWith('onScroll')) {\n onScroll(event, context);\n } else if (onBeginDrag && event.eventName.endsWith('onScrollBeginDrag')) {\n onBeginDrag(event, context);\n } else if (onEndDrag && event.eventName.endsWith('onScrollEndDrag')) {\n onEndDrag(event, context);\n } else if (\n onMomentumBegin &&\n event.eventName.endsWith('onMomentumScrollBegin')\n ) {\n onMomentumBegin(event, context);\n } else if (\n onMomentumEnd &&\n event.eventName.endsWith('onMomentumScrollEnd')\n ) {\n onMomentumEnd(event, context);\n }\n },\n subscribeForEvents,\n doDependenciesDiffer\n );\n}\n"],"mappings":"AAKA,SAASA,QAAT,EAAmBC,UAAnB,QAAqC,SAArC;AAmBA,OAAO,SAASC,wBAAT,CACLC,QADK,EAELC,YAFK,EAGwC;EAC7C;EACA,MAAMC,cAAwC,GAC5C,OAAOF,QAAP,KAAoB,UAApB,GAAiC;IAAEG,QAAQ,EAAEH;EAAZ,CAAjC,GAA0DA,QAD5D;EAEA,MAAM;IAAEI,OAAF;IAAWC;EAAX,IAAoCP,UAAU,CAClDI,cADkD,EAElDD,YAFkD,CAApD,CAJ6C,CAS7C;;EACA,MAAMK,kBAAkB,GAAG,CAAC,UAAD,CAA3B;;EACA,IAAIJ,cAAc,CAACK,WAAf,KAA+BC,SAAnC,EAA8C;IAC5CF,kBAAkB,CAACG,IAAnB,CAAwB,mBAAxB;EACD;;EACD,IAAIP,cAAc,CAACQ,SAAf,KAA6BF,SAAjC,EAA4C;IAC1CF,kBAAkB,CAACG,IAAnB,CAAwB,iBAAxB;EACD;;EACD,IAAIP,cAAc,CAACS,eAAf,KAAmCH,SAAvC,EAAkD;IAChDF,kBAAkB,CAACG,IAAnB,CAAwB,uBAAxB;EACD;;EACD,IAAIP,cAAc,CAACU,aAAf,KAAiCJ,SAArC,EAAgD;IAC9CF,kBAAkB,CAACG,IAAnB,CAAwB,qBAAxB;EACD;;EAED,OAAOZ,QAAQ,CACZgB,KAAD,IAAwB;IACtB;;IACA,MAAM;MACJV,QADI;MAEJI,WAFI;MAGJG,SAHI;MAIJC,eAJI;MAKJC;IALI,IAMFV,cANJ;;IAOA,IAAIC,QAAQ,IAAIU,KAAK,CAACC,SAAN,CAAgBC,QAAhB,CAAyB,UAAzB,CAAhB,EAAsD;MACpDZ,QAAQ,CAACU,KAAD,EAAQT,OAAR,CAAR;IACD,CAFD,MAEO,IAAIG,WAAW,IAAIM,KAAK,CAACC,SAAN,CAAgBC,QAAhB,CAAyB,mBAAzB,CAAnB,EAAkE;MACvER,WAAW,CAACM,KAAD,EAAQT,OAAR,CAAX;IACD,CAFM,MAEA,IAAIM,SAAS,IAAIG,KAAK,CAACC,SAAN,CAAgBC,QAAhB,CAAyB,iBAAzB,CAAjB,EAA8D;MACnEL,SAAS,CAACG,KAAD,EAAQT,OAAR,CAAT;IACD,CAFM,MAEA,IACLO,eAAe,IACfE,KAAK,CAACC,SAAN,CAAgBC,QAAhB,CAAyB,uBAAzB,CAFK,EAGL;MACAJ,eAAe,CAACE,KAAD,EAAQT,OAAR,CAAf;IACD,CALM,MAKA,IACLQ,aAAa,IACbC,KAAK,CAACC,SAAN,CAAgBC,QAAhB,CAAyB,qBAAzB,CAFK,EAGL;MACAH,aAAa,CAACC,KAAD,EAAQT,OAAR,CAAb;IACD;EACF,CA3BY,EA4BbE,kBA5Ba,EA6BbD,oBA7Ba,CAAf;AA+BD"}
1
+ {"version":3,"names":["useEvent","useHandler","useAnimatedScrollHandler","handlers","dependencies","scrollHandlers","onScroll","context","doDependenciesDiffer","subscribeForEvents","onBeginDrag","undefined","push","onEndDrag","onMomentumBegin","onMomentumEnd","event","eventName","endsWith"],"sources":["useAnimatedScrollHandler.ts"],"sourcesContent":["import { RefObject } from 'react';\nimport { NativeScrollEvent } from 'react-native';\nimport { Context, NativeEvent, WorkletFunction } from '../commonTypes';\nimport WorkletEventHandler from '../WorkletEventHandler';\nimport { DependencyList } from './commonTypes';\nimport { useEvent, useHandler } from './Hooks';\n\nexport interface ScrollHandler<TContext extends Context>\n extends WorkletFunction {\n (event: NativeScrollEvent, context?: TContext): void;\n}\n\nexport interface ScrollEvent\n extends NativeScrollEvent,\n NativeEvent<ScrollEvent> {\n eventName: string;\n}\nexport interface ScrollHandlers<TContext extends Context> {\n [key: string]: ScrollHandler<TContext> | undefined;\n onScroll?: ScrollHandler<TContext>;\n onBeginDrag?: ScrollHandler<TContext>;\n onEndDrag?: ScrollHandler<TContext>;\n onMomentumBegin?: ScrollHandler<TContext>;\n onMomentumEnd?: ScrollHandler<TContext>;\n}\n\nexport function useAnimatedScrollHandler<TContext extends Context>(\n handlers: ScrollHandlers<TContext> | ScrollHandler<TContext>,\n dependencies?: DependencyList\n): RefObject<WorkletEventHandler<ScrollEvent>> {\n // case when handlers is a function\n const scrollHandlers: ScrollHandlers<TContext> =\n typeof handlers === 'function' ? { onScroll: handlers } : handlers;\n const { context, doDependenciesDiffer } = useHandler<ScrollEvent, TContext>(\n scrollHandlers,\n dependencies\n );\n\n // build event subscription array\n const subscribeForEvents = ['onScroll'];\n if (scrollHandlers.onBeginDrag !== undefined) {\n subscribeForEvents.push('onScrollBeginDrag');\n }\n if (scrollHandlers.onEndDrag !== undefined) {\n subscribeForEvents.push('onScrollEndDrag');\n }\n if (scrollHandlers.onMomentumBegin !== undefined) {\n subscribeForEvents.push('onMomentumScrollBegin');\n }\n if (scrollHandlers.onMomentumEnd !== undefined) {\n subscribeForEvents.push('onMomentumScrollEnd');\n }\n\n return useEvent<ScrollEvent>(\n (event: ScrollEvent) => {\n 'worklet';\n const {\n onScroll,\n onBeginDrag,\n onEndDrag,\n onMomentumBegin,\n onMomentumEnd,\n } = scrollHandlers;\n if (onScroll && event.eventName.endsWith('onScroll')) {\n onScroll(event, context);\n } else if (onBeginDrag && event.eventName.endsWith('onScrollBeginDrag')) {\n onBeginDrag(event, context);\n } else if (onEndDrag && event.eventName.endsWith('onScrollEndDrag')) {\n onEndDrag(event, context);\n } else if (\n onMomentumBegin &&\n event.eventName.endsWith('onMomentumScrollBegin')\n ) {\n onMomentumBegin(event, context);\n } else if (\n onMomentumEnd &&\n event.eventName.endsWith('onMomentumScrollEnd')\n ) {\n onMomentumEnd(event, context);\n }\n },\n subscribeForEvents,\n doDependenciesDiffer\n );\n}\n"],"mappings":"AAKA,SAASA,QAAT,EAAmBC,UAAnB,QAAqC,SAArC;AAqBA,OAAO,SAASC,wBAAT,CACLC,QADK,EAELC,YAFK,EAGwC;EAC7C;EACA,MAAMC,cAAwC,GAC5C,OAAOF,QAAP,KAAoB,UAApB,GAAiC;IAAEG,QAAQ,EAAEH;EAAZ,CAAjC,GAA0DA,QAD5D;EAEA,MAAM;IAAEI,OAAF;IAAWC;EAAX,IAAoCP,UAAU,CAClDI,cADkD,EAElDD,YAFkD,CAApD,CAJ6C,CAS7C;;EACA,MAAMK,kBAAkB,GAAG,CAAC,UAAD,CAA3B;;EACA,IAAIJ,cAAc,CAACK,WAAf,KAA+BC,SAAnC,EAA8C;IAC5CF,kBAAkB,CAACG,IAAnB,CAAwB,mBAAxB;EACD;;EACD,IAAIP,cAAc,CAACQ,SAAf,KAA6BF,SAAjC,EAA4C;IAC1CF,kBAAkB,CAACG,IAAnB,CAAwB,iBAAxB;EACD;;EACD,IAAIP,cAAc,CAACS,eAAf,KAAmCH,SAAvC,EAAkD;IAChDF,kBAAkB,CAACG,IAAnB,CAAwB,uBAAxB;EACD;;EACD,IAAIP,cAAc,CAACU,aAAf,KAAiCJ,SAArC,EAAgD;IAC9CF,kBAAkB,CAACG,IAAnB,CAAwB,qBAAxB;EACD;;EAED,OAAOZ,QAAQ,CACZgB,KAAD,IAAwB;IACtB;;IACA,MAAM;MACJV,QADI;MAEJI,WAFI;MAGJG,SAHI;MAIJC,eAJI;MAKJC;IALI,IAMFV,cANJ;;IAOA,IAAIC,QAAQ,IAAIU,KAAK,CAACC,SAAN,CAAgBC,QAAhB,CAAyB,UAAzB,CAAhB,EAAsD;MACpDZ,QAAQ,CAACU,KAAD,EAAQT,OAAR,CAAR;IACD,CAFD,MAEO,IAAIG,WAAW,IAAIM,KAAK,CAACC,SAAN,CAAgBC,QAAhB,CAAyB,mBAAzB,CAAnB,EAAkE;MACvER,WAAW,CAACM,KAAD,EAAQT,OAAR,CAAX;IACD,CAFM,MAEA,IAAIM,SAAS,IAAIG,KAAK,CAACC,SAAN,CAAgBC,QAAhB,CAAyB,iBAAzB,CAAjB,EAA8D;MACnEL,SAAS,CAACG,KAAD,EAAQT,OAAR,CAAT;IACD,CAFM,MAEA,IACLO,eAAe,IACfE,KAAK,CAACC,SAAN,CAAgBC,QAAhB,CAAyB,uBAAzB,CAFK,EAGL;MACAJ,eAAe,CAACE,KAAD,EAAQT,OAAR,CAAf;IACD,CALM,MAKA,IACLQ,aAAa,IACbC,KAAK,CAACC,SAAN,CAAgBC,QAAhB,CAAyB,qBAAzB,CAFK,EAGL;MACAH,aAAa,CAACC,KAAD,EAAQT,OAAR,CAAb;IACD;EACF,CA3BY,EA4BbE,kBA5Ba,EA6BbD,oBA7Ba,CAAf;AA+BD"}
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useRef","FrameCallbackRegistryJS","frameCallbackRegistry","useFrameCallback","callback","autostart","ref","setActive","isActive","manageStateFrameCallback","current","callbackId","registerFrameCallback","unregisterFrameCallback"],"sources":["useFrameCallback.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport FrameCallbackRegistryJS from '../frameCallback/FrameCallbackRegistryJS';\n\nexport type FrameCallback = {\n setActive: (isActive: boolean) => void;\n isActive: boolean;\n callbackId: number;\n};\nconst frameCallbackRegistry = new FrameCallbackRegistryJS();\n\nexport function useFrameCallback(\n callback: () => void,\n autostart = true\n): FrameCallback {\n const ref = useRef<FrameCallback>({\n setActive: (isActive: boolean) => {\n frameCallbackRegistry.manageStateFrameCallback(\n ref.current.callbackId,\n isActive\n );\n ref.current.isActive = isActive;\n },\n isActive: autostart,\n callbackId: -1,\n });\n\n useEffect(() => {\n ref.current.callbackId =\n frameCallbackRegistry.registerFrameCallback(callback);\n ref.current.setActive(ref.current.isActive);\n\n return () => {\n frameCallbackRegistry.unregisterFrameCallback(ref.current.callbackId);\n ref.current.callbackId = -1;\n };\n }, [callback, autostart]);\n\n return ref.current;\n}\n"],"mappings":"AAAA,SAASA,SAAT,EAAoBC,MAApB,QAAkC,OAAlC;AACA,OAAOC,uBAAP,MAAoC,0CAApC;AAOA,MAAMC,qBAAqB,GAAG,IAAID,uBAAJ,EAA9B;AAEA,OAAO,SAASE,gBAAT,CACLC,QADK,EAGU;EAAA,IADfC,SACe,uEADH,IACG;EACf,MAAMC,GAAG,GAAGN,MAAM,CAAgB;IAChCO,SAAS,EAAGC,QAAD,IAAuB;MAChCN,qBAAqB,CAACO,wBAAtB,CACEH,GAAG,CAACI,OAAJ,CAAYC,UADd,EAEEH,QAFF;MAIAF,GAAG,CAACI,OAAJ,CAAYF,QAAZ,GAAuBA,QAAvB;IACD,CAP+B;IAQhCA,QAAQ,EAAEH,SARsB;IAShCM,UAAU,EAAE,CAAC;EATmB,CAAhB,CAAlB;EAYAZ,SAAS,CAAC,MAAM;IACdO,GAAG,CAACI,OAAJ,CAAYC,UAAZ,GACET,qBAAqB,CAACU,qBAAtB,CAA4CR,QAA5C,CADF;IAEAE,GAAG,CAACI,OAAJ,CAAYH,SAAZ,CAAsBD,GAAG,CAACI,OAAJ,CAAYF,QAAlC;IAEA,OAAO,MAAM;MACXN,qBAAqB,CAACW,uBAAtB,CAA8CP,GAAG,CAACI,OAAJ,CAAYC,UAA1D;MACAL,GAAG,CAACI,OAAJ,CAAYC,UAAZ,GAAyB,CAAC,CAA1B;IACD,CAHD;EAID,CATQ,EASN,CAACP,QAAD,EAAWC,SAAX,CATM,CAAT;EAWA,OAAOC,GAAG,CAACI,OAAX;AACD"}
1
+ {"version":3,"names":["useEffect","useRef","FrameCallbackRegistryJS","frameCallbackRegistry","useFrameCallback","callback","autostart","ref","setActive","isActive","manageStateFrameCallback","current","callbackId","registerFrameCallback","unregisterFrameCallback"],"sources":["useFrameCallback.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport FrameCallbackRegistryJS from '../frameCallback/FrameCallbackRegistryJS';\nimport { FrameInfo } from '../frameCallback/FrameCallbackRegistryUI';\n\nexport type FrameCallback = {\n setActive: (isActive: boolean) => void;\n isActive: boolean;\n callbackId: number;\n};\nconst frameCallbackRegistry = new FrameCallbackRegistryJS();\n\nexport function useFrameCallback(\n callback: (frameInfo: FrameInfo) => void,\n autostart = true\n): FrameCallback {\n const ref = useRef<FrameCallback>({\n setActive: (isActive: boolean) => {\n frameCallbackRegistry.manageStateFrameCallback(\n ref.current.callbackId,\n isActive\n );\n ref.current.isActive = isActive;\n },\n isActive: autostart,\n callbackId: -1,\n });\n\n useEffect(() => {\n ref.current.callbackId =\n frameCallbackRegistry.registerFrameCallback(callback);\n ref.current.setActive(ref.current.isActive);\n\n return () => {\n frameCallbackRegistry.unregisterFrameCallback(ref.current.callbackId);\n ref.current.callbackId = -1;\n };\n }, [callback, autostart]);\n\n return ref.current;\n}\n"],"mappings":"AAAA,SAASA,SAAT,EAAoBC,MAApB,QAAkC,OAAlC;AACA,OAAOC,uBAAP,MAAoC,0CAApC;AAQA,MAAMC,qBAAqB,GAAG,IAAID,uBAAJ,EAA9B;AAEA,OAAO,SAASE,gBAAT,CACLC,QADK,EAGU;EAAA,IADfC,SACe,uEADH,IACG;EACf,MAAMC,GAAG,GAAGN,MAAM,CAAgB;IAChCO,SAAS,EAAGC,QAAD,IAAuB;MAChCN,qBAAqB,CAACO,wBAAtB,CACEH,GAAG,CAACI,OAAJ,CAAYC,UADd,EAEEH,QAFF;MAIAF,GAAG,CAACI,OAAJ,CAAYF,QAAZ,GAAuBA,QAAvB;IACD,CAP+B;IAQhCA,QAAQ,EAAEH,SARsB;IAShCM,UAAU,EAAE,CAAC;EATmB,CAAhB,CAAlB;EAYAZ,SAAS,CAAC,MAAM;IACdO,GAAG,CAACI,OAAJ,CAAYC,UAAZ,GACET,qBAAqB,CAACU,qBAAtB,CAA4CR,QAA5C,CADF;IAEAE,GAAG,CAACI,OAAJ,CAAYH,SAAZ,CAAsBD,GAAG,CAACI,OAAJ,CAAYF,QAAlC;IAEA,OAAO,MAAM;MACXN,qBAAqB,CAACW,uBAAtB,CAA8CP,GAAG,CAACI,OAAJ,CAAYC,UAA1D;MACAL,GAAG,CAACI,OAAJ,CAAYC,UAAZ,GAAyB,CAAC,CAA1B;IACD,CAHD;EAID,CATQ,EASN,CAACP,QAAD,EAAWC,SAAX,CATM,CAAT;EAWA,OAAOC,GAAG,CAACI,OAAX;AACD"}
@@ -0,0 +1,20 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import { findNodeHandle } from 'react-native';
3
+ import { useEvent, useSharedValue } from '.';
4
+ const subscribeForEvents = ['onScroll', 'onScrollBeginDrag', 'onScrollEndDrag', 'onMomentumScrollBegin', 'onMomentumScrollEnd'];
5
+ export function useScrollViewOffset(aref) {
6
+ const offsetRef = useRef(useSharedValue(0));
7
+ const event = useEvent(event => {
8
+ 'worklet';
9
+
10
+ offsetRef.current.value = event.contentOffset.x === 0 ? event.contentOffset.y : event.contentOffset.x;
11
+ }, subscribeForEvents);
12
+ useEffect(() => {
13
+ var _event$current;
14
+
15
+ const viewTag = findNodeHandle(aref.current);
16
+ (_event$current = event.current) === null || _event$current === void 0 ? void 0 : _event$current.registerForEvents(viewTag);
17
+ }, [aref.current]);
18
+ return offsetRef.current;
19
+ }
20
+ //# sourceMappingURL=useScrollViewOffset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","useRef","findNodeHandle","useEvent","useSharedValue","subscribeForEvents","useScrollViewOffset","aref","offsetRef","event","current","value","contentOffset","x","y","viewTag","registerForEvents"],"sources":["useScrollViewOffset.ts"],"sourcesContent":["import { RefObject, useEffect, useRef } from 'react';\n\nimport { findNodeHandle } from 'react-native';\nimport type Animated from 'react-native-reanimated';\nimport { useEvent, useSharedValue } from '.';\nimport { SharedValue } from '../commonTypes';\nimport { ScrollEvent } from './useAnimatedScrollHandler';\n\nconst subscribeForEvents = [\n 'onScroll',\n 'onScrollBeginDrag',\n 'onScrollEndDrag',\n 'onMomentumScrollBegin',\n 'onMomentumScrollEnd',\n];\n\nexport function useScrollViewOffset(\n aref: RefObject<Animated.ScrollView>\n): SharedValue<number> {\n const offsetRef = useRef(useSharedValue(0));\n\n const event = useEvent<ScrollEvent>((event: ScrollEvent) => {\n 'worklet';\n offsetRef.current.value =\n event.contentOffset.x === 0\n ? event.contentOffset.y\n : event.contentOffset.x;\n }, subscribeForEvents);\n\n useEffect(() => {\n const viewTag = findNodeHandle(aref.current);\n event.current?.registerForEvents(viewTag as number);\n }, [aref.current]);\n\n return offsetRef.current;\n}\n"],"mappings":"AAAA,SAAoBA,SAApB,EAA+BC,MAA/B,QAA6C,OAA7C;AAEA,SAASC,cAAT,QAA+B,cAA/B;AAEA,SAASC,QAAT,EAAmBC,cAAnB,QAAyC,GAAzC;AAIA,MAAMC,kBAAkB,GAAG,CACzB,UADyB,EAEzB,mBAFyB,EAGzB,iBAHyB,EAIzB,uBAJyB,EAKzB,qBALyB,CAA3B;AAQA,OAAO,SAASC,mBAAT,CACLC,IADK,EAEgB;EACrB,MAAMC,SAAS,GAAGP,MAAM,CAACG,cAAc,CAAC,CAAD,CAAf,CAAxB;EAEA,MAAMK,KAAK,GAAGN,QAAQ,CAAeM,KAAD,IAAwB;IAC1D;;IACAD,SAAS,CAACE,OAAV,CAAkBC,KAAlB,GACEF,KAAK,CAACG,aAAN,CAAoBC,CAApB,KAA0B,CAA1B,GACIJ,KAAK,CAACG,aAAN,CAAoBE,CADxB,GAEIL,KAAK,CAACG,aAAN,CAAoBC,CAH1B;EAID,CANqB,EAMnBR,kBANmB,CAAtB;EAQAL,SAAS,CAAC,MAAM;IAAA;;IACd,MAAMe,OAAO,GAAGb,cAAc,CAACK,IAAI,CAACG,OAAN,CAA9B;IACA,kBAAAD,KAAK,CAACC,OAAN,kEAAeM,iBAAf,CAAiCD,OAAjC;EACD,CAHQ,EAGN,CAACR,IAAI,CAACG,OAAN,CAHM,CAAT;EAKA,OAAOF,SAAS,CAACE,OAAjB;AACD"}
@@ -1,11 +1,21 @@
1
1
  import { measure } from './NativeMethods';
2
- export function getRelativeCoords(parentRef, x, y) {
2
+
3
+ /**
4
+ * Given an absolute position and a component ref, returns the relative
5
+ * position in the component's local coordinate space.
6
+ */
7
+ export function getRelativeCoords(parentRef, absoluteX, absoluteY) {
3
8
  'worklet';
4
9
 
5
10
  const parentCoords = measure(parentRef);
11
+
12
+ if (parentCoords === null) {
13
+ return null;
14
+ }
15
+
6
16
  return {
7
- x: x - parentCoords.x,
8
- y: y - parentCoords.y
17
+ x: absoluteX - parentCoords.x,
18
+ y: absoluteY - parentCoords.y
9
19
  };
10
20
  }
11
21
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["measure","getRelativeCoords","parentRef","x","y","parentCoords"],"sources":["utils.ts"],"sourcesContent":["import { Component } from 'react';\nimport { measure } from './NativeMethods';\nimport { RefObjectFunction } from './hook/commonTypes';\n\nexport interface ComponentCoords {\n x: number;\n y: number;\n}\n\nexport function getRelativeCoords(\n parentRef: RefObjectFunction<Component>,\n x: number,\n y: number\n): ComponentCoords {\n 'worklet';\n const parentCoords = measure(parentRef);\n return {\n x: x - parentCoords.x,\n y: y - parentCoords.y,\n };\n}\n"],"mappings":"AACA,SAASA,OAAT,QAAwB,iBAAxB;AAQA,OAAO,SAASC,iBAAT,CACLC,SADK,EAELC,CAFK,EAGLC,CAHK,EAIY;EACjB;;EACA,MAAMC,YAAY,GAAGL,OAAO,CAACE,SAAD,CAA5B;EACA,OAAO;IACLC,CAAC,EAAEA,CAAC,GAAGE,YAAY,CAACF,CADf;IAELC,CAAC,EAAEA,CAAC,GAAGC,YAAY,CAACD;EAFf,CAAP;AAID"}
1
+ {"version":3,"names":["measure","getRelativeCoords","parentRef","absoluteX","absoluteY","parentCoords","x","y"],"sources":["utils.ts"],"sourcesContent":["import { Component } from 'react';\nimport { measure } from './NativeMethods';\nimport { RefObjectFunction } from './hook/commonTypes';\n\nexport interface ComponentCoords {\n x: number;\n y: number;\n}\n\n/**\n * Given an absolute position and a component ref, returns the relative\n * position in the component's local coordinate space.\n */\nexport function getRelativeCoords(\n parentRef: RefObjectFunction<Component>,\n absoluteX: number,\n absoluteY: number\n): ComponentCoords | null {\n 'worklet';\n const parentCoords = measure(parentRef);\n if (parentCoords === null) {\n return null;\n }\n return {\n x: absoluteX - parentCoords.x,\n y: absoluteY - parentCoords.y,\n };\n}\n"],"mappings":"AACA,SAASA,OAAT,QAAwB,iBAAxB;;AAQA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAT,CACLC,SADK,EAELC,SAFK,EAGLC,SAHK,EAImB;EACxB;;EACA,MAAMC,YAAY,GAAGL,OAAO,CAACE,SAAD,CAA5B;;EACA,IAAIG,YAAY,KAAK,IAArB,EAA2B;IACzB,OAAO,IAAP;EACD;;EACD,OAAO;IACLC,CAAC,EAAEH,SAAS,GAAGE,YAAY,CAACC,CADvB;IAELC,CAAC,EAAEH,SAAS,GAAGC,YAAY,CAACE;EAFvB,CAAP;AAID"}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "react-native-reanimated",
3
- "version": "3.0.0-rc.2",
3
+ "version": "3.0.0-rc.3",
4
4
  "description": "More powerful alternative to Animated library for React Native.",
5
5
  "scripts": {
6
6
  "test": "yarn run format:js && yarn run lint:js && yarn run test:unit",
7
7
  "test:unit": "jest",
8
- "lint": "yarn lint:js && yarn lint:cpp && yarn lint:java",
8
+ "lint": "yarn lint:js && yarn lint:cpp && yarn lint:java && yarn lint:docs",
9
9
  "lint:js": "eslint --ext '.js,.ts,.tsx' src/ && yarn prettier --check src/",
10
+ "lint:docs": "cd docs && yarn lint && cd ..",
10
11
  "lint:java": "./android/gradlew -p android spotlessCheck -q",
11
12
  "lint:cpp": "./scripts/cpplint.sh",
12
13
  "format": "yarn format:js && yarn format:java && yarn format:ios && yarn format:android && yarn format:common",
@@ -120,7 +121,7 @@
120
121
  "madge": "^5.0.1",
121
122
  "prettier": "^2.5.1",
122
123
  "react": "17.0.2",
123
- "react-native": "0.70.0-rc.2",
124
+ "react-native": "0.70.1",
124
125
  "react-native-builder-bob": "^0.18.3",
125
126
  "react-native-codegen": "^0.0.7",
126
127
  "react-native-gesture-handler": "^2.4.2",
@@ -137,7 +138,8 @@
137
138
  "android/src/**/*.java": "yarn format:java",
138
139
  "android/src/**/*.{h,cpp}": "yarn format:android",
139
140
  "ios/**/*.{h,m,mm,cpp}": "yarn format:ios",
140
- "Common/**/*.{h,cpp}": "yarn format:common"
141
+ "Common/**/*.{h,cpp}": "yarn format:common",
142
+ "docs/**/*.{md,mdx}": "yarn lint:docs"
141
143
  },
142
144
  "release-it": {
143
145
  "hooks": {
package/plugin.js CHANGED
@@ -3,6 +3,7 @@ const generate = require('@babel/generator').default;
3
3
  const hash = require('string-hash-64');
4
4
  const traverse = require('@babel/traverse').default;
5
5
  const { transformSync } = require('@babel/core');
6
+ const fs = require('fs');
6
7
  /**
7
8
  * holds a map of function names as keys and array of argument indexes as values which should be automatically workletized(they have to be functions)(starting from 0)
8
9
  */
@@ -277,49 +278,105 @@ class ClosureGenerator {
277
278
  }
278
279
  }
279
280
 
280
- function buildWorkletString(t, fun, closureVariables, name) {
281
- function prependClosureVariablesIfNecessary(closureVariables, body) {
282
- if (closureVariables.length === 0) {
283
- return body;
284
- }
281
+ function isRelease() {
282
+ return process.env.BABEL_ENV === 'release';
283
+ }
285
284
 
286
- return t.blockStatement([
287
- t.variableDeclaration('const', [
288
- t.variableDeclarator(
289
- t.objectPattern(
290
- closureVariables.map((variable) =>
291
- t.objectProperty(
292
- t.identifier(variable.name),
293
- t.identifier(variable.name),
294
- false,
295
- true
296
- )
285
+ function shouldGenerateSourceMap() {
286
+ if (isRelease()) {
287
+ return false;
288
+ }
289
+
290
+ if (process.env.REANIMATED_PLUGIN_TESTS === 'jest') {
291
+ // We want to detect this, so we can disable source maps (because they break
292
+ // snapshot tests with jest).
293
+ return false;
294
+ }
295
+
296
+ return true;
297
+ }
298
+
299
+ function buildWorkletString(t, fun, closureVariables, name, inputMap) {
300
+ function prependClosureVariablesIfNecessary() {
301
+ const closureDeclaration = t.variableDeclaration('const', [
302
+ t.variableDeclarator(
303
+ t.objectPattern(
304
+ closureVariables.map((variable) =>
305
+ t.objectProperty(
306
+ t.identifier(variable.name),
307
+ t.identifier(variable.name),
308
+ false,
309
+ true
297
310
  )
298
- ),
299
- t.memberExpression(t.identifier('jsThis'), t.identifier('_closure'))
311
+ )
300
312
  ),
301
- ]),
302
- body,
313
+ t.memberExpression(t.identifier('jsThis'), t.identifier('_closure'))
314
+ ),
303
315
  ]);
304
- }
305
316
 
306
- traverse(fun, {
307
- enter(path) {
308
- t.removeComments(path.node);
309
- },
310
- });
317
+ function prependClosure(path) {
318
+ if (closureVariables.length === 0 || path.parent.type !== 'Program') {
319
+ return;
320
+ }
321
+
322
+ path.node.body.body.unshift(closureDeclaration);
323
+ }
324
+
325
+ return {
326
+ visitor: {
327
+ FunctionDeclaration(path) {
328
+ prependClosure(path);
329
+ },
330
+ FunctionExpression(path) {
331
+ prependClosure(path);
332
+ },
333
+ ArrowFunctionExpression(path) {
334
+ prependClosure(path);
335
+ },
336
+ ObjectMethod(path) {
337
+ prependClosure(path);
338
+ },
339
+ },
340
+ };
341
+ }
311
342
 
312
- const expression = fun.program.body.find(
313
- ({ type }) => type === 'ExpressionStatement'
314
- ).expression;
343
+ const expression =
344
+ fun.program.body.find(({ type }) => type === 'FunctionDeclaration') ||
345
+ fun.program.body.find(({ type }) => type === 'ExpressionStatement')
346
+ .expression;
315
347
 
316
348
  const workletFunction = t.functionExpression(
317
349
  t.identifier(name),
318
350
  expression.params,
319
- prependClosureVariablesIfNecessary(closureVariables, expression.body)
351
+ expression.body
320
352
  );
321
353
 
322
- return generate(workletFunction, { compact: true }).code;
354
+ const code = generate(workletFunction).code;
355
+
356
+ if (shouldGenerateSourceMap()) {
357
+ // Clear contents array (should be empty anyways)
358
+ inputMap.sourcesContent = [];
359
+ // Include source contents in source map, because Flipper/iframe is not
360
+ // allowed to read files from disk.
361
+ for (const sourceFile of inputMap.sources) {
362
+ inputMap.sourcesContent.push(
363
+ fs.readFileSync(sourceFile).toString('utf-8')
364
+ );
365
+ }
366
+ }
367
+
368
+ const transformed = transformSync(code, {
369
+ plugins: [prependClosureVariablesIfNecessary()],
370
+ compact: !shouldGenerateSourceMap(),
371
+ sourceMaps: shouldGenerateSourceMap() ? 'inline' : false,
372
+ inputSourceMap: inputMap,
373
+ ast: false,
374
+ babelrc: false,
375
+ configFile: false,
376
+ comments: false,
377
+ });
378
+
379
+ return transformed.code;
323
380
  }
324
381
 
325
382
  function makeWorkletName(t, fun) {
@@ -342,11 +399,10 @@ function makeWorklet(t, fun, state) {
342
399
  const functionName = makeWorkletName(t, fun);
343
400
 
344
401
  const closure = new Map();
345
- const outputs = new Set();
346
402
  const closureGenerator = new ClosureGenerator();
347
403
  const options = {};
348
404
 
349
- // remove 'worklet'; directive before calling .toString()
405
+ // remove 'worklet'; directive before generating string
350
406
  fun.traverse({
351
407
  DirectiveLiteral(path) {
352
408
  if (path.node.value === 'worklet' && path.getFunctionParent() === fun) {
@@ -358,8 +414,17 @@ function makeWorklet(t, fun, state) {
358
414
  // We use copy because some of the plugins don't update bindings and
359
415
  // some even break them
360
416
 
417
+ const codeObject = generate(fun.node, {
418
+ sourceMaps: true,
419
+ sourceFileName: state.file.opts.filename,
420
+ });
421
+
422
+ // We need to add a newline at the end, because there could potentially be a
423
+ // comment after the function that gets included here, and then the closing
424
+ // bracket would become part of the comment thus resulting in an error, since
425
+ // there is a missing closing bracket.
361
426
  const code =
362
- '\n(' + (t.isObjectMethod(fun) ? 'function ' : '') + fun.toString() + '\n)';
427
+ '(' + (t.isObjectMethod(fun) ? 'function ' : '') + codeObject.code + '\n)';
363
428
 
364
429
  const transformed = transformSync(code, {
365
430
  filename: state.file.opts.filename,
@@ -374,7 +439,9 @@ function makeWorklet(t, fun, state) {
374
439
  ast: true,
375
440
  babelrc: false,
376
441
  configFile: false,
442
+ inputSourceMap: codeObject.map,
377
443
  });
444
+
378
445
  if (
379
446
  fun.parent &&
380
447
  fun.parent.callee &&
@@ -418,17 +485,6 @@ function makeWorklet(t, fun, state) {
418
485
  closure.set(name, path.node);
419
486
  closureGenerator.addPath(name, path);
420
487
  },
421
- AssignmentExpression(path) {
422
- // test for <something>.value = <something> expressions
423
- const left = path.node.left;
424
- if (
425
- t.isMemberExpression(left) &&
426
- t.isIdentifier(left.object) &&
427
- t.isIdentifier(left.property, { name: 'value' })
428
- ) {
429
- outputs.add(left.object.name);
430
- }
431
- },
432
488
  });
433
489
 
434
490
  const variables = Array.from(closure.values());
@@ -441,16 +497,18 @@ function makeWorklet(t, fun, state) {
441
497
  } else {
442
498
  funExpression = clone;
443
499
  }
500
+
444
501
  const funString = buildWorkletString(
445
502
  t,
446
503
  transformed.ast,
447
504
  variables,
448
- functionName
505
+ functionName,
506
+ transformed.map
449
507
  );
450
508
  const workletHash = hash(funString);
451
509
 
452
510
  let location = state.file.opts.filename;
453
- if (state.opts.relativeSourceLocation) {
511
+ if (state.opts && state.opts.relativeSourceLocation) {
454
512
  const path = require('path');
455
513
  location = path.relative(state.cwd, location);
456
514
  }
@@ -54,6 +54,8 @@ declare module 'react-native-reanimated' {
54
54
  import('./lib/types/lib/reanimated2/animation/index').StyleLayoutAnimation;
55
55
  export type Animation<T> =
56
56
  import('./lib/types/lib/reanimated2/commonTypes').Animation<T>;
57
+ export type MeasuredDimensions =
58
+ import('./lib/types/lib/reanimated2/commonTypes').MeasuredDimensions;
57
59
 
58
60
  namespace Animated {
59
61
  type Nullable<T> = T | null | undefined;
@@ -543,8 +545,13 @@ declare module 'react-native-reanimated' {
543
545
  isActive: boolean;
544
546
  callbackId: number;
545
547
  };
548
+ export type FrameInfo = {
549
+ timestamp: number;
550
+ timeSincePreviousFrame: number | null;
551
+ timeSinceFirstFrame: number;
552
+ };
546
553
  export function useFrameCallback(
547
- callback: () => void,
554
+ callback: (frameInfo: FrameInfo) => void,
548
555
  autostart?: boolean
549
556
  ): FrameCallback;
550
557
 
@@ -561,6 +568,10 @@ declare module 'react-native-reanimated' {
561
568
  };
562
569
  export function useAnimatedKeyboard(): AnimatedKeyboardInfo;
563
570
 
571
+ export function useScrollViewOffset(
572
+ aref: RefObject<Animated.ScrollView>
573
+ ): SharedValue<number>;
574
+
564
575
  export interface ExitAnimationsValues {
565
576
  currentOriginX: number;
566
577
  currentOriginY: number;
@@ -805,14 +816,7 @@ declare module 'react-native-reanimated' {
805
816
  export function defineAnimation<T>(starting: any, factory: () => T): number;
806
817
  export function measure<T extends Component>(
807
818
  ref: RefObject<T>
808
- ): {
809
- width: number;
810
- height: number;
811
- x: number;
812
- y: number;
813
- pageX: number;
814
- pageY: number;
815
- };
819
+ ): MeasuredDimensions | null;
816
820
 
817
821
  export function getRelativeCoords(
818
822
  ref: RefObject<Component>,