Compare to a Sycamore solution

This commit is contained in:
Jeremy Wall 2022-01-25 20:32:17 -05:00
parent 92ebb8b2b2
commit a83923266a
4 changed files with 184 additions and 291 deletions

384
Cargo.lock generated
View File

@ -19,20 +19,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bec7b38b411d838e24b7914898b2d3cf3e24adbd81b6edf778e80ea23fe5e9d1"
[[package]]
name = "addr2line"
version = "0.14.1"
name = "ahash"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7"
checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
dependencies = [
"gimli",
"getrandom",
"once_cell",
"version_check",
]
[[package]]
name = "adler"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "aho-corasick"
version = "0.7.18"
@ -192,20 +188,6 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
[[package]]
name = "backtrace"
version = "0.3.57"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ed203b9ba68b242c62b3fb7480f589dd49829be1edb3fe8fc8b4ffda2dcb8d"
dependencies = [
"addr2line",
"cfg-if",
"libc",
"miniz_oxide",
"object",
"rustc-demangle",
]
[[package]]
name = "base64"
version = "0.13.0"
@ -336,16 +318,6 @@ dependencies = [
"cache-padded",
]
[[package]]
name = "console_error_panic_hook"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc"
dependencies = [
"cfg-if",
"wasm-bindgen",
]
[[package]]
name = "cpufeatures"
version = "0.2.1"
@ -406,95 +378,6 @@ dependencies = [
"generic-array",
]
[[package]]
name = "dioxus"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f8b5a18c0860961c5abb78493a9144d0943518256e31a38637815a4f68f0685"
dependencies = [
"dioxus-core",
"dioxus-core-macro",
"dioxus-hooks",
"dioxus-html",
"dioxus-web",
]
[[package]]
name = "dioxus-core"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0a3a1eec5094f350effcd87844af214aa503ec02f4e20bf32bc8a3a27c75992"
dependencies = [
"backtrace",
"bumpalo",
"futures-channel",
"futures-util",
"fxhash",
"indexmap",
"log",
"longest-increasing-subsequence",
"once_cell",
"slab",
"smallvec",
]
[[package]]
name = "dioxus-core-macro"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ec4c70ccd5e679827228314135ec6a37780e7fdedd2c50d3cb6d3e3a4732ecf"
dependencies = [
"once_cell",
"proc-macro-error",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "dioxus-hooks"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3234b1875c58c566111d7031bb9adb2353623d92e2c1e61b2533cdae2102e3fc"
dependencies = [
"dioxus-core",
]
[[package]]
name = "dioxus-html"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "993cbcde4fc2f4e2ae4ed159013335baffff49c9dda7fa5899920019a2a5af52"
dependencies = [
"dioxus-core",
]
[[package]]
name = "dioxus-web"
version = "0.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fb8c48f6a6d0de23eb39436387ebb6ecff86d12a3b439e559151d30d419899c"
dependencies = [
"anyhow",
"async-channel",
"console_error_panic_hook",
"dioxus-core",
"dioxus-html",
"futures-util",
"fxhash",
"gloo-timers",
"js-sys",
"lazy_static",
"log",
"once_cell",
"smallstr",
"wasm-bindgen",
"wasm-bindgen-futures",
"wasm-bindgen-test",
"wasm-logger",
"web-sys",
]
[[package]]
name = "event-listener"
version = "2.5.1"
@ -563,17 +446,6 @@ dependencies = [
"waker-fn",
]
[[package]]
name = "futures-macro"
version = "0.3.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6dbd947adfffb0efc70599b3ddcf7b5597bb5fa9e245eb99f62b3a5f7bb8bd3c"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "futures-sink"
version = "0.3.19"
@ -593,7 +465,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9b5cf40b47a271f77a8b1bec03ca09044d99d2372c0de244e66430761127164"
dependencies = [
"futures-core",
"futures-macro",
"futures-sink",
"futures-task",
"pin-project-lite",
@ -601,15 +472,6 @@ dependencies = [
"slab",
]
[[package]]
name = "fxhash"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
dependencies = [
"byteorder",
]
[[package]]
name = "generic-array"
version = "0.14.5"
@ -631,12 +493,6 @@ dependencies = [
"wasi",
]
[[package]]
name = "gimli"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce"
[[package]]
name = "gloo-timers"
version = "0.2.2"
@ -879,6 +735,79 @@ version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "lexical"
version = "6.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c34e981f88d060a67815388470172638f1af16b3a12e581cb75142f190161bf9"
dependencies = [
"lexical-core",
]
[[package]]
name = "lexical-core"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a3926d8f156019890be4abe5fd3785e0cff1001e06f59c597641fd513a5a284"
dependencies = [
"lexical-parse-float",
"lexical-parse-integer",
"lexical-util",
"lexical-write-float",
"lexical-write-integer",
]
[[package]]
name = "lexical-parse-float"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4d066d004fa762d9da995ed21aa8845bb9f6e4265f540d716fb4b315197bf0e"
dependencies = [
"lexical-parse-integer",
"lexical-util",
"static_assertions",
]
[[package]]
name = "lexical-parse-integer"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2c92badda8cc0fc4f3d3cc1c30aaefafb830510c8781ce4e8669881f3ed53ac"
dependencies = [
"lexical-util",
"static_assertions",
]
[[package]]
name = "lexical-util"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ff669ccaae16ee33af90dc51125755efed17f1309626ba5c12052512b11e291"
dependencies = [
"static_assertions",
]
[[package]]
name = "lexical-write-float"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b5186948c7b297abaaa51560f2581dae625e5ce7dfc2d8fdc56345adb6dc576"
dependencies = [
"lexical-util",
"lexical-write-integer",
"static_assertions",
]
[[package]]
name = "lexical-write-integer"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ece956492e0e40fd95ef8658a34d53a3b8c2015762fdcaaff2167b28de1f56ef"
dependencies = [
"lexical-util",
"static_assertions",
]
[[package]]
name = "libc"
version = "0.2.112"
@ -895,12 +824,6 @@ dependencies = [
"value-bag",
]
[[package]]
name = "longest-increasing-subsequence"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86"
[[package]]
name = "matches"
version = "0.1.9"
@ -929,16 +852,6 @@ dependencies = [
"unicase",
]
[[package]]
name = "miniz_oxide"
version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b"
dependencies = [
"adler",
"autocfg",
]
[[package]]
name = "mio"
version = "0.7.14"
@ -1040,12 +953,6 @@ dependencies = [
"libc",
]
[[package]]
name = "object"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4"
[[package]]
name = "once_cell"
version = "1.9.0"
@ -1064,6 +971,12 @@ version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72"
[[package]]
name = "paste"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0744126afe1a6dd7f394cb50a716dbe086cb06e255e53d8d0185d82828358fb5"
[[package]]
name = "percent-encoding"
version = "2.1.0"
@ -1121,30 +1034,6 @@ version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872"
[[package]]
name = "proc-macro-error"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
dependencies = [
"proc-macro-error-attr",
"proc-macro2",
"quote",
"syn",
"version_check",
]
[[package]]
name = "proc-macro-error-attr"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
dependencies = [
"proc-macro2",
"quote",
"version_check",
]
[[package]]
name = "proc-macro-hack"
version = "0.5.19"
@ -1286,12 +1175,6 @@ dependencies = [
"web-sys",
]
[[package]]
name = "rustc-demangle"
version = "0.1.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342"
[[package]]
name = "ryu"
version = "1.0.5"
@ -1372,15 +1255,6 @@ version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5"
[[package]]
name = "smallstr"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e922794d168678729ffc7e07182721a14219c65814e66e91b839a272fe5ae4f"
dependencies = [
"smallvec",
]
[[package]]
name = "smallvec"
version = "1.7.0"
@ -1397,6 +1271,12 @@ dependencies = [
"winapi",
]
[[package]]
name = "static_assertions"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
name = "static_dir"
version = "0.2.0"
@ -1420,6 +1300,51 @@ version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
[[package]]
name = "sycamore"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5cea65876897bb946a623e16bf3df2de4997a6872d95b99dfaed5dd8e14e264"
dependencies = [
"ahash",
"indexmap",
"js-sys",
"lexical",
"paste",
"smallvec",
"sycamore-macro",
"sycamore-reactive",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
]
[[package]]
name = "sycamore-macro"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d6911dba86d928ed3c898ee182c1a8a9f00299aa78875bc9308e7fd389e5bb4"
dependencies = [
"once_cell",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "sycamore-reactive"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "20809429d0f9c2ffcbb3f192957a5d0c505519138e41c5d38808c5b42b3c53ab"
dependencies = [
"ahash",
"indexmap",
"serde",
"smallvec",
"wasm-bindgen",
"web-sys",
]
[[package]]
name = "syn"
version = "1.0.85"
@ -1822,48 +1747,13 @@ version = "0.2.79"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2"
[[package]]
name = "wasm-bindgen-test"
version = "0.3.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96f1aa7971fdf61ef0f353602102dbea75a56e225ed036c1e3740564b91e6b7e"
dependencies = [
"console_error_panic_hook",
"js-sys",
"scoped-tls",
"wasm-bindgen",
"wasm-bindgen-futures",
"wasm-bindgen-test-macro",
]
[[package]]
name = "wasm-bindgen-test-macro"
version = "0.3.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6006f79628dfeb96a86d4db51fbf1344cd7fd8408f06fc9aa3c84913a4789688"
dependencies = [
"proc-macro2",
"quote",
]
[[package]]
name = "wasm-logger"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "074649a66bb306c8f2068c9016395fa65d8e08d2affcbf95acf3c24c3ab19718"
dependencies = [
"log",
"wasm-bindgen",
"web-sys",
]
[[package]]
name = "web"
version = "0.1.0"
dependencies = [
"dioxus",
"recipes",
"reqwasm",
"sycamore",
"wasm-bindgen",
]

View File

@ -13,6 +13,6 @@ reqwasm = "0.4.0"
version = "0.2.79"
#features = [ "console" ]
[dependencies.dioxus]
version = "0.1.7"
features = [ "web" ]
[dependencies.sycamore]
version = "0.7.1"
features = ["futures", "serde", "default"]

View File

@ -13,7 +13,10 @@
// limitations under the License.
mod typings;
mod web;
use sycamore::prelude::*;
use web::UI;
fn main() {
dioxus::web::launch(web::ui);
sycamore::render(|| view! { UI() });
}

View File

@ -12,23 +12,24 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#![allow(non_snake_case)]
use std::iter::Iterator;
use crate::console_log;
use dioxus::prelude::*;
use reqwasm::http;
use sycamore::context::{use_context, ContextProvider, ContextProviderProps};
use sycamore::futures::spawn_local_in_scope;
use sycamore::prelude::*;
use recipes::{parse, Recipe};
#[derive(Props, PartialEq, Clone)]
#[derive(Clone)]
struct AppService {
recipes: Vec<Recipe>,
recipes: Signal<Vec<Recipe>>,
}
impl AppService {
fn new() -> Self {
Self {
recipes: Vec::new(),
recipes: Signal::new(Vec::new()),
}
}
@ -64,53 +65,52 @@ impl AppService {
}
}
fn get_recipes(&self) -> &Vec<Recipe> {
&self.recipes
fn get_recipes(&self) -> Signal<Vec<Recipe>> {
self.recipes.clone()
}
fn set_recipes(&mut self, recipes: Vec<Recipe>) {
self.recipes = recipes;
self.recipes.set(recipes);
}
}
#[derive(Props)]
struct RecipeListProps<'a> {
app_service: UseState<'a, AppService>,
}
/// Component to list available recipes.
fn recipe_list<'a>(cx: Scope<'a, RecipeListProps<'a>>) -> Element {
let props = cx.props.app_service;
#[component(RecipeList<G>)]
fn recipe_list() -> View<G> {
let props = use_context::<AppService>();
cx.render(rsx! {
view! {
ul {
props.get_recipes().into_iter().map(|i| {
let title = &i.title;
rsx!(li { "{title}" })
})
Indexed(IndexedProps{
iterable: props.get_recipes().handle(),
template: |recipe| {
view! { li { (recipe.title) } }
}
})
}
})
}
}
pub fn ui(cx: Scope) -> Element {
let app_state = use_state(&cx, AppService::new);
#[component(UI<G>)]
pub fn ui() -> View<G> {
let app_state = AppService::new();
let fut = use_future(&cx, || async move { AppService::fetch_recipes().await });
cx.render(rsx! {
spawn_local_in_scope({
let mut app_state = app_state.clone();
async move {
match AppService::fetch_recipes().await {
Ok(recipes) => {
app_state.set_recipes(recipes);
}
Err(msg) => console_log!("Failed to get recipes {}", msg),
}
}
});
view! {
div { "hello chefs!" }
{match fut.value() {
Some(Ok(recipes)) => {
app_state.modify().set_recipes(recipes.clone());
rsx!{ recipe_list(app_service: app_state) }
}
Some(Err(e)) => {
console_log!("{}", e);
rsx!{ div { class: "error", "{e}" } }
}
None => {
//panic!("We seem to have failed to execute our future.")
rsx!{ div { "Loading recipe list..." }}
}
}}
})
ContextProvider(ContextProviderProps {
value: app_state,
children: || view! { RecipeList() }
})
}
}