Fix some router issues

- Clicking on the project in various places goes now to `../<rid>`
  instead of `../<rid>/tree/<commit>`
- Project URL on seed allows trailing slash, eg. `../<rid>/`
- Navigating to a project URL with a `remotes/<nodeId>` suffix works now
  correctly w or w/o trailing slash

Signed-off-by: Sebastian Martinez <me@sebastinez.dev>
This commit is contained in:
Sebastian Martinez
2023-03-07 12:53:17 +01:00
parent 742fe4dec0
commit 2498ef7c9e
7 changed files with 54 additions and 30 deletions
+10 -3
View File
@@ -153,7 +153,11 @@ function pathToRoute(path: string): Route | null {
if (host) {
const id = segments.shift();
if (id) {
if (segments.length === 0) {
// Allows project paths with or without trailing slash
if (
segments.length === 0 ||
(segments.length === 1 && segments[0] === "")
) {
return {
resource: "projects",
params: {
@@ -247,7 +251,10 @@ export function routeToPath(route: Route) {
}
if (route.params.view.resource === "tree") {
return `${hostPrefix}/${route.params.id}${peer}/tree${suffix}`;
if (suffix) {
return `${hostPrefix}/${route.params.id}${peer}/tree${suffix}`;
}
return `${hostPrefix}/${route.params.id}${peer}`;
} else if (route.params.view.resource === "commits") {
return `${hostPrefix}/${route.params.id}${peer}/commits${suffix}`;
} else if (route.params.view.resource === "history") {
@@ -284,7 +291,7 @@ function resolveProjectRoute(
content = segments.shift();
}
if (content === "tree") {
if (!content || content === "tree") {
const line = url.href.match(/#L\d+$/)?.pop();
const hash = url.href.match(/#{1}[^#.]+$/)?.pop();
return {
+2 -2
View File
@@ -36,9 +36,9 @@
params: {
view: { resource: "tree" },
id: project.id,
peer: undefined,
seed: seed.host,
revision: project.head ?? undefined,
peer: undefined,
revision: undefined,
},
});
}
+1 -1
View File
@@ -44,7 +44,7 @@
seed.addr.port === config.seeds.defaultHttpdPort
? seed.addr.host
: `${seed.addr.host}:${seed.addr.port}`,
revision: project.head ?? undefined,
revision: undefined,
hash: undefined,
search: undefined,
},
+12 -14
View File
@@ -24,7 +24,7 @@ test("navigate between landing and project page", async ({ page }) => {
await expect(page).toHaveURL("/#/");
await page.locator("text=source-browsing").click();
await expect(page).toHaveURL(`/#${projectFixtureUrl}/tree/${aliceMainHead}`);
await expect(page).toHaveURL(`/#${projectFixtureUrl}`);
await expectBackAndForwardNavigationWorks("/#/", page);
await expectUrlPersistsReload(page);
@@ -35,7 +35,7 @@ test("navigation between seed and project pages", async ({ page }) => {
const project = page.locator(".project");
await project.click();
await expect(page).toHaveURL(`/#${projectFixtureUrl}/tree/${aliceMainHead}`);
await expect(page).toHaveURL(`/#${projectFixtureUrl}`);
await expectBackAndForwardNavigationWorks("/#/seeds/radicle.local", page);
await expectUrlPersistsReload(page);
@@ -61,55 +61,53 @@ test.describe("project page navigation", () => {
});
test("navigate between tree and commit history", async ({ page }) => {
const projectTreeURL = `/#${projectFixtureUrl}/tree/${aliceMainHead}`;
const projectTreeURL = `/#${projectFixtureUrl}`;
await page.goto(projectTreeURL);
await expect(page).toHaveURL(projectTreeURL);
await page.locator('role=button[name="Commit count"]').click();
await expect(page).toHaveURL(
`/#${projectFixtureUrl}/history/${aliceMainHead}`,
);
await expect(page).toHaveURL(`/#${projectFixtureUrl}/history/main`);
await expectBackAndForwardNavigationWorks(projectTreeURL, page);
await expectUrlPersistsReload(page);
});
test("navigate project paths", async ({ page }) => {
const projectTreeURL = `/#${projectFixtureUrl}/tree/${aliceMainHead}`;
const projectTreeURL = `/#${projectFixtureUrl}`;
await page.goto(projectTreeURL);
await expect(page).toHaveURL(projectTreeURL);
await page.locator("text=.hidden").click();
await expect(page).toHaveURL(`${projectTreeURL}/.hidden`);
await expect(page).toHaveURL(`${projectTreeURL}/tree/main/.hidden`);
await page.locator("text=bin/").click();
await page.locator("text=true").click();
await expect(page).toHaveURL(`${projectTreeURL}/bin/true`);
await expect(page).toHaveURL(`${projectTreeURL}/tree/main/bin/true`);
await expectBackAndForwardNavigationWorks(
`${projectTreeURL}/.hidden`,
`${projectTreeURL}/tree/main/.hidden`,
page,
);
await expectUrlPersistsReload(page);
});
test("navigate project paths with a selected peer", async ({ page }) => {
const projectTreeURL = `/#${projectFixtureUrl}/remotes/${aliceRemote}/tree`;
const projectTreeURL = `/#${projectFixtureUrl}/remotes/${aliceRemote}`;
await page.goto(projectTreeURL);
await expect(page).toHaveURL(projectTreeURL);
await page.locator("text=.hidden").click();
await expect(page).toHaveURL(`${projectTreeURL}/main/.hidden`);
await expect(page).toHaveURL(`${projectTreeURL}/tree/main/.hidden`);
await page.locator("text=bin/").click();
await page.locator("text=true").click();
await expect(page).toHaveURL(`${projectTreeURL}/main/bin/true`);
await expect(page).toHaveURL(`${projectTreeURL}/tree/main/bin/true`);
await expectBackAndForwardNavigationWorks(
`${projectTreeURL}/main/.hidden`,
`${projectTreeURL}/tree/main/.hidden`,
page,
);
await expectUrlPersistsReload(page);
+6 -6
View File
@@ -18,7 +18,7 @@ test("navigate between landing and project page", async ({ page }) => {
await expect(page).toHaveURL("/");
await page.locator("text=source-browsing").click();
await expect(page).toHaveURL(`${projectFixtureUrl}/tree/${aliceMainHead}`);
await expect(page).toHaveURL(projectFixtureUrl);
await expectBackAndForwardNavigationWorks("/", page);
await expectUrlPersistsReload(page);
@@ -29,7 +29,7 @@ test("navigation between seed and project pages", async ({ page }) => {
const project = page.locator(".project");
await project.click();
await expect(page).toHaveURL(`${projectFixtureUrl}/tree/${aliceMainHead}`);
await expect(page).toHaveURL(projectFixtureUrl);
await expectBackAndForwardNavigationWorks("/seeds/radicle.local", page);
await expectUrlPersistsReload(page);
@@ -90,20 +90,20 @@ test.describe("project page navigation", () => {
});
test("navigate project paths with a selected peer", async ({ page }) => {
const projectTreeURL = `${projectFixtureUrl}/remotes/${aliceRemote}/tree`;
const projectTreeURL = `${projectFixtureUrl}/remotes/${aliceRemote}`;
await page.goto(projectTreeURL);
await expect(page).toHaveURL(projectTreeURL);
await page.locator("text=.hidden").click();
await expect(page).toHaveURL(`${projectTreeURL}/main/.hidden`);
await expect(page).toHaveURL(`${projectTreeURL}/tree/main/.hidden`);
await page.locator("text=bin/").click();
await page.locator("text=true").click();
await expect(page).toHaveURL(`${projectTreeURL}/main/bin/true`);
await expect(page).toHaveURL(`${projectTreeURL}/tree/main/bin/true`);
await expectBackAndForwardNavigationWorks(
`${projectTreeURL}/main/.hidden`,
`${projectTreeURL}/tree/main/.hidden`,
page,
);
await expectUrlPersistsReload(page);
+1 -1
View File
@@ -12,7 +12,7 @@ test("navigate to existing project", async ({ page }) => {
await searchInput.fill(`${rid}`);
await searchInput.press("Enter");
await expect(page).toHaveURL(`${projectFixtureUrl}/tree`);
await expect(page).toHaveURL(projectFixtureUrl);
await expect(searchInput).not.toHaveValue(`${rid}`);
});
+22 -3
View File
@@ -22,8 +22,7 @@ describe("routeToPath", () => {
id: "rad:zKtT7DmF9H34KkvcKj9PHW19WzjT",
},
},
output:
"/seeds/willow.radicle.garden/rad:zKtT7DmF9H34KkvcKj9PHW19WzjT/tree",
output: "/seeds/willow.radicle.garden/rad:zKtT7DmF9H34KkvcKj9PHW19WzjT",
description: "Seed Project Route",
},
])("$description", (route: any) => {
@@ -45,6 +44,26 @@ describe("pathToRoute", () => {
output: { resource: "seeds", params: { host: "willow.radicle.garden" } },
description: "Seed View Route",
},
{
input: "/seeds/willow.radicle.garden/rad:zKtT7DmF9H34KkvcKj9PHW19WzjT/",
output: {
resource: "projects",
params: {
view: { resource: "tree" },
seed: "willow.radicle.garden",
profile: undefined,
peer: undefined,
id: "rad:zKtT7DmF9H34KkvcKj9PHW19WzjT",
},
},
description: "Seed Project Route w trailing slash",
},
{
input:
"/seeds/willow.radicle.garden/rad:zKtT7DmF9H34KkvcKj9PHW19WzjT/nope",
output: null,
description: "Seed Project Route w undefined suffix",
},
{
input: "/seeds/willow.radicle.garden/rad:zKtT7DmF9H34KkvcKj9PHW19WzjT",
output: {
@@ -57,7 +76,7 @@ describe("pathToRoute", () => {
id: "rad:zKtT7DmF9H34KkvcKj9PHW19WzjT",
},
},
description: "Seed Project Route",
description: "Seed Project Route w/o trailing slash",
},
])("$description", (route: any) => {
expect(testExports.pathToRoute(route.input)).toEqual(route.output);