mirror of
https://seed.radicle.dev/rad:z4V1sjrXqjvFdnCUbxPFqd5p4DtH5.git
synced 2026-11-04 03:00:32 +08:00
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:
+10
-3
@@ -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 {
|
||||
|
||||
@@ -36,9 +36,9 @@
|
||||
params: {
|
||||
view: { resource: "tree" },
|
||||
id: project.id,
|
||||
peer: undefined,
|
||||
seed: seed.host,
|
||||
revision: project.head ?? undefined,
|
||||
peer: undefined,
|
||||
revision: undefined,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,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);
|
||||
|
||||
Reference in New Issue
Block a user