Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 58 additions & 11 deletions apps/docs/__tests__/VersionSelect_.test.res
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
open Vitest

test("renders current version label", async () => {
let screen = await render(<VersionSelect />)
let screen = await render(
<ReactRouter.MemoryRouter initialEntries=["/docs/manual/introduction"]>
<VersionSelect />
</ReactRouter.MemoryRouter>,
)

let el = await screen->getByTestId("version-select")
await element(el)->toBeVisible
Expand All @@ -10,8 +14,12 @@ test("renders current version label", async () => {
await element(label)->toBeVisible
})

test("clicking button shows older versions", async () => {
let screen = await render(<VersionSelect />)
test("clicking button shows the v13 preview and older versions", async () => {
let screen = await render(
<ReactRouter.MemoryRouter initialEntries=["/docs/manual/introduction"]>
<VersionSelect />
</ReactRouter.MemoryRouter>,
)

// Menu should be hidden initially
let v11 = await screen->getByText("v11")
Expand All @@ -21,6 +29,13 @@ test("clicking button shows older versions", async () => {
let button = await screen->getByRole(#button)
await button->click

let preview = await screen->getByText("v13 (preview)")
await element(preview)->toBeVisible
await element(preview)->toHaveAttribute(
"href",
"https://v13.rescript-lang.org/docs/manual/introduction",
)

// Older versions should now be visible
let v11After = await screen->getByText("v11")
await element(v11After)->toBeVisible
Expand All @@ -36,7 +51,11 @@ test("clicking button shows older versions", async () => {
})

test("clicking button again closes older versions", async () => {
let screen = await render(<VersionSelect />)
let screen = await render(
<ReactRouter.MemoryRouter initialEntries=["/docs/manual/introduction"]>
<VersionSelect />
</ReactRouter.MemoryRouter>,
)

let button = await screen->getByRole(#button)

Expand All @@ -53,14 +72,16 @@ test("clicking button again closes older versions", async () => {

test("multiple instances have unique popover IDs", async () => {
let screen = await render(
<div>
<div dataTestId="first">
<VersionSelect />
</div>
<div dataTestId="second">
<VersionSelect />
<ReactRouter.MemoryRouter initialEntries=["/docs/manual/introduction"]>
<div>
<div dataTestId="first">
<VersionSelect />
</div>
<div dataTestId="second">
<VersionSelect />
</div>
</div>
</div>,
</ReactRouter.MemoryRouter>,
)

let first = await screen->getByTestId("first")
Expand All @@ -78,3 +99,29 @@ test("multiple instances have unique popover IDs", async () => {
let secondV11 = await second->getByText("v11")
await element(secondV11)->notToBeVisible
})

test("switching to v13 preserves the manual page, query, and anchor", async () => {
let path = "/docs/manual/array-and-list?view=full#immutable-lists"
let screen = await render(
<ReactRouter.MemoryRouter initialEntries=[path]>
<VersionSelect />
</ReactRouter.MemoryRouter>,
)
let button = await screen->getByRole(#button)
await button->click
let preview = await screen->getByText("v13 (preview)")
await element(preview)->toHaveAttribute("href", "https://v13.rescript-lang.org" ++ path)
})

test("switching to v13 preserves the API module", async () => {
let path = "/docs/manual/api/stdlib/array#value-map"
let screen = await render(
<ReactRouter.MemoryRouter initialEntries=[path]>
<VersionSelect />
</ReactRouter.MemoryRouter>,
)
let button = await screen->getByRole(#button)
await button->click
let preview = await screen->getByText("v13 (preview)")
await element(preview)->toHaveAttribute("href", "https://v13.rescript-lang.org" ++ path)
})
9 changes: 8 additions & 1 deletion apps/docs/src/components/VersionSelect.res
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,17 @@ let version = DocsVersion.current

@react.component
let make = () => {
let location = ReactRouter.useLocation()
let search = location.search->Option.getOr("")
let hash = location.hash->Option.getOr("")
let previewHref =
"https://v13.rescript-lang.org" ++ (location.pathname :> string) ++ search ++ hash
let previewVersions =
DocsVersion.current === "v13" ? [] : [{label: "v13 (preview)", link: previewHref}]
let id = React.useId()
let popoverId = "older-versions-" ++ id

let children = Array.map(olderVersions, ver => {
let children = [...previewVersions, ...olderVersions]->Array.map(ver => {
<a className="py-0.5 block hover:underline" key=ver.label href=ver.link>
{React.string(ver.label)}
</a>
Expand Down