Bluesky app fork with some witchin' additions 💫 forked from jollywhoppers.com/witchsky.app
Something went wrong. Try again.
TypeScript
at commit 5efae600
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160import { type $Typed, type AppBskyBookmarkGetBookmarks, AppBskyFeedDefs, AtUri,} from '@atproto/api'import { type InfiniteData, type QueryClient, type QueryKey, 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]
export function useBookmarksQuery() { const agent = useAgent()
return useInfiniteQuery< AppBskyBookmarkGetBookmarks.OutputSchema, Error, InfiniteData<AppBskyBookmarkGetBookmarks.OutputSchema>, QueryKey, string | undefined >({ queryKey: createBookmarksQueryKey(), async queryFn({pageParam}) { const res = await agent.app.bsky.bookmark.getBookmarks({ cursor: pageParam, }) return res.data }, initialPageParam: undefined, getNextPageParam: lastPage => lastPage.cursor, })}
export async function truncateAndInvalidate(qc: QueryClient) { qc.setQueriesData<InfiniteData<AppBskyBookmarkGetBookmarks.OutputSchema>>( {queryKey: [bookmarksQueryKeyRoot]}, data => { if (data) { return { pageParams: data.pageParams.slice(0, 1), pages: data.pages.slice(0, 1), } } return data }, ) return qc.invalidateQueries({queryKey: [bookmarksQueryKeyRoot]})}
export async function optimisticallySaveBookmark( qc: QueryClient, post: AppBskyFeedDefs.PostView,) { qc.setQueriesData<InfiniteData<AppBskyBookmarkGetBookmarks.OutputSchema>>( { queryKey: [bookmarksQueryKeyRoot], }, data => { if (!data) return data return { ...data, pages: data.pages.map((page, index) => { if (index === 0) { post.$type = 'app.bsky.feed.defs#postView' return { ...page, bookmarks: [ { createdAt: new Date().toISOString(), subject: { uri: post.uri, cid: post.cid, }, item: post as $Typed<AppBskyFeedDefs.PostView>, }, ...page.bookmarks, ], } } return page }), } }, )}
export async function optimisticallyDeleteBookmark( qc: QueryClient, {uri}: {uri: string},) { qc.setQueriesData<InfiniteData<AppBskyBookmarkGetBookmarks.OutputSchema>>( { queryKey: [bookmarksQueryKeyRoot], }, data => { if (!data) return data return { ...data, pages: data.pages.map(page => { return { ...page, bookmarks: page.bookmarks.filter(b => b.subject.uri !== uri), } }), } }, )}
export function* findAllPostsInQueryData( queryClient: QueryClient, uri: string,): Generator<AppBskyFeedDefs.PostView, undefined> { const queryDatas = queryClient.getQueriesData< InfiniteData<AppBskyBookmarkGetBookmarks.OutputSchema> >({ 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<AppBskyFeedDefs.PostView>( 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) } } } }}