mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1import {AppBskyActorDefs, AppBskyGraphGetList} from '@atproto/api'
2import {
3 useInfiniteQuery,
4 InfiniteData,
5 QueryClient,
6 QueryKey,
7} from '@tanstack/react-query'
8
9import {getAgent} from '#/state/session'
10import {STALE} from '#/state/queries'
11
12const PAGE_SIZE = 30
13type RQPageParam = string | undefined
14
15export const RQKEY = (uri: string) => ['list-members', uri]
16
17export function useListMembersQuery(uri: string) {
18 return useInfiniteQuery<
19 AppBskyGraphGetList.OutputSchema,
20 Error,
21 InfiniteData<AppBskyGraphGetList.OutputSchema>,
22 QueryKey,
23 RQPageParam
24 >({
25 staleTime: STALE.MINUTES.ONE,
26 queryKey: RQKEY(uri),
27 async queryFn({pageParam}: {pageParam: RQPageParam}) {
28 const res = await getAgent().app.bsky.graph.getList({
29 list: uri,
30 limit: PAGE_SIZE,
31 cursor: pageParam,
32 })
33 return res.data
34 },
35 initialPageParam: undefined,
36 getNextPageParam: lastPage => lastPage.cursor,
37 })
38}
39
40export function* findAllProfilesInQueryData(
41 queryClient: QueryClient,
42 did: string,
43): Generator<AppBskyActorDefs.ProfileView, void> {
44 const queryDatas = queryClient.getQueriesData<
45 InfiniteData<AppBskyGraphGetList.OutputSchema>
46 >({
47 queryKey: ['list-members'],
48 })
49 for (const [_queryKey, queryData] of queryDatas) {
50 if (!queryData) {
51 continue
52 }
53 for (const [_queryKey, queryData] of queryDatas) {
54 if (!queryData?.pages) {
55 continue
56 }
57 for (const page of queryData?.pages) {
58 if (page.list.creator.did === did) {
59 yield page.list.creator
60 }
61 for (const item of page.items) {
62 if (item.subject.did === did) {
63 yield item.subject
64 }
65 }
66 }
67 }
68 }
69}