From f1a61ce6ab50d87d13d1c1a7c9553348e6a82e02 Mon Sep 17 00:00:00 2001 From: Pedro Castro Date: Fri, 4 Jul 2025 14:09:07 -0300 Subject: [PATCH] Storage versions on local storage Storage three version: - Manual/API - Playground - React --- src/ApiDocs.res | 1 + src/DocsOverview.res | 27 --------------------------- src/Playground.res | 10 ++++++++-- src/common/Url.res | 14 ++++++++++++++ src/common/Url.resi | 8 ++++++++ src/components/Navigation.res | 7 +++++-- src/layouts/ApiLayout.res | 1 + src/layouts/DocsLayout.res | 8 ++++++++ 8 files changed, 45 insertions(+), 31 deletions(-) diff --git a/src/ApiDocs.res b/src/ApiDocs.res index fba3abf17..0dca67f9d 100644 --- a/src/ApiDocs.res +++ b/src/ApiDocs.res @@ -170,6 +170,7 @@ module SidebarTree = { open Url ReactEvent.Form.preventDefault(evt) let version = (evt->ReactEvent.Form.target)["value"] + WebAPI.Storage.setItem(localStorage, ~key=(Manual :> string), ~value=version) let url = Url.parse(router.asPath) switch url.pagepath[1] { | Some("core") | Some("stdlib") => diff --git a/src/DocsOverview.res b/src/DocsOverview.res index cdc04d212..b847d148f 100644 --- a/src/DocsOverview.res +++ b/src/DocsOverview.res @@ -30,35 +30,8 @@ let default = (~showVersionSelect=true) => { ("Reanalyze", "https://github.com/rescript-lang/reanalyze"), ] - let versionSelect = if showVersionSelect { - let onChange = evt => { - open Url - ReactEvent.Form.preventDefault(evt) - let version = (evt->ReactEvent.Form.target)["value"] - let url = Url.parse(router.route) - - let targetUrl = - "/" ++ - (Array.join(url.base, "/") ++ - ("/" ++ (version ++ ("/" ++ Array.join(url.pagepath, "/"))))) - router->Next.Router.push(targetUrl) - } - -
- -
- } else { - React.null - } - <>
- versionSelect
{React.string("Docs")}
diff --git a/src/Playground.res b/src/Playground.res index bd20c5939..4e89cdbd7 100644 --- a/src/Playground.res +++ b/src/Playground.res @@ -886,7 +886,9 @@ module Settings = { ReactEvent.Form.preventDefault(evt) let id: string = (evt->ReactEvent.Form.target)["value"] switch id->Semver.parse { - | Some(v) => onCompilerSelect(v) + | Some(v) => + onCompilerSelect(v) + WebAPI.Storage.setItem(localStorage, ~key=(Url.Playground :> string), ~value=id) | None => () } }}> @@ -1417,7 +1419,11 @@ let make = (~versions: array) => { let initialVersion = switch Dict.get(router.query, "version") { | Some(version) => version->Semver.parse - | None => lastStableVersion + | None => + switch Url.getVersionFromStorage(Playground) { + | Some(v) => v->Semver.parse + | None => lastStableVersion + } } let initialLang = switch Dict.get(router.query, "ext") { diff --git a/src/common/Url.res b/src/common/Url.res index 4c28634f3..1e3b6b25d 100644 --- a/src/common/Url.res +++ b/src/common/Url.res @@ -81,6 +81,20 @@ let parse = (route: string): t => { {fullpath, base, version, pagepath} } +@unboxed +type storageKey = + | @as("manual_version") Manual + | @as("react_version") React + | @as("playground_version") Playground + +let getVersionFromStorage = (key: storageKey) => { + try { + WebAPI.Storage.getItem(window.localStorage, (key :> string))->Null.toOption + } catch { + | JsExn(_) => None + } +} + let getVersionString = url => switch url.version { | Next => Constants.versions.next diff --git a/src/common/Url.resi b/src/common/Url.resi index 57d1de25e..1c95d0924 100644 --- a/src/common/Url.resi +++ b/src/common/Url.resi @@ -21,4 +21,12 @@ let parse: string => t let prettyString: string => string +@unboxed +type storageKey = + | @as("manual_version") Manual + | @as("react_version") React + | @as("playground_version") Playground + +let getVersionFromStorage: storageKey => option + let getVersionString: t => string diff --git a/src/components/Navigation.res b/src/components/Navigation.res index 1476fa627..25738b614 100644 --- a/src/components/Navigation.res +++ b/src/components/Navigation.res @@ -77,7 +77,10 @@ let make = (~fixed=true, ~isOverlayOpen: bool, ~setOverlayOpen: (bool => bool) = let router = Next.Router.useRouter() let route = router.route let url = router.route->Url.parse - let version = url->Url.getVersionString + let verionFromUrl = url->Url.getVersionString + + let version = Url.getVersionFromStorage(Manual)->Option.getOr(Constants.versions.latest) + let reactVersion = Url.getVersionFromStorage(React)->Option.getOr(verionFromUrl) let toggleOverlay = () => { setOverlayOpen(prev => !prev) @@ -188,7 +191,7 @@ let make = (~fixed=true, ~isOverlayOpen: bool, ~setOverlayOpen: (bool => bool) = {React.string("Syntax Lookup")} {React.string("React")} diff --git a/src/layouts/ApiLayout.res b/src/layouts/ApiLayout.res index 04289ee33..90724a724 100644 --- a/src/layouts/ApiLayout.res +++ b/src/layouts/ApiLayout.res @@ -105,6 +105,7 @@ let make = ( ReactEvent.Form.preventDefault(evt) let version = (evt->ReactEvent.Form.target)["value"] let url = Url.parse(route) + WebAPI.Storage.setItem(localStorage, ~key=(Url.Manual :> string), ~value=version) let targetUrl = "/" ++ diff --git a/src/layouts/DocsLayout.res b/src/layouts/DocsLayout.res index 828bdd127..2914724a9 100644 --- a/src/layouts/DocsLayout.res +++ b/src/layouts/DocsLayout.res @@ -94,6 +94,14 @@ let make = ( ReactEvent.Form.preventDefault(evt) let version = (evt->ReactEvent.Form.target)["value"] let url = Url.parse(route) + WebAPI.Storage.setItem( + localStorage, + ~key=switch metaTitleCategory { + | "React" => (React :> string) + | _ => (Manual :> string) + }, + ~value=version, + ) let targetUrl = "/" ++