diff --git a/src/view/com/pager/TabBar.tsx b/src/view/com/pager/TabBar.tsx index 929582c7c2..d4fd87bfc1 100644 --- a/src/view/com/pager/TabBar.tsx +++ b/src/view/com/pager/TabBar.tsx @@ -1,10 +1,12 @@ -import {useCallback, useMemo} from 'react' +import {useCallback, useState} from 'react' import {ScrollView, StyleSheet, View} from 'react-native' import Animated, { + interpolate, runOnUI, scrollTo, useAnimatedReaction, useAnimatedRef, + useAnimatedStyle, useSharedValue, } from 'react-native-reanimated' @@ -113,6 +115,46 @@ export function TabBar({ [onSelect, selectedPage, onPressSelected, onPressUIThread], ) + const [layouts, setLayouts] = useState([]) + const didLayout = + layouts.length === items.length && layouts.every(l => l !== undefined) + const indicatorStyle = useAnimatedStyle(() => { + if (!didLayout) { + return {} + } + return { + transform: [ + { + translateX: interpolate( + dragProgress.get(), + layouts.map((l, i) => i), + layouts.map(l => l.x + l.width / 2 - contentSize.get() / 2), + ), + }, + { + scaleX: interpolate( + dragProgress.get(), + layouts.map((l, i) => i), + layouts.map(l => (l.width - 12) / contentSize.get()), + ), + }, + ], + } + }) + + const onItemLayout = (e: LayoutChangeEvent, index: number) => { + const l = e.nativeEvent.layout + setLayouts(ls => + items.map((item, i) => { + if (i === index) { + return l + } else { + return ls[i] + } + }), + ) + } + return ( {items.map((item, i) => { return ( - + onItemLayout(e, i)}> + + ) })} + {didLayout && ( + + )} @@ -173,10 +231,6 @@ function TabBarItem({ onPressItem: (index: number) => void }) { const pal = usePalette('default') - const indicatorStyle = useMemo( - () => ({borderBottomColor: pal.colors.link}), - [pal], - ) return ( onPressItem(index)} accessibilityRole="tab"> - +