Skip to content

Commit 21cb8f7

Browse files
committed
Refactor layout to dynamically generate page tree structure from source
1 parent 8b0d2d7 commit 21cb8f7

File tree

1 file changed

+85
-39
lines changed

1 file changed

+85
-39
lines changed

app/docs/layout.tsx

Lines changed: 85 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,96 @@
11
import { DocsLayout } from 'fumadocs-ui/layouts/docs';
22
import { baseOptions } from '@/lib/layout.shared';
33
import { PageTree } from 'fumadocs-core/server';
4+
import { source } from '@/lib/source';
45

5-
const tree: PageTree.Root = {
6-
name: 'docs',
7-
children: [
8-
{ name: 'Architecture', url: '/docs/architecture', type: 'page' },
9-
{ name: 'Deployment', url: '/docs/deployment', type: 'page' },
10-
{ name: 'Troubleshooting', url: '/docs/troubleshooting', type: 'page' },
11-
{ name: 'Contribute to Wiki', url: '/docs/contribute', type: 'page' },
12-
{
13-
name: 'Frontend',
14-
type: 'folder',
15-
children: [
16-
{ name: 'Item Page', url: '/docs/frontend/item-page', type: 'page' },
17-
],
18-
},
19-
{
20-
name: 'Services',
21-
type: 'folder',
22-
children: [
23-
{ name: 'Overview', url: '/docs/services', type: 'page' },
24-
{
25-
name: 'Filesystem (VFS)',
26-
type: 'folder',
27-
children: [
28-
{ name: 'Overview', url: '/docs/services/filesystem', type: 'page' },
29-
{ name: 'Performance Tuning', url: '/docs/services/filesystem/performance', type: 'page' },
30-
],
31-
},
32-
{ name: 'Content Services', url: '/docs/services/content', type: 'page' },
33-
{ name: 'Scrapers', url: '/docs/services/scrapers', type: 'page' },
34-
{ name: 'Downloaders', url: '/docs/services/downloaders', type: 'page' },
35-
{ name: 'Updaters', url: '/docs/services/updaters', type: 'page' },
36-
{ name: 'Post-Processing', url: '/docs/services/post-processing', type: 'page' },
37-
{ name: 'Subtitles', url: '/docs/services/subtitles', type: 'page' },
38-
{ name: 'Notifications', url: '/docs/services/notifications', type: 'page' },
39-
{ name: 'Management Commands', url: '/docs/services/extras', type: 'page' },
40-
],
41-
},
42-
]
6+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
7+
function getSubtree(tree: any): any {
8+
const subTree: any = { name: tree.name, children: [] };
9+
10+
if (tree.url) {
11+
subTree.url = tree.url;
12+
}
13+
14+
if (!subTree.url && tree.index && tree.index.url) {
15+
if (tree.children?.length > 0) {
16+
subTree.children.push({ name: 'Overview', url: tree.index.url, type: 'page' });
17+
} else {
18+
subTree.url = tree.index.url;
19+
}
20+
}
21+
22+
if (tree.children?.length > 0) {
23+
for (const child of tree.children) {
24+
const subTreeChildren = getSubtree(child);
25+
if (subTreeChildren) {
26+
subTree.children.push(subTreeChildren);
27+
}
28+
}
29+
}
30+
31+
if (tree.type === 'page' || tree.type === "folder" && !(subTree.children?.length > 0)) {
32+
subTree.type = 'page';
33+
} else {
34+
subTree.type = 'folder';
35+
}
36+
37+
// if (!subTree.url && !(subTree.children?.length > 0)) {
38+
// return null;
39+
// }
40+
41+
return subTree;
4342
}
4443

44+
// const origTree: PageTree.Root = {
45+
// name: 'docs',
46+
// children: [
47+
// { name: 'Architecture', url: '/docs/architecture', type: 'page' },
48+
// { name: 'Deployment', url: '/docs/deployment', type: 'page' },
49+
// { name: 'Troubleshooting', url: '/docs/troubleshooting', type: 'page' },
50+
// { name: 'Contribute to Wiki', url: '/docs/contribute', type: 'page' },
51+
// {
52+
// name: 'Frontend',
53+
// type: 'folder',
54+
// children: [
55+
// { name: 'Item Page', url: '/docs/frontend/item-page', type: 'page' },
56+
// ],
57+
// },
58+
// {
59+
// name: 'Services',
60+
// type: 'folder',
61+
// children: [
62+
// { name: 'Overview', url: '/docs/services', type: 'page' },
63+
// {
64+
// name: 'Filesystem (VFS)',
65+
// type: 'folder',
66+
// children: [
67+
// { name: 'Overview', url: '/docs/services/filesystem', type: 'page' },
68+
// { name: 'Performance Tuning', url: '/docs/services/filesystem/performance', type: 'page' },
69+
// ],
70+
// },
71+
// { name: 'Content Services', url: '/docs/services/content', type: 'page' },
72+
// { name: 'Scrapers', url: '/docs/services/scrapers', type: 'page' },
73+
// { name: 'Downloaders', url: '/docs/services/downloaders', type: 'page' },
74+
// { name: 'Updaters', url: '/docs/services/updaters', type: 'page' },
75+
// { name: 'Post-Processing', url: '/docs/services/post-processing', type: 'page' },
76+
// { name: 'Subtitles', url: '/docs/services/subtitles', type: 'page' },
77+
// { name: 'Notifications', url: '/docs/services/notifications', type: 'page' },
78+
// { name: 'Management Commands', url: '/docs/services/extras', type: 'page' },
79+
// ],
80+
// },
81+
// ]
82+
// }
83+
4584
export default function Layout({ children }: LayoutProps<'/docs'>) {
85+
86+
const tree = source.getPageTree();
87+
const subTree = getSubtree(tree);
88+
// console.log('Orig tree:', origTree);
89+
// console.log('Gen tree:', subTree);
90+
// console.log("Is subtree same as original tree?", JSON.stringify(subTree) === JSON.stringify(origTree));
91+
4692
return (
47-
<DocsLayout tree={tree} {...baseOptions()}>
93+
<DocsLayout tree={subTree} {...baseOptions()}>
4894
{children}
4995
</DocsLayout>
5096
);

0 commit comments

Comments
 (0)