Skip to content

Commit 6649b0b

Browse files
committed
Migrate layouts/ to rescript syntax
1 parent 06a1722 commit 6649b0b

25 files changed

+1779
-1850
lines changed

layouts/ApiLayout.re

Lines changed: 0 additions & 157 deletions
This file was deleted.

layouts/ApiLayout.res

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
module Link = Next.Link
2+
open Util.ReactStuff
3+
4+
// This is used for the version dropdown in the api layouts
5+
let allApiVersions = ["latest", "v8.0.0"]
6+
7+
// Used for replacing "latest" with "vX.X.X" in the version dropdown
8+
let latestVersionLabel = "v8.2.0"
9+
10+
module Sidebar = SidebarLayout.Sidebar
11+
module Toc = SidebarLayout.Toc
12+
13+
module OldDocsWarning = {
14+
@react.component
15+
let make = (~version: string, ~route: string) => {
16+
let url = Url.parse(route)
17+
let latestUrl =
18+
"/" ++
19+
(Js.Array2.joinWith(url.base, "/") ++
20+
("/latest/" ++ Js.Array2.joinWith(url.pagepath, "/")))
21+
open Markdown
22+
<div className="mb-10">
23+
<Info>
24+
<P>
25+
{("You are currently looking at the " ++
26+
(version ++
27+
" docs (Reason v3.6 syntax edition). You can find the latest API docs "))->s}
28+
<A href=latestUrl> {"here"->s} </A>
29+
{"."->s}
30+
</P>
31+
</Info>
32+
</div>
33+
}
34+
}
35+
36+
let makeBreadcrumbs = (~prefix: Url.breadcrumb, route: string): list<Url.breadcrumb> => {
37+
let url = route->Url.parse
38+
39+
let (_, rest) = // Strip the "api" part of the url before creating the rest of the breadcrumbs
40+
Js.Array2.sliceFrom(url.pagepath, 1)->Belt.Array.reduce((prefix.href, []), (acc, path) => {
41+
let (baseHref, ret) = acc
42+
43+
let href = baseHref ++ ("/" ++ path)
44+
45+
Js.Array2.push(
46+
ret,
47+
{
48+
open Url
49+
{name: prettyString(path), href: href}
50+
},
51+
)->ignore
52+
(href, ret)
53+
})
54+
Belt.Array.concat([prefix], rest)->Belt.List.fromArray
55+
}
56+
57+
@react.component
58+
let make = (
59+
~breadcrumbs=?,
60+
~categories: array<Sidebar.Category.t>,
61+
~title="",
62+
~version: option<string>=?,
63+
~activeToc: option<Toc.t>=?,
64+
~components=ApiMarkdown.default,
65+
~children,
66+
) => {
67+
let router = Next.Router.useRouter()
68+
let route = router.route
69+
70+
let (isSidebarOpen, setSidebarOpen) = React.useState(_ => false)
71+
let toggleSidebar = () => setSidebarOpen(prev => !prev)
72+
73+
React.useEffect1(() => {
74+
open Next.Router.Events
75+
let {Next.Router.events: events} = router
76+
77+
let onChangeComplete = _url => setSidebarOpen(_ => false)
78+
79+
events->on(#routeChangeComplete(onChangeComplete))
80+
events->on(#hashChangeComplete(onChangeComplete))
81+
82+
Some(
83+
() => {
84+
events->off(#routeChangeComplete(onChangeComplete))
85+
events->off(#hashChangeComplete(onChangeComplete))
86+
},
87+
)
88+
}, [])
89+
90+
let preludeSection =
91+
<div className="flex justify-between text-primary font-medium items-baseline">
92+
{title->s}
93+
{switch version {
94+
| Some(version) =>
95+
let onChange = evt => {
96+
open Url
97+
ReactEvent.Form.preventDefault(evt)
98+
let version = (evt->ReactEvent.Form.target)["value"]
99+
let url = Url.parse(route)
100+
101+
let targetUrl =
102+
"/" ++
103+
(Js.Array2.joinWith(url.base, "/") ++
104+
("/" ++ (version ++ ("/" ++ Js.Array2.joinWith(url.pagepath, "/")))))
105+
router->Next.Router.push(targetUrl)
106+
}
107+
<VersionSelect latestVersionLabel onChange version availableVersions=allApiVersions />
108+
| None => React.null
109+
}}
110+
</div>
111+
112+
let sidebar =
113+
<Sidebar preludeSection isOpen=isSidebarOpen toggle=toggleSidebar categories ?activeToc route />
114+
115+
let pageTitle = switch breadcrumbs {
116+
| Some(list{_, {Url.name: name}}) => name
117+
| Some(list{_, module_, {name}}) => module_.name ++ ("." ++ name)
118+
| _ => "API"
119+
}
120+
<SidebarLayout
121+
?breadcrumbs
122+
metaTitle={pageTitle ++ " | ReScript API"}
123+
theme=#Reason
124+
components
125+
sidebarState=(isSidebarOpen, setSidebarOpen)
126+
sidebar>
127+
children
128+
</SidebarLayout>
129+
}
Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
1-
module Link = Next.Link;
1+
module Link = Next.Link
22

3-
module Sidebar = DocsLayout.Sidebar;
3+
module Sidebar = DocsLayout.Sidebar
44

5-
let categories: array(Sidebar.Category.t) = [|
5+
let categories: array<Sidebar.Category.t> = [
66
{
77
name: "Introduction",
8-
items: [|{name: "Overview", href: "/docs/manual/latest/api"}|],
8+
items: [{name: "Overview", href: "/docs/manual/latest/api"}],
99
},
1010
{
1111
name: "Modules",
12-
items: [|
12+
items: [
1313
{name: "Js Module", href: "/docs/manual/latest/api/js"},
1414
{name: "Belt Stdlib", href: "/docs/manual/latest/api/belt"},
1515
{name: "Dom Module", href: "/docs/manual/latest/api/dom"},
16-
|],
16+
],
1717
},
18-
|];
18+
]
1919

2020
/* Used for API docs (structured data) */
2121
module Docs = {
22-
[@react.component]
22+
@react.component
2323
let make = (~components=ApiMarkdown.default, ~children) => {
24-
let title = "API";
25-
let version = "latest";
24+
let title = "API"
25+
let version = "latest"
2626

27-
<ApiLayout title categories version components> children </ApiLayout>;
28-
};
29-
};
27+
<ApiLayout title categories version components> children </ApiLayout>
28+
}
29+
}
3030

3131
/*
3232
This layout is used for structured prose text with proper H2 headings.
@@ -35,8 +35,6 @@ module Docs = {
3535
of H2 nodes.
3636
*/
3737
module Prose = {
38-
[@react.component]
39-
let make = (~children) => {
40-
<Docs components=Markdown.default> children </Docs>;
41-
};
42-
};
38+
@react.component
39+
let make = (~children) => <Docs components=Markdown.default> children </Docs>
40+
}

0 commit comments

Comments
 (0)