forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
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}