From 09d7369b0cc915368cb1b392a04ad37b6abcddd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Wo=C5=BAniak?= Date: Sun, 15 May 2022 13:08:42 +0200 Subject: [PATCH] Load me, show debug modal --- Cargo.lock | 1 + web/Cargo.toml | 2 +- web/src/debug/mod.rs | 48 +++++++++++++++++++++++++++++++++++++++++++ web/src/i18n.rs | 1 + web/src/lib.rs | 25 +++++++++++++++++++++- web/src/model.rs | 3 +++ web/src/pages.rs | 7 +++++++ web/src/shared.rs | 21 +++++++++++++++---- web/src/shared/msg.rs | 10 --------- 9 files changed, 102 insertions(+), 16 deletions(-) create mode 100644 web/src/debug/mod.rs delete mode 100644 web/src/shared/msg.rs diff --git a/Cargo.lock b/Cargo.lock index 8c32ac1..c781bd9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -829,6 +829,7 @@ version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" dependencies = [ + "js-sys", "libc", "num-integer", "num-traits", diff --git a/web/Cargo.toml b/web/Cargo.toml index 5484df2..a01b684 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -12,7 +12,7 @@ model = { path = "../shared/model", features = ["dummy"] } seed = { version = "0.9.1", features = [] } seed_heroicons = { git = "https://github.com/mh84/seed_heroicons.git" } -chrono = { version = "*", features = ["wasm-bindgen"] } +chrono = { version = "*", features = ["wasm-bindgen", "wasmbind"] } gloo-timers = { version = "*", features = ["futures"] } uuid = { version = "1.0.0", features = ["v4"] } diff --git a/web/src/debug/mod.rs b/web/src/debug/mod.rs new file mode 100644 index 0000000..f3c78ed --- /dev/null +++ b/web/src/debug/mod.rs @@ -0,0 +1,48 @@ +use seed::prelude::*; +use seed::*; + +use crate::{Model, Msg}; + +#[derive(Debug)] +pub enum DebugMsg { + Open, + Close, +} + +pub fn init(model: &mut Model, orders: &mut impl Orders) { + model.debug_modal = false; + orders.stream(streams::window_event(Ev::KeyPress, |ev| { + let ke: &web_sys::KeyboardEvent = to_keyboard_event(&ev); + if ke.char_code() == 63 && ke.shift_key() { + Msg::Debug(DebugMsg::Open) + } else { + Msg::NoOp + } + })); +} + +pub fn update(msg: DebugMsg, model: &mut Model) { + model.debug_modal = matches!(msg, DebugMsg::Open); +} + +pub fn view(model: &Model) -> Node { + if !model.debug_modal { + return empty![]; + } + div![ + attrs![At::Style => "display:block;overflow:auto;position:fixed;top:0;left:0;width:100%;height:100%;background:white;z-index:8;"], + a![ + attrs![At::Style => "display:block;margin:4px;background:red;color:white;"], + ev(Ev::Click, move |ev| { + ev.stop_propagation(); + ev.prevent_default(); + Msg::Debug(DebugMsg::Close) + }), + "Close" + ], + div![ + attrs![At::Style => "display:block;"], + pre![code![format!("{model:#?}")]] + ] + ] +} diff --git a/web/src/i18n.rs b/web/src/i18n.rs index 347502d..9f750f2 100644 --- a/web/src/i18n.rs +++ b/web/src/i18n.rs @@ -2,6 +2,7 @@ mod pl; use std::collections::HashMap; +#[derive(Debug)] pub struct I18n { store: HashMap>, lang: String, diff --git a/web/src/lib.rs b/web/src/lib.rs index fa43049..d855c44 100644 --- a/web/src/lib.rs +++ b/web/src/lib.rs @@ -1,6 +1,8 @@ #![feature(try_trait_v2)] pub mod api; +#[cfg(debug_assertions)] +mod debug; mod i18n; mod model; mod pages; @@ -79,15 +81,25 @@ fn init(url: Url, orders: &mut impl Orders) -> Model { .and_then(|el: web_sys::Element| el.get_attribute("href")), shared: shared::Model::default(), i18n: I18n::load(), + #[cfg(debug_assertions)] + debug_modal: false, }; session::init(&mut model, orders); + shared::init(&mut model, orders); + + #[cfg(debug_assertions)] + crate::debug::init(&mut model, orders); model } fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { match msg { + #[cfg(debug_assertions)] + Msg::NoOp => { + orders.skip(); + } Msg::Shared(msg) => { shared::update(msg, &mut model.shared, orders); } @@ -119,16 +131,27 @@ fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { Msg::Session(msg) => { session::update(msg, model, orders); } + #[cfg(debug_assertions)] + Msg::Debug(msg) => { + crate::debug::update(msg, model); + } } } fn view(model: &Model) -> Node { - match &model.page { + let view = match &model.page { Page::Public(PublicPage::Listing(page)) => pages::public::listing::view(model, page), Page::Public(PublicPage::Product(page)) => pages::public::product::view(model, page), Page::Public(PublicPage::SignIn(page)) => pages::public::sign_in::view(model, page), Page::Public(PublicPage::SignUp(page)) => pages::public::sign_up::view(model, page), _ => empty![], + }; + + if cfg!(debug_assertions) { + use seed::*; + div![crate::debug::view(model), view] + } else { + view } } diff --git a/web/src/model.rs b/web/src/model.rs index 5562cc9..5f7bb01 100644 --- a/web/src/model.rs +++ b/web/src/model.rs @@ -2,6 +2,7 @@ use seed::Url; use crate::{I18n, Page}; +#[derive(Debug)] pub struct Model { pub url: Url, pub token: Option, @@ -9,4 +10,6 @@ pub struct Model { pub logo: Option, pub shared: crate::shared::Model, pub i18n: I18n, + #[cfg(debug_assertions)] + pub debug_modal: bool, } diff --git a/web/src/pages.rs b/web/src/pages.rs index 5560eca..b1f4cb6 100644 --- a/web/src/pages.rs +++ b/web/src/pages.rs @@ -8,13 +8,18 @@ use crate::shared; #[derive(Debug)] pub enum Msg { + #[cfg(debug_assertions)] + NoOp, Public(public::Msg), Admin(admin::Msg), UrlChanged(subs::UrlChanged), Shared(shared::Msg), Session(crate::session::SessionMsg), + #[cfg(debug_assertions)] + Debug(crate::debug::DebugMsg), } +#[derive(Debug)] pub enum AdminPage { Landing, Dashboard, @@ -22,6 +27,7 @@ pub enum AdminPage { Product, } +#[derive(Debug)] pub enum PublicPage { Listing(public::listing::ListingPage), Product(public::product::ProductPage), @@ -31,6 +37,7 @@ pub enum PublicPage { Checkout, } +#[derive(Debug)] pub enum Page { Admin(AdminPage), Public(PublicPage), diff --git a/web/src/shared.rs b/web/src/shared.rs index 74ce7f3..227e853 100644 --- a/web/src/shared.rs +++ b/web/src/shared.rs @@ -1,11 +1,17 @@ use seed::app::Orders; -pub use crate::shared::msg::Msg; - -pub mod msg; pub mod notification; pub mod view; +#[derive(Debug)] +pub enum Msg { + LoadMe, + MeLoaded(crate::api::NetRes), + SignIn(model::api::SignInInput), + SignedIn(crate::api::NetRes), + Notification(crate::shared::notification::NotificationMsg), +} + #[derive(Debug, Default)] pub struct Model { pub access_token: Option, @@ -15,11 +21,18 @@ pub struct Model { pub notifications: Vec, } +pub fn init(_model: &mut crate::Model, orders: &mut impl Orders) { + orders.send_msg(crate::Msg::Shared(Msg::LoadMe)); +} + pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { match msg { Msg::LoadMe => { + seed::log!("1"); if let Some(token) = model.access_token.as_ref().cloned() { - orders.skip().perform_cmd(async { + seed::log!("2"); + orders.skip().perform_cmd(async move { + seed::log!("3"); Msg::MeLoaded(crate::api::public::fetch_me(token).await) }); } diff --git a/web/src/shared/msg.rs b/web/src/shared/msg.rs deleted file mode 100644 index 7dc5d9e..0000000 --- a/web/src/shared/msg.rs +++ /dev/null @@ -1,10 +0,0 @@ -use seed::fetch::Result; - -#[derive(Debug)] -pub enum Msg { - LoadMe, - MeLoaded(crate::api::NetRes), - SignIn(model::api::SignInInput), - SignedIn(crate::api::NetRes), - Notification(crate::shared::notification::NotificationMsg), -}