From 29b92e5e12019a492307159d8804bbc8dc7512ec Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Tue, 25 Oct 2022 15:44:56 -0400 Subject: [PATCH] Fix missing state for extra ingredients --- web/src/app_state.rs | 2 ++ web/src/components/shopping_list.rs | 44 ++++++++++++++++------------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/web/src/app_state.rs b/web/src/app_state.rs index 8240c72..2468c19 100644 --- a/web/src/app_state.rs +++ b/web/src/app_state.rs @@ -37,6 +37,7 @@ impl Default for Routes { pub struct State { pub recipe_counts: RcSignal>, + pub extras: RcSignal, RcSignal))>>, pub staples: RcSignal>, pub recipes: RcSignal>, pub category_map: RcSignal>, @@ -46,6 +47,7 @@ impl State { pub fn new() -> Self { Self { recipe_counts: create_rc_signal(BTreeMap::new()), + extras: create_rc_signal(Vec::new()), staples: create_rc_signal(None), recipes: create_rc_signal(BTreeMap::new()), category_map: create_rc_signal(BTreeMap::new()), diff --git a/web/src/components/shopping_list.rs b/web/src/components/shopping_list.rs index 507cb08..d9aa0b2 100644 --- a/web/src/components/shopping_list.rs +++ b/web/src/components/shopping_list.rs @@ -71,11 +71,15 @@ fn make_ingredients_rows<'ctx, G: Html>( fn make_extras_rows<'ctx, G: Html>( cx: Scope<'ctx>, - extras: &'ctx Signal, &'ctx Signal))>>, + extras: RcSignal, RcSignal))>>, ) -> View { + let extras_read_signal = create_memo(cx, { + let extras = extras.clone(); + move || extras.get().as_ref().clone() + }); view! {cx, Indexed( - iterable=extras, + iterable=extras_read_signal, view= move |cx, (idx, (amt, name))| { view! {cx, tr { @@ -83,13 +87,15 @@ fn make_extras_rows<'ctx, G: Html>( input(bind:value=amt, type="text") } td { - input(type="button", class="no-print destructive", value="X", on:click=move |_| { - extras.set(extras.get().iter() - .filter(|(i, _)| *i != idx) - .map(|(_, v)| v.clone()) - .enumerate() - .collect()) - }) + input(type="button", class="no-print destructive", value="X", on:click={ + let extras = extras.clone(); + move |_| { + extras.set(extras.get().iter() + .filter(|(i, _)| *i != idx) + .map(|(_, v)| v.clone()) + .enumerate() + .collect()) + }}) } td { input(bind:value=name, type="text") @@ -106,7 +112,7 @@ fn make_shopping_table<'ctx, G: Html>( cx: Scope<'ctx>, ingredients: &'ctx ReadSignal))>>, modified_amts: &'ctx Signal>>, - extras: &'ctx Signal, &'ctx Signal))>>, + extras: RcSignal, RcSignal))>>, filtered_keys: RcSignal>, ) -> View { let extra_rows_view = make_extras_rows(cx, extras); @@ -133,10 +139,6 @@ fn make_shopping_table<'ctx, G: Html>( pub fn ShoppingList(cx: Scope) -> View { let filtered_keys: RcSignal> = create_rc_signal(BTreeSet::new()); let ingredients_map = create_rc_signal(BTreeMap::new()); - let extras = create_signal( - cx, - Vec::<(usize, (&Signal, &Signal))>::new(), - ); let modified_amts = create_signal(cx, BTreeMap::new()); let show_staples = create_signal(cx, true); create_effect(cx, { @@ -166,13 +168,14 @@ pub fn ShoppingList(cx: Scope) -> View { let table_view = create_signal(cx, View::empty()); create_effect(cx, { let filtered_keys = filtered_keys.clone(); + let state = crate::app_state::State::get_from_context(cx); move || { - if (ingredients.get().len() > 0) || (extras.get().len() > 0) { + if (ingredients.get().len() > 0) || (state.extras.get().len() > 0) { table_view.set(make_shopping_table( cx, ingredients, modified_amts.clone(), - extras.clone(), + state.extras.clone(), filtered_keys.clone(), )); } else { @@ -180,15 +183,16 @@ pub fn ShoppingList(cx: Scope) -> View { } } }); + let state = crate::app_state::State::get_from_context(cx); view! {cx, h1 { "Shopping List " } label(for="show_staples_cb") { "Show staples" } input(id="show_staples_cb", type="checkbox", bind:checked=show_staples) (table_view.get().as_ref().clone()) input(type="button", value="Add Item", class="no-print", on:click=move |_| { - let mut cloned_extras: Vec<(&Signal, &Signal)> = (*extras.get()).iter().map(|(_, tpl)| *tpl).collect(); - cloned_extras.push((create_signal(cx, "".to_owned()), create_signal(cx, "".to_owned()))); - extras.set(cloned_extras.drain(0..).enumerate().collect()); + let mut cloned_extras: Vec<(RcSignal, RcSignal)> = (*state.extras.get()).iter().map(|(_, tpl)| tpl.clone()).collect(); + cloned_extras.push((create_rc_signal("".to_owned()), create_rc_signal("".to_owned()))); + state.extras.set(cloned_extras.drain(0..).enumerate().collect()); }) input(type="button", value="Reset", class="no-print", on:click={ let state = crate::app_state::State::get_from_context(cx); @@ -198,7 +202,7 @@ pub fn ShoppingList(cx: Scope) -> View { // clear the filter_signal filtered_keys.set(BTreeSet::new()); modified_amts.set(BTreeMap::new()); - extras.set(Vec::new()); + state.extras.set(Vec::new()); } }) }