add allowHeaderOverscroll prop

This commit is contained in:
Samuel Newman
2024-04-10 20:58:27 +01:00
parent 310d865440
commit ff5434af6d
4 changed files with 30 additions and 14 deletions
+19 -9
View File
@@ -1,26 +1,27 @@
import * as React from 'react' import * as React from 'react'
import { import {
LayoutChangeEvent, LayoutChangeEvent,
NativeScrollEvent,
ScrollView, ScrollView,
StyleSheet, StyleSheet,
View, View,
NativeScrollEvent,
} from 'react-native' } from 'react-native'
import Animated, { import Animated, {
useAnimatedStyle, AnimatedRef,
useSharedValue,
runOnJS, runOnJS,
runOnUI, runOnUI,
scrollTo, scrollTo,
useAnimatedRef,
AnimatedRef,
SharedValue, SharedValue,
useAnimatedRef,
useAnimatedStyle,
useSharedValue,
} from 'react-native-reanimated' } from 'react-native-reanimated'
import {Pager, PagerRef, RenderTabBarFnProps} from 'view/com/pager/Pager'
import {TabBar} from './TabBar'
import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback'
import {ListMethods} from '../util/List'
import {ScrollProvider} from '#/lib/ScrollContext' import {ScrollProvider} from '#/lib/ScrollContext'
import {Pager, PagerRef, RenderTabBarFnProps} from 'view/com/pager/Pager'
import {ListMethods} from '../util/List'
import {TabBar} from './TabBar'
export interface PagerWithHeaderChildParams { export interface PagerWithHeaderChildParams {
headerHeight: number headerHeight: number
@@ -39,6 +40,7 @@ export interface PagerWithHeaderProps {
initialPage?: number initialPage?: number
onPageSelected?: (index: number) => void onPageSelected?: (index: number) => void
onCurrentPageSelected?: (index: number) => void onCurrentPageSelected?: (index: number) => void
allowHeaderOverscroll?: boolean
} }
export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>( export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>(
function PageWithHeaderImpl( function PageWithHeaderImpl(
@@ -51,6 +53,7 @@ export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>(
initialPage, initialPage,
onPageSelected, onPageSelected,
onCurrentPageSelected, onCurrentPageSelected,
allowHeaderOverscroll,
}: PagerWithHeaderProps, }: PagerWithHeaderProps,
ref, ref,
) { ) {
@@ -90,6 +93,7 @@ export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>(
onSelect={props.onSelect} onSelect={props.onSelect}
scrollY={scrollY} scrollY={scrollY}
testID={testID} testID={testID}
allowHeaderOverscroll={allowHeaderOverscroll}
/> />
) )
}, },
@@ -104,6 +108,7 @@ export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>(
onHeaderOnlyLayout, onHeaderOnlyLayout,
scrollY, scrollY,
testID, testID,
allowHeaderOverscroll,
], ],
) )
@@ -213,6 +218,7 @@ let PagerTabBar = ({
onTabBarLayout, onTabBarLayout,
onCurrentPageSelected, onCurrentPageSelected,
onSelect, onSelect,
allowHeaderOverscroll,
}: { }: {
currentPage: number currentPage: number
headerOnlyHeight: number headerOnlyHeight: number
@@ -225,11 +231,15 @@ let PagerTabBar = ({
onTabBarLayout: (e: LayoutChangeEvent) => void onTabBarLayout: (e: LayoutChangeEvent) => void
onCurrentPageSelected?: (index: number) => void onCurrentPageSelected?: (index: number) => void
onSelect?: (index: number) => void onSelect?: (index: number) => void
allowHeaderOverscroll?: boolean
}): React.ReactNode => { }): React.ReactNode => {
const headerTransform = useAnimatedStyle(() => ({ const headerTransform = useAnimatedStyle(() => ({
transform: [ transform: [
{ {
translateY: Math.min(Math.min(scrollY.value, headerOnlyHeight) * -1, 0), translateY: Math.min(
Math.min(scrollY.value, headerOnlyHeight) * -1,
allowHeaderOverscroll ? Infinity : 0,
),
}, },
], ],
})) }))
+3
View File
@@ -63,6 +63,7 @@ let Feed = ({
desktopFixedHeightOffset, desktopFixedHeightOffset,
ListHeaderComponent, ListHeaderComponent,
extraData, extraData,
progressViewOffset,
}: { }: {
feed: FeedDescriptor feed: FeedDescriptor
feedParams?: FeedParams feedParams?: FeedParams
@@ -81,6 +82,7 @@ let Feed = ({
desktopFixedHeightOffset?: number desktopFixedHeightOffset?: number
ListHeaderComponent?: () => JSX.Element ListHeaderComponent?: () => JSX.Element
extraData?: any extraData?: any
progressViewOffset?: number
}): React.ReactNode => { }): React.ReactNode => {
const theme = useTheme() const theme = useTheme()
const {track} = useAnalytics() const {track} = useAnalytics()
@@ -338,6 +340,7 @@ let Feed = ({
refreshing={isPTRing} refreshing={isPTRing}
onRefresh={onRefresh} onRefresh={onRefresh}
headerOffset={headerOffset} headerOffset={headerOffset}
progressViewOffset={progressViewOffset}
contentContainerStyle={{ contentContainerStyle={{
minHeight: Dimensions.get('window').height * 1.5, minHeight: Dimensions.get('window').height * 1.5,
}} }}
+6 -4
View File
@@ -1,11 +1,12 @@
import React, {memo} from 'react' import React, {memo} from 'react'
import {FlatListProps, RefreshControl} from 'react-native' import {FlatListProps, RefreshControl} from 'react-native'
import {FlatList_INTERNAL} from './Views'
import {addStyle} from 'lib/styles'
import {useScrollHandlers} from '#/lib/ScrollContext'
import {runOnJS, useSharedValue} from 'react-native-reanimated' import {runOnJS, useSharedValue} from 'react-native-reanimated'
import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED' import {useAnimatedScrollHandler} from '#/lib/hooks/useAnimatedScrollHandler_FIXED'
import {usePalette} from '#/lib/hooks/usePalette' import {usePalette} from '#/lib/hooks/usePalette'
import {useScrollHandlers} from '#/lib/ScrollContext'
import {addStyle} from 'lib/styles'
import {FlatList_INTERNAL} from './Views'
export type ListMethods = FlatList_INTERNAL export type ListMethods = FlatList_INTERNAL
export type ListProps<ItemT> = Omit< export type ListProps<ItemT> = Omit<
@@ -30,6 +31,7 @@ function ListImpl<ItemT>(
onRefresh, onRefresh,
headerOffset, headerOffset,
style, style,
progressViewOffset,
...props ...props
}: ListProps<ItemT>, }: ListProps<ItemT>,
ref: React.Ref<ListMethods>, ref: React.Ref<ListMethods>,
@@ -70,7 +72,7 @@ function ListImpl<ItemT>(
onRefresh={onRefresh} onRefresh={onRefresh}
tintColor={pal.colors.text} tintColor={pal.colors.text}
titleColor={pal.colors.text} titleColor={pal.colors.text}
progressViewOffset={headerOffset} progressViewOffset={progressViewOffset ?? headerOffset}
/> />
) )
} }
+2 -1
View File
@@ -347,7 +347,8 @@ function ProfileScreenLoaded({
items={sectionTitles} items={sectionTitles}
onPageSelected={onPageSelected} onPageSelected={onPageSelected}
onCurrentPageSelected={onCurrentPageSelected} onCurrentPageSelected={onCurrentPageSelected}
renderHeader={renderHeader}> renderHeader={renderHeader}
allowHeaderOverscroll>
{showFiltersTab {showFiltersTab
? ({headerHeight, scrollElRef}) => ( ? ({headerHeight, scrollElRef}) => (
<ProfileLabelsSection <ProfileLabelsSection