fix(ui): resolve nested tab routes to their sidebar item

legacyKeyForPathname matched the full relative path against a single
route segment, so a nested tab route like /router-settings/fallbacks
resolved to no key and the shell fell back to the default page, leaving
the Router Settings nav item unhighlighted. Match on the first path
segment instead, which fixes every migrated page with nested tab routes.
This commit is contained in:
ryan-crabbe-berri 2026-07-23 13:53:55 -07:00
parent e6b2862507
commit 0618b364fc
2 changed files with 12 additions and 1 deletions

View file

@ -236,4 +236,13 @@ describe("legacyKeyForPathname", () => {
expect(legacyKeyForPathname("/team-x/ui/api-reference")).toBe("api_ref");
expect(legacyKeyForPathname("/ui/api-reference")).toBeNull();
});
it("resolves a nested tab route to its sidebar key via the first path segment", async () => {
vi.doMock("@/components/networking", () => ({ serverRootPath: "/" }));
const { legacyKeyForPathname } = await import("./migratedPages");
expect(legacyKeyForPathname("/ui/router-settings/fallbacks")).toBe("router-settings");
expect(legacyKeyForPathname("/ui/router-settings/prompt-caching/")).toBe("router-settings");
expect(legacyKeyForPathname("/ui/some-legacy-page/nested")).toBeNull();
});
});

View file

@ -76,8 +76,10 @@ export function legacyPageHref(pageKey: string): string {
export function legacyKeyForPathname(pathname: string): string | null {
const base = uiBase();
const rel = (pathname.startsWith(base) ? pathname.slice(base.length) : pathname).replace(/^\/+|\/+$/g, "");
const firstSegment = rel.split("/")[0] ?? "";
if (!firstSegment) return null;
for (const [key, segment] of Object.entries(MIGRATED_PAGES)) {
if (rel === segment) return key;
if (firstSegment === segment) return key;
}
return null;
}