From 4654a9a45e68eeba289f2f35473fb2af60e754e2 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 24 Aug 2023 18:26:29 -0500 Subject: [PATCH] defer loading of feeds until visible (#1271) * defer loading of feeds until visible * Fix: use existing hasLoaded * Fix: dont query for latest during initial load --------- Co-authored-by: Paul Frazee --- src/state/models/feeds/posts.ts | 2 +- src/view/com/posts/Feed.tsx | 67 ++++++++++++++++----------------- src/view/screens/Home.tsx | 8 +++- 3 files changed, 40 insertions(+), 37 deletions(-) diff --git a/src/state/models/feeds/posts.ts b/src/state/models/feeds/posts.ts index 8bc75daa..15145a20 100644 --- a/src/state/models/feeds/posts.ts +++ b/src/state/models/feeds/posts.ts @@ -272,7 +272,7 @@ export class PostsFeedModel { * Check if new posts are available */ async checkForLatest() { - if (this.hasNewLatest || this.isLoading) { + if (!this.hasLoaded || this.hasNewLatest || this.isLoading) { return } const res = await this._getFeed({limit: 1}) diff --git a/src/view/com/posts/Feed.tsx b/src/view/com/posts/Feed.tsx index 5035d345..55e69a31 100644 --- a/src/view/com/posts/Feed.tsx +++ b/src/view/com/posts/Feed.tsx @@ -69,14 +69,11 @@ export const Feed = observer(function Feed({ if (feed.loadMoreError) { feedItems = feedItems.concat([LOAD_MORE_ERROR_ITEM]) } - } else if (feed.isLoading) { - feedItems = feedItems.concat([LOADING_ITEM]) } return feedItems }, [ feed.hasError, feed.hasLoaded, - feed.isLoading, feed.isEmpty, feed.slices, feed.loadMoreError, @@ -97,6 +94,8 @@ export const Feed = observer(function Feed({ }, [feed, track, setIsRefreshing]) const onEndReached = React.useCallback(async () => { + if (!feed.hasLoaded) return + track('Feed:onEndReached') try { await feed.loadMore() @@ -155,38 +154,36 @@ export const Feed = observer(function Feed({ return ( - {data.length > 0 && ( - item._reactKey} - renderItem={renderItem} - ListFooterComponent={FeedFooter} - ListHeaderComponent={ListHeaderComponent} - refreshControl={ - - } - contentContainerStyle={s.contentContainer} - style={{paddingTop: headerOffset}} - onScroll={onScroll} - scrollEventThrottle={scrollEventThrottle} - indicatorStyle={theme.colorScheme === 'dark' ? 'white' : 'black'} - onEndReached={onEndReached} - onEndReachedThreshold={0.6} - removeClippedSubviews={true} - contentOffset={{x: 0, y: headerOffset * -1}} - extraData={extraData} - // @ts-ignore our .web version only -prf - desktopFixedHeight - /> - )} + item._reactKey} + renderItem={renderItem} + ListFooterComponent={FeedFooter} + ListHeaderComponent={ListHeaderComponent} + refreshControl={ + + } + contentContainerStyle={s.contentContainer} + style={{paddingTop: headerOffset}} + onScroll={onScroll} + scrollEventThrottle={scrollEventThrottle} + indicatorStyle={theme.colorScheme === 'dark' ? 'white' : 'black'} + onEndReached={onEndReached} + onEndReachedThreshold={0.6} + removeClippedSubviews={true} + contentOffset={{x: 0, y: headerOffset * -1}} + extraData={extraData} + // @ts-ignore our .web version only -prf + desktopFixedHeight + /> ) }) diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx index b633e0e1..9259d4be 100644 --- a/src/view/screens/Home.tsx +++ b/src/view/screens/Home.tsx @@ -56,7 +56,6 @@ export const HomeScreen = withAuthRequired( const feeds = [] for (const feed of pinned) { const model = new PostsFeedModel(store, 'custom', {feed: feed.uri}) - model.setup() feeds.push(model) } pagerRef.current?.setPage(0) @@ -169,6 +168,13 @@ const FeedPage = observer( }) const isScreenFocused = useIsFocused() + React.useEffect(() => { + // called on first load + if (!feed.hasLoaded && isPageFocused) { + feed.setup() + } + }, [isPageFocused, feed]) + const doPoll = React.useCallback( (knownActive = false) => { if (