about summary refs log tree commit diff
path: root/src/lib/hooks/useAnimatedScrollHandler_FIXED.web.ts
diff options
context:
space:
mode:
authordan <dan.abramov@gmail.com>2023-11-10 14:58:13 +0000
committerGitHub <noreply@github.com>2023-11-10 14:58:13 +0000
commit8d7475c13069f99170b40d696a7371c94020ef46 (patch)
tree8f15343497ac7d7404d028a62ed2ecd20fd1814b /src/lib/hooks/useAnimatedScrollHandler_FIXED.web.ts
parent487d871cfd89948f4db9944c4bb414d268a56537 (diff)
downloadvoidsky-8d7475c13069f99170b40d696a7371c94020ef46.tar.zst
Work around web stale closure bug in Reanimated (#1865)
Diffstat (limited to 'src/lib/hooks/useAnimatedScrollHandler_FIXED.web.ts')
-rw-r--r--src/lib/hooks/useAnimatedScrollHandler_FIXED.web.ts44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/lib/hooks/useAnimatedScrollHandler_FIXED.web.ts b/src/lib/hooks/useAnimatedScrollHandler_FIXED.web.ts
new file mode 100644
index 000000000..131e7bdd7
--- /dev/null
+++ b/src/lib/hooks/useAnimatedScrollHandler_FIXED.web.ts
@@ -0,0 +1,44 @@
+import {useRef, useEffect} from 'react'
+import {useAnimatedScrollHandler as useAnimatedScrollHandler_BUGGY} from 'react-native-reanimated'
+
+export const useAnimatedScrollHandler: typeof useAnimatedScrollHandler_BUGGY = (
+  config,
+  deps,
+) => {
+  const ref = useRef(config)
+  useEffect(() => {
+    ref.current = config
+  })
+  return useAnimatedScrollHandler_BUGGY(
+    {
+      onBeginDrag(e) {
+        if (typeof ref.current !== 'function' && ref.current.onBeginDrag) {
+          ref.current.onBeginDrag(e)
+        }
+      },
+      onEndDrag(e) {
+        if (typeof ref.current !== 'function' && ref.current.onEndDrag) {
+          ref.current.onEndDrag(e)
+        }
+      },
+      onMomentumBegin(e) {
+        if (typeof ref.current !== 'function' && ref.current.onMomentumBegin) {
+          ref.current.onMomentumBegin(e)
+        }
+      },
+      onMomentumEnd(e) {
+        if (typeof ref.current !== 'function' && ref.current.onMomentumEnd) {
+          ref.current.onMomentumEnd(e)
+        }
+      },
+      onScroll(e) {
+        if (typeof ref.current === 'function') {
+          ref.current(e)
+        } else if (ref.current.onScroll) {
+          ref.current.onScroll(e)
+        }
+      },
+    },
+    deps,
+  )
+}