Radish alpha
r
rad:z4V1sjrXqjvFdnCUbxPFqd5p4DtH5
Radicle web interface
Radicle
Git
Load repo activity progressively per card
Rūdolfs Ošiņš committed 1 day ago
commit 49274ac88c93da54493f04569c328074a5d3cd1e
parent ad8b069
3 files changed +29 -27
modified src/components/RepoCard.svelte
@@ -156,11 +156,13 @@
        </span>
      </div>
      <div class="activity">
-
        <ActivityDiagram
-
          id={repo.rid}
-
          viewBoxHeight={100}
-
          styleColor="var(--color-text-brand)"
-
          activity={repoInfo.activity} />
+
        {#await repoInfo.activity then activity}
+
          <ActivityDiagram
+
            id={repo.rid}
+
            viewBoxHeight={100}
+
            styleColor="var(--color-text-brand)"
+
            {activity} />
+
        {/await}
      </div>
    </div>
    <div>
modified src/components/RepoCard.ts
@@ -6,13 +6,14 @@ import { HttpdClient } from "@http-client";
export interface RepoInfo {
  repo: Repo;
  baseUrl: BaseUrl;
-
  activity: WeeklyActivity[];
+
  activity: Promise<WeeklyActivity[]>;
}

export async function fetchRepoInfos(
  baseUrl: BaseUrl,
  query?: RepoListQuery,
  delegate?: string,
+
  activitySignal?: AbortSignal,
): Promise<RepoInfo[]> {
  const api = new HttpdClient(baseUrl);
  let repos: Repo[];
@@ -22,24 +23,17 @@ export async function fetchRepoInfos(
  } else {
    repos = await api.repo.getAll(query);
  }
-
  const info = await Promise.all(
-
    repos
-
      .filter(r => Boolean(r.payloads["xyz.radicle.project"]))
-
      .map(async repo => {
-
        const activity = await loadRepoActivity(repo.rid, baseUrl);
-
        return { repo, activity, baseUrl };
-
      }),
-
  );

-
  return info.sort((a, b) => {
-
    if (a.activity.length === 0 && b.activity.length === 0) {
-
      return 0;
-
    } else if (a.activity.length === 0 && b.activity.length > 0) {
-
      return 1;
-
    } else if (b.activity.length === 0 && a.activity.length > 0) {
-
      return -1;
-
    } else {
-
      return b.activity[0].time - a.activity[0].time;
-
    }
-
  });
+
  return repos
+
    .filter(r => Boolean(r.payloads["xyz.radicle.project"]))
+
    .map(repo => ({
+
      repo,
+
      baseUrl,
+
      activity: loadRepoActivity(repo.rid, baseUrl, activitySignal).catch(e => {
+
        if (import.meta.env.DEV && (e as Error)?.name !== "AbortError") {
+
          console.warn("loadRepoActivity failed for", repo.rid, e);
+
        }
+
        return [];
+
      }),
+
    }));
}
modified src/lib/commit.ts
@@ -110,9 +110,15 @@ function groupCommitsByWeek(commits: number[]): WeeklyActivity[] {
  return groupedCommits;
}

-
export async function loadRepoActivity(id: string, baseUrl: BaseUrl) {
+
export async function loadRepoActivity(
+
  id: string,
+
  baseUrl: BaseUrl,
+
  signal?: AbortSignal,
+
) {
  const api = new HttpdClient(baseUrl);
-
  const commits = await api.repo.getActivity(id);
+
  const timeout = AbortSignal.timeout(8000);
+
  const abort = signal ? AbortSignal.any([signal, timeout]) : timeout;
+
  const commits = await api.repo.getActivity(id, { abort });

  return groupCommitsByWeek(commits.activity);
}