diff --git a/web/src/lib/components/repo/RepoIndexView.svelte b/web/src/lib/components/repo/RepoIndexView.svelte index a1737253..606b239a 100644 --- a/web/src/lib/components/repo/RepoIndexView.svelte +++ b/web/src/lib/components/repo/RepoIndexView.svelte @@ -31,8 +31,8 @@ const refsCapped = $derived(data.refs.capped); - - {#if data.availability === "needs-upgrade"} + + {#if data.needsUpgrade}
diff --git a/web/src/lib/components/repo/StarredBy.svelte b/web/src/lib/components/repo/StarredBy.svelte new file mode 100644 index 00000000..568d538d --- /dev/null +++ b/web/src/lib/components/repo/StarredBy.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/web/src/lib/components/repo/StarredByContent.svelte b/web/src/lib/components/repo/StarredByContent.svelte new file mode 100644 index 00000000..dfcf5147 --- /dev/null +++ b/web/src/lib/components/repo/StarredByContent.svelte @@ -0,0 +1,28 @@ + + +
+ +
+ + {handle} + +

+ Starred +

+
+
diff --git a/web/src/routes/[handle]/[repo]/+layout@.svelte b/web/src/routes/[handle]/[repo]/+layout@.svelte index 93354754..6cf8eb0f 100644 --- a/web/src/routes/[handle]/[repo]/+layout@.svelte +++ b/web/src/routes/[handle]/[repo]/+layout@.svelte @@ -13,7 +13,9 @@ const activeTab = $derived.by(() => { const segment = page.route.id?.split("/")[3] ?? ""; - return ["issues", "pulls", "pipelines", "settings"].includes(segment) ? segment : "overview"; + return ["issues", "pulls", "pipelines", "settings"].includes(segment) + ? segment + : "overview"; }); // commit pages break out of the reading column, everything else stays diff --git a/web/src/routes/[handle]/[repo]/stars/+page.svelte b/web/src/routes/[handle]/[repo]/stars/+page.svelte new file mode 100644 index 00000000..38df14b2 --- /dev/null +++ b/web/src/routes/[handle]/[repo]/stars/+page.svelte @@ -0,0 +1,20 @@ + + + +

Starred by

+ + {#if data.starrers.length === 0} +

No stars yet.

+ {:else} +
+ {#each data.starrers as starrer (starrer.did)} + + {/each} +
+ {/if} +
diff --git a/web/src/routes/[handle]/[repo]/stars/+page.ts b/web/src/routes/[handle]/[repo]/stars/+page.ts new file mode 100644 index 00000000..e510df10 --- /dev/null +++ b/web/src/routes/[handle]/[repo]/stars/+page.ts @@ -0,0 +1,40 @@ +import { createBobbinClient } from "$lib/api/client"; +import { IdentityCache } from "$lib/api/identity"; +import { listStars } from "$lib/api/records"; +import { didFromUri } from "$lib/api/uri"; +import type { PageLoad } from "./$types"; + +const LIMIT = 50; + +export interface Starrer { + did: string; + handle: string; + createdAt: string; +} + +export const load: PageLoad = async (event) => { + const parent = await event.parent(); + const repoDid = parent.repo.repoDid; + + // no repoDid means bobbin never indexed this repo, so there is nothing to list + if (!repoDid) { + return { starrers: [] as Starrer[] }; + } + + const ctx = createBobbinClient({ serviceUrl: parent.publicConfig.bobbinUrl, fetch: event.fetch }); + + // TODO: paginate + const result = await listStars(ctx, repoDid, { limit: LIMIT }).catch(() => null); + const items = result?.items ?? []; + + const identity = new IdentityCache(ctx); + const starrers: Starrer[] = await Promise.all( + items.map(async (item): Promise => { + const did = didFromUri(item.uri); + const doc = await identity.resolve(did).catch(() => null); + return { did, handle: doc?.handle ?? did, createdAt: item.value.createdAt }; + }) + ); + + return { starrers }; +};