From 97fdd7c59b2078b492d3e7dcb44ee918f7f3fe5a Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Fri, 13 Mar 2026 09:18:23 -0700 Subject: [PATCH] Create new useSuggestedFollowsByActorWithDismiss hook (#10048) --- src/components/FeedInterstitials.tsx | 43 ++------------- .../Profile/Header/SuggestedFollows.tsx | 50 +----------------- src/state/queries/suggested-follows.ts | 52 +++++++++++++++++++ 3 files changed, 58 insertions(+), 87 deletions(-) diff --git a/src/components/FeedInterstitials.tsx b/src/components/FeedInterstitials.tsx index aff354ac1c..1a64d01bbf 100644 --- a/src/components/FeedInterstitials.tsx +++ b/src/components/FeedInterstitials.tsx @@ -12,17 +12,13 @@ import {msg} from '@lingui/core/macro' import {useLingui} from '@lingui/react' import {Trans} from '@lingui/react/macro' import {useNavigation} from '@react-navigation/native' -import {useQueryClient} from '@tanstack/react-query' import {type NavigationProp} from '#/lib/routes/types' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useGetPopularFeedsQuery} from '#/state/queries/feed' import {type FeedDescriptor} from '#/state/queries/post-feed' import {useProfilesQuery} from '#/state/queries/profile' -import { - suggestedFollowsByActorQueryKey, - useSuggestedFollowsByActorQuery, -} from '#/state/queries/suggested-follows' +import {useSuggestedFollowsByActorWithDismiss} from '#/state/queries/suggested-follows' import {useSession} from '#/state/session' import * as userActionHistory from '#/state/userActionHistory' import {type SeenPost} from '#/state/userActionHistory' @@ -219,43 +215,12 @@ export function SuggestedFollows({feed}: {feed: FeedDescriptor}) { } export function SuggestedFollowsProfile({did}: {did: string}) { - const { - isLoading: isSuggestionsLoading, - data, - error, - } = useSuggestedFollowsByActorQuery({ - did, - }) - const queryClient = useQueryClient() - - const onDismiss = useCallback( - (dismissedDid: string) => { - queryClient.setQueryData( - suggestedFollowsByActorQueryKey(did), - (previous: typeof data) => { - if (!previous) return previous - return { - ...previous, - suggestions: previous.suggestions.filter( - s => s.did !== dismissedDid, - ), - } - }, - ) - }, - [did, queryClient], - ) - - const profiles = useMemo(() => { - return (data?.suggestions ?? []).map(profile => ({ - actor: profile, - recId: data?.recId, - })) - }, [data?.suggestions, data?.recId]) + const {profiles, onDismiss, isLoading, error} = + useSuggestedFollowsByActorWithDismiss({did}) return ( void }) { const {profiles, onDismiss, isLoading, error} = - useProfileHeaderSuggestions(actorDid) + useSuggestedFollowsByActorWithDismiss({did: actorDid}) /* NOTE (caidanw): * Android does not work well with this feature yet. @@ -44,42 +37,3 @@ export function ProfileHeaderSuggestedFollows({ ) } - -function useProfileHeaderSuggestions(actorDid: string) { - const {isLoading, data, error} = useSuggestedFollowsByActorQuery({ - did: actorDid, - }) - const queryClient = useQueryClient() - - const onDismiss = useCallback( - (dismissedDid: string) => { - queryClient.setQueryData( - suggestedFollowsByActorQueryKey(actorDid), - (previous: typeof data) => { - if (!previous) return previous - return { - ...previous, - suggestions: previous.suggestions.filter( - s => s.did !== dismissedDid, - ), - } - }, - ) - }, - [actorDid, queryClient], - ) - - const profiles = useMemo(() => { - return (data?.suggestions ?? []).map(profile => ({ - actor: profile as bsky.profile.AnyProfileView, - recId: data?.recId, - })) - }, [data?.suggestions, data?.recId]) - - return { - profiles, - onDismiss, - isLoading, - error, - } -} diff --git a/src/state/queries/suggested-follows.ts b/src/state/queries/suggested-follows.ts index 8dd4e3b6c7..4bb44f2400 100644 --- a/src/state/queries/suggested-follows.ts +++ b/src/state/queries/suggested-follows.ts @@ -1,3 +1,4 @@ +import {useCallback, useMemo} from 'react' import { type AppBskyActorDefs, type AppBskyActorGetSuggestions, @@ -7,10 +8,12 @@ import { type InfiniteData, type QueryClient, useQuery, + useQueryClient, } from '@tanstack/react-query' import {STALE} from '#/state/queries' import {useAgent} from '#/state/session' +import type * as bsky from '#/types/bsky' const suggestedFollowsQueryKeyRoot = 'suggested-follows' @@ -46,6 +49,55 @@ export function useSuggestedFollowsByActorQuery({ }) } +export function useSuggestedFollowsByActorWithDismiss({ + did, + enabled, + staleTime, +}: { + did: string + enabled?: boolean + staleTime?: number +}) { + const {isLoading, data, error} = useSuggestedFollowsByActorQuery({ + did, + enabled, + staleTime, + }) + const queryClient = useQueryClient() + + const onDismiss = useCallback( + (dismissedDid: string) => { + queryClient.setQueryData( + suggestedFollowsByActorQueryKey(did), + (previous: typeof data) => { + if (!previous) return previous + return { + ...previous, + suggestions: previous.suggestions.filter( + s => s.did !== dismissedDid, + ), + } + }, + ) + }, + [did, queryClient], + ) + + const profiles = useMemo(() => { + return (data?.suggestions ?? []).map(profile => ({ + actor: profile as bsky.profile.AnyProfileView, + recId: data?.recId, + })) + }, [data?.suggestions, data?.recId]) + + return { + profiles, + onDismiss, + isLoading, + error, + } +} + export function* findAllProfilesInQueryData( queryClient: QueryClient, did: string,