forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1import {AtUri} from '@atproto/api'
2import {
3 type QueryClient,
4 useQuery,
5 type UseQueryResult,
6} from '@tanstack/react-query'
7
8import {STALE} from '#/state/queries'
9import {useAgent} from '#/state/session'
10import {useUnstableProfileViewCache} from './profile'
11
12const RQKEY_ROOT = 'resolved-did'
13export const RQKEY = (didOrHandle: string) => [RQKEY_ROOT, didOrHandle]
14
15type UriUseQueryResult = UseQueryResult<{did: string; uri: string}, Error>
16export function useResolveUriQuery(uri: string | undefined): UriUseQueryResult {
17 const urip = new AtUri(uri || '')
18 const res = useResolveDidQuery(urip.host)
19 if (res.data) {
20 // @ts-expect-error TODO new-sdk-migration
21 urip.host = res.data
22 return {
23 ...res,
24 data: {did: urip.host, uri: urip.toString()},
25 } as UriUseQueryResult
26 }
27 return res as UriUseQueryResult
28}
29
30export function useResolveDidQuery(didOrHandle: string | undefined) {
31 const agent = useAgent()
32 const {getUnstableProfile} = useUnstableProfileViewCache()
33
34 return useQuery<string, Error>({
35 staleTime: STALE.HOURS.ONE,
36 queryKey: RQKEY(didOrHandle ?? ''),
37 queryFn: async () => {
38 if (!didOrHandle) return ''
39 // Just return the did if it's already one
40 if (didOrHandle.startsWith('did:')) return didOrHandle
41
42 const res = await agent.resolveHandle({handle: didOrHandle})
43 return res.data.did
44 },
45 initialData: () => {
46 // Return undefined if no did or handle
47 if (!didOrHandle) return
48 const profile = getUnstableProfile(didOrHandle)
49 return profile?.did
50 },
51 enabled: !!didOrHandle,
52 })
53}
54
55export function precacheResolvedUri(
56 queryClient: QueryClient,
57 handle: string,
58 did: string,
59) {
60 queryClient.setQueryData<string>(RQKEY(handle), did)
61}