Bluesky app fork with some witchin' additions 馃挮
at feat/tealfm 61 lines 1.8 kB view raw
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}