diff options
author | dan <dan.abramov@gmail.com> | 2023-11-22 04:25:11 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-22 04:25:11 +0000 |
commit | 08333002cc4589c225c8fb82112d7059c334bfeb (patch) | |
tree | 81c3b590426de7d7d065eab4be07ab34165f7a62 /src/view/com/feeds | |
parent | 3de1d556a9e1a782ef1103251685d9693312c8d8 (diff) | |
download | voidsky-08333002cc4589c225c8fb82112d7059c334bfeb.tar.zst |
Implement "scroll to top" for profile tabs (#1973)
* Hook up scroll to top handlers * Scroll and invalidate Feeds/Lists * Fix index calc due to conditional tabs * Reorder lines for clarity
Diffstat (limited to 'src/view/com/feeds')
-rw-r--r-- | src/view/com/feeds/ProfileFeedgens.tsx | 52 |
1 files changed, 38 insertions, 14 deletions
diff --git a/src/view/com/feeds/ProfileFeedgens.tsx b/src/view/com/feeds/ProfileFeedgens.tsx index a3c914595..77da2fd0b 100644 --- a/src/view/com/feeds/ProfileFeedgens.tsx +++ b/src/view/com/feeds/ProfileFeedgens.tsx @@ -8,13 +8,14 @@ import { View, ViewStyle, } from 'react-native' +import {useQueryClient} from '@tanstack/react-query' import {FlatList} from '../util/Views' import {FeedSourceCardLoaded} from './FeedSourceCard' import {ErrorMessage} from '../util/error/ErrorMessage' import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn' import {Text} from '../util/text/Text' import {usePalette} from 'lib/hooks/usePalette' -import {useProfileFeedgensQuery} from '#/state/queries/profile-feedgens' +import {useProfileFeedgensQuery, RQKEY} from '#/state/queries/profile-feedgens' import {OnScrollHandler} from '#/lib/hooks/useOnMainScroll' import {logger} from '#/logger' import {Trans} from '@lingui/macro' @@ -29,25 +30,37 @@ const EMPTY = {_reactKey: '__empty__'} const ERROR_ITEM = {_reactKey: '__error__'} const LOAD_MORE_ERROR_ITEM = {_reactKey: '__load_more_error__'} -export function ProfileFeedgens({ - did, - scrollElRef, - onScroll, - scrollEventThrottle, - headerOffset, - enabled, - style, - testID, -}: { +interface SectionRef { + scrollToTop: () => void +} + +interface ProfileFeedgensProps { did: string - scrollElRef?: MutableRefObject<FlatList<any> | null> + scrollElRef: MutableRefObject<FlatList<any> | null> onScroll?: OnScrollHandler scrollEventThrottle?: number headerOffset: number enabled?: boolean style?: StyleProp<ViewStyle> testID?: string -}) { +} + +export const ProfileFeedgens = React.forwardRef< + SectionRef, + ProfileFeedgensProps +>(function ProfileFeedgensImpl( + { + did, + scrollElRef, + onScroll, + scrollEventThrottle, + headerOffset, + enabled, + style, + testID, + }, + ref, +) { const pal = usePalette('default') const theme = useTheme() const [isPTRing, setIsPTRing] = React.useState(false) @@ -88,6 +101,17 @@ export function ProfileFeedgens({ // events // = + const queryClient = useQueryClient() + + const onScrollToTop = React.useCallback(() => { + scrollElRef.current?.scrollToOffset({offset: -headerOffset}) + queryClient.invalidateQueries({queryKey: RQKEY(did)}) + }, [scrollElRef, queryClient, headerOffset, did]) + + React.useImperativeHandle(ref, () => ({ + scrollToTop: onScrollToTop, + })) + const onRefresh = React.useCallback(async () => { setIsPTRing(true) try { @@ -192,7 +216,7 @@ export function ProfileFeedgens({ /> </View> ) -} +}) const styles = StyleSheet.create({ item: { |