Skip to content

Commit fd9b58a

Browse files
committed
fix(router): disambiguate library landing links
1 parent 735246f commit fd9b58a

3 files changed

Lines changed: 70 additions & 23 deletions

File tree

src/components/LibraryLayout.tsx

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import { Card } from './Card'
3838
import { PartnersRail, RightRail } from './RightRail'
3939
import { trackEvent, useTrackedImpression } from '~/utils/analytics'
4040
import {
41+
getLibraryTabLinkOptions,
4142
getMenuGroupInitialOpenState,
4243
isChartsCatalogTarget,
4344
} from './library-layout-navigation'
@@ -1183,23 +1184,19 @@ export function LibraryLayout({
11831184
return null
11841185
}
11851186

1186-
const linkParams =
1187-
!target.to.startsWith('/') ||
1188-
target.to.includes('/$libraryId')
1189-
? ({ libraryId, version } as never)
1190-
: undefined
1187+
const linkOptions = getLibraryTabLinkOptions({
1188+
libraryId,
1189+
version,
1190+
to: target.to,
1191+
})
11911192
const isActive = tab.id === activeTabId
11921193

11931194
return (
11941195
<li key={tab.id}>
11951196
<Link
1196-
from={
1197-
isChartsCatalogTarget(target.to)
1198-
? undefined
1199-
: '/$libraryId/$version/docs'
1200-
}
1201-
to={target.to}
1202-
params={linkParams}
1197+
from={linkOptions.from as never}
1198+
to={linkOptions.to as never}
1199+
params={linkOptions.params as never}
12031200
onClick={closeMobileMenu}
12041201
preload={
12051202
isChartsCatalogTarget(target.to) ? false : 'intent'
@@ -1374,21 +1371,18 @@ export function LibraryLayout({
13741371
return null
13751372
}
13761373

1377-
const linkParams =
1378-
!target.to.startsWith('/') || target.to.includes('/$libraryId')
1379-
? ({ libraryId, version } as never)
1380-
: undefined
1374+
const linkOptions = getLibraryTabLinkOptions({
1375+
libraryId,
1376+
version,
1377+
to: target.to,
1378+
})
13811379

13821380
return (
13831381
<Link
13841382
key={tab.id}
1385-
from={
1386-
isChartsCatalogTarget(target.to)
1387-
? undefined
1388-
: '/$libraryId/$version/docs'
1389-
}
1390-
to={target.to}
1391-
params={linkParams}
1383+
from={linkOptions.from as never}
1384+
to={linkOptions.to as never}
1385+
params={linkOptions.params as never}
13921386
preload={isChartsCatalogTarget(target.to) ? false : 'intent'}
13931387
activeOptions={{
13941388
exact: true,

src/components/library-layout-navigation.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,30 @@ export function isChartsCatalogTarget(to: string) {
44
return to === '/charts/catalog' || to.startsWith('/charts/catalog/')
55
}
66

7+
export function getLibraryTabLinkOptions({
8+
libraryId,
9+
version,
10+
to,
11+
}: {
12+
libraryId: string
13+
version: string
14+
to: string
15+
}) {
16+
const isHomeTarget = to === '..'
17+
18+
return {
19+
from:
20+
isHomeTarget || isChartsCatalogTarget(to)
21+
? undefined
22+
: '/$libraryId/$version/docs',
23+
to: isHomeTarget ? `/${libraryId}/${version}` : to,
24+
params:
25+
!isHomeTarget && (!to.startsWith('/') || to.includes('/$libraryId'))
26+
? { libraryId, version }
27+
: undefined,
28+
}
29+
}
30+
731
function normalizeMenuPath(path: string) {
832
return path.replace(/\/+$/, '')
933
}

tests/charts-sidebar-navigation.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import assert from 'node:assert/strict'
22
import {
3+
getLibraryTabLinkOptions,
34
getMenuGroupInitialOpenState,
45
isChartsCatalogTarget,
56
} from '../src/components/library-layout-navigation'
@@ -9,6 +10,34 @@ assert.equal(isChartsCatalogTarget('/charts/catalog/charts/01-line'), true)
910
assert.equal(isChartsCatalogTarget('/charts/catalog/collections/shadcn'), true)
1011
assert.equal(isChartsCatalogTarget('/charts/catalogue'), false)
1112

13+
assert.deepEqual(
14+
getLibraryTabLinkOptions({
15+
libraryId: 'table',
16+
version: 'latest',
17+
to: '..',
18+
}),
19+
{
20+
from: undefined,
21+
to: '/table/latest',
22+
params: undefined,
23+
},
24+
'a landing-page Home tab uses its concrete route instead of the generic library route',
25+
)
26+
27+
assert.deepEqual(
28+
getLibraryTabLinkOptions({
29+
libraryId: 'table',
30+
version: 'v8',
31+
to: 'guide/intro',
32+
}),
33+
{
34+
from: '/$libraryId/$version/docs',
35+
to: 'guide/intro',
36+
params: { libraryId: 'table', version: 'v8' },
37+
},
38+
'relative docs tabs retain their generic docs-route context',
39+
)
40+
1241
const groups = [
1342
{
1443
label: 'Individual Charts',

0 commit comments

Comments
 (0)