diff options
author | polwex <polwex@sortug.com> | 2025-06-15 04:59:49 +0700 |
---|---|---|
committer | polwex <polwex@sortug.com> | 2025-06-15 04:59:49 +0700 |
commit | 71c20233ff79e696d0eeca2ce1462d3083fbcfed (patch) | |
tree | 4491f680fb6fe65e9d8606764c7000396856e93e /bs5/client/SinglePageRSC.re | |
parent | 241dc9c99bed4dddbc748aad54cee5bf7d77ab92 (diff) |
and were done, just like that
Diffstat (limited to 'bs5/client/SinglePageRSC.re')
-rw-r--r-- | bs5/client/SinglePageRSC.re | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/bs5/client/SinglePageRSC.re b/bs5/client/SinglePageRSC.re new file mode 100644 index 0000000..ee011f2 --- /dev/null +++ b/bs5/client/SinglePageRSC.re @@ -0,0 +1,40 @@ +module App = { + [@react.component] + let make = (~promise) => { + React.Experimental.use(promise); + }; +}; + +external readable_stream: Webapi.ReadableStream.t = + "window.srr_stream.readable_stream"; + +[@mel.module "react"] +external startTransition: (unit => unit) => unit = "startTransition"; + +try({ + let promise = + ReactServerDOMEsbuild.createFromReadableStream(readable_stream); + + let document: option(Webapi.Dom.Element.t) = [%mel.raw "window.document"]; + + switch (document) { + | Some(elem) => + startTransition(() => { + let app = <App promise />; + let _ = ReactDOM.Client.hydrateRoot(elem, app); + (); + }) + | None => Js.log("No root element found") + }; +}) { +| exn => + switch (Js.Exn.asJsExn(exn)) { + | Some(error) => + Js.log2("Error type:", Js.Exn.name(error)); + Js.log2("Stack:", Js.Exn.stack(error)); + Js.log2("Full error:", error); + | None => + Js.log("No JavaScript exception, got:"); + Js.log(exn); + } +}; |