diff --git a/Cargo.lock b/Cargo.lock index 9eb91f5..a97b032 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1564,6 +1564,8 @@ dependencies = [ "libc", "libgit2-sys", "log", + "openssl-probe", + "openssl-sys", "url", ] @@ -2047,10 +2049,26 @@ checksum = "19e1c899248e606fbfe68dcb31d8b0176ebab833b103824af31bddf4b7457494" dependencies = [ "cc", "libc", + "libssh2-sys", "libz-sys", + "openssl-sys", "pkg-config", ] +[[package]] +name = "libssh2-sys" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b094a36eb4b8b8c8a7b4b8ae43b2944502be3e59cd87687595cf6b0a71b3f4ca" +dependencies = [ + "cc", + "libc", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", +] + [[package]] name = "libz-sys" version = "1.1.6" @@ -2201,6 +2219,15 @@ dependencies = [ "unicase", ] +[[package]] +name = "minidom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "332592c2149fc7dd40a64fc9ef6f0d65607284b474cef9817d1fc8c7e7b3608e" +dependencies = [ + "quick-xml", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -2775,6 +2802,15 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +[[package]] +name = "quick-xml" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26aab6b48e2590e4a64d1ed808749ba06257882b461d01ca71baeb747074a6dd" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "1.0.18" @@ -3164,6 +3200,42 @@ dependencies = [ "web-sys", ] +[[package]] +name = "seed" +version = "0.9.1" +source = "git+https://github.com/seed-rs/seed#689055ef4f466f28dca621c23f5e2df7438bd1bc" +dependencies = [ + "console_error_panic_hook", + "cookie", + "dbg", + "enclose", + "futures", + "getrandom", + "gloo-file", + "gloo-timers", + "gloo-utils", + "indexmap", + "js-sys", + "rand", + "serde", + "serde_json", + "uuid", + "version_check 0.9.4", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "seed_heroicons" +version = "0.1.0" +source = "git+https://github.com/mh84/seed_heroicons.git#32569ac5ba9adcffb168fbdaac8b258e99e73d86" +dependencies = [ + "git2", + "minidom", + "seed 0.9.1 (git+https://github.com/seed-rs/seed)", +] + [[package]] name = "semver" version = "0.9.0" @@ -4278,7 +4350,8 @@ dependencies = [ "model", "pure-rust-locales", "rusty-money", - "seed", + "seed 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "seed_heroicons", "serde", "serde-wasm-bindgen", "serde_json", diff --git a/web/Cargo.toml b/web/Cargo.toml index 36b0acc..26c4387 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -10,6 +10,7 @@ crate-type = ["cdylib"] model = { path = "../shared/model", features = ["dummy"] } seed = { version = "0.9.1", features = [] } +seed_heroicons = { git = "https://github.com/mh84/seed_heroicons.git" } chrono = { version = "*" } gloo-timers = { version = "*", features = ["futures"] } diff --git a/web/src/lib.rs b/web/src/lib.rs index b326e35..63d0dae 100644 --- a/web/src/lib.rs +++ b/web/src/lib.rs @@ -42,6 +42,22 @@ macro_rules! fetch_page { _ => return, } }}; + (public page $page: expr, $page_name: ident, $ret: expr) => {{ + let p = match $page { + crate::pages::Page::Public(p) => p, + _ => { + *$page = $ret; + return; + } + }; + match p { + crate::pages::PublicPage::$page_name(p) => p, + _ => { + *$page = $ret; + return; + } + } + }}; } fn init(url: Url, orders: &mut impl Orders) -> Model { @@ -81,7 +97,7 @@ fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { } } } - Msg::UrlChanged(subs::UrlChanged(url)) => model.page.page_changed(url), + Msg::UrlChanged(subs::UrlChanged(url)) => model.page.page_changed(url, orders), Msg::Public(pages::public::Msg::Listing(msg)) => { let page = fetch_page!(public model, Listing); pages::public::listing::update(msg, page, &mut orders.proxy(proxy_public_listing)); diff --git a/web/src/pages.rs b/web/src/pages.rs index e0a4786..62a9c55 100644 --- a/web/src/pages.rs +++ b/web/src/pages.rs @@ -56,18 +56,18 @@ impl Page { } } - pub fn page_changed(&mut self, url: Url) { + pub fn page_changed(&mut self, url: Url, orders: &mut impl Orders) { match url.clone().remaining_path_parts().as_slice() { [] => { - let page = crate::fetch_page!(public page self, Listing); + let page = crate::fetch_page!(public page self, Listing, Page::init(url, orders)); public::listing::page_changed(url, page); } ["products", _rest @ ..] => { - let page = crate::fetch_page!(public page self, Listing); + let page = crate::fetch_page!(public page self, Listing, Page::init(url, orders)); public::listing::page_changed(url, page); } - ["page", ..] => { - let page = crate::fetch_page!(public page self, Product); + ["product", ..] => { + let page = crate::fetch_page!(public page self, Product, Page::init(url, orders)); public::product::page_changed(url, page); } ["admin"] => {} diff --git a/web/src/pages/public/listing.rs b/web/src/pages/public/listing.rs index 625c572..2bd4ed5 100644 --- a/web/src/pages/public/listing.rs +++ b/web/src/pages/public/listing.rs @@ -1,6 +1,5 @@ use std::collections::{HashMap, HashSet}; -use model::api::Product; use seed::app::Orders; use seed::prelude::*; use seed::*; diff --git a/web/src/pages/public/product.rs b/web/src/pages/public/product.rs index 5f9c0f3..bd8eb03 100644 --- a/web/src/pages/public/product.rs +++ b/web/src/pages/public/product.rs @@ -49,6 +49,13 @@ pub fn view(model: &crate::Model, page: &ProductPage) -> Node { .iter() .enumerate() .map(|(idx, img)| image(idx, img)); + + let description = product + .long_description + .as_str() + .split('\n') + .map(|s| div![s]); + let content = div![ C!["max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 mt-6"], div![ @@ -65,10 +72,12 @@ pub fn view(model: &crate::Model, page: &ProductPage) -> Node { h2![ C!["mb-2 leading-tight tracking-tight font-bold text-gray-800 text-2xl md:text-3xl"], product.name.as_str() - ] + ], + div![description] ] ] ].map_msg(map_to_global); + div![ crate::shared::view::public_navbar(model), super::layout::view(model.url.clone(), content, None)