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