diff options
author | dan <dan.abramov@gmail.com> | 2024-01-26 05:23:56 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-25 21:23:56 -0800 |
commit | 23a4bbf6082a7d02c7dbf0af74f81e2200327eb0 (patch) | |
tree | bf3d5151cf84b22a38cd014be4109a5a946242b2 /src | |
parent | 157404132f43dc4fc42437fe27348a491161f241 (diff) | |
download | voidsky-23a4bbf6082a7d02c7dbf0af74f81e2200327eb0.tar.zst |
Prefetch profile links on web (#2634)
Diffstat (limited to 'src')
-rw-r--r-- | src/state/queries/profile.ts | 17 | ||||
-rw-r--r-- | src/view/com/util/Link.tsx | 2 | ||||
-rw-r--r-- | src/view/com/util/PostMeta.tsx | 9 | ||||
-rw-r--r-- | src/view/com/util/UserPreviewLink.tsx | 7 |
4 files changed, 34 insertions, 1 deletions
diff --git a/src/state/queries/profile.ts b/src/state/queries/profile.ts index e6203550f..74be99330 100644 --- a/src/state/queries/profile.ts +++ b/src/state/queries/profile.ts @@ -57,6 +57,23 @@ export function useProfilesQuery({handles}: {handles: string[]}) { }) } +export function usePrefetchProfileQuery() { + const queryClient = useQueryClient() + const prefetchProfileQuery = useCallback( + (did: string) => { + queryClient.prefetchQuery({ + queryKey: RQKEY(did), + queryFn: async () => { + const res = await getAgent().getProfile({actor: did || ''}) + return res.data + }, + }) + }, + [queryClient], + ) + return prefetchProfileQuery +} + interface ProfileUpdateParams { profile: AppBskyActorDefs.ProfileView updates: diff --git a/src/view/com/util/Link.tsx b/src/view/com/util/Link.tsx index db26258d6..a517ba430 100644 --- a/src/view/com/util/Link.tsx +++ b/src/view/com/util/Link.tsx @@ -47,6 +47,7 @@ interface Props extends ComponentProps<typeof TouchableOpacity> { asAnchor?: boolean anchorNoUnderline?: boolean navigationAction?: 'push' | 'replace' | 'navigate' + onPointerEnter?: () => void } export const Link = memo(function Link({ @@ -264,6 +265,7 @@ interface TextLinkOnWebOnlyProps extends TextProps { accessibilityHint?: string title?: string navigationAction?: 'push' | 'replace' | 'navigate' + onPointerEnter?: () => void } export const TextLinkOnWebOnly = memo(function DesktopWebTextLink({ testID, diff --git a/src/view/com/util/PostMeta.tsx b/src/view/com/util/PostMeta.tsx index b9c3842b3..4cd574d59 100644 --- a/src/view/com/util/PostMeta.tsx +++ b/src/view/com/util/PostMeta.tsx @@ -8,10 +8,11 @@ import {TypographyVariant} from 'lib/ThemeContext' import {UserAvatar} from './UserAvatar' import {sanitizeDisplayName} from 'lib/strings/display-names' import {sanitizeHandle} from 'lib/strings/handles' -import {isAndroid} from 'platform/detection' +import {isAndroid, isWeb} from 'platform/detection' import {TimeElapsed} from './TimeElapsed' import {makeProfileLink} from 'lib/routes/links' import {ModerationUI} from '@atproto/api' +import {usePrefetchProfileQuery} from '#/state/queries/profile' interface PostMetaOpts { author: { @@ -35,6 +36,7 @@ let PostMeta = (opts: PostMetaOpts): React.ReactNode => { const pal = usePalette('default') const displayName = opts.author.displayName || opts.author.handle const handle = opts.author.handle + const prefetchProfileQuery = usePrefetchProfileQuery() return ( <View style={[styles.container, opts.style]}> @@ -66,6 +68,11 @@ let PostMeta = (opts: PostMetaOpts): React.ReactNode => { </> } href={makeProfileLink(opts.author)} + onPointerEnter={() => { + if (isWeb) { + prefetchProfileQuery(opts.author.did) + } + }} /> </View> {!isAndroid && ( diff --git a/src/view/com/util/UserPreviewLink.tsx b/src/view/com/util/UserPreviewLink.tsx index a8985ce45..2f257bb5e 100644 --- a/src/view/com/util/UserPreviewLink.tsx +++ b/src/view/com/util/UserPreviewLink.tsx @@ -4,6 +4,7 @@ import {Link} from './Link' import {isAndroid, isWeb} from 'platform/detection' import {makeProfileLink} from 'lib/routes/links' import {useModalControls} from '#/state/modals' +import {usePrefetchProfileQuery} from '#/state/queries/profile' interface UserPreviewLinkProps { did: string @@ -14,10 +15,16 @@ export function UserPreviewLink( props: React.PropsWithChildren<UserPreviewLinkProps>, ) { const {openModal} = useModalControls() + const prefetchProfileQuery = usePrefetchProfileQuery() if (isWeb || isAndroid) { return ( <Link + onPointerEnter={() => { + if (isWeb) { + prefetchProfileQuery(props.did) + } + }} href={makeProfileLink(props)} title={props.handle} asAnchor |