From 11dff765db1198f84c96c0f43c9284cce721bb7f Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 20 Oct 2025 05:05:49 -0500 Subject: [PATCH] Hook up post shadow to saved posts (#9225) --- src/state/cache/post-shadow.ts | 4 ++ .../queries/bookmarks/useBookmarksQuery.ts | 47 ++++++++++++++++++- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/state/cache/post-shadow.ts b/src/state/cache/post-shadow.ts index 05a702cd5f..0afa272c53 100644 --- a/src/state/cache/post-shadow.ts +++ b/src/state/cache/post-shadow.ts @@ -8,6 +8,7 @@ import {type QueryClient} from '@tanstack/react-query' import EventEmitter from 'eventemitter3' import {batchedUpdates} from '#/lib/batchedUpdates' +import {findAllPostsInQueryData as findAllPostsInBookmarksQueryData} from '#/state/queries/bookmarks/useBookmarksQuery' import {findAllPostsInQueryData as findAllPostsInExploreFeedPreviewsQueryData} from '#/state/queries/explore-feed-previews' import {findAllPostsInQueryData as findAllPostsInNotifsQueryData} from '#/state/queries/notifications/feed' import {findAllPostsInQueryData as findAllPostsInFeedQueryData} from '#/state/queries/post-feed' @@ -190,4 +191,7 @@ function* findPostsInCache( )) { yield post } + for (let post of findAllPostsInBookmarksQueryData(queryClient, uri)) { + yield post + } } diff --git a/src/state/queries/bookmarks/useBookmarksQuery.ts b/src/state/queries/bookmarks/useBookmarksQuery.ts index 46838facb4..3e8e87a132 100644 --- a/src/state/queries/bookmarks/useBookmarksQuery.ts +++ b/src/state/queries/bookmarks/useBookmarksQuery.ts @@ -1,7 +1,8 @@ import { type $Typed, type AppBskyBookmarkGetBookmarks, - type AppBskyFeedDefs, + AppBskyFeedDefs, + AtUri, } from '@atproto/api' import { type InfiniteData, @@ -10,7 +11,13 @@ import { useInfiniteQuery, } from '@tanstack/react-query' +import { + didOrHandleUriMatches, + embedViewRecordToPostView, + getEmbeddedPost, +} from '#/state/queries/util' import {useAgent} from '#/state/session' +import * as bsky from '#/types/bsky' export const bookmarksQueryKeyRoot = 'bookmarks' export const createBookmarksQueryKey = () => [bookmarksQueryKeyRoot] @@ -112,3 +119,41 @@ export async function optimisticallyDeleteBookmark( }, ) } + +export function* findAllPostsInQueryData( + queryClient: QueryClient, + uri: string, +): Generator { + const queryDatas = queryClient.getQueriesData< + InfiniteData + >({ + queryKey: [bookmarksQueryKeyRoot], + }) + const atUri = new AtUri(uri) + + for (const [_queryKey, queryData] of queryDatas) { + if (!queryData?.pages) { + continue + } + for (const page of queryData?.pages) { + for (const bookmark of page.bookmarks) { + if ( + !bsky.dangerousIsType( + bookmark.item, + AppBskyFeedDefs.isPostView, + ) + ) + continue + + if (didOrHandleUriMatches(atUri, bookmark.item)) { + yield bookmark.item + } + + const quotedPost = getEmbeddedPost(bookmark.item.embed) + if (quotedPost && didOrHandleUriMatches(atUri, quotedPost)) { + yield embedViewRecordToPostView(quotedPost) + } + } + } + } +}