From f63ed57e3b0019c26a730150e1733370d44baaa9 Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Fri, 4 Aug 2023 13:48:07 -0700 Subject: Fix repeated firing of scroll into view on large threads (#1108) --- src/view/com/post-thread/PostThread.tsx | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/view/com/post-thread/PostThread.tsx b/src/view/com/post-thread/PostThread.tsx index e7282cf83..399e47006 100644 --- a/src/view/com/post-thread/PostThread.tsx +++ b/src/view/com/post-thread/PostThread.tsx @@ -63,6 +63,7 @@ export const PostThread = observer(function PostThread({ }) { const pal = usePalette('default') const ref = useRef(null) + const hasScrolledIntoView = useRef(false) const [isRefreshing, setIsRefreshing] = React.useState(false) const navigation = useNavigation() const posts = React.useMemo(() => { @@ -102,14 +103,36 @@ export const PostThread = observer(function PostThread({ }, [view, setIsRefreshing]) const onContentSizeChange = React.useCallback(() => { + // only run once + if (hasScrolledIntoView.current) { + return + } + + // wait for loading to finish + if ( + !view.hasContent || + (view.isFromCache && view.isLoadingFromCache) || + view.isLoading + ) { + return + } + const index = posts.findIndex(post => post._isHighlightedPost) if (index !== -1) { ref.current?.scrollToIndex({ index, animated: false, + viewPosition: 0, }) + hasScrolledIntoView.current = true } - }, [posts, ref]) + }, [ + posts, + view.hasContent, + view.isFromCache, + view.isLoadingFromCache, + view.isLoading, + ]) const onScrollToIndexFailed = React.useCallback( (info: { index: number @@ -279,7 +302,9 @@ export const PostThread = observer(function PostThread({ data={posts} initialNumToRender={posts.length} maintainVisibleContentPosition={ - view.isFromCache ? MAINTAIN_VISIBLE_CONTENT_POSITION : undefined + isIOS && view.isFromCache + ? MAINTAIN_VISIBLE_CONTENT_POSITION + : undefined } keyExtractor={item => item._reactKey} renderItem={renderItem} @@ -292,7 +317,7 @@ export const PostThread = observer(function PostThread({ /> } onContentSizeChange={ - !isIOS || !view.isFromCache ? onContentSizeChange : undefined + isIOS && view.isFromCache ? undefined : onContentSizeChange } onScrollToIndexFailed={onScrollToIndexFailed} style={s.hContentRegion} -- cgit 1.4.1