Files
bsky-social-app/src/state/queries/resolve-link.ts
T
2026-07-31 16:07:52 +03:00

75 lines
2.1 KiB
TypeScript

import {type QueryClient, queryOptions, useQuery} from '@tanstack/react-query'
import {
type ResolveClients,
type ResolvedLink,
resolveGif,
resolveLink,
} from '#/lib/api/resolve'
import {STALE} from '#/state/queries/index'
import {useAppviewClient, useChatClient} from '#/state/session'
import {type Gif} from '#/features/gifPicker/types'
export const RQKEY_LINK_ROOT = 'resolve-link'
export const RQKEY_LINK = (url: string) => [RQKEY_LINK_ROOT, url]
export const RQKEY_GIF_ROOT = 'resolve-gif'
export const RQKEY_GIF = (url: string) => [RQKEY_GIF_ROOT, url]
export function resolveLinkQueryOptions(clients: ResolveClients, url: string) {
return queryOptions({
staleTime: STALE.HOURS.ONE,
queryKey: RQKEY_LINK(url),
queryFn: () => resolveLink(clients, url),
})
}
/**
* Bundle the clients the link resolver needs from the session hooks. The
* appview client serves the `app.bsky.*` reads and handle resolution, and the
* chat client serves group join-link previews.
*/
export function useResolveClients(): ResolveClients {
const appview = useAppviewClient()
const chat = useChatClient()
return {appview, chat}
}
export function useResolveLinkQuery(url: string) {
const clients = useResolveClients()
return useQuery(resolveLinkQueryOptions(clients, url))
}
export function fetchResolveLinkQuery(
queryClient: QueryClient,
clients: ResolveClients,
url: string,
) {
return queryClient.fetchQuery(resolveLinkQueryOptions(clients, url))
}
export function precacheResolveLinkQuery(
queryClient: QueryClient,
url: string,
resolvedLink: ResolvedLink,
) {
queryClient.setQueryData(RQKEY_LINK(url), resolvedLink)
}
export function useResolveGifQuery(gif: Gif) {
return useQuery({
staleTime: STALE.HOURS.ONE,
queryKey: RQKEY_GIF(gif.url),
queryFn: async () => {
return await resolveGif(gif)
},
})
}
export function fetchResolveGifQuery(queryClient: QueryClient, gif: Gif) {
return queryClient.fetchQuery({
staleTime: STALE.HOURS.ONE,
queryKey: RQKEY_GIF(gif.url),
queryFn: async () => {
return await resolveGif(gif)
},
})
}