diff --git a/src/screens/Search/Explore.tsx b/src/screens/Search/Explore.tsx index c670a32dce..a64611ee5b 100644 --- a/src/screens/Search/Explore.tsx +++ b/src/screens/Search/Explore.tsx @@ -922,7 +922,7 @@ export function Explore({ - + {item.feed.displayName} diff --git a/src/state/queries/explore-feed-previews.tsx b/src/state/queries/explore-feed-previews.tsx index f02adde791..53d6b841b4 100644 --- a/src/state/queries/explore-feed-previews.tsx +++ b/src/state/queries/explore-feed-previews.tsx @@ -1,4 +1,4 @@ -import {useMemo} from 'react' +import {useMemo, useRef} from 'react' import { type AppBskyActorDefs, AppBskyFeedDefs, @@ -127,6 +127,16 @@ export function useFeedPreviews( const moderationOpts = useModerationOpts() const enabled = feeds.length > 0 && isEnabled + const processedPageCache = useRef( + new Map< + { + feed: AppBskyFeedDefs.GeneratorView + posts: AppBskyFeedDefs.FeedViewPost[] + }, + FeedPreviewItem[] + >(), + ) + const query = useInfiniteQuery({ enabled, queryKey: RQKEY(uris), @@ -181,6 +191,13 @@ export function useFeedPreviews( } else if (data) { for (let pageIndex = 0; pageIndex < data.pages.length; pageIndex++) { const page = data.pages[pageIndex] + + const cachedPage = processedPageCache.current.get(page) + if (cachedPage) { + items.push(...cachedPage) + continue + } + // default feed tuner - we just want it to slice up the feed const tuner = new FeedTuner([]) const slices: FeedPreviewItem[] = [] @@ -280,8 +297,10 @@ export function useFeedPreviews( rowIndex++ } + let processedPage: FeedPreviewItem[] + if (slices.length > 0) { - items.push( + processedPage = [ { type: 'preview:header', key: `header-${page.feed.uri}`, @@ -292,8 +311,13 @@ export function useFeedPreviews( type: 'preview:footer', key: `footer-${page.feed.uri}`, }, - ) + ] + } else { + processedPage = [] } + + processedPageCache.current.set(page, processedPage) + items.push(...processedPage) } } else if (isError && !isEmpty) { items.push({