-
-
Notifications
You must be signed in to change notification settings - Fork 258
Expand file tree
/
Copy pathDocsReactRoute.res
More file actions
87 lines (73 loc) · 2.42 KB
/
DocsReactRoute.res
File metadata and controls
87 lines (73 loc) · 2.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
type loaderData = {
compiledMdx: CompiledMdx.t,
categories: array<SidebarNav.Category.t>,
entries: array<TableOfContents.entry>,
title: string,
description: string,
filePath: string,
}
// Build sidebar categories from all React docs, sorted by their "order" field in frontmatter
let reactTableOfContents = async () => {
let groups =
(await MdxFile.loadAllAttributes(~dir="markdown-pages/docs"))
->Mdx.filterMdxPages("docs/react")
->Mdx.groupBySection
->Dict.mapValues(values =>
values->Mdx.sortSection->SidebarHelpers.convertToNavItems("/docs/react")
)
SidebarHelpers.getAllGroups(
groups,
["Overview", "Main Concepts", "Hooks & State Management", "Guides"],
)
}
let loader: ReactRouter.Loader.t<loaderData> = async ({request}) => {
let {pathname} = WebAPI.URL.make(~url=request.url)
let filePath = MdxFile.resolveFilePath(
(pathname :> string),
~dir="markdown-pages/docs/react",
~alias="docs/react",
)
let raw = await Node.Fs.readFile(filePath, "utf-8")
let {frontmatter}: MarkdownParser.result = MarkdownParser.parseSync(raw)
let description = FrontmatterUtils.getField(frontmatter, "description")
let title = FrontmatterUtils.getField(frontmatter, "title")
let categories = await reactTableOfContents()
let compiledMdx = await MdxFile.compileMdx(raw, ~filePath, ~remarkPlugins=Mdx.plugins)
let entries = TocUtils.buildEntries(raw)
{
compiledMdx,
categories,
entries,
title: `${title} | ReScript React`,
description,
filePath,
}
}
let default = () => {
let {compiledMdx, categories, entries, title, description, filePath} = ReactRouter.useLoaderData()
let breadcrumbs = list{
{Url.name: "Docs", href: "/docs/react/introduction"},
{
Url.name: "rescript-react",
href: "/docs/react/introduction",
},
}
let editHref = `https://github.com/rescript-lang/rescript-lang.org/blob/master/${filePath}`
let activeToc = {TableOfContents.title, entries}
<>
<Meta title description />
<NavbarTertiary sidebar={<DocsSidebar categories activeToc />}>
<Breadcrumbs crumbs=breadcrumbs />
<a
href=editHref className="inline text-14 hover:underline text-fire" rel="noopener noreferrer"
>
{React.string("Edit")}
</a>
</NavbarTertiary>
<DocsLayout categories activeToc>
<div className="markdown-body">
<MdxContent compiledMdx />
</div>
</DocsLayout>
</>
}