about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authordan <dan.abramov@gmail.com>2024-02-09 06:20:41 +0000
committerGitHub <noreply@github.com>2024-02-08 22:20:41 -0800
commit43b447e5f4345bd6c3a6957cb5aa1587324799e8 (patch)
treeb54955fb5326d67374f5f372292ac799796b0fc9 /src
parentd36b91fe67225a9d3c79c8eeb3c80f6a72e9f73f (diff)
downloadvoidsky-43b447e5f4345bd6c3a6957cb5aa1587324799e8.tar.zst
Fix layout calculations (#2816)
Diffstat (limited to 'src')
-rw-r--r--src/view/com/pager/PagerWithHeader.tsx42
1 files changed, 31 insertions, 11 deletions
diff --git a/src/view/com/pager/PagerWithHeader.tsx b/src/view/com/pager/PagerWithHeader.tsx
index 31abc1ab7..dcfc616cc 100644
--- a/src/view/com/pager/PagerWithHeader.tsx
+++ b/src/view/com/pager/PagerWithHeader.tsx
@@ -68,15 +68,12 @@ export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>(
         setTabBarHeight(Math.round(height))
       }
     })
-    const onHeaderOnlyLayout = useNonReactiveCallback(
-      (evt: LayoutChangeEvent) => {
-        const height = evt.nativeEvent.layout.height
-        if (height > 0 && isHeaderReady) {
-          // The rounding is necessary to prevent jumps on iOS
-          setHeaderOnlyHeight(Math.round(height))
-        }
-      },
-    )
+    const onHeaderOnlyLayout = useNonReactiveCallback((height: number) => {
+      if (height > 0) {
+        // The rounding is necessary to prevent jumps on iOS
+        setHeaderOnlyHeight(Math.round(height))
+      }
+    })
 
     const renderTabBar = React.useCallback(
       (props: RenderTabBarFnProps) => {
@@ -224,7 +221,7 @@ let PagerTabBar = ({
   testID?: string
   scrollY: SharedValue<number>
   renderHeader?: () => JSX.Element
-  onHeaderOnlyLayout: (e: LayoutChangeEvent) => void
+  onHeaderOnlyLayout: (height: number) => void
   onTabBarLayout: (e: LayoutChangeEvent) => void
   onCurrentPageSelected?: (index: number) => void
   onSelect?: (index: number) => void
@@ -236,11 +233,34 @@ let PagerTabBar = ({
       },
     ],
   }))
+  const headerRef = React.useRef(null)
+  React.useEffect(() => {
+    // Fire when layout *becomes* ready.
+    // We can't rely on onLayout alone because it won't fire if layout is the same.
+    // We can't rely on this effect alone because it won't fire if layout changes later.
+    if (isHeaderReady) {
+      // @ts-ignore
+      headerRef.current!.measure(
+        (_x: number, _y: number, _width: number, height: number) => {
+          onHeaderOnlyLayout(height)
+        },
+      )
+    }
+  }, [isHeaderReady, onHeaderOnlyLayout])
+
   return (
     <Animated.View
       pointerEvents="box-none"
       style={[styles.tabBarMobile, headerTransform]}>
-      <View onLayout={onHeaderOnlyLayout} pointerEvents="box-none">
+      <View
+        ref={headerRef}
+        pointerEvents="box-none"
+        collapsable={false}
+        onLayout={e => {
+          if (isHeaderReady) {
+            onHeaderOnlyLayout(e.nativeEvent.layout.height)
+          }
+        }}>
         {renderHeader?.()}
       </View>
       <View