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 {getContentLanguages} from '#/state/preferences/languages'
9import {STALE} from '#/state/queries'
10import {usePreferencesQuery} from '#/state/queries/preferences'
11import {useAgent} from '#/state/session'
12
13export type QueryProps = {
14 category?: string | null
15 limit?: number
16 enabled?: boolean
17 overrideInterests: string[]
18}
19
20export const getSuggestedOnboardingUsersQueryKeyRoot =
21 'unspecced-suggested-onboarding-users'
22export const createGetSuggestedOnboardingUsersQueryKey = (
23 props: QueryProps,
24) => [
25 getSuggestedOnboardingUsersQueryKeyRoot,
26 props.category,
27 props.limit,
28 props.overrideInterests.join(','),
29]
30
31export function useGetSuggestedOnboardingUsersQuery(props: QueryProps) {
32 const agent = useAgent()
33 const {data: preferences} = usePreferencesQuery()
34
35 return useQuery({
36 enabled: !!preferences && props.enabled !== false,
37 staleTime: STALE.MINUTES.THREE,
38 queryKey: createGetSuggestedOnboardingUsersQueryKey(props),
39 queryFn: async () => {
40 const contentLangs = getContentLanguages().join(',')
41
42 const overrideInterests = props.overrideInterests.join(',')
43
44 const {data} = await agent.app.bsky.unspecced.getSuggestedOnboardingUsers(
45 {
46 category: props.category ?? undefined,
47 limit: props.limit || 10,
48 },
49 {
50 headers: {
51 ...createBskyTopicsHeader(overrideInterests),
52 'Accept-Language': contentLangs,
53 },
54 },
55 )
56
57 return {...data, recId: data.recIdStr}
58 },
59 })
60}
61
62export function* findAllProfilesInQueryData(
63 queryClient: QueryClient,
64 did: string,
65): Generator<AppBskyActorDefs.ProfileView, void> {
66 const responses =
67 queryClient.getQueriesData<AppBskyUnspeccedGetSuggestedOnboardingUsers.OutputSchema>(
68 {
69 queryKey: [getSuggestedOnboardingUsersQueryKeyRoot],
70 },
71 )
72 for (const [_key, response] of responses) {
73 if (!response) {
74 continue
75 }
76
77 for (const actor of response.actors) {
78 if (actor.did === did) {
79 yield actor
80 }
81 }
82 }
83}