1import { Client, simpleFetchHandler } from "@atcute/client";
2import type { ShTangledRepo } from "@atcute/tangled";
3import { query } from "@solidjs/router";
4import { getUserPDS } from "./get_pds";
5import type { DID } from "./types";
6
7export const getUserRepos = query(
8 async (
9 did: DID,
10 ): Promise<Record<string, ShTangledRepo.Main & { rkey: string }>> => {
11 const pds = await getUserPDS(did);
12 if (!pds) return {};
13 const handler = simpleFetchHandler({ service: pds });
14 const rpc = new Client({ handler });
15
16 const repos: Record<string, ShTangledRepo.Main & { rkey: string }> = {};
17 let cursor: string | undefined;
18
19 while (true) {
20 const { ok, data } = await rpc.get("com.atproto.repo.listRecords", {
21 params: {
22 repo: did,
23 collection: "sh.tangled.repo",
24 limit: 100,
25 cursor,
26 },
27 });
28 if (!ok) break;
29 const length = data.records.length;
30 const moreRepos = data.records.reduce(
31 (acc, r) => {
32 const record = Object.assign(
33 { rkey: r.uri.slice(r.uri.lastIndexOf("/") + 1) },
34 r.value as ShTangledRepo.Main,
35 );
36 acc[record.name] = record;
37 return acc;
38 },
39 new Object() as typeof repos,
40 );
41 Object.assign(repos, moreRepos);
42 cursor = data.cursor;
43 if (length < 100) break;
44 }
45
46 return repos;
47 },
48 "user_repos",
49);
50
51export const getUserRepo = async (
52 did: DID,
53 repo: string,
54): Promise<ShTangledRepo.Main & { rkey: string }> => {
55 const repos = await getUserRepos(did);
56 return repos[repo];
57};
58
59export const getRepoKnot = async (did: DID, repo: string) => {
60 const repos = await getUserRepos(did);
61 return `https://${repos[repo].knot}`;
62};