diff options
Diffstat (limited to 'src/view/com/pager')
-rw-r--r-- | src/view/com/pager/PagerWithHeader.tsx | 22 | ||||
-rw-r--r-- | src/view/com/pager/PagerWithHeader.web.tsx | 34 |
2 files changed, 40 insertions, 16 deletions
diff --git a/src/view/com/pager/PagerWithHeader.tsx b/src/view/com/pager/PagerWithHeader.tsx index 7e9ed24db..31abc1ab7 100644 --- a/src/view/com/pager/PagerWithHeader.tsx +++ b/src/view/com/pager/PagerWithHeader.tsx @@ -61,25 +61,21 @@ export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>( const headerHeight = headerOnlyHeight + tabBarHeight // capture the header bar sizing - const onTabBarLayout = React.useCallback( - (evt: LayoutChangeEvent) => { - const height = evt.nativeEvent.layout.height - if (height > 0) { - // The rounding is necessary to prevent jumps on iOS - setTabBarHeight(Math.round(height)) - } - }, - [setTabBarHeight], - ) - const onHeaderOnlyLayout = React.useCallback( + const onTabBarLayout = useNonReactiveCallback((evt: LayoutChangeEvent) => { + const height = evt.nativeEvent.layout.height + if (height > 0) { + // The rounding is necessary to prevent jumps on iOS + setTabBarHeight(Math.round(height)) + } + }) + const onHeaderOnlyLayout = useNonReactiveCallback( (evt: LayoutChangeEvent) => { const height = evt.nativeEvent.layout.height - if (height > 0) { + if (height > 0 && isHeaderReady) { // The rounding is necessary to prevent jumps on iOS setHeaderOnlyHeight(Math.round(height)) } }, - [setHeaderOnlyHeight], ) const renderTabBar = React.useCallback( diff --git a/src/view/com/pager/PagerWithHeader.web.tsx b/src/view/com/pager/PagerWithHeader.web.tsx index 4f959d548..9c63c149f 100644 --- a/src/view/com/pager/PagerWithHeader.web.tsx +++ b/src/view/com/pager/PagerWithHeader.web.tsx @@ -31,6 +31,7 @@ export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>( children, testID, items, + isHeaderReady, renderHeader, initialPage, onPageSelected, @@ -46,6 +47,7 @@ export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>( <PagerTabBar items={items} renderHeader={renderHeader} + isHeaderReady={isHeaderReady} currentPage={currentPage} onCurrentPageSelected={onCurrentPageSelected} onSelect={props.onSelect} @@ -54,7 +56,14 @@ export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>( /> ) }, - [items, renderHeader, currentPage, onCurrentPageSelected, testID], + [ + items, + isHeaderReady, + renderHeader, + currentPage, + onCurrentPageSelected, + testID, + ], ) const onPageSelectedInner = React.useCallback( @@ -80,8 +89,14 @@ export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>( {toArray(children) .filter(Boolean) .map((child, i) => { + const isReady = isHeaderReady return ( - <View key={i} collapsable={false}> + <View + key={i} + collapsable={false} + style={{ + display: isReady ? undefined : 'none', + }}> <PagerItem isFocused={i === currentPage} renderTab={child} /> </View> ) @@ -94,6 +109,7 @@ export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>( let PagerTabBar = ({ currentPage, items, + isHeaderReady, testID, renderHeader, onCurrentPageSelected, @@ -104,6 +120,7 @@ let PagerTabBar = ({ items: string[] testID?: string renderHeader?: () => JSX.Element + isHeaderReady: boolean onCurrentPageSelected?: (index: number) => void onSelect?: (index: number) => void tabBarAnchor?: JSX.Element | null | undefined @@ -112,7 +129,12 @@ let PagerTabBar = ({ const {isMobile} = useWebMediaQueries() return ( <> - <View style={[!isMobile && styles.headerContainerDesktop, pal.border]}> + <View + style={[ + !isMobile && styles.headerContainerDesktop, + pal.border, + !isHeaderReady && styles.loadingHeader, + ]}> {renderHeader?.()} </View> {tabBarAnchor} @@ -123,6 +145,9 @@ let PagerTabBar = ({ ? styles.tabBarContainerMobile : styles.tabBarContainerDesktop, pal.border, + { + display: isHeaderReady ? undefined : 'none', + }, ]}> <TabBar testID={testID} @@ -183,6 +208,9 @@ const styles = StyleSheet.create({ paddingLeft: 14, paddingRight: 14, }, + loadingHeader: { + borderColor: 'transparent', + }, }) function toArray<T>(v: T | T[]): T[] { |