diff --git a/corp/tvixbolt/Cargo.lock b/corp/tvixbolt/Cargo.lock index 4f52a73cf..e6572fc03 100644 --- a/corp/tvixbolt/Cargo.lock +++ b/corp/tvixbolt/Cargo.lock @@ -592,6 +592,7 @@ version = "0.1.0" dependencies = [ "codemap", "rnix", + "serde", "serde_urlencoded", "tvix-eval", "wasm-bindgen", diff --git a/corp/tvixbolt/Cargo.toml b/corp/tvixbolt/Cargo.toml index 57eea8e12..fc7cedfd5 100644 --- a/corp/tvixbolt/Cargo.toml +++ b/corp/tvixbolt/Cargo.toml @@ -22,3 +22,7 @@ rev = "7d0d929c22ad27bdcc0779afe445b541d3ce9631" [dependencies.tvix-eval] path = "../../tvix/eval" default-features = false + +[dependencies.serde] +version = "*" # pinned by yew +features = [ "derive" ] diff --git a/corp/tvixbolt/src/main.rs b/corp/tvixbolt/src/main.rs index 35e9d2792..8dad534a3 100644 --- a/corp/tvixbolt/src/main.rs +++ b/corp/tvixbolt/src/main.rs @@ -1,5 +1,6 @@ use std::fmt::Write; +use serde::{Deserialize, Serialize}; use std::rc::Rc; use tvix_eval::observer::TracingObserver; use tvix_eval::observer::{DisassemblingObserver, NoOpObserver}; @@ -7,12 +8,14 @@ use web_sys::HtmlInputElement; use web_sys::HtmlTextAreaElement; use yew::prelude::*; use yew::TargetCast; +use yew_router::{prelude::*, AnyRoute}; enum Msg { CodeChange(String), ToggleTrace(bool), } +#[derive(Clone, Serialize, Deserialize)] struct Model { code: String, trace: bool, @@ -87,25 +90,30 @@ impl Component for Model { type Message = Msg; type Properties = (); - fn create(_ctx: &Context) -> Self { - Self { - code: String::new(), - trace: false, - } + fn create(_: &Context) -> Self { + BrowserHistory::new() + .location() + .query::() + .unwrap_or_else(|_| Self { + code: String::new(), + trace: false, + }) } - fn update(&mut self, _ctx: &Context, msg: Self::Message) -> bool { + fn update(&mut self, _: &Context, msg: Self::Message) -> bool { match msg { Msg::ToggleTrace(trace) => { self.trace = trace; - true } Msg::CodeChange(new_code) => { self.code = new_code; - true } } + + let _ = BrowserHistory::new().replace_with_query(AnyRoute::new("/"), self.clone()); + + true } fn view(&self, ctx: &Context) -> Html { @@ -128,8 +136,8 @@ impl Component for Model { Msg::CodeChange(ta) })} - id="code" cols="30" rows="10"> - + id="code" cols="30" rows="10" value={self.code.clone()}> +