Radish alpha
r
rad:z4D5UCArafTzTQpDZNQRuqswh3ury
Radicle desktop app
Radicle
Git
Parallelise all requests
Open rudolfs opened 1 year ago

Also some minor tweaks to the issue views.

check check-e2e

👉 Workflow runs 👉 Branch on GitHub

3 files changed +85 -66 80314b21 3df2d3ec
modified src/lib/router/definitions.ts
@@ -50,8 +50,10 @@ export async function loadRoute(
  _previousLoaded: LoadedRoute,
): Promise<LoadedRoute> {
  if (route.resource === "home") {
-
    const repos: RepoInfo[] = await invoke("list_repos");
-
    const config: Config = await invoke("config");
+
    const [config, repos] = await Promise.all([
+
      invoke<Config>("config"),
+
      invoke<RepoInfo[]>("list_repos"),
+
    ]);
    return { resource: "home", params: { repos, config } };
  } else if (route.resource === "repo.issue") {
    return loadIssue(route);
modified src/views/repo/Issue.svelte
@@ -59,11 +59,13 @@

  $: project = repo.payloads["xyz.radicle.project"]!;

+
  $: issueBody = issue.discussion[0];
+

  $: threads = issue.discussion
    .filter(
      comment =>
-
        (comment.id !== issue.discussion[0].id && !comment.replyTo) ||
-
        comment.replyTo === issue.discussion[0].id,
+
        (comment.id !== issueBody.id && !comment.replyTo) ||
+
        comment.replyTo === issueBody.id,
    )
    .map(thread => {
      return {
@@ -224,6 +226,11 @@
        },
        opts: { announce: $announce },
      });
+
      // Update sidebar issue icon without reloading the whole issue list.
+
      const issueIndex = issues.findIndex(i => i.id === issue.id);
+
      if (issueIndex !== -1) {
+
        issues[issueIndex].state = state;
+
      }
    } catch (error) {
      console.error("Editing reactions failed", error);
    } finally {
@@ -336,7 +343,7 @@
    <div class="issue-list">
      {#each issues as sidebarIssue}
        <Link
-
          variant="tab"
+
          variant={sidebarIssue.id === issue.id ? "active" : "tab"}
          route={{
            resource: "repo.issue",
            rid: repo.rid,
@@ -396,7 +403,7 @@
      {:else}
        <div class="title">
          <InlineTitle content={issue.title} fontSize="medium" />
-
          {#if roles.isDelegateOrAuthor( config.publicKey, repo.delegates.map(delegate => delegate.did), issue.discussion[0].author.did, )}
+
          {#if roles.isDelegateOrAuthor( config.publicKey, repo.delegates.map(delegate => delegate.did), issueBody.author.did, )}
            <div class="title-icons">
              <Icon
                styleCursor="pointer"
@@ -415,22 +422,22 @@
      <CommentComponent
        rid={repo.rid}
        id={issue.id}
-
        lastEdit={issue.discussion[0].edits.length > 1
-
          ? issue.discussion[0].edits.at(-1)
+
        lastEdit={issueBody.edits.length > 1
+
          ? issueBody.edits.at(-1)
          : undefined}
-
        author={issue.discussion[0].author}
-
        reactions={issue.discussion[0].reactions}
-
        timestamp={issue.discussion[0].edits.slice(-1)[0].timestamp}
-
        body={issue.discussion[0].edits.slice(-1)[0].body}
+
        author={issueBody.author}
+
        reactions={issueBody.reactions}
+
        timestamp={issueBody.edits.slice(-1)[0].timestamp}
+
        body={issueBody.edits.slice(-1)[0].body}
        editComment={roles.isDelegateOrAuthor(
          config.publicKey,
          repo.delegates.map(delegate => delegate.did),
-
          issue.discussion[0].author.did,
-
        ) && partial(editComment, issue.discussion[0].id)}
+
          issueBody.author.did,
+
        ) && partial(editComment, issueBody.id)}
        reactOnComment={partial(
          reactOnComment,
          config.publicKey,
-
          issue.discussion[0].id,
+
          issueBody.id,
        )}>
        <svelte:fragment slot="actions">
          <Icon styleCursor="pointer" name="reply" onclick={toggleReply} />
modified src/views/repo/router.ts
@@ -107,21 +107,23 @@ export type LoadedRepoRoute =
export async function loadPatch(
  route: RepoPatchRoute,
): Promise<LoadedRepoPatchRoute> {
-
  const repo: RepoInfo = await invoke("repo_by_id", {
-
    rid: route.rid,
-
  });
-
  const config: Config = await invoke("config");
-
  const patches: PaginatedQuery<Patch[]> = await invoke("list_patches", {
-
    rid: route.rid,
-
  });
-
  const patch: Patch = await invoke("patch_by_id", {
-
    rid: route.rid,
-
    id: route.patch,
-
  });
-
  const revisions: Revision[] = await invoke("revisions_by_patch", {
-
    rid: route.rid,
-
    id: route.patch,
-
  });
+
  const [config, repo, patches, patch, revisions] = await Promise.all([
+
    invoke<Config>("config"),
+
    invoke<RepoInfo>("repo_by_id", {
+
      rid: route.rid,
+
    }),
+
    invoke<PaginatedQuery<Patch[]>>("list_patches", {
+
      rid: route.rid,
+
    }),
+
    invoke<Patch>("patch_by_id", {
+
      rid: route.rid,
+
      id: route.patch,
+
    }),
+
    invoke<Revision[]>("revisions_by_patch", {
+
      rid: route.rid,
+
      id: route.patch,
+
    }),
+
  ]);

  return {
    resource: "repo.patch",
@@ -132,14 +134,16 @@ export async function loadPatch(
export async function loadPatches(
  route: RepoPatchesRoute,
): Promise<LoadedRepoPatchesRoute> {
-
  const repo: RepoInfo = await invoke("repo_by_id", {
-
    rid: route.rid,
-
  });
-
  const config: Config = await invoke("config");
-
  const patches: PaginatedQuery<Patch[]> = await invoke("list_patches", {
-
    rid: route.rid,
-
    status: route.status,
-
  });
+
  const [config, repo, patches] = await Promise.all([
+
    invoke<Config>("config"),
+
    invoke<RepoInfo>("repo_by_id", {
+
      rid: route.rid,
+
    }),
+
    invoke<PaginatedQuery<Patch[]>>("list_patches", {
+
      rid: route.rid,
+
      status: route.status,
+
    }),
+
  ]);

  return {
    resource: "repo.patches",
@@ -150,14 +154,16 @@ export async function loadPatches(
export async function loadCreateIssue(
  route: RepoCreateIssueRoute,
): Promise<LoadedRepoCreateIssueRoute> {
-
  const repo: RepoInfo = await invoke("repo_by_id", {
-
    rid: route.rid,
-
  });
-
  const config: Config = await invoke("config");
-
  const issues: Issue[] = await invoke("list_issues", {
-
    rid: route.rid,
-
    status: "all",
-
  });
+
  const [config, repo, issues] = await Promise.all([
+
    invoke<Config>("config"),
+
    invoke<RepoInfo>("repo_by_id", {
+
      rid: route.rid,
+
    }),
+
    invoke<Issue[]>("list_issues", {
+
      rid: route.rid,
+
      status: "all",
+
    }),
+
  ]);

  return {
    resource: "repo.createIssue",
@@ -168,18 +174,20 @@ export async function loadCreateIssue(
export async function loadIssue(
  route: RepoIssueRoute,
): Promise<LoadedRepoIssueRoute> {
-
  const repo: RepoInfo = await invoke("repo_by_id", {
-
    rid: route.rid,
-
  });
-
  const config: Config = await invoke("config");
-
  const issues: Issue[] = await invoke("list_issues", {
-
    rid: route.rid,
-
    status: "all",
-
  });
-
  const issue: Issue = await invoke("issue_by_id", {
-
    rid: route.rid,
-
    id: route.issue,
-
  });
+
  const [config, repo, issue, issues] = await Promise.all([
+
    invoke<Config>("config"),
+
    invoke<RepoInfo>("repo_by_id", {
+
      rid: route.rid,
+
    }),
+
    invoke<Issue>("issue_by_id", {
+
      rid: route.rid,
+
      id: route.issue,
+
    }),
+
    invoke<Issue[]>("list_issues", {
+
      rid: route.rid,
+
      status: "all",
+
    }),
+
  ]);

  return {
    resource: "repo.issue",
@@ -190,14 +198,16 @@ export async function loadIssue(
export async function loadIssues(
  route: RepoIssuesRoute,
): Promise<LoadedRepoIssuesRoute> {
-
  const repo: RepoInfo = await invoke("repo_by_id", {
-
    rid: route.rid,
-
  });
-
  const config: Config = await invoke("config");
-
  const issues: Issue[] = await invoke("list_issues", {
-
    rid: route.rid,
-
    status: route.status,
-
  });
+
  const [config, repo, issues] = await Promise.all([
+
    invoke<Config>("config"),
+
    invoke<RepoInfo>("repo_by_id", {
+
      rid: route.rid,
+
    }),
+
    invoke<Issue[]>("list_issues", {
+
      rid: route.rid,
+
      status: route.status,
+
    }),
+
  ]);

  return {
    resource: "repo.issues",