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
58 if (!data.recIdStr) {
59 logger.debug('getSuggestedOnboardingUsers response missing recIdStr')
60 }
61 return {...data, recId: data.recIdStr}
62 },
63 })
64}
65
66export function* findAllProfilesInQueryData(
67 queryClient: QueryClient,
68 did: string,
69): Generator<AppBskyActorDefs.ProfileView, void> {
70 const responses =
71 queryClient.getQueriesData<AppBskyUnspeccedGetSuggestedOnboardingUsers.OutputSchema>(
72 {
73 queryKey: [getSuggestedOnboardingUsersQueryKeyRoot],
74 },
75 )
76 for (const [_key, response] of responses) {
77 if (!response) {
78 continue
79 }
80
81 for (const actor of response.actors) {
82 if (actor.did === did) {
83 yield actor
84 }
85 }
86 }
87}