1import type { ShTangledRepo } from "@atcute/tangled";
2import { useParams } from "@solidjs/router";
3import {
4 createContext,
5 createResource,
6 type ParentComponent,
7 type Resource,
8 useContext,
9} from "solid-js";
10import { getUserRepo } from "../../util/get_repo";
11import { figureOutDid } from "../../util/handle";
12import type { DID } from "../../util/types";
13import { getRepoForks, getRepoStars } from "./main.data";
14
15const RepoContext = createContext<{
16 did: () => DID | undefined;
17 repoInfo: Resource<{
18 repo: ShTangledRepo.Main & { rkey: string };
19 stars: number;
20 forks: number;
21 }>;
22}>();
23
24export const RepoProvider: ParentComponent = (props) => {
25 const params = useParams();
26 const [did] = createResource(() => params.user, figureOutDid);
27
28 const [repoInfo] = createResource(
29 () => {
30 const d = did();
31 const r = params.repo;
32 return d && r ? ([d, r] as const) : undefined;
33 },
34 async ([did, repo]) => {
35 return {
36 repo: await getUserRepo(did, repo),
37 stars: await getRepoStars(did, repo),
38 forks: await getRepoForks(did, repo),
39 };
40 },
41 );
42
43 return (
44 <RepoContext.Provider value={{ did, repoInfo }}>
45 {props.children}
46 </RepoContext.Provider>
47 );
48};
49
50export function useDid() {
51 const ctx = useContext(RepoContext);
52 if (!ctx) throw new Error("useDid must be used within RepoProvider");
53 return ctx.did;
54}
55
56export function useRepoInfo() {
57 const ctx = useContext(RepoContext);
58 if (!ctx) throw new Error("useDid must be used within RepoProvider");
59 return ctx.repoInfo;
60}