Skip to content

Commit 112d29f

Browse files
authored
fetch versions asynchronously (#226)
see #224 (comment)
1 parent 87f89fd commit 112d29f

File tree

4 files changed

+38
-21
lines changed

4 files changed

+38
-21
lines changed

src/components/Breadcrumb/Breadcrumb.stories.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@ export const Default: Story = {
1919
{ text: 'part1/', sourceId: '/part1/' },
2020
{ text: 'part2/', sourceId: '/part1/part2/' },
2121
],
22-
versions: {
23-
label: 'Branches',
24-
versions: [
25-
{ label: 'master', sourceId: '/part1/part2/file.txt' },
26-
{ label: 'dev', sourceId: '/part1/part2/file.txt?branch=dev' },
27-
{ label: 'refs/convert/parquet', sourceId: '/part1/part2/file.txt?branch=refs/convert/parquet' },
28-
],
22+
fetchVersions: () => {
23+
return Promise.resolve({
24+
label: 'Branches',
25+
versions: [
26+
{ label: 'master', sourceId: '/part1/part2/file.txt' },
27+
{ label: 'dev', sourceId: '/part1/part2/file.txt?branch=dev' },
28+
{ label: 'refs/convert/parquet', sourceId: '/part1/part2/file.txt?branch=refs/convert/parquet' },
29+
],
30+
})
2931
},
3032
},
3133
},

src/components/Breadcrumb/Breadcrumb.test.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,27 +28,29 @@ describe('Breadcrumb Component', () => {
2828
expect(subdir2Link.closest('a')?.getAttribute('href')).toBe('/files?key=subdir1/subdir2/')
2929
})
3030

31-
it('handles versions correctly', () => {
31+
it('handles versions correctly', async () => {
3232
const source = getHyperparamSource('subdir1/subdir2/', { endpoint })
3333
assert(source !== undefined)
34-
source.versions = {
35-
label: 'Versions',
36-
versions: [
37-
{ label: 'v1.0', sourceId: 'v1.0' },
38-
{ label: 'v2.0', sourceId: 'v2.0' },
39-
],
34+
source.fetchVersions = () => {
35+
return Promise.resolve({
36+
label: 'Versions',
37+
versions: [
38+
{ label: 'v1.0', sourceId: 'v1.0' },
39+
{ label: 'v2.0', sourceId: 'v2.0' },
40+
],
41+
})
4042
}
4143

4244
const config: Config = {
4345
routes: {
4446
getSourceRouteUrl: ({ sourceId }) => `/files?key=${sourceId}`,
4547
},
4648
}
47-
const { getByText, getAllByRole } = render(<ConfigProvider value={config}>
49+
const { findByText, getAllByRole } = render(<ConfigProvider value={config}>
4850
<Breadcrumb source={source} />
4951
</ConfigProvider>)
5052

51-
const versionsLabel = getByText('Versions')
53+
const versionsLabel = await findByText('Versions')
5254
expect(versionsLabel).toBeDefined()
5355
const versionLinks = getAllByRole('menuitem')
5456
expect(versionLinks.length).toBe(2)

src/components/Breadcrumb/Breadcrumb.tsx

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { ReactNode } from 'react'
2+
import { useEffect, useState } from 'react'
23
import { useConfig } from '../../hooks/useConfig.js'
3-
import type { Source } from '../../lib/sources/types.js'
4+
import type { Source, VersionsData } from '../../lib/sources/types.js'
45
import { cn } from '../../lib/utils.js'
56
import Dropdown from '../Dropdown/Dropdown.js'
67
import styles from './Breadcrumb.module.css'
@@ -12,9 +13,21 @@ interface BreadcrumbProps {
1213

1314
function Versions({ source }: { source: Source }) {
1415
const { routes, customClass } = useConfig()
16+
const [versionsData, setVersionsData] = useState<VersionsData | undefined>(undefined)
1517

16-
if (!source.versions) return null
17-
const { label, versions } = source.versions
18+
useEffect(() => {
19+
source.fetchVersions?.().then(
20+
(nextVersionData) => {
21+
setVersionsData(nextVersionData)
22+
}
23+
).catch((error: unknown) => {
24+
console.error('Error fetching versions:', error)
25+
setVersionsData(undefined)
26+
})
27+
}, [source])
28+
29+
if (!versionsData) return null
30+
const { label, versions } = versionsData
1831

1932
return <Dropdown label={label} className={cn(styles.versions, customClass?.versions)} align="right">
2033
{versions.map(({ label, sourceId }) => {
@@ -40,7 +53,7 @@ export default function Breadcrumb({ source, children }: BreadcrumbProps) {
4053
<a href={routes?.getSourceRouteUrl?.({ sourceId: part.sourceId }) ?? ''} key={depth}>{part.text}</a>
4154
)}
4255
</div>
43-
{source.versions && <Versions source={source} />}
56+
{source.fetchVersions && <Versions source={source} />}
4457
{children}
4558
</nav>
4659
}

src/lib/sources/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export interface VersionsData {
2727
interface BaseSource {
2828
sourceId: string
2929
sourceParts: SourcePart[]
30-
versions?: VersionsData
30+
fetchVersions?: () => Promise<VersionsData>
3131
}
3232

3333
export interface FileSource extends BaseSource {

0 commit comments

Comments
 (0)