diff --git a/src/Layout.re b/src/Layout.re index c95ff9f..9dbe9a5 100644 --- a/src/Layout.re +++ b/src/Layout.re @@ -125,9 +125,8 @@ module Sidebar = { }; [@react.component] - let make = (~innerContainerId=?, ~fullHeight=false, ~children=React.null) => -
+ let make = (~domRef=?, ~fullHeight=false, ~children=React.null) => +
children
; }; diff --git a/src/ReshowcaseUi.re b/src/ReshowcaseUi.re index b579164..266f8ce 100644 --- a/src/ReshowcaseUi.re +++ b/src/ReshowcaseUi.re @@ -157,8 +157,6 @@ module TopPanel = {
; }; -let rightSidebarId = "rightSidebar"; - module Link = { [@react.component] let make = (~href, ~text: React.element, ~style=?, ~activeStyle=?) => { @@ -611,9 +609,9 @@ module DemoUnitSidebar = { onIntChange( @@ -633,9 +631,9 @@ module DemoUnitSidebar = { onFloatChange( @@ -712,38 +710,9 @@ module DemoUnit = { ->(ReactDOM.Style.unsafeAddProp("WebkitOverflowScrolling", "touch")); }; - let getRightSidebarElement = (): option(Dom.element) => - Window.window##parent##document##getElementById(rightSidebarId) - ->Js.Nullable.toOption; - [@react.component] - let make = (~demoUnit: Configs.demoUnitProps => React.element) => { - let (parentWindowRightSidebarElem, setParentWindowRightSidebarElem) = - React.useState(() => None); - - React.useEffect0(() => { - switch (getRightSidebarElement()) { - | Some(elem) => setParentWindowRightSidebarElem(_ => Some(elem)) - | None => () - }; - None; - }); - React.useEffect0(() => { - Window.addMessageListener(event => - if (Window.window##parent === event##source) { - let message: string = event##data; - switch (message->Window.Message.fromStringOpt) { - | Some(RightSidebarDisplayed) => - switch (getRightSidebarElement()) { - | Some(elem) => setParentWindowRightSidebarElem(_ => Some(elem)) - | None => () - } - | None => Js.Console.error("Unexpected message received") - }; - } - ); - None; - }); + let make = + (~demoUnit: Configs.demoUnitProps => React.element, ~sidebarElem=?) => { let (state, dispatch) = React.useReducer( (state, action) => @@ -867,7 +836,7 @@ module DemoUnit = {
{demoUnit(props)}
- {switch (parentWindowRightSidebarElem) { + {switch (sidebarElem) { | None => React.null | Some(element) => ReactDOM.createPortal( @@ -909,22 +878,12 @@ module DemoUnitFrame = { (), ); - let useFullframeUrl: bool = [%mel.raw - {js|typeof USE_FULL_IFRAME_URL === "boolean" ? USE_FULL_IFRAME_URL : false|js} - ]; - [@react.component] - let make = - (~queryString: string, ~responsiveMode, ~onLoad: Js.t('a) => unit) => { - let iframePath = if (useFullframeUrl) {"demo/index.html"} else {"demo"}; + let make = (~responsiveMode, ~onLoad: Js.t('a) => unit, ~children) => { + let (body, setBody) = React.useState(_ => None); +
; }; }; @@ -1017,29 +987,20 @@ module App = { let make = (~demos: Demos.t) => { let url = ReasonReactRouter.useUrl(); let urlSearchParams = url.search->URLSearchParams.make; + let (sidebarElem, setSidebarElem) = React.useState(_ => None); let route = switch ( urlSearchParams->(URLSearchParams.get("iframe")), urlSearchParams->(URLSearchParams.get("demo")), ) { | (Some("true"), Some(demoName)) => Unit(urlSearchParams, demoName) - | (_, Some(_)) => Demo(url.search) + | (_, Some(demoName)) => Demo(demoName) | _ => Home }; let (loadedIframeWindow: option(Js.t('a)), setLoadedIframeWindow) = React.useState(() => None); - let (iframeKey, setIframeKey) = - React.useState(() => Js.Date.now()->Float.toString); - - React.useEffect1( - () => { - setIframeKey(_ => Js.Date.now()->Float.toString); - None; - }, - [|url|], - ); let (showRightSidebar, toggleShowRightSidebar) = React.useState(() => LocalStorage.localStorage @@ -1089,72 +1050,70 @@ module App = { };
+ {switch (route) { + | Unit(_, _) => React.null + | Demo(_) + | Home => + + }} {switch (route) { | Unit(urlSearchParams, demoName) => let demoUnit = Demos.findDemo(urlSearchParams, demoName, demos);
{demoUnit - ->(Option.map(demoUnit => )) - ->(Option.getWithDefault("Demo not found"->React.string))} + ->Option.map(demoUnit => ) + ->Option.getWithDefault("Demo not found"->React.string)}
; - | Demo(queryString) => - <> - + let demoUnit = + Demos.findDemo(urlSearchParams, demoName, demos) + ->Option.map(demoUnit => + + ) + ->Option.getWithDefault("Demo not found"->React.string); +
+ { + toggleShowRightSidebar(_ => !showRightSidebar); + switch (loadedIframeWindow) { + | Some(window) when !showRightSidebar => + Window.postMessage(window, RightSidebarDisplayed) + | None + | _ => () + }; + }} + onSetResponsiveMode /> -
- { - toggleShowRightSidebar(_ => !showRightSidebar); - switch (loadedIframeWindow) { - | Some(window) when !showRightSidebar => - Window.postMessage(window, RightSidebarDisplayed) - | None - | _ => () - }; - }} - onSetResponsiveMode - /> -
-
- - setLoadedIframeWindow(_ => Some(iframeWindow)) - } - /> -
- {if (showRightSidebar) { - ; - } else { - React.null; - }} +
+
+ { + setLoadedIframeWindow(_ => Some(iframeWindow)) + }}> + demoUnit +
+ {showRightSidebar + ? + setSidebarElem(_ => node->Js.Nullable.toOption) + )} + /> + : React.null}
- - +
; | Home => - <> - -
-
"Pick a demo"->React.string
-
- +
+
"Pick a demo"->React.string
+
}}
; };