about summary refs log tree commit diff
path: root/src/lib/hooks/useMinimalShellMode.tsx
diff options
context:
space:
mode:
authorAnsh <anshnanda10@gmail.com>2023-10-13 18:54:35 -0700
committerGitHub <noreply@github.com>2023-10-13 18:54:35 -0700
commit8e9cf182c2e247203b6b5ea9ae701c039945d6a0 (patch)
tree1dbf0c69fe209fccdb7841b29fc03bf8e311eac3 /src/lib/hooks/useMinimalShellMode.tsx
parent9042f503c2533deff535de75b190c26ed1ae59ec (diff)
downloadvoidsky-8e9cf182c2e247203b6b5ea9ae701c039945d6a0.tar.zst
Performance optimization (#1676)
* upgrade sentry to support profiling monitoring

* remove console logs in production builds

* feeds tab bar and bottom bar animation centralized

* refactor FeedPage out of Home

* add script to start in production mode

* move FAB inner to reanimated

* move FABInner back to `Animated` RN animation

* add perf commands

* add testing with Maestro and perf with Flashlight

* fix merge conflicts

* fix resourceClass name in eas.json

* fix onEndReachedThreshold in Feed

* memoize styles

* go back to old styling for LoadLatestBtn

* remove reanimated code from useMinimalShellMode

* move shell animations to hook/reanimated for perf

* fix empty state issue

* make shell animation feel smoother

* make shell animation more smooth

* run animation with autorun

* specify keys for tab bar properly

* remove comments

* remove already imported dep

* fix lint

* add testing instructions

* mock sentry-expo for jest

* fix jest mocks

* Fix the load-latest button on desktop and tablet

* Fix: don't move the FAB in tablet mode

* Fix type error

* Fix tabs bar positioning on tablet

* Fix types

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
Diffstat (limited to 'src/lib/hooks/useMinimalShellMode.tsx')
-rw-r--r--src/lib/hooks/useMinimalShellMode.tsx66
1 files changed, 45 insertions, 21 deletions
diff --git a/src/lib/hooks/useMinimalShellMode.tsx b/src/lib/hooks/useMinimalShellMode.tsx
index 68f405dc4..475d165d3 100644
--- a/src/lib/hooks/useMinimalShellMode.tsx
+++ b/src/lib/hooks/useMinimalShellMode.tsx
@@ -1,36 +1,60 @@
 import React from 'react'
 import {autorun} from 'mobx'
 import {useStores} from 'state/index'
-import {Animated} from 'react-native'
-import {useAnimatedValue} from 'lib/hooks/useAnimatedValue'
+import {
+  Easing,
+  interpolate,
+  useAnimatedStyle,
+  useSharedValue,
+  withTiming,
+} from 'react-native-reanimated'
 
 export function useMinimalShellMode() {
   const store = useStores()
-  const minimalShellInterp = useAnimatedValue(0)
-  const footerMinimalShellTransform = {
-    opacity: Animated.subtract(1, minimalShellInterp),
-    transform: [{translateY: Animated.multiply(minimalShellInterp, 50)}],
-  }
+  const minimalShellInterp = useSharedValue(0)
+  const footerMinimalShellTransform = useAnimatedStyle(() => {
+    return {
+      opacity: interpolate(minimalShellInterp.value, [0, 1], [1, 0]),
+      transform: [
+        {translateY: interpolate(minimalShellInterp.value, [0, 1], [0, 25])},
+      ],
+    }
+  })
+  const headerMinimalShellTransform = useAnimatedStyle(() => {
+    return {
+      opacity: interpolate(minimalShellInterp.value, [0, 1], [1, 0]),
+      transform: [
+        {translateY: interpolate(minimalShellInterp.value, [0, 1], [0, -25])},
+      ],
+    }
+  })
+  const fabMinimalShellTransform = useAnimatedStyle(() => {
+    return {
+      transform: [
+        {translateY: interpolate(minimalShellInterp.value, [0, 1], [-44, 0])},
+      ],
+    }
+  })
 
   React.useEffect(() => {
     return autorun(() => {
       if (store.shell.minimalShellMode) {
-        Animated.timing(minimalShellInterp, {
-          toValue: 1,
-          duration: 150,
-          useNativeDriver: true,
-          isInteraction: false,
-        }).start()
+        minimalShellInterp.value = withTiming(1, {
+          duration: 125,
+          easing: Easing.bezier(0.25, 0.1, 0.25, 1),
+        })
       } else {
-        Animated.timing(minimalShellInterp, {
-          toValue: 0,
-          duration: 150,
-          useNativeDriver: true,
-          isInteraction: false,
-        }).start()
+        minimalShellInterp.value = withTiming(0, {
+          duration: 125,
+          easing: Easing.bezier(0.25, 0.1, 0.25, 1),
+        })
       }
     })
-  }, [minimalShellInterp, store])
+  }, [minimalShellInterp, store.shell.minimalShellMode])
 
-  return {footerMinimalShellTransform}
+  return {
+    footerMinimalShellTransform,
+    headerMinimalShellTransform,
+    fabMinimalShellTransform,
+  }
 }