extremely wip tangled spa
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};