From 2d8ee88d086a5771f22186114e45dfee0ef09b10 Mon Sep 17 00:00:00 2001 From: Hailey Date: Wed, 7 Feb 2024 21:28:40 -0800 Subject: [PATCH] refactor uri resolution query --- src/state/queries/profile.ts | 12 +---- src/state/queries/resolve-uri.ts | 83 +++++++++++++++++++++++++++----- 2 files changed, 73 insertions(+), 22 deletions(-) diff --git a/src/state/queries/profile.ts b/src/state/queries/profile.ts index e32e6fd138..2cc19cc092 100644 --- a/src/state/queries/profile.ts +++ b/src/state/queries/profile.ts @@ -28,14 +28,7 @@ export const RQKEY = (did: string) => ['profile', did] export const profileBasicKey = (did: string) => ['profileBasic', did] export const profilesQueryKey = (handles: string[]) => ['profiles', handles] -export function useProfileQuery({ - did, - queryClient, -}: { - did: string | undefined - staleTime?: number - queryClient: QueryClient -}) { +export function useProfileQuery({did}: {did: string | undefined}) { // return useQuery({ // // WARNING // // this staleTime is load-bearing @@ -50,7 +43,7 @@ export function useProfileQuery({ // }, // enabled: !!did, // }) - + const queryClient = useQueryClient() // TODO Figure out a good staleTime for this. We should refetch on every profile push, because we need to check for // blocks return useQuery({ @@ -101,7 +94,6 @@ export function usePrefetchProfileQuery() { return prefetchProfileQuery } -// We don't need a useQuery hook for this. We never actually use this except for export function cacheProfileBasic( queryClient: QueryClient, profile: AppBskyActorDefs.ProfileViewBasic, diff --git a/src/state/queries/resolve-uri.ts b/src/state/queries/resolve-uri.ts index 827c94f0c1..ad3ce04032 100644 --- a/src/state/queries/resolve-uri.ts +++ b/src/state/queries/resolve-uri.ts @@ -1,4 +1,9 @@ -import {QueryClient, useQuery, UseQueryResult} from '@tanstack/react-query' +import { + QueryClient, + useQuery, + useQueryClient, + UseQueryResult, +} from '@tanstack/react-query' import { AtUri, AppBskyActorDefs, @@ -6,6 +11,7 @@ import { AppBskyEmbedRecord, AppBskyEmbedRecordWithMedia, } from '@atproto/api' +import {profileBasicKey as RQKEY_PROFILE_BASIC} from 'state/queries/profile' import {getAgent} from '#/state/session' import {STALE} from '#/state/queries' @@ -13,6 +19,37 @@ import {ThreadNode} from './post-thread' export const RQKEY = (didOrHandle: string) => ['resolved-did', didOrHandle] +// export function useResolveUriQuery(uri: string | undefined): UriUseQueryResult { +// const urip = new AtUri(uri || '') +// const res = useResolveDidQuery(urip.host) +// if (res.data) { +// urip.host = res.data +// return { +// ...res, +// data: {did: urip.host, uri: urip.toString()}, +// } as UriUseQueryResult +// } +// return res as UriUseQueryResult +// } +// +// export function useResolveDidQuery(didOrHandle: string | undefined) { +// return useQuery({ +// staleTime: STALE.HOURS.ONE, +// queryKey: RQKEY(didOrHandle || ''), +// async queryFn() { +// if (!didOrHandle) { +// return '' +// } +// if (!didOrHandle.startsWith('did:')) { +// const res = await getAgent().resolveHandle({handle: didOrHandle}) +// didOrHandle = res.data.did +// } +// return didOrHandle +// }, +// enabled: !!didOrHandle, +// }) +// } + type UriUseQueryResult = UseQueryResult<{did: string; uri: string}, Error> export function useResolveUriQuery(uri: string | undefined): UriUseQueryResult { const urip = new AtUri(uri || '') @@ -28,20 +65,42 @@ export function useResolveUriQuery(uri: string | undefined): UriUseQueryResult { } export function useResolveDidQuery(didOrHandle: string | undefined) { + const queryClient = useQueryClient() + return useQuery({ staleTime: STALE.HOURS.ONE, - queryKey: RQKEY(didOrHandle || ''), - async queryFn() { - if (!didOrHandle) { - return '' - } - if (!didOrHandle.startsWith('did:')) { - const res = await getAgent().resolveHandle({handle: didOrHandle}) - didOrHandle = res.data.did - } - return didOrHandle + queryKey: RQKEY(didOrHandle ?? ''), + queryFn: async () => { + if (!didOrHandle) return '' + + const res = await getAgent().resolveHandle({handle: didOrHandle}) + return res.data.did + }, + initialData: () => { + // Return undefined if no did or handle + if (!didOrHandle) return + + let item: AppBskyActorDefs.ProfileViewBasic | undefined + + if (!didOrHandle?.startsWith('did:')) { + // If this is a handle all we have to do is use the query key + item = queryClient.getQueryData( + RQKEY_PROFILE_BASIC(didOrHandle), + ) + } else { + // If it is a did we need to search the queries data + item = queryClient + .getQueriesData({ + queryKey: ['profileBasic'], + exact: false, + }) + .find(q => q[1]?.did === didOrHandle)?.[1] + } + // Return nothing if we don't find one + if (!item) return undefined + + return item.did }, - enabled: !!didOrHandle, }) }