Bluesky app fork with some witchin' additions 馃挮
at readme-update 105 lines 3.0 kB view raw
1import { 2 type AppBskyActorDefs, 3 type AppBskyUnspeccedGetSuggestedUsers, 4} from '@atproto/api' 5import {type QueryClient, useQuery} from '@tanstack/react-query' 6 7import { 8 aggregateUserInterests, 9 createBskyTopicsHeader, 10} from '#/lib/api/feed/utils' 11import {logger} from '#/logger' 12import {getContentLanguages} from '#/state/preferences/languages' 13import {STALE} from '#/state/queries' 14import {usePreferencesQuery} from '#/state/queries/preferences' 15import {useAgent} from '#/state/session' 16 17export type QueryProps = { 18 category?: string | null 19 limit?: number 20 enabled?: boolean 21 overrideInterests?: string[] 22} 23 24export const getSuggestedUsersQueryKeyRoot = 'unspecced-suggested-users' 25export const createGetSuggestedUsersQueryKey = (props: QueryProps) => [ 26 getSuggestedUsersQueryKeyRoot, 27 props.category, 28 props.limit, 29 props.overrideInterests?.join(','), 30] 31 32export function useGetSuggestedUsersQuery(props: QueryProps) { 33 const agent = useAgent() 34 const {data: preferences} = usePreferencesQuery() 35 36 return useQuery({ 37 enabled: !!preferences && props.enabled !== false, 38 staleTime: STALE.MINUTES.THREE, 39 queryKey: createGetSuggestedUsersQueryKey(props), 40 queryFn: async () => { 41 const contentLangs = getContentLanguages().join(',') 42 const userInterests = aggregateUserInterests(preferences) 43 44 const interests = 45 props.overrideInterests && props.overrideInterests.length > 0 46 ? props.overrideInterests.join(',') 47 : userInterests 48 49 const {data} = await agent.app.bsky.unspecced.getSuggestedUsers( 50 { 51 category: props.category ?? undefined, 52 limit: props.limit || 10, 53 }, 54 { 55 headers: { 56 ...createBskyTopicsHeader(interests), 57 'Accept-Language': contentLangs, 58 }, 59 }, 60 ) 61 // FALLBACK: if no results for 'all', try again with no interests specified 62 if (!props.category && data.actors.length === 0) { 63 logger.error( 64 `Did not get any suggested users, falling back - interests: ${interests}`, 65 ) 66 const {data: fallbackData} = 67 await agent.app.bsky.unspecced.getSuggestedUsers( 68 { 69 category: props.category ?? undefined, 70 limit: props.limit || 10, 71 }, 72 { 73 headers: { 74 'Accept-Language': contentLangs, 75 }, 76 }, 77 ) 78 return fallbackData 79 } 80 81 return data 82 }, 83 }) 84} 85 86export function* findAllProfilesInQueryData( 87 queryClient: QueryClient, 88 did: string, 89): Generator<AppBskyActorDefs.ProfileView, void> { 90 const responses = 91 queryClient.getQueriesData<AppBskyUnspeccedGetSuggestedUsers.OutputSchema>({ 92 queryKey: [getSuggestedUsersQueryKeyRoot], 93 }) 94 for (const [_key, response] of responses) { 95 if (!response) { 96 continue 97 } 98 99 for (const actor of response.actors) { 100 if (actor.did === did) { 101 yield actor 102 } 103 } 104 } 105}