From 3fd5d513a81dd9a3eef867588c752a16abb366c0 Mon Sep 17 00:00:00 2001 From: Sebastian Martinez Date: Tue, 7 May 2024 12:11:40 +0200 Subject: [PATCH] Decouple stats from tree response --- src/views/projects/History.svelte | 42 ++++++++++----- src/views/projects/Source.svelte | 12 ++--- src/views/projects/Source/Header.svelte | 33 ++++++------ src/views/projects/router.ts | 69 ++++++++++++++----------- 4 files changed, 89 insertions(+), 67 deletions(-) diff --git a/src/views/projects/History.svelte b/src/views/projects/History.svelte index 3d9243801..0fa01c643 100644 --- a/src/views/projects/History.svelte +++ b/src/views/projects/History.svelte @@ -5,7 +5,6 @@ Project, Remote, Tree, - TreeStats, } from "@httpd-client"; import type { Route } from "@app/lib/router"; @@ -24,6 +23,7 @@ import ProjectNameHeader from "./Source/ProjectNameHeader.svelte"; export let baseUrl: BaseUrl; + export let commit: string; export let branches: string[]; export let commitHeaders: CommitHeader[]; export let peer: string | undefined; @@ -31,7 +31,6 @@ export let project: Project; export let revision: string | undefined; export let tree: Tree; - export let stats: TreeStats; export let seeding: boolean; const api = new HttpdClient(baseUrl); @@ -112,12 +111,12 @@
@@ -136,24 +135,41 @@ {/each} - {#if loading || allCommitHeaders.length < stats.commits} + {#await api.project.getTreeStatsBySha(project.id, commit)}
- {#if loading} - - {:else if allCommitHeaders.length < stats.commits} - - {/if} +
- {/if} + {:then stats} + {#if loading || allCommitHeaders.length < stats.commits} +
+ {#if loading} + + {:else if allCommitHeaders.length < stats.commits} + + {/if} +
+ {/if} - {#if error} + {#if error} +
+ +
+ {/if} + {:catch error}
- {/if} + {/await} diff --git a/src/views/projects/Source.svelte b/src/views/projects/Source.svelte index b5b928bfe..e6c059bac 100644 --- a/src/views/projects/Source.svelte +++ b/src/views/projects/Source.svelte @@ -1,11 +1,5 @@ @@ -77,6 +75,7 @@ .title-counter { display: flex; + align-items: center; gap: 0.5rem; } @@ -96,7 +95,7 @@ {project} {node} onCanonical={Boolean(!peer && selectedBranch === project.defaultBranch)} - selectedCommit={commit} + selectedCommit={lastCommit} {selectedBranch} /> @@ -127,9 +126,13 @@
Commits -
- {stats.commits} -
+ {#await api.project.getTreeStatsBySha(project.id, commit)} + + {:then stats} +
+ {stats.commits} +
+ {/await}
diff --git a/src/views/projects/router.ts b/src/views/projects/router.ts index becbcd92e..7c13ad460 100644 --- a/src/views/projects/router.ts +++ b/src/views/projects/router.ts @@ -18,7 +18,6 @@ import type { Project, Remote, Tree, - TreeStats, } from "@httpd-client"; import * as Syntax from "@app/lib/syntax"; @@ -45,13 +44,8 @@ export type ProjectRoute = commit: string; } | ProjectIssuesRoute + | ProjectIssueRoute | { resource: "project.newIssue"; node: BaseUrl; project: string } - | { - resource: "project.issue"; - node: BaseUrl; - project: string; - issue: string; - } | ProjectPatchesRoute | ProjectPatchRoute; @@ -62,6 +56,13 @@ interface ProjectIssuesRoute { state?: "open" | "closed"; } +interface ProjectIssueRoute { + resource: "project.issue"; + node: BaseUrl; + project: string; + issue: string; +} + interface ProjectTreeRoute { resource: "project.source"; node: BaseUrl; @@ -112,13 +113,13 @@ export type ProjectLoadedRoute = resource: "project.source"; params: { baseUrl: BaseUrl; + commit: string; project: Project; peers: Remote[]; peer: string | undefined; branches: string[]; revision: string | undefined; tree: Tree; - stats: TreeStats; path: string; rawPath: (commit?: string) => string; blobResult: BlobResult; @@ -129,13 +130,13 @@ export type ProjectLoadedRoute = resource: "project.history"; params: { baseUrl: BaseUrl; + commit: string; project: Project; peers: Remote[]; peer: string | undefined; branches: string[]; revision: string | undefined; tree: Tree; - stats: TreeStats; commitHeaders: CommitHeader[]; seeding: boolean; }; @@ -294,19 +295,7 @@ export async function loadProjectRoute( }, }; } else if (route.resource === "project.issue") { - const [project, issue] = await Promise.all([ - api.project.getById(route.project), - api.project.getIssueById(route.project, route.issue), - ]); - return { - resource: "project.issue", - params: { - baseUrl: route.node, - project, - rawPath, - issue, - }, - }; + return await loadIssueView(route); } else if (route.resource === "project.patch") { return await loadPatchView(route); } else if (route.resource === "project.issues") { @@ -444,11 +433,7 @@ async function loadTreeView( project.defaultBranch, branchMap, ); - - const stats = await api.project.getTreeStatsBySha(route.project, commit); - const path = route.path || "/"; - const [tree, blobResult] = await Promise.all([ api.project.getTree(route.project, commit), loadBlob(api, project.id, commit, path), @@ -457,6 +442,7 @@ async function loadTreeView( resource: "project.source", params: { baseUrl: route.node, + commit, project, peers: peers.filter(remote => Object.keys(remote.heads).length > 0), peer: route.peer, @@ -464,7 +450,6 @@ async function loadTreeView( rawPath, revision: route.revision, tree, - stats, path, blobResult, seeding, @@ -538,9 +523,8 @@ async function loadHistoryView( ); } - const [tree, stats, commitHeaders, seeding] = await Promise.all([ + const [tree, commitHeaders, seeding] = await Promise.all([ api.project.getTree(route.project, commitId), - api.project.getTreeStatsBySha(route.project, commitId), await api.project.getAllCommits(project.id, { parent: commitId, page: 0, @@ -553,19 +537,43 @@ async function loadHistoryView( resource: "project.history", params: { baseUrl: route.node, + commit: commitId, project, peers: peers.filter(remote => Object.keys(remote.heads).length > 0), peer: route.peer, branches: Object.keys(branchMap || {}), revision: route.revision, tree, - stats, commitHeaders, seeding, }, }; } +async function loadIssueView( + route: ProjectIssueRoute, +): Promise { + const api = new HttpdClient(route.node); + const rawPath = (commit?: string) => + `${route.node.scheme}://${route.node.hostname}:${route.node.port}/raw/${ + route.project + }${commit ? `/${commit}` : ""}`; + + const [project, issue] = await Promise.all([ + api.project.getById(route.project), + api.project.getIssueById(route.project, route.issue), + ]); + return { + resource: "project.issue", + params: { + baseUrl: route.node, + project, + rawPath, + issue, + }, + }; +} + async function loadPatchView( route: ProjectPatchRoute, ): Promise { @@ -574,6 +582,7 @@ async function loadPatchView( `${route.node.scheme}://${route.node.hostname}:${route.node.port}/raw/${ route.project }${commit ? `/${commit}` : ""}`; + const [project, patch] = await Promise.all([ api.project.getById(route.project), api.project.getPatchById(route.project, route.patch),