From 369e88880aaf291b90bd8fab3f4ae5a4478a86c6 Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Tue, 28 Feb 2023 19:06:07 -0800 Subject: [PATCH] Add render time to footer. --- Cargo.lock | 45 ++++++++++++++++++++++++-- web/Cargo.toml | 1 + web/index.html | 10 +++++- web/src/lib.rs | 85 +++++++++++++++++++++++++++++--------------------- 4 files changed, 102 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fd0ccf5..fb53dcc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -982,6 +982,7 @@ dependencies = [ "serde", "serde_json", "wasm-bindgen-test", + "wasm-timer", ] [[package]] @@ -1242,6 +1243,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + [[package]] name = "parking_lot" version = "0.12.1" @@ -1249,7 +1261,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core", + "parking_lot_core 0.9.4", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if 1.0.0", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi 0.3.9", ] [[package]] @@ -1572,7 +1598,7 @@ dependencies = [ "memchr", "multer", "num_cpus", - "parking_lot", + "parking_lot 0.12.1", "pin-project-lite", "rand", "ref-cast", @@ -2443,6 +2469,21 @@ dependencies = [ "quote 1.0.21", ] +[[package]] +name = "wasm-timer" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" +dependencies = [ + "futures", + "js-sys", + "parking_lot 0.11.2", + "pin-utils", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "web-sys" version = "0.3.60" diff --git a/web/Cargo.toml b/web/Cargo.toml index 5ddac7f..1ecd98f 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -24,6 +24,7 @@ serde = { version = "1.0.147", features = ["derive"] } notmuch = {path = "../notmuch"} itertools = "0.10.5" serde_json = { version = "1.0.93", features = ["unbounded_depth"] } +wasm-timer = "0.2.5" [package.metadata.wasm-pack.profile.release] wasm-opt = ['-Os'] diff --git a/web/index.html b/web/index.html index 44b6dd3..414a69d 100644 --- a/web/index.html +++ b/web/index.html @@ -14,7 +14,6 @@ } .body { padding-bottom: 1em; - border: 1px red solid; } .error { background-color: red; @@ -34,6 +33,15 @@ iframe { .index .date { white-space: nowrap; } +.footer { + background-color: #eee; + position: fixed; + bottom: 0; + left: 0; + right: 0; + height: 3em; + padding: 1em; +} diff --git a/web/src/lib.rs b/web/src/lib.rs index 6659383..347372a 100644 --- a/web/src/lib.rs +++ b/web/src/lib.rs @@ -8,6 +8,7 @@ use log::{debug, error, info, warn, Level}; use notmuch::{Content, Part, SearchSummary, Thread, ThreadNode, ThreadSet}; use seed::{prelude::*, *}; use serde::de::Deserialize; +use wasm_timer::Instant; // ------ ------ // Init @@ -295,8 +296,8 @@ fn pretty_authors(authors: &str) -> impl Iterator> + '_ { } */ - authors - .filter_map(|author| { + Itertools::intersperse( + authors.filter_map(|author| { author.split_whitespace().nth(0).map(|first| { span![ attrs! { @@ -304,8 +305,9 @@ fn pretty_authors(authors: &str) -> impl Iterator> + '_ { first ] }) - }) - .intersperse(span![", "]) + }), + span![", "], + ) } fn view_search_results(query: &str, search_results: &SearchSummary) -> Node { @@ -399,52 +401,63 @@ fn view_header(query: &str) -> Node { C!["navbar"], attrs! {At::Role=>"navigation"}, div![ - C!["navbar-menu"], - div![ - C!["navbar-start"], - a![ - C!["navbar-item", "button",], - "Unread", - ev(Ev::Click, |_| Msg::SearchRequest("is:unread".to_string())), - ], - a![ - C!["navbar-item", "button"], - "All", - ev(Ev::Click, |_| Msg::SearchRequest("".to_string())), - ], - input![ - C!["navbar-item", "input"], - attrs! { - At::Placeholder => "Search"; - At::AutoFocus => true.as_at_value(); - At::Value => query, - }, - input_ev(Ev::Input, Msg::SearchRequest), - // Resend search on enter. - keyboard_ev(Ev::KeyUp, move |e| if e.key_code() == 0x0d { - Msg::SearchRequest(query) - } else { - Msg::Noop - }), - ] + C!["navbar-start"], + a![ + C!["navbar-item", "button",], + "Unread", + ev(Ev::Click, |_| Msg::SearchRequest("is:unread".to_string())), + ], + a![ + C!["navbar-item", "button"], + "All", + ev(Ev::Click, |_| Msg::SearchRequest("".to_string())), + ], + input![ + C!["navbar-item", "input"], + attrs! { + At::Placeholder => "Search"; + At::AutoFocus => true.as_at_value(); + At::Value => query, + }, + input_ev(Ev::Input, Msg::SearchRequest), + // Resend search on enter. + keyboard_ev(Ev::KeyUp, move |e| if e.key_code() == 0x0d { + Msg::SearchRequest(query) + } else { + Msg::Noop + }), ] ] ] } +fn view_footer(render_time_ms: u128) -> Node { + footer![ + C!["footer"], + div![ + C!["content", "has-text-right", "is-size-7"], + format!("Render time {} ms", render_time_ms) + ] + ] +} + // `view` describes what to display. fn view(model: &Model) -> Node { + let start = Instant::now(); info!("view called"); let content = match &model.context { Context::None => div![h1!["Loading"]], Context::Thread(thread_set) => view_thread(thread_set), Context::Search(search_results) => view_search_results(&model.query, search_results), }; - div![section![ - C!["section"], + div![ view_header(&model.query), - div![C!["container"], content] - ]] + section![ + C!["section"], + div![C!["container"], content], + view_footer(start.elapsed().as_millis()) + ] + ] } // ------ ------