extremely wip tangled spa
at main 1.5 kB view raw
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}