From 7b7f3d46e1831263b8145bdb06400ec91104dcdd Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Tue, 28 Nov 2023 17:13:26 -0800 Subject: [PATCH] De-closure post-feed --- src/state/queries/post-feed.ts | 100 ++++++++++++++++++++------------- 1 file changed, 62 insertions(+), 38 deletions(-) diff --git a/src/state/queries/post-feed.ts b/src/state/queries/post-feed.ts index 113e6f2fbd..91cae8c597 100644 --- a/src/state/queries/post-feed.ts +++ b/src/state/queries/post-feed.ts @@ -143,52 +143,76 @@ export function usePostFeedQuery( >({ staleTime: STALE.INFINITY, queryKey: RQKEY(feedDesc, params), - async queryFn({pageParam}: {pageParam: RQPageParam}) { - logger.debug('usePostFeedQuery', {feedDesc, pageParam}) - if (!pageParam) { - tuner.reset() - } - const res = await api.fetch({cursor: pageParam, limit: 30}) - precacheResolvedUris(queryClient, res.feed) // precache the handle->did resolution - const slices = tuner.tune(res.feed, feedTuners) - return { - cursor: res.cursor, - slices: slices.map(slice => ({ - _reactKey: slice._reactKey, - rootUri: slice.rootItem.post.uri, - isThread: - slice.items.length > 1 && - slice.items.every( - item => item.post.author.did === slice.items[0].post.author.did, - ), - items: slice.items - .map((item, i) => { - if ( - AppBskyFeedPost.isRecord(item.post.record) && - AppBskyFeedPost.validateRecord(item.post.record).success - ) { - return { - _reactKey: `${slice._reactKey}-${i}`, - uri: item.post.uri, - post: item.post, - record: item.post.record, - reason: i === 0 && slice.source ? slice.source : item.reason, - } - } - return undefined - }) - .filter(Boolean) as FeedPostSliceItem[], - })), - } - }, + queryFn, initialPageParam: undefined, getNextPageParam: lastPage => lastPage.cursor, + meta: {queryClient, tuner, api, feedTuners}, enabled, }) return {...out, pollLatest} } +interface QueryMeta { + queryClient: QueryClient + tuner: FeedTuner + api: FeedAPI + feedTuners: ReturnType +} + +async function queryFn({ + queryKey, + meta, + pageParam, +}: { + queryKey: QueryKey + meta: any + pageParam: RQPageParam +}) { + const [_, feedDesc, _params] = queryKey as ReturnType + const {queryClient, tuner, api, feedTuners} = meta as QueryMeta + + logger.debug('usePostFeedQuery', {feedDesc, pageParam}) + + if (!pageParam) { + tuner.reset() + } + + const res = await api.fetch({cursor: pageParam, limit: 30}) + precacheResolvedUris(queryClient, res.feed) // precache the handle->did resolution + + const slices = tuner.tune(res.feed, feedTuners) + return { + cursor: res.cursor, + slices: slices.map(slice => ({ + _reactKey: slice._reactKey, + rootUri: slice.rootItem.post.uri, + isThread: + slice.items.length > 1 && + slice.items.every( + item => item.post.author.did === slice.items[0].post.author.did, + ), + items: slice.items + .map((item, i) => { + if ( + AppBskyFeedPost.isRecord(item.post.record) && + AppBskyFeedPost.validateRecord(item.post.record).success + ) { + return { + _reactKey: `${slice._reactKey}-${i}`, + uri: item.post.uri, + post: item.post, + record: item.post.record, + reason: i === 0 && slice.source ? slice.source : item.reason, + } + } + return undefined + }) + .filter(Boolean) as FeedPostSliceItem[], + })), + } +} + /** * This helper is used by the post-thread placeholder function to * find a post in the query-data cache